angular/devtools/projects/shell-browser/src/app/inject.ts
Sumit Arora ceb19c044a feat(devtools): renaming shell-chrome (#44952)
Renaming `shell-chrome` to `shell-browser` contains the build that supports both browsers.

PR Close #44952
2022-04-12 18:41:37 +00:00

51 lines
1.6 KiB
TypeScript

/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
const loadScripts = (urls: string[]) => {
return urls
.map((url, idx) => {
return `
const script${idx} = document.constructor.prototype.createElement.call(document, 'script');
script${idx}.src = getScriptName("${url}");
document.documentElement.appendChild(script${idx});
script${idx}.parentNode.removeChild(script${idx});
`;
})
.join('\n');
};
let loaded = false;
export const injectScripts = (urls: string[], cb?: () => void) => {
if (loaded) {
// Not throwing a hard error here, because we don't want to stop the
// execution when folks are not using Trusted Types or when they have
// allowed redeclaration of a security policy.
console.error('Trying to reinject scripts');
}
loaded = true;
urls = urls.map((s) => chrome.runtime.getURL(s));
const script = `
(function () {
let policy = null;
if (window.trustedTypes && window.trustedTypes.createPolicy) {
policy = window.trustedTypes.createPolicy('angular#devtools', {
createScriptURL: url => ${JSON.stringify(urls)}.indexOf(url) >= 0 ? url : null
});
}
const getScriptName = name => policy ? policy.createScriptURL(name) : name;
${loadScripts(urls)}
})();
`;
chrome.devtools.inspectedWindow.eval(script, (_, err) => {
if (err) {
// tslint:disable-next-line:no-console
console.log(err);
}
cb?.();
});
};