diff --git a/angular.json b/angular.json index 644b78c934e..dbfdb662b79 100644 --- a/angular.json +++ b/angular.json @@ -29,12 +29,10 @@ }, "configurations": { "production": { - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], + "fileReplacements": [{ + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + }], "optimization": true, "outputHashing": "all", "sourceMap": false, @@ -43,8 +41,7 @@ "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, - "budgets": [ - { + "budgets": [{ "type": "initial", "maximumWarning": "2mb", "maximumError": "5mb" @@ -133,19 +130,18 @@ "projects/shell-chrome/src/favicon.ico", "projects/shell-chrome/src/assets", "projects/shell-chrome/src/manifest.json", - "projects/shell-chrome/src/devtools.html" + "projects/shell-chrome/src/devtools.html", + "projects/shell-chrome/src/popups", ], "styles": ["projects/shell-chrome/src/styles.scss"], "scripts": [] }, "configurations": { "production": { - "fileReplacements": [ - { - "replace": "projects/shell-chrome/src/environments/environment.ts", - "with": "projects/shell-chrome/src/environments/environment.prod.ts" - } - ], + "fileReplacements": [{ + "replace": "projects/shell-chrome/src/environments/environment.ts", + "with": "projects/shell-chrome/src/environments/environment.prod.ts" + }], "optimization": true, "outputHashing": "none", "sourceMap": false, @@ -154,13 +150,11 @@ "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" - } - ] + "budgets": [{ + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }] } } }, diff --git a/projects/shell-chrome/shell-chrome-webpack.config.js b/projects/shell-chrome/shell-chrome-webpack.config.js index 16456f22be4..0cb9d8a6acc 100644 --- a/projects/shell-chrome/shell-chrome-webpack.config.js +++ b/projects/shell-chrome/shell-chrome-webpack.config.js @@ -1,6 +1,7 @@ module.exports = { entry: { 'content-script': 'projects/shell-chrome/src/app/content-script.ts', + 'ng-validate': 'projects/shell-chrome/src/app/ng-validate.ts', background: 'projects/shell-chrome/src/app/background.ts', backend: 'projects/shell-chrome/src/app/backend.ts', devtools: 'projects/shell-chrome/src/devtools.ts', diff --git a/projects/shell-chrome/src/app/background.ts b/projects/shell-chrome/src/app/background.ts index 0d5af5dd0cb..571395be8b0 100644 --- a/projects/shell-chrome/src/app/background.ts +++ b/projects/shell-chrome/src/app/background.ts @@ -42,7 +42,6 @@ const isNumeric = (str: string): boolean => { const installContentScript = (tabId: number) => { console.log('Installing the content-script'); chrome.tabs.executeScript(tabId, { file: '/content-script.js' }, () => {}); - chrome.tabs.executeScript(tabId, { file: '/runtime.js' }, () => {}); }; const doublePipe = (devtoolsPort: chrome.runtime.Port, contentScriptPort: chrome.runtime.Port, tab: string) => { @@ -69,3 +68,18 @@ const doublePipe = (devtoolsPort: chrome.runtime.Port, contentScriptPort: chrome devtoolsPort.onDisconnect.addListener(shutdown.bind(null, 'devtools')); contentScriptPort.onDisconnect.addListener(shutdown.bind(null, 'content-script')); }; + +chrome.runtime.onMessage.addListener((req, sender) => { + if (sender.tab && req.isSupportedAngularVersion) { + chrome.browserAction.setIcon({ + tabId: sender.tab.id, + path: { + 16: `assets/favicon.ico`, + }, + }); + chrome.browserAction.setPopup({ + tabId: sender.tab.id, + popup: req.isDebugMode ? `popups/enabled.html` : `popups/production.html`, + }); + } +}); diff --git a/projects/shell-chrome/src/app/ng-validate.ts b/projects/shell-chrome/src/app/ng-validate.ts new file mode 100644 index 00000000000..1b093a9c5ea --- /dev/null +++ b/projects/shell-chrome/src/app/ng-validate.ts @@ -0,0 +1,33 @@ +window.addEventListener('message', (event: MessageEvent) => { + if (event.source === window && event.data) { + chrome.runtime.sendMessage(event.data); + } +}); + +function detectAngular(win: Window) { + const isDebugMode = Boolean((win as any).ng); + const ngVersionElement = document.querySelector('[ng-version]'); + const isSupportedAngularVersion = ngVersionElement + ? +ngVersionElement.getAttribute('ng-version').split('.')[0] >= 9 + : false; + + win.postMessage( + { + isDebugMode, + isSupportedAngularVersion, + }, + '*' + ); +} + +function installScript(fn: string) { + const source = `;(${fn})(window)`; + const script = document.createElement('script'); + script.textContent = source; + document.documentElement.appendChild(script); + script.parentNode.removeChild(script); +} + +if (document instanceof HTMLDocument) { + installScript(detectAngular.toString()); +} diff --git a/projects/shell-chrome/src/assets/check.png b/projects/shell-chrome/src/assets/check.png new file mode 100644 index 00000000000..d9c1d887f03 Binary files /dev/null and b/projects/shell-chrome/src/assets/check.png differ diff --git a/projects/shell-chrome/src/assets/cross.png b/projects/shell-chrome/src/assets/cross.png new file mode 100644 index 00000000000..d0a13cdbcb7 Binary files /dev/null and b/projects/shell-chrome/src/assets/cross.png differ diff --git a/projects/shell-chrome/src/assets/favicon.ico b/projects/shell-chrome/src/assets/favicon.ico new file mode 100644 index 00000000000..cebb174068b Binary files /dev/null and b/projects/shell-chrome/src/assets/favicon.ico differ diff --git a/projects/shell-chrome/src/assets/gear.png b/projects/shell-chrome/src/assets/gear.png new file mode 100644 index 00000000000..9aea887804b Binary files /dev/null and b/projects/shell-chrome/src/assets/gear.png differ diff --git a/projects/shell-chrome/src/manifest.json b/projects/shell-chrome/src/manifest.json index b16f44770b0..7e7b7c1934e 100644 --- a/projects/shell-chrome/src/manifest.json +++ b/projects/shell-chrome/src/manifest.json @@ -15,7 +15,7 @@ }, "browser_action": { - "default_popup": "popup.html" + "default_popup": "popups/disabled.html" }, "devtools_page": "devtools.html", @@ -27,5 +27,18 @@ "persistent": false }, - "permissions": ["tabs", "http://*/*", "https://*/*", "file:///*"] + "permissions": ["activeTab", "http://*/*", "https://*/*", "file:///*"], + + "content_scripts": [ + { + "matches": [""], + "js": ["runtime.js"], + "run_at": "document_start" + }, + { + "matches": [""], + "js": ["ng-validate.js"], + "run_at": "document_idle" + } + ] } diff --git a/projects/shell-chrome/src/popups/disabled.html b/projects/shell-chrome/src/popups/disabled.html new file mode 100644 index 00000000000..dddd6d4980a --- /dev/null +++ b/projects/shell-chrome/src/popups/disabled.html @@ -0,0 +1,41 @@ + + + + + + + + + diff --git a/projects/shell-chrome/src/popups/enabled.html b/projects/shell-chrome/src/popups/enabled.html new file mode 100644 index 00000000000..990c65a806d --- /dev/null +++ b/projects/shell-chrome/src/popups/enabled.html @@ -0,0 +1,44 @@ + + + + + + + + + + + diff --git a/projects/shell-chrome/src/popups/production.html b/projects/shell-chrome/src/popups/production.html new file mode 100644 index 00000000000..38aa047c738 --- /dev/null +++ b/projects/shell-chrome/src/popups/production.html @@ -0,0 +1,44 @@ + + + + + + + + + + + diff --git a/projects/shell-chrome/tsconfig.app.json b/projects/shell-chrome/tsconfig.app.json index bfc123f7d0c..3b2fbc5b7e5 100644 --- a/projects/shell-chrome/tsconfig.app.json +++ b/projects/shell-chrome/tsconfig.app.json @@ -10,7 +10,8 @@ "src/polyfills.ts", "src/app/backend.ts", "src/app/background.ts", - "src/app/content-script.ts" + "src/app/content-script.ts", + "src/app/ng-validate.ts", ], "include": ["src/**/*.d.ts"] }