extension-develop 2.0.0 → 2.0.3
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 +230 -0
- package/dist/add-content-script-wrapper.js +1777 -0
- package/dist/add-hmr-accept-code.js +95 -3
- package/dist/build.d.ts +2 -0
- package/dist/cleanup.d.ts +1 -0
- package/dist/deprecated-shadow-root.js +115 -14
- package/dist/dev.d.ts +2 -0
- package/dist/develop-lib/config-types.d.ts +85 -0
- package/dist/develop-lib/extract-from-zip.d.ts +1 -0
- package/dist/develop-lib/find-nearest-package.d.ts +2 -0
- package/dist/develop-lib/generate-extension-types.d.ts +1 -0
- package/dist/develop-lib/generate-zip.d.ts +2 -0
- package/dist/develop-lib/get-extension-config.d.ts +6 -0
- package/dist/develop-lib/get-project-path.d.ts +6 -0
- package/dist/develop-lib/install-dependencies.d.ts +2 -0
- package/dist/develop-lib/messages.d.ts +35 -0
- package/dist/develop-lib/validate-user-dependencies.d.ts +1 -0
- package/dist/ensure-hmr-for-scripts.js +74 -3
- package/dist/extensions/chrome-manager-extension/background.js +1 -1
- package/dist/extensions/chrome-manager-extension/define-initial-tab.js +11 -1
- package/dist/extensions/chrome-manager-extension/images/logo.png +0 -0
- package/dist/extensions/chrome-manager-extension/manifest.json +3 -3
- package/dist/extensions/chrome-manager-extension/pages/welcome.html +3 -6
- package/dist/extensions/chrome-manager-extension/reload-service.js +214 -62
- package/dist/extensions/chromium-based-manager-extension/background.js +1 -1
- package/dist/extensions/chromium-based-manager-extension/define-initial-tab.js +11 -1
- package/dist/extensions/chromium-based-manager-extension/images/logo.png +0 -0
- package/dist/extensions/chromium-based-manager-extension/manifest.json +3 -3
- package/dist/extensions/chromium-based-manager-extension/pages/welcome.html +3 -6
- package/dist/extensions/chromium-based-manager-extension/reload-service.js +185 -28
- package/dist/extensions/edge-manager-extension/background.js +1 -1
- package/dist/extensions/edge-manager-extension/define-initial-tab.js +11 -1
- package/dist/extensions/edge-manager-extension/images/logo.png +0 -0
- package/dist/extensions/edge-manager-extension/manifest.json +3 -3
- package/dist/extensions/edge-manager-extension/pages/welcome.html +3 -6
- package/dist/extensions/edge-manager-extension/reload-service.js +223 -69
- package/dist/extensions/firefox-manager-extension/background.js +40 -12
- package/dist/extensions/firefox-manager-extension/define-initial-tab.js +16 -14
- package/dist/extensions/firefox-manager-extension/images/logo.png +0 -0
- package/dist/extensions/firefox-manager-extension/manifest.json +4 -5
- package/dist/extensions/firefox-manager-extension/pages/welcome.html +3 -6
- package/dist/extensions/firefox-manager-extension/reload-service.js +113 -75
- package/dist/extensions/gecko-based-manager-extension/background.js +1 -1
- package/dist/extensions/gecko-based-manager-extension/define-initial-tab.js +13 -6
- package/dist/extensions/gecko-based-manager-extension/images/logo.png +0 -0
- package/dist/extensions/gecko-based-manager-extension/manifest.json +3 -3
- package/dist/extensions/gecko-based-manager-extension/pages/welcome.html +3 -6
- package/dist/extensions/gecko-based-manager-extension/reload-service.js +54 -26
- package/dist/inject-chromium-client-loader.js +146 -22
- package/dist/inject-firefox-client-loader.js +166 -47
- package/dist/minimum-chromium-file.js +25 -0
- package/dist/minimum-content-file.js +5 -0
- package/dist/minimum-firefox-file.js +17 -0
- package/dist/minimum-script-file.js +5 -0
- package/dist/module.d.ts +8 -95
- package/dist/module.js +10703 -128
- package/dist/preview.d.ts +2 -0
- package/dist/rslib.config.d.ts +3 -0
- package/dist/start.d.ts +2 -0
- package/dist/types.d.ts +11 -0
- package/dist/vitest.config.d.mts +2 -0
- package/dist/webpack/dev-server.d.ts +3 -0
- package/dist/webpack/plugin-browsers/browsers-lib/add-progress-bar.d.ts +1 -0
- package/dist/webpack/plugin-browsers/browsers-lib/constants.d.ts +5 -0
- package/dist/webpack/plugin-browsers/browsers-lib/dynamic-extension-manager.d.ts +35 -0
- package/dist/webpack/plugin-browsers/browsers-lib/html-merge.d.ts +1 -0
- package/dist/webpack/plugin-browsers/browsers-lib/instance-manager.d.ts +71 -0
- package/dist/webpack/plugin-browsers/browsers-lib/messages.d.ts +161 -0
- package/dist/webpack/plugin-browsers/browsers-lib/rdp-wire.d.ts +7 -0
- package/dist/webpack/plugin-browsers/browsers-lib/shared-utils.d.ts +16 -0
- package/dist/webpack/plugin-browsers/browsers-types.d.ts +131 -0
- package/dist/webpack/plugin-browsers/index.d.ts +41 -0
- package/dist/webpack/plugin-browsers/run-chromium/browser-config.d.ts +3 -0
- package/dist/webpack/plugin-browsers/run-chromium/create-profile.d.ts +10 -0
- package/dist/webpack/plugin-browsers/run-chromium/index.d.ts +28 -0
- package/dist/webpack/plugin-browsers/run-chromium/master-preferences.d.ts +161 -0
- package/dist/webpack/plugin-browsers/run-chromium/setup-chrome-inspection/cdp-client.d.ts +29 -0
- package/dist/webpack/plugin-browsers/run-chromium/setup-chrome-inspection/index.d.ts +25 -0
- package/dist/webpack/plugin-browsers/run-firefox/firefox/binary-detector.d.ts +15 -0
- package/dist/webpack/plugin-browsers/run-firefox/firefox/browser-config.d.ts +7 -0
- package/dist/webpack/plugin-browsers/run-firefox/firefox/create-profile.d.ts +13 -0
- package/dist/webpack/plugin-browsers/run-firefox/firefox/master-preferences.d.ts +95 -0
- package/dist/webpack/plugin-browsers/run-firefox/index.d.ts +26 -0
- package/dist/webpack/plugin-browsers/run-firefox/remote-firefox/index.d.ts +13 -0
- package/dist/webpack/plugin-browsers/run-firefox/remote-firefox/message-utils.d.ts +2 -0
- package/dist/webpack/plugin-browsers/run-firefox/remote-firefox/messaging-client.d.ts +42 -0
- package/dist/webpack/plugin-browsers/run-firefox/remote-firefox/setup-firefox-inspection.d.ts +31 -0
- package/dist/webpack/plugin-compatibility/feature-browser-specific-fields.d.ts +9 -0
- package/dist/webpack/plugin-compatibility/feature-polyfill.d.ts +12 -0
- package/dist/webpack/plugin-compatibility/index.d.ts +13 -0
- package/dist/webpack/plugin-compilation/clean-dist.d.ts +8 -0
- package/dist/webpack/plugin-compilation/env.d.ts +9 -0
- package/dist/webpack/plugin-compilation/index.d.ts +12 -0
- package/dist/webpack/plugin-css/common-style-loaders.d.ts +8 -0
- package/dist/webpack/plugin-css/css-in-content-script-loader.d.ts +11 -0
- package/dist/webpack/plugin-css/css-in-html-loader.d.ts +8 -0
- package/dist/webpack/plugin-css/css-tools/less.d.ts +4 -0
- package/dist/webpack/plugin-css/css-tools/postcss.d.ts +3 -0
- package/dist/webpack/plugin-css/css-tools/sass.d.ts +4 -0
- package/dist/webpack/plugin-css/css-tools/stylelint.d.ts +4 -0
- package/dist/webpack/plugin-css/css-tools/tailwind.d.ts +2 -0
- package/dist/webpack/plugin-css/index.d.ts +9 -0
- package/dist/webpack/plugin-css/is-content-script.d.ts +1 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/action.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/background.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/browser_action.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/chrome_url_overrides.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/devtools_page.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/index.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/options_ui.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/page_action.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/sandbox.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/side_panel.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/html-fields/sidebar_action.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/action.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/browser_action.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/browser_action.theme_icons.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/icons.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/index.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/normalize.d.ts +6 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/page_action.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/icons-fields/sidebar_action.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/index.d.ts +19 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/json-fields/declarative_net_request.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/json-fields/index.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/json-fields/storage.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/locales-fields/index.d.ts +1 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/normalize.d.ts +10 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/background.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/content_scripts.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/index.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/service_worker.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/scripts-fields/user_scripts.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/manifest-fields/web-resources-fields/index.d.ts +2 -0
- package/dist/webpack/plugin-extension/data/special-folders/generate-entries.d.ts +4 -0
- package/dist/webpack/plugin-extension/data/special-folders/index.d.ts +12 -0
- package/dist/webpack/plugin-extension/feature-html/__spec__/html-lib/test-utils.d.ts +18 -0
- package/dist/webpack/plugin-extension/feature-html/html-lib/parse-html.d.ts +8 -0
- package/dist/webpack/plugin-extension/feature-html/html-lib/patch-html.d.ts +8 -0
- package/dist/webpack/plugin-extension/feature-html/html-lib/utils.d.ts +18 -0
- package/dist/webpack/plugin-extension/feature-html/index.d.ts +37 -0
- package/dist/webpack/plugin-extension/feature-html/steps/add-assets-to-compilation.d.ts +11 -0
- package/dist/webpack/plugin-extension/feature-html/steps/add-scripts-and-styles-to-compilation.d.ts +10 -0
- package/dist/webpack/plugin-extension/feature-html/steps/add-to-file-dependencies.d.ts +10 -0
- package/dist/webpack/plugin-extension/feature-html/steps/emit-html-file.d.ts +9 -0
- package/dist/webpack/plugin-extension/feature-html/steps/ensure-hmr-for-scripts.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-html/steps/handle-common-errors.d.ts +10 -0
- package/dist/webpack/plugin-extension/feature-html/steps/minimum-script-file.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-html/steps/throw-if-recompile-is-needed.d.ts +13 -0
- package/dist/webpack/plugin-extension/feature-html/steps/update-html-file.d.ts +10 -0
- package/dist/webpack/plugin-extension/feature-icons/index.d.ts +25 -0
- package/dist/webpack/plugin-extension/feature-icons/steps/add-to-file-dependencies.d.ts +9 -0
- package/dist/webpack/plugin-extension/feature-icons/steps/emit-file.d.ts +9 -0
- package/dist/webpack/plugin-extension/feature-json/index.d.ts +18 -0
- package/dist/webpack/plugin-extension/feature-locales/get-locales.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-locales/index.d.ts +13 -0
- package/dist/webpack/plugin-extension/feature-manifest/index.d.ts +23 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/background.d.ts +10 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/chrome_url_overrides.d.ts +8 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/commands.d.ts +16 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/content_scripts.d.ts +7 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/content_security_policy.d.ts +4 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/devtools_page.d.ts +4 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/icons.d.ts +6 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/index.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/omnibox.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/options_page.d.ts +4 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/options_ui.d.ts +8 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/page_action.d.ts +8 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/permissions.d.ts +4 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/sandbox.d.ts +7 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/sidebar_action.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/storage.d.ts +6 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/theme.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/user_scripts.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/common/web_accessible_resources.d.ts +9 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/index.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/background.d.ts +10 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/browser_action.d.ts +12 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/chrome_settings_overrides.d.ts +24 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/index.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/page_action.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/sidebar_action.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv2/theme_experiment.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/action.d.ts +8 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/background.d.ts +10 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/declarative_net_request.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/host_permissions.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/index.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/manifest-overrides/mv3/side_panel.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-manifest/steps/add-dependencies.d.ts +6 -0
- package/dist/webpack/plugin-extension/feature-manifest/steps/check-manifest-files.d.ts +17 -0
- package/dist/webpack/plugin-extension/feature-manifest/steps/emit-manifest.d.ts +7 -0
- package/dist/webpack/plugin-extension/feature-manifest/steps/throw-if-recompile.d.ts +11 -0
- package/dist/webpack/plugin-extension/feature-manifest/steps/update-manifest.d.ts +9 -0
- package/dist/webpack/plugin-extension/feature-scripts/index.d.ts +27 -0
- package/dist/webpack/plugin-extension/feature-scripts/scripts-lib/utils.d.ts +3 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/add-content-script-wrapper.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/add-hmr-accept-code.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/add-public-path-for-main-world.d.ts +11 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/add-public-path-runtime-module.d.ts +4 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/add-scripts.d.ts +9 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/deprecated-shadow-root.d.ts +2 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/javascript-content-script-wrapper.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/preact-content-script-wrapper.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/react-content-script-wrapper.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/svelte-content-script-wrapper.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/typescript-content-script-wrapper.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-scripts/steps/vue-content-script-wrapper.d.ts +1 -0
- package/dist/webpack/plugin-extension/feature-special-folders/copy-public-folder.d.ts +14 -0
- package/dist/webpack/plugin-extension/feature-special-folders/index.d.ts +19 -0
- package/dist/webpack/plugin-extension/feature-special-folders/warn-upon-folder-changes.d.ts +7 -0
- package/dist/webpack/plugin-extension/feature-web-resources/clean-matches.d.ts +7 -0
- package/dist/webpack/plugin-extension/feature-web-resources/index.d.ts +18 -0
- package/dist/webpack/plugin-extension/index.d.ts +10 -0
- package/dist/webpack/plugin-js-frameworks/index.d.ts +13 -0
- package/dist/webpack/plugin-js-frameworks/js-tools/babel.d.ts +16 -0
- package/dist/webpack/plugin-js-frameworks/js-tools/preact.d.ts +3 -0
- package/dist/webpack/plugin-js-frameworks/js-tools/react.d.ts +3 -0
- package/dist/webpack/plugin-js-frameworks/js-tools/svelte.d.ts +3 -0
- package/dist/webpack/plugin-js-frameworks/js-tools/typescript.d.ts +36 -0
- package/dist/webpack/plugin-js-frameworks/js-tools/vue.d.ts +3 -0
- package/dist/webpack/plugin-js-frameworks/load-loader-options.d.ts +1 -0
- package/dist/webpack/plugin-reload/index.d.ts +13 -0
- package/dist/webpack/plugin-reload/reload-lib/messages.d.ts +106 -0
- package/dist/webpack/plugin-reload/reload-types.d.ts +14 -0
- package/dist/webpack/plugin-reload/start-server.d.ts +4 -0
- package/dist/webpack/plugin-reload/steps/create-web-socket-server/index.d.ts +14 -0
- package/dist/webpack/plugin-reload/steps/create-web-socket-server/web-socket-server/broadcast-message.d.ts +2 -0
- package/dist/webpack/plugin-reload/steps/create-web-socket-server/web-socket-server/message-dispatcher.d.ts +2 -0
- package/dist/webpack/plugin-reload/steps/create-web-socket-server/web-socket-server/servers.d.ts +2 -0
- package/dist/webpack/plugin-reload/steps/setup-chromium-reload-client/index.d.ts +3 -0
- package/dist/webpack/plugin-reload/steps/setup-chromium-reload-client/inject-chromium-client-loader.d.ts +9 -0
- package/dist/webpack/plugin-reload/steps/setup-chromium-reload-client/minimum-chromium-file.d.ts +0 -0
- package/dist/webpack/plugin-reload/steps/setup-firefox-reload-client/index.d.ts +3 -0
- package/dist/webpack/plugin-reload/steps/setup-firefox-reload-client/inject-firefox-client-loader.d.ts +9 -0
- package/dist/webpack/plugin-reload/steps/setup-firefox-reload-client/minimum-firefox-file.d.ts +0 -0
- package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/index.d.ts +9 -0
- package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/patch-background.d.ts +15 -0
- package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/patch-csp.d.ts +5 -0
- package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/patch-externally-connectable.d.ts +10 -0
- package/dist/webpack/plugin-reload/steps/setup-reload-strategy/apply-manifest-dev-defaults/patch-web-resources.d.ts +10 -0
- package/dist/webpack/plugin-reload/steps/setup-reload-strategy/generate-manager-extension.d.ts +15 -0
- package/dist/webpack/plugin-reload/steps/setup-reload-strategy/index.d.ts +10 -0
- package/dist/webpack/plugin-reload/steps/setup-reload-strategy/target-web-extension-plugin/index.d.ts +13 -0
- package/dist/webpack/plugin-static-assets/index.d.ts +12 -0
- package/dist/webpack/webpack-config.d.ts +14 -0
- package/dist/webpack/webpack-lib/auto-exit.d.ts +1 -0
- package/dist/webpack/webpack-lib/constants.d.ts +4 -0
- package/dist/webpack/webpack-lib/messages.d.ts +121 -0
- package/dist/webpack/webpack-lib/port-manager.d.ts +27 -0
- package/dist/webpack/webpack-lib/utils.d.ts +23 -0
- package/dist/webpack/webpack-types.d.ts +49 -0
- package/package.json +64 -29
- package/dist/depreacated-shadow-root.js +0 -34
- package/dist/inject-content-css-during-dev.js +0 -10
- package/dist/minimum-chromium-file.mjs +0 -1
- package/dist/minimum-content-file.mjs +0 -1
- package/dist/minimum-firefox-file.mjs +0 -1
- package/dist/resolver-loader.js +0 -1
- package/dist/resolver-module.mjs +0 -1
- package/dist/tailwind.config.js +0 -25
- /package/dist/{minimum-script-file.mjs → webpack/plugin-extension/feature-scripts/steps/minimum-content-file.d.ts} +0 -0
|
@@ -60,7 +60,17 @@ export async function handleFirstRun() {
|
|
|
60
60
|
return
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
// Guard against opening multiple welcome pages
|
|
64
|
+
chrome.tabs.query(
|
|
65
|
+
{url: chrome.runtime.getURL('pages/welcome.html')},
|
|
66
|
+
(tabs) => {
|
|
67
|
+
if (Array.isArray(tabs) && tabs.length > 0) {
|
|
68
|
+
// Already open; do not create another
|
|
69
|
+
return
|
|
70
|
+
}
|
|
71
|
+
chrome.tabs.create({url: 'pages/welcome.html'})
|
|
72
|
+
}
|
|
73
|
+
)
|
|
64
74
|
// Ensure the welcome page shows only once per extension installation
|
|
65
75
|
chrome.storage.local.set({[devExtension.id]: {didRun: true}})
|
|
66
76
|
})
|
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "Extension
|
|
3
|
-
"description": "Extension.js developer tools for
|
|
4
|
-
"version": "1.0",
|
|
2
|
+
"name": "Extension.js DevTools",
|
|
3
|
+
"description": "Extension.js built-in developer tools for browser instance ID __INSTANCE_ID__",
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"manifest_version": 3,
|
|
6
6
|
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAolEJq/DBHxY5dBpOqBRWNCl7vRPBvJPlpEzF19fYFVzzaH44AF6+sKjN3jwIKlsgI82F3TIuwoNFiN1yBu5Unf8SVBE4BTO92P02/ACcGYQxicgCLFUGQKlq4uSrwSPaBYl7FHcYl5SERgxnIGCGnaGMdL2vC7waCj2/U/iKoBF9I1lBH9/aKCSjTd3h2UYo7gg6n5nY/ENbzylDt42T3ATmvnVJfYhSNKA9Dv/zryknfnHYYgBKHtz7pDZwWnYdxs78n2VEKwGj7TgbXuIPDpCkrMnU9PTKpHbXFYARA4H9qYORQmYazfIxUZRnKQNSR+GAOGrb8JK+ijeQdwzDAwIDAQAB",
|
|
7
7
|
"background": {
|
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<title>Welcome!</title>
|
|
5
5
|
<meta charset="UTF-8" />
|
|
6
|
-
<link
|
|
7
|
-
rel="icon"
|
|
8
|
-
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🧩</text></svg>"
|
|
9
|
-
/>
|
|
6
|
+
<link rel="icon" type="image/png" href="../images/logo.png" />
|
|
10
7
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
11
8
|
<link rel="stylesheet" href="./sakura.css" media="screen" />
|
|
12
9
|
<link
|
|
@@ -37,8 +34,8 @@
|
|
|
37
34
|
<a target="_blank" href="https://github.com/cezaraugusto/extension"
|
|
38
35
|
>🧩 Extension.js</a
|
|
39
36
|
>
|
|
40
|
-
is a development
|
|
41
|
-
|
|
37
|
+
is a development toolkit for building cross-browser extensions with
|
|
38
|
+
modern web technologies.
|
|
42
39
|
</p>
|
|
43
40
|
<button id="learnMore">
|
|
44
41
|
🧩 Learn more about developing cross-browser extensions
|
|
@@ -1,44 +1,74 @@
|
|
|
1
1
|
const TEN_SECONDS_MS = 10 * 1000
|
|
2
|
+
const INSTANT_MS = 100
|
|
2
3
|
let webSocket = null
|
|
3
4
|
|
|
5
|
+
// Get instance ID from the service worker context
|
|
6
|
+
const instanceId = '__INSTANCE_ID__'
|
|
7
|
+
|
|
4
8
|
export async function connect() {
|
|
5
9
|
if (webSocket) {
|
|
6
10
|
// If already connected, do nothing
|
|
7
11
|
return
|
|
8
12
|
}
|
|
9
13
|
|
|
10
|
-
|
|
14
|
+
// Get port from the placeholder that will be replaced during build
|
|
15
|
+
const port = '__RELOAD_PORT__'
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
webSocket.onopen = () => {
|
|
18
|
-
console.info(`[Reload Service] Connection opened.`)
|
|
19
|
-
}
|
|
17
|
+
let reconnectAttempts = 0
|
|
18
|
+
const maxReconnectAttempts = 10
|
|
19
|
+
const baseBackoffMs = 250
|
|
20
|
+
const maxBackoffMs = 5000
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
const establish = () => {
|
|
23
|
+
webSocket = new WebSocket(`ws://127.0.0.1:${port}`)
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
webSocket.onerror = (_event) => {
|
|
26
|
+
try {
|
|
27
|
+
webSocket && webSocket.close()
|
|
28
|
+
} catch {}
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
webSocket.onopen = () => {
|
|
32
|
+
reconnectAttempts = 0
|
|
30
33
|
console.info(
|
|
31
|
-
`[
|
|
34
|
+
`[Extension.js] Connection opened. Listening on port ${port} for instance ${instanceId}...`
|
|
32
35
|
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let reloadDebounce
|
|
39
|
+
webSocket.onmessage = async (event) => {
|
|
40
|
+
const message = JSON.parse(event.data)
|
|
41
|
+
|
|
42
|
+
// Only process messages for this instance
|
|
43
|
+
if (message.instanceId && message.instanceId !== instanceId) {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
33
46
|
|
|
34
|
-
|
|
47
|
+
if (message.status === 'serverReady') {
|
|
48
|
+
await requestInitialLoadData()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (message.changedFile) {
|
|
52
|
+
clearTimeout(reloadDebounce)
|
|
53
|
+
reloadDebounce = setTimeout(async () => {
|
|
54
|
+
await hardReloadAllExtensions(message.changedFile)
|
|
55
|
+
}, 200)
|
|
56
|
+
}
|
|
35
57
|
}
|
|
36
|
-
}
|
|
37
58
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
59
|
+
webSocket.onclose = () => {
|
|
60
|
+
webSocket = null
|
|
61
|
+
if (reconnectAttempts >= maxReconnectAttempts) return
|
|
62
|
+
reconnectAttempts++
|
|
63
|
+
const backoff = Math.min(
|
|
64
|
+
maxBackoffMs,
|
|
65
|
+
baseBackoffMs * 2 ** reconnectAttempts
|
|
66
|
+
)
|
|
67
|
+
setTimeout(establish, backoff)
|
|
68
|
+
}
|
|
41
69
|
}
|
|
70
|
+
|
|
71
|
+
establish()
|
|
42
72
|
}
|
|
43
73
|
|
|
44
74
|
export function disconnect() {
|
|
@@ -47,6 +77,33 @@ export function disconnect() {
|
|
|
47
77
|
}
|
|
48
78
|
}
|
|
49
79
|
|
|
80
|
+
async function requestInitialLoadData() {
|
|
81
|
+
const devExtensions = await getDevExtensions()
|
|
82
|
+
|
|
83
|
+
for (const extension of devExtensions) {
|
|
84
|
+
try {
|
|
85
|
+
const response = await chrome.runtime.sendMessage(extension.id, {
|
|
86
|
+
initialLoadData: true
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
if (response) {
|
|
90
|
+
// Send the response back to the server with instance ID
|
|
91
|
+
webSocket.send(
|
|
92
|
+
JSON.stringify({
|
|
93
|
+
status: 'clientReady',
|
|
94
|
+
instanceId: instanceId,
|
|
95
|
+
data: response
|
|
96
|
+
})
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.error(
|
|
101
|
+
`Error sending message to ${extension.id}: ${error.message}`
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
50
107
|
async function getDevExtensions() {
|
|
51
108
|
const allExtensions = await new Promise((resolve) => {
|
|
52
109
|
chrome.management.getAll(resolve)
|
|
@@ -56,24 +113,34 @@ async function getDevExtensions() {
|
|
|
56
113
|
return (
|
|
57
114
|
// Do not include itself
|
|
58
115
|
extension.id !== chrome.runtime.id &&
|
|
59
|
-
//
|
|
60
|
-
extension.id !== '
|
|
116
|
+
// Reload extension
|
|
117
|
+
extension.id !== 'igcijhgmihmjbbahdabahfbpffalcfnn' &&
|
|
61
118
|
// Show only unpackaged extensions
|
|
62
119
|
extension.installType === 'development'
|
|
63
120
|
)
|
|
64
121
|
})
|
|
65
122
|
}
|
|
66
123
|
|
|
67
|
-
async function
|
|
68
|
-
//
|
|
69
|
-
const
|
|
124
|
+
async function hardReloadAllExtensions(changedFile) {
|
|
125
|
+
// For critical files like manifest.json, skip the long delay
|
|
126
|
+
const isCriticalFile =
|
|
127
|
+
changedFile === 'manifest.json' ||
|
|
128
|
+
changedFile === 'service_worker' ||
|
|
129
|
+
changedFile === 'declarative_net_request'
|
|
130
|
+
|
|
131
|
+
// Check if the external extension is ready with optimized timing
|
|
132
|
+
const isExtensionReady = await checkExtensionReadiness(isCriticalFile)
|
|
70
133
|
|
|
71
134
|
if (isExtensionReady) {
|
|
72
135
|
const devExtensions = await getDevExtensions()
|
|
73
|
-
const reloadAll = devExtensions.map((extension) => {
|
|
136
|
+
const reloadAll = devExtensions.map(async (extension) => {
|
|
137
|
+
await hardReloadExtension(extension.id)
|
|
138
|
+
|
|
74
139
|
chrome.runtime.sendMessage(extension.id, {changedFile}, (response) => {
|
|
75
140
|
if (response) {
|
|
76
|
-
console.info(
|
|
141
|
+
console.info(
|
|
142
|
+
`[Extension.js] Extension reloaded and ready for instance ${instanceId}.`
|
|
143
|
+
)
|
|
77
144
|
}
|
|
78
145
|
})
|
|
79
146
|
|
|
@@ -82,51 +149,22 @@ async function messageAllExtensions(changedFile) {
|
|
|
82
149
|
|
|
83
150
|
await Promise.all(reloadAll)
|
|
84
151
|
} else {
|
|
85
|
-
console.info(
|
|
152
|
+
console.info(
|
|
153
|
+
`[Extension.js] External extension is not ready for instance ${instanceId}.`
|
|
154
|
+
)
|
|
86
155
|
}
|
|
87
156
|
}
|
|
88
157
|
|
|
89
|
-
async function
|
|
90
|
-
|
|
158
|
+
async function checkExtensionReadiness(isCriticalFile = false) {
|
|
159
|
+
return new Promise((resolve) => {
|
|
160
|
+
// For critical files like manifest.json, use minimal delay
|
|
161
|
+
// For regular files, use longer delay to ensure stability
|
|
162
|
+
const delay = isCriticalFile ? INSTANT_MS : TEN_SECONDS_MS
|
|
91
163
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
extension.id,
|
|
96
|
-
{initialLoadData: true},
|
|
97
|
-
(response) => {
|
|
98
|
-
if (chrome.runtime.lastError) {
|
|
99
|
-
console.error(
|
|
100
|
-
`Error sending message to ${extension.id}: ${chrome.runtime.lastError.message}`
|
|
101
|
-
)
|
|
102
|
-
resolve(null)
|
|
103
|
-
} else {
|
|
104
|
-
resolve(response)
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
)
|
|
108
|
-
})
|
|
164
|
+
setTimeout(() => {
|
|
165
|
+
resolve(true)
|
|
166
|
+
}, delay)
|
|
109
167
|
})
|
|
110
|
-
|
|
111
|
-
const responses = await Promise.all(messagePromises)
|
|
112
|
-
|
|
113
|
-
// We received the info from the use extension.
|
|
114
|
-
// All good, client is ready. Inform the server.
|
|
115
|
-
if (webSocket && webSocket.readyState === WebSocket.OPEN) {
|
|
116
|
-
const message = JSON.stringify({
|
|
117
|
-
status: 'clientReady',
|
|
118
|
-
data: responses[0]
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
webSocket.send(message)
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
async function checkExtensionReadiness() {
|
|
126
|
-
// Delay for 1 second
|
|
127
|
-
await delay(1000)
|
|
128
|
-
// Assume the extension is ready
|
|
129
|
-
return true
|
|
130
168
|
}
|
|
131
169
|
|
|
132
170
|
async function delay(ms) {
|
|
@@ -137,9 +175,125 @@ export function keepAlive() {
|
|
|
137
175
|
const keepAliveIntervalId = setInterval(() => {
|
|
138
176
|
if (webSocket) {
|
|
139
177
|
webSocket.send(JSON.stringify({status: 'ping'}))
|
|
140
|
-
console.info('[
|
|
178
|
+
console.info('[Extension.js] Listening for changes...')
|
|
141
179
|
} else {
|
|
142
180
|
clearInterval(keepAliveIntervalId)
|
|
143
181
|
}
|
|
144
182
|
}, TEN_SECONDS_MS)
|
|
145
183
|
}
|
|
184
|
+
|
|
185
|
+
// Smart reload strategy: Try standard method first, fallback to CDP if needed
|
|
186
|
+
async function hardReloadExtension(extensionId) {
|
|
187
|
+
try {
|
|
188
|
+
// Try the standard enable/disable reload first (feels natural)
|
|
189
|
+
await chrome.management.setEnabled(extensionId, false)
|
|
190
|
+
await chrome.management.setEnabled(extensionId, true)
|
|
191
|
+
|
|
192
|
+
// Verify it worked with a simple health check
|
|
193
|
+
const isHealthy = await verifyExtensionHealth(extensionId)
|
|
194
|
+
if (isHealthy) {
|
|
195
|
+
console.info(
|
|
196
|
+
`[Extension.js] Standard reload successful for ${extensionId}`
|
|
197
|
+
)
|
|
198
|
+
return true
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// If we get here, the reload "succeeded" but extension isn't healthy
|
|
202
|
+
throw new Error('Extension reloaded but not responding')
|
|
203
|
+
} catch (error) {
|
|
204
|
+
console.warn(
|
|
205
|
+
`[Extension.js] Standard reload failed for ${extensionId}, trying CDP fallback: ${error.message}`
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
// Only use CDP when the natural approach fails
|
|
209
|
+
return await attemptCDPFallback(extensionId)
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// CDP fallback for when standard reload fails
|
|
214
|
+
async function attemptCDPFallback(extensionId) {
|
|
215
|
+
try {
|
|
216
|
+
// Get extension info to find its source path
|
|
217
|
+
const extensionInfo = await new Promise((resolve) => {
|
|
218
|
+
chrome.management.get(extensionId, resolve)
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
if (!extensionInfo || !extensionInfo.path) {
|
|
222
|
+
console.warn(
|
|
223
|
+
`[Extension.js] No path info for ${extensionId}, CDP fallback not possible`
|
|
224
|
+
)
|
|
225
|
+
return false
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Use CDP client directly for seamless fallback
|
|
229
|
+
const cdpClient = await getCDPClient()
|
|
230
|
+
if (!cdpClient) {
|
|
231
|
+
console.warn(`[Extension.js] CDP client not available for ${extensionId}`)
|
|
232
|
+
return false
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Use CDP to force reload the extension
|
|
236
|
+
const success = await cdpClient.forceReloadExtension(extensionId)
|
|
237
|
+
if (success) {
|
|
238
|
+
console.info(`[Extension.js] CDP fallback successful for ${extensionId}`)
|
|
239
|
+
return true
|
|
240
|
+
} else {
|
|
241
|
+
console.warn(`[Extension.js] CDP fallback failed for ${extensionId}`)
|
|
242
|
+
return false
|
|
243
|
+
}
|
|
244
|
+
} catch (cdpError) {
|
|
245
|
+
console.error(
|
|
246
|
+
`[Extension.js] CDP fallback also failed for ${extensionId}: ${cdpError.message}`
|
|
247
|
+
)
|
|
248
|
+
return false
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Get CDP client instance
|
|
253
|
+
// This will be injected by the build process
|
|
254
|
+
async function getCDPClient() {
|
|
255
|
+
try {
|
|
256
|
+
// The CDP client will be available globally when injected
|
|
257
|
+
if (typeof window !== 'undefined' && window.cdpClient) {
|
|
258
|
+
return window.cdpClient
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Fallback for service worker context
|
|
262
|
+
if (typeof globalThis !== 'undefined' && globalThis.cdpClient) {
|
|
263
|
+
return globalThis.cdpClient
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
console.warn(`[Extension.js] CDP client not found in global scope`)
|
|
267
|
+
return null
|
|
268
|
+
} catch (error) {
|
|
269
|
+
console.warn(`[Extension.js] Failed to get CDP client: ${error.message}`)
|
|
270
|
+
return null
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Simple health check to verify extension is responsive
|
|
275
|
+
async function verifyExtensionHealth(extensionId) {
|
|
276
|
+
try {
|
|
277
|
+
// Simple ping to see if extension responds
|
|
278
|
+
await new Promise((resolve, reject) => {
|
|
279
|
+
const timeout = setTimeout(() => {
|
|
280
|
+
reject(new Error('Health check timeout'))
|
|
281
|
+
}, 2000)
|
|
282
|
+
|
|
283
|
+
chrome.runtime.sendMessage(extensionId, {type: 'PING'}, (response) => {
|
|
284
|
+
clearTimeout(timeout)
|
|
285
|
+
if (chrome.runtime.lastError) {
|
|
286
|
+
reject(new Error(chrome.runtime.lastError.message))
|
|
287
|
+
} else {
|
|
288
|
+
resolve(response)
|
|
289
|
+
}
|
|
290
|
+
})
|
|
291
|
+
})
|
|
292
|
+
return true
|
|
293
|
+
} catch (error) {
|
|
294
|
+
console.warn(
|
|
295
|
+
`[Extension.js] Health check failed for ${extensionId}: ${error.message}`
|
|
296
|
+
)
|
|
297
|
+
return false
|
|
298
|
+
}
|
|
299
|
+
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
import {connect, disconnect} from './reload-service.js'
|
|
1
|
+
// Raw background: rely on global-scope functions provided by included scripts
|
|
3
2
|
|
|
4
3
|
function bgGreen(str) {
|
|
5
|
-
return `background:
|
|
4
|
+
return `background: transparent; color: #0971fe; ${str}`
|
|
6
5
|
}
|
|
7
6
|
|
|
8
7
|
async function handleTabOnExtensionLoad() {
|
|
@@ -39,19 +38,48 @@ MIT (c) ${new Date().getFullYear()} - Cezar Augusto and the Extension.js Authors
|
|
|
39
38
|
try {
|
|
40
39
|
await handleFirstRun()
|
|
41
40
|
} catch (error) {
|
|
42
|
-
console.error(
|
|
41
|
+
console.error(
|
|
42
|
+
'[Extension.js] Error handling tabs on extension load:',
|
|
43
|
+
error
|
|
44
|
+
)
|
|
43
45
|
}
|
|
46
|
+
try {
|
|
47
|
+
const [initialTab] = await browser.tabs.query({
|
|
48
|
+
active: true,
|
|
49
|
+
currentWindow: true
|
|
50
|
+
})
|
|
51
|
+
if (initialTab) {
|
|
52
|
+
await createFirefoxAddonsTab(initialTab, 'about:blank')
|
|
53
|
+
}
|
|
54
|
+
} catch {}
|
|
44
55
|
}
|
|
45
56
|
|
|
57
|
+
// Run on install and on startup to ensure welcome/connection behavior is reliable
|
|
46
58
|
browser.runtime.onInstalled.addListener(async () => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
59
|
+
try {
|
|
60
|
+
await handleFirstRun()
|
|
61
|
+
} catch {}
|
|
62
|
+
try {
|
|
63
|
+
await handleTabOnExtensionLoad()
|
|
64
|
+
} catch {}
|
|
65
|
+
try {
|
|
66
|
+
await connect()
|
|
67
|
+
} catch {}
|
|
68
|
+
})
|
|
50
69
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
70
|
+
browser.runtime.onStartup.addListener(async () => {
|
|
71
|
+
try {
|
|
72
|
+
await handleFirstRun()
|
|
73
|
+
} catch {}
|
|
74
|
+
try {
|
|
75
|
+
await handleTabOnExtensionLoad()
|
|
76
|
+
} catch {}
|
|
77
|
+
try {
|
|
54
78
|
await connect()
|
|
55
|
-
|
|
56
|
-
}
|
|
79
|
+
} catch {}
|
|
57
80
|
})
|
|
81
|
+
|
|
82
|
+
// Attempt immediate connection for resilience
|
|
83
|
+
try {
|
|
84
|
+
connect()
|
|
85
|
+
} catch {}
|
|
@@ -4,24 +4,22 @@ async function getDevExtension() {
|
|
|
4
4
|
return allExtensions.filter((extension) => {
|
|
5
5
|
return (
|
|
6
6
|
// Reload extension
|
|
7
|
-
extension.name !== 'Extension
|
|
8
|
-
// Show only unpackaged extensions
|
|
9
|
-
extension.installType === 'development'
|
|
7
|
+
extension.name !== 'Extension.js DevTools' &&
|
|
8
|
+
// Show only unpackaged extensions (Firefox reports "temporary")
|
|
9
|
+
(extension.installType === 'development' ||
|
|
10
|
+
extension.installType === 'temporary')
|
|
10
11
|
)
|
|
11
12
|
})[0]
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
// Create a new tab and set it to background.
|
|
15
|
-
|
|
16
|
+
async function createFirefoxAddonsTab(initialTab, url) {
|
|
16
17
|
try {
|
|
17
|
-
//
|
|
18
|
-
const
|
|
19
|
-
|
|
18
|
+
// If a tab with the desired URL already exists, do nothing
|
|
19
|
+
const existing = await browser.tabs.query({url})
|
|
20
|
+
if (existing && existing.length > 0) return
|
|
20
21
|
|
|
21
|
-
//
|
|
22
|
-
if (addonsTabExist) return
|
|
23
|
-
|
|
24
|
-
// Create an inactive about:blank tab
|
|
22
|
+
// Create an inactive tab with the requested URL
|
|
25
23
|
const addonsTab = await browser.tabs.create({url, active: false})
|
|
26
24
|
|
|
27
25
|
// Get the initial page tab and move the new addons tab to the first position.
|
|
@@ -36,7 +34,7 @@ export async function createFirefoxAddonsTab(initialTab, url) {
|
|
|
36
34
|
}
|
|
37
35
|
|
|
38
36
|
// Function to handle first run logic
|
|
39
|
-
|
|
37
|
+
async function handleFirstRun() {
|
|
40
38
|
try {
|
|
41
39
|
const devExtension = await getDevExtension()
|
|
42
40
|
|
|
@@ -51,8 +49,12 @@ export async function handleFirstRun() {
|
|
|
51
49
|
return
|
|
52
50
|
}
|
|
53
51
|
|
|
54
|
-
// Open the welcome page
|
|
55
|
-
|
|
52
|
+
// Open the welcome page only if not already open
|
|
53
|
+
const welcomeUrl = browser.runtime.getURL('./pages/welcome.html')
|
|
54
|
+
const existingWelcome = await browser.tabs.query({url: welcomeUrl})
|
|
55
|
+
if (!existingWelcome || existingWelcome.length === 0) {
|
|
56
|
+
await browser.tabs.create({url: './pages/welcome.html'})
|
|
57
|
+
}
|
|
56
58
|
|
|
57
59
|
// Ensure the welcome page shows only once per extension installation
|
|
58
60
|
await browser.storage.local.set({[devExtension.id]: {didRun: true}})
|
|
Binary file
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "Extension
|
|
3
|
-
"description": "Extension.js developer tools for
|
|
4
|
-
"version": "1.0",
|
|
2
|
+
"name": "Extension.js DevTools",
|
|
3
|
+
"description": "Extension.js built-in developer tools for browser instance ID __INSTANCE_ID__",
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"manifest_version": 2,
|
|
6
6
|
"background": {
|
|
7
|
-
"scripts": ["background.js"]
|
|
8
|
-
"type": "module"
|
|
7
|
+
"scripts": ["define-initial-tab.js", "reload-service.js", "background.js"]
|
|
9
8
|
},
|
|
10
9
|
"icons": {
|
|
11
10
|
"16": "images/logo.png",
|
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<title>Welcome!</title>
|
|
5
5
|
<meta charset="UTF-8" />
|
|
6
|
-
<link
|
|
7
|
-
rel="icon"
|
|
8
|
-
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🧩</text></svg>"
|
|
9
|
-
/>
|
|
6
|
+
<link rel="icon" type="image/png" href="../images/logo.png" />
|
|
10
7
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
11
8
|
<link rel="stylesheet" href="./sakura.css" media="screen" />
|
|
12
9
|
<link
|
|
@@ -37,8 +34,8 @@
|
|
|
37
34
|
<a target="_blank" href="https://github.com/cezaraugusto/extension"
|
|
38
35
|
>🧩 Extension.js</a
|
|
39
36
|
>
|
|
40
|
-
is a development
|
|
41
|
-
|
|
37
|
+
is a development toolkit for building cross-browser extensions with
|
|
38
|
+
modern web technologies.
|
|
42
39
|
</p>
|
|
43
40
|
<button id="learnMore">
|
|
44
41
|
🧩 Learn more about developing cross-browser extensions
|