MCPcopy Index your code
hub / github.com/darkreader/darkreader / createNodeAsap

Function createNodeAsap

src/inject/utils/dom.ts:21–70  ·  view source on GitHub ↗
({
    selectNode,
    createNode,
    updateNode,
    selectTarget,
    createTarget,
    isTargetMutation,
}: CreateNodeAsapParams)

Source from the content-addressed store, hash-verified

19}
20
21export function createNodeAsap({
22 selectNode,
23 createNode,
24 updateNode,
25 selectTarget,
26 createTarget,
27 isTargetMutation,
28}: CreateNodeAsapParams): void {
29 const target = selectTarget();
30 if (target) {
31 const prev = selectNode();
32 if (prev) {
33 updateNode(prev);
34 } else {
35 createNode(target);
36 }
37 } else {
38 const observer = new MutationObserver((mutations) => {
39 const mutation = mutations.find(isTargetMutation);
40 if (mutation) {
41 unsubscribe();
42 const target = selectTarget();
43 selectNode() || createNode(target);
44 }
45 });
46
47 const ready = () => {
48 if (document.readyState !== 'complete') {
49 return;
50 }
51
52 unsubscribe();
53 const target = selectTarget() || createTarget();
54 selectNode() || createNode(target);
55 };
56
57 const unsubscribe = () => {
58 document.removeEventListener('readystatechange', ready);
59 observer.disconnect();
60 };
61
62 if (document.readyState === 'complete') {
63 ready();
64 } else {
65 // readystatechange event is not cancellable and does not bubble
66 document.addEventListener('readystatechange', ready);
67 observer.observe(document, {childList: true, subtree: true});
68 }
69 }
70}
71
72export function removeNode(node: Node | null): void {
73 node && node.parentNode && node.parentNode.removeChild(node);

Callers 2

createOrUpdateSVGFilterFunction · 0.90
createOrUpdateStyleFunction · 0.90

Calls 2

unsubscribeFunction · 0.70
readyFunction · 0.70

Tested by

no test coverage detected