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

Function createOrUpdateSVGFilter

src/inject/svg-filter.ts:3–58  ·  view source on GitHub ↗
(svgMatrix: string, svgReverseMatrix: string)

Source from the content-addressed store, hash-verified

1import {createNodeAsap, removeNode} from './utils/dom';
2
3export function createOrUpdateSVGFilter(svgMatrix: string, svgReverseMatrix: string): void {
4 createNodeAsap({
5 selectNode: () => document.getElementById('dark-reader-svg')!,
6 createNode: (target) => {
7 const SVG_NS = 'http://www.w3.org/2000/svg';
8 const createMatrixFilter = (id: string, matrix: string) => {
9 const filter = document.createElementNS(SVG_NS, 'filter');
10 filter.id = id;
11 filter.style.colorInterpolationFilters = 'sRGB';
12
13 // Fix displaying dynamic content https://bugs.chromium.org/p/chromium/issues/detail?id=647437
14 filter.setAttribute('x', '0');
15 filter.setAttribute('y', '0');
16 filter.setAttribute('width', '99999');
17 filter.setAttribute('height', '99999');
18
19 filter.appendChild(createColorMatrix(matrix));
20 return filter;
21 };
22
23 const createColorMatrix = (matrix: string) => {
24 const colorMatrix = document.createElementNS(SVG_NS, 'feColorMatrix');
25 colorMatrix.setAttribute('type', 'matrix');
26 colorMatrix.setAttribute('values', matrix);
27 return colorMatrix;
28 };
29
30 const svg = document.createElementNS(SVG_NS, 'svg');
31 svg.id = 'dark-reader-svg';
32 svg.style.height = '0';
33 svg.style.width = '0';
34 svg.appendChild(createMatrixFilter('dark-reader-filter', svgMatrix));
35 svg.appendChild(createMatrixFilter('dark-reader-reverse-filter', svgReverseMatrix));
36 target.appendChild(svg);
37 },
38 updateNode: (existing) => {
39 const existingMatrix = existing.firstChild!.firstChild as SVGFEColorMatrixElement;
40 if (existingMatrix.getAttribute('values') !== svgMatrix) {
41 existingMatrix.setAttribute('values', svgMatrix);
42
43 // Fix not triggering repaint
44 const style = document.getElementById('dark-reader-style')!;
45 const css = style.textContent;
46 style.textContent = '';
47 style.textContent = css;
48 }
49 },
50 selectTarget: () => document.head,
51 createTarget: () => {
52 const head = document.createElement('head');
53 document.documentElement.insertBefore(head, document.documentElement.firstElementChild);
54 return head;
55 },
56 isTargetMutation: (mutation) => mutation.target.nodeName.toLowerCase() === 'head',
57 });
58}
59
60export function removeSVGFilter(): void {

Callers 1

onMessageFunction · 0.90

Calls 2

createNodeAsapFunction · 0.90
createMatrixFilterFunction · 0.85

Tested by

no test coverage detected