(svgMatrix: string, svgReverseMatrix: string)
| 1 | import {createNodeAsap, removeNode} from './utils/dom'; |
| 2 | |
| 3 | export 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 | |
| 60 | export function removeSVGFilter(): void { |
no test coverage detected