Showing
7 changed files
with
95 additions
and
22 deletions
| 1 | -chrome.runtime.sendMessage({ type: 'sessionStorage', value: window.sessionStorage }); | |
| 1 | +chrome.runtime.sendMessage({ | |
| 2 | + type: "sessionStorage", | |
| 3 | + value: window.sessionStorage, | |
| 4 | +}); | |
| 2 | 5 | |
| 3 | 6 | chrome.runtime.onMessage.addListener((res) => { |
| 4 | 7 | const { type } = res; |
| ... | ... | @@ -13,10 +16,24 @@ chrome.runtime.onMessage.addListener((res) => { |
| 13 | 16 | window.location.reload(); |
| 14 | 17 | break; |
| 15 | 18 | case "getLocalStorage": |
| 16 | - chrome.runtime.sendMessage(window.sessionStorage) | |
| 19 | + chrome.runtime.sendMessage(window.sessionStorage); | |
| 17 | 20 | break; |
| 18 | 21 | default: |
| 19 | 22 | return; |
| 20 | 23 | } |
| 21 | 24 | }); |
| 22 | 25 | |
| 26 | +function injectCustomJs(jsPath) { | |
| 27 | + jsPath = jsPath || "inject.js"; | |
| 28 | + var temp = document.createElement("script"); | |
| 29 | + temp.setAttribute("type", "module"); | |
| 30 | + temp.setAttribute("data-namespace", "qx-developer-tool-inject"); | |
| 31 | + temp.src = chrome.extension.getURL(jsPath); | |
| 32 | + temp.onload = function () { | |
| 33 | + // 放在页面不好看,执行完后移除掉 | |
| 34 | + // this.parentNode.removeChild(this); | |
| 35 | + }; | |
| 36 | + document.body.appendChild(temp); | |
| 37 | +} | |
| 38 | + | |
| 39 | +injectCustomJs(); | ... | ... |
| ... | ... | @@ -21,10 +21,13 @@ |
| 21 | 21 | </template> |
| 22 | 22 | </div> |
| 23 | 23 | <div class="btn"> |
| 24 | - <el-button @click="start" | |
| 24 | + <el-button @click="start(true)" | |
| 25 | 25 | ><Refresh style="width: 1em; height: 1em" /> |
| 26 | 26 | </el-button> |
| 27 | - <el-button v-if="DEVELOPER_MODE == 1" @click="end"> | |
| 27 | + <el-button | |
| 28 | + v-if="DEVELOPER_MODE == 1 && filterDebuggerApps.length" | |
| 29 | + @click="end" | |
| 30 | + > | |
| 28 | 31 | <VideoPause |
| 29 | 32 | style="width: 1em; height: 1em; margin-right: 8px" |
| 30 | 33 | />关闭调试</el-button |
| ... | ... | @@ -39,23 +42,29 @@ |
| 39 | 42 | </template> |
| 40 | 43 | |
| 41 | 44 | <script setup> |
| 42 | -import { reactive, ref } from "vue"; | |
| 45 | +import { reactive, ref, computed } from "vue"; | |
| 43 | 46 | |
| 44 | 47 | const { sessionStorage } = |
| 45 | 48 | chrome.extension.getBackgroundPage().backgroundState || {}; |
| 46 | 49 | |
| 50 | +const defaultApps = '[{"name":"","entry":""}]'; | |
| 51 | + | |
| 52 | +const sessionDebuggerApps = JSON.parse( | |
| 53 | + sessionStorage.QX_DEBUG_APPS || defaultApps | |
| 54 | +); | |
| 55 | + | |
| 47 | 56 | const QX_DEBUG_APPS = reactive( |
| 48 | - JSON.parse(sessionStorage.QX_DEBUG_APPS || '[{"name":"","entry":""}]') | |
| 57 | + JSON.parse(sessionDebuggerApps.length ? sessionDebuggerApps : defaultApps) | |
| 58 | +); | |
| 59 | + | |
| 60 | +const filterDebuggerApps = computed(() => | |
| 61 | + QX_DEBUG_APPS.filter((item) => item.name && item.entry) | |
| 49 | 62 | ); |
| 50 | 63 | |
| 51 | 64 | const DEVELOPER_MODE = ref(sessionStorage.DEVELOPER_MODE === "1"); |
| 52 | 65 | |
| 53 | 66 | console.log("sessionStorage", sessionStorage); |
| 54 | 67 | |
| 55 | -const bg = chrome.extension.getBackgroundPage(); | |
| 56 | - | |
| 57 | -const { tabs } = bg.chrome || {}; | |
| 58 | - | |
| 59 | 68 | function add() { |
| 60 | 69 | QX_DEBUG_APPS.push({ name: "", entry: "" }); |
| 61 | 70 | } |
| ... | ... | @@ -68,10 +77,8 @@ function deleteItem(index) { |
| 68 | 77 | } |
| 69 | 78 | } |
| 70 | 79 | |
| 71 | -function validate() { | |
| 72 | - const apps = QX_DEBUG_APPS.filter((item) => item.name && item.entry); | |
| 73 | - | |
| 74 | - if (apps.length) { | |
| 80 | +function validate(refresh) { | |
| 81 | + if (filterDebuggerApps.value.length || refresh) { | |
| 75 | 82 | return true; |
| 76 | 83 | } |
| 77 | 84 | |
| ... | ... | @@ -79,18 +86,15 @@ function validate() { |
| 79 | 86 | } |
| 80 | 87 | |
| 81 | 88 | async function save() { |
| 82 | - const apps = QX_DEBUG_APPS.filter((item) => item.name && item.entry); | |
| 83 | - console.log("QX_DEBUG_APPS", QX_DEBUG_APPS, apps); | |
| 84 | - | |
| 85 | 89 | chrome.runtime.sendMessage({ |
| 86 | 90 | type: "setSessionStorage", |
| 87 | 91 | key: "QX_DEBUG_APPS", |
| 88 | - value: JSON.stringify(apps), | |
| 92 | + value: JSON.stringify(filterDebuggerApps.value), | |
| 89 | 93 | }); |
| 90 | 94 | } |
| 91 | 95 | |
| 92 | -async function start() { | |
| 93 | - if (validate()) { | |
| 96 | +async function start(refresh) { | |
| 97 | + if (validate(refresh)) { | |
| 94 | 98 | DEVELOPER_MODE.value = "1"; |
| 95 | 99 | save(); |
| 96 | 100 | chrome.runtime.sendMessage({ | ... | ... |
src/inject/App.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div class="inject-content" :style="style">{{ text }}</div> | |
| 3 | +</template> | |
| 4 | + | |
| 5 | +<script setup> | |
| 6 | +const DEVELOPER_MODE = window.sessionStorage.getItem("DEVELOPER_MODE") === "1"; | |
| 7 | +const QX_DEBUG_APPS = JSON.parse( | |
| 8 | + window.sessionStorage.getItem("QX_DEBUG_APPS") || "[]" | |
| 9 | +); | |
| 10 | +const text = DEVELOPER_MODE && QX_DEBUG_APPS.length ? "调试中" : "开发模式"; | |
| 11 | +const style = { | |
| 12 | + background: | |
| 13 | + "linear-gradient(to right, rgba(62, 142, 245, 0.6), rgb(62, 142, 245))", | |
| 14 | + width: "26px", | |
| 15 | + padding: "10px", | |
| 16 | + position: "absolute", | |
| 17 | + right: "0", | |
| 18 | + top: "calc(100vh / 2 - 50px)", | |
| 19 | + zIndex: 9999, | |
| 20 | + display: "flex", | |
| 21 | + alignItem: "center", | |
| 22 | + justifyContent: "center", | |
| 23 | + lineHeight: "18px", | |
| 24 | + color: "rgb(255, 255, 255)", | |
| 25 | + borderRadius: "6px 0px 0px 6px", | |
| 26 | + cursor: "default", | |
| 27 | + boxShadow: "rgba(62, 142, 245, 0.2) 0px 0px 5px", | |
| 28 | +}; | |
| 29 | +</script> | |
| 30 | + | |
| 31 | +<style> | |
| 32 | +</style> | ... | ... |
src/inject/inject.js
0 → 100644
| 1 | +import { createApp } from "vue"; | |
| 2 | +import App from "./App.vue"; | |
| 3 | + | |
| 4 | +const DEVELOPER_MODE = window.sessionStorage.getItem("DEVELOPER_MODE") === "1"; | |
| 5 | +const QX_DEBUG_APPS = JSON.parse( | |
| 6 | + window.sessionStorage.getItem("QX_DEBUG_APPS") || "[]" | |
| 7 | +); | |
| 8 | + | |
| 9 | +if (DEVELOPER_MODE || QX_DEBUG_APPS.length) { | |
| 10 | + const app = createApp(App); | |
| 11 | + | |
| 12 | + const injectBody = document.createElement("div"); | |
| 13 | + | |
| 14 | + injectBody.setAttribute("data-namespace", "inject-body"); | |
| 15 | + injectBody.setAttribute("id", "inject-body"); | |
| 16 | + | |
| 17 | + document.body.appendChild(injectBody); | |
| 18 | + | |
| 19 | + app.mount(injectBody); | |
| 20 | +} | ... | ... |
| ... | ... | @@ -28,5 +28,6 @@ |
| 28 | 28 | "browser_action": { |
| 29 | 29 | "default_popup": "src/popup/index.html" |
| 30 | 30 | }, |
| 31 | + "web_accessible_resources": ["inject.js", "inject.*.css", "index.*.js", "runtime-dom.esm-bundler.*.js"], | |
| 31 | 32 | "icons": { "16": "logo.png", "48": "logo.png", "128": "logo.png" } |
| 32 | 33 | } | ... | ... |