@gxp-dev/tools 2.0.63 → 2.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -31
- package/bin/gx-devtools.js +74 -54
- package/bin/lib/cli.js +23 -21
- package/bin/lib/commands/add-dependency.js +366 -325
- package/bin/lib/commands/assets.js +137 -139
- package/bin/lib/commands/build.js +169 -174
- package/bin/lib/commands/datastore.js +181 -183
- package/bin/lib/commands/dev.js +127 -131
- package/bin/lib/commands/extensions.js +147 -149
- package/bin/lib/commands/extract-config.js +73 -67
- package/bin/lib/commands/index.js +12 -12
- package/bin/lib/commands/init.js +342 -240
- package/bin/lib/commands/publish.js +69 -75
- package/bin/lib/commands/socket.js +69 -69
- package/bin/lib/commands/ssl.js +14 -14
- package/bin/lib/constants.js +10 -24
- package/bin/lib/tui/App.tsx +761 -705
- package/bin/lib/tui/components/AIPanel.tsx +191 -171
- package/bin/lib/tui/components/CommandInput.tsx +394 -343
- package/bin/lib/tui/components/GeminiPanel.tsx +175 -151
- package/bin/lib/tui/components/Header.tsx +23 -21
- package/bin/lib/tui/components/LogPanel.tsx +244 -220
- package/bin/lib/tui/components/TabBar.tsx +50 -48
- package/bin/lib/tui/components/WelcomeScreen.tsx +126 -71
- package/bin/lib/tui/index.tsx +37 -39
- package/bin/lib/tui/services/AIService.ts +518 -462
- package/bin/lib/tui/services/ExtensionService.ts +140 -129
- package/bin/lib/tui/services/GeminiService.ts +367 -337
- package/bin/lib/tui/services/ServiceManager.ts +344 -322
- package/bin/lib/tui/services/SocketService.ts +168 -168
- package/bin/lib/tui/services/ViteService.ts +88 -88
- package/bin/lib/tui/services/index.ts +47 -22
- package/bin/lib/utils/ai-scaffold.js +291 -280
- package/bin/lib/utils/extract-config.js +157 -140
- package/bin/lib/utils/files.js +82 -86
- package/bin/lib/utils/index.js +7 -7
- package/bin/lib/utils/paths.js +34 -34
- package/bin/lib/utils/prompts.js +194 -169
- package/bin/lib/utils/ssl.js +79 -81
- package/browser-extensions/README.md +0 -1
- package/browser-extensions/chrome/background.js +244 -237
- package/browser-extensions/chrome/content.js +32 -29
- package/browser-extensions/chrome/devtools.html +7 -7
- package/browser-extensions/chrome/devtools.js +19 -19
- package/browser-extensions/chrome/inspector.js +802 -767
- package/browser-extensions/chrome/manifest.json +71 -63
- package/browser-extensions/chrome/panel.html +674 -636
- package/browser-extensions/chrome/panel.js +722 -712
- package/browser-extensions/chrome/popup.html +586 -543
- package/browser-extensions/chrome/popup.js +282 -244
- package/browser-extensions/chrome/rules.json +1 -1
- package/browser-extensions/chrome/test-chrome.html +216 -136
- package/browser-extensions/chrome/test-mixed-content.html +284 -189
- package/browser-extensions/chrome/test-uri-pattern.html +221 -198
- package/browser-extensions/firefox/README.md +9 -6
- package/browser-extensions/firefox/background.js +221 -218
- package/browser-extensions/firefox/content.js +55 -52
- package/browser-extensions/firefox/debug-errors.html +386 -228
- package/browser-extensions/firefox/debug-https.html +153 -105
- package/browser-extensions/firefox/devtools.html +7 -7
- package/browser-extensions/firefox/devtools.js +23 -20
- package/browser-extensions/firefox/inspector.js +802 -767
- package/browser-extensions/firefox/manifest.json +68 -68
- package/browser-extensions/firefox/panel.html +674 -636
- package/browser-extensions/firefox/panel.js +722 -712
- package/browser-extensions/firefox/popup.html +572 -535
- package/browser-extensions/firefox/popup.js +281 -236
- package/browser-extensions/firefox/test-gramercy.html +170 -125
- package/browser-extensions/firefox/test-imports.html +59 -55
- package/browser-extensions/firefox/test-masking.html +231 -140
- package/browser-extensions/firefox/test-uri-pattern.html +221 -198
- package/dist/tui/App.d.ts +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +154 -150
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/AIPanel.d.ts.map +1 -1
- package/dist/tui/components/AIPanel.js +42 -35
- package/dist/tui/components/AIPanel.js.map +1 -1
- package/dist/tui/components/CommandInput.d.ts +1 -1
- package/dist/tui/components/CommandInput.d.ts.map +1 -1
- package/dist/tui/components/CommandInput.js +92 -62
- package/dist/tui/components/CommandInput.js.map +1 -1
- package/dist/tui/components/GeminiPanel.d.ts.map +1 -1
- package/dist/tui/components/GeminiPanel.js +37 -30
- package/dist/tui/components/GeminiPanel.js.map +1 -1
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +1 -1
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/LogPanel.d.ts +1 -1
- package/dist/tui/components/LogPanel.d.ts.map +1 -1
- package/dist/tui/components/LogPanel.js +26 -24
- package/dist/tui/components/LogPanel.js.map +1 -1
- package/dist/tui/components/TabBar.d.ts +2 -2
- package/dist/tui/components/TabBar.d.ts.map +1 -1
- package/dist/tui/components/TabBar.js +11 -11
- package/dist/tui/components/TabBar.js.map +1 -1
- package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
- package/dist/tui/components/WelcomeScreen.js +6 -6
- package/dist/tui/components/WelcomeScreen.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +8 -8
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/services/AIService.d.ts +2 -2
- package/dist/tui/services/AIService.d.ts.map +1 -1
- package/dist/tui/services/AIService.js +165 -125
- package/dist/tui/services/AIService.js.map +1 -1
- package/dist/tui/services/ExtensionService.d.ts +1 -1
- package/dist/tui/services/ExtensionService.d.ts.map +1 -1
- package/dist/tui/services/ExtensionService.js +33 -26
- package/dist/tui/services/ExtensionService.js.map +1 -1
- package/dist/tui/services/GeminiService.d.ts +1 -1
- package/dist/tui/services/GeminiService.d.ts.map +1 -1
- package/dist/tui/services/GeminiService.js +87 -76
- package/dist/tui/services/GeminiService.js.map +1 -1
- package/dist/tui/services/ServiceManager.d.ts +3 -3
- package/dist/tui/services/ServiceManager.d.ts.map +1 -1
- package/dist/tui/services/ServiceManager.js +72 -58
- package/dist/tui/services/ServiceManager.js.map +1 -1
- package/dist/tui/services/SocketService.d.ts.map +1 -1
- package/dist/tui/services/SocketService.js +32 -32
- package/dist/tui/services/SocketService.js.map +1 -1
- package/dist/tui/services/ViteService.d.ts.map +1 -1
- package/dist/tui/services/ViteService.js +26 -28
- package/dist/tui/services/ViteService.js.map +1 -1
- package/dist/tui/services/index.d.ts +6 -6
- package/dist/tui/services/index.d.ts.map +1 -1
- package/dist/tui/services/index.js +6 -6
- package/dist/tui/services/index.js.map +1 -1
- package/mcp/gxp-api-server.js +83 -81
- package/package.json +109 -93
- package/runtime/PortalContainer.vue +258 -234
- package/runtime/dev-tools/DevToolsModal.vue +153 -155
- package/runtime/dev-tools/LayoutSwitcher.vue +144 -140
- package/runtime/dev-tools/MockDataEditor.vue +456 -433
- package/runtime/dev-tools/SocketSimulator.vue +379 -371
- package/runtime/dev-tools/StoreInspector.vue +517 -455
- package/runtime/dev-tools/index.js +5 -5
- package/runtime/fallback-layouts/PrivateLayout.vue +2 -2
- package/runtime/fallback-layouts/PublicLayout.vue +2 -2
- package/runtime/fallback-layouts/SystemLayout.vue +2 -2
- package/runtime/gxpStringsPlugin.js +159 -134
- package/runtime/index.html +17 -19
- package/runtime/main.js +24 -22
- package/runtime/mock-api/auth-middleware.js +15 -15
- package/runtime/mock-api/image-generator.js +46 -46
- package/runtime/mock-api/index.js +55 -55
- package/runtime/mock-api/response-generator.js +116 -105
- package/runtime/mock-api/route-generator.js +107 -84
- package/runtime/mock-api/socket-triggers.js +94 -93
- package/runtime/mock-api/spec-loader.js +79 -80
- package/runtime/package.json +3 -0
- package/runtime/server.js +68 -68
- package/runtime/stores/gxpPortalConfigStore.js +204 -186
- package/runtime/stores/index.js +2 -2
- package/runtime/vite-inspector-plugin.js +858 -707
- package/runtime/vite-source-tracker-plugin.js +132 -113
- package/runtime/vite.config.js +191 -139
- package/scripts/launch-chrome.js +41 -41
- package/scripts/pack-chrome.js +38 -39
- package/socket-events/AiSessionMessageCreated.json +17 -17
- package/socket-events/SocialStreamPostCreated.json +23 -23
- package/socket-events/SocialStreamPostVariantCompleted.json +22 -22
- package/template/.claude/agents/gxp-developer.md +100 -99
- package/template/.claude/settings.json +7 -7
- package/template/AGENTS.md +30 -23
- package/template/GEMINI.md +20 -20
- package/template/README.md +70 -53
- package/template/app-manifest.json +2 -4
- package/template/configuration.json +10 -10
- package/template/default-styling.css +1 -1
- package/template/index.html +18 -20
- package/template/main.js +24 -22
- package/template/src/DemoPage.vue +415 -362
- package/template/src/Plugin.vue +76 -85
- package/template/src/stores/index.js +3 -3
- package/template/src/stores/test-data.json +164 -172
- package/template/theme-layouts/AdditionalStyling.css +50 -50
- package/template/theme-layouts/PrivateLayout.vue +8 -12
- package/template/theme-layouts/PublicLayout.vue +8 -12
- package/template/theme-layouts/SystemLayout.vue +8 -12
- package/template/vite.extend.js +45 -0
- package/template/vite.config.js +0 -409
|
@@ -1,59 +1,64 @@
|
|
|
1
1
|
document.addEventListener("DOMContentLoaded", async function () {
|
|
2
2
|
// Get all DOM elements
|
|
3
|
-
const toggleButton = document.getElementById("toggleButton")
|
|
4
|
-
const toggleText = document.getElementById("toggleText")
|
|
5
|
-
const saveBtn = document.getElementById("saveBtn")
|
|
6
|
-
const clearCacheBtn = document.getElementById("clearCacheBtn")
|
|
7
|
-
const statusMessage = document.getElementById("statusMessage")
|
|
8
|
-
const maskingMode = document.getElementById("maskingMode")
|
|
9
|
-
const clearCacheOnEnable = document.getElementById("clearCacheOnEnable")
|
|
10
|
-
const disableCacheForRedirects = document.getElementById(
|
|
3
|
+
const toggleButton = document.getElementById("toggleButton")
|
|
4
|
+
const toggleText = document.getElementById("toggleText")
|
|
5
|
+
const saveBtn = document.getElementById("saveBtn")
|
|
6
|
+
const clearCacheBtn = document.getElementById("clearCacheBtn")
|
|
7
|
+
const statusMessage = document.getElementById("statusMessage")
|
|
8
|
+
const maskingMode = document.getElementById("maskingMode")
|
|
9
|
+
const clearCacheOnEnable = document.getElementById("clearCacheOnEnable")
|
|
10
|
+
const disableCacheForRedirects = document.getElementById(
|
|
11
|
+
"disableCacheForRedirects",
|
|
12
|
+
)
|
|
11
13
|
|
|
12
14
|
// Tab elements
|
|
13
|
-
const tabs = document.querySelectorAll(".tab")
|
|
14
|
-
const tabContents = document.querySelectorAll(".tab-content")
|
|
15
|
-
const jsBadge = document.getElementById("jsBadge")
|
|
16
|
-
const cssBadge = document.getElementById("cssBadge")
|
|
15
|
+
const tabs = document.querySelectorAll(".tab")
|
|
16
|
+
const tabContents = document.querySelectorAll(".tab-content")
|
|
17
|
+
const jsBadge = document.getElementById("jsBadge")
|
|
18
|
+
const cssBadge = document.getElementById("cssBadge")
|
|
17
19
|
|
|
18
20
|
// Inspector elements
|
|
19
|
-
const inspectorCard = document.getElementById("inspectorCard")
|
|
20
|
-
const inspectorBadge = document.getElementById("inspectorBadge")
|
|
21
|
+
const inspectorCard = document.getElementById("inspectorCard")
|
|
22
|
+
const inspectorBadge = document.getElementById("inspectorBadge")
|
|
21
23
|
|
|
22
24
|
// Inspector state
|
|
23
|
-
let inspectorEnabled = false
|
|
25
|
+
let inspectorEnabled = false
|
|
24
26
|
|
|
25
27
|
// JS Rule elements
|
|
26
|
-
const jsRuleToggle = document.getElementById("jsRuleToggle")
|
|
27
|
-
const jsRuleContent = document.getElementById("jsRuleContent")
|
|
28
|
-
const jsRedirectUrl = document.getElementById("jsRedirectUrl")
|
|
29
|
-
const jsUseCustomPattern = document.getElementById("jsUseCustomPattern")
|
|
30
|
-
const jsPatternGroup = document.getElementById("jsPatternGroup")
|
|
31
|
-
const jsPattern = document.getElementById("jsPattern")
|
|
28
|
+
const jsRuleToggle = document.getElementById("jsRuleToggle")
|
|
29
|
+
const jsRuleContent = document.getElementById("jsRuleContent")
|
|
30
|
+
const jsRedirectUrl = document.getElementById("jsRedirectUrl")
|
|
31
|
+
const jsUseCustomPattern = document.getElementById("jsUseCustomPattern")
|
|
32
|
+
const jsPatternGroup = document.getElementById("jsPatternGroup")
|
|
33
|
+
const jsPattern = document.getElementById("jsPattern")
|
|
32
34
|
|
|
33
35
|
// CSS Rule elements
|
|
34
|
-
const cssRuleToggle = document.getElementById("cssRuleToggle")
|
|
35
|
-
const cssRuleContent = document.getElementById("cssRuleContent")
|
|
36
|
-
const cssRedirectUrl = document.getElementById("cssRedirectUrl")
|
|
37
|
-
const cssReturnBlank = document.getElementById("cssReturnBlank")
|
|
38
|
-
const cssRedirectGroup = document.getElementById("cssRedirectGroup")
|
|
39
|
-
const cssUseCustomPattern = document.getElementById("cssUseCustomPattern")
|
|
40
|
-
const cssPatternGroup = document.getElementById("cssPatternGroup")
|
|
41
|
-
const cssPattern = document.getElementById("cssPattern")
|
|
36
|
+
const cssRuleToggle = document.getElementById("cssRuleToggle")
|
|
37
|
+
const cssRuleContent = document.getElementById("cssRuleContent")
|
|
38
|
+
const cssRedirectUrl = document.getElementById("cssRedirectUrl")
|
|
39
|
+
const cssReturnBlank = document.getElementById("cssReturnBlank")
|
|
40
|
+
const cssRedirectGroup = document.getElementById("cssRedirectGroup")
|
|
41
|
+
const cssUseCustomPattern = document.getElementById("cssUseCustomPattern")
|
|
42
|
+
const cssPatternGroup = document.getElementById("cssPatternGroup")
|
|
43
|
+
const cssPattern = document.getElementById("cssPattern")
|
|
42
44
|
|
|
43
45
|
// Load environment-based defaults from defaults.json (generated by launch script)
|
|
44
|
-
let envDefaults = {}
|
|
46
|
+
let envDefaults = {}
|
|
45
47
|
try {
|
|
46
|
-
const response = await fetch(browser.runtime.getURL("defaults.json"))
|
|
48
|
+
const response = await fetch(browser.runtime.getURL("defaults.json"))
|
|
47
49
|
if (response.ok) {
|
|
48
|
-
envDefaults = await response.json()
|
|
49
|
-
console.log("[GxP DevTools] Loaded environment defaults:", envDefaults)
|
|
50
|
+
envDefaults = await response.json()
|
|
51
|
+
console.log("[GxP DevTools] Loaded environment defaults:", envDefaults)
|
|
50
52
|
}
|
|
51
53
|
} catch (error) {
|
|
52
|
-
console.log(
|
|
54
|
+
console.log(
|
|
55
|
+
"[GxP DevTools] No environment defaults found, using hardcoded defaults",
|
|
56
|
+
)
|
|
53
57
|
}
|
|
54
58
|
|
|
55
59
|
// Build default redirect URL from env defaults or fallback
|
|
56
|
-
const defaultRedirectUrl =
|
|
60
|
+
const defaultRedirectUrl =
|
|
61
|
+
envDefaults.jsRedirectUrl || "https://localhost:3060/src/Plugin.vue"
|
|
57
62
|
|
|
58
63
|
// Default configuration (merged with environment defaults)
|
|
59
64
|
const defaultConfig = {
|
|
@@ -64,13 +69,15 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
64
69
|
rules: {
|
|
65
70
|
js: {
|
|
66
71
|
enabled: true,
|
|
67
|
-
pattern:
|
|
72
|
+
pattern:
|
|
73
|
+
"uploads\\/plugin-version\\/\\d+\\/file_name\\/.*\\.js(\\?.*)?",
|
|
68
74
|
redirectUrl: defaultRedirectUrl,
|
|
69
75
|
useCustomPattern: envDefaults.jsUseCustomPattern || false,
|
|
70
76
|
},
|
|
71
77
|
css: {
|
|
72
78
|
enabled: envDefaults.cssRuleEnabled !== false,
|
|
73
|
-
pattern:
|
|
79
|
+
pattern:
|
|
80
|
+
"uploads\\/plugin-version\\/\\d+\\/style_file_name\\/.*\\.css(\\?.*)?",
|
|
74
81
|
redirectUrl: envDefaults.cssRedirectUrl || "",
|
|
75
82
|
returnBlank: envDefaults.cssReturnBlank !== false,
|
|
76
83
|
useCustomPattern: envDefaults.cssUseCustomPattern || false,
|
|
@@ -79,54 +86,59 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
79
86
|
maskingMode: false,
|
|
80
87
|
clearCacheOnEnable: envDefaults.clearCacheOnEnable !== false,
|
|
81
88
|
disableCacheForRedirects: envDefaults.disableCacheForRedirects !== false,
|
|
82
|
-
}
|
|
89
|
+
}
|
|
83
90
|
|
|
84
91
|
// Load current configuration
|
|
85
|
-
let config = {}
|
|
92
|
+
let config = {}
|
|
86
93
|
try {
|
|
87
|
-
const result = await browser.runtime.sendMessage({ action: "getConfig" })
|
|
94
|
+
const result = await browser.runtime.sendMessage({ action: "getConfig" })
|
|
88
95
|
|
|
89
96
|
// Check if defaults.json has enabled=true (launched from CLI)
|
|
90
97
|
// In this case, we should apply the CLI defaults over stored config
|
|
91
|
-
const cliLaunched = envDefaults.enabled === true
|
|
98
|
+
const cliLaunched = envDefaults.enabled === true
|
|
92
99
|
|
|
93
100
|
if (!result || Object.keys(result).length === 0) {
|
|
94
|
-
config = defaultConfig
|
|
95
|
-
console.log("[GxP DevTools] Initialized with environment defaults")
|
|
101
|
+
config = defaultConfig
|
|
102
|
+
console.log("[GxP DevTools] Initialized with environment defaults")
|
|
96
103
|
} else if (cliLaunched) {
|
|
97
104
|
// CLI launch - apply defaults over stored config for key settings
|
|
98
|
-
config = { ...defaultConfig, ...result }
|
|
99
|
-
config.enabled = true
|
|
100
|
-
config = migrateConfig(config, defaultConfig)
|
|
105
|
+
config = { ...defaultConfig, ...result }
|
|
106
|
+
config.enabled = true // Force enabled when launched from CLI
|
|
107
|
+
config = migrateConfig(config, defaultConfig)
|
|
101
108
|
// Also ensure rules use CLI defaults
|
|
102
109
|
if (config.rules) {
|
|
103
|
-
config.rules.js.useCustomPattern =
|
|
104
|
-
|
|
105
|
-
config.rules.css.
|
|
106
|
-
|
|
110
|
+
config.rules.js.useCustomPattern =
|
|
111
|
+
envDefaults.jsUseCustomPattern !== false
|
|
112
|
+
config.rules.css.useCustomPattern =
|
|
113
|
+
envDefaults.cssUseCustomPattern !== false
|
|
114
|
+
config.rules.css.enabled = envDefaults.cssRuleEnabled !== false
|
|
115
|
+
config.rules.css.returnBlank = envDefaults.cssReturnBlank !== false
|
|
107
116
|
}
|
|
108
117
|
// Save the updated config
|
|
109
|
-
await browser.runtime.sendMessage({
|
|
110
|
-
|
|
118
|
+
await browser.runtime.sendMessage({
|
|
119
|
+
action: "updateConfig",
|
|
120
|
+
config: config,
|
|
121
|
+
})
|
|
122
|
+
console.log("[GxP DevTools] Applied CLI defaults over stored config")
|
|
111
123
|
} else {
|
|
112
|
-
config = { ...defaultConfig, ...result }
|
|
113
|
-
config = migrateConfig(config, defaultConfig)
|
|
124
|
+
config = { ...defaultConfig, ...result }
|
|
125
|
+
config = migrateConfig(config, defaultConfig)
|
|
114
126
|
}
|
|
115
127
|
} catch (error) {
|
|
116
|
-
console.error("[GxP DevTools] Error loading config:", error)
|
|
117
|
-
config = defaultConfig
|
|
128
|
+
console.error("[GxP DevTools] Error loading config:", error)
|
|
129
|
+
config = defaultConfig
|
|
118
130
|
}
|
|
119
131
|
|
|
120
132
|
// Initialize UI
|
|
121
|
-
updateUI()
|
|
122
|
-
setupTabNavigation()
|
|
133
|
+
updateUI()
|
|
134
|
+
setupTabNavigation()
|
|
123
135
|
|
|
124
136
|
// If CLI launched and config is enabled, notify background script to activate
|
|
125
137
|
if (config.enabled) {
|
|
126
138
|
browser.runtime.sendMessage({
|
|
127
139
|
action: "toggleProxy",
|
|
128
140
|
enabled: true,
|
|
129
|
-
})
|
|
141
|
+
})
|
|
130
142
|
}
|
|
131
143
|
|
|
132
144
|
function migrateConfig(config, defaults = defaultConfig) {
|
|
@@ -136,7 +148,8 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
136
148
|
enabled: true,
|
|
137
149
|
pattern: config.urlPattern || defaults.rules.js.pattern,
|
|
138
150
|
redirectUrl: config.redirectUrl || defaults.rules.js.redirectUrl,
|
|
139
|
-
useCustomPattern:
|
|
151
|
+
useCustomPattern:
|
|
152
|
+
config.useCustomPattern || defaults.rules.js.useCustomPattern,
|
|
140
153
|
},
|
|
141
154
|
css: {
|
|
142
155
|
enabled: defaults.rules.css.enabled,
|
|
@@ -145,284 +158,292 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
145
158
|
returnBlank: defaults.rules.css.returnBlank,
|
|
146
159
|
useCustomPattern: defaults.rules.css.useCustomPattern,
|
|
147
160
|
},
|
|
148
|
-
}
|
|
161
|
+
}
|
|
149
162
|
}
|
|
150
|
-
return config
|
|
163
|
+
return config
|
|
151
164
|
}
|
|
152
165
|
|
|
153
166
|
function setupTabNavigation() {
|
|
154
167
|
tabs.forEach((tab) => {
|
|
155
168
|
tab.addEventListener("click", () => {
|
|
156
|
-
const tabName = tab.dataset.tab
|
|
169
|
+
const tabName = tab.dataset.tab
|
|
157
170
|
|
|
158
171
|
// Update active tab
|
|
159
|
-
tabs.forEach((t) => t.classList.remove("active"))
|
|
160
|
-
tab.classList.add("active")
|
|
172
|
+
tabs.forEach((t) => t.classList.remove("active"))
|
|
173
|
+
tab.classList.add("active")
|
|
161
174
|
|
|
162
175
|
// Show corresponding content
|
|
163
176
|
tabContents.forEach((content) => {
|
|
164
|
-
content.classList.remove("active")
|
|
177
|
+
content.classList.remove("active")
|
|
165
178
|
if (content.id === `${tabName}Tab`) {
|
|
166
|
-
content.classList.add("active")
|
|
179
|
+
content.classList.add("active")
|
|
167
180
|
}
|
|
168
|
-
})
|
|
169
|
-
})
|
|
170
|
-
})
|
|
181
|
+
})
|
|
182
|
+
})
|
|
183
|
+
})
|
|
171
184
|
}
|
|
172
185
|
|
|
173
186
|
function updateUI() {
|
|
174
187
|
// Update toggle button
|
|
175
188
|
if (config.enabled) {
|
|
176
|
-
toggleButton.classList.add("enabled")
|
|
177
|
-
toggleText.textContent = "ON"
|
|
189
|
+
toggleButton.classList.add("enabled")
|
|
190
|
+
toggleText.textContent = "ON"
|
|
178
191
|
} else {
|
|
179
|
-
toggleButton.classList.remove("enabled")
|
|
180
|
-
toggleText.textContent = "OFF"
|
|
192
|
+
toggleButton.classList.remove("enabled")
|
|
193
|
+
toggleText.textContent = "OFF"
|
|
181
194
|
}
|
|
182
195
|
|
|
183
196
|
// Update global settings
|
|
184
|
-
maskingMode.checked = config.maskingMode || false
|
|
185
|
-
clearCacheOnEnable.checked = config.clearCacheOnEnable !== false
|
|
186
|
-
disableCacheForRedirects.checked = config.disableCacheForRedirects !== false
|
|
197
|
+
maskingMode.checked = config.maskingMode || false
|
|
198
|
+
clearCacheOnEnable.checked = config.clearCacheOnEnable !== false
|
|
199
|
+
disableCacheForRedirects.checked = config.disableCacheForRedirects !== false
|
|
187
200
|
|
|
188
201
|
// Update JS rule
|
|
189
202
|
if (config.rules && config.rules.js) {
|
|
190
|
-
jsRuleToggle.checked = config.rules.js.enabled
|
|
191
|
-
jsRedirectUrl.value = config.rules.js.redirectUrl || ""
|
|
192
|
-
jsUseCustomPattern.checked = config.rules.js.useCustomPattern || false
|
|
193
|
-
jsPattern.value = config.rules.js.pattern || ""
|
|
203
|
+
jsRuleToggle.checked = config.rules.js.enabled
|
|
204
|
+
jsRedirectUrl.value = config.rules.js.redirectUrl || ""
|
|
205
|
+
jsUseCustomPattern.checked = config.rules.js.useCustomPattern || false
|
|
206
|
+
jsPattern.value = config.rules.js.pattern || ""
|
|
194
207
|
|
|
195
208
|
// Update JS badge
|
|
196
209
|
if (config.rules.js.enabled) {
|
|
197
|
-
jsBadge.textContent = "ON"
|
|
198
|
-
jsBadge.classList.remove("disabled")
|
|
199
|
-
jsBadge.classList.add("enabled")
|
|
200
|
-
jsRuleContent.classList.remove("rule-disabled")
|
|
210
|
+
jsBadge.textContent = "ON"
|
|
211
|
+
jsBadge.classList.remove("disabled")
|
|
212
|
+
jsBadge.classList.add("enabled")
|
|
213
|
+
jsRuleContent.classList.remove("rule-disabled")
|
|
201
214
|
} else {
|
|
202
|
-
jsBadge.textContent = "OFF"
|
|
203
|
-
jsBadge.classList.remove("enabled")
|
|
204
|
-
jsBadge.classList.add("disabled")
|
|
205
|
-
jsRuleContent.classList.add("rule-disabled")
|
|
215
|
+
jsBadge.textContent = "OFF"
|
|
216
|
+
jsBadge.classList.remove("enabled")
|
|
217
|
+
jsBadge.classList.add("disabled")
|
|
218
|
+
jsRuleContent.classList.add("rule-disabled")
|
|
206
219
|
}
|
|
207
220
|
|
|
208
221
|
// Toggle custom pattern input visibility
|
|
209
222
|
if (config.rules.js.useCustomPattern) {
|
|
210
|
-
jsPatternGroup.classList.remove("hidden")
|
|
223
|
+
jsPatternGroup.classList.remove("hidden")
|
|
211
224
|
} else {
|
|
212
|
-
jsPatternGroup.classList.add("hidden")
|
|
225
|
+
jsPatternGroup.classList.add("hidden")
|
|
213
226
|
}
|
|
214
227
|
}
|
|
215
228
|
|
|
216
229
|
// Update CSS rule
|
|
217
230
|
if (config.rules && config.rules.css) {
|
|
218
|
-
cssRuleToggle.checked = config.rules.css.enabled
|
|
219
|
-
cssRedirectUrl.value = config.rules.css.redirectUrl || ""
|
|
220
|
-
cssReturnBlank.checked = config.rules.css.returnBlank || false
|
|
221
|
-
cssUseCustomPattern.checked = config.rules.css.useCustomPattern || false
|
|
222
|
-
cssPattern.value = config.rules.css.pattern || ""
|
|
231
|
+
cssRuleToggle.checked = config.rules.css.enabled
|
|
232
|
+
cssRedirectUrl.value = config.rules.css.redirectUrl || ""
|
|
233
|
+
cssReturnBlank.checked = config.rules.css.returnBlank || false
|
|
234
|
+
cssUseCustomPattern.checked = config.rules.css.useCustomPattern || false
|
|
235
|
+
cssPattern.value = config.rules.css.pattern || ""
|
|
223
236
|
|
|
224
237
|
// Update CSS badge
|
|
225
238
|
if (config.rules.css.enabled) {
|
|
226
|
-
cssBadge.textContent = "ON"
|
|
227
|
-
cssBadge.classList.remove("disabled")
|
|
228
|
-
cssBadge.classList.add("enabled")
|
|
229
|
-
cssRuleContent.classList.remove("rule-disabled")
|
|
239
|
+
cssBadge.textContent = "ON"
|
|
240
|
+
cssBadge.classList.remove("disabled")
|
|
241
|
+
cssBadge.classList.add("enabled")
|
|
242
|
+
cssRuleContent.classList.remove("rule-disabled")
|
|
230
243
|
} else {
|
|
231
|
-
cssBadge.textContent = "OFF"
|
|
232
|
-
cssBadge.classList.remove("enabled")
|
|
233
|
-
cssBadge.classList.add("disabled")
|
|
234
|
-
cssRuleContent.classList.add("rule-disabled")
|
|
244
|
+
cssBadge.textContent = "OFF"
|
|
245
|
+
cssBadge.classList.remove("enabled")
|
|
246
|
+
cssBadge.classList.add("disabled")
|
|
247
|
+
cssRuleContent.classList.add("rule-disabled")
|
|
235
248
|
}
|
|
236
249
|
|
|
237
250
|
// Toggle redirect section based on blank return setting
|
|
238
251
|
if (config.rules.css.returnBlank) {
|
|
239
|
-
cssRedirectGroup.classList.add("hidden")
|
|
252
|
+
cssRedirectGroup.classList.add("hidden")
|
|
240
253
|
} else {
|
|
241
|
-
cssRedirectGroup.classList.remove("hidden")
|
|
254
|
+
cssRedirectGroup.classList.remove("hidden")
|
|
242
255
|
}
|
|
243
256
|
|
|
244
257
|
// Toggle custom pattern input visibility
|
|
245
258
|
if (config.rules.css.useCustomPattern) {
|
|
246
|
-
cssPatternGroup.classList.remove("hidden")
|
|
259
|
+
cssPatternGroup.classList.remove("hidden")
|
|
247
260
|
} else {
|
|
248
|
-
cssPatternGroup.classList.add("hidden")
|
|
261
|
+
cssPatternGroup.classList.add("hidden")
|
|
249
262
|
}
|
|
250
263
|
}
|
|
251
264
|
}
|
|
252
265
|
|
|
253
266
|
function showStatus(message, isSuccess = true) {
|
|
254
|
-
statusMessage.textContent = message
|
|
255
|
-
statusMessage.className = `status ${isSuccess ? "success" : "error"}
|
|
267
|
+
statusMessage.textContent = message
|
|
268
|
+
statusMessage.className = `status ${isSuccess ? "success" : "error"}`
|
|
256
269
|
|
|
257
270
|
setTimeout(() => {
|
|
258
|
-
statusMessage.className = "status"
|
|
259
|
-
}, 3000)
|
|
271
|
+
statusMessage.className = "status"
|
|
272
|
+
}, 3000)
|
|
260
273
|
}
|
|
261
274
|
|
|
262
275
|
function validateRedirectUrl(url) {
|
|
263
|
-
if (!url || url.trim() === "") return null
|
|
276
|
+
if (!url || url.trim() === "") return null
|
|
264
277
|
|
|
265
278
|
try {
|
|
266
|
-
new URL(url)
|
|
267
|
-
return null
|
|
279
|
+
new URL(url)
|
|
280
|
+
return null
|
|
268
281
|
} catch {
|
|
269
|
-
if (url.includes("://")) return "Invalid URL format"
|
|
282
|
+
if (url.includes("://")) return "Invalid URL format"
|
|
270
283
|
|
|
271
284
|
try {
|
|
272
|
-
new URL("https://" + url)
|
|
273
|
-
return null
|
|
285
|
+
new URL("https://" + url)
|
|
286
|
+
return null
|
|
274
287
|
} catch {
|
|
275
|
-
return "Invalid URL format"
|
|
288
|
+
return "Invalid URL format"
|
|
276
289
|
}
|
|
277
290
|
}
|
|
278
291
|
}
|
|
279
292
|
|
|
280
293
|
function validatePattern(pattern) {
|
|
281
|
-
if (!pattern || pattern.trim() === "") return "URL pattern is required"
|
|
294
|
+
if (!pattern || pattern.trim() === "") return "URL pattern is required"
|
|
282
295
|
|
|
283
296
|
try {
|
|
284
|
-
new RegExp(pattern)
|
|
285
|
-
return null
|
|
297
|
+
new RegExp(pattern)
|
|
298
|
+
return null
|
|
286
299
|
} catch {
|
|
287
|
-
return "Invalid regular expression pattern"
|
|
300
|
+
return "Invalid regular expression pattern"
|
|
288
301
|
}
|
|
289
302
|
}
|
|
290
303
|
|
|
291
304
|
function normalizeUrl(url) {
|
|
292
|
-
if (!url || url.trim() === "") return ""
|
|
293
|
-
if (!url.includes("://")) return "https://" + url
|
|
294
|
-
return url
|
|
305
|
+
if (!url || url.trim() === "") return ""
|
|
306
|
+
if (!url.includes("://")) return "https://" + url
|
|
307
|
+
return url
|
|
295
308
|
}
|
|
296
309
|
|
|
297
310
|
// Event listeners
|
|
298
311
|
toggleButton.addEventListener("click", async function () {
|
|
299
|
-
config.enabled = !config.enabled
|
|
312
|
+
config.enabled = !config.enabled
|
|
300
313
|
|
|
301
314
|
try {
|
|
302
315
|
const response = await browser.runtime.sendMessage({
|
|
303
316
|
action: "toggleProxy",
|
|
304
317
|
enabled: config.enabled,
|
|
305
|
-
})
|
|
318
|
+
})
|
|
306
319
|
|
|
307
320
|
if (response && response.success) {
|
|
308
|
-
updateUI()
|
|
309
|
-
showStatus(config.enabled ? "Proxy enabled" : "Proxy disabled")
|
|
321
|
+
updateUI()
|
|
322
|
+
showStatus(config.enabled ? "Proxy enabled" : "Proxy disabled")
|
|
310
323
|
} else {
|
|
311
|
-
throw new Error(response ? response.error : "Unknown error")
|
|
324
|
+
throw new Error(response ? response.error : "Unknown error")
|
|
312
325
|
}
|
|
313
326
|
} catch (error) {
|
|
314
|
-
console.error("[GxP DevTools] Error toggling proxy:", error)
|
|
315
|
-
showStatus("Error toggling proxy", false)
|
|
327
|
+
console.error("[GxP DevTools] Error toggling proxy:", error)
|
|
328
|
+
showStatus("Error toggling proxy", false)
|
|
316
329
|
// Revert the change
|
|
317
|
-
config.enabled = !config.enabled
|
|
330
|
+
config.enabled = !config.enabled
|
|
318
331
|
}
|
|
319
|
-
})
|
|
332
|
+
})
|
|
320
333
|
|
|
321
334
|
// Global settings event listeners
|
|
322
335
|
maskingMode.addEventListener("change", function () {
|
|
323
|
-
config.maskingMode = this.checked
|
|
324
|
-
})
|
|
336
|
+
config.maskingMode = this.checked
|
|
337
|
+
})
|
|
325
338
|
|
|
326
339
|
clearCacheOnEnable.addEventListener("change", function () {
|
|
327
|
-
config.clearCacheOnEnable = this.checked
|
|
328
|
-
})
|
|
340
|
+
config.clearCacheOnEnable = this.checked
|
|
341
|
+
})
|
|
329
342
|
|
|
330
343
|
disableCacheForRedirects.addEventListener("change", function () {
|
|
331
|
-
config.disableCacheForRedirects = this.checked
|
|
332
|
-
})
|
|
344
|
+
config.disableCacheForRedirects = this.checked
|
|
345
|
+
})
|
|
333
346
|
|
|
334
347
|
// JS rule event listeners
|
|
335
348
|
jsRuleToggle.addEventListener("change", function () {
|
|
336
|
-
if (!config.rules) config.rules = {}
|
|
337
|
-
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
338
|
-
config.rules.js.enabled = this.checked
|
|
339
|
-
updateUI()
|
|
340
|
-
})
|
|
349
|
+
if (!config.rules) config.rules = {}
|
|
350
|
+
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
351
|
+
config.rules.js.enabled = this.checked
|
|
352
|
+
updateUI()
|
|
353
|
+
})
|
|
341
354
|
|
|
342
355
|
jsUseCustomPattern.addEventListener("change", function () {
|
|
343
|
-
if (!config.rules) config.rules = {}
|
|
344
|
-
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
345
|
-
config.rules.js.useCustomPattern = this.checked
|
|
346
|
-
updateUI()
|
|
347
|
-
})
|
|
356
|
+
if (!config.rules) config.rules = {}
|
|
357
|
+
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
358
|
+
config.rules.js.useCustomPattern = this.checked
|
|
359
|
+
updateUI()
|
|
360
|
+
})
|
|
348
361
|
|
|
349
362
|
// CSS rule event listeners
|
|
350
363
|
cssRuleToggle.addEventListener("change", function () {
|
|
351
|
-
if (!config.rules) config.rules = {}
|
|
352
|
-
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
353
|
-
config.rules.css.enabled = this.checked
|
|
354
|
-
updateUI()
|
|
355
|
-
})
|
|
364
|
+
if (!config.rules) config.rules = {}
|
|
365
|
+
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
366
|
+
config.rules.css.enabled = this.checked
|
|
367
|
+
updateUI()
|
|
368
|
+
})
|
|
356
369
|
|
|
357
370
|
cssReturnBlank.addEventListener("change", function () {
|
|
358
|
-
if (!config.rules) config.rules = {}
|
|
359
|
-
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
360
|
-
config.rules.css.returnBlank = this.checked
|
|
361
|
-
updateUI()
|
|
362
|
-
})
|
|
371
|
+
if (!config.rules) config.rules = {}
|
|
372
|
+
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
373
|
+
config.rules.css.returnBlank = this.checked
|
|
374
|
+
updateUI()
|
|
375
|
+
})
|
|
363
376
|
|
|
364
377
|
cssUseCustomPattern.addEventListener("change", function () {
|
|
365
|
-
if (!config.rules) config.rules = {}
|
|
366
|
-
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
367
|
-
config.rules.css.useCustomPattern = this.checked
|
|
368
|
-
updateUI()
|
|
369
|
-
})
|
|
378
|
+
if (!config.rules) config.rules = {}
|
|
379
|
+
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
380
|
+
config.rules.css.useCustomPattern = this.checked
|
|
381
|
+
updateUI()
|
|
382
|
+
})
|
|
370
383
|
|
|
371
384
|
clearCacheBtn.addEventListener("click", async function () {
|
|
372
385
|
try {
|
|
373
|
-
this.textContent = "Clearing..."
|
|
374
|
-
this.disabled = true
|
|
386
|
+
this.textContent = "Clearing..."
|
|
387
|
+
this.disabled = true
|
|
375
388
|
|
|
376
|
-
const response = await browser.runtime.sendMessage({
|
|
389
|
+
const response = await browser.runtime.sendMessage({
|
|
390
|
+
action: "clearCache",
|
|
391
|
+
})
|
|
377
392
|
|
|
378
393
|
if (response && response.success) {
|
|
379
|
-
showStatus("Cache cleared successfully")
|
|
394
|
+
showStatus("Cache cleared successfully")
|
|
380
395
|
} else {
|
|
381
|
-
showStatus(
|
|
396
|
+
showStatus(
|
|
397
|
+
"Error clearing cache: " + (response?.error || "Unknown error"),
|
|
398
|
+
false,
|
|
399
|
+
)
|
|
382
400
|
}
|
|
383
401
|
} catch (error) {
|
|
384
|
-
console.error("[GxP DevTools] Error clearing cache:", error)
|
|
385
|
-
showStatus("Error clearing cache", false)
|
|
402
|
+
console.error("[GxP DevTools] Error clearing cache:", error)
|
|
403
|
+
showStatus("Error clearing cache", false)
|
|
386
404
|
} finally {
|
|
387
|
-
this.textContent = "Clear Cache"
|
|
388
|
-
this.disabled = false
|
|
405
|
+
this.textContent = "Clear Cache"
|
|
406
|
+
this.disabled = false
|
|
389
407
|
}
|
|
390
|
-
})
|
|
408
|
+
})
|
|
391
409
|
|
|
392
410
|
saveBtn.addEventListener("click", async function () {
|
|
393
|
-
if (!config.rules) config.rules = {}
|
|
394
|
-
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
395
|
-
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
411
|
+
if (!config.rules) config.rules = {}
|
|
412
|
+
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
413
|
+
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
396
414
|
|
|
397
415
|
// Get values from inputs
|
|
398
|
-
const jsRedirectUrlValue = jsRedirectUrl.value.trim()
|
|
416
|
+
const jsRedirectUrlValue = jsRedirectUrl.value.trim()
|
|
399
417
|
const jsPatternValue = config.rules.js.useCustomPattern
|
|
400
418
|
? jsPattern.value.trim()
|
|
401
|
-
: defaultConfig.rules.js.pattern
|
|
419
|
+
: defaultConfig.rules.js.pattern
|
|
402
420
|
|
|
403
|
-
const cssRedirectUrlValue = cssRedirectUrl.value.trim()
|
|
421
|
+
const cssRedirectUrlValue = cssRedirectUrl.value.trim()
|
|
404
422
|
const cssPatternValue = config.rules.css.useCustomPattern
|
|
405
423
|
? cssPattern.value.trim()
|
|
406
|
-
: defaultConfig.rules.css.pattern
|
|
424
|
+
: defaultConfig.rules.css.pattern
|
|
407
425
|
|
|
408
426
|
// Validate JS rule if enabled
|
|
409
427
|
if (config.rules.js.enabled) {
|
|
410
428
|
if (!jsRedirectUrlValue) {
|
|
411
|
-
showStatus(
|
|
412
|
-
|
|
429
|
+
showStatus(
|
|
430
|
+
"JavaScript redirect URL is required when JS rule is enabled",
|
|
431
|
+
false,
|
|
432
|
+
)
|
|
433
|
+
return
|
|
413
434
|
}
|
|
414
435
|
|
|
415
|
-
const jsUrlError = validateRedirectUrl(jsRedirectUrlValue)
|
|
436
|
+
const jsUrlError = validateRedirectUrl(jsRedirectUrlValue)
|
|
416
437
|
if (jsUrlError) {
|
|
417
|
-
showStatus("JavaScript rule: " + jsUrlError, false)
|
|
418
|
-
return
|
|
438
|
+
showStatus("JavaScript rule: " + jsUrlError, false)
|
|
439
|
+
return
|
|
419
440
|
}
|
|
420
441
|
|
|
421
442
|
if (config.rules.js.useCustomPattern) {
|
|
422
|
-
const jsPatternError = validatePattern(jsPatternValue)
|
|
443
|
+
const jsPatternError = validatePattern(jsPatternValue)
|
|
423
444
|
if (jsPatternError) {
|
|
424
|
-
showStatus("JavaScript rule: " + jsPatternError, false)
|
|
425
|
-
return
|
|
445
|
+
showStatus("JavaScript rule: " + jsPatternError, false)
|
|
446
|
+
return
|
|
426
447
|
}
|
|
427
448
|
}
|
|
428
449
|
}
|
|
@@ -430,106 +451,130 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
430
451
|
// Validate CSS rule if enabled
|
|
431
452
|
if (config.rules.css.enabled) {
|
|
432
453
|
if (!config.rules.css.returnBlank && !cssRedirectUrlValue) {
|
|
433
|
-
showStatus(
|
|
434
|
-
|
|
454
|
+
showStatus(
|
|
455
|
+
"CSS redirect URL is required when not returning blank",
|
|
456
|
+
false,
|
|
457
|
+
)
|
|
458
|
+
return
|
|
435
459
|
}
|
|
436
460
|
|
|
437
461
|
if (!config.rules.css.returnBlank && cssRedirectUrlValue) {
|
|
438
|
-
const cssUrlError = validateRedirectUrl(cssRedirectUrlValue)
|
|
462
|
+
const cssUrlError = validateRedirectUrl(cssRedirectUrlValue)
|
|
439
463
|
if (cssUrlError) {
|
|
440
|
-
showStatus("CSS rule: " + cssUrlError, false)
|
|
441
|
-
return
|
|
464
|
+
showStatus("CSS rule: " + cssUrlError, false)
|
|
465
|
+
return
|
|
442
466
|
}
|
|
443
467
|
}
|
|
444
468
|
|
|
445
469
|
if (config.rules.css.useCustomPattern) {
|
|
446
|
-
const cssPatternError = validatePattern(cssPatternValue)
|
|
470
|
+
const cssPatternError = validatePattern(cssPatternValue)
|
|
447
471
|
if (cssPatternError) {
|
|
448
|
-
showStatus("CSS rule: " + cssPatternError, false)
|
|
449
|
-
return
|
|
472
|
+
showStatus("CSS rule: " + cssPatternError, false)
|
|
473
|
+
return
|
|
450
474
|
}
|
|
451
475
|
}
|
|
452
476
|
}
|
|
453
477
|
|
|
454
478
|
// Update config with form values
|
|
455
|
-
config.rules.js.redirectUrl = normalizeUrl(jsRedirectUrlValue)
|
|
456
|
-
config.rules.js.pattern = jsPatternValue
|
|
457
|
-
config.rules.css.redirectUrl = normalizeUrl(cssRedirectUrlValue)
|
|
458
|
-
config.rules.css.pattern = cssPatternValue
|
|
479
|
+
config.rules.js.redirectUrl = normalizeUrl(jsRedirectUrlValue)
|
|
480
|
+
config.rules.js.pattern = jsPatternValue
|
|
481
|
+
config.rules.css.redirectUrl = normalizeUrl(cssRedirectUrlValue)
|
|
482
|
+
config.rules.css.pattern = cssPatternValue
|
|
459
483
|
|
|
460
484
|
try {
|
|
461
|
-
this.disabled = true
|
|
462
|
-
this.textContent = "Saving..."
|
|
485
|
+
this.disabled = true
|
|
486
|
+
this.textContent = "Saving..."
|
|
463
487
|
|
|
464
488
|
const response = await browser.runtime.sendMessage({
|
|
465
489
|
action: "updateConfig",
|
|
466
490
|
config: config,
|
|
467
|
-
})
|
|
491
|
+
})
|
|
468
492
|
|
|
469
493
|
if (response && response.success) {
|
|
470
|
-
updateUI()
|
|
471
|
-
showStatus("Configuration saved successfully")
|
|
494
|
+
updateUI()
|
|
495
|
+
showStatus("Configuration saved successfully")
|
|
472
496
|
} else {
|
|
473
|
-
throw new Error(response ? response.error : "Unknown error")
|
|
497
|
+
throw new Error(response ? response.error : "Unknown error")
|
|
474
498
|
}
|
|
475
499
|
} catch (error) {
|
|
476
|
-
console.error("[GxP DevTools] Error saving config:", error)
|
|
477
|
-
showStatus("Error saving configuration", false)
|
|
500
|
+
console.error("[GxP DevTools] Error saving config:", error)
|
|
501
|
+
showStatus("Error saving configuration", false)
|
|
478
502
|
} finally {
|
|
479
|
-
this.disabled = false
|
|
480
|
-
this.textContent = "Save Configuration"
|
|
503
|
+
this.disabled = false
|
|
504
|
+
this.textContent = "Save Configuration"
|
|
481
505
|
}
|
|
482
|
-
})
|
|
506
|
+
})
|
|
483
507
|
|
|
484
508
|
// Component Inspector
|
|
485
509
|
function updateInspectorUI() {
|
|
486
510
|
if (inspectorEnabled) {
|
|
487
|
-
inspectorBadge.textContent = "ON"
|
|
488
|
-
inspectorBadge.classList.add("enabled")
|
|
511
|
+
inspectorBadge.textContent = "ON"
|
|
512
|
+
inspectorBadge.classList.add("enabled")
|
|
489
513
|
} else {
|
|
490
|
-
inspectorBadge.textContent = "OFF"
|
|
491
|
-
inspectorBadge.classList.remove("enabled")
|
|
514
|
+
inspectorBadge.textContent = "OFF"
|
|
515
|
+
inspectorBadge.classList.remove("enabled")
|
|
492
516
|
}
|
|
493
517
|
}
|
|
494
518
|
|
|
495
519
|
async function getInspectorState() {
|
|
496
520
|
try {
|
|
497
|
-
const [tab] = await browser.tabs.query({
|
|
521
|
+
const [tab] = await browser.tabs.query({
|
|
522
|
+
active: true,
|
|
523
|
+
currentWindow: true,
|
|
524
|
+
})
|
|
498
525
|
if (tab?.id) {
|
|
499
|
-
const response = await browser.tabs.sendMessage(tab.id, {
|
|
526
|
+
const response = await browser.tabs.sendMessage(tab.id, {
|
|
527
|
+
action: "getInspectorState",
|
|
528
|
+
})
|
|
500
529
|
if (response) {
|
|
501
|
-
inspectorEnabled = response.enabled
|
|
502
|
-
updateInspectorUI()
|
|
530
|
+
inspectorEnabled = response.enabled
|
|
531
|
+
updateInspectorUI()
|
|
503
532
|
}
|
|
504
533
|
}
|
|
505
534
|
} catch (error) {
|
|
506
|
-
console.log("[GxP DevTools] Could not get inspector state:", error)
|
|
535
|
+
console.log("[GxP DevTools] Could not get inspector state:", error)
|
|
507
536
|
}
|
|
508
537
|
}
|
|
509
538
|
|
|
510
539
|
// Click on inspector card enables inspector and prompts to open DevTools
|
|
511
540
|
inspectorCard.addEventListener("click", async function () {
|
|
512
541
|
try {
|
|
513
|
-
const [tab] = await browser.tabs.query({
|
|
542
|
+
const [tab] = await browser.tabs.query({
|
|
543
|
+
active: true,
|
|
544
|
+
currentWindow: true,
|
|
545
|
+
})
|
|
514
546
|
if (tab?.id) {
|
|
515
547
|
// Enable the inspector on the page
|
|
516
|
-
const response = await browser.tabs.sendMessage(tab.id, {
|
|
548
|
+
const response = await browser.tabs.sendMessage(tab.id, {
|
|
549
|
+
action: "toggleInspector",
|
|
550
|
+
})
|
|
517
551
|
if (response) {
|
|
518
|
-
inspectorEnabled = response.enabled
|
|
519
|
-
updateInspectorUI()
|
|
552
|
+
inspectorEnabled = response.enabled
|
|
553
|
+
updateInspectorUI()
|
|
520
554
|
}
|
|
521
555
|
|
|
522
556
|
// Log a message to the console suggesting to open DevTools
|
|
523
|
-
browser.tabs
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
557
|
+
browser.tabs
|
|
558
|
+
.executeScript(tab.id, {
|
|
559
|
+
code: `console.log('%c[GxP Inspector] Inspector enabled! Press F12 or Ctrl+Shift+J to open DevTools and see the GxP Inspector panel.', 'color: #667eea; font-weight: bold; font-size: 14px;');`,
|
|
560
|
+
})
|
|
561
|
+
.catch((err) =>
|
|
562
|
+
console.log("[GxP DevTools] Could not inject script:", err),
|
|
563
|
+
)
|
|
564
|
+
|
|
565
|
+
showStatus(
|
|
566
|
+
inspectorEnabled
|
|
567
|
+
? "Inspector enabled - check DevTools"
|
|
568
|
+
: "Inspector disabled",
|
|
569
|
+
)
|
|
528
570
|
}
|
|
529
571
|
} catch (error) {
|
|
530
|
-
showStatus(
|
|
572
|
+
showStatus(
|
|
573
|
+
"Could not open inspector. Make sure you're on a web page.",
|
|
574
|
+
false,
|
|
575
|
+
)
|
|
531
576
|
}
|
|
532
|
-
})
|
|
577
|
+
})
|
|
533
578
|
|
|
534
|
-
getInspectorState()
|
|
535
|
-
})
|
|
579
|
+
getInspectorState()
|
|
580
|
+
})
|