summaryrefslogtreecommitdiffstats
path: root/remote/test/puppeteer/packages/puppeteer-core/src/common/ScriptInjector.ts
diff options
context:
space:
mode:
Diffstat (limited to 'remote/test/puppeteer/packages/puppeteer-core/src/common/ScriptInjector.ts')
-rw-r--r--remote/test/puppeteer/packages/puppeteer-core/src/common/ScriptInjector.ts49
1 files changed, 49 insertions, 0 deletions
diff --git a/remote/test/puppeteer/packages/puppeteer-core/src/common/ScriptInjector.ts b/remote/test/puppeteer/packages/puppeteer-core/src/common/ScriptInjector.ts
new file mode 100644
index 0000000000..cb0c039530
--- /dev/null
+++ b/remote/test/puppeteer/packages/puppeteer-core/src/common/ScriptInjector.ts
@@ -0,0 +1,49 @@
+import {source as injectedSource} from '../generated/injected.js';
+
+class ScriptInjector {
+ #updated = false;
+ #amendments = new Set<string>();
+
+ // Appends a statement of the form `(PuppeteerUtil) => {...}`.
+ append(statement: string): void {
+ this.#update(() => {
+ this.#amendments.add(statement);
+ });
+ }
+
+ pop(statement: string): void {
+ this.#update(() => {
+ this.#amendments.delete(statement);
+ });
+ }
+
+ inject(inject: (script: string) => void, force = false) {
+ if (this.#updated || force) {
+ inject(this.#get());
+ }
+ this.#updated = false;
+ }
+
+ #update(callback: () => void): void {
+ callback();
+ this.#updated = true;
+ }
+
+ #get(): string {
+ return `(() => {
+ const module = {};
+ ${injectedSource}
+ ${[...this.#amendments]
+ .map(statement => {
+ return `(${statement})(module.exports.default);`;
+ })
+ .join('')}
+ return module.exports.default;
+ })()`;
+ }
+}
+
+/**
+ * @internal
+ */
+export const scriptInjector = new ScriptInjector();