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 | chrome.runtime.onMessage.addListener((res) => { | 6 | chrome.runtime.onMessage.addListener((res) => { |
4 | const { type } = res; | 7 | const { type } = res; |
@@ -13,10 +16,24 @@ chrome.runtime.onMessage.addListener((res) => { | @@ -13,10 +16,24 @@ chrome.runtime.onMessage.addListener((res) => { | ||
13 | window.location.reload(); | 16 | window.location.reload(); |
14 | break; | 17 | break; |
15 | case "getLocalStorage": | 18 | case "getLocalStorage": |
16 | - chrome.runtime.sendMessage(window.sessionStorage) | 19 | + chrome.runtime.sendMessage(window.sessionStorage); |
17 | break; | 20 | break; |
18 | default: | 21 | default: |
19 | return; | 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,10 +21,13 @@ | ||
21 | </template> | 21 | </template> |
22 | </div> | 22 | </div> |
23 | <div class="btn"> | 23 | <div class="btn"> |
24 | - <el-button @click="start" | 24 | + <el-button @click="start(true)" |
25 | ><Refresh style="width: 1em; height: 1em" /> | 25 | ><Refresh style="width: 1em; height: 1em" /> |
26 | </el-button> | 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 | <VideoPause | 31 | <VideoPause |
29 | style="width: 1em; height: 1em; margin-right: 8px" | 32 | style="width: 1em; height: 1em; margin-right: 8px" |
30 | />关闭调试</el-button | 33 | />关闭调试</el-button |
@@ -39,23 +42,29 @@ | @@ -39,23 +42,29 @@ | ||
39 | </template> | 42 | </template> |
40 | 43 | ||
41 | <script setup> | 44 | <script setup> |
42 | -import { reactive, ref } from "vue"; | 45 | +import { reactive, ref, computed } from "vue"; |
43 | 46 | ||
44 | const { sessionStorage } = | 47 | const { sessionStorage } = |
45 | chrome.extension.getBackgroundPage().backgroundState || {}; | 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 | const QX_DEBUG_APPS = reactive( | 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 | const DEVELOPER_MODE = ref(sessionStorage.DEVELOPER_MODE === "1"); | 64 | const DEVELOPER_MODE = ref(sessionStorage.DEVELOPER_MODE === "1"); |
52 | 65 | ||
53 | console.log("sessionStorage", sessionStorage); | 66 | console.log("sessionStorage", sessionStorage); |
54 | 67 | ||
55 | -const bg = chrome.extension.getBackgroundPage(); | ||
56 | - | ||
57 | -const { tabs } = bg.chrome || {}; | ||
58 | - | ||
59 | function add() { | 68 | function add() { |
60 | QX_DEBUG_APPS.push({ name: "", entry: "" }); | 69 | QX_DEBUG_APPS.push({ name: "", entry: "" }); |
61 | } | 70 | } |
@@ -68,10 +77,8 @@ function deleteItem(index) { | @@ -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 | return true; | 82 | return true; |
76 | } | 83 | } |
77 | 84 | ||
@@ -79,18 +86,15 @@ function validate() { | @@ -79,18 +86,15 @@ function validate() { | ||
79 | } | 86 | } |
80 | 87 | ||
81 | async function save() { | 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 | chrome.runtime.sendMessage({ | 89 | chrome.runtime.sendMessage({ |
86 | type: "setSessionStorage", | 90 | type: "setSessionStorage", |
87 | key: "QX_DEBUG_APPS", | 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 | DEVELOPER_MODE.value = "1"; | 98 | DEVELOPER_MODE.value = "1"; |
95 | save(); | 99 | save(); |
96 | chrome.runtime.sendMessage({ | 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,5 +28,6 @@ | ||
28 | "browser_action": { | 28 | "browser_action": { |
29 | "default_popup": "src/popup/index.html" | 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 | "icons": { "16": "logo.png", "48": "logo.png", "128": "logo.png" } | 32 | "icons": { "16": "logo.png", "48": "logo.png", "128": "logo.png" } |
32 | } | 33 | } |
@@ -20,6 +20,7 @@ export default defineConfig({ | @@ -20,6 +20,7 @@ export default defineConfig({ | ||
20 | input: [ | 20 | input: [ |
21 | "src/popup/index.html", | 21 | "src/popup/index.html", |
22 | "src/devtool/index.html", | 22 | "src/devtool/index.html", |
23 | + "src/inject/inject.js", | ||
23 | "src/background.js", | 24 | "src/background.js", |
24 | "src/content-script.js", | 25 | "src/content-script.js", |
25 | ], | 26 | ], |