(enableStyleSheetsProxy: boolean, enableCustomElementRegistryProxy: boolean)
| 4 | type OverrideFactory<T, P extends keyof T> = (native: T[P] & ((...args: any[]) => any)) => (this: T, ...args: Parameters<typeof native>) => ReturnType<typeof native>; |
| 5 | |
| 6 | export function injectProxy(enableStyleSheetsProxy: boolean, enableCustomElementRegistryProxy: boolean): void { |
| 7 | document.dispatchEvent(new CustomEvent('__darkreader__inlineScriptsAllowed')); |
| 8 | |
| 9 | const cleaners: Array<() => void> = []; |
| 10 | |
| 11 | function cleanUp() { |
| 12 | cleaners.forEach((clean) => clean()); |
| 13 | cleaners.splice(0); |
| 14 | } |
| 15 | |
| 16 | function documentEventListener(type: string, listener: (e: CustomEvent) => void, options?: AddEventListenerOptions) { |
| 17 | document.addEventListener(type, listener as EventListener, options); |
| 18 | cleaners.push(() => document.removeEventListener(type, listener as EventListener)); |
| 19 | } |
| 20 | |
| 21 | function disableConflictingPlugins() { |
| 22 | const disableWPDarkMode = () => { |
| 23 | if ((window as any)?.WPDarkMode?.deactivate) { |
| 24 | (window as any).WPDarkMode.deactivate(); |
| 25 | } |
| 26 | }; |
| 27 | disableWPDarkMode(); |
| 28 | } |
| 29 | |
| 30 | documentEventListener('__darkreader__cleanUp', cleanUp); |
| 31 | documentEventListener('__darkreader__disableConflictingPlugins', disableConflictingPlugins); |
| 32 | |
| 33 | function overrideProperty<T, P extends keyof T>(cls: {prototype: T}, prop: P, overrides: Record<string, OverrideFactory<T, P>>) { |
| 34 | const proto = cls.prototype; |
| 35 | const oldDescriptor = Object.getOwnPropertyDescriptor(proto, prop); |
| 36 | if (!oldDescriptor) { |
| 37 | return; |
| 38 | } |
| 39 | const newDescriptor: PropertyDescriptor = {...oldDescriptor}; |
| 40 | (Object.keys(overrides) as Array<keyof PropertyDescriptor>).forEach((key) => { |
| 41 | const factory = overrides[key]; |
| 42 | newDescriptor[key] = factory(oldDescriptor[key]); |
| 43 | }); |
| 44 | Object.defineProperty(proto, prop, newDescriptor); |
| 45 | cleaners.push(() => Object.defineProperty(proto, prop, oldDescriptor)); |
| 46 | } |
| 47 | |
| 48 | function override<T, P extends keyof T>(cls: {prototype: T}, prop: P, factory: OverrideFactory<T, P>) { |
| 49 | overrideProperty(cls, prop, {value: factory}); |
| 50 | } |
| 51 | |
| 52 | function isDRElement(element?: Element) { |
| 53 | return element?.classList?.contains('darkreader'); |
| 54 | } |
| 55 | |
| 56 | function isDRSheet(sheet: CSSStyleSheet) { |
| 57 | return isDRElement(sheet.ownerNode as Element); |
| 58 | } |
| 59 | |
| 60 | const updateSheetEvent = new CustomEvent('__darkreader__updateSheet'); |
| 61 | const adoptedSheetChangeEvent = new CustomEvent('__darkreader__adoptedStyleSheetChange'); |
| 62 | const shadowDomAttachingEvent = new CustomEvent('__darkreader__shadowDomAttaching', {bubbles: true}); |
| 63 | const adoptedSheetOwners = new WeakMap<CSSStyleSheet, Set<Document | ShadowRoot>>(); |
no test coverage detected
searching dependent graphs…