From 9408bb79bfad3648997bbc647dae298518a35390 Mon Sep 17 00:00:00 2001 From: "Mingde (Matthew) Zeng" Date: Fri, 21 Feb 2020 00:52:02 -0500 Subject: [PATCH] Apply ^M dos2unix conversion --- core/js/dark_mode.js | 5454 +++++++++++++++++++++--------------------- 1 file changed, 2727 insertions(+), 2727 deletions(-) diff --git a/core/js/dark_mode.js b/core/js/dark_mode.js index c88913c..65a4a9d 100644 --- a/core/js/dark_mode.js +++ b/core/js/dark_mode.js @@ -18,2789 +18,2789 @@ (global = global || self, factory(global.DarkReader = {})); }(this, function (exports) { 'use strict'; - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. All rights reserved. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use - this file except in compliance with the License. You may obtain a copy of the - License at http://www.apache.org/licenses/LICENSE-2.0 - - THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED - WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, - MERCHANTABLITY OR NON-INFRINGEMENT. - - See the Apache Version 2.0 License for specific language governing permissions - and limitations under the License. - ***************************************************************************** */ - - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - function __awaiter(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - } - - function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __awaiter(thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); } - if (!window.chrome) { - window.chrome = {}; - } - if (!window.chrome.runtime) { - window.chrome.runtime = {}; - } - var throwCORSError = function () { - throw new Error('Access to some of your resources was blocked by cross-origin policy'); - }; - if (window.chrome.runtime.sendMessage) { - var nativeSendMessage_1 = window.chrome.runtime.sendMessage; - window.chrome.runtime.sendMessage = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - if (args[0] && args[0].type === 'fetch') { - throwCORSError(); - } - nativeSendMessage_1.apply(window.chrome.runtime, args); - }; - } - else { - window.chrome.runtime.sendMessage = throwCORSError; - } - if (!window.chrome.runtime.onMessage) { - window.chrome.runtime.onMessage = { - addListener: Function.prototype, - }; + function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } } - var ThemeEngines = { - cssFilter: 'cssFilter', - svgFilter: 'svgFilter', - staticTheme: 'staticTheme', - dynamicTheme: 'dynamicTheme', + if (!window.chrome) { + window.chrome = {}; + } + if (!window.chrome.runtime) { + window.chrome.runtime = {}; + } + var throwCORSError = function () { + throw new Error('Access to some of your resources was blocked by cross-origin policy'); + }; + if (window.chrome.runtime.sendMessage) { + var nativeSendMessage_1 = window.chrome.runtime.sendMessage; + window.chrome.runtime.sendMessage = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (args[0] && args[0].type === 'fetch') { + throwCORSError(); + } + nativeSendMessage_1.apply(window.chrome.runtime, args); + }; + } + else { + window.chrome.runtime.sendMessage = throwCORSError; + } + if (!window.chrome.runtime.onMessage) { + window.chrome.runtime.onMessage = { + addListener: Function.prototype, + }; + } + + var ThemeEngines = { + cssFilter: 'cssFilter', + svgFilter: 'svgFilter', + staticTheme: 'staticTheme', + dynamicTheme: 'dynamicTheme', }; - function parseURL(url) { - var a = document.createElement('a'); - a.href = url; - return a; - } - function getAbsoluteURL($base, $relative) { - if ($relative.match(/^.*?\/\//) || $relative.match(/^data\:/)) { - if ($relative.startsWith('//')) { - return "" + location.protocol + $relative; - } - return $relative; - } - var b = parseURL($base); - if ($relative.startsWith('/')) { - var u_1 = parseURL(b.protocol + "//" + b.host + $relative); - return u_1.href; - } - var pathParts = b.pathname.split('/').concat($relative.split('/')).filter(function (p) { return p; }); - var backwardIndex; - while ((backwardIndex = pathParts.indexOf('..')) > 0) { - pathParts.splice(backwardIndex - 1, 2); - } - var u = parseURL(b.protocol + "//" + b.host + "/" + pathParts.join('/')); - return u.href; + function parseURL(url) { + var a = document.createElement('a'); + a.href = url; + return a; + } + function getAbsoluteURL($base, $relative) { + if ($relative.match(/^.*?\/\//) || $relative.match(/^data\:/)) { + if ($relative.startsWith('//')) { + return "" + location.protocol + $relative; + } + return $relative; + } + var b = parseURL($base); + if ($relative.startsWith('/')) { + var u_1 = parseURL(b.protocol + "//" + b.host + $relative); + return u_1.href; + } + var pathParts = b.pathname.split('/').concat($relative.split('/')).filter(function (p) { return p; }); + var backwardIndex; + while ((backwardIndex = pathParts.indexOf('..')) > 0) { + pathParts.splice(backwardIndex - 1, 2); + } + var u = parseURL(b.protocol + "//" + b.host + "/" + pathParts.join('/')); + return u.href; } - function logInfo() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - } - function logWarn() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } + function logInfo() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + } + function logWarn() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } } - function iterateCSSRules(rules, iterate) { - Array.from(rules) - .forEach(function (rule) { - if (rule instanceof CSSMediaRule) { - var media = Array.from(rule.media); - if (media.includes('screen') || media.includes('all') || !(media.includes('print') || media.includes('speech'))) { - iterateCSSRules(rule.cssRules, iterate); - } - } - else if (rule instanceof CSSStyleRule) { - iterate(rule); - } - else if (rule instanceof CSSImportRule) { - try { - iterateCSSRules(rule.styleSheet.cssRules, iterate); - } - catch (err) { - logWarn(err); - } - } - else { - logWarn("CSSRule type not supported", rule); - } - }); - } - function iterateCSSDeclarations(style, iterate) { - Array.from(style).forEach(function (property) { - var value = style.getPropertyValue(property).trim(); - if (!value) { - return; - } - iterate(property, value); - }); - } - function isCSSVariable(property) { - return property.startsWith('--') && !property.startsWith('--darkreader'); - } - function getCSSVariables(rules) { - var variables = new Map(); - rules && iterateCSSRules(rules, function (rule) { - rule.style && iterateCSSDeclarations(rule.style, function (property, value) { - if (isCSSVariable(property)) { - variables.set(property, value); - } - }); - }); - return variables; - } - function getElementCSSVariables(element) { - var variables = new Map(); - iterateCSSDeclarations(element.style, function (property, value) { - if (isCSSVariable(property)) { - variables.set(property, value); - } - }); - return variables; - } - var cssURLRegex = /url\((('.+?')|(".+?")|([^\)]*?))\)/g; - var cssImportRegex = /@import (url\()?(('.+?')|(".+?")|([^\)]*?))\)?;?/g; - function getCSSURLValue(cssURL) { - return cssURL.replace(/^url\((.*)\)$/, '$1').replace(/^"(.*)"$/, '$1').replace(/^'(.*)'$/, '$1'); - } - function getCSSBaseBath(url) { - var cssURL = parseURL(url); - return cssURL.protocol + "//" + cssURL.host + cssURL.pathname.replace(/\?.*$/, '').replace(/(\/)([^\/]+)$/i, '$1'); - } - function replaceCSSRelativeURLsWithAbsolute($css, cssBasePath) { - return $css.replace(cssURLRegex, function (match) { - var pathValue = getCSSURLValue(match); - return "url(\"" + getAbsoluteURL(cssBasePath, pathValue) + "\")"; - }); - } - var cssCommentsRegex = /\/\*[\s\S]*?\*\//g; - function removeCSSComments($css) { - return $css.replace(cssCommentsRegex, ''); - } - var fontFaceRegex = /@font-face\s*{[^}]*}/g; - function replaceCSSFontFace($css) { - return $css.replace(fontFaceRegex, ''); - } - var varRegex = /var\((--[^\s,]+),?\s*([^\(\)]*(\([^\(\)]*\)[^\(\)]*)*\s*)\)/g; - function replaceCSSVariables(value, variables) { - var missing = false; - var result = value.replace(varRegex, function (match, name, fallback) { - if (variables.has(name)) { - return variables.get(name); - } - else if (fallback) { - return fallback; - } - else { - logWarn("Variable " + name + " not found"); - missing = true; - } - return match; - }); - if (missing) { - return result; - } - if (result.match(varRegex)) { - return replaceCSSVariables(result, variables); - } - return result; + function iterateCSSRules(rules, iterate) { + Array.from(rules) + .forEach(function (rule) { + if (rule instanceof CSSMediaRule) { + var media = Array.from(rule.media); + if (media.includes('screen') || media.includes('all') || !(media.includes('print') || media.includes('speech'))) { + iterateCSSRules(rule.cssRules, iterate); + } + } + else if (rule instanceof CSSStyleRule) { + iterate(rule); + } + else if (rule instanceof CSSImportRule) { + try { + iterateCSSRules(rule.styleSheet.cssRules, iterate); + } + catch (err) { + logWarn(err); + } + } + else { + logWarn("CSSRule type not supported", rule); + } + }); + } + function iterateCSSDeclarations(style, iterate) { + Array.from(style).forEach(function (property) { + var value = style.getPropertyValue(property).trim(); + if (!value) { + return; + } + iterate(property, value); + }); + } + function isCSSVariable(property) { + return property.startsWith('--') && !property.startsWith('--darkreader'); + } + function getCSSVariables(rules) { + var variables = new Map(); + rules && iterateCSSRules(rules, function (rule) { + rule.style && iterateCSSDeclarations(rule.style, function (property, value) { + if (isCSSVariable(property)) { + variables.set(property, value); + } + }); + }); + return variables; + } + function getElementCSSVariables(element) { + var variables = new Map(); + iterateCSSDeclarations(element.style, function (property, value) { + if (isCSSVariable(property)) { + variables.set(property, value); + } + }); + return variables; + } + var cssURLRegex = /url\((('.+?')|(".+?")|([^\)]*?))\)/g; + var cssImportRegex = /@import (url\()?(('.+?')|(".+?")|([^\)]*?))\)?;?/g; + function getCSSURLValue(cssURL) { + return cssURL.replace(/^url\((.*)\)$/, '$1').replace(/^"(.*)"$/, '$1').replace(/^'(.*)'$/, '$1'); + } + function getCSSBaseBath(url) { + var cssURL = parseURL(url); + return cssURL.protocol + "//" + cssURL.host + cssURL.pathname.replace(/\?.*$/, '').replace(/(\/)([^\/]+)$/i, '$1'); + } + function replaceCSSRelativeURLsWithAbsolute($css, cssBasePath) { + return $css.replace(cssURLRegex, function (match) { + var pathValue = getCSSURLValue(match); + return "url(\"" + getAbsoluteURL(cssBasePath, pathValue) + "\")"; + }); + } + var cssCommentsRegex = /\/\*[\s\S]*?\*\//g; + function removeCSSComments($css) { + return $css.replace(cssCommentsRegex, ''); + } + var fontFaceRegex = /@font-face\s*{[^}]*}/g; + function replaceCSSFontFace($css) { + return $css.replace(fontFaceRegex, ''); + } + var varRegex = /var\((--[^\s,]+),?\s*([^\(\)]*(\([^\(\)]*\)[^\(\)]*)*\s*)\)/g; + function replaceCSSVariables(value, variables) { + var missing = false; + var result = value.replace(varRegex, function (match, name, fallback) { + if (variables.has(name)) { + return variables.get(name); + } + else if (fallback) { + return fallback; + } + else { + logWarn("Variable " + name + " not found"); + missing = true; + } + return match; + }); + if (missing) { + return result; + } + if (result.match(varRegex)) { + return replaceCSSVariables(result, variables); + } + return result; } - function hslToRGB(_a) { - var h = _a.h, s = _a.s, l = _a.l, _b = _a.a, a = _b === void 0 ? 1 : _b; - if (s === 0) { - var _c = [l, l, l].map(function (x) { return Math.round(x * 255); }), r_1 = _c[0], b_1 = _c[1], g_1 = _c[2]; - return { r: r_1, g: g_1, b: b_1, a: a }; - } - var c = (1 - Math.abs(2 * l - 1)) * s; - var x = c * (1 - Math.abs((h / 60) % 2 - 1)); - var m = l - c / 2; - var _d = (h < 60 ? [c, x, 0] : - h < 120 ? [x, c, 0] : - h < 180 ? [0, c, x] : - h < 240 ? [0, x, c] : - h < 300 ? [x, 0, c] : - [c, 0, x]).map(function (n) { return Math.round((n + m) * 255); }), r = _d[0], g = _d[1], b = _d[2]; - return { r: r, g: g, b: b, a: a }; - } - function rgbToHSL(_a) { - var r255 = _a.r, g255 = _a.g, b255 = _a.b, _b = _a.a, a = _b === void 0 ? 1 : _b; - var r = r255 / 255; - var g = g255 / 255; - var b = b255 / 255; - var max = Math.max(r, g, b); - var min = Math.min(r, g, b); - var c = max - min; - var l = (max + min) / 2; - if (c === 0) { - return { h: 0, s: 0, l: l, a: a }; - } - var h = (max === r ? (((g - b) / c) % 6) : - max === g ? ((b - r) / c + 2) : - ((r - g) / c + 4)) * 60; - if (h < 0) { - h += 360; - } - var s = c / (1 - Math.abs(2 * l - 1)); - return { h: h, s: s, l: l, a: a }; - } - function toFixed(n, digits) { - if (digits === void 0) { digits = 0; } - var fixed = n.toFixed(digits); - if (digits === 0) { - return fixed; - } - var dot = fixed.indexOf('.'); - if (dot >= 0) { - var zerosMatch = fixed.match(/0+$/); - if (zerosMatch) { - if (zerosMatch.index === dot + 1) { - return fixed.substring(0, dot); - } - return fixed.substring(0, zerosMatch.index); - } - } - return fixed; - } - function rgbToString(rgb) { - var r = rgb.r, g = rgb.g, b = rgb.b, a = rgb.a; - if (a != null && a < 1) { - return "rgba(" + toFixed(r) + ", " + toFixed(g) + ", " + toFixed(b) + ", " + toFixed(a, 2) + ")"; - } - return "rgb(" + toFixed(r) + ", " + toFixed(g) + ", " + toFixed(b) + ")"; - } - function rgbToHexString(_a) { - var r = _a.r, g = _a.g, b = _a.b, a = _a.a; - return "#" + (a != null && a < 1 ? [r, g, b, Math.round(a * 255)] : [r, g, b]).map(function (x) { - return "" + (x < 16 ? '0' : '') + x.toString(16); - }).join(''); - } - var rgbMatch = /^rgba?\([^\(\)]+\)$/; - var hslMatch = /^hsla?\([^\(\)]+\)$/; - var hexMatch = /^#[0-9a-f]+$/i; - function parse($color) { - var c = $color.trim().toLowerCase(); - if (c.match(rgbMatch)) { - return parseRGB(c); - } - if (c.match(hslMatch)) { - return parseHSL(c); - } - if (c.match(hexMatch)) { - return parseHex(c); - } - if (knownColors.has(c)) { - return getColorByName(c); - } - if (systemColors.has(c)) { - return getSystemColor(c); - } - if ($color === 'transparent') { - return { r: 0, g: 0, b: 0, a: 0 }; - } - throw new Error("Unable to parse " + $color); - } - function getNumbersFromString(str, splitter, range, units) { - var raw = str.split(splitter).filter(function (x) { return x; }); - var unitsList = Object.entries(units); - var numbers = raw.map(function (r) { return r.trim(); }).map(function (r, i) { - var n; - var unit = unitsList.find(function (_a) { - var u = _a[0]; - return r.endsWith(u); - }); - if (unit) { - n = parseFloat(r.substring(0, r.length - unit[0].length)) / unit[1] * range[i]; - } - else { - n = parseFloat(r); - } - if (range[i] > 1) { - return Math.round(n); - } - return n; - }); - return numbers; - } - var rgbSplitter = /rgba?|\(|\)|\/|,|\s/ig; - var rgbRange = [255, 255, 255, 1]; - var rgbUnits = { '%': 100 }; - function parseRGB($rgb) { - var _a = getNumbersFromString($rgb, rgbSplitter, rgbRange, rgbUnits), r = _a[0], g = _a[1], b = _a[2], _b = _a[3], a = _b === void 0 ? 1 : _b; - return { r: r, g: g, b: b, a: a }; - } - var hslSplitter = /hsla?|\(|\)|\/|,|\s/ig; - var hslRange = [360, 1, 1, 1]; - var hslUnits = { '%': 100, 'deg': 360, 'rad': 2 * Math.PI, 'turn': 1 }; - function parseHSL($hsl) { - var _a = getNumbersFromString($hsl, hslSplitter, hslRange, hslUnits), h = _a[0], s = _a[1], l = _a[2], _b = _a[3], a = _b === void 0 ? 1 : _b; - return hslToRGB({ h: h, s: s, l: l, a: a }); - } - function parseHex($hex) { - var h = $hex.substring(1); - switch (h.length) { - case 3: - case 4: { - var _a = [0, 1, 2].map(function (i) { return parseInt("" + h[i] + h[i], 16); }), r = _a[0], g = _a[1], b = _a[2]; - var a = h.length === 3 ? 1 : (parseInt("" + h[3] + h[3], 16) / 255); - return { r: r, g: g, b: b, a: a }; - } - case 6: - case 8: { - var _b = [0, 2, 4].map(function (i) { return parseInt(h.substring(i, i + 2), 16); }), r = _b[0], g = _b[1], b = _b[2]; - var a = h.length === 6 ? 1 : (parseInt(h.substring(6, 8), 16) / 255); - return { r: r, g: g, b: b, a: a }; - } - } - throw new Error("Unable to parse " + $hex); - } - function getColorByName($color) { - var n = knownColors.get($color); - return { - r: (n >> 16) & 255, - g: (n >> 8) & 255, - b: (n >> 0) & 255, - a: 1 - }; - } - function getSystemColor($color) { - var n = systemColors.get($color); - return { - r: (n >> 16) & 255, - g: (n >> 8) & 255, - b: (n >> 0) & 255, - a: 1 - }; - } - var knownColors = new Map(Object.entries({ - aliceblue: 0xf0f8ff, - antiquewhite: 0xfaebd7, - aqua: 0x00ffff, - aquamarine: 0x7fffd4, - azure: 0xf0ffff, - beige: 0xf5f5dc, - bisque: 0xffe4c4, - black: 0x000000, - blanchedalmond: 0xffebcd, - blue: 0x0000ff, - blueviolet: 0x8a2be2, - brown: 0xa52a2a, - burlywood: 0xdeb887, - cadetblue: 0x5f9ea0, - chartreuse: 0x7fff00, - chocolate: 0xd2691e, - coral: 0xff7f50, - cornflowerblue: 0x6495ed, - cornsilk: 0xfff8dc, - crimson: 0xdc143c, - cyan: 0x00ffff, - darkblue: 0x00008b, - darkcyan: 0x008b8b, - darkgoldenrod: 0xb8860b, - darkgray: 0xa9a9a9, - darkgrey: 0xa9a9a9, - darkgreen: 0x006400, - darkkhaki: 0xbdb76b, - darkmagenta: 0x8b008b, - darkolivegreen: 0x556b2f, - darkorange: 0xff8c00, - darkorchid: 0x9932cc, - darkred: 0x8b0000, - darksalmon: 0xe9967a, - darkseagreen: 0x8fbc8f, - darkslateblue: 0x483d8b, - darkslategray: 0x2f4f4f, - darkslategrey: 0x2f4f4f, - darkturquoise: 0x00ced1, - darkviolet: 0x9400d3, - deeppink: 0xff1493, - deepskyblue: 0x00bfff, - dimgray: 0x696969, - dimgrey: 0x696969, - dodgerblue: 0x1e90ff, - firebrick: 0xb22222, - floralwhite: 0xfffaf0, - forestgreen: 0x228b22, - fuchsia: 0xff00ff, - gainsboro: 0xdcdcdc, - ghostwhite: 0xf8f8ff, - gold: 0xffd700, - goldenrod: 0xdaa520, - gray: 0x808080, - grey: 0x808080, - green: 0x008000, - greenyellow: 0xadff2f, - honeydew: 0xf0fff0, - hotpink: 0xff69b4, - indianred: 0xcd5c5c, - indigo: 0x4b0082, - ivory: 0xfffff0, - khaki: 0xf0e68c, - lavender: 0xe6e6fa, - lavenderblush: 0xfff0f5, - lawngreen: 0x7cfc00, - lemonchiffon: 0xfffacd, - lightblue: 0xadd8e6, - lightcoral: 0xf08080, - lightcyan: 0xe0ffff, - lightgoldenrodyellow: 0xfafad2, - lightgray: 0xd3d3d3, - lightgrey: 0xd3d3d3, - lightgreen: 0x90ee90, - lightpink: 0xffb6c1, - lightsalmon: 0xffa07a, - lightseagreen: 0x20b2aa, - lightskyblue: 0x87cefa, - lightslategray: 0x778899, - lightslategrey: 0x778899, - lightsteelblue: 0xb0c4de, - lightyellow: 0xffffe0, - lime: 0x00ff00, - limegreen: 0x32cd32, - linen: 0xfaf0e6, - magenta: 0xff00ff, - maroon: 0x800000, - mediumaquamarine: 0x66cdaa, - mediumblue: 0x0000cd, - mediumorchid: 0xba55d3, - mediumpurple: 0x9370db, - mediumseagreen: 0x3cb371, - mediumslateblue: 0x7b68ee, - mediumspringgreen: 0x00fa9a, - mediumturquoise: 0x48d1cc, - mediumvioletred: 0xc71585, - midnightblue: 0x191970, - mintcream: 0xf5fffa, - mistyrose: 0xffe4e1, - moccasin: 0xffe4b5, - navajowhite: 0xffdead, - navy: 0x000080, - oldlace: 0xfdf5e6, - olive: 0x808000, - olivedrab: 0x6b8e23, - orange: 0xffa500, - orangered: 0xff4500, - orchid: 0xda70d6, - palegoldenrod: 0xeee8aa, - palegreen: 0x98fb98, - paleturquoise: 0xafeeee, - palevioletred: 0xdb7093, - papayawhip: 0xffefd5, - peachpuff: 0xffdab9, - peru: 0xcd853f, - pink: 0xffc0cb, - plum: 0xdda0dd, - powderblue: 0xb0e0e6, - purple: 0x800080, - rebeccapurple: 0x663399, - red: 0xff0000, - rosybrown: 0xbc8f8f, - royalblue: 0x4169e1, - saddlebrown: 0x8b4513, - salmon: 0xfa8072, - sandybrown: 0xf4a460, - seagreen: 0x2e8b57, - seashell: 0xfff5ee, - sienna: 0xa0522d, - silver: 0xc0c0c0, - skyblue: 0x87ceeb, - slateblue: 0x6a5acd, - slategray: 0x708090, - slategrey: 0x708090, - snow: 0xfffafa, - springgreen: 0x00ff7f, - steelblue: 0x4682b4, - tan: 0xd2b48c, - teal: 0x008080, - thistle: 0xd8bfd8, - tomato: 0xff6347, - turquoise: 0x40e0d0, - violet: 0xee82ee, - wheat: 0xf5deb3, - white: 0xffffff, - whitesmoke: 0xf5f5f5, - yellow: 0xffff00, - yellowgreen: 0x9acd32, - })); - var systemColors = new Map(Object.entries({ - ActiveBorder: 0x3b99fc, - ActiveCaption: 0x000000, - AppWorkspace: 0xaaaaaa, - Background: 0x6363ce, - ButtonFace: 0xffffff, - ButtonHighlight: 0xe9e9e9, - ButtonShadow: 0x9fa09f, - ButtonText: 0x000000, - CaptionText: 0x000000, - GrayText: 0x7f7f7f, - Highlight: 0xb2d7ff, - HighlightText: 0x000000, - InactiveBorder: 0xffffff, - InactiveCaption: 0xffffff, - InactiveCaptionText: 0x000000, - InfoBackground: 0xfbfcc5, - InfoText: 0x000000, - Menu: 0xf6f6f6, - MenuText: 0xffffff, - Scrollbar: 0xaaaaaa, - ThreeDDarkShadow: 0x000000, - ThreeDFace: 0xc0c0c0, - ThreeDHighlight: 0xffffff, - ThreeDLightShadow: 0xffffff, - ThreeDShadow: 0x000000, - Window: 0xececec, - WindowFrame: 0xaaaaaa, - WindowText: 0x000000, - '-webkit-focus-ring-color': 0xe59700 - }).map(function (_a) { - var key = _a[0], value = _a[1]; - return [key.toLowerCase(), value]; + function hslToRGB(_a) { + var h = _a.h, s = _a.s, l = _a.l, _b = _a.a, a = _b === void 0 ? 1 : _b; + if (s === 0) { + var _c = [l, l, l].map(function (x) { return Math.round(x * 255); }), r_1 = _c[0], b_1 = _c[1], g_1 = _c[2]; + return { r: r_1, g: g_1, b: b_1, a: a }; + } + var c = (1 - Math.abs(2 * l - 1)) * s; + var x = c * (1 - Math.abs((h / 60) % 2 - 1)); + var m = l - c / 2; + var _d = (h < 60 ? [c, x, 0] : + h < 120 ? [x, c, 0] : + h < 180 ? [0, c, x] : + h < 240 ? [0, x, c] : + h < 300 ? [x, 0, c] : + [c, 0, x]).map(function (n) { return Math.round((n + m) * 255); }), r = _d[0], g = _d[1], b = _d[2]; + return { r: r, g: g, b: b, a: a }; + } + function rgbToHSL(_a) { + var r255 = _a.r, g255 = _a.g, b255 = _a.b, _b = _a.a, a = _b === void 0 ? 1 : _b; + var r = r255 / 255; + var g = g255 / 255; + var b = b255 / 255; + var max = Math.max(r, g, b); + var min = Math.min(r, g, b); + var c = max - min; + var l = (max + min) / 2; + if (c === 0) { + return { h: 0, s: 0, l: l, a: a }; + } + var h = (max === r ? (((g - b) / c) % 6) : + max === g ? ((b - r) / c + 2) : + ((r - g) / c + 4)) * 60; + if (h < 0) { + h += 360; + } + var s = c / (1 - Math.abs(2 * l - 1)); + return { h: h, s: s, l: l, a: a }; + } + function toFixed(n, digits) { + if (digits === void 0) { digits = 0; } + var fixed = n.toFixed(digits); + if (digits === 0) { + return fixed; + } + var dot = fixed.indexOf('.'); + if (dot >= 0) { + var zerosMatch = fixed.match(/0+$/); + if (zerosMatch) { + if (zerosMatch.index === dot + 1) { + return fixed.substring(0, dot); + } + return fixed.substring(0, zerosMatch.index); + } + } + return fixed; + } + function rgbToString(rgb) { + var r = rgb.r, g = rgb.g, b = rgb.b, a = rgb.a; + if (a != null && a < 1) { + return "rgba(" + toFixed(r) + ", " + toFixed(g) + ", " + toFixed(b) + ", " + toFixed(a, 2) + ")"; + } + return "rgb(" + toFixed(r) + ", " + toFixed(g) + ", " + toFixed(b) + ")"; + } + function rgbToHexString(_a) { + var r = _a.r, g = _a.g, b = _a.b, a = _a.a; + return "#" + (a != null && a < 1 ? [r, g, b, Math.round(a * 255)] : [r, g, b]).map(function (x) { + return "" + (x < 16 ? '0' : '') + x.toString(16); + }).join(''); + } + var rgbMatch = /^rgba?\([^\(\)]+\)$/; + var hslMatch = /^hsla?\([^\(\)]+\)$/; + var hexMatch = /^#[0-9a-f]+$/i; + function parse($color) { + var c = $color.trim().toLowerCase(); + if (c.match(rgbMatch)) { + return parseRGB(c); + } + if (c.match(hslMatch)) { + return parseHSL(c); + } + if (c.match(hexMatch)) { + return parseHex(c); + } + if (knownColors.has(c)) { + return getColorByName(c); + } + if (systemColors.has(c)) { + return getSystemColor(c); + } + if ($color === 'transparent') { + return { r: 0, g: 0, b: 0, a: 0 }; + } + throw new Error("Unable to parse " + $color); + } + function getNumbersFromString(str, splitter, range, units) { + var raw = str.split(splitter).filter(function (x) { return x; }); + var unitsList = Object.entries(units); + var numbers = raw.map(function (r) { return r.trim(); }).map(function (r, i) { + var n; + var unit = unitsList.find(function (_a) { + var u = _a[0]; + return r.endsWith(u); + }); + if (unit) { + n = parseFloat(r.substring(0, r.length - unit[0].length)) / unit[1] * range[i]; + } + else { + n = parseFloat(r); + } + if (range[i] > 1) { + return Math.round(n); + } + return n; + }); + return numbers; + } + var rgbSplitter = /rgba?|\(|\)|\/|,|\s/ig; + var rgbRange = [255, 255, 255, 1]; + var rgbUnits = { '%': 100 }; + function parseRGB($rgb) { + var _a = getNumbersFromString($rgb, rgbSplitter, rgbRange, rgbUnits), r = _a[0], g = _a[1], b = _a[2], _b = _a[3], a = _b === void 0 ? 1 : _b; + return { r: r, g: g, b: b, a: a }; + } + var hslSplitter = /hsla?|\(|\)|\/|,|\s/ig; + var hslRange = [360, 1, 1, 1]; + var hslUnits = { '%': 100, 'deg': 360, 'rad': 2 * Math.PI, 'turn': 1 }; + function parseHSL($hsl) { + var _a = getNumbersFromString($hsl, hslSplitter, hslRange, hslUnits), h = _a[0], s = _a[1], l = _a[2], _b = _a[3], a = _b === void 0 ? 1 : _b; + return hslToRGB({ h: h, s: s, l: l, a: a }); + } + function parseHex($hex) { + var h = $hex.substring(1); + switch (h.length) { + case 3: + case 4: { + var _a = [0, 1, 2].map(function (i) { return parseInt("" + h[i] + h[i], 16); }), r = _a[0], g = _a[1], b = _a[2]; + var a = h.length === 3 ? 1 : (parseInt("" + h[3] + h[3], 16) / 255); + return { r: r, g: g, b: b, a: a }; + } + case 6: + case 8: { + var _b = [0, 2, 4].map(function (i) { return parseInt(h.substring(i, i + 2), 16); }), r = _b[0], g = _b[1], b = _b[2]; + var a = h.length === 6 ? 1 : (parseInt(h.substring(6, 8), 16) / 255); + return { r: r, g: g, b: b, a: a }; + } + } + throw new Error("Unable to parse " + $hex); + } + function getColorByName($color) { + var n = knownColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function getSystemColor($color) { + var n = systemColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + var knownColors = new Map(Object.entries({ + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgrey: 0xa9a9a9, + darkgreen: 0x006400, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + grey: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgrey: 0xd3d3d3, + lightgreen: 0x90ee90, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32, + })); + var systemColors = new Map(Object.entries({ + ActiveBorder: 0x3b99fc, + ActiveCaption: 0x000000, + AppWorkspace: 0xaaaaaa, + Background: 0x6363ce, + ButtonFace: 0xffffff, + ButtonHighlight: 0xe9e9e9, + ButtonShadow: 0x9fa09f, + ButtonText: 0x000000, + CaptionText: 0x000000, + GrayText: 0x7f7f7f, + Highlight: 0xb2d7ff, + HighlightText: 0x000000, + InactiveBorder: 0xffffff, + InactiveCaption: 0xffffff, + InactiveCaptionText: 0x000000, + InfoBackground: 0xfbfcc5, + InfoText: 0x000000, + Menu: 0xf6f6f6, + MenuText: 0xffffff, + Scrollbar: 0xaaaaaa, + ThreeDDarkShadow: 0x000000, + ThreeDFace: 0xc0c0c0, + ThreeDHighlight: 0xffffff, + ThreeDLightShadow: 0xffffff, + ThreeDShadow: 0x000000, + Window: 0xececec, + WindowFrame: 0xaaaaaa, + WindowText: 0x000000, + '-webkit-focus-ring-color': 0xe59700 + }).map(function (_a) { + var key = _a[0], value = _a[1]; + return [key.toLowerCase(), value]; })); - function scale(x, inLow, inHigh, outLow, outHigh) { - return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow; - } - function clamp(x, min, max) { - return Math.min(max, Math.max(min, x)); - } - function multiplyMatrices(m1, m2) { - var result = []; - for (var i = 0; i < m1.length; i++) { - result[i] = []; - for (var j = 0; j < m2[0].length; j++) { - var sum = 0; - for (var k = 0; k < m1[0].length; k++) { - sum += m1[i][k] * m2[k][j]; - } - result[i][j] = sum; - } - } - return result; + function scale(x, inLow, inHigh, outLow, outHigh) { + return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow; + } + function clamp(x, min, max) { + return Math.min(max, Math.max(min, x)); + } + function multiplyMatrices(m1, m2) { + var result = []; + for (var i = 0; i < m1.length; i++) { + result[i] = []; + for (var j = 0; j < m2[0].length; j++) { + var sum = 0; + for (var k = 0; k < m1[0].length; k++) { + sum += m1[i][k] * m2[k][j]; + } + result[i][j] = sum; + } + } + return result; } - function isFirefox() { - return navigator.userAgent.includes('Firefox'); - } - function isMacOS() { - return navigator.platform.toLowerCase().startsWith('mac'); - } - function isDeepSelectorSupported() { - try { - document.querySelector('x /deep/ x'); - return true; - } - catch (err) { - return false; - } + function isFirefox() { + return navigator.userAgent.includes('Firefox'); + } + function isMacOS() { + return navigator.platform.toLowerCase().startsWith('mac'); + } + function isDeepSelectorSupported() { + try { + document.querySelector('x /deep/ x'); + return true; + } + catch (err) { + return false; + } } - function getMatches(regex, input, group) { - if (group === void 0) { group = 0; } - var matches = []; - var m; - while (m = regex.exec(input)) { - matches.push(m[group]); - } - return matches; + function getMatches(regex, input, group) { + if (group === void 0) { group = 0; } + var matches = []; + var m; + while (m = regex.exec(input)) { + matches.push(m[group]); + } + return matches; } - function createFilterMatrix(config) { - var m = Matrix.identity(); - if (config.sepia !== 0) { - m = multiplyMatrices(m, Matrix.sepia(config.sepia / 100)); - } - if (config.grayscale !== 0) { - m = multiplyMatrices(m, Matrix.grayscale(config.grayscale / 100)); - } - if (config.contrast !== 100) { - m = multiplyMatrices(m, Matrix.contrast(config.contrast / 100)); - } - if (config.brightness !== 100) { - m = multiplyMatrices(m, Matrix.brightness(config.brightness / 100)); - } - if (config.mode === 1) { - m = multiplyMatrices(m, Matrix.invertNHue()); - } - return m; - } - function applyColorMatrix(_a, matrix) { - var r = _a[0], g = _a[1], b = _a[2]; - var rgb = [[r / 255], [g / 255], [b / 255], [1], [1]]; - var result = multiplyMatrices(matrix, rgb); - return [0, 1, 2].map(function (i) { return clamp(Math.round(result[i][0] * 255), 0, 255); }); - } - var Matrix = { - identity: function () { - return [ - [1, 0, 0, 0, 0], - [0, 1, 0, 0, 0], - [0, 0, 1, 0, 0], - [0, 0, 0, 1, 0], - [0, 0, 0, 0, 1] - ]; - }, - invertNHue: function () { - return [ - [0.333, -0.667, -0.667, 0, 1], - [-0.667, 0.333, -0.667, 0, 1], - [-0.667, -0.667, 0.333, 0, 1], - [0, 0, 0, 1, 0], - [0, 0, 0, 0, 1] - ]; - }, - brightness: function (v) { - return [ - [v, 0, 0, 0, 0], - [0, v, 0, 0, 0], - [0, 0, v, 0, 0], - [0, 0, 0, 1, 0], - [0, 0, 0, 0, 1] - ]; - }, - contrast: function (v) { - var t = (1 - v) / 2; - return [ - [v, 0, 0, 0, t], - [0, v, 0, 0, t], - [0, 0, v, 0, t], - [0, 0, 0, 1, 0], - [0, 0, 0, 0, 1] - ]; - }, - sepia: function (v) { - return [ - [(0.393 + 0.607 * (1 - v)), (0.769 - 0.769 * (1 - v)), (0.189 - 0.189 * (1 - v)), 0, 0], - [(0.349 - 0.349 * (1 - v)), (0.686 + 0.314 * (1 - v)), (0.168 - 0.168 * (1 - v)), 0, 0], - [(0.272 - 0.272 * (1 - v)), (0.534 - 0.534 * (1 - v)), (0.131 + 0.869 * (1 - v)), 0, 0], - [0, 0, 0, 1, 0], - [0, 0, 0, 0, 1] - ]; - }, - grayscale: function (v) { - return [ - [(0.2126 + 0.7874 * (1 - v)), (0.7152 - 0.7152 * (1 - v)), (0.0722 - 0.0722 * (1 - v)), 0, 0], - [(0.2126 - 0.2126 * (1 - v)), (0.7152 + 0.2848 * (1 - v)), (0.0722 - 0.0722 * (1 - v)), 0, 0], - [(0.2126 - 0.2126 * (1 - v)), (0.7152 - 0.7152 * (1 - v)), (0.0722 + 0.9278 * (1 - v)), 0, 0], - [0, 0, 0, 1, 0], - [0, 0, 0, 0, 1] - ]; - }, + function createFilterMatrix(config) { + var m = Matrix.identity(); + if (config.sepia !== 0) { + m = multiplyMatrices(m, Matrix.sepia(config.sepia / 100)); + } + if (config.grayscale !== 0) { + m = multiplyMatrices(m, Matrix.grayscale(config.grayscale / 100)); + } + if (config.contrast !== 100) { + m = multiplyMatrices(m, Matrix.contrast(config.contrast / 100)); + } + if (config.brightness !== 100) { + m = multiplyMatrices(m, Matrix.brightness(config.brightness / 100)); + } + if (config.mode === 1) { + m = multiplyMatrices(m, Matrix.invertNHue()); + } + return m; + } + function applyColorMatrix(_a, matrix) { + var r = _a[0], g = _a[1], b = _a[2]; + var rgb = [[r / 255], [g / 255], [b / 255], [1], [1]]; + var result = multiplyMatrices(matrix, rgb); + return [0, 1, 2].map(function (i) { return clamp(Math.round(result[i][0] * 255), 0, 255); }); + } + var Matrix = { + identity: function () { + return [ + [1, 0, 0, 0, 0], + [0, 1, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + invertNHue: function () { + return [ + [0.333, -0.667, -0.667, 0, 1], + [-0.667, 0.333, -0.667, 0, 1], + [-0.667, -0.667, 0.333, 0, 1], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + brightness: function (v) { + return [ + [v, 0, 0, 0, 0], + [0, v, 0, 0, 0], + [0, 0, v, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + contrast: function (v) { + var t = (1 - v) / 2; + return [ + [v, 0, 0, 0, t], + [0, v, 0, 0, t], + [0, 0, v, 0, t], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + sepia: function (v) { + return [ + [(0.393 + 0.607 * (1 - v)), (0.769 - 0.769 * (1 - v)), (0.189 - 0.189 * (1 - v)), 0, 0], + [(0.349 - 0.349 * (1 - v)), (0.686 + 0.314 * (1 - v)), (0.168 - 0.168 * (1 - v)), 0, 0], + [(0.272 - 0.272 * (1 - v)), (0.534 - 0.534 * (1 - v)), (0.131 + 0.869 * (1 - v)), 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + grayscale: function (v) { + return [ + [(0.2126 + 0.7874 * (1 - v)), (0.7152 - 0.7152 * (1 - v)), (0.0722 - 0.0722 * (1 - v)), 0, 0], + [(0.2126 - 0.2126 * (1 - v)), (0.7152 + 0.2848 * (1 - v)), (0.0722 - 0.0722 * (1 - v)), 0, 0], + [(0.2126 - 0.2126 * (1 - v)), (0.7152 - 0.7152 * (1 - v)), (0.0722 + 0.9278 * (1 - v)), 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, }; - var colorModificationCache = new Map(); - function clearColorModificationCache() { - colorModificationCache.clear(); - } - function modifyColorWithCache(rgb, filter, modifyHSL) { - var fnCache; - if (colorModificationCache.has(modifyHSL)) { - fnCache = colorModificationCache.get(modifyHSL); - } - else { - fnCache = new Map(); - colorModificationCache.set(modifyHSL, fnCache); - } - var id = Object.entries(rgb) - .concat(Object.entries(filter).filter(function (_a) { - var key = _a[0]; - return ['mode', 'brightness', 'contrast', 'grayscale', 'sepia'].indexOf(key) >= 0; - })) - .map(function (_a) { - var key = _a[0], value = _a[1]; - return key + ":" + value; - }) - .join(';'); - if (fnCache.has(id)) { - return fnCache.get(id); - } - var hsl = rgbToHSL(rgb); - var modified = modifyHSL(hsl); - var _a = hslToRGB(modified), r = _a.r, g = _a.g, b = _a.b, a = _a.a; - var matrix = createFilterMatrix(filter); - var _b = applyColorMatrix([r, g, b], matrix), rf = _b[0], gf = _b[1], bf = _b[2]; - var color = (a === 1 ? - rgbToHexString({ r: rf, g: gf, b: bf }) : - rgbToString({ r: rf, g: gf, b: bf, a: a })); - fnCache.set(id, color); - return color; - } - function noopHSL(hsl) { - return hsl; - } - function modifyColor(rgb, theme) { - return modifyColorWithCache(rgb, theme, noopHSL); - } - function modifyLightModeHSL(_a) { - var h = _a.h, s = _a.s, l = _a.l, a = _a.a; - var lMin = 0; - var lMid = 0.4; - var lMax = 0.9; - var sNeutralLim = 0.36; - var lNeutralDark = 0.2; - var lNeutralLight = 0.8; - var sColored = 0.16; - var hColoredL0 = 205; - var hColoredL1 = 40; - var lx = scale(l, 0, 1, lMin, lMax); - var hx = h; - var sx = s; - var isNeutral = l < lNeutralDark || l > lNeutralLight || s < sNeutralLim; - if (isNeutral) { - sx = (l < lMid ? - scale(l, 0, lMid, sColored, 0) : - scale(l, lMid, 1, 0, sColored)); - hx = (l < lMid ? hColoredL0 : hColoredL1); - } - return { h: hx, s: sx, l: lx, a: a }; - } - function modifyBgHSL(_a) { - var h = _a.h, s = _a.s, l = _a.l, a = _a.a; - var lMin = 0.1; - var lMaxS0 = 0.25; - var lMaxS1 = 0.4; - var sNeutralLim = 0.12; - var lNeutralLight = 0.8; - var sColored = 0.05; - var hColored = 205; - var hBlue0 = 200; - var hBlue1 = 280; - var lMax = scale(s, 0, 1, lMaxS0, lMaxS1); - var lx = (l < lMax ? - l : - l < 0.5 ? - lMax : - scale(l, 0.5, 1, lMax, lMin)); - var isNeutral = (l >= lNeutralLight && h > hBlue0 && h < hBlue1) || s < sNeutralLim; - var hx = h; - var sx = s; - if (isNeutral) { - sx = sColored; - hx = hColored; - } - return { h: hx, s: sx, l: lx, a: a }; - } - function modifyBackgroundColor(rgb, filter) { - if (filter.mode === 0) { - return modifyColorWithCache(rgb, filter, modifyLightModeHSL); - } - return modifyColorWithCache(rgb, __assign({}, filter, { mode: 0 }), modifyBgHSL); - } - function modifyFgHSL(_a) { - var h = _a.h, s = _a.s, l = _a.l, a = _a.a; - var lMax = 0.9; - var lMinS0 = 0.7; - var lMinS1 = 0.6; - var sNeutralLim = 0.24; - var lNeutralDark = 0.2; - var sColored = 0.10; - var hColored = 40; - var hBlue0 = 205; - var hBlue1 = 245; - var hBlueMax = 220; - var lBlueMin = 0.7; - var isBlue = h > hBlue0 && h <= hBlue1; - var lMin = scale(s, 0, 1, isBlue ? scale(h, hBlue0, hBlue1, lMinS0, lBlueMin) : lMinS0, lMinS1); - var lx = (l < 0.5 ? - scale(l, 0, 0.5, lMax, lMin) : - l < lMin ? - lMin : - l); - var hx = h; - var sx = s; - if (isBlue) { - hx = scale(hx, hBlue0, hBlue1, hBlue0, hBlueMax); - } - var isNeutral = l < lNeutralDark || s < sNeutralLim; - if (isNeutral) { - sx = sColored; - hx = hColored; - } - return { h: hx, s: sx, l: lx, a: a }; - } - function modifyForegroundColor(rgb, filter) { - if (filter.mode === 0) { - return modifyColorWithCache(rgb, filter, modifyLightModeHSL); - } - return modifyColorWithCache(rgb, __assign({}, filter, { mode: 0 }), modifyFgHSL); - } - function modifyBorderHSL(_a) { - var h = _a.h, s = _a.s, l = _a.l, a = _a.a; - var lMinS0 = 0.2; - var lMinS1 = 0.3; - var lMaxS0 = 0.4; - var lMaxS1 = 0.5; - var lMin = scale(s, 0, 1, lMinS0, lMinS1); - var lMax = scale(s, 0, 1, lMaxS0, lMaxS1); - var lx = scale(l, 0, 1, lMax, lMin); - return { h: h, s: s, l: lx, a: a }; - } - function modifyBorderColor(rgb, filter) { - if (filter.mode === 0) { - return modifyColorWithCache(rgb, filter, modifyLightModeHSL); - } - return modifyColorWithCache(rgb, __assign({}, filter, { mode: 0 }), modifyBorderHSL); - } - function modifyShadowColor(rgb, filter) { - return modifyBackgroundColor(rgb, filter); - } - function modifyGradientColor(rgb, filter) { - return modifyBackgroundColor(rgb, filter); + var colorModificationCache = new Map(); + function clearColorModificationCache() { + colorModificationCache.clear(); + } + function modifyColorWithCache(rgb, filter, modifyHSL) { + var fnCache; + if (colorModificationCache.has(modifyHSL)) { + fnCache = colorModificationCache.get(modifyHSL); + } + else { + fnCache = new Map(); + colorModificationCache.set(modifyHSL, fnCache); + } + var id = Object.entries(rgb) + .concat(Object.entries(filter).filter(function (_a) { + var key = _a[0]; + return ['mode', 'brightness', 'contrast', 'grayscale', 'sepia'].indexOf(key) >= 0; + })) + .map(function (_a) { + var key = _a[0], value = _a[1]; + return key + ":" + value; + }) + .join(';'); + if (fnCache.has(id)) { + return fnCache.get(id); + } + var hsl = rgbToHSL(rgb); + var modified = modifyHSL(hsl); + var _a = hslToRGB(modified), r = _a.r, g = _a.g, b = _a.b, a = _a.a; + var matrix = createFilterMatrix(filter); + var _b = applyColorMatrix([r, g, b], matrix), rf = _b[0], gf = _b[1], bf = _b[2]; + var color = (a === 1 ? + rgbToHexString({ r: rf, g: gf, b: bf }) : + rgbToString({ r: rf, g: gf, b: bf, a: a })); + fnCache.set(id, color); + return color; + } + function noopHSL(hsl) { + return hsl; + } + function modifyColor(rgb, theme) { + return modifyColorWithCache(rgb, theme, noopHSL); + } + function modifyLightModeHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMin = 0; + var lMid = 0.4; + var lMax = 0.9; + var sNeutralLim = 0.36; + var lNeutralDark = 0.2; + var lNeutralLight = 0.8; + var sColored = 0.16; + var hColoredL0 = 205; + var hColoredL1 = 40; + var lx = scale(l, 0, 1, lMin, lMax); + var hx = h; + var sx = s; + var isNeutral = l < lNeutralDark || l > lNeutralLight || s < sNeutralLim; + if (isNeutral) { + sx = (l < lMid ? + scale(l, 0, lMid, sColored, 0) : + scale(l, lMid, 1, 0, sColored)); + hx = (l < lMid ? hColoredL0 : hColoredL1); + } + return { h: hx, s: sx, l: lx, a: a }; + } + function modifyBgHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMin = 0.1; + var lMaxS0 = 0.25; + var lMaxS1 = 0.4; + var sNeutralLim = 0.12; + var lNeutralLight = 0.8; + var sColored = 0.05; + var hColored = 205; + var hBlue0 = 200; + var hBlue1 = 280; + var lMax = scale(s, 0, 1, lMaxS0, lMaxS1); + var lx = (l < lMax ? + l : + l < 0.5 ? + lMax : + scale(l, 0.5, 1, lMax, lMin)); + var isNeutral = (l >= lNeutralLight && h > hBlue0 && h < hBlue1) || s < sNeutralLim; + var hx = h; + var sx = s; + if (isNeutral) { + sx = sColored; + hx = hColored; + } + return { h: hx, s: sx, l: lx, a: a }; + } + function modifyBackgroundColor(rgb, filter) { + if (filter.mode === 0) { + return modifyColorWithCache(rgb, filter, modifyLightModeHSL); + } + return modifyColorWithCache(rgb, __assign({}, filter, { mode: 0 }), modifyBgHSL); + } + function modifyFgHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMax = 0.9; + var lMinS0 = 0.7; + var lMinS1 = 0.6; + var sNeutralLim = 0.24; + var lNeutralDark = 0.2; + var sColored = 0.10; + var hColored = 40; + var hBlue0 = 205; + var hBlue1 = 245; + var hBlueMax = 220; + var lBlueMin = 0.7; + var isBlue = h > hBlue0 && h <= hBlue1; + var lMin = scale(s, 0, 1, isBlue ? scale(h, hBlue0, hBlue1, lMinS0, lBlueMin) : lMinS0, lMinS1); + var lx = (l < 0.5 ? + scale(l, 0, 0.5, lMax, lMin) : + l < lMin ? + lMin : + l); + var hx = h; + var sx = s; + if (isBlue) { + hx = scale(hx, hBlue0, hBlue1, hBlue0, hBlueMax); + } + var isNeutral = l < lNeutralDark || s < sNeutralLim; + if (isNeutral) { + sx = sColored; + hx = hColored; + } + return { h: hx, s: sx, l: lx, a: a }; + } + function modifyForegroundColor(rgb, filter) { + if (filter.mode === 0) { + return modifyColorWithCache(rgb, filter, modifyLightModeHSL); + } + return modifyColorWithCache(rgb, __assign({}, filter, { mode: 0 }), modifyFgHSL); + } + function modifyBorderHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMinS0 = 0.2; + var lMinS1 = 0.3; + var lMaxS0 = 0.4; + var lMaxS1 = 0.5; + var lMin = scale(s, 0, 1, lMinS0, lMinS1); + var lMax = scale(s, 0, 1, lMaxS0, lMaxS1); + var lx = scale(l, 0, 1, lMax, lMin); + return { h: h, s: s, l: lx, a: a }; + } + function modifyBorderColor(rgb, filter) { + if (filter.mode === 0) { + return modifyColorWithCache(rgb, filter, modifyLightModeHSL); + } + return modifyColorWithCache(rgb, __assign({}, filter, { mode: 0 }), modifyBorderHSL); + } + function modifyShadowColor(rgb, filter) { + return modifyBackgroundColor(rgb, filter); + } + function modifyGradientColor(rgb, filter) { + return modifyBackgroundColor(rgb, filter); } - function getURLHost(url) { - return url.match(/^(.*?\/{2,3})?(.+?)(\/|$)/)[2]; + function getURLHost(url) { + return url.match(/^(.*?\/{2,3})?(.+?)(\/|$)/)[2]; } - function createTextStyle(config) { - var lines = []; - lines.push('* {'); - if (config.useFont && config.fontFamily) { - lines.push(" font-family: " + config.fontFamily + " !important;"); - } - if (config.textStroke > 0) { - lines.push(" -webkit-text-stroke: " + config.textStroke + "px !important;"); - lines.push(" text-stroke: " + config.textStroke + "px !important;"); - } - lines.push('}'); - return lines.join('\n'); + function createTextStyle(config) { + var lines = []; + lines.push('* {'); + if (config.useFont && config.fontFamily) { + lines.push(" font-family: " + config.fontFamily + " !important;"); + } + if (config.textStroke > 0) { + lines.push(" -webkit-text-stroke: " + config.textStroke + "px !important;"); + lines.push(" text-stroke: " + config.textStroke + "px !important;"); + } + lines.push('}'); + return lines.join('\n'); } - var FilterMode; - (function (FilterMode) { - FilterMode[FilterMode["light"] = 0] = "light"; - FilterMode[FilterMode["dark"] = 1] = "dark"; - })(FilterMode || (FilterMode = {})); - function getCSSFilterValue(config) { - var filters = []; - if (config.mode === FilterMode.dark) { - filters.push('invert(100%) hue-rotate(180deg)'); - } - if (config.brightness !== 100) { - filters.push("brightness(" + config.brightness + "%)"); - } - if (config.contrast !== 100) { - filters.push("contrast(" + config.contrast + "%)"); - } - if (config.grayscale !== 0) { - filters.push("grayscale(" + config.grayscale + "%)"); - } - if (config.sepia !== 0) { - filters.push("sepia(" + config.sepia + "%)"); - } - if (filters.length === 0) { - return null; - } - return filters.join(' '); + var FilterMode; + (function (FilterMode) { + FilterMode[FilterMode["light"] = 0] = "light"; + FilterMode[FilterMode["dark"] = 1] = "dark"; + })(FilterMode || (FilterMode = {})); + function getCSSFilterValue(config) { + var filters = []; + if (config.mode === FilterMode.dark) { + filters.push('invert(100%) hue-rotate(180deg)'); + } + if (config.brightness !== 100) { + filters.push("brightness(" + config.brightness + "%)"); + } + if (config.contrast !== 100) { + filters.push("contrast(" + config.contrast + "%)"); + } + if (config.grayscale !== 0) { + filters.push("grayscale(" + config.grayscale + "%)"); + } + if (config.sepia !== 0) { + filters.push("sepia(" + config.sepia + "%)"); + } + if (filters.length === 0) { + return null; + } + return filters.join(' '); } - function toSVGMatrix(matrix) { - return matrix.slice(0, 4).map(function (m) { return m.map(function (m) { return m.toFixed(3); }).join(' '); }).join(' '); - } - function getSVGFilterMatrixValue(config) { - return toSVGMatrix(createFilterMatrix(config)); + function toSVGMatrix(matrix) { + return matrix.slice(0, 4).map(function (m) { return m.map(function (m) { return m.toFixed(3); }).join(' '); }).join(' '); + } + function getSVGFilterMatrixValue(config) { + return toSVGMatrix(createFilterMatrix(config)); } - var counter = 0; - var resolvers = new Map(); - var rejectors = new Map(); - function bgFetch(request) { - return new Promise(function (resolve, reject) { - var id = ++counter; - resolvers.set(id, resolve); - rejectors.set(id, reject); - chrome.runtime.sendMessage({ type: 'fetch', data: request, id: id }); - }); - } - chrome.runtime.onMessage.addListener(function (_a) { - var type = _a.type, data = _a.data, error = _a.error, id = _a.id; - if (type === 'fetch-response') { - var resolve = resolvers.get(id); - var reject = rejectors.get(id); - resolvers.delete(id); - rejectors.delete(id); - if (error) { - reject && reject(error); - } - else { - resolve && resolve(data); - } - } + var counter = 0; + var resolvers = new Map(); + var rejectors = new Map(); + function bgFetch(request) { + return new Promise(function (resolve, reject) { + var id = ++counter; + resolvers.set(id, resolve); + rejectors.set(id, reject); + chrome.runtime.sendMessage({ type: 'fetch', data: request, id: id }); + }); + } + chrome.runtime.onMessage.addListener(function (_a) { + var type = _a.type, data = _a.data, error = _a.error, id = _a.id; + if (type === 'fetch-response') { + var resolve = resolvers.get(id); + var reject = rejectors.get(id); + resolvers.delete(id); + rejectors.delete(id); + if (error) { + reject && reject(error); + } + else { + resolve && resolve(data); + } + } }); - function getOKResponse(url) { - return __awaiter(this, void 0, void 0, function () { - var response; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4, fetch(url, { cache: 'force-cache' })]; - case 1: - response = _a.sent(); - if (response.ok) { - return [2, response]; - } - else { - throw new Error("Unable to load " + url + " " + response.status + " " + response.statusText); - } - return [2]; - } - }); - }); - } - function loadAsDataURL(url) { - return __awaiter(this, void 0, void 0, function () { - var response, blob, dataURL; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4, getOKResponse(url)]; - case 1: - response = _a.sent(); - return [4, response.blob()]; - case 2: - blob = _a.sent(); - return [4, (new Promise(function (resolve) { - var reader = new FileReader(); - reader.onloadend = function () { return resolve(reader.result); }; - reader.readAsDataURL(blob); - }))]; - case 3: - dataURL = _a.sent(); - return [2, dataURL]; - } - }); - }); + function getOKResponse(url) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, fetch(url, { cache: 'force-cache' })]; + case 1: + response = _a.sent(); + if (response.ok) { + return [2, response]; + } + else { + throw new Error("Unable to load " + url + " " + response.status + " " + response.statusText); + } + return [2]; + } + }); + }); + } + function loadAsDataURL(url) { + return __awaiter(this, void 0, void 0, function () { + var response, blob, dataURL; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, getOKResponse(url)]; + case 1: + response = _a.sent(); + return [4, response.blob()]; + case 2: + blob = _a.sent(); + return [4, (new Promise(function (resolve) { + var reader = new FileReader(); + reader.onloadend = function () { return resolve(reader.result); }; + reader.readAsDataURL(blob); + }))]; + case 3: + dataURL = _a.sent(); + return [2, dataURL]; + } + }); + }); } - function getImageDetails(url) { - return __awaiter(this, void 0, void 0, function () { - var dataURL, image, info; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!url.startsWith('data:')) return [3, 1]; - dataURL = url; - return [3, 3]; - case 1: return [4, getImageDataURL(url)]; - case 2: - dataURL = _a.sent(); - _a.label = 3; - case 3: return [4, urlToImage(dataURL)]; - case 4: - image = _a.sent(); - info = analyzeImage(image); - return [2, __assign({ src: url, dataURL: dataURL, width: image.naturalWidth, height: image.naturalHeight }, info)]; - } - }); - }); - } - function getImageDataURL(url) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!(getURLHost(url) === location.host)) return [3, 2]; - return [4, loadAsDataURL(url)]; - case 1: return [2, _a.sent()]; - case 2: return [4, bgFetch({ url: url, responseType: 'data-url' })]; - case 3: return [2, _a.sent()]; - } - }); - }); - } - function urlToImage(url) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2, new Promise(function (resolve, reject) { - var image = new Image(); - image.onload = function () { return resolve(image); }; - image.onerror = function () { return reject("Unable to load image " + url); }; - image.src = url; - })]; - }); - }); - } - function analyzeImage(image) { - var MAX_ANALIZE_PIXELS_COUNT = 32 * 32; - var naturalPixelsCount = image.naturalWidth * image.naturalHeight; - var k = Math.min(1, Math.sqrt(MAX_ANALIZE_PIXELS_COUNT / naturalPixelsCount)); - var width = Math.max(1, Math.round(image.naturalWidth * k)); - var height = Math.max(1, Math.round(image.naturalHeight * k)); - var canvas = document.createElement('canvas'); - canvas.width = width; - canvas.height = height; - var context = canvas.getContext('2d'); - context.imageSmoothingEnabled = false; - context.drawImage(image, 0, 0, width, height); - var imageData = context.getImageData(0, 0, width, height); - var d = imageData.data; - var TRANSPARENT_ALPHA_THRESHOLD = 0.05; - var DARK_LIGHTNESS_THRESHOLD = 0.4; - var LIGHT_LIGHTNESS_THRESHOLD = 0.7; - var transparentPixelsCount = 0; - var darkPixelsCount = 0; - var lightPixelsCount = 0; - var i, x, y; - var r, g, b, a; - var l, min, max; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - i = 4 * (y * width + x); - r = d[i + 0] / 255; - g = d[i + 1] / 255; - b = d[i + 2] / 255; - a = d[i + 3] / 255; - if (a < TRANSPARENT_ALPHA_THRESHOLD) { - transparentPixelsCount++; - } - else { - min = Math.min(r, g, b); - max = Math.max(r, g, b); - l = (max + min) / 2; - if (l < DARK_LIGHTNESS_THRESHOLD) { - darkPixelsCount++; - } - if (l > LIGHT_LIGHTNESS_THRESHOLD) { - lightPixelsCount++; - } - } - } - } - var totalPixelsCount = width * height; - var opaquePixelsCount = totalPixelsCount - transparentPixelsCount; - var DARK_IMAGE_THRESHOLD = 0.7; - var LIGHT_IMAGE_THRESHOLD = 0.7; - var TRANSPARENT_IMAGE_THRESHOLD = 0.1; - var LARGE_IMAGE_PIXELS_COUNT = 800 * 600; - return { - isDark: ((darkPixelsCount / opaquePixelsCount) >= DARK_IMAGE_THRESHOLD), - isLight: ((lightPixelsCount / opaquePixelsCount) >= LIGHT_IMAGE_THRESHOLD), - isTransparent: ((transparentPixelsCount / totalPixelsCount) >= TRANSPARENT_IMAGE_THRESHOLD), - isLarge: (naturalPixelsCount >= LARGE_IMAGE_PIXELS_COUNT), - }; - } - function getFilteredImageDataURL(_a, filter) { - var dataURL = _a.dataURL, width = _a.width, height = _a.height; - var matrix = getSVGFilterMatrixValue(filter); - var svg = [ - "", - '', - '', - "", - '', - '', - "", - '', - ].join(''); - var bytes = new Uint8Array(svg.length); - for (var i = 0; i < svg.length; i++) { - bytes[i] = svg.charCodeAt(i); - } - var blob = new Blob([bytes], { type: 'image/svg+xml' }); - var objectURL = URL.createObjectURL(blob); - return objectURL; + function getImageDetails(url) { + return __awaiter(this, void 0, void 0, function () { + var dataURL, image, info; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!url.startsWith('data:')) return [3, 1]; + dataURL = url; + return [3, 3]; + case 1: return [4, getImageDataURL(url)]; + case 2: + dataURL = _a.sent(); + _a.label = 3; + case 3: return [4, urlToImage(dataURL)]; + case 4: + image = _a.sent(); + info = analyzeImage(image); + return [2, __assign({ src: url, dataURL: dataURL, width: image.naturalWidth, height: image.naturalHeight }, info)]; + } + }); + }); + } + function getImageDataURL(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(getURLHost(url) === location.host)) return [3, 2]; + return [4, loadAsDataURL(url)]; + case 1: return [2, _a.sent()]; + case 2: return [4, bgFetch({ url: url, responseType: 'data-url' })]; + case 3: return [2, _a.sent()]; + } + }); + }); + } + function urlToImage(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2, new Promise(function (resolve, reject) { + var image = new Image(); + image.onload = function () { return resolve(image); }; + image.onerror = function () { return reject("Unable to load image " + url); }; + image.src = url; + })]; + }); + }); + } + function analyzeImage(image) { + var MAX_ANALIZE_PIXELS_COUNT = 32 * 32; + var naturalPixelsCount = image.naturalWidth * image.naturalHeight; + var k = Math.min(1, Math.sqrt(MAX_ANALIZE_PIXELS_COUNT / naturalPixelsCount)); + var width = Math.max(1, Math.round(image.naturalWidth * k)); + var height = Math.max(1, Math.round(image.naturalHeight * k)); + var canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + var context = canvas.getContext('2d'); + context.imageSmoothingEnabled = false; + context.drawImage(image, 0, 0, width, height); + var imageData = context.getImageData(0, 0, width, height); + var d = imageData.data; + var TRANSPARENT_ALPHA_THRESHOLD = 0.05; + var DARK_LIGHTNESS_THRESHOLD = 0.4; + var LIGHT_LIGHTNESS_THRESHOLD = 0.7; + var transparentPixelsCount = 0; + var darkPixelsCount = 0; + var lightPixelsCount = 0; + var i, x, y; + var r, g, b, a; + var l, min, max; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + i = 4 * (y * width + x); + r = d[i + 0] / 255; + g = d[i + 1] / 255; + b = d[i + 2] / 255; + a = d[i + 3] / 255; + if (a < TRANSPARENT_ALPHA_THRESHOLD) { + transparentPixelsCount++; + } + else { + min = Math.min(r, g, b); + max = Math.max(r, g, b); + l = (max + min) / 2; + if (l < DARK_LIGHTNESS_THRESHOLD) { + darkPixelsCount++; + } + if (l > LIGHT_LIGHTNESS_THRESHOLD) { + lightPixelsCount++; + } + } + } + } + var totalPixelsCount = width * height; + var opaquePixelsCount = totalPixelsCount - transparentPixelsCount; + var DARK_IMAGE_THRESHOLD = 0.7; + var LIGHT_IMAGE_THRESHOLD = 0.7; + var TRANSPARENT_IMAGE_THRESHOLD = 0.1; + var LARGE_IMAGE_PIXELS_COUNT = 800 * 600; + return { + isDark: ((darkPixelsCount / opaquePixelsCount) >= DARK_IMAGE_THRESHOLD), + isLight: ((lightPixelsCount / opaquePixelsCount) >= LIGHT_IMAGE_THRESHOLD), + isTransparent: ((transparentPixelsCount / totalPixelsCount) >= TRANSPARENT_IMAGE_THRESHOLD), + isLarge: (naturalPixelsCount >= LARGE_IMAGE_PIXELS_COUNT), + }; + } + function getFilteredImageDataURL(_a, filter) { + var dataURL = _a.dataURL, width = _a.width, height = _a.height; + var matrix = getSVGFilterMatrixValue(filter); + var svg = [ + "", + '', + '', + "", + '', + '', + "", + '', + ].join(''); + var bytes = new Uint8Array(svg.length); + for (var i = 0; i < svg.length; i++) { + bytes[i] = svg.charCodeAt(i); + } + var blob = new Blob([bytes], { type: 'image/svg+xml' }); + var objectURL = URL.createObjectURL(blob); + return objectURL; } - function getModifiableCSSDeclaration(property, value, rule, isCancelled) { - var important = Boolean(rule && rule.style && rule.style.getPropertyPriority(property)); - var sourceValue = value; - if (property.startsWith('--')) { - return null; - } - else if ((property.indexOf('color') >= 0 && property !== '-webkit-print-color-adjust') || - property === 'fill' || - property === 'stroke') { - var modifier = getColorModifier(property, value); - if (modifier) { - return { property: property, value: modifier, important: important, sourceValue: sourceValue }; - } - } - else if (property === 'background-image') { - var modifier = getBgImageModifier(property, value, rule, isCancelled); - if (modifier) { - return { property: property, value: modifier, important: important, sourceValue: sourceValue }; - } - } - else if (property.indexOf('shadow') >= 0) { - var modifier = getShadowModifier(property, value); - if (modifier) { - return { property: property, value: modifier, important: important, sourceValue: sourceValue }; - } - } - return null; - } - function getModifiedUserAgentStyle(filter, isIFrame) { - var lines = []; - if (!isIFrame) { - lines.push('html {'); - lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + " !important;"); - lines.push('}'); - } - lines.push((isIFrame ? '' : 'html, body, ') + "input, textarea, select, button {"); - lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); - lines.push('}'); - lines.push('html, body, input, textarea, select, button {'); - lines.push(" border-color: " + modifyBorderColor({ r: 76, g: 76, b: 76 }, filter) + ";"); - lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + ";"); - lines.push('}'); - lines.push('a {'); - lines.push(" color: " + modifyForegroundColor({ r: 0, g: 64, b: 255 }, filter) + ";"); - lines.push('}'); - lines.push('table {'); - lines.push(" border-color: " + modifyBorderColor({ r: 128, g: 128, b: 128 }, filter) + ";"); - lines.push('}'); - lines.push('::placeholder {'); - lines.push(" color: " + modifyForegroundColor({ r: 169, g: 169, b: 169 }, filter) + ";"); - lines.push('}'); - ['::selection', '::-moz-selection'].forEach(function (selection) { - lines.push(selection + " {"); - lines.push(" background-color: " + modifyBackgroundColor({ r: 0, g: 96, b: 212 }, filter) + ";"); - lines.push(" color: " + modifyForegroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); - lines.push('}'); - }); - lines.push('input:-webkit-autofill,'); - lines.push('textarea:-webkit-autofill,'); - lines.push('select:-webkit-autofill {'); - lines.push(" background-color: " + modifyBackgroundColor({ r: 250, g: 255, b: 189 }, filter) + " !important;"); - lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + " !important;"); - lines.push('}'); - if (!isMacOS()) { - lines.push('::-webkit-scrollbar {'); - lines.push(" background-color: " + modifyBackgroundColor({ r: 241, g: 241, b: 241 }, filter) + ";"); - lines.push(" color: " + modifyForegroundColor({ r: 96, g: 96, b: 96 }, filter) + ";"); - lines.push('}'); - lines.push('::-webkit-scrollbar-thumb {'); - lines.push(" background-color: " + modifyBackgroundColor({ r: 193, g: 193, b: 193 }, filter) + ";"); - lines.push('}'); - lines.push('::-webkit-scrollbar-thumb:hover {'); - lines.push(" background-color: " + modifyBackgroundColor({ r: 166, g: 166, b: 166 }, filter) + ";"); - lines.push('}'); - lines.push('::-webkit-scrollbar-thumb:active {'); - lines.push(" background-color: " + modifyBackgroundColor({ r: 96, g: 96, b: 96 }, filter) + ";"); - lines.push('}'); - lines.push('::-webkit-scrollbar-corner {'); - lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); - lines.push('}'); - lines.push('* {'); - lines.push(" scrollbar-color: " + modifyBackgroundColor({ r: 193, g: 193, b: 193 }, filter) + " " + modifyBackgroundColor({ r: 241, g: 241, b: 241 }, filter) + ";"); - lines.push('}'); - } - return lines.join('\n'); - } - function getModifiedFallbackStyle(filter, _a) { - var strict = _a.strict; - var lines = []; - lines.push("html, body, " + (strict ? 'body *' : 'body > *') + " {"); - lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + " !important;"); - lines.push(" border-color: " + modifyBorderColor({ r: 64, g: 64, b: 64 }, filter) + " !important;"); - lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + " !important;"); - lines.push('}'); - return lines.join('\n'); - } - var unparsableColors = new Set([ - 'inherit', - 'transparent', - 'initial', - 'currentcolor', - 'none', - ]); - var colorParseCache = new Map(); - function parseColorWithCache($color) { - $color = $color.trim(); - if (colorParseCache.has($color)) { - return colorParseCache.get($color); - } - var color = parse($color); - colorParseCache.set($color, color); - return color; - } - function tryParseColor($color) { - try { - return parseColorWithCache($color); - } - catch (err) { - return null; - } - } - function getColorModifier(prop, value) { - if (unparsableColors.has(value.toLowerCase())) { - return value; - } - try { - var rgb_1 = parseColorWithCache(value); - if (prop.indexOf('background') >= 0) { - return function (filter) { return modifyBackgroundColor(rgb_1, filter); }; - } - if (prop.indexOf('border') >= 0 || prop.indexOf('outline') >= 0) { - return function (filter) { return modifyBorderColor(rgb_1, filter); }; - } - return function (filter) { return modifyForegroundColor(rgb_1, filter); }; - } - catch (err) { - logWarn('Color parse error', err); - return null; - } - } - var gradientRegex = /[\-a-z]+gradient\(([^\(\)]*(\(([^\(\)]*(\(.*?\)))*[^\(\)]*\))){0,15}[^\(\)]*\)/g; - var imageDetailsCache = new Map(); - var awaitingForImageLoading = new Map(); - function getBgImageModifier(prop, value, rule, isCancelled) { - var _this = this; - try { - var gradients = getMatches(gradientRegex, value); - var urls = getMatches(cssURLRegex, value); - if (urls.length === 0 && gradients.length === 0) { - return value; - } - var getIndices = function (matches) { - var index = 0; - return matches.map(function (match) { - var valueIndex = value.indexOf(match, index); - index = valueIndex + match.length; - return { match: match, index: valueIndex }; - }); - }; - var matches_1 = getIndices(urls).map(function (i) { return (__assign({ type: 'url' }, i)); }) - .concat(getIndices(gradients).map(function (i) { return (__assign({ type: 'gradient' }, i)); })) - .sort(function (a, b) { return a.index - b.index; }); - var getGradientModifier_1 = function (gradient) { - var match = gradient.match(/^(.*-gradient)\((.*)\)$/); - var type = match[1]; - var content = match[2]; - var partsRegex = /([^\(\),]+(\([^\(\)]*(\([^\(\)]*\)*[^\(\)]*)?\))?[^\(\),]*),?/g; - var colorStopRegex = /^(from|color-stop|to)\(([^\(\)]*?,\s*)?(.*?)\)$/; - var parts = getMatches(partsRegex, content, 1).map(function (part) { - part = part.trim(); - var rgb = tryParseColor(part); - if (rgb) { - return function (filter) { return modifyGradientColor(rgb, filter); }; - } - var space = part.lastIndexOf(' '); - rgb = tryParseColor(part.substring(0, space)); - if (rgb) { - return function (filter) { return modifyGradientColor(rgb, filter) + " " + part.substring(space + 1); }; - } - var colorStopMatch = part.match(colorStopRegex); - if (colorStopMatch) { - rgb = tryParseColor(colorStopMatch[3]); - if (rgb) { - return function (filter) { return colorStopMatch[1] + "(" + (colorStopMatch[2] ? colorStopMatch[2] + ", " : '') + modifyGradientColor(rgb, filter) + ")"; }; - } - } - return function () { return part; }; - }); - return function (filter) { - return type + "(" + parts.map(function (modify) { return modify(filter); }).join(', ') + ")"; - }; - }; - var getURLModifier_1 = function (urlValue) { - var url = getCSSURLValue(urlValue); - if (rule.parentStyleSheet.href) { - var basePath = getCSSBaseBath(rule.parentStyleSheet.href); - url = getAbsoluteURL(basePath, url); - } - else if (rule.parentStyleSheet.ownerNode && rule.parentStyleSheet.ownerNode.baseURI) { - url = getAbsoluteURL(rule.parentStyleSheet.ownerNode.baseURI, url); - } - else { - url = getAbsoluteURL(location.origin, url); - } - var absoluteValue = "url(\"" + url + "\")"; - return function (filter) { return __awaiter(_this, void 0, void 0, function () { - var imageDetails, awaiters_1, err_1, bgImageValue; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!imageDetailsCache.has(url)) return [3, 1]; - imageDetails = imageDetailsCache.get(url); - return [3, 7]; - case 1: - _a.trys.push([1, 6, , 7]); - if (!awaitingForImageLoading.has(url)) return [3, 3]; - awaiters_1 = awaitingForImageLoading.get(url); - return [4, new Promise(function (resolve) { return awaiters_1.push(resolve); })]; - case 2: - imageDetails = _a.sent(); - if (!imageDetails) { - return [2, null]; - } - return [3, 5]; - case 3: - awaitingForImageLoading.set(url, []); - return [4, getImageDetails(url)]; - case 4: - imageDetails = _a.sent(); - imageDetailsCache.set(url, imageDetails); - awaitingForImageLoading.get(url).forEach(function (resolve) { return resolve(imageDetails); }); - awaitingForImageLoading.delete(url); - _a.label = 5; - case 5: - if (isCancelled()) { - return [2, null]; - } - return [3, 7]; - case 6: - err_1 = _a.sent(); - logWarn(err_1); - if (awaitingForImageLoading.has(url)) { - awaitingForImageLoading.get(url).forEach(function (resolve) { return resolve(null); }); - awaitingForImageLoading.delete(url); - } - return [2, absoluteValue]; - case 7: - bgImageValue = getBgImageValue_1(imageDetails, filter) || absoluteValue; - return [2, bgImageValue]; - } - }); - }); }; - }; - var getBgImageValue_1 = function (imageDetails, filter) { - var isDark = imageDetails.isDark, isLight = imageDetails.isLight, isTransparent = imageDetails.isTransparent, isLarge = imageDetails.isLarge, width = imageDetails.width; - var result; - if (isDark && isTransparent && filter.mode === 1 && !isLarge && width > 2) { - logInfo("Inverting dark image " + imageDetails.src); - var inverted = getFilteredImageDataURL(imageDetails, __assign({}, filter, { sepia: clamp(filter.sepia + 10, 0, 100) })); - result = "url(\"" + inverted + "\")"; - } - else if (isLight && !isTransparent && filter.mode === 1) { - if (isLarge) { - result = 'none'; - } - else { - logInfo("Dimming light image " + imageDetails.src); - var dimmed = getFilteredImageDataURL(imageDetails, filter); - result = "url(\"" + dimmed + "\")"; - } - } - else if (filter.mode === 0 && isLight && !isLarge) { - logInfo("Applying filter to image " + imageDetails.src); - var filtered = getFilteredImageDataURL(imageDetails, __assign({}, filter, { brightness: clamp(filter.brightness - 10, 5, 200), sepia: clamp(filter.sepia + 10, 0, 100) })); - result = "url(\"" + filtered + "\")"; - } - else { - result = null; - } - return result; - }; - var modifiers_1 = []; - var index_1 = 0; - matches_1.forEach(function (_a, i) { - var match = _a.match, type = _a.type, matchStart = _a.index; - var prefixStart = index_1; - var matchEnd = matchStart + match.length; - index_1 = matchEnd; - modifiers_1.push(function () { return value.substring(prefixStart, matchStart); }); - modifiers_1.push(type === 'url' ? getURLModifier_1(match) : getGradientModifier_1(match)); - if (i === matches_1.length - 1) { - modifiers_1.push(function () { return value.substring(matchEnd); }); - } - }); - return function (filter) { - var results = modifiers_1.map(function (modify) { return modify(filter); }); - if (results.some(function (r) { return r instanceof Promise; })) { - return Promise.all(results) - .then(function (asyncResults) { - return asyncResults.join(''); - }); - } - return results.join(''); - }; - } - catch (err) { - logWarn("Unable to parse gradient " + value, err); - return null; - } - } - function getShadowModifier(prop, value) { - try { - var index_2 = 0; - var colorMatches_1 = getMatches(/(^|\s)([a-z]+\(.+?\)|#[0-9a-f]+|[a-z]+)(.*?(inset|outset)?($|,))/ig, value, 2); - var modifiers_2 = colorMatches_1.map(function (match, i) { - var prefixIndex = index_2; - var matchIndex = value.indexOf(match, index_2); - var matchEnd = matchIndex + match.length; - index_2 = matchEnd; - var rgb = tryParseColor(match); - if (!rgb) { - return function () { return value.substring(prefixIndex, matchEnd); }; - } - return function (filter) { return "" + value.substring(prefixIndex, matchIndex) + modifyShadowColor(rgb, filter) + (i === colorMatches_1.length - 1 ? value.substring(matchEnd) : ''); }; - }); - return function (filter) { return modifiers_2.map(function (modify) { return modify(filter); }).join(''); }; - } - catch (err) { - logWarn("Unable to parse shadow " + value, err); - return null; - } - } - function cleanModificationCache() { - colorParseCache.clear(); - clearColorModificationCache(); - imageDetailsCache.clear(); - awaitingForImageLoading.clear(); + function getModifiableCSSDeclaration(property, value, rule, isCancelled) { + var important = Boolean(rule && rule.style && rule.style.getPropertyPriority(property)); + var sourceValue = value; + if (property.startsWith('--')) { + return null; + } + else if ((property.indexOf('color') >= 0 && property !== '-webkit-print-color-adjust') || + property === 'fill' || + property === 'stroke') { + var modifier = getColorModifier(property, value); + if (modifier) { + return { property: property, value: modifier, important: important, sourceValue: sourceValue }; + } + } + else if (property === 'background-image') { + var modifier = getBgImageModifier(property, value, rule, isCancelled); + if (modifier) { + return { property: property, value: modifier, important: important, sourceValue: sourceValue }; + } + } + else if (property.indexOf('shadow') >= 0) { + var modifier = getShadowModifier(property, value); + if (modifier) { + return { property: property, value: modifier, important: important, sourceValue: sourceValue }; + } + } + return null; + } + function getModifiedUserAgentStyle(filter, isIFrame) { + var lines = []; + if (!isIFrame) { + lines.push('html {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + " !important;"); + lines.push('}'); + } + lines.push((isIFrame ? '' : 'html, body, ') + "input, textarea, select, button {"); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); + lines.push('}'); + lines.push('html, body, input, textarea, select, button {'); + lines.push(" border-color: " + modifyBorderColor({ r: 76, g: 76, b: 76 }, filter) + ";"); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + ";"); + lines.push('}'); + lines.push('a {'); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 64, b: 255 }, filter) + ";"); + lines.push('}'); + lines.push('table {'); + lines.push(" border-color: " + modifyBorderColor({ r: 128, g: 128, b: 128 }, filter) + ";"); + lines.push('}'); + lines.push('::placeholder {'); + lines.push(" color: " + modifyForegroundColor({ r: 169, g: 169, b: 169 }, filter) + ";"); + lines.push('}'); + ['::selection', '::-moz-selection'].forEach(function (selection) { + lines.push(selection + " {"); + lines.push(" background-color: " + modifyBackgroundColor({ r: 0, g: 96, b: 212 }, filter) + ";"); + lines.push(" color: " + modifyForegroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); + lines.push('}'); + }); + lines.push('input:-webkit-autofill,'); + lines.push('textarea:-webkit-autofill,'); + lines.push('select:-webkit-autofill {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 250, g: 255, b: 189 }, filter) + " !important;"); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + " !important;"); + lines.push('}'); + if (!isMacOS()) { + lines.push('::-webkit-scrollbar {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 241, g: 241, b: 241 }, filter) + ";"); + lines.push(" color: " + modifyForegroundColor({ r: 96, g: 96, b: 96 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-thumb {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 193, g: 193, b: 193 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-thumb:hover {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 166, g: 166, b: 166 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-thumb:active {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 96, g: 96, b: 96 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-corner {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); + lines.push('}'); + lines.push('* {'); + lines.push(" scrollbar-color: " + modifyBackgroundColor({ r: 193, g: 193, b: 193 }, filter) + " " + modifyBackgroundColor({ r: 241, g: 241, b: 241 }, filter) + ";"); + lines.push('}'); + } + return lines.join('\n'); + } + function getModifiedFallbackStyle(filter, _a) { + var strict = _a.strict; + var lines = []; + lines.push("html, body, " + (strict ? 'body *' : 'body > *') + " {"); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + " !important;"); + lines.push(" border-color: " + modifyBorderColor({ r: 64, g: 64, b: 64 }, filter) + " !important;"); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + " !important;"); + lines.push('}'); + return lines.join('\n'); + } + var unparsableColors = new Set([ + 'inherit', + 'transparent', + 'initial', + 'currentcolor', + 'none', + ]); + var colorParseCache = new Map(); + function parseColorWithCache($color) { + $color = $color.trim(); + if (colorParseCache.has($color)) { + return colorParseCache.get($color); + } + var color = parse($color); + colorParseCache.set($color, color); + return color; + } + function tryParseColor($color) { + try { + return parseColorWithCache($color); + } + catch (err) { + return null; + } + } + function getColorModifier(prop, value) { + if (unparsableColors.has(value.toLowerCase())) { + return value; + } + try { + var rgb_1 = parseColorWithCache(value); + if (prop.indexOf('background') >= 0) { + return function (filter) { return modifyBackgroundColor(rgb_1, filter); }; + } + if (prop.indexOf('border') >= 0 || prop.indexOf('outline') >= 0) { + return function (filter) { return modifyBorderColor(rgb_1, filter); }; + } + return function (filter) { return modifyForegroundColor(rgb_1, filter); }; + } + catch (err) { + logWarn('Color parse error', err); + return null; + } + } + var gradientRegex = /[\-a-z]+gradient\(([^\(\)]*(\(([^\(\)]*(\(.*?\)))*[^\(\)]*\))){0,15}[^\(\)]*\)/g; + var imageDetailsCache = new Map(); + var awaitingForImageLoading = new Map(); + function getBgImageModifier(prop, value, rule, isCancelled) { + var _this = this; + try { + var gradients = getMatches(gradientRegex, value); + var urls = getMatches(cssURLRegex, value); + if (urls.length === 0 && gradients.length === 0) { + return value; + } + var getIndices = function (matches) { + var index = 0; + return matches.map(function (match) { + var valueIndex = value.indexOf(match, index); + index = valueIndex + match.length; + return { match: match, index: valueIndex }; + }); + }; + var matches_1 = getIndices(urls).map(function (i) { return (__assign({ type: 'url' }, i)); }) + .concat(getIndices(gradients).map(function (i) { return (__assign({ type: 'gradient' }, i)); })) + .sort(function (a, b) { return a.index - b.index; }); + var getGradientModifier_1 = function (gradient) { + var match = gradient.match(/^(.*-gradient)\((.*)\)$/); + var type = match[1]; + var content = match[2]; + var partsRegex = /([^\(\),]+(\([^\(\)]*(\([^\(\)]*\)*[^\(\)]*)?\))?[^\(\),]*),?/g; + var colorStopRegex = /^(from|color-stop|to)\(([^\(\)]*?,\s*)?(.*?)\)$/; + var parts = getMatches(partsRegex, content, 1).map(function (part) { + part = part.trim(); + var rgb = tryParseColor(part); + if (rgb) { + return function (filter) { return modifyGradientColor(rgb, filter); }; + } + var space = part.lastIndexOf(' '); + rgb = tryParseColor(part.substring(0, space)); + if (rgb) { + return function (filter) { return modifyGradientColor(rgb, filter) + " " + part.substring(space + 1); }; + } + var colorStopMatch = part.match(colorStopRegex); + if (colorStopMatch) { + rgb = tryParseColor(colorStopMatch[3]); + if (rgb) { + return function (filter) { return colorStopMatch[1] + "(" + (colorStopMatch[2] ? colorStopMatch[2] + ", " : '') + modifyGradientColor(rgb, filter) + ")"; }; + } + } + return function () { return part; }; + }); + return function (filter) { + return type + "(" + parts.map(function (modify) { return modify(filter); }).join(', ') + ")"; + }; + }; + var getURLModifier_1 = function (urlValue) { + var url = getCSSURLValue(urlValue); + if (rule.parentStyleSheet.href) { + var basePath = getCSSBaseBath(rule.parentStyleSheet.href); + url = getAbsoluteURL(basePath, url); + } + else if (rule.parentStyleSheet.ownerNode && rule.parentStyleSheet.ownerNode.baseURI) { + url = getAbsoluteURL(rule.parentStyleSheet.ownerNode.baseURI, url); + } + else { + url = getAbsoluteURL(location.origin, url); + } + var absoluteValue = "url(\"" + url + "\")"; + return function (filter) { return __awaiter(_this, void 0, void 0, function () { + var imageDetails, awaiters_1, err_1, bgImageValue; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!imageDetailsCache.has(url)) return [3, 1]; + imageDetails = imageDetailsCache.get(url); + return [3, 7]; + case 1: + _a.trys.push([1, 6, , 7]); + if (!awaitingForImageLoading.has(url)) return [3, 3]; + awaiters_1 = awaitingForImageLoading.get(url); + return [4, new Promise(function (resolve) { return awaiters_1.push(resolve); })]; + case 2: + imageDetails = _a.sent(); + if (!imageDetails) { + return [2, null]; + } + return [3, 5]; + case 3: + awaitingForImageLoading.set(url, []); + return [4, getImageDetails(url)]; + case 4: + imageDetails = _a.sent(); + imageDetailsCache.set(url, imageDetails); + awaitingForImageLoading.get(url).forEach(function (resolve) { return resolve(imageDetails); }); + awaitingForImageLoading.delete(url); + _a.label = 5; + case 5: + if (isCancelled()) { + return [2, null]; + } + return [3, 7]; + case 6: + err_1 = _a.sent(); + logWarn(err_1); + if (awaitingForImageLoading.has(url)) { + awaitingForImageLoading.get(url).forEach(function (resolve) { return resolve(null); }); + awaitingForImageLoading.delete(url); + } + return [2, absoluteValue]; + case 7: + bgImageValue = getBgImageValue_1(imageDetails, filter) || absoluteValue; + return [2, bgImageValue]; + } + }); + }); }; + }; + var getBgImageValue_1 = function (imageDetails, filter) { + var isDark = imageDetails.isDark, isLight = imageDetails.isLight, isTransparent = imageDetails.isTransparent, isLarge = imageDetails.isLarge, width = imageDetails.width; + var result; + if (isDark && isTransparent && filter.mode === 1 && !isLarge && width > 2) { + logInfo("Inverting dark image " + imageDetails.src); + var inverted = getFilteredImageDataURL(imageDetails, __assign({}, filter, { sepia: clamp(filter.sepia + 10, 0, 100) })); + result = "url(\"" + inverted + "\")"; + } + else if (isLight && !isTransparent && filter.mode === 1) { + if (isLarge) { + result = 'none'; + } + else { + logInfo("Dimming light image " + imageDetails.src); + var dimmed = getFilteredImageDataURL(imageDetails, filter); + result = "url(\"" + dimmed + "\")"; + } + } + else if (filter.mode === 0 && isLight && !isLarge) { + logInfo("Applying filter to image " + imageDetails.src); + var filtered = getFilteredImageDataURL(imageDetails, __assign({}, filter, { brightness: clamp(filter.brightness - 10, 5, 200), sepia: clamp(filter.sepia + 10, 0, 100) })); + result = "url(\"" + filtered + "\")"; + } + else { + result = null; + } + return result; + }; + var modifiers_1 = []; + var index_1 = 0; + matches_1.forEach(function (_a, i) { + var match = _a.match, type = _a.type, matchStart = _a.index; + var prefixStart = index_1; + var matchEnd = matchStart + match.length; + index_1 = matchEnd; + modifiers_1.push(function () { return value.substring(prefixStart, matchStart); }); + modifiers_1.push(type === 'url' ? getURLModifier_1(match) : getGradientModifier_1(match)); + if (i === matches_1.length - 1) { + modifiers_1.push(function () { return value.substring(matchEnd); }); + } + }); + return function (filter) { + var results = modifiers_1.map(function (modify) { return modify(filter); }); + if (results.some(function (r) { return r instanceof Promise; })) { + return Promise.all(results) + .then(function (asyncResults) { + return asyncResults.join(''); + }); + } + return results.join(''); + }; + } + catch (err) { + logWarn("Unable to parse gradient " + value, err); + return null; + } + } + function getShadowModifier(prop, value) { + try { + var index_2 = 0; + var colorMatches_1 = getMatches(/(^|\s)([a-z]+\(.+?\)|#[0-9a-f]+|[a-z]+)(.*?(inset|outset)?($|,))/ig, value, 2); + var modifiers_2 = colorMatches_1.map(function (match, i) { + var prefixIndex = index_2; + var matchIndex = value.indexOf(match, index_2); + var matchEnd = matchIndex + match.length; + index_2 = matchEnd; + var rgb = tryParseColor(match); + if (!rgb) { + return function () { return value.substring(prefixIndex, matchEnd); }; + } + return function (filter) { return "" + value.substring(prefixIndex, matchIndex) + modifyShadowColor(rgb, filter) + (i === colorMatches_1.length - 1 ? value.substring(matchEnd) : ''); }; + }); + return function (filter) { return modifiers_2.map(function (modify) { return modify(filter); }).join(''); }; + } + catch (err) { + logWarn("Unable to parse shadow " + value, err); + return null; + } + } + function cleanModificationCache() { + colorParseCache.clear(); + clearColorModificationCache(); + imageDetailsCache.clear(); + awaitingForImageLoading.clear(); } - var overrides = { - 'background-color': { - customProp: '--darkreader-inline-bgcolor', - cssProp: 'background-color', - dataAttr: 'data-darkreader-inline-bgcolor', - store: new WeakSet(), - }, - 'background-image': { - customProp: '--darkreader-inline-bgimage', - cssProp: 'background-image', - dataAttr: 'data-darkreader-inline-bgimage', - store: new WeakSet(), - }, - 'border-color': { - customProp: '--darkreader-inline-border', - cssProp: 'border-color', - dataAttr: 'data-darkreader-inline-border', - store: new WeakSet(), - }, - 'border-bottom-color': { - customProp: '--darkreader-inline-border-bottom', - cssProp: 'border-bottom-color', - dataAttr: 'data-darkreader-inline-border-bottom', - store: new WeakSet(), - }, - 'border-left-color': { - customProp: '--darkreader-inline-border-left', - cssProp: 'border-left-color', - dataAttr: 'data-darkreader-inline-border-left', - store: new WeakSet(), - }, - 'border-right-color': { - customProp: '--darkreader-inline-border-right', - cssProp: 'border-right-color', - dataAttr: 'data-darkreader-inline-border-right', - store: new WeakSet(), - }, - 'border-top-color': { - customProp: '--darkreader-inline-border-top', - cssProp: 'border-top-color', - dataAttr: 'data-darkreader-inline-border-top', - store: new WeakSet(), - }, - 'box-shadow': { - customProp: '--darkreader-inline-boxshadow', - cssProp: 'box-shadow', - dataAttr: 'data-darkreader-inline-boxshadow', - store: new WeakSet(), - }, - 'color': { - customProp: '--darkreader-inline-color', - cssProp: 'color', - dataAttr: 'data-darkreader-inline-color', - store: new WeakSet(), - }, - 'fill': { - customProp: '--darkreader-inline-fill', - cssProp: 'fill', - dataAttr: 'data-darkreader-inline-fill', - store: new WeakSet(), - }, - 'stroke': { - customProp: '--darkreader-inline-stroke', - cssProp: 'stroke', - dataAttr: 'data-darkreader-inline-stroke', - store: new WeakSet(), - }, - 'outline-color': { - customProp: '--darkreader-inline-outline', - cssProp: 'outline-color', - dataAttr: 'data-darkreader-inline-outline', - store: new WeakSet(), - }, - }; - var overridesList = Object.values(overrides); - var INLINE_STYLE_ATTRS = ['style', 'fill', 'stroke', 'bgcolor', 'color']; - var INLINE_STYLE_SELECTOR = INLINE_STYLE_ATTRS.map(function (attr) { return "[" + attr + "]"; }).join(', '); - function getInlineOverrideStyle() { - return overridesList.map(function (_a) { - var dataAttr = _a.dataAttr, customProp = _a.customProp, cssProp = _a.cssProp; - return [ - "[" + dataAttr + "] {", - " " + cssProp + ": var(" + customProp + ") !important;", - '}', - ].join('\n'); - }).join('\n'); - } - var observer = null; - function expand(nodes, selector) { - var results = []; - nodes.forEach(function (n) { - if (n instanceof Element) { - if (n.matches(selector)) { - results.push(n); - } - results.push.apply(results, Array.from(n.querySelectorAll(selector))); - } - }); - return results; - } - function watchForInlineStyles(elementStyleDidChange) { - if (observer) { - observer.disconnect(); - } - observer = new MutationObserver(function (mutations) { - mutations.forEach(function (m) { - var createdInlineStyles = expand(Array.from(m.addedNodes), INLINE_STYLE_SELECTOR); - if (createdInlineStyles.length > 0) { - createdInlineStyles.forEach(function (el) { return elementStyleDidChange(el); }); - } - if (m.type === 'attributes') { - if (INLINE_STYLE_ATTRS.includes(m.attributeName)) { - elementStyleDidChange(m.target); - } - overridesList - .filter(function (_a) { - var store = _a.store, dataAttr = _a.dataAttr; - return store.has(m.target) && !m.target.hasAttribute(dataAttr); - }) - .forEach(function (_a) { - var dataAttr = _a.dataAttr; - return m.target.setAttribute(dataAttr, ''); - }); - } - }); - }); - observer.observe(document, { - childList: true, - subtree: true, - attributes: true, - attributeFilter: INLINE_STYLE_ATTRS.concat(overridesList.map(function (_a) { - var dataAttr = _a.dataAttr; - return dataAttr; - })), - }); - } - function stopWatchingForInlineStyles() { - if (observer) { - observer.disconnect(); - observer = null; - } - } - var inlineStyleCache = new WeakMap(); - var filterProps = ['brightness', 'contrast', 'grayscale', 'sepia', 'mode']; - function getInlineStyleCacheKey(el, theme) { - return INLINE_STYLE_ATTRS - .map(function (attr) { return attr + "=\"" + el.getAttribute(attr) + "\""; }) - .concat(filterProps.map(function (prop) { return prop + "=\"" + theme[prop] + "\""; })) - .join(' '); - } - function overrideInlineStyle(element, theme) { - var cacheKey = getInlineStyleCacheKey(element, theme); - if (cacheKey === inlineStyleCache.get(element)) { - return; - } - var unsetProps = new Set(Object.keys(overrides)); - function setCustomProp(targetCSSProp, modifierCSSProp, cssVal) { - var _a = overrides[targetCSSProp], customProp = _a.customProp, dataAttr = _a.dataAttr; - var mod = getModifiableCSSDeclaration(modifierCSSProp, cssVal, null, null); - if (!mod) { - return; - } - var value = mod.value; - if (typeof value === 'function') { - value = value(theme); - } - element.style.setProperty(customProp, value); - if (!element.hasAttribute(dataAttr)) { - element.setAttribute(dataAttr, ''); - } - unsetProps.delete(targetCSSProp); - } - if (element.hasAttribute('bgcolor')) { - var value = element.getAttribute('bgcolor'); - if (value.match(/^[0-9a-f]{3}$/i) || value.match(/^[0-9a-f]{6}$/i)) { - value = "#" + value; - } - setCustomProp('background-color', 'background-color', value); - } - if (element.hasAttribute('color')) { - var value = element.getAttribute('color'); - if (value.match(/^[0-9a-f]{3}$/i) || value.match(/^[0-9a-f]{6}$/i)) { - value = "#" + value; - } - setCustomProp('color', 'color', value); - } - if (element.hasAttribute('fill') && element instanceof SVGElement) { - var SMALL_SVG_LIMIT = 32; - var value = element.getAttribute('fill'); - var isBg = false; - if (!(element instanceof SVGTextElement)) { - var _a = element.getBoundingClientRect(), width = _a.width, height = _a.height; - isBg = (width > SMALL_SVG_LIMIT || height > SMALL_SVG_LIMIT); - } - setCustomProp('fill', isBg ? 'background-color' : 'color', value); - } - if (element.hasAttribute('stroke')) { - var value = element.getAttribute('stroke'); - setCustomProp('stroke', element instanceof SVGLineElement || element instanceof SVGTextElement ? 'border-color' : 'color', value); - } - element.style && iterateCSSDeclarations(element.style, function (property, value) { - if (property === 'background-image' && value.indexOf('url') >= 0) { - return; - } - if (overrides.hasOwnProperty(property)) { - setCustomProp(property, property, value); - } - }); - if (element.style && element instanceof SVGTextElement && element.style.fill) { - setCustomProp('fill', 'color', element.style.getPropertyValue('fill')); - } - Array.from(unsetProps).forEach(function (cssProp) { - var _a = overrides[cssProp], store = _a.store, dataAttr = _a.dataAttr; - store.delete(element); - element.removeAttribute(dataAttr); - }); - inlineStyleCache.set(element, getInlineStyleCacheKey(element, theme)); + var overrides = { + 'background-color': { + customProp: '--darkreader-inline-bgcolor', + cssProp: 'background-color', + dataAttr: 'data-darkreader-inline-bgcolor', + store: new WeakSet(), + }, + 'background-image': { + customProp: '--darkreader-inline-bgimage', + cssProp: 'background-image', + dataAttr: 'data-darkreader-inline-bgimage', + store: new WeakSet(), + }, + 'border-color': { + customProp: '--darkreader-inline-border', + cssProp: 'border-color', + dataAttr: 'data-darkreader-inline-border', + store: new WeakSet(), + }, + 'border-bottom-color': { + customProp: '--darkreader-inline-border-bottom', + cssProp: 'border-bottom-color', + dataAttr: 'data-darkreader-inline-border-bottom', + store: new WeakSet(), + }, + 'border-left-color': { + customProp: '--darkreader-inline-border-left', + cssProp: 'border-left-color', + dataAttr: 'data-darkreader-inline-border-left', + store: new WeakSet(), + }, + 'border-right-color': { + customProp: '--darkreader-inline-border-right', + cssProp: 'border-right-color', + dataAttr: 'data-darkreader-inline-border-right', + store: new WeakSet(), + }, + 'border-top-color': { + customProp: '--darkreader-inline-border-top', + cssProp: 'border-top-color', + dataAttr: 'data-darkreader-inline-border-top', + store: new WeakSet(), + }, + 'box-shadow': { + customProp: '--darkreader-inline-boxshadow', + cssProp: 'box-shadow', + dataAttr: 'data-darkreader-inline-boxshadow', + store: new WeakSet(), + }, + 'color': { + customProp: '--darkreader-inline-color', + cssProp: 'color', + dataAttr: 'data-darkreader-inline-color', + store: new WeakSet(), + }, + 'fill': { + customProp: '--darkreader-inline-fill', + cssProp: 'fill', + dataAttr: 'data-darkreader-inline-fill', + store: new WeakSet(), + }, + 'stroke': { + customProp: '--darkreader-inline-stroke', + cssProp: 'stroke', + dataAttr: 'data-darkreader-inline-stroke', + store: new WeakSet(), + }, + 'outline-color': { + customProp: '--darkreader-inline-outline', + cssProp: 'outline-color', + dataAttr: 'data-darkreader-inline-outline', + store: new WeakSet(), + }, + }; + var overridesList = Object.values(overrides); + var INLINE_STYLE_ATTRS = ['style', 'fill', 'stroke', 'bgcolor', 'color']; + var INLINE_STYLE_SELECTOR = INLINE_STYLE_ATTRS.map(function (attr) { return "[" + attr + "]"; }).join(', '); + function getInlineOverrideStyle() { + return overridesList.map(function (_a) { + var dataAttr = _a.dataAttr, customProp = _a.customProp, cssProp = _a.cssProp; + return [ + "[" + dataAttr + "] {", + " " + cssProp + ": var(" + customProp + ") !important;", + '}', + ].join('\n'); + }).join('\n'); + } + var observer = null; + function expand(nodes, selector) { + var results = []; + nodes.forEach(function (n) { + if (n instanceof Element) { + if (n.matches(selector)) { + results.push(n); + } + results.push.apply(results, Array.from(n.querySelectorAll(selector))); + } + }); + return results; + } + function watchForInlineStyles(elementStyleDidChange) { + if (observer) { + observer.disconnect(); + } + observer = new MutationObserver(function (mutations) { + mutations.forEach(function (m) { + var createdInlineStyles = expand(Array.from(m.addedNodes), INLINE_STYLE_SELECTOR); + if (createdInlineStyles.length > 0) { + createdInlineStyles.forEach(function (el) { return elementStyleDidChange(el); }); + } + if (m.type === 'attributes') { + if (INLINE_STYLE_ATTRS.includes(m.attributeName)) { + elementStyleDidChange(m.target); + } + overridesList + .filter(function (_a) { + var store = _a.store, dataAttr = _a.dataAttr; + return store.has(m.target) && !m.target.hasAttribute(dataAttr); + }) + .forEach(function (_a) { + var dataAttr = _a.dataAttr; + return m.target.setAttribute(dataAttr, ''); + }); + } + }); + }); + observer.observe(document, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: INLINE_STYLE_ATTRS.concat(overridesList.map(function (_a) { + var dataAttr = _a.dataAttr; + return dataAttr; + })), + }); + } + function stopWatchingForInlineStyles() { + if (observer) { + observer.disconnect(); + observer = null; + } + } + var inlineStyleCache = new WeakMap(); + var filterProps = ['brightness', 'contrast', 'grayscale', 'sepia', 'mode']; + function getInlineStyleCacheKey(el, theme) { + return INLINE_STYLE_ATTRS + .map(function (attr) { return attr + "=\"" + el.getAttribute(attr) + "\""; }) + .concat(filterProps.map(function (prop) { return prop + "=\"" + theme[prop] + "\""; })) + .join(' '); + } + function overrideInlineStyle(element, theme) { + var cacheKey = getInlineStyleCacheKey(element, theme); + if (cacheKey === inlineStyleCache.get(element)) { + return; + } + var unsetProps = new Set(Object.keys(overrides)); + function setCustomProp(targetCSSProp, modifierCSSProp, cssVal) { + var _a = overrides[targetCSSProp], customProp = _a.customProp, dataAttr = _a.dataAttr; + var mod = getModifiableCSSDeclaration(modifierCSSProp, cssVal, null, null); + if (!mod) { + return; + } + var value = mod.value; + if (typeof value === 'function') { + value = value(theme); + } + element.style.setProperty(customProp, value); + if (!element.hasAttribute(dataAttr)) { + element.setAttribute(dataAttr, ''); + } + unsetProps.delete(targetCSSProp); + } + if (element.hasAttribute('bgcolor')) { + var value = element.getAttribute('bgcolor'); + if (value.match(/^[0-9a-f]{3}$/i) || value.match(/^[0-9a-f]{6}$/i)) { + value = "#" + value; + } + setCustomProp('background-color', 'background-color', value); + } + if (element.hasAttribute('color')) { + var value = element.getAttribute('color'); + if (value.match(/^[0-9a-f]{3}$/i) || value.match(/^[0-9a-f]{6}$/i)) { + value = "#" + value; + } + setCustomProp('color', 'color', value); + } + if (element.hasAttribute('fill') && element instanceof SVGElement) { + var SMALL_SVG_LIMIT = 32; + var value = element.getAttribute('fill'); + var isBg = false; + if (!(element instanceof SVGTextElement)) { + var _a = element.getBoundingClientRect(), width = _a.width, height = _a.height; + isBg = (width > SMALL_SVG_LIMIT || height > SMALL_SVG_LIMIT); + } + setCustomProp('fill', isBg ? 'background-color' : 'color', value); + } + if (element.hasAttribute('stroke')) { + var value = element.getAttribute('stroke'); + setCustomProp('stroke', element instanceof SVGLineElement || element instanceof SVGTextElement ? 'border-color' : 'color', value); + } + element.style && iterateCSSDeclarations(element.style, function (property, value) { + if (property === 'background-image' && value.indexOf('url') >= 0) { + return; + } + if (overrides.hasOwnProperty(property)) { + setCustomProp(property, property, value); + } + }); + if (element.style && element instanceof SVGTextElement && element.style.fill) { + setCustomProp('fill', 'color', element.style.getPropertyValue('fill')); + } + Array.from(unsetProps).forEach(function (cssProp) { + var _a = overrides[cssProp], store = _a.store, dataAttr = _a.dataAttr; + store.delete(element); + element.removeAttribute(dataAttr); + }); + inlineStyleCache.set(element, getInlineStyleCacheKey(element, theme)); } - var metaThemeColorName = 'theme-color'; - var metaThemeColorSelector = "meta[name=\"" + metaThemeColorName + "\"]"; - var srcMetaThemeColor = null; - var observer$1 = null; - function changeMetaThemeColor(meta, theme) { - srcMetaThemeColor = srcMetaThemeColor || meta.content; - try { - var color = parse(srcMetaThemeColor); - meta.content = modifyBackgroundColor(color, theme); - } - catch (err) { - logWarn(err); - } - } - function changeMetaThemeColorWhenAvailable(theme) { - var meta = document.querySelector(metaThemeColorSelector); - if (meta) { - changeMetaThemeColor(meta, theme); - } - else { - if (observer$1) { - observer$1.disconnect(); - } - observer$1 = new MutationObserver(function (mutations) { - loop: for (var _i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) { - var m = mutations_1[_i]; - for (var _a = 0, _b = Array.from(m.addedNodes); _a < _b.length; _a++) { - var node = _b[_a]; - if (node instanceof HTMLMetaElement && node.name === metaThemeColorName) { - observer$1.disconnect(); - observer$1 = null; - changeMetaThemeColor(node, theme); - break loop; - } - } - } - }); - observer$1.observe(document.head, { childList: true }); - } - } - function restoreMetaThemeColor() { - if (observer$1) { - observer$1.disconnect(); - observer$1 = null; - } - var meta = document.querySelector(metaThemeColorSelector); - if (meta && srcMetaThemeColor) { - meta.content = srcMetaThemeColor; - } + var metaThemeColorName = 'theme-color'; + var metaThemeColorSelector = "meta[name=\"" + metaThemeColorName + "\"]"; + var srcMetaThemeColor = null; + var observer$1 = null; + function changeMetaThemeColor(meta, theme) { + srcMetaThemeColor = srcMetaThemeColor || meta.content; + try { + var color = parse(srcMetaThemeColor); + meta.content = modifyBackgroundColor(color, theme); + } + catch (err) { + logWarn(err); + } + } + function changeMetaThemeColorWhenAvailable(theme) { + var meta = document.querySelector(metaThemeColorSelector); + if (meta) { + changeMetaThemeColor(meta, theme); + } + else { + if (observer$1) { + observer$1.disconnect(); + } + observer$1 = new MutationObserver(function (mutations) { + loop: for (var _i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) { + var m = mutations_1[_i]; + for (var _a = 0, _b = Array.from(m.addedNodes); _a < _b.length; _a++) { + var node = _b[_a]; + if (node instanceof HTMLMetaElement && node.name === metaThemeColorName) { + observer$1.disconnect(); + observer$1 = null; + changeMetaThemeColor(node, theme); + break loop; + } + } + } + }); + observer$1.observe(document.head, { childList: true }); + } + } + function restoreMetaThemeColor() { + if (observer$1) { + observer$1.disconnect(); + observer$1 = null; + } + var meta = document.querySelector(metaThemeColorSelector); + if (meta && srcMetaThemeColor) { + meta.content = srcMetaThemeColor; + } } - function throttle(callback) { - var pending = false; - var frameId = null; - var lastArgs; - var throttled = (function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - lastArgs = args; - if (frameId) { - pending = true; - } - else { - callback.apply(void 0, lastArgs); - frameId = requestAnimationFrame(function () { - frameId = null; - if (pending) { - callback.apply(void 0, lastArgs); - pending = false; - } - }); - } - }); - var cancel = function () { - cancelAnimationFrame(frameId); - pending = false; - frameId = null; - }; - return Object.assign(throttled, { cancel: cancel }); - } - function createAsyncTasksQueue() { - var tasks = []; - var frameId = null; - function runTasks() { - var task; - while (task = tasks.shift()) { - task(); - } - frameId = null; - } - function add(task) { - tasks.push(task); - if (!frameId) { - frameId = requestAnimationFrame(runTasks); - } - } - function cancel() { - tasks.splice(0); - cancelAnimationFrame(frameId); - frameId = null; - } - return { add: add, cancel: cancel }; + function throttle(callback) { + var pending = false; + var frameId = null; + var lastArgs; + var throttled = (function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + lastArgs = args; + if (frameId) { + pending = true; + } + else { + callback.apply(void 0, lastArgs); + frameId = requestAnimationFrame(function () { + frameId = null; + if (pending) { + callback.apply(void 0, lastArgs); + pending = false; + } + }); + } + }); + var cancel = function () { + cancelAnimationFrame(frameId); + pending = false; + frameId = null; + }; + return Object.assign(throttled, { cancel: cancel }); + } + function createAsyncTasksQueue() { + var tasks = []; + var frameId = null; + function runTasks() { + var task; + while (task = tasks.shift()) { + task(); + } + frameId = null; + } + function add(task) { + tasks.push(task); + if (!frameId) { + frameId = requestAnimationFrame(runTasks); + } + } + function cancel() { + tasks.splice(0); + cancelAnimationFrame(frameId); + frameId = null; + } + return { add: add, cancel: cancel }; } - function getDuration(time) { - var duration = 0; - if (time.seconds) { - duration += time.seconds * 1000; - } - if (time.minutes) { - duration += time.minutes * 60 * 1000; - } - if (time.hours) { - duration += time.hours * 60 * 60 * 1000; - } - if (time.days) { - duration += time.days * 24 * 60 * 60 * 1000; - } - return duration; + function getDuration(time) { + var duration = 0; + if (time.seconds) { + duration += time.seconds * 1000; + } + if (time.minutes) { + duration += time.minutes * 60 * 1000; + } + if (time.hours) { + duration += time.hours * 60 * 60 * 1000; + } + if (time.days) { + duration += time.days * 24 * 60 * 60 * 1000; + } + return duration; } - function removeNode(node) { - node && node.parentNode && node.parentNode.removeChild(node); - } - function watchForNodePosition(node, onRestore) { - var MAX_ATTEMPTS_COUNT = 10; - var ATTEMPTS_INTERVAL = getDuration({ seconds: 10 }); - var prevSibling = node.previousSibling; - var parent = node.parentElement; - if (!parent) { - logWarn('Unable to watch for node position: parent element not found', node, prevSibling); - return { stop: function () { } }; - } - var attempts = 0; - var start = null; - var restore = throttle(function () { - attempts++; - var now = Date.now(); - if (start == null) { - start = now; - } - else if (attempts >= MAX_ATTEMPTS_COUNT) { - if (now - start < ATTEMPTS_INTERVAL) { - logWarn('Node position watcher stopped: some script conflicts with Dark Reader and can cause high CPU usage', node, prevSibling); - stop(); - return; - } - start = now; - attempts = 1; - } - if ((prevSibling && prevSibling.parentElement !== parent)) { - logWarn('Unable to restore node position: sibling was removed', node, prevSibling, parent); - stop(); - return; - } - logWarn('Node was removed, restoring it\'s position', node, prevSibling, parent); - parent.insertBefore(node, prevSibling ? prevSibling.nextSibling : parent.firstChild); - onRestore && onRestore(); - }); - var observer = new MutationObserver(function () { - if (!node.parentElement) { - restore(); - } - }); - var run = function () { - observer.observe(parent, { childList: true }); - }; - var stop = function () { - observer.disconnect(); - }; - run(); - return { run: run, stop: stop }; + function removeNode(node) { + node && node.parentNode && node.parentNode.removeChild(node); + } + function watchForNodePosition(node, onRestore) { + var MAX_ATTEMPTS_COUNT = 10; + var ATTEMPTS_INTERVAL = getDuration({ seconds: 10 }); + var prevSibling = node.previousSibling; + var parent = node.parentElement; + if (!parent) { + logWarn('Unable to watch for node position: parent element not found', node, prevSibling); + return { stop: function () { } }; + } + var attempts = 0; + var start = null; + var restore = throttle(function () { + attempts++; + var now = Date.now(); + if (start == null) { + start = now; + } + else if (attempts >= MAX_ATTEMPTS_COUNT) { + if (now - start < ATTEMPTS_INTERVAL) { + logWarn('Node position watcher stopped: some script conflicts with Dark Reader and can cause high CPU usage', node, prevSibling); + stop(); + return; + } + start = now; + attempts = 1; + } + if ((prevSibling && prevSibling.parentElement !== parent)) { + logWarn('Unable to restore node position: sibling was removed', node, prevSibling, parent); + stop(); + return; + } + logWarn('Node was removed, restoring it\'s position', node, prevSibling, parent); + parent.insertBefore(node, prevSibling ? prevSibling.nextSibling : parent.firstChild); + onRestore && onRestore(); + }); + var observer = new MutationObserver(function () { + if (!node.parentElement) { + restore(); + } + }); + var run = function () { + observer.observe(parent, { childList: true }); + }; + var stop = function () { + observer.disconnect(); + }; + run(); + return { run: run, stop: stop }; } - var STYLE_SELECTOR = isDeepSelectorSupported() - ? 'html /deep/ link[rel*="stylesheet" i], html /deep/ style' - : 'html link[rel*="stylesheet" i], html style'; - function shouldManageStyle(element) { - return (((element instanceof HTMLStyleElement) || - (element instanceof HTMLLinkElement && element.rel && element.rel.toLowerCase().includes('stylesheet'))) && - !element.classList.contains('darkreader') && - element.media !== 'print'); - } - var asyncQueue = createAsyncTasksQueue(); - function manageStyle(element, _a) { - var update = _a.update, loadingStart = _a.loadingStart, loadingEnd = _a.loadingEnd; - var prevStyles = []; - var next = element; - while ((next = next.nextElementSibling) && next.matches('.darkreader')) { - prevStyles.push(next); - } - var corsCopy = prevStyles.find(function (el) { return el.matches('.darkreader--cors'); }) || null; - var syncStyle = prevStyles.find(function (el) { return el.matches('.darkreader--sync'); }) || null; - var corsCopyPositionWatcher = null; - var syncStylePositionWatcher = null; - var cancelAsyncOperations = false; - function isCancelled() { - return cancelAsyncOperations; - } - var observer = new MutationObserver(function () { - update(); - }); - var observerOptions = { attributes: true, childList: true, characterData: true }; - function containsCSSImport() { - return element instanceof HTMLStyleElement && element.textContent.trim().match(cssImportRegex); - } - function getRulesSync() { - if (corsCopy) { - return corsCopy.sheet.cssRules; - } - if (element.sheet == null) { - return null; - } - if (element instanceof HTMLLinkElement) { - try { - return element.sheet.cssRules; - } - catch (err) { - logWarn(err); - return null; - } - } - if (containsCSSImport()) { - return null; - } - return safeGetSheetRules(); - } - var isLoadingRules = false; - var wasLoadingError = false; - function getRulesAsync() { - return __awaiter(this, void 0, void 0, function () { - var cssText, cssBasePath, err_1, fullCSSText, err_2; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!(element instanceof HTMLLinkElement)) return [3, 6]; - if (!(element.sheet == null)) return [3, 4]; - _a.label = 1; - case 1: - _a.trys.push([1, 3, , 4]); - return [4, linkLoading(element)]; - case 2: - _a.sent(); - if (cancelAsyncOperations) { - return [2, null]; - } - return [3, 4]; - case 3: - err_1 = _a.sent(); - logWarn(err_1); - wasLoadingError = true; - return [2, null]; - case 4: - try { - if (element.sheet.cssRules != null) { - return [2, element.sheet.cssRules]; - } - } - catch (err) { - logWarn(err); - } - return [4, loadText(element.href)]; - case 5: - cssText = _a.sent(); - cssBasePath = getCSSBaseBath(element.href); - if (cancelAsyncOperations) { - return [2, null]; - } - return [3, 7]; - case 6: - if (containsCSSImport()) { - cssText = element.textContent.trim(); - cssBasePath = getCSSBaseBath(location.href); - } - else { - return [2, null]; - } - _a.label = 7; - case 7: - if (!cssText) return [3, 12]; - _a.label = 8; - case 8: - _a.trys.push([8, 10, , 11]); - return [4, replaceCSSImports(cssText, cssBasePath)]; - case 9: - fullCSSText = _a.sent(); - corsCopy = createCORSCopy(element, fullCSSText); - if (corsCopy) { - corsCopyPositionWatcher = watchForNodePosition(corsCopy); - } - return [3, 11]; - case 10: - err_2 = _a.sent(); - logWarn(err_2); - return [3, 11]; - case 11: - if (corsCopy) { - return [2, corsCopy.sheet.cssRules]; - } - _a.label = 12; - case 12: return [2, null]; - } - }); - }); - } - function details() { - var rules = getRulesSync(); - if (!rules) { - if (isLoadingRules || wasLoadingError) { - return null; - } - isLoadingRules = true; - loadingStart(); - getRulesAsync().then(function (results) { - isLoadingRules = false; - loadingEnd(); - if (results) { - update(); - } - }).catch(function (err) { - logWarn(err); - isLoadingRules = false; - loadingEnd(); - }); - return null; - } - var variables = getCSSVariables(rules); - return { variables: variables }; - } - function getFilterKey(filter) { - return ['mode', 'brightness', 'contrast', 'grayscale', 'sepia'].map(function (p) { return p + ":" + filter[p]; }).join(';'); - } - var renderId = 0; - var rulesTextCache = new Map(); - var rulesModCache = new Map(); - var prevFilterKey = null; - function render(filter, variables) { - var rules = getRulesSync(); - if (!rules) { - return; - } - cancelAsyncOperations = false; - var rulesChanged = (rulesModCache.size === 0); - var notFoundCacheKeys = new Set(rulesModCache.keys()); - var filterKey = getFilterKey(filter); - var filterChanged = (filterKey !== prevFilterKey); - var modRules = []; - iterateCSSRules(rules, function (rule) { - var cssText = rule.cssText; - var textDiffersFromPrev = false; - notFoundCacheKeys.delete(cssText); - if (!rulesTextCache.has(cssText)) { - rulesTextCache.set(cssText, cssText); - textDiffersFromPrev = true; - } - var vars = null; - var varsRule = null; - if (variables.size > 0 || cssText.includes('var(')) { - var cssTextWithVariables = replaceCSSVariables(cssText, variables); - if (rulesTextCache.get(cssText) !== cssTextWithVariables) { - rulesTextCache.set(cssText, cssTextWithVariables); - textDiffersFromPrev = true; - vars = document.createElement('style'); - vars.classList.add('darkreader'); - vars.classList.add('darkreader--vars'); - vars.media = 'screen'; - vars.textContent = cssTextWithVariables; - element.parentNode.insertBefore(vars, element.nextSibling); - varsRule = vars.sheet.cssRules[0]; - } - } - if (textDiffersFromPrev) { - rulesChanged = true; - } - else { - modRules.push(rulesModCache.get(cssText)); - return; - } - var modDecs = []; - var targetRule = varsRule || rule; - targetRule && targetRule.style && iterateCSSDeclarations(targetRule.style, function (property, value) { - var mod = getModifiableCSSDeclaration(property, value, rule, isCancelled); - if (mod) { - modDecs.push(mod); - } - }); - var modRule = null; - if (modDecs.length > 0) { - modRule = { selector: rule.selectorText, declarations: modDecs }; - if (rule.parentRule instanceof CSSMediaRule) { - modRule.media = rule.parentRule.media.mediaText; - } - modRules.push(modRule); - } - rulesModCache.set(cssText, modRule); - removeNode(vars); - }); - notFoundCacheKeys.forEach(function (key) { - rulesTextCache.delete(key); - rulesModCache.delete(key); - }); - prevFilterKey = filterKey; - if (!rulesChanged && !filterChanged) { - return; - } - renderId++; - function setRule(target, index, declarations) { - var selector = declarations[0].selector; - target.insertRule(selector + " {}", index); - var style = target.cssRules.item(index).style; - declarations.forEach(function (_a) { - var property = _a.property, value = _a.value, important = _a.important, sourceValue = _a.sourceValue; - style.setProperty(property, value == null ? sourceValue : value, important ? 'important' : ''); - }); - } - var readyDeclarations = []; - var asyncDeclarations = new Map(); - var asyncDeclarationCounter = 0; - function buildStyleSheet() { - var groups = []; - readyDeclarations.forEach(function (decl, i) { - var mediaGroup; - var selectorGroup; - var prev = i === 0 ? null : readyDeclarations[i - 1]; - var isSameMedia = prev && prev.media === decl.media; - var isSameMediaAndSelector = prev && isSameMedia && prev.selector === decl.selector; - if (isSameMedia) { - mediaGroup = groups[groups.length - 1]; - } - else { - mediaGroup = []; - groups.push(mediaGroup); - } - if (isSameMediaAndSelector) { - selectorGroup = mediaGroup[mediaGroup.length - 1]; - } - else { - selectorGroup = []; - mediaGroup.push(selectorGroup); - } - selectorGroup.push(decl); - }); - if (!syncStyle) { - syncStyle = document.createElement('style'); - syncStyle.classList.add('darkreader'); - syncStyle.classList.add('darkreader--sync'); - syncStyle.media = 'screen'; - } - syncStylePositionWatcher && syncStylePositionWatcher.stop(); - element.parentNode.insertBefore(syncStyle, corsCopy ? corsCopy.nextSibling : element.nextSibling); - var sheet = syncStyle.sheet; - for (var i = sheet.cssRules.length - 1; i >= 0; i--) { - sheet.deleteRule(i); - } - groups.forEach(function (mediaGroup) { - var media = mediaGroup[0][0].media; - var target; - if (media) { - sheet.insertRule("@media " + media + " {}", sheet.cssRules.length); - target = sheet.cssRules[sheet.cssRules.length - 1]; - } - else { - target = sheet; - } - mediaGroup.forEach(function (selectorGroup) { - var asyncItems = selectorGroup.filter(function (_a) { - var value = _a.value; - return value == null; - }); - if (asyncItems.length > 0) { - asyncItems.forEach(function (_a) { - var asyncKey = _a.asyncKey; - return asyncDeclarations.set(asyncKey, { declarations: selectorGroup, target: target, index: target.cssRules.length }); - }); - } - setRule(target, target.cssRules.length, selectorGroup); - }); - }); - if (syncStylePositionWatcher) { - syncStylePositionWatcher.run(); - } - else { - syncStylePositionWatcher = watchForNodePosition(syncStyle, buildStyleSheet); - } - } - function rebuildAsyncRule(key) { - var _a = asyncDeclarations.get(key), declarations = _a.declarations, target = _a.target, index = _a.index; - target.deleteRule(index); - setRule(target, index, declarations); - asyncDeclarations.delete(key); - } - modRules.filter(function (r) { return r; }).forEach(function (_a) { - var selector = _a.selector, declarations = _a.declarations, media = _a.media; - declarations.forEach(function (_a) { - var property = _a.property, value = _a.value, important = _a.important, sourceValue = _a.sourceValue; - if (typeof value === 'function') { - var modified = value(filter); - if (modified instanceof Promise) { - var index_1 = readyDeclarations.length; - var asyncKey_1 = asyncDeclarationCounter++; - readyDeclarations.push({ media: media, selector: selector, property: property, value: null, important: important, asyncKey: asyncKey_1, sourceValue: sourceValue }); - var promise = modified; - var currentRenderId_1 = renderId; - promise.then(function (asyncValue) { - if (!asyncValue || cancelAsyncOperations || currentRenderId_1 !== renderId) { - return; - } - readyDeclarations[index_1].value = asyncValue; - asyncQueue.add(function () { - if (cancelAsyncOperations || currentRenderId_1 !== renderId) { - return; - } - rebuildAsyncRule(asyncKey_1); - }); - }); - } - else { - readyDeclarations.push({ media: media, selector: selector, property: property, value: modified, important: important, sourceValue: sourceValue }); - } - } - else { - readyDeclarations.push({ media: media, selector: selector, property: property, value: value, important: important, sourceValue: sourceValue }); - } - }); - }); - buildStyleSheet(); - } - var rulesCount = null; - var rulesCheckFrameId = null; - function safeGetSheetRules() { - try { - return element.sheet.cssRules; - } - catch (err) { - logWarn(err); - return null; - } - } - function subscribeToSheetChanges() { - if (element.sheet && safeGetSheetRules()) { - rulesCount = element.sheet.cssRules.length; - } - unsubscribeFromSheetChanges(); - var checkForUpdate = function () { - if (element.sheet && safeGetSheetRules() && - element.sheet.cssRules.length !== rulesCount) { - rulesCount = element.sheet.cssRules.length; - update(); - } - rulesCheckFrameId = requestAnimationFrame(checkForUpdate); - }; - checkForUpdate(); - } - function unsubscribeFromSheetChanges() { - cancelAnimationFrame(rulesCheckFrameId); - } - function pause() { - observer.disconnect(); - corsCopyPositionWatcher && corsCopyPositionWatcher.stop(); - syncStylePositionWatcher && syncStylePositionWatcher.stop(); - cancelAsyncOperations = true; - unsubscribeFromSheetChanges(); - } - function destroy() { - pause(); - removeNode(corsCopy); - removeNode(syncStyle); - } - function watch() { - observer.observe(element, observerOptions); - if (element instanceof HTMLStyleElement) { - subscribeToSheetChanges(); - } - } - return { - details: details, - render: render, - pause: pause, - destroy: destroy, - watch: watch, - }; - } - function linkLoading(link) { - return new Promise(function (resolve, reject) { - var cleanUp = function () { - link.removeEventListener('load', onLoad); - link.removeEventListener('error', onError); - }; - var onLoad = function () { - cleanUp(); - resolve(); - }; - var onError = function () { - cleanUp(); - reject("Link loading failed " + link.href); - }; - link.addEventListener('load', onLoad); - link.addEventListener('error', onError); - }); - } - function getCSSImportURL(importDeclaration) { - return getCSSURLValue(importDeclaration.substring(8).replace(/;$/, '')); - } - function loadText(url) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!url.startsWith('data:')) return [3, 3]; - return [4, fetch(url)]; - case 1: return [4, (_a.sent()).text()]; - case 2: return [2, _a.sent()]; - case 3: return [4, bgFetch({ url: url, responseType: 'text' })]; - case 4: return [2, _a.sent()]; - } - }); - }); - } - function replaceCSSImports(cssText, basePath) { - return __awaiter(this, void 0, void 0, function () { - var importMatches, _i, importMatches_1, match, importURL, absoluteURL, importedCSS, err_3; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - cssText = removeCSSComments(cssText); - cssText = replaceCSSFontFace(cssText); - cssText = replaceCSSRelativeURLsWithAbsolute(cssText, basePath); - importMatches = getMatches(cssImportRegex, cssText); - _i = 0, importMatches_1 = importMatches; - _a.label = 1; - case 1: - if (!(_i < importMatches_1.length)) return [3, 8]; - match = importMatches_1[_i]; - importURL = getCSSImportURL(match); - absoluteURL = getAbsoluteURL(basePath, importURL); - importedCSS = void 0; - _a.label = 2; - case 2: - _a.trys.push([2, 5, , 6]); - return [4, loadText(absoluteURL)]; - case 3: - importedCSS = _a.sent(); - return [4, replaceCSSImports(importedCSS, getCSSBaseBath(absoluteURL))]; - case 4: - importedCSS = _a.sent(); - return [3, 6]; - case 5: - err_3 = _a.sent(); - logWarn(err_3); - importedCSS = ''; - return [3, 6]; - case 6: - cssText = cssText.split(match).join(importedCSS); - _a.label = 7; - case 7: - _i++; - return [3, 1]; - case 8: - cssText = cssText.trim(); - return [2, cssText]; - } - }); - }); - } - function createCORSCopy(srcElement, cssText) { - if (!cssText) { - return null; - } - var cors = document.createElement('style'); - cors.classList.add('darkreader'); - cors.classList.add('darkreader--cors'); - cors.media = 'screen'; - cors.textContent = cssText; - srcElement.parentNode.insertBefore(cors, srcElement.nextSibling); - cors.sheet.disabled = true; - return cors; + var STYLE_SELECTOR = isDeepSelectorSupported() + ? 'html /deep/ link[rel*="stylesheet" i], html /deep/ style' + : 'html link[rel*="stylesheet" i], html style'; + function shouldManageStyle(element) { + return (((element instanceof HTMLStyleElement) || + (element instanceof HTMLLinkElement && element.rel && element.rel.toLowerCase().includes('stylesheet'))) && + !element.classList.contains('darkreader') && + element.media !== 'print'); + } + var asyncQueue = createAsyncTasksQueue(); + function manageStyle(element, _a) { + var update = _a.update, loadingStart = _a.loadingStart, loadingEnd = _a.loadingEnd; + var prevStyles = []; + var next = element; + while ((next = next.nextElementSibling) && next.matches('.darkreader')) { + prevStyles.push(next); + } + var corsCopy = prevStyles.find(function (el) { return el.matches('.darkreader--cors'); }) || null; + var syncStyle = prevStyles.find(function (el) { return el.matches('.darkreader--sync'); }) || null; + var corsCopyPositionWatcher = null; + var syncStylePositionWatcher = null; + var cancelAsyncOperations = false; + function isCancelled() { + return cancelAsyncOperations; + } + var observer = new MutationObserver(function () { + update(); + }); + var observerOptions = { attributes: true, childList: true, characterData: true }; + function containsCSSImport() { + return element instanceof HTMLStyleElement && element.textContent.trim().match(cssImportRegex); + } + function getRulesSync() { + if (corsCopy) { + return corsCopy.sheet.cssRules; + } + if (element.sheet == null) { + return null; + } + if (element instanceof HTMLLinkElement) { + try { + return element.sheet.cssRules; + } + catch (err) { + logWarn(err); + return null; + } + } + if (containsCSSImport()) { + return null; + } + return safeGetSheetRules(); + } + var isLoadingRules = false; + var wasLoadingError = false; + function getRulesAsync() { + return __awaiter(this, void 0, void 0, function () { + var cssText, cssBasePath, err_1, fullCSSText, err_2; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(element instanceof HTMLLinkElement)) return [3, 6]; + if (!(element.sheet == null)) return [3, 4]; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4, linkLoading(element)]; + case 2: + _a.sent(); + if (cancelAsyncOperations) { + return [2, null]; + } + return [3, 4]; + case 3: + err_1 = _a.sent(); + logWarn(err_1); + wasLoadingError = true; + return [2, null]; + case 4: + try { + if (element.sheet.cssRules != null) { + return [2, element.sheet.cssRules]; + } + } + catch (err) { + logWarn(err); + } + return [4, loadText(element.href)]; + case 5: + cssText = _a.sent(); + cssBasePath = getCSSBaseBath(element.href); + if (cancelAsyncOperations) { + return [2, null]; + } + return [3, 7]; + case 6: + if (containsCSSImport()) { + cssText = element.textContent.trim(); + cssBasePath = getCSSBaseBath(location.href); + } + else { + return [2, null]; + } + _a.label = 7; + case 7: + if (!cssText) return [3, 12]; + _a.label = 8; + case 8: + _a.trys.push([8, 10, , 11]); + return [4, replaceCSSImports(cssText, cssBasePath)]; + case 9: + fullCSSText = _a.sent(); + corsCopy = createCORSCopy(element, fullCSSText); + if (corsCopy) { + corsCopyPositionWatcher = watchForNodePosition(corsCopy); + } + return [3, 11]; + case 10: + err_2 = _a.sent(); + logWarn(err_2); + return [3, 11]; + case 11: + if (corsCopy) { + return [2, corsCopy.sheet.cssRules]; + } + _a.label = 12; + case 12: return [2, null]; + } + }); + }); + } + function details() { + var rules = getRulesSync(); + if (!rules) { + if (isLoadingRules || wasLoadingError) { + return null; + } + isLoadingRules = true; + loadingStart(); + getRulesAsync().then(function (results) { + isLoadingRules = false; + loadingEnd(); + if (results) { + update(); + } + }).catch(function (err) { + logWarn(err); + isLoadingRules = false; + loadingEnd(); + }); + return null; + } + var variables = getCSSVariables(rules); + return { variables: variables }; + } + function getFilterKey(filter) { + return ['mode', 'brightness', 'contrast', 'grayscale', 'sepia'].map(function (p) { return p + ":" + filter[p]; }).join(';'); + } + var renderId = 0; + var rulesTextCache = new Map(); + var rulesModCache = new Map(); + var prevFilterKey = null; + function render(filter, variables) { + var rules = getRulesSync(); + if (!rules) { + return; + } + cancelAsyncOperations = false; + var rulesChanged = (rulesModCache.size === 0); + var notFoundCacheKeys = new Set(rulesModCache.keys()); + var filterKey = getFilterKey(filter); + var filterChanged = (filterKey !== prevFilterKey); + var modRules = []; + iterateCSSRules(rules, function (rule) { + var cssText = rule.cssText; + var textDiffersFromPrev = false; + notFoundCacheKeys.delete(cssText); + if (!rulesTextCache.has(cssText)) { + rulesTextCache.set(cssText, cssText); + textDiffersFromPrev = true; + } + var vars = null; + var varsRule = null; + if (variables.size > 0 || cssText.includes('var(')) { + var cssTextWithVariables = replaceCSSVariables(cssText, variables); + if (rulesTextCache.get(cssText) !== cssTextWithVariables) { + rulesTextCache.set(cssText, cssTextWithVariables); + textDiffersFromPrev = true; + vars = document.createElement('style'); + vars.classList.add('darkreader'); + vars.classList.add('darkreader--vars'); + vars.media = 'screen'; + vars.textContent = cssTextWithVariables; + element.parentNode.insertBefore(vars, element.nextSibling); + varsRule = vars.sheet.cssRules[0]; + } + } + if (textDiffersFromPrev) { + rulesChanged = true; + } + else { + modRules.push(rulesModCache.get(cssText)); + return; + } + var modDecs = []; + var targetRule = varsRule || rule; + targetRule && targetRule.style && iterateCSSDeclarations(targetRule.style, function (property, value) { + var mod = getModifiableCSSDeclaration(property, value, rule, isCancelled); + if (mod) { + modDecs.push(mod); + } + }); + var modRule = null; + if (modDecs.length > 0) { + modRule = { selector: rule.selectorText, declarations: modDecs }; + if (rule.parentRule instanceof CSSMediaRule) { + modRule.media = rule.parentRule.media.mediaText; + } + modRules.push(modRule); + } + rulesModCache.set(cssText, modRule); + removeNode(vars); + }); + notFoundCacheKeys.forEach(function (key) { + rulesTextCache.delete(key); + rulesModCache.delete(key); + }); + prevFilterKey = filterKey; + if (!rulesChanged && !filterChanged) { + return; + } + renderId++; + function setRule(target, index, declarations) { + var selector = declarations[0].selector; + target.insertRule(selector + " {}", index); + var style = target.cssRules.item(index).style; + declarations.forEach(function (_a) { + var property = _a.property, value = _a.value, important = _a.important, sourceValue = _a.sourceValue; + style.setProperty(property, value == null ? sourceValue : value, important ? 'important' : ''); + }); + } + var readyDeclarations = []; + var asyncDeclarations = new Map(); + var asyncDeclarationCounter = 0; + function buildStyleSheet() { + var groups = []; + readyDeclarations.forEach(function (decl, i) { + var mediaGroup; + var selectorGroup; + var prev = i === 0 ? null : readyDeclarations[i - 1]; + var isSameMedia = prev && prev.media === decl.media; + var isSameMediaAndSelector = prev && isSameMedia && prev.selector === decl.selector; + if (isSameMedia) { + mediaGroup = groups[groups.length - 1]; + } + else { + mediaGroup = []; + groups.push(mediaGroup); + } + if (isSameMediaAndSelector) { + selectorGroup = mediaGroup[mediaGroup.length - 1]; + } + else { + selectorGroup = []; + mediaGroup.push(selectorGroup); + } + selectorGroup.push(decl); + }); + if (!syncStyle) { + syncStyle = document.createElement('style'); + syncStyle.classList.add('darkreader'); + syncStyle.classList.add('darkreader--sync'); + syncStyle.media = 'screen'; + } + syncStylePositionWatcher && syncStylePositionWatcher.stop(); + element.parentNode.insertBefore(syncStyle, corsCopy ? corsCopy.nextSibling : element.nextSibling); + var sheet = syncStyle.sheet; + for (var i = sheet.cssRules.length - 1; i >= 0; i--) { + sheet.deleteRule(i); + } + groups.forEach(function (mediaGroup) { + var media = mediaGroup[0][0].media; + var target; + if (media) { + sheet.insertRule("@media " + media + " {}", sheet.cssRules.length); + target = sheet.cssRules[sheet.cssRules.length - 1]; + } + else { + target = sheet; + } + mediaGroup.forEach(function (selectorGroup) { + var asyncItems = selectorGroup.filter(function (_a) { + var value = _a.value; + return value == null; + }); + if (asyncItems.length > 0) { + asyncItems.forEach(function (_a) { + var asyncKey = _a.asyncKey; + return asyncDeclarations.set(asyncKey, { declarations: selectorGroup, target: target, index: target.cssRules.length }); + }); + } + setRule(target, target.cssRules.length, selectorGroup); + }); + }); + if (syncStylePositionWatcher) { + syncStylePositionWatcher.run(); + } + else { + syncStylePositionWatcher = watchForNodePosition(syncStyle, buildStyleSheet); + } + } + function rebuildAsyncRule(key) { + var _a = asyncDeclarations.get(key), declarations = _a.declarations, target = _a.target, index = _a.index; + target.deleteRule(index); + setRule(target, index, declarations); + asyncDeclarations.delete(key); + } + modRules.filter(function (r) { return r; }).forEach(function (_a) { + var selector = _a.selector, declarations = _a.declarations, media = _a.media; + declarations.forEach(function (_a) { + var property = _a.property, value = _a.value, important = _a.important, sourceValue = _a.sourceValue; + if (typeof value === 'function') { + var modified = value(filter); + if (modified instanceof Promise) { + var index_1 = readyDeclarations.length; + var asyncKey_1 = asyncDeclarationCounter++; + readyDeclarations.push({ media: media, selector: selector, property: property, value: null, important: important, asyncKey: asyncKey_1, sourceValue: sourceValue }); + var promise = modified; + var currentRenderId_1 = renderId; + promise.then(function (asyncValue) { + if (!asyncValue || cancelAsyncOperations || currentRenderId_1 !== renderId) { + return; + } + readyDeclarations[index_1].value = asyncValue; + asyncQueue.add(function () { + if (cancelAsyncOperations || currentRenderId_1 !== renderId) { + return; + } + rebuildAsyncRule(asyncKey_1); + }); + }); + } + else { + readyDeclarations.push({ media: media, selector: selector, property: property, value: modified, important: important, sourceValue: sourceValue }); + } + } + else { + readyDeclarations.push({ media: media, selector: selector, property: property, value: value, important: important, sourceValue: sourceValue }); + } + }); + }); + buildStyleSheet(); + } + var rulesCount = null; + var rulesCheckFrameId = null; + function safeGetSheetRules() { + try { + return element.sheet.cssRules; + } + catch (err) { + logWarn(err); + return null; + } + } + function subscribeToSheetChanges() { + if (element.sheet && safeGetSheetRules()) { + rulesCount = element.sheet.cssRules.length; + } + unsubscribeFromSheetChanges(); + var checkForUpdate = function () { + if (element.sheet && safeGetSheetRules() && + element.sheet.cssRules.length !== rulesCount) { + rulesCount = element.sheet.cssRules.length; + update(); + } + rulesCheckFrameId = requestAnimationFrame(checkForUpdate); + }; + checkForUpdate(); + } + function unsubscribeFromSheetChanges() { + cancelAnimationFrame(rulesCheckFrameId); + } + function pause() { + observer.disconnect(); + corsCopyPositionWatcher && corsCopyPositionWatcher.stop(); + syncStylePositionWatcher && syncStylePositionWatcher.stop(); + cancelAsyncOperations = true; + unsubscribeFromSheetChanges(); + } + function destroy() { + pause(); + removeNode(corsCopy); + removeNode(syncStyle); + } + function watch() { + observer.observe(element, observerOptions); + if (element instanceof HTMLStyleElement) { + subscribeToSheetChanges(); + } + } + return { + details: details, + render: render, + pause: pause, + destroy: destroy, + watch: watch, + }; + } + function linkLoading(link) { + return new Promise(function (resolve, reject) { + var cleanUp = function () { + link.removeEventListener('load', onLoad); + link.removeEventListener('error', onError); + }; + var onLoad = function () { + cleanUp(); + resolve(); + }; + var onError = function () { + cleanUp(); + reject("Link loading failed " + link.href); + }; + link.addEventListener('load', onLoad); + link.addEventListener('error', onError); + }); + } + function getCSSImportURL(importDeclaration) { + return getCSSURLValue(importDeclaration.substring(8).replace(/;$/, '')); + } + function loadText(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!url.startsWith('data:')) return [3, 3]; + return [4, fetch(url)]; + case 1: return [4, (_a.sent()).text()]; + case 2: return [2, _a.sent()]; + case 3: return [4, bgFetch({ url: url, responseType: 'text' })]; + case 4: return [2, _a.sent()]; + } + }); + }); + } + function replaceCSSImports(cssText, basePath) { + return __awaiter(this, void 0, void 0, function () { + var importMatches, _i, importMatches_1, match, importURL, absoluteURL, importedCSS, err_3; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + cssText = removeCSSComments(cssText); + cssText = replaceCSSFontFace(cssText); + cssText = replaceCSSRelativeURLsWithAbsolute(cssText, basePath); + importMatches = getMatches(cssImportRegex, cssText); + _i = 0, importMatches_1 = importMatches; + _a.label = 1; + case 1: + if (!(_i < importMatches_1.length)) return [3, 8]; + match = importMatches_1[_i]; + importURL = getCSSImportURL(match); + absoluteURL = getAbsoluteURL(basePath, importURL); + importedCSS = void 0; + _a.label = 2; + case 2: + _a.trys.push([2, 5, , 6]); + return [4, loadText(absoluteURL)]; + case 3: + importedCSS = _a.sent(); + return [4, replaceCSSImports(importedCSS, getCSSBaseBath(absoluteURL))]; + case 4: + importedCSS = _a.sent(); + return [3, 6]; + case 5: + err_3 = _a.sent(); + logWarn(err_3); + importedCSS = ''; + return [3, 6]; + case 6: + cssText = cssText.split(match).join(importedCSS); + _a.label = 7; + case 7: + _i++; + return [3, 1]; + case 8: + cssText = cssText.trim(); + return [2, cssText]; + } + }); + }); + } + function createCORSCopy(srcElement, cssText) { + if (!cssText) { + return null; + } + var cors = document.createElement('style'); + cors.classList.add('darkreader'); + cors.classList.add('darkreader--cors'); + cors.media = 'screen'; + cors.textContent = cssText; + srcElement.parentNode.insertBefore(cors, srcElement.nextSibling); + cors.sheet.disabled = true; + return cors; } - var observer$2 = null; - function getAllManageableStyles(nodes) { - var results = []; - Array.from(nodes).forEach(function (node) { - if (node instanceof Element) { - if (shouldManageStyle(node)) { - results.push(node); - } - results.push.apply(results, Array.from(node.querySelectorAll(STYLE_SELECTOR)).filter(shouldManageStyle)); - } - }); - return results; - } - function iterateShadowNodes(nodes, iterator) { - Array.from(nodes).forEach(function (node) { - if (node instanceof Element) { - if (node.shadowRoot) { - iterator(node); - } - iterateShadowNodes(node.childNodes, iterator); - } - }); - } - var shadowObservers = new Set(); - function watchForStyleChanges(update) { - if (observer$2) { - observer$2.disconnect(); - shadowObservers.forEach(function (o) { return o.disconnect(); }); - shadowObservers.clear(); - } - function handleMutations(mutations) { - var createdStyles = mutations.reduce(function (nodes, m) { return nodes.concat(getAllManageableStyles(m.addedNodes)); }, []); - var removedStyles = mutations.reduce(function (nodes, m) { return nodes.concat(getAllManageableStyles(m.removedNodes)); }, []); - var updatedStyles = mutations - .filter(function (_a) { - var target = _a.target, type = _a.type; - return type === 'attributes' && shouldManageStyle(target); - }) - .reduce(function (styles, _a) { - var target = _a.target; - styles.push(target); - return styles; - }, []); - if (createdStyles.length + removedStyles.length + updatedStyles.length > 0) { - update({ - created: createdStyles, - updated: updatedStyles, - removed: removedStyles, - }); - } - var allAddedNodes = []; - mutations.forEach(function (m) { - m.addedNodes.forEach(function (n) { - allAddedNodes.push(n); - }); - }); - iterateShadowNodes(allAddedNodes, subscribeForShadowRootChanges); - } - function subscribeForShadowRootChanges(node) { - var shadowObserver = new MutationObserver(handleMutations); - shadowObserver.observe(node.shadowRoot, mutationObserverOptions); - shadowObservers.add(shadowObserver); - } - var mutationObserverOptions = { childList: true, subtree: true, attributes: true, attributeFilter: ['rel'] }; - observer$2 = new MutationObserver(handleMutations); - observer$2.observe(document.documentElement, mutationObserverOptions); - iterateShadowNodes(document.documentElement.children, subscribeForShadowRootChanges); - } - function stopWatchingForStyleChanges() { - if (observer$2) { - observer$2.disconnect(); - observer$2 = null; - shadowObservers.forEach(function (o) { return o.disconnect(); }); - shadowObservers.clear(); - } + var observer$2 = null; + function getAllManageableStyles(nodes) { + var results = []; + Array.from(nodes).forEach(function (node) { + if (node instanceof Element) { + if (shouldManageStyle(node)) { + results.push(node); + } + results.push.apply(results, Array.from(node.querySelectorAll(STYLE_SELECTOR)).filter(shouldManageStyle)); + } + }); + return results; + } + function iterateShadowNodes(nodes, iterator) { + Array.from(nodes).forEach(function (node) { + if (node instanceof Element) { + if (node.shadowRoot) { + iterator(node); + } + iterateShadowNodes(node.childNodes, iterator); + } + }); + } + var shadowObservers = new Set(); + function watchForStyleChanges(update) { + if (observer$2) { + observer$2.disconnect(); + shadowObservers.forEach(function (o) { return o.disconnect(); }); + shadowObservers.clear(); + } + function handleMutations(mutations) { + var createdStyles = mutations.reduce(function (nodes, m) { return nodes.concat(getAllManageableStyles(m.addedNodes)); }, []); + var removedStyles = mutations.reduce(function (nodes, m) { return nodes.concat(getAllManageableStyles(m.removedNodes)); }, []); + var updatedStyles = mutations + .filter(function (_a) { + var target = _a.target, type = _a.type; + return type === 'attributes' && shouldManageStyle(target); + }) + .reduce(function (styles, _a) { + var target = _a.target; + styles.push(target); + return styles; + }, []); + if (createdStyles.length + removedStyles.length + updatedStyles.length > 0) { + update({ + created: createdStyles, + updated: updatedStyles, + removed: removedStyles, + }); + } + var allAddedNodes = []; + mutations.forEach(function (m) { + m.addedNodes.forEach(function (n) { + allAddedNodes.push(n); + }); + }); + iterateShadowNodes(allAddedNodes, subscribeForShadowRootChanges); + } + function subscribeForShadowRootChanges(node) { + var shadowObserver = new MutationObserver(handleMutations); + shadowObserver.observe(node.shadowRoot, mutationObserverOptions); + shadowObservers.add(shadowObserver); + } + var mutationObserverOptions = { childList: true, subtree: true, attributes: true, attributeFilter: ['rel'] }; + observer$2 = new MutationObserver(handleMutations); + observer$2.observe(document.documentElement, mutationObserverOptions); + iterateShadowNodes(document.documentElement.children, subscribeForShadowRootChanges); + } + function stopWatchingForStyleChanges() { + if (observer$2) { + observer$2.disconnect(); + observer$2 = null; + shadowObservers.forEach(function (o) { return o.disconnect(); }); + shadowObservers.clear(); + } } - var styleManagers = new Map(); - var variables = new Map(); - var filter = null; - var fixes = null; - var isIFrame = null; - function createOrUpdateStyle(className) { - var style = (document.head || document).querySelector("." + className); - if (!style) { - style = document.createElement('style'); - style.classList.add('darkreader'); - style.classList.add(className); - style.media = 'screen'; - } - return style; - } - var stylePositionWatchers = new Map(); - function setupStylePositionWatcher(node, alias) { - stylePositionWatchers.has(alias) && stylePositionWatchers.get(alias).stop(); - stylePositionWatchers.set(alias, watchForNodePosition(node)); - } - function stopStylePositionWatchers() { - Array.from(stylePositionWatchers.values()).forEach(function (watcher) { return watcher.stop(); }); - stylePositionWatchers.clear(); - } - function createStaticStyleOverrides() { - var fallbackStyle = createOrUpdateStyle('darkreader--fallback'); - document.head.insertBefore(fallbackStyle, document.head.firstChild); - fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: true }); - setupStylePositionWatcher(fallbackStyle, 'fallback'); - var userAgentStyle = createOrUpdateStyle('darkreader--user-agent'); - document.head.insertBefore(userAgentStyle, fallbackStyle.nextSibling); - userAgentStyle.textContent = getModifiedUserAgentStyle(filter, isIFrame); - setupStylePositionWatcher(userAgentStyle, 'user-agent'); - var textStyle = createOrUpdateStyle('darkreader--text'); - document.head.insertBefore(textStyle, fallbackStyle.nextSibling); - if (filter.useFont || filter.textStroke > 0) { - textStyle.textContent = createTextStyle(filter); - } - else { - textStyle.textContent = ''; - } - setupStylePositionWatcher(textStyle, 'text'); - var invertStyle = createOrUpdateStyle('darkreader--invert'); - document.head.insertBefore(invertStyle, textStyle.nextSibling); - if (fixes && Array.isArray(fixes.invert) && fixes.invert.length > 0) { - invertStyle.textContent = [ - fixes.invert.join(', ') + " {", - " filter: " + getCSSFilterValue(__assign({}, filter, { contrast: filter.mode === 0 ? filter.contrast : clamp(filter.contrast - 10, 0, 100) })) + " !important;", - '}', - ].join('\n'); - } - else { - invertStyle.textContent = ''; - } - setupStylePositionWatcher(invertStyle, 'invert'); - var inlineStyle = createOrUpdateStyle('darkreader--inline'); - document.head.insertBefore(inlineStyle, invertStyle.nextSibling); - inlineStyle.textContent = getInlineOverrideStyle(); - setupStylePositionWatcher(inlineStyle, 'inline'); - var overrideStyle = createOrUpdateStyle('darkreader--override'); - document.head.appendChild(overrideStyle); - overrideStyle.textContent = fixes && fixes.css ? replaceCSSTemplates(fixes.css) : ''; - setupStylePositionWatcher(overrideStyle, 'override'); - } - function replaceCSSTemplates($cssText) { - return $cssText.replace(/\${(.+?)}/g, function (m0, $color) { - try { - var color = parseColorWithCache($color); - return modifyColor(color, filter); - } - catch (err) { - logWarn(err); - return $color; - } - }); - } - function cleanFallbackStyle() { - var fallback = document.head.querySelector('.darkreader--fallback'); - if (fallback) { - fallback.textContent = ''; - } - } - function createDynamicStyleOverrides() { - cancelRendering(); - updateVariables(getElementCSSVariables(document.documentElement)); - var newManagers = Array.from(document.querySelectorAll(STYLE_SELECTOR)) - .filter(function (style) { return !styleManagers.has(style) && shouldManageStyle(style); }) - .map(function (style) { return createManager(style); }); - var newVariables = newManagers - .map(function (manager) { return manager.details(); }) - .filter(function (details) { return details && details.variables.size > 0; }) - .map(function (_a) { - var variables = _a.variables; - return variables; - }); - if (newVariables.length === 0) { - styleManagers.forEach(function (manager) { return manager.render(filter, variables); }); - if (loadingStyles.size === 0) { - cleanFallbackStyle(); - } - } - else { - newVariables.forEach(function (variables) { return updateVariables(variables); }); - throttledRenderAllStyles(function () { - if (loadingStyles.size === 0) { - cleanFallbackStyle(); - } - }); - } - newManagers.forEach(function (manager) { return manager.watch(); }); - var inlineStyleElements = Array.from(document.querySelectorAll(INLINE_STYLE_SELECTOR)); - inlineStyleElements.forEach(function (el) { return overrideInlineStyle(el, filter); }); - } - var loadingStylesCounter = 0; - var loadingStyles = new Set(); - function createManager(element) { - if (styleManagers.has(element)) { - return; - } - var loadingStyleId = ++loadingStylesCounter; - function loadingStart() { - if (!isPageLoaded() || !didDocumentShowUp) { - loadingStyles.add(loadingStyleId); - var fallbackStyle = document.querySelector('.darkreader--fallback'); - if (!fallbackStyle.textContent) { - fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: false }); - } - } - } - function loadingEnd() { - loadingStyles.delete(loadingStyleId); - if (loadingStyles.size === 0 && isPageLoaded()) { - cleanFallbackStyle(); - } - } - function update() { - var details = manager.details(); - if (!details) { - return; - } - if (details.variables.size === 0) { - manager.render(filter, variables); - } - else { - updateVariables(details.variables); - throttledRenderAllStyles(); - } - } - var manager = manageStyle(element, { update: update, loadingStart: loadingStart, loadingEnd: loadingEnd }); - styleManagers.set(element, manager); - return manager; - } - function updateVariables(newVars) { - if (newVars.size === 0) { - return; - } - newVars.forEach(function (value, key) { return variables.set(key, value); }); - variables.forEach(function (value, key) { return variables.set(key, replaceCSSVariables(value, variables)); }); - } - function removeManager(element) { - var manager = styleManagers.get(element); - if (manager) { - manager.destroy(); - styleManagers.delete(element); - } - } - var throttledRenderAllStyles = throttle(function (callback) { - styleManagers.forEach(function (manager) { return manager.render(filter, variables); }); - callback && callback(); - }); - var cancelRendering = function () { - throttledRenderAllStyles.cancel(); - }; - function isPageLoaded() { - return document.readyState === 'complete' || document.readyState === 'interactive'; - } - function onReadyStateChange() { - if (!isPageLoaded()) { - return; - } - document.removeEventListener('readystatechange', onReadyStateChange); - if (loadingStyles.size === 0) { - cleanFallbackStyle(); - } - } - var documentVisibilityListener = null; - var didDocumentShowUp = !document.hidden; - function watchForDocumentVisibility(callback) { - var alreadyWatching = Boolean(documentVisibilityListener); - documentVisibilityListener = function () { - if (!document.hidden) { - stopWatchingForDocumentVisibility(); - callback(); - didDocumentShowUp = true; - } - }; - if (!alreadyWatching) { - document.addEventListener('visibilitychange', documentVisibilityListener); - } - } - function stopWatchingForDocumentVisibility() { - document.removeEventListener('visibilitychange', documentVisibilityListener); - documentVisibilityListener = null; - } - function createThemeAndWatchForUpdates() { - createStaticStyleOverrides(); - function runDynamicStyle() { - createDynamicStyleOverrides(); - watchForUpdates(); - } - if (document.hidden) { - watchForDocumentVisibility(runDynamicStyle); - } - else { - runDynamicStyle(); - } - changeMetaThemeColorWhenAvailable(filter); - } - function watchForUpdates() { - watchForStyleChanges(function (_a) { - var created = _a.created, updated = _a.updated, removed = _a.removed; - var createdStyles = new Set(created); - var movedStyles = new Set(removed.filter(function (style) { return createdStyles.has(style); })); - removed - .filter(function (style) { return !movedStyles.has(style); }) - .forEach(function (style) { return removeManager(style); }); - var newManagers = Array.from(new Set(created.concat(updated))) - .filter(function (style) { return !styleManagers.has(style); }) - .map(function (style) { return createManager(style); }); - var newVariables = newManagers - .map(function (manager) { return manager.details(); }) - .filter(function (details) { return details && details.variables.size > 0; }) - .map(function (_a) { - var variables = _a.variables; - return variables; - }); - if (newVariables.length === 0) { - newManagers.forEach(function (manager) { return manager.render(filter, variables); }); - } - else { - newVariables.forEach(function (variables) { return updateVariables(variables); }); - throttledRenderAllStyles(); - } - newManagers.forEach(function (manager) { return manager.watch(); }); - }); - watchForInlineStyles(function (element) { - overrideInlineStyle(element, filter); - if (element === document.documentElement) { - var rootVariables = getElementCSSVariables(document.documentElement); - if (rootVariables.size > 0) { - updateVariables(rootVariables); - throttledRenderAllStyles(); - } - } - }); - document.addEventListener('readystatechange', onReadyStateChange); - } - function stopWatchingForUpdates() { - styleManagers.forEach(function (manager) { return manager.pause(); }); - stopStylePositionWatchers(); - stopWatchingForStyleChanges(); - stopWatchingForInlineStyles(); - document.removeEventListener('readystatechange', onReadyStateChange); - } - function createOrUpdateDynamicTheme(filterConfig, dynamicThemeFixes, iframe) { - filter = filterConfig; - fixes = dynamicThemeFixes; - isIFrame = iframe; - if (document.head) { - createThemeAndWatchForUpdates(); - } - else { - if (!isFirefox()) { - var fallbackStyle = createOrUpdateStyle('darkreader--fallback'); - document.documentElement.appendChild(fallbackStyle); - fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: true }); - } - var headObserver_1 = new MutationObserver(function () { - if (document.head) { - headObserver_1.disconnect(); - createThemeAndWatchForUpdates(); - } - }); - headObserver_1.observe(document, { childList: true, subtree: true }); - } - } - function removeDynamicTheme() { - cleanDynamicThemeCache(); - removeNode(document.querySelector('.darkreader--fallback')); - if (document.head) { - restoreMetaThemeColor(); - removeNode(document.head.querySelector('.darkreader--user-agent')); - removeNode(document.head.querySelector('.darkreader--text')); - removeNode(document.head.querySelector('.darkreader--invert')); - removeNode(document.head.querySelector('.darkreader--inline')); - removeNode(document.head.querySelector('.darkreader--override')); - } - Array.from(styleManagers.keys()).forEach(function (el) { return removeManager(el); }); - Array.from(document.querySelectorAll('.darkreader')).forEach(removeNode); - } - function cleanDynamicThemeCache() { - stopWatchingForDocumentVisibility(); - cancelRendering(); - stopWatchingForUpdates(); - cleanModificationCache(); + var styleManagers = new Map(); + var variables = new Map(); + var filter = null; + var fixes = null; + var isIFrame = null; + function createOrUpdateStyle(className) { + var style = (document.head || document).querySelector("." + className); + if (!style) { + style = document.createElement('style'); + style.classList.add('darkreader'); + style.classList.add(className); + style.media = 'screen'; + } + return style; + } + var stylePositionWatchers = new Map(); + function setupStylePositionWatcher(node, alias) { + stylePositionWatchers.has(alias) && stylePositionWatchers.get(alias).stop(); + stylePositionWatchers.set(alias, watchForNodePosition(node)); + } + function stopStylePositionWatchers() { + Array.from(stylePositionWatchers.values()).forEach(function (watcher) { return watcher.stop(); }); + stylePositionWatchers.clear(); + } + function createStaticStyleOverrides() { + var fallbackStyle = createOrUpdateStyle('darkreader--fallback'); + document.head.insertBefore(fallbackStyle, document.head.firstChild); + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: true }); + setupStylePositionWatcher(fallbackStyle, 'fallback'); + var userAgentStyle = createOrUpdateStyle('darkreader--user-agent'); + document.head.insertBefore(userAgentStyle, fallbackStyle.nextSibling); + userAgentStyle.textContent = getModifiedUserAgentStyle(filter, isIFrame); + setupStylePositionWatcher(userAgentStyle, 'user-agent'); + var textStyle = createOrUpdateStyle('darkreader--text'); + document.head.insertBefore(textStyle, fallbackStyle.nextSibling); + if (filter.useFont || filter.textStroke > 0) { + textStyle.textContent = createTextStyle(filter); + } + else { + textStyle.textContent = ''; + } + setupStylePositionWatcher(textStyle, 'text'); + var invertStyle = createOrUpdateStyle('darkreader--invert'); + document.head.insertBefore(invertStyle, textStyle.nextSibling); + if (fixes && Array.isArray(fixes.invert) && fixes.invert.length > 0) { + invertStyle.textContent = [ + fixes.invert.join(', ') + " {", + " filter: " + getCSSFilterValue(__assign({}, filter, { contrast: filter.mode === 0 ? filter.contrast : clamp(filter.contrast - 10, 0, 100) })) + " !important;", + '}', + ].join('\n'); + } + else { + invertStyle.textContent = ''; + } + setupStylePositionWatcher(invertStyle, 'invert'); + var inlineStyle = createOrUpdateStyle('darkreader--inline'); + document.head.insertBefore(inlineStyle, invertStyle.nextSibling); + inlineStyle.textContent = getInlineOverrideStyle(); + setupStylePositionWatcher(inlineStyle, 'inline'); + var overrideStyle = createOrUpdateStyle('darkreader--override'); + document.head.appendChild(overrideStyle); + overrideStyle.textContent = fixes && fixes.css ? replaceCSSTemplates(fixes.css) : ''; + setupStylePositionWatcher(overrideStyle, 'override'); + } + function replaceCSSTemplates($cssText) { + return $cssText.replace(/\${(.+?)}/g, function (m0, $color) { + try { + var color = parseColorWithCache($color); + return modifyColor(color, filter); + } + catch (err) { + logWarn(err); + return $color; + } + }); + } + function cleanFallbackStyle() { + var fallback = document.head.querySelector('.darkreader--fallback'); + if (fallback) { + fallback.textContent = ''; + } + } + function createDynamicStyleOverrides() { + cancelRendering(); + updateVariables(getElementCSSVariables(document.documentElement)); + var newManagers = Array.from(document.querySelectorAll(STYLE_SELECTOR)) + .filter(function (style) { return !styleManagers.has(style) && shouldManageStyle(style); }) + .map(function (style) { return createManager(style); }); + var newVariables = newManagers + .map(function (manager) { return manager.details(); }) + .filter(function (details) { return details && details.variables.size > 0; }) + .map(function (_a) { + var variables = _a.variables; + return variables; + }); + if (newVariables.length === 0) { + styleManagers.forEach(function (manager) { return manager.render(filter, variables); }); + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + } + else { + newVariables.forEach(function (variables) { return updateVariables(variables); }); + throttledRenderAllStyles(function () { + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + }); + } + newManagers.forEach(function (manager) { return manager.watch(); }); + var inlineStyleElements = Array.from(document.querySelectorAll(INLINE_STYLE_SELECTOR)); + inlineStyleElements.forEach(function (el) { return overrideInlineStyle(el, filter); }); + } + var loadingStylesCounter = 0; + var loadingStyles = new Set(); + function createManager(element) { + if (styleManagers.has(element)) { + return; + } + var loadingStyleId = ++loadingStylesCounter; + function loadingStart() { + if (!isPageLoaded() || !didDocumentShowUp) { + loadingStyles.add(loadingStyleId); + var fallbackStyle = document.querySelector('.darkreader--fallback'); + if (!fallbackStyle.textContent) { + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: false }); + } + } + } + function loadingEnd() { + loadingStyles.delete(loadingStyleId); + if (loadingStyles.size === 0 && isPageLoaded()) { + cleanFallbackStyle(); + } + } + function update() { + var details = manager.details(); + if (!details) { + return; + } + if (details.variables.size === 0) { + manager.render(filter, variables); + } + else { + updateVariables(details.variables); + throttledRenderAllStyles(); + } + } + var manager = manageStyle(element, { update: update, loadingStart: loadingStart, loadingEnd: loadingEnd }); + styleManagers.set(element, manager); + return manager; + } + function updateVariables(newVars) { + if (newVars.size === 0) { + return; + } + newVars.forEach(function (value, key) { return variables.set(key, value); }); + variables.forEach(function (value, key) { return variables.set(key, replaceCSSVariables(value, variables)); }); + } + function removeManager(element) { + var manager = styleManagers.get(element); + if (manager) { + manager.destroy(); + styleManagers.delete(element); + } + } + var throttledRenderAllStyles = throttle(function (callback) { + styleManagers.forEach(function (manager) { return manager.render(filter, variables); }); + callback && callback(); + }); + var cancelRendering = function () { + throttledRenderAllStyles.cancel(); + }; + function isPageLoaded() { + return document.readyState === 'complete' || document.readyState === 'interactive'; + } + function onReadyStateChange() { + if (!isPageLoaded()) { + return; + } + document.removeEventListener('readystatechange', onReadyStateChange); + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + } + var documentVisibilityListener = null; + var didDocumentShowUp = !document.hidden; + function watchForDocumentVisibility(callback) { + var alreadyWatching = Boolean(documentVisibilityListener); + documentVisibilityListener = function () { + if (!document.hidden) { + stopWatchingForDocumentVisibility(); + callback(); + didDocumentShowUp = true; + } + }; + if (!alreadyWatching) { + document.addEventListener('visibilitychange', documentVisibilityListener); + } + } + function stopWatchingForDocumentVisibility() { + document.removeEventListener('visibilitychange', documentVisibilityListener); + documentVisibilityListener = null; + } + function createThemeAndWatchForUpdates() { + createStaticStyleOverrides(); + function runDynamicStyle() { + createDynamicStyleOverrides(); + watchForUpdates(); + } + if (document.hidden) { + watchForDocumentVisibility(runDynamicStyle); + } + else { + runDynamicStyle(); + } + changeMetaThemeColorWhenAvailable(filter); + } + function watchForUpdates() { + watchForStyleChanges(function (_a) { + var created = _a.created, updated = _a.updated, removed = _a.removed; + var createdStyles = new Set(created); + var movedStyles = new Set(removed.filter(function (style) { return createdStyles.has(style); })); + removed + .filter(function (style) { return !movedStyles.has(style); }) + .forEach(function (style) { return removeManager(style); }); + var newManagers = Array.from(new Set(created.concat(updated))) + .filter(function (style) { return !styleManagers.has(style); }) + .map(function (style) { return createManager(style); }); + var newVariables = newManagers + .map(function (manager) { return manager.details(); }) + .filter(function (details) { return details && details.variables.size > 0; }) + .map(function (_a) { + var variables = _a.variables; + return variables; + }); + if (newVariables.length === 0) { + newManagers.forEach(function (manager) { return manager.render(filter, variables); }); + } + else { + newVariables.forEach(function (variables) { return updateVariables(variables); }); + throttledRenderAllStyles(); + } + newManagers.forEach(function (manager) { return manager.watch(); }); + }); + watchForInlineStyles(function (element) { + overrideInlineStyle(element, filter); + if (element === document.documentElement) { + var rootVariables = getElementCSSVariables(document.documentElement); + if (rootVariables.size > 0) { + updateVariables(rootVariables); + throttledRenderAllStyles(); + } + } + }); + document.addEventListener('readystatechange', onReadyStateChange); + } + function stopWatchingForUpdates() { + styleManagers.forEach(function (manager) { return manager.pause(); }); + stopStylePositionWatchers(); + stopWatchingForStyleChanges(); + stopWatchingForInlineStyles(); + document.removeEventListener('readystatechange', onReadyStateChange); + } + function createOrUpdateDynamicTheme(filterConfig, dynamicThemeFixes, iframe) { + filter = filterConfig; + fixes = dynamicThemeFixes; + isIFrame = iframe; + if (document.head) { + createThemeAndWatchForUpdates(); + } + else { + if (!isFirefox()) { + var fallbackStyle = createOrUpdateStyle('darkreader--fallback'); + document.documentElement.appendChild(fallbackStyle); + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: true }); + } + var headObserver_1 = new MutationObserver(function () { + if (document.head) { + headObserver_1.disconnect(); + createThemeAndWatchForUpdates(); + } + }); + headObserver_1.observe(document, { childList: true, subtree: true }); + } + } + function removeDynamicTheme() { + cleanDynamicThemeCache(); + removeNode(document.querySelector('.darkreader--fallback')); + if (document.head) { + restoreMetaThemeColor(); + removeNode(document.head.querySelector('.darkreader--user-agent')); + removeNode(document.head.querySelector('.darkreader--text')); + removeNode(document.head.querySelector('.darkreader--invert')); + removeNode(document.head.querySelector('.darkreader--inline')); + removeNode(document.head.querySelector('.darkreader--override')); + } + Array.from(styleManagers.keys()).forEach(function (el) { return removeManager(el); }); + Array.from(document.querySelectorAll('.darkreader')).forEach(removeNode); + } + function cleanDynamicThemeCache() { + stopWatchingForDocumentVisibility(); + cancelRendering(); + stopWatchingForUpdates(); + cleanModificationCache(); } - var defaultTheme = { - mode: 1, - brightness: 100, - contrast: 100, - grayscale: 0, - sepia: 0, - useFont: false, - fontFamily: '', - textStroke: 0, - engine: ThemeEngines.dynamicTheme, - stylesheet: '', - }; - function enable(themeOptions, fixes, isIFrame) { - if (fixes === void 0) { fixes = null; } - if (isIFrame === void 0) { isIFrame = false; } - var theme = __assign({}, defaultTheme, themeOptions); - if (theme.engine !== ThemeEngines.dynamicTheme) { - throw new Error('Theme engine is not supported'); - } - createOrUpdateDynamicTheme(theme, fixes, isIFrame); - } - function disable() { - removeDynamicTheme(); + var defaultTheme = { + mode: 1, + brightness: 100, + contrast: 100, + grayscale: 0, + sepia: 0, + useFont: false, + fontFamily: '', + textStroke: 0, + engine: ThemeEngines.dynamicTheme, + stylesheet: '', + }; + function enable(themeOptions, fixes, isIFrame) { + if (fixes === void 0) { fixes = null; } + if (isIFrame === void 0) { isIFrame = false; } + var theme = __assign({}, defaultTheme, themeOptions); + if (theme.engine !== ThemeEngines.dynamicTheme) { + throw new Error('Theme engine is not supported'); + } + createOrUpdateDynamicTheme(theme, fixes, isIFrame); + } + function disable() { + removeDynamicTheme(); } exports.disable = disable;