MCPcopy Create free account
hub / github.com/darkreader/darkreader / injectProxy

Function injectProxy

src/inject/dynamic-theme/stylesheet-proxy.ts:6–356  ·  view source on GitHub ↗
(enableStyleSheetsProxy: boolean, enableCustomElementRegistryProxy: boolean)

Source from the content-addressed store, hash-verified

4type OverrideFactory<T, P extends keyof T> = (native: T[P] & ((...args: any[]) => any)) => (this: T, ...args: Parameters<typeof native>) => ReturnType<typeof native>;
5
6export 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>>();

Callers 1

injectProxyAndCleanupFunction · 0.90

Calls 13

documentEventListenerFunction · 0.85
overrideFunction · 0.85
reportSheetChangeFunction · 0.85
reportSheetChangeAsyncFunction · 0.85
getCurrentElementValueFunction · 0.85
overridePropertyFunction · 0.85
isDRElementFunction · 0.85
resolveCustomElementFunction · 0.85
getCurrentValueFunction · 0.85
proxyAdoptedSheetsArrayFunction · 0.85
onAdoptedSheetsChangeFunction · 0.70
hasMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…