mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
732e505018
We keep getting PRs that target single usages of `hasOwnProperty` and we have ~100 of them. These changes aim to address the issue centrally by swapping out all the instances and adding a lint rule against introducing new ones.
82 lines
1.9 KiB
TypeScript
82 lines
1.9 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.dev/license
|
|
*/
|
|
|
|
export class MockScriptElement {
|
|
constructor(public ownerDocument: MockDocument) {}
|
|
|
|
listeners: {
|
|
load?: (event: Event) => void;
|
|
error?: (err: Error) => void;
|
|
} = {};
|
|
|
|
addEventListener(event: 'load' | 'error', handler: Function): void {
|
|
this.listeners[event] = handler as any;
|
|
}
|
|
|
|
removeEventListener(event: 'load' | 'error'): void {
|
|
delete this.listeners[event];
|
|
}
|
|
|
|
remove() {
|
|
this.ownerDocument.removeNode(this);
|
|
}
|
|
|
|
private attrs: Record<string, string> = {};
|
|
|
|
setAttribute(name: string, value: string): void {
|
|
this.attrs[name] = value;
|
|
}
|
|
|
|
getAttribute(name: string): string | null {
|
|
return Object.hasOwn(this.attrs, name) ? this.attrs[name] : null;
|
|
}
|
|
}
|
|
|
|
export class MockDocument {
|
|
mock!: MockScriptElement | null;
|
|
readonly body: any = this;
|
|
|
|
implementation = {
|
|
createHTMLDocument: () => new MockDocument(),
|
|
};
|
|
|
|
createElement(tag: 'script'): HTMLScriptElement {
|
|
return new MockScriptElement(this) as any as HTMLScriptElement;
|
|
}
|
|
|
|
appendChild(node: any): void {
|
|
this.mock = node;
|
|
}
|
|
|
|
removeNode(node: any): void {
|
|
if (this.mock === node) {
|
|
this.mock = null;
|
|
}
|
|
}
|
|
|
|
adoptNode(node: any) {
|
|
node.ownerDocument = this;
|
|
}
|
|
|
|
mockLoad(): void {
|
|
// Mimic behavior described by
|
|
// https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block
|
|
if (this.mock!.ownerDocument === this) {
|
|
this.mock!.listeners.load!(null as any);
|
|
}
|
|
}
|
|
|
|
mockError(err: Error) {
|
|
// Mimic behavior described by
|
|
// https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block
|
|
if (this.mock!.ownerDocument === this) {
|
|
this.mock!.listeners.error!(err);
|
|
}
|
|
}
|
|
}
|