@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,63 @@
|
|
|
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 saveButton = document.getElementById("saveButton")
|
|
6
|
-
const statusDiv = document.getElementById("status")
|
|
7
|
-
const maskingModeCheckbox = document.getElementById("maskingMode")
|
|
8
|
-
const clearCacheOnEnableCheckbox =
|
|
9
|
-
|
|
10
|
-
const
|
|
3
|
+
const toggleButton = document.getElementById("toggleButton")
|
|
4
|
+
const toggleText = document.getElementById("toggleText")
|
|
5
|
+
const saveButton = document.getElementById("saveButton")
|
|
6
|
+
const statusDiv = document.getElementById("status")
|
|
7
|
+
const maskingModeCheckbox = document.getElementById("maskingMode")
|
|
8
|
+
const clearCacheOnEnableCheckbox =
|
|
9
|
+
document.getElementById("clearCacheOnEnable")
|
|
10
|
+
const disableCacheForRedirectsCheckbox = document.getElementById(
|
|
11
|
+
"disableCacheForRedirects",
|
|
12
|
+
)
|
|
13
|
+
const clearCacheButton = document.getElementById("clearCacheButton")
|
|
11
14
|
|
|
12
15
|
// 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")
|
|
16
|
+
const tabs = document.querySelectorAll(".tab")
|
|
17
|
+
const tabContents = document.querySelectorAll(".tab-content")
|
|
18
|
+
const jsBadge = document.getElementById("jsBadge")
|
|
19
|
+
const cssBadge = document.getElementById("cssBadge")
|
|
17
20
|
|
|
18
21
|
// Inspector elements
|
|
19
|
-
const inspectorCard = document.getElementById("inspectorCard")
|
|
20
|
-
const inspectorBadge = document.getElementById("inspectorBadge")
|
|
22
|
+
const inspectorCard = document.getElementById("inspectorCard")
|
|
23
|
+
const inspectorBadge = document.getElementById("inspectorBadge")
|
|
21
24
|
|
|
22
25
|
// Inspector state
|
|
23
|
-
let inspectorEnabled = false
|
|
26
|
+
let inspectorEnabled = false
|
|
24
27
|
|
|
25
28
|
// JS Rule elements
|
|
26
|
-
const jsRuleEnabled = document.getElementById("jsRuleEnabled")
|
|
27
|
-
const jsRuleContent = document.getElementById("jsRuleContent")
|
|
28
|
-
const jsRedirectUrl = document.getElementById("jsRedirectUrl")
|
|
29
|
-
const jsCustomPattern = document.getElementById("jsCustomPattern")
|
|
30
|
-
const jsPatternDisplay = document.getElementById("jsPatternDisplay")
|
|
31
|
-
const jsCustomPatternInput = document.getElementById("jsCustomPatternInput")
|
|
29
|
+
const jsRuleEnabled = document.getElementById("jsRuleEnabled")
|
|
30
|
+
const jsRuleContent = document.getElementById("jsRuleContent")
|
|
31
|
+
const jsRedirectUrl = document.getElementById("jsRedirectUrl")
|
|
32
|
+
const jsCustomPattern = document.getElementById("jsCustomPattern")
|
|
33
|
+
const jsPatternDisplay = document.getElementById("jsPatternDisplay")
|
|
34
|
+
const jsCustomPatternInput = document.getElementById("jsCustomPatternInput")
|
|
32
35
|
|
|
33
36
|
// CSS Rule elements
|
|
34
|
-
const cssRuleEnabled = document.getElementById("cssRuleEnabled")
|
|
35
|
-
const cssRuleContent = document.getElementById("cssRuleContent")
|
|
36
|
-
const cssRedirectUrl = document.getElementById("cssRedirectUrl")
|
|
37
|
-
const cssReturnBlank = document.getElementById("cssReturnBlank")
|
|
38
|
-
const cssRedirectSection = document.getElementById("cssRedirectSection")
|
|
39
|
-
const cssCustomPattern = document.getElementById("cssCustomPattern")
|
|
40
|
-
const cssPatternDisplay = document.getElementById("cssPatternDisplay")
|
|
41
|
-
const cssCustomPatternInput = document.getElementById("cssCustomPatternInput")
|
|
37
|
+
const cssRuleEnabled = document.getElementById("cssRuleEnabled")
|
|
38
|
+
const cssRuleContent = document.getElementById("cssRuleContent")
|
|
39
|
+
const cssRedirectUrl = document.getElementById("cssRedirectUrl")
|
|
40
|
+
const cssReturnBlank = document.getElementById("cssReturnBlank")
|
|
41
|
+
const cssRedirectSection = document.getElementById("cssRedirectSection")
|
|
42
|
+
const cssCustomPattern = document.getElementById("cssCustomPattern")
|
|
43
|
+
const cssPatternDisplay = document.getElementById("cssPatternDisplay")
|
|
44
|
+
const cssCustomPatternInput = document.getElementById("cssCustomPatternInput")
|
|
42
45
|
|
|
43
46
|
// Load environment-based defaults from defaults.json (generated by launch script)
|
|
44
|
-
let envDefaults = {}
|
|
47
|
+
let envDefaults = {}
|
|
45
48
|
try {
|
|
46
|
-
const response = await fetch(chrome.runtime.getURL("defaults.json"))
|
|
49
|
+
const response = await fetch(chrome.runtime.getURL("defaults.json"))
|
|
47
50
|
if (response.ok) {
|
|
48
|
-
envDefaults = await response.json()
|
|
49
|
-
console.log("Loaded environment defaults:", envDefaults)
|
|
51
|
+
envDefaults = await response.json()
|
|
52
|
+
console.log("Loaded environment defaults:", envDefaults)
|
|
50
53
|
}
|
|
51
54
|
} catch (error) {
|
|
52
|
-
console.log("No environment defaults found, using hardcoded defaults")
|
|
55
|
+
console.log("No environment defaults found, using hardcoded defaults")
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
// Build default redirect URL from env defaults or fallback
|
|
56
|
-
const defaultRedirectUrl =
|
|
59
|
+
const defaultRedirectUrl =
|
|
60
|
+
envDefaults.jsRedirectUrl || "https://localhost:3060/src/Plugin.vue"
|
|
57
61
|
|
|
58
62
|
// Default configuration (merged with environment defaults)
|
|
59
63
|
const defaultConfig = {
|
|
@@ -64,13 +68,15 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
64
68
|
rules: {
|
|
65
69
|
js: {
|
|
66
70
|
enabled: true,
|
|
67
|
-
pattern:
|
|
71
|
+
pattern:
|
|
72
|
+
"uploads\\/plugin-version\\/\\d+\\/file_name\\/.*\\.js(\\?.*)?",
|
|
68
73
|
redirectUrl: defaultRedirectUrl,
|
|
69
74
|
useCustomPattern: envDefaults.jsUseCustomPattern || false,
|
|
70
75
|
},
|
|
71
76
|
css: {
|
|
72
77
|
enabled: envDefaults.cssRuleEnabled !== false,
|
|
73
|
-
pattern:
|
|
78
|
+
pattern:
|
|
79
|
+
"uploads\\/plugin-version\\/\\d+\\/style_file_name\\/.*\\.css(\\?.*)?",
|
|
74
80
|
redirectUrl: envDefaults.cssRedirectUrl || "",
|
|
75
81
|
returnBlank: envDefaults.cssReturnBlank !== false,
|
|
76
82
|
useCustomPattern: envDefaults.cssUseCustomPattern || false,
|
|
@@ -79,59 +85,61 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
79
85
|
maskingMode: false,
|
|
80
86
|
clearCacheOnEnable: envDefaults.clearCacheOnEnable !== false,
|
|
81
87
|
disableCacheForRedirects: envDefaults.disableCacheForRedirects !== false,
|
|
82
|
-
}
|
|
88
|
+
}
|
|
83
89
|
|
|
84
90
|
// Load current configuration
|
|
85
|
-
let config = {}
|
|
91
|
+
let config = {}
|
|
86
92
|
try {
|
|
87
|
-
const result = await chrome.storage.sync.get(null)
|
|
93
|
+
const result = await chrome.storage.sync.get(null)
|
|
88
94
|
|
|
89
95
|
// Check if defaults.json has enabled=true (launched from CLI)
|
|
90
96
|
// In this case, we should apply the CLI defaults over stored config
|
|
91
|
-
const cliLaunched = envDefaults.enabled === true
|
|
97
|
+
const cliLaunched = envDefaults.enabled === true
|
|
92
98
|
|
|
93
99
|
if (!result || Object.keys(result).length === 0) {
|
|
94
|
-
config = defaultConfig
|
|
95
|
-
await chrome.storage.sync.set(config)
|
|
96
|
-
console.log("Initialized with environment defaults")
|
|
100
|
+
config = defaultConfig
|
|
101
|
+
await chrome.storage.sync.set(config)
|
|
102
|
+
console.log("Initialized with environment defaults")
|
|
97
103
|
} else if (cliLaunched) {
|
|
98
104
|
// CLI launch - apply defaults over stored config for key settings
|
|
99
|
-
config = { ...defaultConfig, ...result }
|
|
100
|
-
config.enabled = true
|
|
101
|
-
config = migrateConfig(config, defaultConfig)
|
|
105
|
+
config = { ...defaultConfig, ...result }
|
|
106
|
+
config.enabled = true // Force enabled when launched from CLI
|
|
107
|
+
config = migrateConfig(config, defaultConfig)
|
|
102
108
|
// Also ensure rules use CLI defaults
|
|
103
109
|
if (config.rules) {
|
|
104
|
-
config.rules.js.useCustomPattern =
|
|
105
|
-
|
|
106
|
-
config.rules.css.
|
|
107
|
-
|
|
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
|
|
108
116
|
}
|
|
109
|
-
await chrome.storage.sync.set(config)
|
|
110
|
-
console.log("Applied CLI defaults over stored config")
|
|
117
|
+
await chrome.storage.sync.set(config)
|
|
118
|
+
console.log("Applied CLI defaults over stored config")
|
|
111
119
|
} else {
|
|
112
|
-
config = { ...defaultConfig, ...result }
|
|
113
|
-
config = migrateConfig(config, defaultConfig)
|
|
120
|
+
config = { ...defaultConfig, ...result }
|
|
121
|
+
config = migrateConfig(config, defaultConfig)
|
|
114
122
|
}
|
|
115
123
|
} catch (error) {
|
|
116
|
-
console.error("Error loading config:", error)
|
|
117
|
-
config = defaultConfig
|
|
124
|
+
console.error("Error loading config:", error)
|
|
125
|
+
config = defaultConfig
|
|
118
126
|
}
|
|
119
127
|
|
|
120
128
|
// Initialize UI
|
|
121
|
-
updateUI()
|
|
122
|
-
updatePatternDisplays()
|
|
123
|
-
setupTabNavigation()
|
|
129
|
+
updateUI()
|
|
130
|
+
updatePatternDisplays()
|
|
131
|
+
setupTabNavigation()
|
|
124
132
|
|
|
125
133
|
// If CLI launched and config is enabled, notify background script to activate
|
|
126
134
|
if (config.enabled) {
|
|
127
135
|
chrome.runtime.sendMessage({
|
|
128
136
|
action: "updateConfig",
|
|
129
137
|
config: config,
|
|
130
|
-
})
|
|
138
|
+
})
|
|
131
139
|
chrome.runtime.sendMessage({
|
|
132
140
|
action: "toggleProxy",
|
|
133
141
|
enabled: true,
|
|
134
|
-
})
|
|
142
|
+
})
|
|
135
143
|
}
|
|
136
144
|
|
|
137
145
|
function migrateConfig(config, defaults = defaultConfig) {
|
|
@@ -141,7 +149,8 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
141
149
|
enabled: true,
|
|
142
150
|
pattern: config.urlPattern || defaults.rules.js.pattern,
|
|
143
151
|
redirectUrl: config.redirectUrl || defaults.rules.js.redirectUrl,
|
|
144
|
-
useCustomPattern:
|
|
152
|
+
useCustomPattern:
|
|
153
|
+
config.useCustomPattern || defaults.rules.js.useCustomPattern,
|
|
145
154
|
},
|
|
146
155
|
css: {
|
|
147
156
|
enabled: defaults.rules.css.enabled,
|
|
@@ -150,111 +159,112 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
150
159
|
returnBlank: defaults.rules.css.returnBlank,
|
|
151
160
|
useCustomPattern: defaults.rules.css.useCustomPattern,
|
|
152
161
|
},
|
|
153
|
-
}
|
|
162
|
+
}
|
|
154
163
|
}
|
|
155
|
-
return config
|
|
164
|
+
return config
|
|
156
165
|
}
|
|
157
166
|
|
|
158
167
|
function setupTabNavigation() {
|
|
159
168
|
tabs.forEach((tab) => {
|
|
160
169
|
tab.addEventListener("click", () => {
|
|
161
|
-
const tabName = tab.dataset.tab
|
|
170
|
+
const tabName = tab.dataset.tab
|
|
162
171
|
|
|
163
172
|
// Update active tab
|
|
164
|
-
tabs.forEach((t) => t.classList.remove("active"))
|
|
165
|
-
tab.classList.add("active")
|
|
173
|
+
tabs.forEach((t) => t.classList.remove("active"))
|
|
174
|
+
tab.classList.add("active")
|
|
166
175
|
|
|
167
176
|
// Show corresponding content
|
|
168
177
|
tabContents.forEach((content) => {
|
|
169
|
-
content.classList.remove("active")
|
|
178
|
+
content.classList.remove("active")
|
|
170
179
|
if (content.id === `${tabName}Tab`) {
|
|
171
|
-
content.classList.add("active")
|
|
180
|
+
content.classList.add("active")
|
|
172
181
|
}
|
|
173
|
-
})
|
|
174
|
-
})
|
|
175
|
-
})
|
|
182
|
+
})
|
|
183
|
+
})
|
|
184
|
+
})
|
|
176
185
|
}
|
|
177
186
|
|
|
178
187
|
function updateUI() {
|
|
179
188
|
// Update toggle button
|
|
180
189
|
if (config.enabled) {
|
|
181
|
-
toggleButton.classList.add("enabled")
|
|
182
|
-
toggleText.textContent = "ON"
|
|
190
|
+
toggleButton.classList.add("enabled")
|
|
191
|
+
toggleText.textContent = "ON"
|
|
183
192
|
} else {
|
|
184
|
-
toggleButton.classList.remove("enabled")
|
|
185
|
-
toggleText.textContent = "OFF"
|
|
193
|
+
toggleButton.classList.remove("enabled")
|
|
194
|
+
toggleText.textContent = "OFF"
|
|
186
195
|
}
|
|
187
196
|
|
|
188
197
|
// Update global settings
|
|
189
|
-
maskingModeCheckbox.checked = config.maskingMode || false
|
|
190
|
-
clearCacheOnEnableCheckbox.checked = config.clearCacheOnEnable !== false
|
|
191
|
-
disableCacheForRedirectsCheckbox.checked =
|
|
198
|
+
maskingModeCheckbox.checked = config.maskingMode || false
|
|
199
|
+
clearCacheOnEnableCheckbox.checked = config.clearCacheOnEnable !== false
|
|
200
|
+
disableCacheForRedirectsCheckbox.checked =
|
|
201
|
+
config.disableCacheForRedirects !== false
|
|
192
202
|
|
|
193
203
|
// Update JS rule
|
|
194
204
|
if (config.rules && config.rules.js) {
|
|
195
|
-
jsRuleEnabled.checked = config.rules.js.enabled
|
|
196
|
-
jsRedirectUrl.value = config.rules.js.redirectUrl || ""
|
|
197
|
-
jsCustomPattern.checked = config.rules.js.useCustomPattern || false
|
|
198
|
-
jsCustomPatternInput.value = config.rules.js.pattern || ""
|
|
205
|
+
jsRuleEnabled.checked = config.rules.js.enabled
|
|
206
|
+
jsRedirectUrl.value = config.rules.js.redirectUrl || ""
|
|
207
|
+
jsCustomPattern.checked = config.rules.js.useCustomPattern || false
|
|
208
|
+
jsCustomPatternInput.value = config.rules.js.pattern || ""
|
|
199
209
|
|
|
200
210
|
// Update JS badge
|
|
201
211
|
if (config.rules.js.enabled) {
|
|
202
|
-
jsBadge.textContent = "ON"
|
|
203
|
-
jsBadge.classList.remove("disabled")
|
|
204
|
-
jsBadge.classList.add("enabled")
|
|
205
|
-
jsRuleContent.classList.remove("rule-disabled")
|
|
212
|
+
jsBadge.textContent = "ON"
|
|
213
|
+
jsBadge.classList.remove("disabled")
|
|
214
|
+
jsBadge.classList.add("enabled")
|
|
215
|
+
jsRuleContent.classList.remove("rule-disabled")
|
|
206
216
|
} else {
|
|
207
|
-
jsBadge.textContent = "OFF"
|
|
208
|
-
jsBadge.classList.remove("enabled")
|
|
209
|
-
jsBadge.classList.add("disabled")
|
|
210
|
-
jsRuleContent.classList.add("rule-disabled")
|
|
217
|
+
jsBadge.textContent = "OFF"
|
|
218
|
+
jsBadge.classList.remove("enabled")
|
|
219
|
+
jsBadge.classList.add("disabled")
|
|
220
|
+
jsRuleContent.classList.add("rule-disabled")
|
|
211
221
|
}
|
|
212
222
|
|
|
213
223
|
// Toggle custom pattern input visibility
|
|
214
224
|
if (config.rules.js.useCustomPattern) {
|
|
215
|
-
jsCustomPatternInput.classList.add("visible")
|
|
216
|
-
jsPatternDisplay.style.display = "none"
|
|
225
|
+
jsCustomPatternInput.classList.add("visible")
|
|
226
|
+
jsPatternDisplay.style.display = "none"
|
|
217
227
|
} else {
|
|
218
|
-
jsCustomPatternInput.classList.remove("visible")
|
|
219
|
-
jsPatternDisplay.style.display = "block"
|
|
228
|
+
jsCustomPatternInput.classList.remove("visible")
|
|
229
|
+
jsPatternDisplay.style.display = "block"
|
|
220
230
|
}
|
|
221
231
|
}
|
|
222
232
|
|
|
223
233
|
// Update CSS rule
|
|
224
234
|
if (config.rules && config.rules.css) {
|
|
225
|
-
cssRuleEnabled.checked = config.rules.css.enabled
|
|
226
|
-
cssRedirectUrl.value = config.rules.css.redirectUrl || ""
|
|
227
|
-
cssReturnBlank.checked = config.rules.css.returnBlank || false
|
|
228
|
-
cssCustomPattern.checked = config.rules.css.useCustomPattern || false
|
|
229
|
-
cssCustomPatternInput.value = config.rules.css.pattern || ""
|
|
235
|
+
cssRuleEnabled.checked = config.rules.css.enabled
|
|
236
|
+
cssRedirectUrl.value = config.rules.css.redirectUrl || ""
|
|
237
|
+
cssReturnBlank.checked = config.rules.css.returnBlank || false
|
|
238
|
+
cssCustomPattern.checked = config.rules.css.useCustomPattern || false
|
|
239
|
+
cssCustomPatternInput.value = config.rules.css.pattern || ""
|
|
230
240
|
|
|
231
241
|
// Update CSS badge
|
|
232
242
|
if (config.rules.css.enabled) {
|
|
233
|
-
cssBadge.textContent = "ON"
|
|
234
|
-
cssBadge.classList.remove("disabled")
|
|
235
|
-
cssBadge.classList.add("enabled")
|
|
236
|
-
cssRuleContent.classList.remove("rule-disabled")
|
|
243
|
+
cssBadge.textContent = "ON"
|
|
244
|
+
cssBadge.classList.remove("disabled")
|
|
245
|
+
cssBadge.classList.add("enabled")
|
|
246
|
+
cssRuleContent.classList.remove("rule-disabled")
|
|
237
247
|
} else {
|
|
238
|
-
cssBadge.textContent = "OFF"
|
|
239
|
-
cssBadge.classList.remove("enabled")
|
|
240
|
-
cssBadge.classList.add("disabled")
|
|
241
|
-
cssRuleContent.classList.add("rule-disabled")
|
|
248
|
+
cssBadge.textContent = "OFF"
|
|
249
|
+
cssBadge.classList.remove("enabled")
|
|
250
|
+
cssBadge.classList.add("disabled")
|
|
251
|
+
cssRuleContent.classList.add("rule-disabled")
|
|
242
252
|
}
|
|
243
253
|
|
|
244
254
|
// Toggle redirect section based on blank return setting
|
|
245
255
|
if (config.rules.css.returnBlank) {
|
|
246
|
-
cssRedirectSection.style.display = "none"
|
|
256
|
+
cssRedirectSection.style.display = "none"
|
|
247
257
|
} else {
|
|
248
|
-
cssRedirectSection.style.display = "block"
|
|
258
|
+
cssRedirectSection.style.display = "block"
|
|
249
259
|
}
|
|
250
260
|
|
|
251
261
|
// Toggle custom pattern input visibility
|
|
252
262
|
if (config.rules.css.useCustomPattern) {
|
|
253
|
-
cssCustomPatternInput.classList.add("visible")
|
|
254
|
-
cssPatternDisplay.style.display = "none"
|
|
263
|
+
cssCustomPatternInput.classList.add("visible")
|
|
264
|
+
cssPatternDisplay.style.display = "none"
|
|
255
265
|
} else {
|
|
256
|
-
cssCustomPatternInput.classList.remove("visible")
|
|
257
|
-
cssPatternDisplay.style.display = "block"
|
|
266
|
+
cssCustomPatternInput.classList.remove("visible")
|
|
267
|
+
cssPatternDisplay.style.display = "block"
|
|
258
268
|
}
|
|
259
269
|
}
|
|
260
270
|
}
|
|
@@ -263,291 +273,319 @@ document.addEventListener("DOMContentLoaded", async function () {
|
|
|
263
273
|
if (config.rules && config.rules.js) {
|
|
264
274
|
const jsPattern = config.rules.js.useCustomPattern
|
|
265
275
|
? config.rules.js.pattern
|
|
266
|
-
: defaultConfig.rules.js.pattern
|
|
267
|
-
jsPatternDisplay.textContent = jsPattern
|
|
276
|
+
: defaultConfig.rules.js.pattern
|
|
277
|
+
jsPatternDisplay.textContent = jsPattern
|
|
268
278
|
}
|
|
269
279
|
|
|
270
280
|
if (config.rules && config.rules.css) {
|
|
271
281
|
const cssPattern = config.rules.css.useCustomPattern
|
|
272
282
|
? config.rules.css.pattern
|
|
273
|
-
: defaultConfig.rules.css.pattern
|
|
274
|
-
cssPatternDisplay.textContent = cssPattern
|
|
283
|
+
: defaultConfig.rules.css.pattern
|
|
284
|
+
cssPatternDisplay.textContent = cssPattern
|
|
275
285
|
}
|
|
276
286
|
}
|
|
277
287
|
|
|
278
288
|
function showStatus(message, isSuccess = true) {
|
|
279
|
-
statusDiv.textContent = message
|
|
280
|
-
statusDiv.className = `status ${isSuccess ? "success" : "error"}
|
|
281
|
-
statusDiv.style.display = "block"
|
|
289
|
+
statusDiv.textContent = message
|
|
290
|
+
statusDiv.className = `status ${isSuccess ? "success" : "error"}`
|
|
291
|
+
statusDiv.style.display = "block"
|
|
282
292
|
|
|
283
293
|
setTimeout(() => {
|
|
284
|
-
statusDiv.style.display = "none"
|
|
285
|
-
}, 3000)
|
|
294
|
+
statusDiv.style.display = "none"
|
|
295
|
+
}, 3000)
|
|
286
296
|
}
|
|
287
297
|
|
|
288
298
|
function validateRedirectUrl(url) {
|
|
289
|
-
if (!url || url.trim() === "") return null
|
|
299
|
+
if (!url || url.trim() === "") return null
|
|
290
300
|
|
|
291
301
|
try {
|
|
292
|
-
new URL(url)
|
|
293
|
-
return null
|
|
302
|
+
new URL(url)
|
|
303
|
+
return null
|
|
294
304
|
} catch {
|
|
295
|
-
if (url.includes("://")) return "Invalid URL format"
|
|
305
|
+
if (url.includes("://")) return "Invalid URL format"
|
|
296
306
|
|
|
297
307
|
try {
|
|
298
|
-
new URL("https://" + url)
|
|
299
|
-
return null
|
|
308
|
+
new URL("https://" + url)
|
|
309
|
+
return null
|
|
300
310
|
} catch {
|
|
301
|
-
return "Invalid URL format"
|
|
311
|
+
return "Invalid URL format"
|
|
302
312
|
}
|
|
303
313
|
}
|
|
304
314
|
}
|
|
305
315
|
|
|
306
316
|
function validatePattern(pattern) {
|
|
307
|
-
if (!pattern || pattern.trim() === "") return "URL pattern is required"
|
|
317
|
+
if (!pattern || pattern.trim() === "") return "URL pattern is required"
|
|
308
318
|
|
|
309
319
|
try {
|
|
310
|
-
new RegExp(pattern)
|
|
311
|
-
return null
|
|
320
|
+
new RegExp(pattern)
|
|
321
|
+
return null
|
|
312
322
|
} catch {
|
|
313
|
-
return "Invalid regular expression pattern"
|
|
323
|
+
return "Invalid regular expression pattern"
|
|
314
324
|
}
|
|
315
325
|
}
|
|
316
326
|
|
|
317
327
|
function normalizeUrl(url) {
|
|
318
|
-
if (!url || url.trim() === "") return ""
|
|
319
|
-
if (!url.includes("://")) return "https://" + url
|
|
320
|
-
return url
|
|
328
|
+
if (!url || url.trim() === "") return ""
|
|
329
|
+
if (!url.includes("://")) return "https://" + url
|
|
330
|
+
return url
|
|
321
331
|
}
|
|
322
332
|
|
|
323
333
|
// Event listeners
|
|
324
334
|
toggleButton.addEventListener("click", async function () {
|
|
325
|
-
config.enabled = !config.enabled
|
|
335
|
+
config.enabled = !config.enabled
|
|
326
336
|
|
|
327
337
|
try {
|
|
328
|
-
await chrome.storage.sync.set({ enabled: config.enabled })
|
|
329
|
-
updateUI()
|
|
338
|
+
await chrome.storage.sync.set({ enabled: config.enabled })
|
|
339
|
+
updateUI()
|
|
330
340
|
|
|
331
341
|
chrome.runtime.sendMessage({
|
|
332
342
|
action: "toggleProxy",
|
|
333
343
|
enabled: config.enabled,
|
|
334
|
-
})
|
|
344
|
+
})
|
|
335
345
|
|
|
336
|
-
showStatus(config.enabled ? "Proxy enabled" : "Proxy disabled")
|
|
346
|
+
showStatus(config.enabled ? "Proxy enabled" : "Proxy disabled")
|
|
337
347
|
} catch (error) {
|
|
338
|
-
console.error("Error toggling proxy:", error)
|
|
339
|
-
showStatus("Error toggling proxy", false)
|
|
348
|
+
console.error("Error toggling proxy:", error)
|
|
349
|
+
showStatus("Error toggling proxy", false)
|
|
340
350
|
}
|
|
341
|
-
})
|
|
351
|
+
})
|
|
342
352
|
|
|
343
353
|
// Global settings event listeners
|
|
344
354
|
maskingModeCheckbox.addEventListener("change", function () {
|
|
345
|
-
config.maskingMode = this.checked
|
|
346
|
-
})
|
|
355
|
+
config.maskingMode = this.checked
|
|
356
|
+
})
|
|
347
357
|
|
|
348
358
|
clearCacheOnEnableCheckbox.addEventListener("change", function () {
|
|
349
|
-
config.clearCacheOnEnable = this.checked
|
|
350
|
-
})
|
|
359
|
+
config.clearCacheOnEnable = this.checked
|
|
360
|
+
})
|
|
351
361
|
|
|
352
362
|
disableCacheForRedirectsCheckbox.addEventListener("change", function () {
|
|
353
|
-
config.disableCacheForRedirects = this.checked
|
|
354
|
-
})
|
|
363
|
+
config.disableCacheForRedirects = this.checked
|
|
364
|
+
})
|
|
355
365
|
|
|
356
366
|
// JS rule event listeners
|
|
357
367
|
jsRuleEnabled.addEventListener("change", function () {
|
|
358
|
-
if (!config.rules) config.rules = {}
|
|
359
|
-
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
360
|
-
config.rules.js.enabled = this.checked
|
|
361
|
-
updateUI()
|
|
362
|
-
})
|
|
368
|
+
if (!config.rules) config.rules = {}
|
|
369
|
+
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
370
|
+
config.rules.js.enabled = this.checked
|
|
371
|
+
updateUI()
|
|
372
|
+
})
|
|
363
373
|
|
|
364
374
|
jsCustomPattern.addEventListener("change", function () {
|
|
365
|
-
if (!config.rules) config.rules = {}
|
|
366
|
-
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
367
|
-
config.rules.js.useCustomPattern = this.checked
|
|
368
|
-
updateUI()
|
|
369
|
-
updatePatternDisplays()
|
|
370
|
-
})
|
|
375
|
+
if (!config.rules) config.rules = {}
|
|
376
|
+
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
377
|
+
config.rules.js.useCustomPattern = this.checked
|
|
378
|
+
updateUI()
|
|
379
|
+
updatePatternDisplays()
|
|
380
|
+
})
|
|
371
381
|
|
|
372
382
|
// CSS rule event listeners
|
|
373
383
|
cssRuleEnabled.addEventListener("change", function () {
|
|
374
|
-
if (!config.rules) config.rules = {}
|
|
375
|
-
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
376
|
-
config.rules.css.enabled = this.checked
|
|
377
|
-
updateUI()
|
|
378
|
-
})
|
|
384
|
+
if (!config.rules) config.rules = {}
|
|
385
|
+
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
386
|
+
config.rules.css.enabled = this.checked
|
|
387
|
+
updateUI()
|
|
388
|
+
})
|
|
379
389
|
|
|
380
390
|
cssReturnBlank.addEventListener("change", function () {
|
|
381
|
-
if (!config.rules) config.rules = {}
|
|
382
|
-
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
383
|
-
config.rules.css.returnBlank = this.checked
|
|
384
|
-
updateUI()
|
|
385
|
-
})
|
|
391
|
+
if (!config.rules) config.rules = {}
|
|
392
|
+
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
393
|
+
config.rules.css.returnBlank = this.checked
|
|
394
|
+
updateUI()
|
|
395
|
+
})
|
|
386
396
|
|
|
387
397
|
cssCustomPattern.addEventListener("change", function () {
|
|
388
|
-
if (!config.rules) config.rules = {}
|
|
389
|
-
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
390
|
-
config.rules.css.useCustomPattern = this.checked
|
|
391
|
-
updateUI()
|
|
392
|
-
updatePatternDisplays()
|
|
393
|
-
})
|
|
398
|
+
if (!config.rules) config.rules = {}
|
|
399
|
+
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
400
|
+
config.rules.css.useCustomPattern = this.checked
|
|
401
|
+
updateUI()
|
|
402
|
+
updatePatternDisplays()
|
|
403
|
+
})
|
|
394
404
|
|
|
395
405
|
clearCacheButton.addEventListener("click", async function () {
|
|
396
406
|
try {
|
|
397
|
-
this.textContent = "Clearing..."
|
|
398
|
-
this.disabled = true
|
|
407
|
+
this.textContent = "Clearing..."
|
|
408
|
+
this.disabled = true
|
|
399
409
|
|
|
400
|
-
const response = await chrome.runtime.sendMessage({
|
|
410
|
+
const response = await chrome.runtime.sendMessage({
|
|
411
|
+
action: "clearCache",
|
|
412
|
+
})
|
|
401
413
|
|
|
402
414
|
if (response.success) {
|
|
403
|
-
showStatus("Cache cleared successfully")
|
|
415
|
+
showStatus("Cache cleared successfully")
|
|
404
416
|
} else {
|
|
405
|
-
showStatus(
|
|
417
|
+
showStatus(
|
|
418
|
+
"Error clearing cache: " + (response.error || "Unknown error"),
|
|
419
|
+
false,
|
|
420
|
+
)
|
|
406
421
|
}
|
|
407
422
|
} catch (error) {
|
|
408
|
-
console.error("Error clearing cache:", error)
|
|
409
|
-
showStatus("Error clearing cache", false)
|
|
423
|
+
console.error("Error clearing cache:", error)
|
|
424
|
+
showStatus("Error clearing cache", false)
|
|
410
425
|
} finally {
|
|
411
|
-
this.textContent = "Clear Cache"
|
|
412
|
-
this.disabled = false
|
|
426
|
+
this.textContent = "Clear Cache"
|
|
427
|
+
this.disabled = false
|
|
413
428
|
}
|
|
414
|
-
})
|
|
429
|
+
})
|
|
415
430
|
|
|
416
431
|
saveButton.addEventListener("click", async function () {
|
|
417
|
-
if (!config.rules) config.rules = {}
|
|
418
|
-
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
419
|
-
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
432
|
+
if (!config.rules) config.rules = {}
|
|
433
|
+
if (!config.rules.js) config.rules.js = { ...defaultConfig.rules.js }
|
|
434
|
+
if (!config.rules.css) config.rules.css = { ...defaultConfig.rules.css }
|
|
420
435
|
|
|
421
436
|
// Validate JS rule if enabled
|
|
422
437
|
if (config.rules.js.enabled) {
|
|
423
|
-
const jsRedirectUrlValue = jsRedirectUrl.value.trim()
|
|
438
|
+
const jsRedirectUrlValue = jsRedirectUrl.value.trim()
|
|
424
439
|
const jsPatternValue = config.rules.js.useCustomPattern
|
|
425
440
|
? jsCustomPatternInput.value.trim()
|
|
426
|
-
: defaultConfig.rules.js.pattern
|
|
441
|
+
: defaultConfig.rules.js.pattern
|
|
427
442
|
|
|
428
443
|
if (!jsRedirectUrlValue) {
|
|
429
|
-
showStatus(
|
|
430
|
-
|
|
444
|
+
showStatus(
|
|
445
|
+
"JavaScript redirect URL is required when JS rule is enabled",
|
|
446
|
+
false,
|
|
447
|
+
)
|
|
448
|
+
return
|
|
431
449
|
}
|
|
432
450
|
|
|
433
|
-
const jsUrlError = validateRedirectUrl(jsRedirectUrlValue)
|
|
451
|
+
const jsUrlError = validateRedirectUrl(jsRedirectUrlValue)
|
|
434
452
|
if (jsUrlError) {
|
|
435
|
-
showStatus("JavaScript rule: " + jsUrlError, false)
|
|
436
|
-
return
|
|
453
|
+
showStatus("JavaScript rule: " + jsUrlError, false)
|
|
454
|
+
return
|
|
437
455
|
}
|
|
438
456
|
|
|
439
|
-
const jsPatternError = validatePattern(jsPatternValue)
|
|
457
|
+
const jsPatternError = validatePattern(jsPatternValue)
|
|
440
458
|
if (jsPatternError) {
|
|
441
|
-
showStatus("JavaScript rule: " + jsPatternError, false)
|
|
442
|
-
return
|
|
459
|
+
showStatus("JavaScript rule: " + jsPatternError, false)
|
|
460
|
+
return
|
|
443
461
|
}
|
|
444
462
|
|
|
445
|
-
config.rules.js.redirectUrl = normalizeUrl(jsRedirectUrlValue)
|
|
446
|
-
config.rules.js.pattern = jsPatternValue
|
|
463
|
+
config.rules.js.redirectUrl = normalizeUrl(jsRedirectUrlValue)
|
|
464
|
+
config.rules.js.pattern = jsPatternValue
|
|
447
465
|
}
|
|
448
466
|
|
|
449
467
|
// Validate CSS rule if enabled
|
|
450
468
|
if (config.rules.css.enabled) {
|
|
451
|
-
const cssRedirectUrlValue = cssRedirectUrl.value.trim()
|
|
469
|
+
const cssRedirectUrlValue = cssRedirectUrl.value.trim()
|
|
452
470
|
const cssPatternValue = config.rules.css.useCustomPattern
|
|
453
471
|
? cssCustomPatternInput.value.trim()
|
|
454
|
-
: defaultConfig.rules.css.pattern
|
|
472
|
+
: defaultConfig.rules.css.pattern
|
|
455
473
|
|
|
456
474
|
if (!config.rules.css.returnBlank && !cssRedirectUrlValue) {
|
|
457
|
-
showStatus(
|
|
458
|
-
|
|
475
|
+
showStatus(
|
|
476
|
+
"CSS redirect URL is required when not returning blank",
|
|
477
|
+
false,
|
|
478
|
+
)
|
|
479
|
+
return
|
|
459
480
|
}
|
|
460
481
|
|
|
461
482
|
if (!config.rules.css.returnBlank) {
|
|
462
|
-
const cssUrlError = validateRedirectUrl(cssRedirectUrlValue)
|
|
483
|
+
const cssUrlError = validateRedirectUrl(cssRedirectUrlValue)
|
|
463
484
|
if (cssUrlError) {
|
|
464
|
-
showStatus("CSS rule: " + cssUrlError, false)
|
|
465
|
-
return
|
|
485
|
+
showStatus("CSS rule: " + cssUrlError, false)
|
|
486
|
+
return
|
|
466
487
|
}
|
|
467
488
|
}
|
|
468
489
|
|
|
469
|
-
const cssPatternError = validatePattern(cssPatternValue)
|
|
490
|
+
const cssPatternError = validatePattern(cssPatternValue)
|
|
470
491
|
if (cssPatternError) {
|
|
471
|
-
showStatus("CSS rule: " + cssPatternError, false)
|
|
472
|
-
return
|
|
492
|
+
showStatus("CSS rule: " + cssPatternError, false)
|
|
493
|
+
return
|
|
473
494
|
}
|
|
474
495
|
|
|
475
|
-
config.rules.css.redirectUrl = normalizeUrl(cssRedirectUrlValue)
|
|
476
|
-
config.rules.css.pattern = cssPatternValue
|
|
496
|
+
config.rules.css.redirectUrl = normalizeUrl(cssRedirectUrlValue)
|
|
497
|
+
config.rules.css.pattern = cssPatternValue
|
|
477
498
|
}
|
|
478
499
|
|
|
479
500
|
try {
|
|
480
|
-
await chrome.storage.sync.set(config)
|
|
501
|
+
await chrome.storage.sync.set(config)
|
|
481
502
|
|
|
482
503
|
chrome.runtime.sendMessage({
|
|
483
504
|
action: "updateConfig",
|
|
484
505
|
config: config,
|
|
485
|
-
})
|
|
506
|
+
})
|
|
486
507
|
|
|
487
|
-
updateUI()
|
|
488
|
-
updatePatternDisplays()
|
|
489
|
-
showStatus("Configuration saved successfully")
|
|
508
|
+
updateUI()
|
|
509
|
+
updatePatternDisplays()
|
|
510
|
+
showStatus("Configuration saved successfully")
|
|
490
511
|
} catch (error) {
|
|
491
|
-
console.error("Error saving config:", error)
|
|
492
|
-
showStatus("Error saving configuration", false)
|
|
512
|
+
console.error("Error saving config:", error)
|
|
513
|
+
showStatus("Error saving configuration", false)
|
|
493
514
|
}
|
|
494
|
-
})
|
|
515
|
+
})
|
|
495
516
|
|
|
496
517
|
// Send initial config to background script
|
|
497
518
|
chrome.runtime.sendMessage({
|
|
498
519
|
action: "updateConfig",
|
|
499
520
|
config: config,
|
|
500
|
-
})
|
|
521
|
+
})
|
|
501
522
|
|
|
502
523
|
// Component Inspector
|
|
503
524
|
function updateInspectorUI() {
|
|
504
525
|
if (inspectorEnabled) {
|
|
505
|
-
inspectorBadge.textContent = "ON"
|
|
506
|
-
inspectorBadge.classList.add("enabled")
|
|
526
|
+
inspectorBadge.textContent = "ON"
|
|
527
|
+
inspectorBadge.classList.add("enabled")
|
|
507
528
|
} else {
|
|
508
|
-
inspectorBadge.textContent = "OFF"
|
|
509
|
-
inspectorBadge.classList.remove("enabled")
|
|
529
|
+
inspectorBadge.textContent = "OFF"
|
|
530
|
+
inspectorBadge.classList.remove("enabled")
|
|
510
531
|
}
|
|
511
532
|
}
|
|
512
533
|
|
|
513
534
|
async function getInspectorState() {
|
|
514
535
|
try {
|
|
515
|
-
const [tab] = await chrome.tabs.query({
|
|
536
|
+
const [tab] = await chrome.tabs.query({
|
|
537
|
+
active: true,
|
|
538
|
+
currentWindow: true,
|
|
539
|
+
})
|
|
516
540
|
if (tab?.id) {
|
|
517
|
-
const response = await chrome.tabs.sendMessage(tab.id, {
|
|
541
|
+
const response = await chrome.tabs.sendMessage(tab.id, {
|
|
542
|
+
action: "getInspectorState",
|
|
543
|
+
})
|
|
518
544
|
if (response) {
|
|
519
|
-
inspectorEnabled = response.enabled
|
|
520
|
-
updateInspectorUI()
|
|
545
|
+
inspectorEnabled = response.enabled
|
|
546
|
+
updateInspectorUI()
|
|
521
547
|
}
|
|
522
548
|
}
|
|
523
549
|
} catch (error) {
|
|
524
|
-
console.log("Could not get inspector state:", error)
|
|
550
|
+
console.log("Could not get inspector state:", error)
|
|
525
551
|
}
|
|
526
552
|
}
|
|
527
553
|
|
|
528
554
|
// Click on inspector card opens DevTools to the GxP Inspector panel
|
|
529
555
|
inspectorCard.addEventListener("click", async function () {
|
|
530
556
|
try {
|
|
531
|
-
const [tab] = await chrome.tabs.query({
|
|
557
|
+
const [tab] = await chrome.tabs.query({
|
|
558
|
+
active: true,
|
|
559
|
+
currentWindow: true,
|
|
560
|
+
})
|
|
532
561
|
if (tab?.id) {
|
|
533
562
|
// Enable the inspector on the page
|
|
534
|
-
const response = await chrome.tabs.sendMessage(tab.id, {
|
|
563
|
+
const response = await chrome.tabs.sendMessage(tab.id, {
|
|
564
|
+
action: "toggleInspector",
|
|
565
|
+
})
|
|
535
566
|
if (response) {
|
|
536
|
-
inspectorEnabled = response.enabled
|
|
537
|
-
updateInspectorUI()
|
|
567
|
+
inspectorEnabled = response.enabled
|
|
568
|
+
updateInspectorUI()
|
|
538
569
|
}
|
|
539
570
|
|
|
540
571
|
// Open DevTools to the GxP Inspector panel
|
|
541
572
|
// Note: chrome.devtools API is only available from devtools pages
|
|
542
573
|
// We'll use a workaround by sending a message to open devtools
|
|
543
|
-
chrome.runtime.sendMessage({ action: "openDevTools", tabId: tab.id })
|
|
574
|
+
chrome.runtime.sendMessage({ action: "openDevTools", tabId: tab.id })
|
|
544
575
|
|
|
545
|
-
showStatus(
|
|
576
|
+
showStatus(
|
|
577
|
+
inspectorEnabled
|
|
578
|
+
? "Inspector enabled - check DevTools"
|
|
579
|
+
: "Inspector disabled",
|
|
580
|
+
)
|
|
546
581
|
}
|
|
547
582
|
} catch (error) {
|
|
548
|
-
showStatus(
|
|
583
|
+
showStatus(
|
|
584
|
+
"Could not open inspector. Make sure you're on a web page.",
|
|
585
|
+
false,
|
|
586
|
+
)
|
|
549
587
|
}
|
|
550
|
-
})
|
|
588
|
+
})
|
|
551
589
|
|
|
552
|
-
getInspectorState()
|
|
553
|
-
})
|
|
590
|
+
getInspectorState()
|
|
591
|
+
})
|