|
@@ -0,0 +1,5488 @@
|
|
|
|
+/**
|
|
|
|
+ * Dark Reader v4.9.51
|
|
|
|
+ * https://darkreader.org/
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+(function (global, factory) {
|
|
|
|
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
|
|
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
|
|
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.DarkReader = {}));
|
|
|
|
+})(this, (function (exports) { 'use strict';
|
|
|
|
+
|
|
|
|
+ /*! *****************************************************************************
|
|
|
|
+ Copyright (c) Microsoft Corporation.
|
|
|
|
+
|
|
|
|
+ Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
+ purpose with or without fee is hereby granted.
|
|
|
|
+
|
|
|
|
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
|
|
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
|
|
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
|
|
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
|
|
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
|
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
+ PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
+ ***************************************************************************** */
|
|
|
|
+
|
|
|
|
+ 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) {
|
|
|
|
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
|
|
+ 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) : adopt(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 };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function __values(o) {
|
|
|
|
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
|
|
+ if (m) return m.call(o);
|
|
|
|
+ if (o && typeof o.length === "number") return {
|
|
|
|
+ next: function () {
|
|
|
|
+ if (o && i >= o.length) o = void 0;
|
|
|
|
+ return { value: o && o[i++], done: !o };
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function __read(o, n) {
|
|
|
|
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
|
|
+ if (!m) return o;
|
|
|
|
+ var i = m.call(o), r, ar = [], e;
|
|
|
|
+ try {
|
|
|
|
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
|
|
+ }
|
|
|
|
+ catch (error) { e = { error: error }; }
|
|
|
|
+ finally {
|
|
|
|
+ try {
|
|
|
|
+ if (r && !r.done && (m = i["return"])) m.call(i);
|
|
|
|
+ }
|
|
|
|
+ finally { if (e) throw e.error; }
|
|
|
|
+ }
|
|
|
|
+ return ar;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function __spreadArray(to, from, pack) {
|
|
|
|
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
|
|
+ if (ar || !(i in from)) {
|
|
|
|
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
|
|
+ ar[i] = from[i];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return to.concat(ar || Array.prototype.slice.call(from));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var MessageType = {
|
|
|
|
+ UI_GET_DATA: 'ui-get-data',
|
|
|
|
+ UI_SUBSCRIBE_TO_CHANGES: 'ui-subscribe-to-changes',
|
|
|
|
+ UI_UNSUBSCRIBE_FROM_CHANGES: 'ui-unsubscribe-from-changes',
|
|
|
|
+ UI_CHANGE_SETTINGS: 'ui-change-settings',
|
|
|
|
+ UI_SET_THEME: 'ui-set-theme',
|
|
|
|
+ UI_SET_SHORTCUT: 'ui-set-shortcut',
|
|
|
|
+ UI_TOGGLE_ACTIVE_TAB: 'ui-toggle-active-tab',
|
|
|
|
+ UI_MARK_NEWS_AS_READ: 'ui-mark-news-as-read',
|
|
|
|
+ UI_MARK_NEWS_AS_DISPLAYED: 'ui-mark-news-as-displayed',
|
|
|
|
+ UI_LOAD_CONFIG: 'ui-load-config',
|
|
|
|
+ UI_APPLY_DEV_DYNAMIC_THEME_FIXES: 'ui-apply-dev-dynamic-theme-fixes',
|
|
|
|
+ UI_RESET_DEV_DYNAMIC_THEME_FIXES: 'ui-reset-dev-dynamic-theme-fixes',
|
|
|
|
+ UI_APPLY_DEV_INVERSION_FIXES: 'ui-apply-dev-inversion-fixes',
|
|
|
|
+ UI_RESET_DEV_INVERSION_FIXES: 'ui-reset-dev-inversion-fixes',
|
|
|
|
+ UI_APPLY_DEV_STATIC_THEMES: 'ui-apply-dev-static-themes',
|
|
|
|
+ UI_RESET_DEV_STATIC_THEMES: 'ui-reset-dev-static-themes',
|
|
|
|
+ UI_SAVE_FILE: 'ui-save-file',
|
|
|
|
+ UI_REQUEST_EXPORT_CSS: 'ui-request-export-css',
|
|
|
|
+ BG_CHANGES: 'bg-changes',
|
|
|
|
+ BG_ADD_CSS_FILTER: 'bg-add-css-filter',
|
|
|
|
+ BG_ADD_STATIC_THEME: 'bg-add-static-theme',
|
|
|
|
+ BG_ADD_SVG_FILTER: 'bg-add-svg-filter',
|
|
|
|
+ BG_ADD_DYNAMIC_THEME: 'bg-add-dynamic-theme',
|
|
|
|
+ BG_EXPORT_CSS: 'bg-export-css',
|
|
|
|
+ BG_UNSUPPORTED_SENDER: 'bg-unsupported-sender',
|
|
|
|
+ BG_CLEAN_UP: 'bg-clean-up',
|
|
|
|
+ BG_RELOAD: 'bg-reload',
|
|
|
|
+ BG_FETCH_RESPONSE: 'bg-fetch-response',
|
|
|
|
+ BG_UI_UPDATE: 'bg-ui-update',
|
|
|
|
+ BG_CSS_UPDATE: 'bg-css-update',
|
|
|
|
+ CS_COLOR_SCHEME_CHANGE: 'cs-color-scheme-change',
|
|
|
|
+ CS_FRAME_CONNECT: 'cs-frame-connect',
|
|
|
|
+ CS_FRAME_FORGET: 'cs-frame-forget',
|
|
|
|
+ CS_FRAME_FREEZE: 'cs-frame-freeze',
|
|
|
|
+ CS_FRAME_RESUME: 'cs-frame-resume',
|
|
|
|
+ CS_EXPORT_CSS_RESPONSE: 'cs-export-css-response',
|
|
|
|
+ CS_FETCH: 'cs-fetch',
|
|
|
|
+ CS_DARK_THEME_DETECTED: 'cs-dark-theme-detected',
|
|
|
|
+ CS_DARK_THEME_NOT_DETECTED: 'cs-dark-theme-not-detected',
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ var userAgent = typeof navigator === 'undefined' ? 'some useragent' : navigator.userAgent.toLowerCase();
|
|
|
|
+ var platform = typeof navigator === 'undefined' ? 'some platform' : navigator.platform.toLowerCase();
|
|
|
|
+ var isChromium = userAgent.includes('chrome') || userAgent.includes('chromium');
|
|
|
|
+ var isThunderbird = userAgent.includes('thunderbird');
|
|
|
|
+ var isFirefox = userAgent.includes('firefox') || userAgent.includes('librewolf') || isThunderbird;
|
|
|
|
+ userAgent.includes('vivaldi');
|
|
|
|
+ userAgent.includes('yabrowser');
|
|
|
|
+ userAgent.includes('opr') || userAgent.includes('opera');
|
|
|
|
+ userAgent.includes('edg');
|
|
|
|
+ var isSafari = userAgent.includes('safari') && !isChromium;
|
|
|
|
+ var isWindows = platform.startsWith('win');
|
|
|
|
+ var isMacOS = platform.startsWith('mac');
|
|
|
|
+ userAgent.includes('mobile');
|
|
|
|
+ var isShadowDomSupported = typeof ShadowRoot === 'function';
|
|
|
|
+ var isMatchMediaChangeEventListenerSupported = (typeof MediaQueryList === 'function' &&
|
|
|
|
+ typeof MediaQueryList.prototype.addEventListener === 'function');
|
|
|
|
+ ((function () {
|
|
|
|
+ var m = userAgent.match(/chrom[e|ium]\/([^ ]+)/);
|
|
|
|
+ if (m && m[1]) {
|
|
|
|
+ return m[1];
|
|
|
|
+ }
|
|
|
|
+ return '';
|
|
|
|
+ }))();
|
|
|
|
+ var isDefinedSelectorSupported = (function () {
|
|
|
|
+ try {
|
|
|
|
+ document.querySelector(':defined');
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ catch (err) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ })();
|
|
|
|
+ globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.getManifest && globalThis.chrome.runtime.getManifest().manifest_version === 3;
|
|
|
|
+ var isCSSColorSchemePropSupported = (function () {
|
|
|
|
+ if (typeof document === 'undefined') {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ var el = document.createElement('div');
|
|
|
|
+ el.setAttribute('style', 'color-scheme: dark');
|
|
|
|
+ return el.style && el.style.colorScheme === 'dark';
|
|
|
|
+ })();
|
|
|
|
+
|
|
|
|
+ function getOKResponse(url, mimeType, origin) {
|
|
|
|
+ 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',
|
|
|
|
+ credentials: 'omit',
|
|
|
|
+ referrer: origin
|
|
|
|
+ })];
|
|
|
|
+ case 1:
|
|
|
|
+ response = _a.sent();
|
|
|
|
+ if (isFirefox && mimeType === 'text/css' && url.startsWith('moz-extension://') && url.endsWith('.css')) {
|
|
|
|
+ return [2, response];
|
|
|
|
+ }
|
|
|
|
+ if (mimeType && !response.headers.get('Content-Type').startsWith(mimeType)) {
|
|
|
|
+ throw new Error("Mime type mismatch when loading ".concat(url));
|
|
|
|
+ }
|
|
|
|
+ if (!response.ok) {
|
|
|
|
+ throw new Error("Unable to load ".concat(url, " ").concat(response.status, " ").concat(response.statusText));
|
|
|
|
+ }
|
|
|
|
+ return [2, response];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function loadAsDataURL(url, mimeType) {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ var response;
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ switch (_a.label) {
|
|
|
|
+ case 0: return [4, getOKResponse(url, mimeType)];
|
|
|
|
+ case 1:
|
|
|
|
+ response = _a.sent();
|
|
|
|
+ return [4, readResponseAsDataURL(response)];
|
|
|
|
+ case 2: return [2, _a.sent()];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function readResponseAsDataURL(response) {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ var blob, dataURL;
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ switch (_a.label) {
|
|
|
|
+ case 0: return [4, response.blob()];
|
|
|
|
+ case 1:
|
|
|
|
+ blob = _a.sent();
|
|
|
|
+ return [4, (new Promise(function (resolve) {
|
|
|
|
+ var reader = new FileReader();
|
|
|
|
+ reader.onloadend = function () { return resolve(reader.result); };
|
|
|
|
+ reader.readAsDataURL(blob);
|
|
|
|
+ }))];
|
|
|
|
+ case 2:
|
|
|
|
+ dataURL = _a.sent();
|
|
|
|
+ return [2, dataURL];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var throwCORSError = function (url) { return __awaiter(void 0, void 0, void 0, function () {
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ return [2, Promise.reject(new Error([
|
|
|
|
+ 'Embedded Dark Reader cannot access a cross-origin resource',
|
|
|
|
+ url,
|
|
|
|
+ 'Overview your URLs and CORS policies or use',
|
|
|
|
+ '`DarkReader.setFetchMethod(fetch: (url) => Promise<Response>))`.',
|
|
|
|
+ 'See if using `DarkReader.setFetchMethod(window.fetch)`',
|
|
|
|
+ 'before `DarkReader.enable()` works.'
|
|
|
|
+ ].join(' ')))];
|
|
|
|
+ });
|
|
|
|
+ }); };
|
|
|
|
+ var fetcher = throwCORSError;
|
|
|
|
+ function setFetchMethod$1(fetch) {
|
|
|
|
+ if (fetch) {
|
|
|
|
+ fetcher = fetch;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ fetcher = throwCORSError;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function callFetchMethod(url) {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ switch (_a.label) {
|
|
|
|
+ case 0: return [4, fetcher(url)];
|
|
|
|
+ case 1: return [2, _a.sent()];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!window.chrome) {
|
|
|
|
+ window.chrome = {};
|
|
|
|
+ }
|
|
|
|
+ if (!chrome.runtime) {
|
|
|
|
+ chrome.runtime = {};
|
|
|
|
+ }
|
|
|
|
+ var messageListeners = new Set();
|
|
|
|
+ function sendMessage() {
|
|
|
|
+ var args = [];
|
|
|
|
+ for (var _i = 0; _i < arguments.length; _i++) {
|
|
|
|
+ args[_i] = arguments[_i];
|
|
|
|
+ }
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ var id_1, _a, url, responseType, response, text_1, error_1;
|
|
|
|
+ return __generator(this, function (_b) {
|
|
|
|
+ switch (_b.label) {
|
|
|
|
+ case 0:
|
|
|
|
+ if (!(args[0] && args[0].type === MessageType.CS_FETCH)) return [3, 8];
|
|
|
|
+ id_1 = args[0].id;
|
|
|
|
+ _b.label = 1;
|
|
|
|
+ case 1:
|
|
|
|
+ _b.trys.push([1, 7, , 8]);
|
|
|
|
+ _a = args[0].data, url = _a.url, responseType = _a.responseType;
|
|
|
|
+ return [4, callFetchMethod(url)];
|
|
|
|
+ case 2:
|
|
|
|
+ response = _b.sent();
|
|
|
|
+ if (!(responseType === 'data-url')) return [3, 4];
|
|
|
|
+ return [4, readResponseAsDataURL(response)];
|
|
|
|
+ case 3:
|
|
|
|
+ text_1 = _b.sent();
|
|
|
|
+ return [3, 6];
|
|
|
|
+ case 4: return [4, response.text()];
|
|
|
|
+ case 5:
|
|
|
|
+ text_1 = _b.sent();
|
|
|
|
+ _b.label = 6;
|
|
|
|
+ case 6:
|
|
|
|
+ messageListeners.forEach(function (cb) { return cb({ type: MessageType.BG_FETCH_RESPONSE, data: text_1, error: null, id: id_1 }); });
|
|
|
|
+ return [3, 8];
|
|
|
|
+ case 7:
|
|
|
|
+ error_1 = _b.sent();
|
|
|
|
+ console.error(error_1);
|
|
|
|
+ messageListeners.forEach(function (cb) { return cb({ type: MessageType.BG_FETCH_RESPONSE, data: null, error: error_1, id: id_1 }); });
|
|
|
|
+ return [3, 8];
|
|
|
|
+ case 8: return [2];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function addMessageListener(callback) {
|
|
|
|
+ messageListeners.add(callback);
|
|
|
|
+ }
|
|
|
|
+ if (typeof chrome.runtime.sendMessage === 'function') {
|
|
|
|
+ var nativeSendMessage_1 = chrome.runtime.sendMessage;
|
|
|
|
+ chrome.runtime.sendMessage = function () {
|
|
|
|
+ var args = [];
|
|
|
|
+ for (var _i = 0; _i < arguments.length; _i++) {
|
|
|
|
+ args[_i] = arguments[_i];
|
|
|
|
+ }
|
|
|
|
+ sendMessage.apply(void 0, __spreadArray([], __read(args), false));
|
|
|
|
+ nativeSendMessage_1.apply(chrome.runtime, args);
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ chrome.runtime.sendMessage = sendMessage;
|
|
|
|
+ }
|
|
|
|
+ if (!chrome.runtime.onMessage) {
|
|
|
|
+ chrome.runtime.onMessage = {};
|
|
|
|
+ }
|
|
|
|
+ if (typeof chrome.runtime.onMessage.addListener === 'function') {
|
|
|
|
+ var nativeAddListener_1 = chrome.runtime.onMessage.addListener;
|
|
|
|
+ chrome.runtime.onMessage.addListener = function () {
|
|
|
|
+ var args = [];
|
|
|
|
+ for (var _i = 0; _i < arguments.length; _i++) {
|
|
|
|
+ args[_i] = arguments[_i];
|
|
|
|
+ }
|
|
|
|
+ addMessageListener(args[0]);
|
|
|
|
+ nativeAddListener_1.apply(chrome.runtime.onMessage, args);
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ chrome.runtime.onMessage.addListener = function () {
|
|
|
|
+ var args = [];
|
|
|
|
+ for (var _i = 0; _i < arguments.length; _i++) {
|
|
|
|
+ args[_i] = arguments[_i];
|
|
|
|
+ }
|
|
|
|
+ return addMessageListener(args[0]);
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var ThemeEngines = {
|
|
|
|
+ cssFilter: 'cssFilter',
|
|
|
|
+ svgFilter: 'svgFilter',
|
|
|
|
+ staticTheme: 'staticTheme',
|
|
|
|
+ dynamicTheme: 'dynamicTheme',
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ var DEFAULT_COLORS = {
|
|
|
|
+ darkScheme: {
|
|
|
|
+ background: '#181a1b',
|
|
|
|
+ text: '#e8e6e3',
|
|
|
|
+ },
|
|
|
|
+ lightScheme: {
|
|
|
|
+ background: '#dcdad7',
|
|
|
|
+ text: '#181a1b',
|
|
|
|
+ },
|
|
|
|
+ };
|
|
|
|
+ var DEFAULT_THEME = {
|
|
|
|
+ mode: 1,
|
|
|
|
+ brightness: 100,
|
|
|
|
+ contrast: 100,
|
|
|
|
+ grayscale: 0,
|
|
|
|
+ sepia: 0,
|
|
|
|
+ useFont: false,
|
|
|
|
+ fontFamily: isMacOS ? 'Helvetica Neue' : isWindows ? 'Segoe UI' : 'Open Sans',
|
|
|
|
+ textStroke: 0,
|
|
|
|
+ engine: ThemeEngines.dynamicTheme,
|
|
|
|
+ stylesheet: '',
|
|
|
|
+ darkSchemeBackgroundColor: DEFAULT_COLORS.darkScheme.background,
|
|
|
|
+ darkSchemeTextColor: DEFAULT_COLORS.darkScheme.text,
|
|
|
|
+ lightSchemeBackgroundColor: DEFAULT_COLORS.lightScheme.background,
|
|
|
|
+ lightSchemeTextColor: DEFAULT_COLORS.lightScheme.text,
|
|
|
|
+ scrollbarColor: isMacOS ? '' : 'auto',
|
|
|
|
+ selectionColor: 'auto',
|
|
|
|
+ styleSystemControls: !isCSSColorSchemePropSupported,
|
|
|
|
+ lightColorScheme: 'Default',
|
|
|
|
+ darkColorScheme: 'Default',
|
|
|
|
+ immediateModify: false,
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ function isArrayLike(items) {
|
|
|
|
+ return items.length != null;
|
|
|
|
+ }
|
|
|
|
+ function forEach(items, iterator) {
|
|
|
|
+ var e_1, _a;
|
|
|
|
+ if (isArrayLike(items)) {
|
|
|
|
+ for (var i = 0, len = items.length; i < len; i++) {
|
|
|
|
+ iterator(items[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ try {
|
|
|
|
+ for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
|
|
|
|
+ var item = items_1_1.value;
|
|
|
|
+ iterator(item);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
|
|
+ finally {
|
|
|
|
+ try {
|
|
|
|
+ if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
|
|
|
|
+ }
|
|
|
|
+ finally { if (e_1) throw e_1.error; }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function push(array, addition) {
|
|
|
|
+ forEach(addition, function (a) { return array.push(a); });
|
|
|
|
+ }
|
|
|
|
+ function toArray(items) {
|
|
|
|
+ var results = [];
|
|
|
|
+ for (var i = 0, len = items.length; i < len; i++) {
|
|
|
|
+ results.push(items[i]);
|
|
|
|
+ }
|
|
|
|
+ return results;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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 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, __spreadArray([], __read(lastArgs), false));
|
|
|
|
+ frameId = requestAnimationFrame(function () {
|
|
|
|
+ frameId = null;
|
|
|
|
+ if (pending) {
|
|
|
|
+ callback.apply(void 0, __spreadArray([], __read(lastArgs), false));
|
|
|
|
+ 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 removeNode(node) {
|
|
|
|
+ node && node.parentNode && node.parentNode.removeChild(node);
|
|
|
|
+ }
|
|
|
|
+ function watchForNodePosition(node, mode, onRestore) {
|
|
|
|
+ if (onRestore === void 0) { onRestore = Function.prototype; }
|
|
|
|
+ var MAX_ATTEMPTS_COUNT = 10;
|
|
|
|
+ var RETRY_TIMEOUT = getDuration({ seconds: 2 });
|
|
|
|
+ var ATTEMPTS_INTERVAL = getDuration({ seconds: 10 });
|
|
|
|
+ var prevSibling = node.previousSibling;
|
|
|
|
+ var parent = node.parentNode;
|
|
|
|
+ if (!parent) {
|
|
|
|
+ throw new Error('Unable to watch for node position: parent element not found');
|
|
|
|
+ }
|
|
|
|
+ if (mode === 'prev-sibling' && !prevSibling) {
|
|
|
|
+ throw new Error('Unable to watch for node position: there is no previous sibling');
|
|
|
|
+ }
|
|
|
|
+ var attempts = 0;
|
|
|
|
+ var start = null;
|
|
|
|
+ var timeoutId = null;
|
|
|
|
+ var restore = throttle(function () {
|
|
|
|
+ if (timeoutId) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ 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 paused: retry in ".concat(RETRY_TIMEOUT, "ms"), node, prevSibling);
|
|
|
|
+ timeoutId = setTimeout(function () {
|
|
|
|
+ start = null;
|
|
|
|
+ attempts = 0;
|
|
|
|
+ timeoutId = null;
|
|
|
|
+ restore();
|
|
|
|
+ }, RETRY_TIMEOUT);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ start = now;
|
|
|
|
+ attempts = 1;
|
|
|
|
+ }
|
|
|
|
+ if (mode === 'parent') {
|
|
|
|
+ if (prevSibling && prevSibling.parentNode !== parent) {
|
|
|
|
+ logWarn('Unable to restore node position: sibling parent changed', node, prevSibling, parent);
|
|
|
|
+ stop();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (mode === 'prev-sibling') {
|
|
|
|
+ if (prevSibling.parentNode == null) {
|
|
|
|
+ logWarn('Unable to restore node position: sibling was removed', node, prevSibling, parent);
|
|
|
|
+ stop();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (prevSibling.parentNode !== parent) {
|
|
|
|
+ logWarn('Style was moved to another parent', node, prevSibling, parent);
|
|
|
|
+ updateParent(prevSibling.parentNode);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ logWarn('Restoring node position', node, prevSibling, parent);
|
|
|
|
+ parent.insertBefore(node, prevSibling ? prevSibling.nextSibling : parent.firstChild);
|
|
|
|
+ observer.takeRecords();
|
|
|
|
+ onRestore && onRestore();
|
|
|
|
+ });
|
|
|
|
+ var observer = new MutationObserver(function () {
|
|
|
|
+ if ((mode === 'parent' && node.parentNode !== parent) ||
|
|
|
|
+ (mode === 'prev-sibling' && node.previousSibling !== prevSibling)) {
|
|
|
|
+ restore();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ var run = function () {
|
|
|
|
+ observer.observe(parent, { childList: true });
|
|
|
|
+ };
|
|
|
|
+ var stop = function () {
|
|
|
|
+ clearTimeout(timeoutId);
|
|
|
|
+ observer.disconnect();
|
|
|
|
+ restore.cancel();
|
|
|
|
+ };
|
|
|
|
+ var skip = function () {
|
|
|
|
+ observer.takeRecords();
|
|
|
|
+ };
|
|
|
|
+ var updateParent = function (parentNode) {
|
|
|
|
+ parent = parentNode;
|
|
|
|
+ stop();
|
|
|
|
+ run();
|
|
|
|
+ };
|
|
|
|
+ run();
|
|
|
|
+ return { run: run, stop: stop, skip: skip };
|
|
|
|
+ }
|
|
|
|
+ function iterateShadowHosts(root, iterator) {
|
|
|
|
+ if (root == null) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ var walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
|
|
|
|
+ acceptNode: function (node) {
|
|
|
|
+ return node.shadowRoot == null ? NodeFilter.FILTER_SKIP : NodeFilter.FILTER_ACCEPT;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ for (var node = (root.shadowRoot ? walker.currentNode : walker.nextNode()); node != null; node = walker.nextNode()) {
|
|
|
|
+ if (node.classList.contains('surfingkeys_hints_host')) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ iterator(node);
|
|
|
|
+ iterateShadowHosts(node.shadowRoot, iterator);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ var isDOMReady = function () {
|
|
|
|
+ return document.readyState === 'complete' || document.readyState === 'interactive';
|
|
|
|
+ };
|
|
|
|
+ function setIsDOMReady(newFunc) {
|
|
|
|
+ isDOMReady = newFunc;
|
|
|
|
+ }
|
|
|
|
+ var readyStateListeners = new Set();
|
|
|
|
+ function addDOMReadyListener(listener) {
|
|
|
|
+ isDOMReady() ? listener() : readyStateListeners.add(listener);
|
|
|
|
+ }
|
|
|
|
+ function removeDOMReadyListener(listener) {
|
|
|
|
+ readyStateListeners.delete(listener);
|
|
|
|
+ }
|
|
|
|
+ function isReadyStateComplete() {
|
|
|
|
+ return document.readyState === 'complete';
|
|
|
|
+ }
|
|
|
|
+ var readyStateCompleteListeners = new Set();
|
|
|
|
+ function addReadyStateCompleteListener(listener) {
|
|
|
|
+ isReadyStateComplete() ? listener() : readyStateCompleteListeners.add(listener);
|
|
|
|
+ }
|
|
|
|
+ function cleanReadyStateCompleteListeners() {
|
|
|
|
+ readyStateCompleteListeners.clear();
|
|
|
|
+ }
|
|
|
|
+ if (!isDOMReady()) {
|
|
|
|
+ var onReadyStateChange_1 = function () {
|
|
|
|
+ if (isDOMReady()) {
|
|
|
|
+ readyStateListeners.forEach(function (listener) { return listener(); });
|
|
|
|
+ readyStateListeners.clear();
|
|
|
|
+ if (isReadyStateComplete()) {
|
|
|
|
+ document.removeEventListener('readystatechange', onReadyStateChange_1);
|
|
|
|
+ readyStateCompleteListeners.forEach(function (listener) { return listener(); });
|
|
|
|
+ readyStateCompleteListeners.clear();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ document.addEventListener('readystatechange', onReadyStateChange_1);
|
|
|
|
+ }
|
|
|
|
+ var HUGE_MUTATIONS_COUNT = 1000;
|
|
|
|
+ function isHugeMutation(mutations) {
|
|
|
|
+ if (mutations.length > HUGE_MUTATIONS_COUNT) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ var addedNodesCount = 0;
|
|
|
|
+ for (var i = 0; i < mutations.length; i++) {
|
|
|
|
+ addedNodesCount += mutations[i].addedNodes.length;
|
|
|
|
+ if (addedNodesCount > HUGE_MUTATIONS_COUNT) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ function getElementsTreeOperations(mutations) {
|
|
|
|
+ var additions = new Set();
|
|
|
|
+ var deletions = new Set();
|
|
|
|
+ var moves = new Set();
|
|
|
|
+ mutations.forEach(function (m) {
|
|
|
|
+ forEach(m.addedNodes, function (n) {
|
|
|
|
+ if (n instanceof Element && n.isConnected) {
|
|
|
|
+ additions.add(n);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ forEach(m.removedNodes, function (n) {
|
|
|
|
+ if (n instanceof Element) {
|
|
|
|
+ if (n.isConnected) {
|
|
|
|
+ moves.add(n);
|
|
|
|
+ additions.delete(n);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ deletions.add(n);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ var duplicateAdditions = [];
|
|
|
|
+ var duplicateDeletions = [];
|
|
|
|
+ additions.forEach(function (node) {
|
|
|
|
+ if (additions.has(node.parentElement)) {
|
|
|
|
+ duplicateAdditions.push(node);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ deletions.forEach(function (node) {
|
|
|
|
+ if (deletions.has(node.parentElement)) {
|
|
|
|
+ duplicateDeletions.push(node);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ duplicateAdditions.forEach(function (node) { return additions.delete(node); });
|
|
|
|
+ duplicateDeletions.forEach(function (node) { return deletions.delete(node); });
|
|
|
|
+ return { additions: additions, moves: moves, deletions: deletions };
|
|
|
|
+ }
|
|
|
|
+ var optimizedTreeObservers = new Map();
|
|
|
|
+ var optimizedTreeCallbacks = new WeakMap();
|
|
|
|
+ function createOptimizedTreeObserver(root, callbacks) {
|
|
|
|
+ var observer;
|
|
|
|
+ var observerCallbacks;
|
|
|
|
+ var domReadyListener;
|
|
|
|
+ if (optimizedTreeObservers.has(root)) {
|
|
|
|
+ observer = optimizedTreeObservers.get(root);
|
|
|
|
+ observerCallbacks = optimizedTreeCallbacks.get(observer);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ var hadHugeMutationsBefore_1 = false;
|
|
|
|
+ var subscribedForReadyState_1 = false;
|
|
|
|
+ observer = new MutationObserver(function (mutations) {
|
|
|
|
+ if (isHugeMutation(mutations)) {
|
|
|
|
+ if (!hadHugeMutationsBefore_1 || isDOMReady()) {
|
|
|
|
+ observerCallbacks.forEach(function (_a) {
|
|
|
|
+ var onHugeMutations = _a.onHugeMutations;
|
|
|
|
+ return onHugeMutations(root);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ else if (!subscribedForReadyState_1) {
|
|
|
|
+ domReadyListener = function () { return observerCallbacks.forEach(function (_a) {
|
|
|
|
+ var onHugeMutations = _a.onHugeMutations;
|
|
|
|
+ return onHugeMutations(root);
|
|
|
|
+ }); };
|
|
|
|
+ addDOMReadyListener(domReadyListener);
|
|
|
|
+ subscribedForReadyState_1 = true;
|
|
|
|
+ }
|
|
|
|
+ hadHugeMutationsBefore_1 = true;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ var elementsOperations_1 = getElementsTreeOperations(mutations);
|
|
|
|
+ observerCallbacks.forEach(function (_a) {
|
|
|
|
+ var onMinorMutations = _a.onMinorMutations;
|
|
|
|
+ return onMinorMutations(elementsOperations_1);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ observer.observe(root, { childList: true, subtree: true });
|
|
|
|
+ optimizedTreeObservers.set(root, observer);
|
|
|
|
+ observerCallbacks = new Set();
|
|
|
|
+ optimizedTreeCallbacks.set(observer, observerCallbacks);
|
|
|
|
+ }
|
|
|
|
+ observerCallbacks.add(callbacks);
|
|
|
|
+ return {
|
|
|
|
+ disconnect: function () {
|
|
|
|
+ observerCallbacks.delete(callbacks);
|
|
|
|
+ if (domReadyListener) {
|
|
|
|
+ removeDOMReadyListener(domReadyListener);
|
|
|
|
+ }
|
|
|
|
+ if (observerCallbacks.size === 0) {
|
|
|
|
+ observer.disconnect();
|
|
|
|
+ optimizedTreeCallbacks.delete(observer);
|
|
|
|
+ optimizedTreeObservers.delete(root);
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var anchor;
|
|
|
|
+ var parsedURLCache = new Map();
|
|
|
|
+ function fixBaseURL($url) {
|
|
|
|
+ if (!anchor) {
|
|
|
|
+ anchor = document.createElement('a');
|
|
|
|
+ }
|
|
|
|
+ anchor.href = $url;
|
|
|
|
+ return anchor.href;
|
|
|
|
+ }
|
|
|
|
+ function parseURL($url, $base) {
|
|
|
|
+ if ($base === void 0) { $base = null; }
|
|
|
|
+ var key = "".concat($url).concat($base ? ";".concat($base) : '');
|
|
|
|
+ if (parsedURLCache.has(key)) {
|
|
|
|
+ return parsedURLCache.get(key);
|
|
|
|
+ }
|
|
|
|
+ if ($base) {
|
|
|
|
+ var parsedURL_1 = new URL($url, fixBaseURL($base));
|
|
|
|
+ parsedURLCache.set(key, parsedURL_1);
|
|
|
|
+ return parsedURL_1;
|
|
|
|
+ }
|
|
|
|
+ var parsedURL = new URL(fixBaseURL($url));
|
|
|
|
+ parsedURLCache.set($url, parsedURL);
|
|
|
|
+ return parsedURL;
|
|
|
|
+ }
|
|
|
|
+ function getAbsoluteURL($base, $relative) {
|
|
|
|
+ if ($relative.match(/^data\\?\:/)) {
|
|
|
|
+ return $relative;
|
|
|
|
+ }
|
|
|
|
+ if (/^\/\//.test($relative)) {
|
|
|
|
+ return "".concat(location.protocol).concat($relative);
|
|
|
|
+ }
|
|
|
|
+ var b = parseURL($base);
|
|
|
|
+ var a = parseURL($relative, b.href);
|
|
|
|
+ return a.href;
|
|
|
|
+ }
|
|
|
|
+ function isRelativeHrefOnAbsolutePath(href) {
|
|
|
|
+ if (href.startsWith('data:')) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ var url = parseURL(href);
|
|
|
|
+ if (url.protocol !== location.protocol) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if (url.hostname !== location.hostname) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if (url.port !== location.port) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ return url.pathname === location.pathname;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function iterateCSSRules(rules, iterate, onMediaRuleError) {
|
|
|
|
+ forEach(rules, function (rule) {
|
|
|
|
+ if (rule.selectorText) {
|
|
|
|
+ iterate(rule);
|
|
|
|
+ }
|
|
|
|
+ else if (rule.href) {
|
|
|
|
+ try {
|
|
|
|
+ iterateCSSRules(rule.styleSheet.cssRules, iterate, onMediaRuleError);
|
|
|
|
+ }
|
|
|
|
+ catch (err) {
|
|
|
|
+ logInfo("Found a non-loaded link.");
|
|
|
|
+ onMediaRuleError && onMediaRuleError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (rule.media) {
|
|
|
|
+ var media = Array.from(rule.media);
|
|
|
|
+ var isScreenOrAllOrQuery = media.some(function (m) { return m.startsWith('screen') || m.startsWith('all') || m.startsWith('('); });
|
|
|
|
+ var isPrintOrSpeech = media.some(function (m) { return m.startsWith('print') || m.startsWith('speech'); });
|
|
|
|
+ if (isScreenOrAllOrQuery || !isPrintOrSpeech) {
|
|
|
|
+ iterateCSSRules(rule.cssRules, iterate, onMediaRuleError);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (rule.conditionText) {
|
|
|
|
+ if (CSS.supports(rule.conditionText)) {
|
|
|
|
+ iterateCSSRules(rule.cssRules, iterate, onMediaRuleError);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ logWarn("CSSRule type not supported", rule);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ var shorthandVarDependantProperties = [
|
|
|
|
+ 'background',
|
|
|
|
+ 'border',
|
|
|
|
+ 'border-color',
|
|
|
|
+ 'border-bottom',
|
|
|
|
+ 'border-left',
|
|
|
|
+ 'border-right',
|
|
|
|
+ 'border-top',
|
|
|
|
+ 'outline',
|
|
|
|
+ 'outline-color',
|
|
|
|
+ ];
|
|
|
|
+ var shorthandVarDepPropRegexps = isSafari ? shorthandVarDependantProperties.map(function (prop) {
|
|
|
|
+ var regexp = new RegExp("".concat(prop, ":\\s*(.*?)\\s*;"));
|
|
|
|
+ return [prop, regexp];
|
|
|
|
+ }) : null;
|
|
|
|
+ function iterateCSSDeclarations(style, iterate) {
|
|
|
|
+ forEach(style, function (property) {
|
|
|
|
+ var value = style.getPropertyValue(property).trim();
|
|
|
|
+ if (!value) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ iterate(property, value);
|
|
|
|
+ });
|
|
|
|
+ var cssText = style.cssText;
|
|
|
|
+ if (cssText.includes('var(')) {
|
|
|
|
+ if (isSafari) {
|
|
|
|
+ shorthandVarDepPropRegexps.forEach(function (_a) {
|
|
|
|
+ var _b = __read(_a, 2), prop = _b[0], regexp = _b[1];
|
|
|
|
+ var match = cssText.match(regexp);
|
|
|
|
+ if (match && match[1]) {
|
|
|
|
+ var val = match[1].trim();
|
|
|
|
+ iterate(prop, val);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ shorthandVarDependantProperties.forEach(function (prop) {
|
|
|
|
+ var val = style.getPropertyValue(prop);
|
|
|
|
+ if (val && val.includes('var(')) {
|
|
|
|
+ iterate(prop, val);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ var cssURLRegex = /url\((('.+?')|(".+?")|([^\)]*?))\)/g;
|
|
|
|
+ var cssImportRegex = /@import\s*(url\()?(('.+?')|(".+?")|([^\)]*?))\)? ?(screen)?;?/gi;
|
|
|
|
+ function getCSSURLValue(cssURL) {
|
|
|
|
+ return cssURL.trim().replace(/^url\((.*)\)$/, '$1').trim().replace(/^"(.*)"$/, '$1').replace(/^'(.*)'$/, '$1');
|
|
|
|
+ }
|
|
|
|
+ function getCSSBaseBath(url) {
|
|
|
|
+ var cssURL = parseURL(url);
|
|
|
|
+ return "".concat(cssURL.origin).concat(cssURL.pathname.replace(/\?.*$/, '').replace(/(\/)([^\/]+)$/i, '$1'));
|
|
|
|
+ }
|
|
|
|
+ function replaceCSSRelativeURLsWithAbsolute($css, cssBasePath) {
|
|
|
|
+ return $css.replace(cssURLRegex, function (match) {
|
|
|
|
+ var pathValue = getCSSURLValue(match);
|
|
|
|
+ try {
|
|
|
|
+ return "url(\"".concat(getAbsoluteURL(cssBasePath, pathValue), "\")");
|
|
|
|
+ }
|
|
|
|
+ catch (err) {
|
|
|
|
+ logWarn('Not able to replace relative URL with Absolute URL, skipping');
|
|
|
|
+ return match;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ 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, '');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function evalMath(expression) {
|
|
|
|
+ var rpnStack = [];
|
|
|
|
+ var workingStack = [];
|
|
|
|
+ var lastToken;
|
|
|
|
+ for (var i = 0, len = expression.length; i < len; i++) {
|
|
|
|
+ var token = expression[i];
|
|
|
|
+ if (!token || token === ' ') {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if (operators.has(token)) {
|
|
|
|
+ var op = operators.get(token);
|
|
|
|
+ while (workingStack.length) {
|
|
|
|
+ var currentOp = operators.get(workingStack[0]);
|
|
|
|
+ if (!currentOp) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ if (op.lessOrEqualThan(currentOp)) {
|
|
|
|
+ rpnStack.push(workingStack.shift());
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ workingStack.unshift(token);
|
|
|
|
+ }
|
|
|
|
+ else if (!lastToken || operators.has(lastToken)) {
|
|
|
|
+ rpnStack.push(token);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ rpnStack[rpnStack.length - 1] += token;
|
|
|
|
+ }
|
|
|
|
+ lastToken = token;
|
|
|
|
+ }
|
|
|
|
+ rpnStack.push.apply(rpnStack, __spreadArray([], __read(workingStack), false));
|
|
|
|
+ var stack = [];
|
|
|
|
+ for (var i = 0, len = rpnStack.length; i < len; i++) {
|
|
|
|
+ var op = operators.get(rpnStack[i]);
|
|
|
|
+ if (op) {
|
|
|
|
+ var args = stack.splice(0, 2);
|
|
|
|
+ stack.push(op.exec(args[1], args[0]));
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ stack.unshift(parseFloat(rpnStack[i]));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return stack[0];
|
|
|
|
+ }
|
|
|
|
+ var Operator = (function () {
|
|
|
|
+ function Operator(precedence, method) {
|
|
|
|
+ this.precendce = precedence;
|
|
|
|
+ this.execMethod = method;
|
|
|
|
+ }
|
|
|
|
+ Operator.prototype.exec = function (left, right) {
|
|
|
|
+ return this.execMethod(left, right);
|
|
|
|
+ };
|
|
|
|
+ Operator.prototype.lessOrEqualThan = function (op) {
|
|
|
|
+ return this.precendce <= op.precendce;
|
|
|
|
+ };
|
|
|
|
+ return Operator;
|
|
|
|
+ }());
|
|
|
|
+ var operators = new Map([
|
|
|
|
+ ['+', new Operator(1, function (left, right) { return left + right; })],
|
|
|
|
+ ['-', new Operator(1, function (left, right) { return left - right; })],
|
|
|
|
+ ['*', new Operator(2, function (left, right) { return left * right; })],
|
|
|
|
+ ['/', new Operator(2, function (left, right) { return left / right; })],
|
|
|
|
+ ]);
|
|
|
|
+
|
|
|
|
+ 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 formatCSS(text) {
|
|
|
|
+ function trimLeft(text) {
|
|
|
|
+ return text.replace(/^\s+/, '');
|
|
|
|
+ }
|
|
|
|
+ function getIndent(depth) {
|
|
|
|
+ if (depth === 0) {
|
|
|
|
+ return '';
|
|
|
|
+ }
|
|
|
|
+ return ' '.repeat(4 * depth);
|
|
|
|
+ }
|
|
|
|
+ if (text.length < 50000) {
|
|
|
|
+ var emptyRuleRegexp = /[^{}]+{\s*}/;
|
|
|
|
+ while (emptyRuleRegexp.test(text)) {
|
|
|
|
+ text = text.replace(emptyRuleRegexp, '');
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ var css = (text
|
|
|
|
+ .replace(/\s{2,}/g, ' ')
|
|
|
|
+ .replace(/\{/g, '{\n')
|
|
|
|
+ .replace(/\}/g, '\n}\n')
|
|
|
|
+ .replace(/\;(?![^\(|\"]*(\)|\"))/g, ';\n')
|
|
|
|
+ .replace(/\,(?![^\(|\"]*(\)|\"))/g, ',\n')
|
|
|
|
+ .replace(/\n\s*\n/g, '\n')
|
|
|
|
+ .split('\n'));
|
|
|
|
+ var depth = 0;
|
|
|
|
+ var formatted = [];
|
|
|
|
+ for (var x = 0, len = css.length; x < len; x++) {
|
|
|
|
+ var line = "".concat(css[x], "\n");
|
|
|
|
+ if (line.includes('{')) {
|
|
|
|
+ formatted.push(getIndent(depth++) + trimLeft(line));
|
|
|
|
+ }
|
|
|
|
+ else if (line.includes('\}')) {
|
|
|
|
+ formatted.push(getIndent(--depth) + trimLeft(line));
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ formatted.push(getIndent(depth) + trimLeft(line));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return formatted.join('').trim();
|
|
|
|
+ }
|
|
|
|
+ function getParenthesesRange(input, searchStartIndex) {
|
|
|
|
+ if (searchStartIndex === void 0) { searchStartIndex = 0; }
|
|
|
|
+ var length = input.length;
|
|
|
|
+ var depth = 0;
|
|
|
|
+ var firstOpenIndex = -1;
|
|
|
|
+ for (var i = searchStartIndex; i < length; i++) {
|
|
|
|
+ if (depth === 0) {
|
|
|
|
+ var openIndex = input.indexOf('(', i);
|
|
|
|
+ if (openIndex < 0) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ firstOpenIndex = openIndex;
|
|
|
|
+ depth++;
|
|
|
|
+ i = openIndex;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ var closingIndex = input.indexOf(')', i);
|
|
|
|
+ if (closingIndex < 0) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ var openIndex = input.indexOf('(', i);
|
|
|
|
+ if (openIndex < 0 || closingIndex < openIndex) {
|
|
|
|
+ depth--;
|
|
|
|
+ if (depth === 0) {
|
|
|
|
+ return { start: firstOpenIndex, end: closingIndex + 1 };
|
|
|
|
+ }
|
|
|
|
+ i = closingIndex;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ depth++;
|
|
|
|
+ i = openIndex;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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 = __read([l, l, l].map(function (x) { return Math.round(x * 255); }), 3), 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 = __read((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); }), 3), 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(".concat(toFixed(r), ", ").concat(toFixed(g), ", ").concat(toFixed(b), ", ").concat(toFixed(a, 2), ")");
|
|
|
|
+ }
|
|
|
|
+ return "rgb(".concat(toFixed(r), ", ").concat(toFixed(g), ", ").concat(toFixed(b), ")");
|
|
|
|
+ }
|
|
|
|
+ function rgbToHexString(_a) {
|
|
|
|
+ var r = _a.r, g = _a.g, b = _a.b, a = _a.a;
|
|
|
|
+ return "#".concat((a != null && a < 1 ? [r, g, b, Math.round(a * 255)] : [r, g, b]).map(function (x) {
|
|
|
|
+ return "".concat(x < 16 ? '0' : '').concat(x.toString(16));
|
|
|
|
+ }).join(''));
|
|
|
|
+ }
|
|
|
|
+ function hslToString(hsl) {
|
|
|
|
+ var h = hsl.h, s = hsl.s, l = hsl.l, a = hsl.a;
|
|
|
|
+ if (a != null && a < 1) {
|
|
|
|
+ return "hsla(".concat(toFixed(h), ", ").concat(toFixed(s * 100), "%, ").concat(toFixed(l * 100), "%, ").concat(toFixed(a, 2), ")");
|
|
|
|
+ }
|
|
|
|
+ return "hsl(".concat(toFixed(h), ", ").concat(toFixed(s * 100), "%, ").concat(toFixed(l * 100), "%)");
|
|
|
|
+ }
|
|
|
|
+ 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 ".concat($color));
|
|
|
|
+ }
|
|
|
|
+ function getNumbers($color) {
|
|
|
|
+ var numbers = [];
|
|
|
|
+ var prevPos = 0;
|
|
|
|
+ var isMining = false;
|
|
|
|
+ var startIndex = $color.indexOf('(');
|
|
|
|
+ $color = $color.substring(startIndex + 1, $color.length - 1);
|
|
|
|
+ for (var i = 0; i < $color.length; i++) {
|
|
|
|
+ var c = $color[i];
|
|
|
|
+ if (c >= '0' && c <= '9' || c === '.' || c === '+' || c === '-') {
|
|
|
|
+ isMining = true;
|
|
|
|
+ }
|
|
|
|
+ else if (isMining && (c === ' ' || c === ',')) {
|
|
|
|
+ numbers.push($color.substring(prevPos, i));
|
|
|
|
+ isMining = false;
|
|
|
|
+ prevPos = i + 1;
|
|
|
|
+ }
|
|
|
|
+ else if (!isMining) {
|
|
|
|
+ prevPos = i + 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (isMining) {
|
|
|
|
+ numbers.push($color.substring(prevPos, $color.length));
|
|
|
|
+ }
|
|
|
|
+ return numbers;
|
|
|
|
+ }
|
|
|
|
+ function getNumbersFromString(str, range, units) {
|
|
|
|
+ var raw = getNumbers(str);
|
|
|
|
+ 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 _b = __read(_a, 1), u = _b[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 rgbRange = [255, 255, 255, 1];
|
|
|
|
+ var rgbUnits = { '%': 100 };
|
|
|
|
+ function parseRGB($rgb) {
|
|
|
|
+ var _a = __read(getNumbersFromString($rgb, rgbRange, rgbUnits), 4), 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 hslRange = [360, 1, 1, 1];
|
|
|
|
+ var hslUnits = { '%': 100, 'deg': 360, 'rad': 2 * Math.PI, 'turn': 1 };
|
|
|
|
+ function parseHSL($hsl) {
|
|
|
|
+ var _a = __read(getNumbersFromString($hsl, hslRange, hslUnits), 4), 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 = __read([0, 1, 2].map(function (i) { return parseInt("".concat(h[i]).concat(h[i]), 16); }), 3), r = _a[0], g = _a[1], b = _a[2];
|
|
|
|
+ var a = h.length === 3 ? 1 : (parseInt("".concat(h[3]).concat(h[3]), 16) / 255);
|
|
|
|
+ return { r: r, g: g, b: b, a: a };
|
|
|
|
+ }
|
|
|
|
+ case 6:
|
|
|
|
+ case 8: {
|
|
|
|
+ var _b = __read([0, 2, 4].map(function (i) { return parseInt(h.substring(i, i + 2), 16); }), 3), 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 ".concat($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
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ function lowerCalcExpression(color) {
|
|
|
|
+ var searchIndex = 0;
|
|
|
|
+ var replaceBetweenIndices = function (start, end, replacement) {
|
|
|
|
+ color = color.substring(0, start) + replacement + color.substring(end);
|
|
|
|
+ };
|
|
|
|
+ while ((searchIndex = color.indexOf('calc(')) !== -1) {
|
|
|
|
+ var range = getParenthesesRange(color, searchIndex);
|
|
|
|
+ if (!range) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ var slice = color.slice(range.start + 1, range.end - 1);
|
|
|
|
+ var includesPercentage = slice.includes('%');
|
|
|
|
+ slice = slice.split('%').join('');
|
|
|
|
+ var output = Math.round(evalMath(slice));
|
|
|
|
+ replaceBetweenIndices(range.start - 4, range.end, output + (includesPercentage ? '%' : ''));
|
|
|
|
+ }
|
|
|
|
+ return color;
|
|
|
|
+ }
|
|
|
|
+ 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 _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
|
|
+ return [key.toLowerCase(), value];
|
|
|
|
+ }));
|
|
|
|
+ function getSRGBLightness(r, g, b) {
|
|
|
|
+ return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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, len = m1.length; i < len; i++) {
|
|
|
|
+ result[i] = [];
|
|
|
|
+ for (var j = 0, len2 = m2[0].length; j < len2; j++) {
|
|
|
|
+ var sum = 0;
|
|
|
|
+ for (var k = 0, len3 = m1[0].length; k < len3; k++) {
|
|
|
|
+ sum += m1[i][k] * m2[k][j];
|
|
|
|
+ }
|
|
|
|
+ result[i][j] = sum;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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 _b = __read(_a, 3), r = _b[0], g = _b[1], b = _b[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 getBgPole(theme) {
|
|
|
|
+ var isDarkScheme = theme.mode === 1;
|
|
|
|
+ var prop = isDarkScheme ? 'darkSchemeBackgroundColor' : 'lightSchemeBackgroundColor';
|
|
|
|
+ return theme[prop];
|
|
|
|
+ }
|
|
|
|
+ function getFgPole(theme) {
|
|
|
|
+ var isDarkScheme = theme.mode === 1;
|
|
|
|
+ var prop = isDarkScheme ? 'darkSchemeTextColor' : 'lightSchemeTextColor';
|
|
|
|
+ return theme[prop];
|
|
|
|
+ }
|
|
|
|
+ var colorModificationCache = new Map();
|
|
|
|
+ var colorParseCache$1 = new Map();
|
|
|
|
+ function parseToHSLWithCache(color) {
|
|
|
|
+ if (colorParseCache$1.has(color)) {
|
|
|
|
+ return colorParseCache$1.get(color);
|
|
|
|
+ }
|
|
|
|
+ var rgb = parse(color);
|
|
|
|
+ var hsl = rgbToHSL(rgb);
|
|
|
|
+ colorParseCache$1.set(color, hsl);
|
|
|
|
+ return hsl;
|
|
|
|
+ }
|
|
|
|
+ function clearColorModificationCache() {
|
|
|
|
+ colorModificationCache.clear();
|
|
|
|
+ colorParseCache$1.clear();
|
|
|
|
+ }
|
|
|
|
+ var rgbCacheKeys = ['r', 'g', 'b', 'a'];
|
|
|
|
+ var themeCacheKeys$1 = ['mode', 'brightness', 'contrast', 'grayscale', 'sepia', 'darkSchemeBackgroundColor', 'darkSchemeTextColor', 'lightSchemeBackgroundColor', 'lightSchemeTextColor'];
|
|
|
|
+ function getCacheId(rgb, theme) {
|
|
|
|
+ var resultId = '';
|
|
|
|
+ rgbCacheKeys.forEach(function (key) {
|
|
|
|
+ resultId += "".concat(rgb[key], ";");
|
|
|
|
+ });
|
|
|
|
+ themeCacheKeys$1.forEach(function (key) {
|
|
|
|
+ resultId += "".concat(theme[key], ";");
|
|
|
|
+ });
|
|
|
|
+ return resultId;
|
|
|
|
+ }
|
|
|
|
+ function modifyColorWithCache(rgb, theme, modifyHSL, poleColor, anotherPoleColor) {
|
|
|
|
+ var fnCache;
|
|
|
|
+ if (colorModificationCache.has(modifyHSL)) {
|
|
|
|
+ fnCache = colorModificationCache.get(modifyHSL);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ fnCache = new Map();
|
|
|
|
+ colorModificationCache.set(modifyHSL, fnCache);
|
|
|
|
+ }
|
|
|
|
+ var id = getCacheId(rgb, theme);
|
|
|
|
+ if (fnCache.has(id)) {
|
|
|
|
+ return fnCache.get(id);
|
|
|
|
+ }
|
|
|
|
+ var hsl = rgbToHSL(rgb);
|
|
|
|
+ var pole = poleColor == null ? null : parseToHSLWithCache(poleColor);
|
|
|
|
+ var anotherPole = anotherPoleColor == null ? null : parseToHSLWithCache(anotherPoleColor);
|
|
|
|
+ var modified = modifyHSL(hsl, pole, anotherPole);
|
|
|
|
+ var _a = hslToRGB(modified), r = _a.r, g = _a.g, b = _a.b, a = _a.a;
|
|
|
|
+ var matrix = createFilterMatrix(theme);
|
|
|
|
+ var _b = __read(applyColorMatrix([r, g, b], matrix), 3), 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 modifyLightSchemeColor(rgb, theme) {
|
|
|
|
+ var poleBg = getBgPole(theme);
|
|
|
|
+ var poleFg = getFgPole(theme);
|
|
|
|
+ return modifyColorWithCache(rgb, theme, modifyLightModeHSL, poleFg, poleBg);
|
|
|
|
+ }
|
|
|
|
+ function modifyLightModeHSL(_a, poleFg, poleBg) {
|
|
|
|
+ var h = _a.h, s = _a.s, l = _a.l, a = _a.a;
|
|
|
|
+ var isDark = l < 0.5;
|
|
|
|
+ var isNeutral;
|
|
|
|
+ if (isDark) {
|
|
|
|
+ isNeutral = l < 0.2 || s < 0.12;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ var isBlue = h > 200 && h < 280;
|
|
|
|
+ isNeutral = s < 0.24 || (l > 0.8 && isBlue);
|
|
|
|
+ }
|
|
|
|
+ var hx = h;
|
|
|
|
+ var sx = l;
|
|
|
|
+ if (isNeutral) {
|
|
|
|
+ if (isDark) {
|
|
|
|
+ hx = poleFg.h;
|
|
|
|
+ sx = poleFg.s;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ hx = poleBg.h;
|
|
|
|
+ sx = poleBg.s;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ var lx = scale(l, 0, 1, poleFg.l, poleBg.l);
|
|
|
|
+ return { h: hx, s: sx, l: lx, a: a };
|
|
|
|
+ }
|
|
|
|
+ var MAX_BG_LIGHTNESS = 0.4;
|
|
|
|
+ function modifyBgHSL(_a, pole) {
|
|
|
|
+ var h = _a.h, s = _a.s, l = _a.l, a = _a.a;
|
|
|
|
+ var isDark = l < 0.5;
|
|
|
|
+ var isBlue = h > 200 && h < 280;
|
|
|
|
+ var isNeutral = s < 0.12 || (l > 0.8 && isBlue);
|
|
|
|
+ if (isDark) {
|
|
|
|
+ var lx_1 = scale(l, 0, 0.5, 0, MAX_BG_LIGHTNESS);
|
|
|
|
+ if (isNeutral) {
|
|
|
|
+ var hx_1 = pole.h;
|
|
|
|
+ var sx = pole.s;
|
|
|
|
+ return { h: hx_1, s: sx, l: lx_1, a: a };
|
|
|
|
+ }
|
|
|
|
+ return { h: h, s: s, l: lx_1, a: a };
|
|
|
|
+ }
|
|
|
|
+ var lx = scale(l, 0.5, 1, MAX_BG_LIGHTNESS, pole.l);
|
|
|
|
+ if (isNeutral) {
|
|
|
|
+ var hx_2 = pole.h;
|
|
|
|
+ var sx = pole.s;
|
|
|
|
+ return { h: hx_2, s: sx, l: lx, a: a };
|
|
|
|
+ }
|
|
|
|
+ var hx = h;
|
|
|
|
+ var isYellow = h > 60 && h < 180;
|
|
|
|
+ if (isYellow) {
|
|
|
|
+ var isCloserToGreen = h > 120;
|
|
|
|
+ if (isCloserToGreen) {
|
|
|
|
+ hx = scale(h, 120, 180, 135, 180);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ hx = scale(h, 60, 120, 60, 105);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (hx > 40 && hx < 80) {
|
|
|
|
+ lx *= 0.75;
|
|
|
|
+ }
|
|
|
|
+ return { h: hx, s: s, l: lx, a: a };
|
|
|
|
+ }
|
|
|
|
+ function modifyBackgroundColor(rgb, theme) {
|
|
|
|
+ if (theme.mode === 0) {
|
|
|
|
+ return modifyLightSchemeColor(rgb, theme);
|
|
|
|
+ }
|
|
|
|
+ var pole = getBgPole(theme);
|
|
|
|
+ return modifyColorWithCache(rgb, __assign(__assign({}, theme), { mode: 0 }), modifyBgHSL, pole);
|
|
|
|
+ }
|
|
|
|
+ var MIN_FG_LIGHTNESS = 0.55;
|
|
|
|
+ function modifyBlueFgHue(hue) {
|
|
|
|
+ return scale(hue, 205, 245, 205, 220);
|
|
|
|
+ }
|
|
|
|
+ function modifyFgHSL(_a, pole) {
|
|
|
|
+ var h = _a.h, s = _a.s, l = _a.l, a = _a.a;
|
|
|
|
+ var isLight = l > 0.5;
|
|
|
|
+ var isNeutral = l < 0.2 || s < 0.24;
|
|
|
|
+ var isBlue = !isNeutral && h > 205 && h < 245;
|
|
|
|
+ if (isLight) {
|
|
|
|
+ var lx_2 = scale(l, 0.5, 1, MIN_FG_LIGHTNESS, pole.l);
|
|
|
|
+ if (isNeutral) {
|
|
|
|
+ var hx_3 = pole.h;
|
|
|
|
+ var sx = pole.s;
|
|
|
|
+ return { h: hx_3, s: sx, l: lx_2, a: a };
|
|
|
|
+ }
|
|
|
|
+ var hx_4 = h;
|
|
|
|
+ if (isBlue) {
|
|
|
|
+ hx_4 = modifyBlueFgHue(h);
|
|
|
|
+ }
|
|
|
|
+ return { h: hx_4, s: s, l: lx_2, a: a };
|
|
|
|
+ }
|
|
|
|
+ if (isNeutral) {
|
|
|
|
+ var hx_5 = pole.h;
|
|
|
|
+ var sx = pole.s;
|
|
|
|
+ var lx_3 = scale(l, 0, 0.5, pole.l, MIN_FG_LIGHTNESS);
|
|
|
|
+ return { h: hx_5, s: sx, l: lx_3, a: a };
|
|
|
|
+ }
|
|
|
|
+ var hx = h;
|
|
|
|
+ var lx;
|
|
|
|
+ if (isBlue) {
|
|
|
|
+ hx = modifyBlueFgHue(h);
|
|
|
|
+ lx = scale(l, 0, 0.5, pole.l, Math.min(1, MIN_FG_LIGHTNESS + 0.05));
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ lx = scale(l, 0, 0.5, pole.l, MIN_FG_LIGHTNESS);
|
|
|
|
+ }
|
|
|
|
+ return { h: hx, s: s, l: lx, a: a };
|
|
|
|
+ }
|
|
|
|
+ function modifyForegroundColor(rgb, theme) {
|
|
|
|
+ if (theme.mode === 0) {
|
|
|
|
+ return modifyLightSchemeColor(rgb, theme);
|
|
|
|
+ }
|
|
|
|
+ var pole = getFgPole(theme);
|
|
|
|
+ return modifyColorWithCache(rgb, __assign(__assign({}, theme), { mode: 0 }), modifyFgHSL, pole);
|
|
|
|
+ }
|
|
|
|
+ function modifyBorderHSL(_a, poleFg, poleBg) {
|
|
|
|
+ var h = _a.h, s = _a.s, l = _a.l, a = _a.a;
|
|
|
|
+ var isDark = l < 0.5;
|
|
|
|
+ var isNeutral = l < 0.2 || s < 0.24;
|
|
|
|
+ var hx = h;
|
|
|
|
+ var sx = s;
|
|
|
|
+ if (isNeutral) {
|
|
|
|
+ if (isDark) {
|
|
|
|
+ hx = poleFg.h;
|
|
|
|
+ sx = poleFg.s;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ hx = poleBg.h;
|
|
|
|
+ sx = poleBg.s;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ var lx = scale(l, 0, 1, 0.5, 0.2);
|
|
|
|
+ return { h: hx, s: sx, l: lx, a: a };
|
|
|
|
+ }
|
|
|
|
+ function modifyBorderColor(rgb, theme) {
|
|
|
|
+ if (theme.mode === 0) {
|
|
|
|
+ return modifyLightSchemeColor(rgb, theme);
|
|
|
|
+ }
|
|
|
|
+ var poleFg = getFgPole(theme);
|
|
|
|
+ var poleBg = getBgPole(theme);
|
|
|
|
+ return modifyColorWithCache(rgb, __assign(__assign({}, theme), { mode: 0 }), modifyBorderHSL, poleFg, poleBg);
|
|
|
|
+ }
|
|
|
|
+ function modifyShadowColor(rgb, filter) {
|
|
|
|
+ return modifyBackgroundColor(rgb, filter);
|
|
|
|
+ }
|
|
|
|
+ function modifyGradientColor(rgb, filter) {
|
|
|
|
+ return modifyBackgroundColor(rgb, filter);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function createTextStyle(config) {
|
|
|
|
+ var lines = [];
|
|
|
|
+ lines.push('*:not(pre, pre *, code, .far, .fa, .glyphicon, [class*="vjs-"], .fab, .fa-github, .fas, .material-icons, .icofont, .typcn, mu, [class*="mu-"], .glyphicon, .icon) {');
|
|
|
|
+ if (config.useFont && config.fontFamily) {
|
|
|
|
+ lines.push(" font-family: ".concat(config.fontFamily, " !important;"));
|
|
|
|
+ }
|
|
|
|
+ if (config.textStroke > 0) {
|
|
|
|
+ lines.push(" -webkit-text-stroke: ".concat(config.textStroke, "px !important;"));
|
|
|
|
+ lines.push(" text-stroke: ".concat(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(".concat(config.brightness, "%)"));
|
|
|
|
+ }
|
|
|
|
+ if (config.contrast !== 100) {
|
|
|
|
+ filters.push("contrast(".concat(config.contrast, "%)"));
|
|
|
|
+ }
|
|
|
|
+ if (config.grayscale !== 0) {
|
|
|
|
+ filters.push("grayscale(".concat(config.grayscale, "%)"));
|
|
|
|
+ }
|
|
|
|
+ if (config.sepia !== 0) {
|
|
|
|
+ filters.push("sepia(".concat(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));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var counter = 0;
|
|
|
|
+ var resolvers$1 = new Map();
|
|
|
|
+ var rejectors = new Map();
|
|
|
|
+ function bgFetch(request) {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ return [2, new Promise(function (resolve, reject) {
|
|
|
|
+ var id = ++counter;
|
|
|
|
+ resolvers$1.set(id, resolve);
|
|
|
|
+ rejectors.set(id, reject);
|
|
|
|
+ chrome.runtime.sendMessage({ type: MessageType.CS_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 === MessageType.BG_FETCH_RESPONSE) {
|
|
|
|
+ var resolve = resolvers$1.get(id);
|
|
|
|
+ var reject = rejectors.get(id);
|
|
|
|
+ resolvers$1.delete(id);
|
|
|
|
+ rejectors.delete(id);
|
|
|
|
+ if (error) {
|
|
|
|
+ reject && reject(error);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ resolve && resolve(data);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ var AsyncQueue = (function () {
|
|
|
|
+ function AsyncQueue() {
|
|
|
|
+ this.queue = [];
|
|
|
|
+ this.timerId = null;
|
|
|
|
+ this.frameDuration = 1000 / 60;
|
|
|
|
+ }
|
|
|
|
+ AsyncQueue.prototype.addToQueue = function (entry) {
|
|
|
|
+ this.queue.push(entry);
|
|
|
|
+ this.startQueue();
|
|
|
|
+ };
|
|
|
|
+ AsyncQueue.prototype.stopQueue = function () {
|
|
|
|
+ if (this.timerId !== null) {
|
|
|
|
+ cancelAnimationFrame(this.timerId);
|
|
|
|
+ this.timerId = null;
|
|
|
|
+ }
|
|
|
|
+ this.queue = [];
|
|
|
|
+ };
|
|
|
|
+ AsyncQueue.prototype.startQueue = function () {
|
|
|
|
+ var _this = this;
|
|
|
|
+ if (this.timerId) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ this.timerId = requestAnimationFrame(function () {
|
|
|
|
+ _this.timerId = null;
|
|
|
|
+ var start = Date.now();
|
|
|
|
+ var cb;
|
|
|
|
+ while ((cb = _this.queue.shift())) {
|
|
|
|
+ cb();
|
|
|
|
+ if (Date.now() - start >= _this.frameDuration) {
|
|
|
|
+ _this.startQueue();
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ return AsyncQueue;
|
|
|
|
+ }());
|
|
|
|
+
|
|
|
|
+ var imageManager = new AsyncQueue();
|
|
|
|
+ function getImageDetails(url) {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ var _this = this;
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ return [2, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
|
|
+ var dataURL, error_1, image_1, error_2;
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ switch (_a.label) {
|
|
|
|
+ case 0:
|
|
|
|
+ if (!url.startsWith('data:')) return [3, 1];
|
|
|
|
+ dataURL = url;
|
|
|
|
+ return [3, 4];
|
|
|
|
+ case 1:
|
|
|
|
+ _a.trys.push([1, 3, , 4]);
|
|
|
|
+ return [4, getImageDataURL(url)];
|
|
|
|
+ case 2:
|
|
|
|
+ dataURL = _a.sent();
|
|
|
|
+ return [3, 4];
|
|
|
|
+ case 3:
|
|
|
|
+ error_1 = _a.sent();
|
|
|
|
+ reject(error_1);
|
|
|
|
+ return [2];
|
|
|
|
+ case 4:
|
|
|
|
+ _a.trys.push([4, 6, , 7]);
|
|
|
|
+ return [4, urlToImage(dataURL)];
|
|
|
|
+ case 5:
|
|
|
|
+ image_1 = _a.sent();
|
|
|
|
+ imageManager.addToQueue(function () {
|
|
|
|
+ resolve(__assign({ src: url, dataURL: dataURL, width: image_1.naturalWidth, height: image_1.naturalHeight }, analyzeImage(image_1)));
|
|
|
|
+ });
|
|
|
|
+ return [3, 7];
|
|
|
|
+ case 6:
|
|
|
|
+ error_2 = _a.sent();
|
|
|
|
+ reject(error_2);
|
|
|
|
+ return [3, 7];
|
|
|
|
+ case 7: return [2];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }); })];
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function getImageDataURL(url) {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ var parsedURL;
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ switch (_a.label) {
|
|
|
|
+ case 0:
|
|
|
|
+ parsedURL = new URL(url);
|
|
|
|
+ if (!(parsedURL.origin === location.origin)) 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 ".concat(url)); };
|
|
|
|
+ image.src = url;
|
|
|
|
+ })];
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ var MAX_ANALIZE_PIXELS_COUNT = 32 * 32;
|
|
|
|
+ var canvas;
|
|
|
|
+ var context;
|
|
|
|
+ function createCanvas() {
|
|
|
|
+ var maxWidth = MAX_ANALIZE_PIXELS_COUNT;
|
|
|
|
+ var maxHeight = MAX_ANALIZE_PIXELS_COUNT;
|
|
|
|
+ canvas = document.createElement('canvas');
|
|
|
|
+ canvas.width = maxWidth;
|
|
|
|
+ canvas.height = maxHeight;
|
|
|
|
+ context = canvas.getContext('2d');
|
|
|
|
+ context.imageSmoothingEnabled = false;
|
|
|
|
+ }
|
|
|
|
+ function removeCanvas() {
|
|
|
|
+ canvas = null;
|
|
|
|
+ context = null;
|
|
|
|
+ }
|
|
|
|
+ var MAX_IMAGE_SIZE = 5 * 1024 * 1024;
|
|
|
|
+ function analyzeImage(image) {
|
|
|
|
+ if (!canvas) {
|
|
|
|
+ createCanvas();
|
|
|
|
+ }
|
|
|
|
+ var naturalWidth = image.naturalWidth, naturalHeight = image.naturalHeight;
|
|
|
|
+ if (naturalHeight === 0 || naturalWidth === 0) {
|
|
|
|
+ logWarn("logWarn(Image is empty ".concat(image.currentSrc, ")"));
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ var size = naturalWidth * naturalHeight * 4;
|
|
|
|
+ if (size > MAX_IMAGE_SIZE) {
|
|
|
|
+ logInfo('Skipped large image analyzing(Larger than 5mb in memory)');
|
|
|
|
+ return {
|
|
|
|
+ isDark: false,
|
|
|
|
+ isLight: false,
|
|
|
|
+ isTransparent: false,
|
|
|
|
+ isLarge: false,
|
|
|
|
+ isTooLarge: true,
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ var naturalPixelsCount = naturalWidth * naturalHeight;
|
|
|
|
+ var k = Math.min(1, Math.sqrt(MAX_ANALIZE_PIXELS_COUNT / naturalPixelsCount));
|
|
|
|
+ var width = Math.ceil(naturalWidth * k);
|
|
|
|
+ var height = Math.ceil(naturalHeight * k);
|
|
|
|
+ context.clearRect(0, 0, width, height);
|
|
|
|
+ context.drawImage(image, 0, 0, naturalWidth, naturalHeight, 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;
|
|
|
|
+ for (y = 0; y < height; y++) {
|
|
|
|
+ for (x = 0; x < width; x++) {
|
|
|
|
+ i = 4 * (y * width + x);
|
|
|
|
+ r = d[i + 0];
|
|
|
|
+ g = d[i + 1];
|
|
|
|
+ b = d[i + 2];
|
|
|
|
+ a = d[i + 3];
|
|
|
|
+ if (a / 255 < TRANSPARENT_ALPHA_THRESHOLD) {
|
|
|
|
+ transparentPixelsCount++;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ l = getSRGBLightness(r, g, b);
|
|
|
|
+ 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),
|
|
|
|
+ isTooLarge: false,
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ function getFilteredImageDataURL(_a, theme) {
|
|
|
|
+ var dataURL = _a.dataURL, width = _a.width, height = _a.height;
|
|
|
|
+ var matrix = getSVGFilterMatrixValue(theme);
|
|
|
|
+ var svg = [
|
|
|
|
+ "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"".concat(width, "\" height=\"").concat(height, "\">"),
|
|
|
|
+ '<defs>',
|
|
|
|
+ '<filter id="darkreader-image-filter">',
|
|
|
|
+ "<feColorMatrix type=\"matrix\" values=\"".concat(matrix, "\" />"),
|
|
|
|
+ '</filter>',
|
|
|
|
+ '</defs>',
|
|
|
|
+ "<image width=\"".concat(width, "\" height=\"").concat(height, "\" filter=\"url(#darkreader-image-filter)\" xlink:href=\"").concat(dataURL, "\" />"),
|
|
|
|
+ '</svg>',
|
|
|
|
+ ].join('');
|
|
|
|
+ return "data:image/svg+xml;base64,".concat(btoa(svg));
|
|
|
|
+ }
|
|
|
|
+ function cleanImageProcessingCache() {
|
|
|
|
+ imageManager && imageManager.stopQueue();
|
|
|
|
+ removeCanvas();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var gradientLength = 'gradient'.length;
|
|
|
|
+ var conicGradient = 'conic-';
|
|
|
|
+ var conicGradientLength = conicGradient.length;
|
|
|
|
+ var radialGradient = 'radial-';
|
|
|
|
+ var linearGradient = 'linear-';
|
|
|
|
+ function parseGradient(value) {
|
|
|
|
+ var result = [];
|
|
|
|
+ var index = 0;
|
|
|
|
+ var startIndex = conicGradient.length;
|
|
|
|
+ var _loop_1 = function () {
|
|
|
|
+ var typeGradient;
|
|
|
|
+ [linearGradient, radialGradient, conicGradient].find(function (possibleType) {
|
|
|
|
+ if (index - possibleType.length >= 0) {
|
|
|
|
+ var possibleGradient = value.substring(index - possibleType.length, index);
|
|
|
|
+ if (possibleGradient === possibleType) {
|
|
|
|
+ if (value.slice(index - possibleType.length - 10, index - possibleType.length - 1) === 'repeating') {
|
|
|
|
+ typeGradient = "repeating-".concat(possibleType, "gradient");
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ if (value.slice(index - possibleType.length - 8, index - possibleType.length - 1) === '-webkit') {
|
|
|
|
+ typeGradient = "-webkit-".concat(possibleType, "gradient");
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ typeGradient = "".concat(possibleType, "gradient");
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ if (!typeGradient) {
|
|
|
|
+ return "break";
|
|
|
|
+ }
|
|
|
|
+ var _a = getParenthesesRange(value, index + gradientLength), start = _a.start, end = _a.end;
|
|
|
|
+ var match = value.substring(start + 1, end - 1);
|
|
|
|
+ startIndex = end + 1 + conicGradientLength;
|
|
|
|
+ result.push({
|
|
|
|
+ typeGradient: typeGradient,
|
|
|
|
+ match: match,
|
|
|
|
+ offset: typeGradient.length + 2,
|
|
|
|
+ index: index - typeGradient.length + gradientLength,
|
|
|
|
+ hasComma: true,
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ while ((index = value.indexOf('gradient', startIndex)) !== -1) {
|
|
|
|
+ var state_1 = _loop_1();
|
|
|
|
+ if (state_1 === "break")
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ if (result.length) {
|
|
|
|
+ result[result.length - 1].hasComma = false;
|
|
|
|
+ }
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getPriority(ruleStyle, property) {
|
|
|
|
+ return Boolean(ruleStyle && ruleStyle.getPropertyPriority(property));
|
|
|
|
+ }
|
|
|
|
+ function getModifiableCSSDeclaration(property, value, rule, variablesStore, ignoreImageSelectors, isCancelled) {
|
|
|
|
+ if (property.startsWith('--')) {
|
|
|
|
+ var modifier = getVariableModifier(variablesStore, property, value, rule, ignoreImageSelectors, isCancelled);
|
|
|
|
+ if (modifier) {
|
|
|
|
+ return { property: property, value: modifier, important: getPriority(rule.style, property), sourceValue: value };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (value.includes('var(')) {
|
|
|
|
+ var modifier = getVariableDependantModifier(variablesStore, property, value);
|
|
|
|
+ if (modifier) {
|
|
|
|
+ return { property: property, value: modifier, important: getPriority(rule.style, property), sourceValue: value };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if ((property.includes('color') && property !== '-webkit-print-color-adjust') ||
|
|
|
|
+ property === 'fill' ||
|
|
|
|
+ property === 'stroke' ||
|
|
|
|
+ property === 'stop-color') {
|
|
|
|
+ var modifier = getColorModifier(property, value);
|
|
|
|
+ if (modifier) {
|
|
|
|
+ return { property: property, value: modifier, important: getPriority(rule.style, property), sourceValue: value };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (property === 'background-image' || property === 'list-style-image') {
|
|
|
|
+ var modifier = getBgImageModifier(value, rule, ignoreImageSelectors, isCancelled);
|
|
|
|
+ if (modifier) {
|
|
|
|
+ return { property: property, value: modifier, important: getPriority(rule.style, property), sourceValue: value };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (property.includes('shadow')) {
|
|
|
|
+ var modifier = getShadowModifier(value);
|
|
|
|
+ if (modifier) {
|
|
|
|
+ return { property: property, value: modifier, important: getPriority(rule.style, property), sourceValue: value };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ function joinSelectors() {
|
|
|
|
+ var selectors = [];
|
|
|
|
+ for (var _i = 0; _i < arguments.length; _i++) {
|
|
|
|
+ selectors[_i] = arguments[_i];
|
|
|
|
+ }
|
|
|
|
+ return selectors.filter(Boolean).join(', ');
|
|
|
|
+ }
|
|
|
|
+ function getModifiedUserAgentStyle(theme, isIFrame, styleSystemControls) {
|
|
|
|
+ var lines = [];
|
|
|
|
+ if (!isIFrame) {
|
|
|
|
+ lines.push('html {');
|
|
|
|
+ lines.push(" background-color: ".concat(modifyBackgroundColor({ r: 255, g: 255, b: 255 }, theme), " !important;"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ }
|
|
|
|
+ if (isCSSColorSchemePropSupported) {
|
|
|
|
+ lines.push('html {');
|
|
|
|
+ lines.push(" color-scheme: ".concat(theme.mode === 1 ? 'dark' : 'dark light', " !important;"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ }
|
|
|
|
+ var bgSelectors = joinSelectors(isIFrame ? '' : 'html, body', styleSystemControls ? 'input, textarea, select, button' : '');
|
|
|
|
+ if (bgSelectors) {
|
|
|
|
+ lines.push("".concat(bgSelectors, " {"));
|
|
|
|
+ lines.push(" background-color: ".concat(modifyBackgroundColor({ r: 255, g: 255, b: 255 }, theme), ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ }
|
|
|
|
+ lines.push("".concat(joinSelectors('html, body', styleSystemControls ? 'input, textarea, select, button' : ''), " {"));
|
|
|
|
+ lines.push(" border-color: ".concat(modifyBorderColor({ r: 76, g: 76, b: 76 }, theme), ";"));
|
|
|
|
+ lines.push(" color: ".concat(modifyForegroundColor({ r: 0, g: 0, b: 0 }, theme), ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ lines.push('a {');
|
|
|
|
+ lines.push(" color: ".concat(modifyForegroundColor({ r: 0, g: 64, b: 255 }, theme), ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ lines.push('table {');
|
|
|
|
+ lines.push(" border-color: ".concat(modifyBorderColor({ r: 128, g: 128, b: 128 }, theme), ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ lines.push('::placeholder {');
|
|
|
|
+ lines.push(" color: ".concat(modifyForegroundColor({ r: 169, g: 169, b: 169 }, theme), ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ lines.push('input:-webkit-autofill,');
|
|
|
|
+ lines.push('textarea:-webkit-autofill,');
|
|
|
|
+ lines.push('select:-webkit-autofill {');
|
|
|
|
+ lines.push(" background-color: ".concat(modifyBackgroundColor({ r: 250, g: 255, b: 189 }, theme), " !important;"));
|
|
|
|
+ lines.push(" color: ".concat(modifyForegroundColor({ r: 0, g: 0, b: 0 }, theme), " !important;"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ if (theme.scrollbarColor) {
|
|
|
|
+ lines.push(getModifiedScrollbarStyle(theme));
|
|
|
|
+ }
|
|
|
|
+ if (theme.selectionColor) {
|
|
|
|
+ lines.push(getModifiedSelectionStyle(theme));
|
|
|
|
+ }
|
|
|
|
+ return lines.join('\n');
|
|
|
|
+ }
|
|
|
|
+ function getSelectionColor(theme) {
|
|
|
|
+ var backgroundColorSelection;
|
|
|
|
+ var foregroundColorSelection;
|
|
|
|
+ if (theme.selectionColor === 'auto') {
|
|
|
|
+ backgroundColorSelection = modifyBackgroundColor({ r: 0, g: 96, b: 212 }, __assign(__assign({}, theme), { grayscale: 0 }));
|
|
|
|
+ foregroundColorSelection = modifyForegroundColor({ r: 255, g: 255, b: 255 }, __assign(__assign({}, theme), { grayscale: 0 }));
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ var rgb = parse(theme.selectionColor);
|
|
|
|
+ var hsl = rgbToHSL(rgb);
|
|
|
|
+ backgroundColorSelection = theme.selectionColor;
|
|
|
|
+ if (hsl.l < 0.5) {
|
|
|
|
+ foregroundColorSelection = '#FFF';
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ foregroundColorSelection = '#000';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return { backgroundColorSelection: backgroundColorSelection, foregroundColorSelection: foregroundColorSelection };
|
|
|
|
+ }
|
|
|
|
+ function getModifiedSelectionStyle(theme) {
|
|
|
|
+ var lines = [];
|
|
|
|
+ var modifiedSelectionColor = getSelectionColor(theme);
|
|
|
|
+ var backgroundColorSelection = modifiedSelectionColor.backgroundColorSelection;
|
|
|
|
+ var foregroundColorSelection = modifiedSelectionColor.foregroundColorSelection;
|
|
|
|
+ ['::selection', '::-moz-selection'].forEach(function (selection) {
|
|
|
|
+ lines.push("".concat(selection, " {"));
|
|
|
|
+ lines.push(" background-color: ".concat(backgroundColorSelection, " !important;"));
|
|
|
|
+ lines.push(" color: ".concat(foregroundColorSelection, " !important;"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ });
|
|
|
|
+ return lines.join('\n');
|
|
|
|
+ }
|
|
|
|
+ function getModifiedScrollbarStyle(theme) {
|
|
|
|
+ var lines = [];
|
|
|
|
+ var colorTrack;
|
|
|
|
+ var colorIcons;
|
|
|
|
+ var colorThumb;
|
|
|
|
+ var colorThumbHover;
|
|
|
|
+ var colorThumbActive;
|
|
|
|
+ var colorCorner;
|
|
|
|
+ if (theme.scrollbarColor === 'auto') {
|
|
|
|
+ colorTrack = modifyBackgroundColor({ r: 241, g: 241, b: 241 }, theme);
|
|
|
|
+ colorIcons = modifyForegroundColor({ r: 96, g: 96, b: 96 }, theme);
|
|
|
|
+ colorThumb = modifyBackgroundColor({ r: 176, g: 176, b: 176 }, theme);
|
|
|
|
+ colorThumbHover = modifyBackgroundColor({ r: 144, g: 144, b: 144 }, theme);
|
|
|
|
+ colorThumbActive = modifyBackgroundColor({ r: 96, g: 96, b: 96 }, theme);
|
|
|
|
+ colorCorner = modifyBackgroundColor({ r: 255, g: 255, b: 255 }, theme);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ var rgb = parse(theme.scrollbarColor);
|
|
|
|
+ var hsl_1 = rgbToHSL(rgb);
|
|
|
|
+ var isLight = hsl_1.l > 0.5;
|
|
|
|
+ var lighten = function (lighter) { return (__assign(__assign({}, hsl_1), { l: clamp(hsl_1.l + lighter, 0, 1) })); };
|
|
|
|
+ var darken = function (darker) { return (__assign(__assign({}, hsl_1), { l: clamp(hsl_1.l - darker, 0, 1) })); };
|
|
|
|
+ colorTrack = hslToString(darken(0.4));
|
|
|
|
+ colorIcons = hslToString(isLight ? darken(0.4) : lighten(0.4));
|
|
|
|
+ colorThumb = hslToString(hsl_1);
|
|
|
|
+ colorThumbHover = hslToString(lighten(0.1));
|
|
|
|
+ colorThumbActive = hslToString(lighten(0.2));
|
|
|
|
+ }
|
|
|
|
+ lines.push('::-webkit-scrollbar {');
|
|
|
|
+ lines.push(" background-color: ".concat(colorTrack, ";"));
|
|
|
|
+ lines.push(" color: ".concat(colorIcons, ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ lines.push('::-webkit-scrollbar-thumb {');
|
|
|
|
+ lines.push(" background-color: ".concat(colorThumb, ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ lines.push('::-webkit-scrollbar-thumb:hover {');
|
|
|
|
+ lines.push(" background-color: ".concat(colorThumbHover, ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ lines.push('::-webkit-scrollbar-thumb:active {');
|
|
|
|
+ lines.push(" background-color: ".concat(colorThumbActive, ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ lines.push('::-webkit-scrollbar-corner {');
|
|
|
|
+ lines.push(" background-color: ".concat(colorCorner, ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ if (isFirefox) {
|
|
|
|
+ lines.push('* {');
|
|
|
|
+ lines.push(" scrollbar-color: ".concat(colorThumb, " ").concat(colorTrack, ";"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ }
|
|
|
|
+ return lines.join('\n');
|
|
|
|
+ }
|
|
|
|
+ function getModifiedFallbackStyle(filter, _a) {
|
|
|
|
+ var strict = _a.strict;
|
|
|
|
+ var lines = [];
|
|
|
|
+ var isMicrosoft = ['microsoft.com', 'docs.microsoft.com'].includes(location.hostname);
|
|
|
|
+ lines.push("html, body, ".concat(strict ? "body :not(iframe)".concat(isMicrosoft ? ':not(div[style^="position:absolute;top:0;left:-"]' : '') : 'body > :not(iframe)', " {"));
|
|
|
|
+ lines.push(" background-color: ".concat(modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter), " !important;"));
|
|
|
|
+ lines.push(" border-color: ".concat(modifyBorderColor({ r: 64, g: 64, b: 64 }, filter), " !important;"));
|
|
|
|
+ lines.push(" color: ".concat(modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter), " !important;"));
|
|
|
|
+ lines.push('}');
|
|
|
|
+ return lines.join('\n');
|
|
|
|
+ }
|
|
|
|
+ var unparsableColors = new Set([
|
|
|
|
+ 'inherit',
|
|
|
|
+ 'transparent',
|
|
|
|
+ 'initial',
|
|
|
|
+ 'currentcolor',
|
|
|
|
+ 'none',
|
|
|
|
+ 'unset',
|
|
|
|
+ ]);
|
|
|
|
+ var colorParseCache = new Map();
|
|
|
|
+ function parseColorWithCache($color) {
|
|
|
|
+ $color = $color.trim();
|
|
|
|
+ if (colorParseCache.has($color)) {
|
|
|
|
+ return colorParseCache.get($color);
|
|
|
|
+ }
|
|
|
|
+ if ($color.includes('calc(')) {
|
|
|
|
+ $color = lowerCalcExpression($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.includes('background')) {
|
|
|
|
+ return function (filter) { return modifyBackgroundColor(rgb_1, filter); };
|
|
|
|
+ }
|
|
|
|
+ if (prop.includes('border') || prop.includes('outline')) {
|
|
|
|
+ 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 imageDetailsCache = new Map();
|
|
|
|
+ var awaitingForImageLoading = new Map();
|
|
|
|
+ function shouldIgnoreImage(selectorText, selectors) {
|
|
|
|
+ if (!selectorText || selectors.length === 0) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ if (selectors.some(function (s) { return s === '*'; })) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ var ruleSelectors = selectorText.split(/,\s*/g);
|
|
|
|
+ var _loop_1 = function (i) {
|
|
|
|
+ var ignoredSelector = selectors[i];
|
|
|
|
+ if (ruleSelectors.some(function (s) { return s === ignoredSelector; })) {
|
|
|
|
+ return { value: true };
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ for (var i = 0; i < selectors.length; i++) {
|
|
|
|
+ var state_1 = _loop_1(i);
|
|
|
|
+ if (typeof state_1 === "object")
|
|
|
|
+ return state_1.value;
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ function getBgImageModifier(value, rule, ignoreImageSelectors, isCancelled) {
|
|
|
|
+ var _this = this;
|
|
|
|
+ try {
|
|
|
|
+ var gradients = parseGradient(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 = gradients.map(function (i) { return (__assign({ type: 'gradient' }, i)); })
|
|
|
|
+ .concat(getIndices(urls).map(function (i) { return (__assign({ type: 'url', offset: 0 }, i)); }))
|
|
|
|
+ .sort(function (a, b) { return a.index > b.index ? 1 : -1; });
|
|
|
|
+ var getGradientModifier_1 = function (gradient) {
|
|
|
|
+ var typeGradient = gradient.typeGradient, match = gradient.match, hasComma = gradient.hasComma;
|
|
|
|
+ var partsRegex = /([^\(\),]+(\([^\(\)]*(\([^\(\)]*\)*[^\(\)]*)?\))?[^\(\),]*),?/g;
|
|
|
|
+ var colorStopRegex = /^(from|color-stop|to)\(([^\(\)]*?,\s*)?(.*?)\)$/;
|
|
|
|
+ var parts = getMatches(partsRegex, match, 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 "".concat(modifyGradientColor(rgb, filter), " ").concat(part.substring(space + 1)); };
|
|
|
|
+ }
|
|
|
|
+ var colorStopMatch = part.match(colorStopRegex);
|
|
|
|
+ if (colorStopMatch) {
|
|
|
|
+ rgb = tryParseColor(colorStopMatch[3]);
|
|
|
|
+ if (rgb) {
|
|
|
|
+ return function (filter) { return "".concat(colorStopMatch[1], "(").concat(colorStopMatch[2] ? "".concat(colorStopMatch[2], ", ") : '').concat(modifyGradientColor(rgb, filter), ")"); };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return function () { return part; };
|
|
|
|
+ });
|
|
|
|
+ return function (filter) {
|
|
|
|
+ return "".concat(typeGradient, "(").concat(parts.map(function (modify) { return modify(filter); }).join(', '), ")").concat(hasComma ? ', ' : '');
|
|
|
|
+ };
|
|
|
|
+ };
|
|
|
|
+ var getURLModifier_1 = function (urlValue) {
|
|
|
|
+ var _a;
|
|
|
|
+ if (shouldIgnoreImage(rule.selectorText, ignoreImageSelectors)) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ var url = getCSSURLValue(urlValue);
|
|
|
|
+ var parentStyleSheet = rule.parentStyleSheet;
|
|
|
|
+ var baseURL = (parentStyleSheet && parentStyleSheet.href) ?
|
|
|
|
+ getCSSBaseBath(parentStyleSheet.href) :
|
|
|
|
+ ((_a = parentStyleSheet.ownerNode) === null || _a === void 0 ? void 0 : _a.baseURI) || location.origin;
|
|
|
|
+ url = getAbsoluteURL(baseURL, url);
|
|
|
|
+ var absoluteValue = "url(\"".concat(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, isTooLarge = imageDetails.isTooLarge, width = imageDetails.width;
|
|
|
|
+ var result;
|
|
|
|
+ if (isTooLarge) {
|
|
|
|
+ result = "url(\"".concat(imageDetails.src, "\")");
|
|
|
|
+ }
|
|
|
|
+ else if (isDark && isTransparent && filter.mode === 1 && !isLarge && width > 2) {
|
|
|
|
+ logInfo("Inverting dark image ".concat(imageDetails.src));
|
|
|
|
+ var inverted = getFilteredImageDataURL(imageDetails, __assign(__assign({}, filter), { sepia: clamp(filter.sepia + 10, 0, 100) }));
|
|
|
|
+ result = "url(\"".concat(inverted, "\")");
|
|
|
|
+ }
|
|
|
|
+ else if (isLight && !isTransparent && filter.mode === 1) {
|
|
|
|
+ if (isLarge) {
|
|
|
|
+ result = 'none';
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ logInfo("Dimming light image ".concat(imageDetails.src));
|
|
|
|
+ var dimmed = getFilteredImageDataURL(imageDetails, filter);
|
|
|
|
+ result = "url(\"".concat(dimmed, "\")");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (filter.mode === 0 && isLight && !isLarge) {
|
|
|
|
+ logInfo("Applying filter to image ".concat(imageDetails.src));
|
|
|
|
+ var filtered = getFilteredImageDataURL(imageDetails, __assign(__assign({}, filter), { brightness: clamp(filter.brightness - 10, 5, 200), sepia: clamp(filter.sepia + 10, 0, 100) }));
|
|
|
|
+ result = "url(\"".concat(filtered, "\")");
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ result = null;
|
|
|
|
+ }
|
|
|
|
+ return result;
|
|
|
|
+ };
|
|
|
|
+ var modifiers_1 = [];
|
|
|
|
+ var matchIndex_1 = 0;
|
|
|
|
+ matches_1.forEach(function (_a, i) {
|
|
|
|
+ var type = _a.type, match = _a.match, index = _a.index, typeGradient = _a.typeGradient, hasComma = _a.hasComma, offset = _a.offset;
|
|
|
|
+ var matchStart = index;
|
|
|
|
+ var prefixStart = matchIndex_1;
|
|
|
|
+ var matchEnd = matchStart + match.length + offset;
|
|
|
|
+ matchIndex_1 = matchEnd;
|
|
|
|
+ prefixStart !== matchStart && modifiers_1.push(function () { return value.substring(prefixStart, matchStart); });
|
|
|
|
+ if (type === 'url') {
|
|
|
|
+ modifiers_1.push(getURLModifier_1(match));
|
|
|
|
+ }
|
|
|
|
+ else if (type === 'gradient') {
|
|
|
|
+ modifiers_1.push(getGradientModifier_1({ match: match, index: index, typeGradient: typeGradient, hasComma: hasComma, offset: offset }));
|
|
|
|
+ }
|
|
|
|
+ if (i === matches_1.length - 1) {
|
|
|
|
+ modifiers_1.push(function () { return value.substring(matchEnd); });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ return function (filter) {
|
|
|
|
+ var results = modifiers_1.filter(Boolean).map(function (modify) { return modify(filter); });
|
|
|
|
+ if (results.some(function (r) { return r instanceof Promise; })) {
|
|
|
|
+ return Promise.all(results).then(function (asyncResults) {
|
|
|
|
+ return asyncResults.filter(Boolean).join('');
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ return results.join('');
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ catch (err) {
|
|
|
|
+ logWarn("Unable to parse gradient ".concat(value), err);
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function getShadowModifierWithInfo(value) {
|
|
|
|
+ try {
|
|
|
|
+ var index_1 = 0;
|
|
|
|
+ var colorMatches_1 = getMatches(/(^|\s)(?!calc)([a-z]+\(.+?\)|#[0-9a-f]+|[a-z]+)(.*?(inset|outset)?($|,))/ig, value, 2);
|
|
|
|
+ var notParsed_1 = 0;
|
|
|
|
+ var modifiers_2 = colorMatches_1.map(function (match, i) {
|
|
|
|
+ var prefixIndex = index_1;
|
|
|
|
+ var matchIndex = value.indexOf(match, index_1);
|
|
|
|
+ var matchEnd = matchIndex + match.length;
|
|
|
|
+ index_1 = matchEnd;
|
|
|
|
+ var rgb = tryParseColor(match);
|
|
|
|
+ if (!rgb) {
|
|
|
|
+ notParsed_1++;
|
|
|
|
+ return function () { return value.substring(prefixIndex, matchEnd); };
|
|
|
|
+ }
|
|
|
|
+ return function (filter) { return "".concat(value.substring(prefixIndex, matchIndex)).concat(modifyShadowColor(rgb, filter)).concat(i === colorMatches_1.length - 1 ? value.substring(matchEnd) : ''); };
|
|
|
|
+ });
|
|
|
|
+ return function (filter) {
|
|
|
|
+ var modified = modifiers_2.map(function (modify) { return modify(filter); }).join('');
|
|
|
|
+ return {
|
|
|
|
+ matchesLength: colorMatches_1.length,
|
|
|
|
+ unparseableMatchesLength: notParsed_1,
|
|
|
|
+ result: modified,
|
|
|
|
+ };
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ catch (err) {
|
|
|
|
+ logWarn("Unable to parse shadow ".concat(value), err);
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function getShadowModifier(value) {
|
|
|
|
+ var shadowModifier = getShadowModifierWithInfo(value);
|
|
|
|
+ if (!shadowModifier) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ return function (theme) { return shadowModifier(theme).result; };
|
|
|
|
+ }
|
|
|
|
+ function getVariableModifier(variablesStore, prop, value, rule, ignoredImgSelectors, isCancelled) {
|
|
|
|
+ return variablesStore.getModifierForVariable({
|
|
|
|
+ varName: prop,
|
|
|
|
+ sourceValue: value,
|
|
|
|
+ rule: rule,
|
|
|
|
+ ignoredImgSelectors: ignoredImgSelectors,
|
|
|
|
+ isCancelled: isCancelled,
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function getVariableDependantModifier(variablesStore, prop, value) {
|
|
|
|
+ return variablesStore.getModifierForVarDependant(prop, value);
|
|
|
|
+ }
|
|
|
|
+ function cleanModificationCache() {
|
|
|
|
+ colorParseCache.clear();
|
|
|
|
+ clearColorModificationCache();
|
|
|
|
+ imageDetailsCache.clear();
|
|
|
|
+ cleanImageProcessingCache();
|
|
|
|
+ awaitingForImageLoading.clear();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var VAR_TYPE_BGCOLOR = 1 << 0;
|
|
|
|
+ var VAR_TYPE_TEXTCOLOR = 1 << 1;
|
|
|
|
+ var VAR_TYPE_BORDERCOLOR = 1 << 2;
|
|
|
|
+ var VAR_TYPE_BGIMG = 1 << 3;
|
|
|
|
+ var VariablesStore = (function () {
|
|
|
|
+ function VariablesStore() {
|
|
|
|
+ this.varTypes = new Map();
|
|
|
|
+ this.rulesQueue = [];
|
|
|
|
+ this.definedVars = new Set();
|
|
|
|
+ this.varRefs = new Map();
|
|
|
|
+ this.unknownColorVars = new Set();
|
|
|
|
+ this.unknownBgVars = new Set();
|
|
|
|
+ this.undefinedVars = new Set();
|
|
|
|
+ this.initialVarTypes = new Map();
|
|
|
|
+ this.changedTypeVars = new Set();
|
|
|
|
+ this.typeChangeSubscriptions = new Map();
|
|
|
|
+ this.unstableVarValues = new Map();
|
|
|
|
+ }
|
|
|
|
+ VariablesStore.prototype.clear = function () {
|
|
|
|
+ this.varTypes.clear();
|
|
|
|
+ this.rulesQueue.splice(0);
|
|
|
|
+ this.definedVars.clear();
|
|
|
|
+ this.varRefs.clear();
|
|
|
|
+ this.unknownColorVars.clear();
|
|
|
|
+ this.unknownBgVars.clear();
|
|
|
|
+ this.undefinedVars.clear();
|
|
|
|
+ this.initialVarTypes.clear();
|
|
|
|
+ this.changedTypeVars.clear();
|
|
|
|
+ this.typeChangeSubscriptions.clear();
|
|
|
|
+ this.unstableVarValues.clear();
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.isVarType = function (varName, typeNum) {
|
|
|
|
+ return (this.varTypes.has(varName) &&
|
|
|
|
+ (this.varTypes.get(varName) & typeNum) > 0);
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.addRulesForMatching = function (rules) {
|
|
|
|
+ this.rulesQueue.push(rules);
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.matchVariablesAndDependants = function () {
|
|
|
|
+ var _this = this;
|
|
|
|
+ this.changedTypeVars.clear();
|
|
|
|
+ this.initialVarTypes = new Map(this.varTypes);
|
|
|
|
+ this.collectRootVariables();
|
|
|
|
+ this.collectVariablesAndVarDep(this.rulesQueue);
|
|
|
|
+ this.rulesQueue.splice(0);
|
|
|
|
+ this.collectRootVarDependants();
|
|
|
|
+ this.varRefs.forEach(function (refs, v) {
|
|
|
|
+ refs.forEach(function (r) {
|
|
|
|
+ if (_this.varTypes.has(v)) {
|
|
|
|
+ _this.resolveVariableType(r, _this.varTypes.get(v));
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ this.unknownColorVars.forEach(function (v) {
|
|
|
|
+ if (_this.unknownBgVars.has(v)) {
|
|
|
|
+ _this.unknownColorVars.delete(v);
|
|
|
|
+ _this.unknownBgVars.delete(v);
|
|
|
|
+ _this.resolveVariableType(v, VAR_TYPE_BGCOLOR);
|
|
|
|
+ }
|
|
|
|
+ else if (_this.isVarType(v, VAR_TYPE_BGCOLOR | VAR_TYPE_TEXTCOLOR | VAR_TYPE_BORDERCOLOR)) {
|
|
|
|
+ _this.unknownColorVars.delete(v);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ _this.undefinedVars.add(v);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ this.unknownBgVars.forEach(function (v) {
|
|
|
|
+ var hasColor = _this.findVarRef(v, function (ref) {
|
|
|
|
+ return (_this.unknownColorVars.has(ref) ||
|
|
|
|
+ _this.isVarType(ref, VAR_TYPE_TEXTCOLOR | VAR_TYPE_BORDERCOLOR));
|
|
|
|
+ }) != null;
|
|
|
|
+ if (hasColor) {
|
|
|
|
+ _this.itarateVarRefs(v, function (ref) {
|
|
|
|
+ _this.resolveVariableType(ref, VAR_TYPE_BGCOLOR);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ else if (_this.isVarType(v, VAR_TYPE_BGCOLOR | VAR_TYPE_BGIMG)) {
|
|
|
|
+ _this.unknownBgVars.delete(v);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ _this.undefinedVars.add(v);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ this.changedTypeVars.forEach(function (varName) {
|
|
|
|
+ if (_this.typeChangeSubscriptions.has(varName)) {
|
|
|
|
+ _this.typeChangeSubscriptions
|
|
|
|
+ .get(varName)
|
|
|
|
+ .forEach(function (callback) {
|
|
|
|
+ callback();
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ this.changedTypeVars.clear();
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.getModifierForVariable = function (options) {
|
|
|
|
+ var _this = this;
|
|
|
|
+ return function (theme) {
|
|
|
|
+ var varName = options.varName, sourceValue = options.sourceValue, rule = options.rule, ignoredImgSelectors = options.ignoredImgSelectors, isCancelled = options.isCancelled;
|
|
|
|
+ var getDeclarations = function () {
|
|
|
|
+ var declarations = [];
|
|
|
|
+ var addModifiedValue = function (typeNum, varNameWrapper, colorModifier) {
|
|
|
|
+ if (!_this.isVarType(varName, typeNum)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ var property = varNameWrapper(varName);
|
|
|
|
+ var modifiedValue;
|
|
|
|
+ if (isVarDependant(sourceValue)) {
|
|
|
|
+ if (isConstructedColorVar(sourceValue)) {
|
|
|
|
+ var value = insertVarValues(sourceValue, _this.unstableVarValues);
|
|
|
|
+ if (!value) {
|
|
|
|
+ value = typeNum === VAR_TYPE_BGCOLOR ? '#ffffff' : '#000000';
|
|
|
|
+ }
|
|
|
|
+ modifiedValue = colorModifier(value, theme);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ modifiedValue = replaceCSSVariablesNames(sourceValue, function (v) { return varNameWrapper(v); }, function (fallback) { return colorModifier(fallback, theme); });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ modifiedValue = colorModifier(sourceValue, theme);
|
|
|
|
+ }
|
|
|
|
+ declarations.push({
|
|
|
|
+ property: property,
|
|
|
|
+ value: modifiedValue,
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ addModifiedValue(VAR_TYPE_BGCOLOR, wrapBgColorVariableName, tryModifyBgColor);
|
|
|
|
+ addModifiedValue(VAR_TYPE_TEXTCOLOR, wrapTextColorVariableName, tryModifyTextColor);
|
|
|
|
+ addModifiedValue(VAR_TYPE_BORDERCOLOR, wrapBorderColorVariableName, tryModifyBorderColor);
|
|
|
|
+ if (_this.isVarType(varName, VAR_TYPE_BGIMG)) {
|
|
|
|
+ var property = wrapBgImgVariableName(varName);
|
|
|
|
+ var modifiedValue = sourceValue;
|
|
|
|
+ if (isVarDependant(sourceValue)) {
|
|
|
|
+ modifiedValue = replaceCSSVariablesNames(sourceValue, function (v) { return wrapBgColorVariableName(v); }, function (fallback) { return tryModifyBgColor(fallback, theme); });
|
|
|
|
+ }
|
|
|
|
+ var bgModifier = getBgImageModifier(modifiedValue, rule, ignoredImgSelectors, isCancelled);
|
|
|
|
+ modifiedValue = typeof bgModifier === 'function' ? bgModifier(theme) : bgModifier;
|
|
|
|
+ declarations.push({
|
|
|
|
+ property: property,
|
|
|
|
+ value: modifiedValue,
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ return declarations;
|
|
|
|
+ };
|
|
|
|
+ var callbacks = new Set();
|
|
|
|
+ var addListener = function (onTypeChange) {
|
|
|
|
+ var callback = function () {
|
|
|
|
+ var decs = getDeclarations();
|
|
|
|
+ onTypeChange(decs);
|
|
|
|
+ };
|
|
|
|
+ callbacks.add(callback);
|
|
|
|
+ _this.subscribeForVarTypeChange(varName, callback);
|
|
|
|
+ };
|
|
|
|
+ var removeListeners = function () {
|
|
|
|
+ callbacks.forEach(function (callback) {
|
|
|
|
+ _this.unsubscribeFromVariableTypeChanges(varName, callback);
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ return {
|
|
|
|
+ declarations: getDeclarations(),
|
|
|
|
+ onTypeChange: { addListener: addListener, removeListeners: removeListeners },
|
|
|
|
+ };
|
|
|
|
+ };
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.getModifierForVarDependant = function (property, sourceValue) {
|
|
|
|
+ var _this = this;
|
|
|
|
+ if (sourceValue.match(/^\s*(rgb|hsl)a?\(/)) {
|
|
|
|
+ var isBg_1 = property.startsWith('background');
|
|
|
|
+ var isText_1 = (property === 'color' || property === 'caret-color');
|
|
|
|
+ return function (theme) {
|
|
|
|
+ var value = insertVarValues(sourceValue, _this.unstableVarValues);
|
|
|
|
+ if (!value) {
|
|
|
|
+ value = isBg_1 ? '#ffffff' : '#000000';
|
|
|
|
+ }
|
|
|
|
+ var modifier = isBg_1 ? tryModifyBgColor : isText_1 ? tryModifyTextColor : tryModifyBorderColor;
|
|
|
|
+ return modifier(value, theme);
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ if (property === 'background-color') {
|
|
|
|
+ return function (theme) {
|
|
|
|
+ return replaceCSSVariablesNames(sourceValue, function (v) { return wrapBgColorVariableName(v); }, function (fallback) { return tryModifyBgColor(fallback, theme); });
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ if (property === 'color' || property === 'caret-color') {
|
|
|
|
+ return function (theme) {
|
|
|
|
+ return replaceCSSVariablesNames(sourceValue, function (v) { return wrapTextColorVariableName(v); }, function (fallback) { return tryModifyTextColor(fallback, theme); });
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ if (property === 'background' || property === 'background-image' || property === 'box-shadow') {
|
|
|
|
+ return function (theme) {
|
|
|
|
+ var unknownVars = new Set();
|
|
|
|
+ var modify = function () {
|
|
|
|
+ var variableReplaced = replaceCSSVariablesNames(sourceValue, function (v) {
|
|
|
|
+ if (_this.isVarType(v, VAR_TYPE_BGCOLOR)) {
|
|
|
|
+ return wrapBgColorVariableName(v);
|
|
|
|
+ }
|
|
|
|
+ if (_this.isVarType(v, VAR_TYPE_BGIMG)) {
|
|
|
|
+ return wrapBgImgVariableName(v);
|
|
|
|
+ }
|
|
|
|
+ unknownVars.add(v);
|
|
|
|
+ return v;
|
|
|
|
+ }, function (fallback) { return tryModifyBgColor(fallback, theme); });
|
|
|
|
+ if (property === 'box-shadow') {
|
|
|
|
+ var shadowModifier = getShadowModifierWithInfo(variableReplaced);
|
|
|
|
+ var modifiedShadow = shadowModifier(theme);
|
|
|
|
+ if (modifiedShadow.unparseableMatchesLength !== modifiedShadow.matchesLength) {
|
|
|
|
+ return modifiedShadow.result;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return variableReplaced;
|
|
|
|
+ };
|
|
|
|
+ var modified = modify();
|
|
|
|
+ if (unknownVars.size > 0) {
|
|
|
|
+ return new Promise(function (resolve) {
|
|
|
|
+ var firstUnknownVar = unknownVars.values().next().value;
|
|
|
|
+ var callback = function () {
|
|
|
|
+ _this.unsubscribeFromVariableTypeChanges(firstUnknownVar, callback);
|
|
|
|
+ var newValue = modify();
|
|
|
|
+ resolve(newValue);
|
|
|
|
+ };
|
|
|
|
+ _this.subscribeForVarTypeChange(firstUnknownVar, callback);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ return modified;
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ if (property.startsWith('border') || property.startsWith('outline')) {
|
|
|
|
+ return function (theme) {
|
|
|
|
+ return replaceCSSVariablesNames(sourceValue, function (v) { return wrapBorderColorVariableName(v); }, function (fallback) { return tryModifyBorderColor(fallback, theme); });
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.subscribeForVarTypeChange = function (varName, callback) {
|
|
|
|
+ if (!this.typeChangeSubscriptions.has(varName)) {
|
|
|
|
+ this.typeChangeSubscriptions.set(varName, new Set());
|
|
|
|
+ }
|
|
|
|
+ var rootStore = this.typeChangeSubscriptions.get(varName);
|
|
|
|
+ if (!rootStore.has(callback)) {
|
|
|
|
+ rootStore.add(callback);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.unsubscribeFromVariableTypeChanges = function (varName, callback) {
|
|
|
|
+ if (this.typeChangeSubscriptions.has(varName)) {
|
|
|
|
+ this.typeChangeSubscriptions.get(varName).delete(callback);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.collectVariablesAndVarDep = function (ruleList) {
|
|
|
|
+ var _this = this;
|
|
|
|
+ ruleList.forEach(function (rules) {
|
|
|
|
+ iterateCSSRules(rules, function (rule) {
|
|
|
|
+ rule.style && iterateCSSDeclarations(rule.style, function (property, value) {
|
|
|
|
+ if (isVariable(property)) {
|
|
|
|
+ _this.inspectVariable(property, value);
|
|
|
|
+ }
|
|
|
|
+ if (isVarDependant(value)) {
|
|
|
|
+ _this.inspectVarDependant(property, value);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.collectRootVariables = function () {
|
|
|
|
+ var _this = this;
|
|
|
|
+ iterateCSSDeclarations(document.documentElement.style, function (property, value) {
|
|
|
|
+ if (isVariable(property)) {
|
|
|
|
+ _this.inspectVariable(property, value);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.inspectVariable = function (varName, value) {
|
|
|
|
+ this.unstableVarValues.set(varName, value);
|
|
|
|
+ if (isVarDependant(value) && isConstructedColorVar(value)) {
|
|
|
|
+ this.unknownColorVars.add(varName);
|
|
|
|
+ this.definedVars.add(varName);
|
|
|
|
+ }
|
|
|
|
+ if (this.definedVars.has(varName)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ this.definedVars.add(varName);
|
|
|
|
+ var color = tryParseColor(value);
|
|
|
|
+ if (color) {
|
|
|
|
+ this.unknownColorVars.add(varName);
|
|
|
|
+ }
|
|
|
|
+ else if (value.includes('url(') ||
|
|
|
|
+ value.includes('linear-gradient(') ||
|
|
|
|
+ value.includes('radial-gradient(')) {
|
|
|
|
+ this.resolveVariableType(varName, VAR_TYPE_BGIMG);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.resolveVariableType = function (varName, typeNum) {
|
|
|
|
+ var initialType = this.initialVarTypes.get(varName) || 0;
|
|
|
|
+ var currentType = this.varTypes.get(varName) || 0;
|
|
|
|
+ var newType = currentType | typeNum;
|
|
|
|
+ this.varTypes.set(varName, newType);
|
|
|
|
+ if (newType !== initialType || this.undefinedVars.has(varName)) {
|
|
|
|
+ this.changedTypeVars.add(varName);
|
|
|
|
+ this.undefinedVars.delete(varName);
|
|
|
|
+ }
|
|
|
|
+ this.unknownColorVars.delete(varName);
|
|
|
|
+ this.unknownBgVars.delete(varName);
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.collectRootVarDependants = function () {
|
|
|
|
+ var _this = this;
|
|
|
|
+ iterateCSSDeclarations(document.documentElement.style, function (property, value) {
|
|
|
|
+ if (isVarDependant(value)) {
|
|
|
|
+ _this.inspectVarDependant(property, value);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.inspectVarDependant = function (property, value) {
|
|
|
|
+ var _this = this;
|
|
|
|
+ if (isVariable(property)) {
|
|
|
|
+ this.iterateVarDeps(value, function (ref) {
|
|
|
|
+ if (!_this.varRefs.has(property)) {
|
|
|
|
+ _this.varRefs.set(property, new Set());
|
|
|
|
+ }
|
|
|
|
+ _this.varRefs.get(property).add(ref);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ else if (property === 'background-color' || property === 'box-shadow') {
|
|
|
|
+ this.iterateVarDeps(value, function (v) { return _this.resolveVariableType(v, VAR_TYPE_BGCOLOR); });
|
|
|
|
+ }
|
|
|
|
+ else if (property === 'color' || property === 'caret-color') {
|
|
|
|
+ this.iterateVarDeps(value, function (v) { return _this.resolveVariableType(v, VAR_TYPE_TEXTCOLOR); });
|
|
|
|
+ }
|
|
|
|
+ else if (property.startsWith('border') || property.startsWith('outline')) {
|
|
|
|
+ this.iterateVarDeps(value, function (v) { return _this.resolveVariableType(v, VAR_TYPE_BORDERCOLOR); });
|
|
|
|
+ }
|
|
|
|
+ else if (property === 'background' || property === 'background-image') {
|
|
|
|
+ this.iterateVarDeps(value, function (v) {
|
|
|
|
+ if (_this.isVarType(v, VAR_TYPE_BGCOLOR | VAR_TYPE_BGIMG)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ var isBgColor = _this.findVarRef(v, function (ref) {
|
|
|
|
+ return (_this.unknownColorVars.has(ref) ||
|
|
|
|
+ _this.isVarType(ref, VAR_TYPE_TEXTCOLOR | VAR_TYPE_BORDERCOLOR));
|
|
|
|
+ }) != null;
|
|
|
|
+ _this.itarateVarRefs(v, function (ref) {
|
|
|
|
+ if (isBgColor) {
|
|
|
|
+ _this.resolveVariableType(ref, VAR_TYPE_BGCOLOR);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ _this.unknownBgVars.add(ref);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.iterateVarDeps = function (value, iterator) {
|
|
|
|
+ var varDeps = new Set();
|
|
|
|
+ iterateVarDependencies(value, function (v) { return varDeps.add(v); });
|
|
|
|
+ varDeps.forEach(function (v) { return iterator(v); });
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.findVarRef = function (varName, iterator, stack) {
|
|
|
|
+ var e_1, _a;
|
|
|
|
+ if (stack === void 0) { stack = new Set(); }
|
|
|
|
+ if (stack.has(varName)) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ stack.add(varName);
|
|
|
|
+ var result = iterator(varName);
|
|
|
|
+ if (result) {
|
|
|
|
+ return varName;
|
|
|
|
+ }
|
|
|
|
+ var refs = this.varRefs.get(varName);
|
|
|
|
+ if (!refs || refs.size === 0) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ for (var refs_1 = __values(refs), refs_1_1 = refs_1.next(); !refs_1_1.done; refs_1_1 = refs_1.next()) {
|
|
|
|
+ var ref = refs_1_1.value;
|
|
|
|
+ var found = this.findVarRef(ref, iterator, stack);
|
|
|
|
+ if (found) {
|
|
|
|
+ return found;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
|
|
+ finally {
|
|
|
|
+ try {
|
|
|
|
+ if (refs_1_1 && !refs_1_1.done && (_a = refs_1.return)) _a.call(refs_1);
|
|
|
|
+ }
|
|
|
|
+ finally { if (e_1) throw e_1.error; }
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.itarateVarRefs = function (varName, iterator) {
|
|
|
|
+ this.findVarRef(varName, function (ref) {
|
|
|
|
+ iterator(ref);
|
|
|
|
+ return false;
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.setOnRootVariableChange = function (callback) {
|
|
|
|
+ this.onRootVariableDefined = callback;
|
|
|
|
+ };
|
|
|
|
+ VariablesStore.prototype.putRootVars = function (styleElement, theme) {
|
|
|
|
+ var e_2, _a;
|
|
|
|
+ var _this = this;
|
|
|
|
+ var sheet = styleElement.sheet;
|
|
|
|
+ if (sheet.cssRules.length > 0) {
|
|
|
|
+ sheet.deleteRule(0);
|
|
|
|
+ }
|
|
|
|
+ var declarations = new Map();
|
|
|
|
+ iterateCSSDeclarations(document.documentElement.style, function (property, value) {
|
|
|
|
+ if (isVariable(property)) {
|
|
|
|
+ if (_this.isVarType(property, VAR_TYPE_BGCOLOR)) {
|
|
|
|
+ declarations.set(wrapBgColorVariableName(property), tryModifyBgColor(value, theme));
|
|
|
|
+ }
|
|
|
|
+ if (_this.isVarType(property, VAR_TYPE_TEXTCOLOR)) {
|
|
|
|
+ declarations.set(wrapTextColorVariableName(property), tryModifyTextColor(value, theme));
|
|
|
|
+ }
|
|
|
|
+ if (_this.isVarType(property, VAR_TYPE_BORDERCOLOR)) {
|
|
|
|
+ declarations.set(wrapBorderColorVariableName(property), tryModifyBorderColor(value, theme));
|
|
|
|
+ }
|
|
|
|
+ _this.subscribeForVarTypeChange(property, _this.onRootVariableDefined);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ var cssLines = [];
|
|
|
|
+ cssLines.push(':root {');
|
|
|
|
+ try {
|
|
|
|
+ for (var declarations_1 = __values(declarations), declarations_1_1 = declarations_1.next(); !declarations_1_1.done; declarations_1_1 = declarations_1.next()) {
|
|
|
|
+ var _b = __read(declarations_1_1.value, 2), property = _b[0], value = _b[1];
|
|
|
|
+ cssLines.push(" ".concat(property, ": ").concat(value, ";"));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
|
|
+ finally {
|
|
|
|
+ try {
|
|
|
|
+ if (declarations_1_1 && !declarations_1_1.done && (_a = declarations_1.return)) _a.call(declarations_1);
|
|
|
|
+ }
|
|
|
|
+ finally { if (e_2) throw e_2.error; }
|
|
|
|
+ }
|
|
|
|
+ cssLines.push('}');
|
|
|
|
+ var cssText = cssLines.join('\n');
|
|
|
|
+ sheet.insertRule(cssText);
|
|
|
|
+ };
|
|
|
|
+ return VariablesStore;
|
|
|
|
+ }());
|
|
|
|
+ var variablesStore = new VariablesStore();
|
|
|
|
+ function getVariableRange(input, searchStart) {
|
|
|
|
+ if (searchStart === void 0) { searchStart = 0; }
|
|
|
|
+ var start = input.indexOf('var(', searchStart);
|
|
|
|
+ if (start >= 0) {
|
|
|
|
+ var range = getParenthesesRange(input, start + 3);
|
|
|
|
+ if (range) {
|
|
|
|
+ return { start: start, end: range.end };
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function getVariablesMatches(input) {
|
|
|
|
+ var ranges = [];
|
|
|
|
+ var i = 0;
|
|
|
|
+ var range;
|
|
|
|
+ while ((range = getVariableRange(input, i))) {
|
|
|
|
+ var start = range.start, end = range.end;
|
|
|
|
+ ranges.push({ start: start, end: end, value: input.substring(start, end) });
|
|
|
|
+ i = range.end + 1;
|
|
|
|
+ }
|
|
|
|
+ return ranges;
|
|
|
|
+ }
|
|
|
|
+ function replaceVariablesMatches(input, replacer) {
|
|
|
|
+ var matches = getVariablesMatches(input);
|
|
|
|
+ var matchesCount = matches.length;
|
|
|
|
+ if (matchesCount === 0) {
|
|
|
|
+ return input;
|
|
|
|
+ }
|
|
|
|
+ var inputLength = input.length;
|
|
|
|
+ var replacements = matches.map(function (m) { return replacer(m.value); });
|
|
|
|
+ var parts = [];
|
|
|
|
+ parts.push(input.substring(0, matches[0].start));
|
|
|
|
+ for (var i = 0; i < matchesCount; i++) {
|
|
|
|
+ parts.push(replacements[i]);
|
|
|
|
+ var start = matches[i].end;
|
|
|
|
+ var end = i < matchesCount - 1 ? matches[i + 1].start : inputLength;
|
|
|
|
+ parts.push(input.substring(start, end));
|
|
|
|
+ }
|
|
|
|
+ return parts.join('');
|
|
|
|
+ }
|
|
|
|
+ function getVariableNameAndFallback(match) {
|
|
|
|
+ var commaIndex = match.indexOf(',');
|
|
|
|
+ var name;
|
|
|
|
+ var fallback;
|
|
|
|
+ if (commaIndex >= 0) {
|
|
|
|
+ name = match.substring(4, commaIndex).trim();
|
|
|
|
+ fallback = match.substring(commaIndex + 1, match.length - 1).trim();
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ name = match.substring(4, match.length - 1).trim();
|
|
|
|
+ fallback = '';
|
|
|
|
+ }
|
|
|
|
+ return { name: name, fallback: fallback };
|
|
|
|
+ }
|
|
|
|
+ function replaceCSSVariablesNames(value, nameReplacer, fallbackReplacer) {
|
|
|
|
+ var matchReplacer = function (match) {
|
|
|
|
+ var _a = getVariableNameAndFallback(match), name = _a.name, fallback = _a.fallback;
|
|
|
|
+ var newName = nameReplacer(name);
|
|
|
|
+ if (!fallback) {
|
|
|
|
+ return "var(".concat(newName, ")");
|
|
|
|
+ }
|
|
|
|
+ var newFallback;
|
|
|
|
+ if (isVarDependant(fallback)) {
|
|
|
|
+ newFallback = replaceCSSVariablesNames(fallback, nameReplacer, fallbackReplacer);
|
|
|
|
+ }
|
|
|
|
+ else if (fallbackReplacer) {
|
|
|
|
+ newFallback = fallbackReplacer(fallback);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ newFallback = fallback;
|
|
|
|
+ }
|
|
|
|
+ return "var(".concat(newName, ", ").concat(newFallback, ")");
|
|
|
|
+ };
|
|
|
|
+ return replaceVariablesMatches(value, matchReplacer);
|
|
|
|
+ }
|
|
|
|
+ function iterateVarDependencies(value, iterator) {
|
|
|
|
+ replaceCSSVariablesNames(value, function (varName) {
|
|
|
|
+ iterator(varName);
|
|
|
|
+ return varName;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function wrapBgColorVariableName(name) {
|
|
|
|
+ return "--darkreader-bg".concat(name);
|
|
|
|
+ }
|
|
|
|
+ function wrapTextColorVariableName(name) {
|
|
|
|
+ return "--darkreader-text".concat(name);
|
|
|
|
+ }
|
|
|
|
+ function wrapBorderColorVariableName(name) {
|
|
|
|
+ return "--darkreader-border".concat(name);
|
|
|
|
+ }
|
|
|
|
+ function wrapBgImgVariableName(name) {
|
|
|
|
+ return "--darkreader-bgimg".concat(name);
|
|
|
|
+ }
|
|
|
|
+ function isVariable(property) {
|
|
|
|
+ return property.startsWith('--');
|
|
|
|
+ }
|
|
|
|
+ function isVarDependant(value) {
|
|
|
|
+ return value.includes('var(');
|
|
|
|
+ }
|
|
|
|
+ function isConstructedColorVar(value) {
|
|
|
|
+ return value.match(/^\s*(rgb|hsl)a?\(/);
|
|
|
|
+ }
|
|
|
|
+ var rawValueRegex = /^\d{1,3}, ?\d{1,3}, ?\d{1,3}$/;
|
|
|
|
+ function parseRawValue(color) {
|
|
|
|
+ if (rawValueRegex.test(color)) {
|
|
|
|
+ var splitted = color.split(',');
|
|
|
|
+ var resultInRGB_1 = 'rgb(';
|
|
|
|
+ splitted.forEach(function (number) {
|
|
|
|
+ resultInRGB_1 += "".concat(number.trim(), ", ");
|
|
|
|
+ });
|
|
|
|
+ resultInRGB_1 = resultInRGB_1.substring(0, resultInRGB_1.length - 2);
|
|
|
|
+ resultInRGB_1 += ')';
|
|
|
|
+ return { isRaw: true, color: resultInRGB_1 };
|
|
|
|
+ }
|
|
|
|
+ return { isRaw: false, color: color };
|
|
|
|
+ }
|
|
|
|
+ function handleRawValue(color, theme, modifyFunction) {
|
|
|
|
+ var _a = parseRawValue(color), isRaw = _a.isRaw, newColor = _a.color;
|
|
|
|
+ var rgb = tryParseColor(newColor);
|
|
|
|
+ if (rgb) {
|
|
|
|
+ var outputColor = modifyFunction(rgb, theme);
|
|
|
|
+ if (isRaw) {
|
|
|
|
+ var outputInRGB = tryParseColor(outputColor);
|
|
|
|
+ return outputInRGB ? "".concat(outputInRGB.r, ", ").concat(outputInRGB.g, ", ").concat(outputInRGB.b) : outputColor;
|
|
|
|
+ }
|
|
|
|
+ return outputColor;
|
|
|
|
+ }
|
|
|
|
+ return newColor;
|
|
|
|
+ }
|
|
|
|
+ function tryModifyBgColor(color, theme) {
|
|
|
|
+ return handleRawValue(color, theme, modifyBackgroundColor);
|
|
|
|
+ }
|
|
|
|
+ function tryModifyTextColor(color, theme) {
|
|
|
|
+ return handleRawValue(color, theme, modifyForegroundColor);
|
|
|
|
+ }
|
|
|
|
+ function tryModifyBorderColor(color, theme) {
|
|
|
|
+ return handleRawValue(color, theme, modifyBorderColor);
|
|
|
|
+ }
|
|
|
|
+ function insertVarValues(source, varValues, stack) {
|
|
|
|
+ if (stack === void 0) { stack = new Set(); }
|
|
|
|
+ var containsUnresolvedVar = false;
|
|
|
|
+ var matchReplacer = function (match) {
|
|
|
|
+ var _a = getVariableNameAndFallback(match), name = _a.name, fallback = _a.fallback;
|
|
|
|
+ if (stack.has(name)) {
|
|
|
|
+ containsUnresolvedVar = true;
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ stack.add(name);
|
|
|
|
+ var varValue = varValues.get(name) || fallback;
|
|
|
|
+ var inserted = null;
|
|
|
|
+ if (varValue) {
|
|
|
|
+ if (isVarDependant(varValue)) {
|
|
|
|
+ inserted = insertVarValues(varValue, varValues, stack);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ inserted = varValue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (!inserted) {
|
|
|
|
+ containsUnresolvedVar = true;
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ return inserted;
|
|
|
|
+ };
|
|
|
|
+ var replaced = replaceVariablesMatches(source, matchReplacer);
|
|
|
|
+ if (containsUnresolvedVar) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ return replaced;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var overrides = {
|
|
|
|
+ 'background-color': {
|
|
|
|
+ customProp: '--darkreader-inline-bgcolor',
|
|
|
|
+ cssProp: 'background-color',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-bgcolor',
|
|
|
|
+ },
|
|
|
|
+ 'background-image': {
|
|
|
|
+ customProp: '--darkreader-inline-bgimage',
|
|
|
|
+ cssProp: 'background-image',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-bgimage',
|
|
|
|
+ },
|
|
|
|
+ 'border-color': {
|
|
|
|
+ customProp: '--darkreader-inline-border',
|
|
|
|
+ cssProp: 'border-color',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-border',
|
|
|
|
+ },
|
|
|
|
+ 'border-bottom-color': {
|
|
|
|
+ customProp: '--darkreader-inline-border-bottom',
|
|
|
|
+ cssProp: 'border-bottom-color',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-border-bottom',
|
|
|
|
+ },
|
|
|
|
+ 'border-left-color': {
|
|
|
|
+ customProp: '--darkreader-inline-border-left',
|
|
|
|
+ cssProp: 'border-left-color',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-border-left',
|
|
|
|
+ },
|
|
|
|
+ 'border-right-color': {
|
|
|
|
+ customProp: '--darkreader-inline-border-right',
|
|
|
|
+ cssProp: 'border-right-color',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-border-right',
|
|
|
|
+ },
|
|
|
|
+ 'border-top-color': {
|
|
|
|
+ customProp: '--darkreader-inline-border-top',
|
|
|
|
+ cssProp: 'border-top-color',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-border-top',
|
|
|
|
+ },
|
|
|
|
+ 'box-shadow': {
|
|
|
|
+ customProp: '--darkreader-inline-boxshadow',
|
|
|
|
+ cssProp: 'box-shadow',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-boxshadow',
|
|
|
|
+ },
|
|
|
|
+ 'color': {
|
|
|
|
+ customProp: '--darkreader-inline-color',
|
|
|
|
+ cssProp: 'color',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-color',
|
|
|
|
+ },
|
|
|
|
+ 'fill': {
|
|
|
|
+ customProp: '--darkreader-inline-fill',
|
|
|
|
+ cssProp: 'fill',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-fill',
|
|
|
|
+ },
|
|
|
|
+ 'stroke': {
|
|
|
|
+ customProp: '--darkreader-inline-stroke',
|
|
|
|
+ cssProp: 'stroke',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-stroke',
|
|
|
|
+ },
|
|
|
|
+ 'outline-color': {
|
|
|
|
+ customProp: '--darkreader-inline-outline',
|
|
|
|
+ cssProp: 'outline-color',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-outline',
|
|
|
|
+ },
|
|
|
|
+ 'stop-color': {
|
|
|
|
+ customProp: '--darkreader-inline-stopcolor',
|
|
|
|
+ cssProp: 'stop-color',
|
|
|
|
+ dataAttr: 'data-darkreader-inline-stopcolor',
|
|
|
|
+ },
|
|
|
|
+ };
|
|
|
|
+ var overridesList = Object.values(overrides);
|
|
|
|
+ var normalizedPropList = {};
|
|
|
|
+ overridesList.forEach(function (_a) {
|
|
|
|
+ var cssProp = _a.cssProp, customProp = _a.customProp;
|
|
|
|
+ return normalizedPropList[customProp] = cssProp;
|
|
|
|
+ });
|
|
|
|
+ var INLINE_STYLE_ATTRS = ['style', 'fill', 'stop-color', 'stroke', 'bgcolor', 'color'];
|
|
|
|
+ var INLINE_STYLE_SELECTOR = INLINE_STYLE_ATTRS.map(function (attr) { return "[".concat(attr, "]"); }).join(', ');
|
|
|
|
+ function getInlineOverrideStyle() {
|
|
|
|
+ return overridesList.map(function (_a) {
|
|
|
|
+ var dataAttr = _a.dataAttr, customProp = _a.customProp, cssProp = _a.cssProp;
|
|
|
|
+ return [
|
|
|
|
+ "[".concat(dataAttr, "] {"),
|
|
|
|
+ " ".concat(cssProp, ": var(").concat(customProp, ") !important;"),
|
|
|
|
+ '}',
|
|
|
|
+ ].join('\n');
|
|
|
|
+ }).join('\n');
|
|
|
|
+ }
|
|
|
|
+ function getInlineStyleElements(root) {
|
|
|
|
+ var results = [];
|
|
|
|
+ if (root instanceof Element && root.matches(INLINE_STYLE_SELECTOR)) {
|
|
|
|
+ results.push(root);
|
|
|
|
+ }
|
|
|
|
+ if (root instanceof Element || (isShadowDomSupported && root instanceof ShadowRoot) || root instanceof Document) {
|
|
|
|
+ push(results, root.querySelectorAll(INLINE_STYLE_SELECTOR));
|
|
|
|
+ }
|
|
|
|
+ return results;
|
|
|
|
+ }
|
|
|
|
+ var treeObservers = new Map();
|
|
|
|
+ var attrObservers = new Map();
|
|
|
|
+ function watchForInlineStyles(elementStyleDidChange, shadowRootDiscovered) {
|
|
|
|
+ deepWatchForInlineStyles(document, elementStyleDidChange, shadowRootDiscovered);
|
|
|
|
+ iterateShadowHosts(document.documentElement, function (host) {
|
|
|
|
+ deepWatchForInlineStyles(host.shadowRoot, elementStyleDidChange, shadowRootDiscovered);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function deepWatchForInlineStyles(root, elementStyleDidChange, shadowRootDiscovered) {
|
|
|
|
+ if (treeObservers.has(root)) {
|
|
|
|
+ treeObservers.get(root).disconnect();
|
|
|
|
+ attrObservers.get(root).disconnect();
|
|
|
|
+ }
|
|
|
|
+ var discoveredNodes = new WeakSet();
|
|
|
|
+ function discoverNodes(node) {
|
|
|
|
+ getInlineStyleElements(node).forEach(function (el) {
|
|
|
|
+ if (discoveredNodes.has(el)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ discoveredNodes.add(el);
|
|
|
|
+ elementStyleDidChange(el);
|
|
|
|
+ });
|
|
|
|
+ iterateShadowHosts(node, function (n) {
|
|
|
|
+ if (discoveredNodes.has(node)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ discoveredNodes.add(node);
|
|
|
|
+ shadowRootDiscovered(n.shadowRoot);
|
|
|
|
+ deepWatchForInlineStyles(n.shadowRoot, elementStyleDidChange, shadowRootDiscovered);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ var treeObserver = createOptimizedTreeObserver(root, {
|
|
|
|
+ onMinorMutations: function (_a) {
|
|
|
|
+ var additions = _a.additions;
|
|
|
|
+ additions.forEach(function (added) { return discoverNodes(added); });
|
|
|
|
+ },
|
|
|
|
+ onHugeMutations: function () {
|
|
|
|
+ discoverNodes(root);
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
+ treeObservers.set(root, treeObserver);
|
|
|
|
+ var attemptCount = 0;
|
|
|
|
+ var start = null;
|
|
|
|
+ var ATTEMPTS_INTERVAL = getDuration({ seconds: 10 });
|
|
|
|
+ var RETRY_TIMEOUT = getDuration({ seconds: 2 });
|
|
|
|
+ var MAX_ATTEMPTS_COUNT = 50;
|
|
|
|
+ var cache = [];
|
|
|
|
+ var timeoutId = null;
|
|
|
|
+ var handleAttributeMutations = throttle(function (mutations) {
|
|
|
|
+ mutations.forEach(function (m) {
|
|
|
|
+ if (INLINE_STYLE_ATTRS.includes(m.attributeName)) {
|
|
|
|
+ elementStyleDidChange(m.target);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ var attrObserver = new MutationObserver(function (mutations) {
|
|
|
|
+ if (timeoutId) {
|
|
|
|
+ cache.push.apply(cache, __spreadArray([], __read(mutations), false));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ attemptCount++;
|
|
|
|
+ var now = Date.now();
|
|
|
|
+ if (start == null) {
|
|
|
|
+ start = now;
|
|
|
|
+ }
|
|
|
|
+ else if (attemptCount >= MAX_ATTEMPTS_COUNT) {
|
|
|
|
+ if (now - start < ATTEMPTS_INTERVAL) {
|
|
|
|
+ timeoutId = setTimeout(function () {
|
|
|
|
+ start = null;
|
|
|
|
+ attemptCount = 0;
|
|
|
|
+ timeoutId = null;
|
|
|
|
+ var attributeCache = cache;
|
|
|
|
+ cache = [];
|
|
|
|
+ handleAttributeMutations(attributeCache);
|
|
|
|
+ }, RETRY_TIMEOUT);
|
|
|
|
+ cache.push.apply(cache, __spreadArray([], __read(mutations), false));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ start = now;
|
|
|
|
+ attemptCount = 1;
|
|
|
|
+ }
|
|
|
|
+ handleAttributeMutations(mutations);
|
|
|
|
+ });
|
|
|
|
+ attrObserver.observe(root, {
|
|
|
|
+ attributes: true,
|
|
|
|
+ attributeFilter: INLINE_STYLE_ATTRS.concat(overridesList.map(function (_a) {
|
|
|
|
+ var dataAttr = _a.dataAttr;
|
|
|
|
+ return dataAttr;
|
|
|
|
+ })),
|
|
|
|
+ subtree: true,
|
|
|
|
+ });
|
|
|
|
+ attrObservers.set(root, attrObserver);
|
|
|
|
+ }
|
|
|
|
+ function stopWatchingForInlineStyles() {
|
|
|
|
+ treeObservers.forEach(function (o) { return o.disconnect(); });
|
|
|
|
+ attrObservers.forEach(function (o) { return o.disconnect(); });
|
|
|
|
+ treeObservers.clear();
|
|
|
|
+ attrObservers.clear();
|
|
|
|
+ }
|
|
|
|
+ var inlineStyleCache = new WeakMap();
|
|
|
|
+ var filterProps = ['brightness', 'contrast', 'grayscale', 'sepia', 'mode'];
|
|
|
|
+ function getInlineStyleCacheKey(el, theme) {
|
|
|
|
+ return INLINE_STYLE_ATTRS
|
|
|
|
+ .map(function (attr) { return "".concat(attr, "=\"").concat(el.getAttribute(attr), "\""); })
|
|
|
|
+ .concat(filterProps.map(function (prop) { return "".concat(prop, "=\"").concat(theme[prop], "\""); }))
|
|
|
|
+ .join(' ');
|
|
|
|
+ }
|
|
|
|
+ function shouldIgnoreInlineStyle(element, selectors) {
|
|
|
|
+ for (var i = 0, len = selectors.length; i < len; i++) {
|
|
|
|
+ var ingnoredSelector = selectors[i];
|
|
|
|
+ if (element.matches(ingnoredSelector)) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ function overrideInlineStyle(element, theme, ignoreInlineSelectors, ignoreImageSelectors) {
|
|
|
|
+ var cacheKey = getInlineStyleCacheKey(element, theme);
|
|
|
|
+ if (cacheKey === inlineStyleCache.get(element)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ var unsetProps = new Set(Object.keys(overrides));
|
|
|
|
+ function setCustomProp(targetCSSProp, modifierCSSProp, cssVal) {
|
|
|
|
+ var isPropertyVariable = targetCSSProp.startsWith('--');
|
|
|
|
+ var _a = isPropertyVariable ? {} : overrides[targetCSSProp], customProp = _a.customProp, dataAttr = _a.dataAttr;
|
|
|
|
+ var mod = getModifiableCSSDeclaration(modifierCSSProp, cssVal, {}, variablesStore, ignoreImageSelectors, null);
|
|
|
|
+ if (!mod) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ var value = mod.value;
|
|
|
|
+ if (typeof value === 'function') {
|
|
|
|
+ value = value(theme);
|
|
|
|
+ }
|
|
|
|
+ if (isPropertyVariable && typeof value === 'object') {
|
|
|
|
+ var typedValue = value;
|
|
|
|
+ typedValue.declarations.forEach(function (_a) {
|
|
|
|
+ var property = _a.property, value = _a.value;
|
|
|
|
+ !(value instanceof Promise) && element.style.setProperty(property, value);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ element.style.setProperty(customProp, value);
|
|
|
|
+ if (!element.hasAttribute(dataAttr)) {
|
|
|
|
+ element.setAttribute(dataAttr, '');
|
|
|
|
+ }
|
|
|
|
+ unsetProps.delete(targetCSSProp);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (ignoreInlineSelectors.length > 0) {
|
|
|
|
+ if (shouldIgnoreInlineStyle(element, ignoreInlineSelectors)) {
|
|
|
|
+ unsetProps.forEach(function (cssProp) {
|
|
|
|
+ element.removeAttribute(overrides[cssProp].dataAttr);
|
|
|
|
+ });
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ 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 = "#".concat(value);
|
|
|
|
+ }
|
|
|
|
+ setCustomProp('background-color', 'background-color', value);
|
|
|
|
+ }
|
|
|
|
+ if (element.hasAttribute('color') && element.rel !== 'mask-icon') {
|
|
|
|
+ var value = element.getAttribute('color');
|
|
|
|
+ if (value.match(/^[0-9a-f]{3}$/i) || value.match(/^[0-9a-f]{6}$/i)) {
|
|
|
|
+ value = "#".concat(value);
|
|
|
|
+ }
|
|
|
|
+ setCustomProp('color', 'color', value);
|
|
|
|
+ }
|
|
|
|
+ if (element instanceof SVGElement) {
|
|
|
|
+ if (element.hasAttribute('fill')) {
|
|
|
|
+ var SMALL_SVG_LIMIT_1 = 32;
|
|
|
|
+ var value_1 = element.getAttribute('fill');
|
|
|
|
+ if (value_1 !== 'none') {
|
|
|
|
+ if (!(element instanceof SVGTextElement)) {
|
|
|
|
+ var handleSVGElement = function () {
|
|
|
|
+ var _a = element.getBoundingClientRect(), width = _a.width, height = _a.height;
|
|
|
|
+ var isBg = (width > SMALL_SVG_LIMIT_1 || height > SMALL_SVG_LIMIT_1);
|
|
|
|
+ setCustomProp('fill', isBg ? 'background-color' : 'color', value_1);
|
|
|
|
+ };
|
|
|
|
+ if (isReadyStateComplete()) {
|
|
|
|
+ handleSVGElement();
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ addReadyStateCompleteListener(handleSVGElement);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ setCustomProp('fill', 'color', value_1);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (element.hasAttribute('stop-color')) {
|
|
|
|
+ setCustomProp('stop-color', 'background-color', element.getAttribute('stop-color'));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ 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.includes('url')) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (overrides.hasOwnProperty(property) || (property.startsWith('--') && !normalizedPropList[property])) {
|
|
|
|
+ setCustomProp(property, property, value);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ var overridenProp = normalizedPropList[property];
|
|
|
|
+ if (overridenProp &&
|
|
|
|
+ (!element.style.getPropertyValue(overridenProp) && !element.hasAttribute(overridenProp))) {
|
|
|
|
+ if (overridenProp === 'background-color' && element.hasAttribute('bgcolor')) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ element.style.setProperty(property, '');
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ if (element.style && element instanceof SVGTextElement && element.style.fill) {
|
|
|
|
+ setCustomProp('fill', 'color', element.style.getPropertyValue('fill'));
|
|
|
|
+ }
|
|
|
|
+ forEach(unsetProps, function (cssProp) {
|
|
|
|
+ element.removeAttribute(overrides[cssProp].dataAttr);
|
|
|
|
+ });
|
|
|
|
+ inlineStyleCache.set(element, getInlineStyleCacheKey(element, theme));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var metaThemeColorName = 'theme-color';
|
|
|
|
+ var metaThemeColorSelector = "meta[name=\"".concat(metaThemeColorName, "\"]");
|
|
|
|
+ var srcMetaThemeColor = null;
|
|
|
|
+ var observer = 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) {
|
|
|
|
+ observer.disconnect();
|
|
|
|
+ }
|
|
|
|
+ observer = new MutationObserver(function (mutations) {
|
|
|
|
+ loop: for (var i = 0; i < mutations.length; i++) {
|
|
|
|
+ var addedNodes = mutations[i].addedNodes;
|
|
|
|
+ for (var j = 0; j < addedNodes.length; j++) {
|
|
|
|
+ var node = addedNodes[j];
|
|
|
|
+ if (node instanceof HTMLMetaElement && node.name === metaThemeColorName) {
|
|
|
|
+ observer.disconnect();
|
|
|
|
+ observer = null;
|
|
|
|
+ changeMetaThemeColor(node, theme);
|
|
|
|
+ break loop;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ observer.observe(document.head, { childList: true });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function restoreMetaThemeColor() {
|
|
|
|
+ if (observer) {
|
|
|
|
+ observer.disconnect();
|
|
|
|
+ observer = null;
|
|
|
|
+ }
|
|
|
|
+ var meta = document.querySelector(metaThemeColorSelector);
|
|
|
|
+ if (meta && srcMetaThemeColor) {
|
|
|
|
+ meta.content = srcMetaThemeColor;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var themeCacheKeys = [
|
|
|
|
+ 'mode',
|
|
|
|
+ 'brightness',
|
|
|
|
+ 'contrast',
|
|
|
|
+ 'grayscale',
|
|
|
|
+ 'sepia',
|
|
|
|
+ 'darkSchemeBackgroundColor',
|
|
|
|
+ 'darkSchemeTextColor',
|
|
|
|
+ 'lightSchemeBackgroundColor',
|
|
|
|
+ 'lightSchemeTextColor',
|
|
|
|
+ ];
|
|
|
|
+ function getThemeKey(theme) {
|
|
|
|
+ var resultKey = '';
|
|
|
|
+ themeCacheKeys.forEach(function (key) {
|
|
|
|
+ resultKey += "".concat(key, ":").concat(theme[key], ";");
|
|
|
|
+ });
|
|
|
|
+ return resultKey;
|
|
|
|
+ }
|
|
|
|
+ var asyncQueue = createAsyncTasksQueue();
|
|
|
|
+ function createStyleSheetModifier() {
|
|
|
|
+ var renderId = 0;
|
|
|
|
+ var rulesTextCache = new Set();
|
|
|
|
+ var rulesModCache = new Map();
|
|
|
|
+ var varTypeChangeCleaners = new Set();
|
|
|
|
+ var prevFilterKey = null;
|
|
|
|
+ var hasNonLoadedLink = false;
|
|
|
|
+ var wasRebuilt = false;
|
|
|
|
+ function shouldRebuildStyle() {
|
|
|
|
+ return hasNonLoadedLink && !wasRebuilt;
|
|
|
|
+ }
|
|
|
|
+ function modifySheet(options) {
|
|
|
|
+ var rules = options.sourceCSSRules;
|
|
|
|
+ var theme = options.theme, ignoreImageAnalysis = options.ignoreImageAnalysis, force = options.force, prepareSheet = options.prepareSheet, isAsyncCancelled = options.isAsyncCancelled;
|
|
|
|
+ var rulesChanged = (rulesModCache.size === 0);
|
|
|
|
+ var notFoundCacheKeys = new Set(rulesModCache.keys());
|
|
|
|
+ var themeKey = getThemeKey(theme);
|
|
|
|
+ var themeChanged = (themeKey !== prevFilterKey);
|
|
|
|
+ if (hasNonLoadedLink) {
|
|
|
|
+ wasRebuilt = true;
|
|
|
|
+ }
|
|
|
|
+ var modRules = [];
|
|
|
|
+ iterateCSSRules(rules, function (rule) {
|
|
|
|
+ var cssText = rule.cssText;
|
|
|
|
+ var textDiffersFromPrev = false;
|
|
|
|
+ notFoundCacheKeys.delete(cssText);
|
|
|
|
+ if (rule.parentRule instanceof CSSMediaRule) {
|
|
|
|
+ cssText += ";".concat(rule.parentRule.media.mediaText);
|
|
|
|
+ }
|
|
|
|
+ if (!rulesTextCache.has(cssText)) {
|
|
|
|
+ rulesTextCache.add(cssText);
|
|
|
|
+ textDiffersFromPrev = true;
|
|
|
|
+ }
|
|
|
|
+ if (textDiffersFromPrev) {
|
|
|
|
+ rulesChanged = true;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ modRules.push(rulesModCache.get(cssText));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ var modDecs = [];
|
|
|
|
+ rule.style && iterateCSSDeclarations(rule.style, function (property, value) {
|
|
|
|
+ var mod = getModifiableCSSDeclaration(property, value, rule, variablesStore, ignoreImageAnalysis, isAsyncCancelled);
|
|
|
|
+ if (mod) {
|
|
|
|
+ modDecs.push(mod);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ var modRule = null;
|
|
|
|
+ if (modDecs.length > 0) {
|
|
|
|
+ var parentRule = rule.parentRule;
|
|
|
|
+ modRule = { selector: rule.selectorText, declarations: modDecs, parentRule: parentRule };
|
|
|
|
+ modRules.push(modRule);
|
|
|
|
+ }
|
|
|
|
+ rulesModCache.set(cssText, modRule);
|
|
|
|
+ }, function () {
|
|
|
|
+ hasNonLoadedLink = true;
|
|
|
|
+ });
|
|
|
|
+ notFoundCacheKeys.forEach(function (key) {
|
|
|
|
+ rulesTextCache.delete(key);
|
|
|
|
+ rulesModCache.delete(key);
|
|
|
|
+ });
|
|
|
|
+ prevFilterKey = themeKey;
|
|
|
|
+ if (!force && !rulesChanged && !themeChanged) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ renderId++;
|
|
|
|
+ function setRule(target, index, rule) {
|
|
|
|
+ var selector = rule.selector, declarations = rule.declarations;
|
|
|
|
+ var getDeclarationText = function (dec) {
|
|
|
|
+ var property = dec.property, value = dec.value, important = dec.important, sourceValue = dec.sourceValue;
|
|
|
|
+ return "".concat(property, ": ").concat(value == null ? sourceValue : value).concat(important ? ' !important' : '', ";");
|
|
|
|
+ };
|
|
|
|
+ var cssRulesText = '';
|
|
|
|
+ declarations.forEach(function (declarations) {
|
|
|
|
+ cssRulesText += "".concat(getDeclarationText(declarations), " ");
|
|
|
|
+ });
|
|
|
|
+ var ruleText = "".concat(selector, " { ").concat(cssRulesText, " }");
|
|
|
|
+ target.insertRule(ruleText, index);
|
|
|
|
+ }
|
|
|
|
+ var asyncDeclarations = new Map();
|
|
|
|
+ var varDeclarations = new Map();
|
|
|
|
+ var asyncDeclarationCounter = 0;
|
|
|
|
+ var varDeclarationCounter = 0;
|
|
|
|
+ var rootReadyGroup = { rule: null, rules: [], isGroup: true };
|
|
|
|
+ var groupRefs = new WeakMap();
|
|
|
|
+ function getGroup(rule) {
|
|
|
|
+ if (rule == null) {
|
|
|
|
+ return rootReadyGroup;
|
|
|
|
+ }
|
|
|
|
+ if (groupRefs.has(rule)) {
|
|
|
|
+ return groupRefs.get(rule);
|
|
|
|
+ }
|
|
|
|
+ var group = { rule: rule, rules: [], isGroup: true };
|
|
|
|
+ groupRefs.set(rule, group);
|
|
|
|
+ var parentGroup = getGroup(rule.parentRule);
|
|
|
|
+ parentGroup.rules.push(group);
|
|
|
|
+ return group;
|
|
|
|
+ }
|
|
|
|
+ varTypeChangeCleaners.forEach(function (clear) { return clear(); });
|
|
|
|
+ varTypeChangeCleaners.clear();
|
|
|
|
+ modRules.filter(function (r) { return r; }).forEach(function (_a) {
|
|
|
|
+ var selector = _a.selector, declarations = _a.declarations, parentRule = _a.parentRule;
|
|
|
|
+ var group = getGroup(parentRule);
|
|
|
|
+ var readyStyleRule = { selector: selector, declarations: [], isGroup: false };
|
|
|
|
+ var readyDeclarations = readyStyleRule.declarations;
|
|
|
|
+ group.rules.push(readyStyleRule);
|
|
|
|
+ function handleAsyncDeclaration(property, modified, important, sourceValue) {
|
|
|
|
+ var asyncKey = ++asyncDeclarationCounter;
|
|
|
|
+ var asyncDeclaration = { property: property, value: null, important: important, asyncKey: asyncKey, sourceValue: sourceValue };
|
|
|
|
+ readyDeclarations.push(asyncDeclaration);
|
|
|
|
+ var currentRenderId = renderId;
|
|
|
|
+ modified.then(function (asyncValue) {
|
|
|
|
+ if (!asyncValue || isAsyncCancelled() || currentRenderId !== renderId) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ asyncDeclaration.value = asyncValue;
|
|
|
|
+ asyncQueue.add(function () {
|
|
|
|
+ if (isAsyncCancelled() || currentRenderId !== renderId) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ rebuildAsyncRule(asyncKey);
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function handleVarDeclarations(property, modified, important, sourceValue) {
|
|
|
|
+ var _a = modified, varDecs = _a.declarations, onTypeChange = _a.onTypeChange;
|
|
|
|
+ var varKey = ++varDeclarationCounter;
|
|
|
|
+ var currentRenderId = renderId;
|
|
|
|
+ var initialIndex = readyDeclarations.length;
|
|
|
|
+ var oldDecs = [];
|
|
|
|
+ if (varDecs.length === 0) {
|
|
|
|
+ var tempDec = { property: property, value: sourceValue, important: important, sourceValue: sourceValue, varKey: varKey };
|
|
|
|
+ readyDeclarations.push(tempDec);
|
|
|
|
+ oldDecs = [tempDec];
|
|
|
|
+ }
|
|
|
|
+ varDecs.forEach(function (mod) {
|
|
|
|
+ if (mod.value instanceof Promise) {
|
|
|
|
+ handleAsyncDeclaration(mod.property, mod.value, important, sourceValue);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ var readyDec = { property: mod.property, value: mod.value, important: important, sourceValue: sourceValue, varKey: varKey };
|
|
|
|
+ readyDeclarations.push(readyDec);
|
|
|
|
+ oldDecs.push(readyDec);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ onTypeChange.addListener(function (newDecs) {
|
|
|
|
+ if (isAsyncCancelled() || currentRenderId !== renderId) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ var readyVarDecs = newDecs.map(function (mod) {
|
|
|
|
+ return { property: mod.property, value: mod.value, important: important, sourceValue: sourceValue, varKey: varKey };
|
|
|
|
+ });
|
|
|
|
+ var index = readyDeclarations.indexOf(oldDecs[0], initialIndex);
|
|
|
|
+ readyDeclarations.splice.apply(readyDeclarations, __spreadArray([index, oldDecs.length], __read(readyVarDecs), false));
|
|
|
|
+ oldDecs = readyVarDecs;
|
|
|
|
+ rebuildVarRule(varKey);
|
|
|
|
+ });
|
|
|
|
+ varTypeChangeCleaners.add(function () { return onTypeChange.removeListeners(); });
|
|
|
|
+ }
|
|
|
|
+ declarations.forEach(function (_a) {
|
|
|
|
+ var property = _a.property, value = _a.value, important = _a.important, sourceValue = _a.sourceValue;
|
|
|
|
+ if (typeof value === 'function') {
|
|
|
|
+ var modified = value(theme);
|
|
|
|
+ if (modified instanceof Promise) {
|
|
|
|
+ handleAsyncDeclaration(property, modified, important, sourceValue);
|
|
|
|
+ }
|
|
|
|
+ else if (property.startsWith('--')) {
|
|
|
|
+ handleVarDeclarations(property, modified, important, sourceValue);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ readyDeclarations.push({ property: property, value: modified, important: important, sourceValue: sourceValue });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ readyDeclarations.push({ property: property, value: value, important: important, sourceValue: sourceValue });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ var sheet = prepareSheet();
|
|
|
|
+ function buildStyleSheet() {
|
|
|
|
+ function createTarget(group, parent) {
|
|
|
|
+ var rule = group.rule;
|
|
|
|
+ if (rule instanceof CSSMediaRule) {
|
|
|
|
+ var media = rule.media;
|
|
|
|
+ var index = parent.cssRules.length;
|
|
|
|
+ parent.insertRule("@media ".concat(media.mediaText, " {}"), index);
|
|
|
|
+ return parent.cssRules[index];
|
|
|
|
+ }
|
|
|
|
+ return parent;
|
|
|
|
+ }
|
|
|
|
+ function iterateReadyRules(group, target, styleIterator) {
|
|
|
|
+ group.rules.forEach(function (r) {
|
|
|
|
+ if (r.isGroup) {
|
|
|
|
+ var t = createTarget(r, target);
|
|
|
|
+ iterateReadyRules(r, t, styleIterator);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ styleIterator(r, target);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ iterateReadyRules(rootReadyGroup, sheet, function (rule, target) {
|
|
|
|
+ var index = target.cssRules.length;
|
|
|
|
+ rule.declarations.forEach(function (_a) {
|
|
|
|
+ var asyncKey = _a.asyncKey, varKey = _a.varKey;
|
|
|
|
+ if (asyncKey != null) {
|
|
|
|
+ asyncDeclarations.set(asyncKey, { rule: rule, target: target, index: index });
|
|
|
|
+ }
|
|
|
|
+ if (varKey != null) {
|
|
|
|
+ varDeclarations.set(varKey, { rule: rule, target: target, index: index });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ setRule(target, index, rule);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function rebuildAsyncRule(key) {
|
|
|
|
+ var _a = asyncDeclarations.get(key), rule = _a.rule, target = _a.target, index = _a.index;
|
|
|
|
+ target.deleteRule(index);
|
|
|
|
+ setRule(target, index, rule);
|
|
|
|
+ asyncDeclarations.delete(key);
|
|
|
|
+ }
|
|
|
|
+ function rebuildVarRule(key) {
|
|
|
|
+ var _a = varDeclarations.get(key), rule = _a.rule, target = _a.target, index = _a.index;
|
|
|
|
+ target.deleteRule(index);
|
|
|
|
+ setRule(target, index, rule);
|
|
|
|
+ }
|
|
|
|
+ buildStyleSheet();
|
|
|
|
+ }
|
|
|
|
+ return { modifySheet: modifySheet, shouldRebuildStyle: shouldRebuildStyle };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var STYLE_SELECTOR = 'style, link[rel*="stylesheet" i]:not([disabled])';
|
|
|
|
+ function shouldManageStyle(element) {
|
|
|
|
+ return (((element instanceof HTMLStyleElement) ||
|
|
|
|
+ (element instanceof SVGStyleElement) ||
|
|
|
|
+ (element instanceof HTMLLinkElement &&
|
|
|
|
+ element.rel &&
|
|
|
|
+ element.rel.toLowerCase().includes('stylesheet') &&
|
|
|
|
+ !element.disabled &&
|
|
|
|
+ (isFirefox ? !element.href.startsWith('moz-extension://') : true) &&
|
|
|
|
+ ((new URL(element.href)).hostname != 'fonts.googleapis.com'))) &&
|
|
|
|
+ !element.classList.contains('darkreader') &&
|
|
|
|
+ element.media.toLowerCase() !== 'print' &&
|
|
|
|
+ !element.classList.contains('stylus'));
|
|
|
|
+ }
|
|
|
|
+ function getManageableStyles(node, results, deep) {
|
|
|
|
+ if (results === void 0) { results = []; }
|
|
|
|
+ if (deep === void 0) { deep = true; }
|
|
|
|
+ if (shouldManageStyle(node)) {
|
|
|
|
+ results.push(node);
|
|
|
|
+ }
|
|
|
|
+ else if (node instanceof Element || (isShadowDomSupported && node instanceof ShadowRoot) || node === document) {
|
|
|
|
+ forEach(node.querySelectorAll(STYLE_SELECTOR), function (style) { return getManageableStyles(style, results, false); });
|
|
|
|
+ if (deep) {
|
|
|
|
+ iterateShadowHosts(node, function (host) { return getManageableStyles(host.shadowRoot, results, false); });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return results;
|
|
|
|
+ }
|
|
|
|
+ var syncStyleSet = new WeakSet();
|
|
|
|
+ var corsStyleSet = new WeakSet();
|
|
|
|
+ var canOptimizeUsingProxy$1 = false;
|
|
|
|
+ document.addEventListener('__darkreader__inlineScriptsAllowed', function () {
|
|
|
|
+ canOptimizeUsingProxy$1 = true;
|
|
|
|
+ });
|
|
|
|
+ var loadingLinkCounter = 0;
|
|
|
|
+ var rejectorsForLoadingLinks = new Map();
|
|
|
|
+ function cleanLoadingLinks() {
|
|
|
|
+ rejectorsForLoadingLinks.clear();
|
|
|
|
+ }
|
|
|
|
+ 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') && !corsStyleSet.has(el); }) || null;
|
|
|
|
+ var syncStyle = prevStyles.find(function (el) { return el.matches('.darkreader--sync') && !syncStyleSet.has(el); }) || null;
|
|
|
|
+ var corsCopyPositionWatcher = null;
|
|
|
|
+ var syncStylePositionWatcher = null;
|
|
|
|
+ var cancelAsyncOperations = false;
|
|
|
|
+ var isOverrideEmpty = true;
|
|
|
|
+ var sheetModifier = createStyleSheetModifier();
|
|
|
|
+ var observer = new MutationObserver(function () {
|
|
|
|
+ update();
|
|
|
|
+ });
|
|
|
|
+ var observerOptions = { attributes: true, childList: true, subtree: true, characterData: true };
|
|
|
|
+ function containsCSSImport() {
|
|
|
|
+ return element instanceof HTMLStyleElement && element.textContent.trim().match(cssImportRegex);
|
|
|
|
+ }
|
|
|
|
+ function hasImports(cssRules, checkCrossOrigin) {
|
|
|
|
+ var result = false;
|
|
|
|
+ if (cssRules) {
|
|
|
|
+ var rule = void 0;
|
|
|
|
+ cssRulesLoop: for (var i = 0, len = cssRules.length; i < len; i++) {
|
|
|
|
+ rule = cssRules[i];
|
|
|
|
+ if (rule.href) {
|
|
|
|
+ if (checkCrossOrigin) {
|
|
|
|
+ if (rule.href.startsWith('http') && !rule.href.startsWith(location.origin)) {
|
|
|
|
+ result = true;
|
|
|
|
+ break cssRulesLoop;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ result = true;
|
|
|
|
+ break cssRulesLoop;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+ function getRulesSync() {
|
|
|
|
+ if (corsCopy) {
|
|
|
|
+ logInfo('[getRulesSync] Using cors-copy.');
|
|
|
|
+ return corsCopy.sheet.cssRules;
|
|
|
|
+ }
|
|
|
|
+ if (containsCSSImport()) {
|
|
|
|
+ logInfo('[getRulesSync] CSSImport detected.');
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ var cssRules = safeGetSheetRules();
|
|
|
|
+ if (element instanceof HTMLLinkElement &&
|
|
|
|
+ !isRelativeHrefOnAbsolutePath(element.href) &&
|
|
|
|
+ hasImports(cssRules, false)) {
|
|
|
|
+ logInfo('[getRulesSync] CSSImportRule detected on non-local href.');
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ if (hasImports(cssRules, true)) {
|
|
|
|
+ logInfo('[getRulesSync] Cross-Origin CSSImportRule detected.');
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ logInfo('[getRulesSync] Using cssRules.');
|
|
|
|
+ !cssRules && logWarn('[getRulesSync] cssRules is null, trying again.');
|
|
|
|
+ return cssRules;
|
|
|
|
+ }
|
|
|
|
+ function insertStyle() {
|
|
|
|
+ if (corsCopy) {
|
|
|
|
+ if (element.nextSibling !== corsCopy) {
|
|
|
|
+ element.parentNode.insertBefore(corsCopy, element.nextSibling);
|
|
|
|
+ }
|
|
|
|
+ if (corsCopy.nextSibling !== syncStyle) {
|
|
|
|
+ element.parentNode.insertBefore(syncStyle, corsCopy.nextSibling);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (element.nextSibling !== syncStyle) {
|
|
|
|
+ element.parentNode.insertBefore(syncStyle, element.nextSibling);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function createSyncStyle() {
|
|
|
|
+ syncStyle = element instanceof SVGStyleElement ?
|
|
|
|
+ document.createElementNS('http://www.w3.org/2000/svg', 'style') :
|
|
|
|
+ document.createElement('style');
|
|
|
|
+ syncStyle.classList.add('darkreader');
|
|
|
|
+ syncStyle.classList.add('darkreader--sync');
|
|
|
|
+ syncStyle.media = 'screen';
|
|
|
|
+ if (element.title) {
|
|
|
|
+ syncStyle.title = element.title;
|
|
|
|
+ }
|
|
|
|
+ syncStyleSet.add(syncStyle);
|
|
|
|
+ }
|
|
|
|
+ var isLoadingRules = false;
|
|
|
|
+ var wasLoadingError = false;
|
|
|
|
+ var loadingLinkId = ++loadingLinkCounter;
|
|
|
|
+ function getRulesAsync() {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ var cssText, cssBasePath, _a, cssRules, accessError, err_1, fullCSSText, err_2;
|
|
|
|
+ var _b;
|
|
|
|
+ return __generator(this, function (_c) {
|
|
|
|
+ switch (_c.label) {
|
|
|
|
+ case 0:
|
|
|
|
+ if (!(element instanceof HTMLLinkElement)) return [3, 7];
|
|
|
|
+ _a = __read(getRulesOrError(), 2), cssRules = _a[0], accessError = _a[1];
|
|
|
|
+ if (accessError) {
|
|
|
|
+ logWarn(accessError);
|
|
|
|
+ }
|
|
|
|
+ if (!((!cssRules && !accessError && !isSafari) ||
|
|
|
|
+ (isSafari && !element.sheet) ||
|
|
|
|
+ isStillLoadingError(accessError))) return [3, 5];
|
|
|
|
+ _c.label = 1;
|
|
|
|
+ case 1:
|
|
|
|
+ _c.trys.push([1, 3, , 4]);
|
|
|
|
+ logInfo("Linkelement ".concat(loadingLinkId, " is not loaded yet and thus will be await for"), element);
|
|
|
|
+ return [4, linkLoading(element, loadingLinkId)];
|
|
|
|
+ case 2:
|
|
|
|
+ _c.sent();
|
|
|
|
+ return [3, 4];
|
|
|
|
+ case 3:
|
|
|
|
+ err_1 = _c.sent();
|
|
|
|
+ logWarn(err_1);
|
|
|
|
+ wasLoadingError = true;
|
|
|
|
+ return [3, 4];
|
|
|
|
+ case 4:
|
|
|
|
+ if (cancelAsyncOperations) {
|
|
|
|
+ return [2, null];
|
|
|
|
+ }
|
|
|
|
+ _b = __read(getRulesOrError(), 2), cssRules = _b[0], accessError = _b[1];
|
|
|
|
+ if (accessError) {
|
|
|
|
+ logWarn(accessError);
|
|
|
|
+ }
|
|
|
|
+ _c.label = 5;
|
|
|
|
+ case 5:
|
|
|
|
+ if (cssRules) {
|
|
|
|
+ if (!hasImports(cssRules, false)) {
|
|
|
|
+ return [2, cssRules];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return [4, loadText(element.href)];
|
|
|
|
+ case 6:
|
|
|
|
+ cssText = _c.sent();
|
|
|
|
+ cssBasePath = getCSSBaseBath(element.href);
|
|
|
|
+ if (cancelAsyncOperations) {
|
|
|
|
+ return [2, null];
|
|
|
|
+ }
|
|
|
|
+ return [3, 8];
|
|
|
|
+ case 7:
|
|
|
|
+ if (containsCSSImport()) {
|
|
|
|
+ cssText = element.textContent.trim();
|
|
|
|
+ cssBasePath = getCSSBaseBath(location.href);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ return [2, null];
|
|
|
|
+ }
|
|
|
|
+ _c.label = 8;
|
|
|
|
+ case 8:
|
|
|
|
+ if (!cssText) return [3, 13];
|
|
|
|
+ _c.label = 9;
|
|
|
|
+ case 9:
|
|
|
|
+ _c.trys.push([9, 11, , 12]);
|
|
|
|
+ return [4, replaceCSSImports(cssText, cssBasePath)];
|
|
|
|
+ case 10:
|
|
|
|
+ fullCSSText = _c.sent();
|
|
|
|
+ corsCopy = createCORSCopy(element, fullCSSText);
|
|
|
|
+ return [3, 12];
|
|
|
|
+ case 11:
|
|
|
|
+ err_2 = _c.sent();
|
|
|
|
+ logWarn(err_2);
|
|
|
|
+ return [3, 12];
|
|
|
|
+ case 12:
|
|
|
|
+ if (corsCopy) {
|
|
|
|
+ corsCopyPositionWatcher = watchForNodePosition(corsCopy, 'prev-sibling');
|
|
|
|
+ return [2, corsCopy.sheet.cssRules];
|
|
|
|
+ }
|
|
|
|
+ _c.label = 13;
|
|
|
|
+ case 13: return [2, null];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function details(options) {
|
|
|
|
+ var rules = getRulesSync();
|
|
|
|
+ if (!rules) {
|
|
|
|
+ if (options.secondRound) {
|
|
|
|
+ logWarn('Detected dead-lock at details(), returning early to prevent it.');
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
+ return { rules: rules };
|
|
|
|
+ }
|
|
|
|
+ var forceRenderStyle = false;
|
|
|
|
+ function render(theme, ignoreImageAnalysis) {
|
|
|
|
+ var rules = getRulesSync();
|
|
|
|
+ if (!rules) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ cancelAsyncOperations = false;
|
|
|
|
+ function removeCSSRulesFromSheet(sheet) {
|
|
|
|
+ for (var i = sheet.cssRules.length - 1; i >= 0; i--) {
|
|
|
|
+ sheet.deleteRule(i);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function prepareOverridesSheet() {
|
|
|
|
+ if (!syncStyle) {
|
|
|
|
+ createSyncStyle();
|
|
|
|
+ }
|
|
|
|
+ syncStylePositionWatcher && syncStylePositionWatcher.stop();
|
|
|
|
+ insertStyle();
|
|
|
|
+ if (syncStyle.sheet == null) {
|
|
|
|
+ syncStyle.textContent = '';
|
|
|
|
+ }
|
|
|
|
+ var sheet = syncStyle.sheet;
|
|
|
|
+ removeCSSRulesFromSheet(sheet);
|
|
|
|
+ if (syncStylePositionWatcher) {
|
|
|
|
+ syncStylePositionWatcher.run();
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ syncStylePositionWatcher = watchForNodePosition(syncStyle, 'prev-sibling', function () {
|
|
|
|
+ forceRenderStyle = true;
|
|
|
|
+ buildOverrides();
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ return syncStyle.sheet;
|
|
|
|
+ }
|
|
|
|
+ function buildOverrides() {
|
|
|
|
+ var force = forceRenderStyle;
|
|
|
|
+ forceRenderStyle = false;
|
|
|
|
+ sheetModifier.modifySheet({
|
|
|
|
+ prepareSheet: prepareOverridesSheet,
|
|
|
|
+ sourceCSSRules: rules,
|
|
|
|
+ theme: theme,
|
|
|
|
+ ignoreImageAnalysis: ignoreImageAnalysis,
|
|
|
|
+ force: force,
|
|
|
|
+ isAsyncCancelled: function () { return cancelAsyncOperations; },
|
|
|
|
+ });
|
|
|
|
+ isOverrideEmpty = syncStyle.sheet.cssRules.length === 0;
|
|
|
|
+ if (sheetModifier.shouldRebuildStyle()) {
|
|
|
|
+ addReadyStateCompleteListener(function () { return update(); });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ buildOverrides();
|
|
|
|
+ }
|
|
|
|
+ function getRulesOrError() {
|
|
|
|
+ try {
|
|
|
|
+ if (element.sheet == null) {
|
|
|
|
+ return [null, null];
|
|
|
|
+ }
|
|
|
|
+ return [element.sheet.cssRules, null];
|
|
|
|
+ }
|
|
|
|
+ catch (err) {
|
|
|
|
+ return [null, err];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function isStillLoadingError(error) {
|
|
|
|
+ return error && error.message && error.message.includes('loading');
|
|
|
|
+ }
|
|
|
|
+ function safeGetSheetRules() {
|
|
|
|
+ var _a = __read(getRulesOrError(), 2), cssRules = _a[0], err = _a[1];
|
|
|
|
+ if (err) {
|
|
|
|
+ logWarn(err);
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ return cssRules;
|
|
|
|
+ }
|
|
|
|
+ function watchForSheetChanges() {
|
|
|
|
+ watchForSheetChangesUsingProxy();
|
|
|
|
+ if (!isThunderbird && !(canOptimizeUsingProxy$1 && element.sheet)) {
|
|
|
|
+ watchForSheetChangesUsingRAF();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ var rulesChangeKey = null;
|
|
|
|
+ var rulesCheckFrameId = null;
|
|
|
|
+ function getRulesChangeKey() {
|
|
|
|
+ var rules = safeGetSheetRules();
|
|
|
|
+ return rules ? rules.length : null;
|
|
|
|
+ }
|
|
|
|
+ function didRulesKeyChange() {
|
|
|
|
+ return getRulesChangeKey() !== rulesChangeKey;
|
|
|
|
+ }
|
|
|
|
+ function watchForSheetChangesUsingRAF() {
|
|
|
|
+ rulesChangeKey = getRulesChangeKey();
|
|
|
|
+ stopWatchingForSheetChangesUsingRAF();
|
|
|
|
+ var checkForUpdate = function () {
|
|
|
|
+ if (didRulesKeyChange()) {
|
|
|
|
+ rulesChangeKey = getRulesChangeKey();
|
|
|
|
+ update();
|
|
|
|
+ }
|
|
|
|
+ if (canOptimizeUsingProxy$1 && element.sheet) {
|
|
|
|
+ stopWatchingForSheetChangesUsingRAF();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ rulesCheckFrameId = requestAnimationFrame(checkForUpdate);
|
|
|
|
+ };
|
|
|
|
+ checkForUpdate();
|
|
|
|
+ }
|
|
|
|
+ function stopWatchingForSheetChangesUsingRAF() {
|
|
|
|
+ cancelAnimationFrame(rulesCheckFrameId);
|
|
|
|
+ }
|
|
|
|
+ var areSheetChangesPending = false;
|
|
|
|
+ function onSheetChange() {
|
|
|
|
+ canOptimizeUsingProxy$1 = true;
|
|
|
|
+ stopWatchingForSheetChangesUsingRAF();
|
|
|
|
+ if (areSheetChangesPending) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ function handleSheetChanges() {
|
|
|
|
+ areSheetChangesPending = false;
|
|
|
|
+ if (cancelAsyncOperations) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ update();
|
|
|
|
+ }
|
|
|
|
+ areSheetChangesPending = true;
|
|
|
|
+ if (typeof queueMicrotask === 'function') {
|
|
|
|
+ queueMicrotask(handleSheetChanges);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ requestAnimationFrame(handleSheetChanges);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function watchForSheetChangesUsingProxy() {
|
|
|
|
+ element.addEventListener('__darkreader__updateSheet', onSheetChange);
|
|
|
|
+ }
|
|
|
|
+ function stopWatchingForSheetChangesUsingProxy() {
|
|
|
|
+ element.removeEventListener('__darkreader__updateSheet', onSheetChange);
|
|
|
|
+ }
|
|
|
|
+ function stopWatchingForSheetChanges() {
|
|
|
|
+ stopWatchingForSheetChangesUsingProxy();
|
|
|
|
+ stopWatchingForSheetChangesUsingRAF();
|
|
|
|
+ }
|
|
|
|
+ function pause() {
|
|
|
|
+ observer.disconnect();
|
|
|
|
+ cancelAsyncOperations = true;
|
|
|
|
+ corsCopyPositionWatcher && corsCopyPositionWatcher.stop();
|
|
|
|
+ syncStylePositionWatcher && syncStylePositionWatcher.stop();
|
|
|
|
+ stopWatchingForSheetChanges();
|
|
|
|
+ }
|
|
|
|
+ function destroy() {
|
|
|
|
+ pause();
|
|
|
|
+ removeNode(corsCopy);
|
|
|
|
+ removeNode(syncStyle);
|
|
|
|
+ loadingEnd();
|
|
|
|
+ if (rejectorsForLoadingLinks.has(loadingLinkId)) {
|
|
|
|
+ var reject = rejectorsForLoadingLinks.get(loadingLinkId);
|
|
|
|
+ rejectorsForLoadingLinks.delete(loadingLinkId);
|
|
|
|
+ reject && reject();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function watch() {
|
|
|
|
+ observer.observe(element, observerOptions);
|
|
|
|
+ if (element instanceof HTMLStyleElement) {
|
|
|
|
+ watchForSheetChanges();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ var maxMoveCount = 10;
|
|
|
|
+ var moveCount = 0;
|
|
|
|
+ function restore() {
|
|
|
|
+ if (!syncStyle) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ moveCount++;
|
|
|
|
+ if (moveCount > maxMoveCount) {
|
|
|
|
+ logWarn('Style sheet was moved multiple times', element);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ logWarn('Restore style', syncStyle, element);
|
|
|
|
+ insertStyle();
|
|
|
|
+ corsCopyPositionWatcher && corsCopyPositionWatcher.skip();
|
|
|
|
+ syncStylePositionWatcher && syncStylePositionWatcher.skip();
|
|
|
|
+ if (!isOverrideEmpty) {
|
|
|
|
+ forceRenderStyle = true;
|
|
|
|
+ update();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return {
|
|
|
|
+ details: details,
|
|
|
|
+ render: render,
|
|
|
|
+ pause: pause,
|
|
|
|
+ destroy: destroy,
|
|
|
|
+ watch: watch,
|
|
|
|
+ restore: restore,
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ function linkLoading(link, loadingId) {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ return [2, new Promise(function (resolve, reject) {
|
|
|
|
+ var cleanUp = function () {
|
|
|
|
+ link.removeEventListener('load', onLoad);
|
|
|
|
+ link.removeEventListener('error', onError);
|
|
|
|
+ rejectorsForLoadingLinks.delete(loadingId);
|
|
|
|
+ };
|
|
|
|
+ var onLoad = function () {
|
|
|
|
+ cleanUp();
|
|
|
|
+ logInfo("Linkelement ".concat(loadingId, " has been loaded"));
|
|
|
|
+ resolve();
|
|
|
|
+ };
|
|
|
|
+ var onError = function () {
|
|
|
|
+ cleanUp();
|
|
|
|
+ reject("Linkelement ".concat(loadingId, " couldn't be loaded. ").concat(link.href));
|
|
|
|
+ };
|
|
|
|
+ rejectorsForLoadingLinks.set(loadingId, function () {
|
|
|
|
+ cleanUp();
|
|
|
|
+ reject();
|
|
|
|
+ });
|
|
|
|
+ link.addEventListener('load', onLoad);
|
|
|
|
+ link.addEventListener('error', onError);
|
|
|
|
+ if (!link.href) {
|
|
|
|
+ onError();
|
|
|
|
+ }
|
|
|
|
+ })];
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function getCSSImportURL(importDeclaration) {
|
|
|
|
+ return getCSSURLValue(importDeclaration.substring(7).trim().replace(/;$/, '').replace(/screen$/, ''));
|
|
|
|
+ }
|
|
|
|
+ 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', mimeType: 'text/css', origin: window.location.origin })];
|
|
|
|
+ case 4: return [2, _a.sent()];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function replaceCSSImports(cssText, basePath, cache) {
|
|
|
|
+ if (cache === void 0) { cache = new Map(); }
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ var importMatches, importMatches_1, importMatches_1_1, match, importURL, absoluteURL, importedCSS, err_3, e_1_1;
|
|
|
|
+ var e_1, _a;
|
|
|
|
+ return __generator(this, function (_b) {
|
|
|
|
+ switch (_b.label) {
|
|
|
|
+ case 0:
|
|
|
|
+ cssText = removeCSSComments(cssText);
|
|
|
|
+ cssText = replaceCSSFontFace(cssText);
|
|
|
|
+ cssText = replaceCSSRelativeURLsWithAbsolute(cssText, basePath);
|
|
|
|
+ importMatches = getMatches(cssImportRegex, cssText);
|
|
|
|
+ _b.label = 1;
|
|
|
|
+ case 1:
|
|
|
|
+ _b.trys.push([1, 10, 11, 12]);
|
|
|
|
+ importMatches_1 = __values(importMatches), importMatches_1_1 = importMatches_1.next();
|
|
|
|
+ _b.label = 2;
|
|
|
|
+ case 2:
|
|
|
|
+ if (!!importMatches_1_1.done) return [3, 9];
|
|
|
|
+ match = importMatches_1_1.value;
|
|
|
|
+ importURL = getCSSImportURL(match);
|
|
|
|
+ absoluteURL = getAbsoluteURL(basePath, importURL);
|
|
|
|
+ importedCSS = void 0;
|
|
|
|
+ if (!cache.has(absoluteURL)) return [3, 3];
|
|
|
|
+ importedCSS = cache.get(absoluteURL);
|
|
|
|
+ return [3, 7];
|
|
|
|
+ case 3:
|
|
|
|
+ _b.trys.push([3, 6, , 7]);
|
|
|
|
+ return [4, loadText(absoluteURL)];
|
|
|
|
+ case 4:
|
|
|
|
+ importedCSS = _b.sent();
|
|
|
|
+ cache.set(absoluteURL, importedCSS);
|
|
|
|
+ return [4, replaceCSSImports(importedCSS, getCSSBaseBath(absoluteURL), cache)];
|
|
|
|
+ case 5:
|
|
|
|
+ importedCSS = _b.sent();
|
|
|
|
+ return [3, 7];
|
|
|
|
+ case 6:
|
|
|
|
+ err_3 = _b.sent();
|
|
|
|
+ logWarn(err_3);
|
|
|
|
+ importedCSS = '';
|
|
|
|
+ return [3, 7];
|
|
|
|
+ case 7:
|
|
|
|
+ cssText = cssText.split(match).join(importedCSS);
|
|
|
|
+ _b.label = 8;
|
|
|
|
+ case 8:
|
|
|
|
+ importMatches_1_1 = importMatches_1.next();
|
|
|
|
+ return [3, 2];
|
|
|
|
+ case 9: return [3, 12];
|
|
|
|
+ case 10:
|
|
|
|
+ e_1_1 = _b.sent();
|
|
|
|
+ e_1 = { error: e_1_1 };
|
|
|
|
+ return [3, 12];
|
|
|
|
+ case 11:
|
|
|
|
+ try {
|
|
|
|
+ if (importMatches_1_1 && !importMatches_1_1.done && (_a = importMatches_1.return)) _a.call(importMatches_1);
|
|
|
|
+ }
|
|
|
|
+ finally { if (e_1) throw e_1.error; }
|
|
|
|
+ return [7];
|
|
|
|
+ case 12:
|
|
|
|
+ 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;
|
|
|
|
+ corsStyleSet.add(cors);
|
|
|
|
+ return cors;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var observers = [];
|
|
|
|
+ var observedRoots;
|
|
|
|
+ var undefinedGroups = new Map();
|
|
|
|
+ var elementsDefinitionCallback;
|
|
|
|
+ function collectUndefinedElements(root) {
|
|
|
|
+ if (!isDefinedSelectorSupported) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ forEach(root.querySelectorAll(':not(:defined)'), function (el) {
|
|
|
|
+ var tag = el.tagName.toLowerCase();
|
|
|
|
+ if (!tag.includes('-')) {
|
|
|
|
+ var extendedTag = el.getAttribute('is');
|
|
|
|
+ if (extendedTag) {
|
|
|
|
+ tag = extendedTag;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (!undefinedGroups.has(tag)) {
|
|
|
|
+ undefinedGroups.set(tag, new Set());
|
|
|
|
+ customElementsWhenDefined(tag).then(function () {
|
|
|
|
+ if (elementsDefinitionCallback) {
|
|
|
|
+ var elements = undefinedGroups.get(tag);
|
|
|
|
+ undefinedGroups.delete(tag);
|
|
|
|
+ elementsDefinitionCallback(Array.from(elements));
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ undefinedGroups.get(tag).add(el);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ var canOptimizeUsingProxy = false;
|
|
|
|
+ document.addEventListener('__darkreader__inlineScriptsAllowed', function () {
|
|
|
|
+ canOptimizeUsingProxy = true;
|
|
|
|
+ });
|
|
|
|
+ var resolvers = new Map();
|
|
|
|
+ function handleIsDefined(e) {
|
|
|
|
+ canOptimizeUsingProxy = true;
|
|
|
|
+ if (resolvers.has(e.detail.tag)) {
|
|
|
|
+ var resolve = resolvers.get(e.detail.tag);
|
|
|
|
+ resolve();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function customElementsWhenDefined(tag) {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ return [2, new Promise(function (resolve) {
|
|
|
|
+ if (window.customElements && typeof customElements.whenDefined === 'function') {
|
|
|
|
+ customElements.whenDefined(tag).then(function () { return resolve(); });
|
|
|
|
+ }
|
|
|
|
+ else if (canOptimizeUsingProxy) {
|
|
|
|
+ resolvers.set(tag, resolve);
|
|
|
|
+ document.dispatchEvent(new CustomEvent('__darkreader__addUndefinedResolver', { detail: { tag: tag } }));
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ var checkIfDefined_1 = function () {
|
|
|
|
+ var elements = undefinedGroups.get(tag);
|
|
|
|
+ if (elements && elements.size > 0) {
|
|
|
|
+ if (elements.values().next().value.matches(':defined')) {
|
|
|
|
+ resolve();
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ requestAnimationFrame(checkIfDefined_1);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ requestAnimationFrame(checkIfDefined_1);
|
|
|
|
+ }
|
|
|
|
+ })];
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function watchWhenCustomElementsDefined(callback) {
|
|
|
|
+ elementsDefinitionCallback = callback;
|
|
|
|
+ }
|
|
|
|
+ function unsubscribeFromDefineCustomElements() {
|
|
|
|
+ elementsDefinitionCallback = null;
|
|
|
|
+ undefinedGroups.clear();
|
|
|
|
+ document.removeEventListener('__darkreader__isDefined', handleIsDefined);
|
|
|
|
+ }
|
|
|
|
+ function watchForStyleChanges(currentStyles, update, shadowRootDiscovered) {
|
|
|
|
+ stopWatchingForStyleChanges();
|
|
|
|
+ var prevStyles = new Set(currentStyles);
|
|
|
|
+ var prevStyleSiblings = new WeakMap();
|
|
|
|
+ var nextStyleSiblings = new WeakMap();
|
|
|
|
+ function saveStylePosition(style) {
|
|
|
|
+ prevStyleSiblings.set(style, style.previousElementSibling);
|
|
|
|
+ nextStyleSiblings.set(style, style.nextElementSibling);
|
|
|
|
+ }
|
|
|
|
+ function forgetStylePosition(style) {
|
|
|
|
+ prevStyleSiblings.delete(style);
|
|
|
|
+ nextStyleSiblings.delete(style);
|
|
|
|
+ }
|
|
|
|
+ function didStylePositionChange(style) {
|
|
|
|
+ return (style.previousElementSibling !== prevStyleSiblings.get(style) ||
|
|
|
|
+ style.nextElementSibling !== nextStyleSiblings.get(style));
|
|
|
|
+ }
|
|
|
|
+ currentStyles.forEach(saveStylePosition);
|
|
|
|
+ function handleStyleOperations(operations) {
|
|
|
|
+ var createdStyles = operations.createdStyles, removedStyles = operations.removedStyles, movedStyles = operations.movedStyles;
|
|
|
|
+ createdStyles.forEach(function (s) { return saveStylePosition(s); });
|
|
|
|
+ movedStyles.forEach(function (s) { return saveStylePosition(s); });
|
|
|
|
+ removedStyles.forEach(function (s) { return forgetStylePosition(s); });
|
|
|
|
+ createdStyles.forEach(function (s) { return prevStyles.add(s); });
|
|
|
|
+ removedStyles.forEach(function (s) { return prevStyles.delete(s); });
|
|
|
|
+ if (createdStyles.size + removedStyles.size + movedStyles.size > 0) {
|
|
|
|
+ update({
|
|
|
|
+ created: Array.from(createdStyles),
|
|
|
|
+ removed: Array.from(removedStyles),
|
|
|
|
+ moved: Array.from(movedStyles),
|
|
|
|
+ updated: [],
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function handleMinorTreeMutations(_a) {
|
|
|
|
+ var additions = _a.additions, moves = _a.moves, deletions = _a.deletions;
|
|
|
|
+ var createdStyles = new Set();
|
|
|
|
+ var removedStyles = new Set();
|
|
|
|
+ var movedStyles = new Set();
|
|
|
|
+ additions.forEach(function (node) { return getManageableStyles(node).forEach(function (style) { return createdStyles.add(style); }); });
|
|
|
|
+ deletions.forEach(function (node) { return getManageableStyles(node).forEach(function (style) { return removedStyles.add(style); }); });
|
|
|
|
+ moves.forEach(function (node) { return getManageableStyles(node).forEach(function (style) { return movedStyles.add(style); }); });
|
|
|
|
+ handleStyleOperations({ createdStyles: createdStyles, removedStyles: removedStyles, movedStyles: movedStyles });
|
|
|
|
+ additions.forEach(function (n) {
|
|
|
|
+ iterateShadowHosts(n, subscribeForShadowRootChanges);
|
|
|
|
+ collectUndefinedElements(n);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function handleHugeTreeMutations(root) {
|
|
|
|
+ var styles = new Set(getManageableStyles(root));
|
|
|
|
+ var createdStyles = new Set();
|
|
|
|
+ var removedStyles = new Set();
|
|
|
|
+ var movedStyles = new Set();
|
|
|
|
+ styles.forEach(function (s) {
|
|
|
|
+ if (!prevStyles.has(s)) {
|
|
|
|
+ createdStyles.add(s);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ prevStyles.forEach(function (s) {
|
|
|
|
+ if (!styles.has(s)) {
|
|
|
|
+ removedStyles.add(s);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ styles.forEach(function (s) {
|
|
|
|
+ if (!createdStyles.has(s) && !removedStyles.has(s) && didStylePositionChange(s)) {
|
|
|
|
+ movedStyles.add(s);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ handleStyleOperations({ createdStyles: createdStyles, removedStyles: removedStyles, movedStyles: movedStyles });
|
|
|
|
+ iterateShadowHosts(root, subscribeForShadowRootChanges);
|
|
|
|
+ collectUndefinedElements(root);
|
|
|
|
+ }
|
|
|
|
+ function handleAttributeMutations(mutations) {
|
|
|
|
+ var updatedStyles = new Set();
|
|
|
|
+ var removedStyles = new Set();
|
|
|
|
+ mutations.forEach(function (m) {
|
|
|
|
+ var target = m.target;
|
|
|
|
+ if (target.isConnected) {
|
|
|
|
+ if (shouldManageStyle(target)) {
|
|
|
|
+ updatedStyles.add(target);
|
|
|
|
+ }
|
|
|
|
+ else if (target instanceof HTMLLinkElement && target.disabled) {
|
|
|
|
+ removedStyles.add(target);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ if (updatedStyles.size + removedStyles.size > 0) {
|
|
|
|
+ update({
|
|
|
|
+ updated: Array.from(updatedStyles),
|
|
|
|
+ created: [],
|
|
|
|
+ removed: Array.from(removedStyles),
|
|
|
|
+ moved: [],
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function observe(root) {
|
|
|
|
+ var treeObserver = createOptimizedTreeObserver(root, {
|
|
|
|
+ onMinorMutations: handleMinorTreeMutations,
|
|
|
|
+ onHugeMutations: handleHugeTreeMutations,
|
|
|
|
+ });
|
|
|
|
+ var attrObserver = new MutationObserver(handleAttributeMutations);
|
|
|
|
+ attrObserver.observe(root, { attributes: true, attributeFilter: ['rel', 'disabled', 'media'], subtree: true });
|
|
|
|
+ observers.push(treeObserver, attrObserver);
|
|
|
|
+ observedRoots.add(root);
|
|
|
|
+ }
|
|
|
|
+ function subscribeForShadowRootChanges(node) {
|
|
|
|
+ var shadowRoot = node.shadowRoot;
|
|
|
|
+ if (shadowRoot == null || observedRoots.has(shadowRoot)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ observe(shadowRoot);
|
|
|
|
+ shadowRootDiscovered(shadowRoot);
|
|
|
|
+ }
|
|
|
|
+ observe(document);
|
|
|
|
+ iterateShadowHosts(document.documentElement, subscribeForShadowRootChanges);
|
|
|
|
+ watchWhenCustomElementsDefined(function (hosts) {
|
|
|
|
+ var newStyles = [];
|
|
|
|
+ hosts.forEach(function (host) { return push(newStyles, getManageableStyles(host.shadowRoot)); });
|
|
|
|
+ update({ created: newStyles, updated: [], removed: [], moved: [] });
|
|
|
|
+ hosts.forEach(function (host) {
|
|
|
|
+ var shadowRoot = host.shadowRoot;
|
|
|
|
+ if (shadowRoot == null) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ subscribeForShadowRootChanges(host);
|
|
|
|
+ iterateShadowHosts(shadowRoot, subscribeForShadowRootChanges);
|
|
|
|
+ collectUndefinedElements(shadowRoot);
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ document.addEventListener('__darkreader__isDefined', handleIsDefined);
|
|
|
|
+ collectUndefinedElements(document);
|
|
|
|
+ }
|
|
|
|
+ function resetObservers() {
|
|
|
|
+ observers.forEach(function (o) { return o.disconnect(); });
|
|
|
|
+ observers.splice(0, observers.length);
|
|
|
|
+ observedRoots = new WeakSet();
|
|
|
|
+ }
|
|
|
|
+ function stopWatchingForStyleChanges() {
|
|
|
|
+ resetObservers();
|
|
|
|
+ unsubscribeFromDefineCustomElements();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function hexify(number) {
|
|
|
|
+ return ((number < 16 ? '0' : '') + number.toString(16));
|
|
|
|
+ }
|
|
|
|
+ function generateUID() {
|
|
|
|
+ if ('randomUUID' in crypto) {
|
|
|
|
+ var uuid = crypto.randomUUID();
|
|
|
|
+ return uuid.substring(0, 8) + uuid.substring(9, 13) + uuid.substring(14, 18) + uuid.substring(19, 23) + uuid.substring(24);
|
|
|
|
+ }
|
|
|
|
+ return Array.from(crypto.getRandomValues(new Uint8Array(16))).map(function (x) { return hexify(x); }).join('');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var adoptedStyleOverrides = new WeakMap();
|
|
|
|
+ var overrideList = new WeakSet();
|
|
|
|
+ function createAdoptedStyleSheetOverride(node) {
|
|
|
|
+ var cancelAsyncOperations = false;
|
|
|
|
+ function injectSheet(sheet, override) {
|
|
|
|
+ var newSheets = __spreadArray([], __read(node.adoptedStyleSheets), false);
|
|
|
|
+ var sheetIndex = newSheets.indexOf(sheet);
|
|
|
|
+ var existingIndex = newSheets.indexOf(override);
|
|
|
|
+ if (sheetIndex === existingIndex - 1) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (existingIndex >= 0) {
|
|
|
|
+ newSheets.splice(existingIndex, 1);
|
|
|
|
+ }
|
|
|
|
+ newSheets.splice(sheetIndex + 1, 0, override);
|
|
|
|
+ node.adoptedStyleSheets = newSheets;
|
|
|
|
+ }
|
|
|
|
+ function destroy() {
|
|
|
|
+ cancelAsyncOperations = true;
|
|
|
|
+ var newSheets = __spreadArray([], __read(node.adoptedStyleSheets), false);
|
|
|
|
+ node.adoptedStyleSheets.forEach(function (adoptedStyleSheet) {
|
|
|
|
+ if (overrideList.has(adoptedStyleSheet)) {
|
|
|
|
+ var existingIndex = newSheets.indexOf(adoptedStyleSheet);
|
|
|
|
+ if (existingIndex >= 0) {
|
|
|
|
+ newSheets.splice(existingIndex, 1);
|
|
|
|
+ }
|
|
|
|
+ adoptedStyleOverrides.delete(adoptedStyleSheet);
|
|
|
|
+ overrideList.delete(adoptedStyleSheet);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ node.adoptedStyleSheets = newSheets;
|
|
|
|
+ }
|
|
|
|
+ function render(theme, ignoreImageAnalysis) {
|
|
|
|
+ node.adoptedStyleSheets.forEach(function (sheet) {
|
|
|
|
+ if (overrideList.has(sheet)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ var rules = sheet.rules;
|
|
|
|
+ var override = new CSSStyleSheet();
|
|
|
|
+ function prepareOverridesSheet() {
|
|
|
|
+ for (var i = override.cssRules.length - 1; i >= 0; i--) {
|
|
|
|
+ override.deleteRule(i);
|
|
|
|
+ }
|
|
|
|
+ injectSheet(sheet, override);
|
|
|
|
+ adoptedStyleOverrides.set(sheet, override);
|
|
|
|
+ overrideList.add(override);
|
|
|
|
+ return override;
|
|
|
|
+ }
|
|
|
|
+ var sheetModifier = createStyleSheetModifier();
|
|
|
|
+ sheetModifier.modifySheet({
|
|
|
|
+ prepareSheet: prepareOverridesSheet,
|
|
|
|
+ sourceCSSRules: rules,
|
|
|
|
+ theme: theme,
|
|
|
|
+ ignoreImageAnalysis: ignoreImageAnalysis,
|
|
|
|
+ force: false,
|
|
|
|
+ isAsyncCancelled: function () { return cancelAsyncOperations; },
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ return {
|
|
|
|
+ render: render,
|
|
|
|
+ destroy: destroy
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function injectProxy(enableStyleSheetsProxy) {
|
|
|
|
+ document.dispatchEvent(new CustomEvent('__darkreader__inlineScriptsAllowed'));
|
|
|
|
+ var addRuleDescriptor = Object.getOwnPropertyDescriptor(CSSStyleSheet.prototype, 'addRule');
|
|
|
|
+ var insertRuleDescriptor = Object.getOwnPropertyDescriptor(CSSStyleSheet.prototype, 'insertRule');
|
|
|
|
+ var deleteRuleDescriptor = Object.getOwnPropertyDescriptor(CSSStyleSheet.prototype, 'deleteRule');
|
|
|
|
+ var removeRuleDescriptor = Object.getOwnPropertyDescriptor(CSSStyleSheet.prototype, 'removeRule');
|
|
|
|
+ var documentStyleSheetsDescriptor = enableStyleSheetsProxy ?
|
|
|
|
+ Object.getOwnPropertyDescriptor(Document.prototype, 'styleSheets') : null;
|
|
|
|
+ var shouldWrapHTMLElement = [
|
|
|
|
+ 'baidu.com',
|
|
|
|
+ 'baike.baidu.com',
|
|
|
|
+ 'ditu.baidu.com',
|
|
|
|
+ 'map.baidu.com',
|
|
|
|
+ 'maps.baidu.com',
|
|
|
|
+ 'haokan.baidu.com',
|
|
|
|
+ 'pan.baidu.com',
|
|
|
|
+ 'passport.baidu.com',
|
|
|
|
+ 'tieba.baidu.com',
|
|
|
|
+ 'www.baidu.com'
|
|
|
|
+ ].includes(location.hostname);
|
|
|
|
+ var getElementsByTagNameDescriptor = shouldWrapHTMLElement ?
|
|
|
|
+ Object.getOwnPropertyDescriptor(Element.prototype, 'getElementsByTagName') : null;
|
|
|
|
+ var cleanUp = function () {
|
|
|
|
+ Object.defineProperty(CSSStyleSheet.prototype, 'addRule', addRuleDescriptor);
|
|
|
|
+ Object.defineProperty(CSSStyleSheet.prototype, 'insertRule', insertRuleDescriptor);
|
|
|
|
+ Object.defineProperty(CSSStyleSheet.prototype, 'deleteRule', deleteRuleDescriptor);
|
|
|
|
+ Object.defineProperty(CSSStyleSheet.prototype, 'removeRule', removeRuleDescriptor);
|
|
|
|
+ document.removeEventListener('__darkreader__cleanUp', cleanUp);
|
|
|
|
+ document.removeEventListener('__darkreader__addUndefinedResolver', addUndefinedResolver);
|
|
|
|
+ if (enableStyleSheetsProxy) {
|
|
|
|
+ Object.defineProperty(Document.prototype, 'styleSheets', documentStyleSheetsDescriptor);
|
|
|
|
+ }
|
|
|
|
+ if (shouldWrapHTMLElement) {
|
|
|
|
+ Object.defineProperty(Element.prototype, 'getElementsByTagName', getElementsByTagNameDescriptor);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ var addUndefinedResolver = function (e) {
|
|
|
|
+ customElements.whenDefined(e.detail.tag).then(function () {
|
|
|
|
+ document.dispatchEvent(new CustomEvent('__darkreader__isDefined', { detail: { tag: e.detail.tag } }));
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ document.addEventListener('__darkreader__cleanUp', cleanUp);
|
|
|
|
+ document.addEventListener('__darkreader__addUndefinedResolver', addUndefinedResolver);
|
|
|
|
+ var updateSheetEvent = new Event('__darkreader__updateSheet');
|
|
|
|
+ function proxyAddRule(selector, style, index) {
|
|
|
|
+ addRuleDescriptor.value.call(this, selector, style, index);
|
|
|
|
+ if (this.ownerNode && !this.ownerNode.classList.contains('darkreader')) {
|
|
|
|
+ this.ownerNode.dispatchEvent(updateSheetEvent);
|
|
|
|
+ }
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ function proxyInsertRule(rule, index) {
|
|
|
|
+ var returnValue = insertRuleDescriptor.value.call(this, rule, index);
|
|
|
|
+ if (this.ownerNode && !this.ownerNode.classList.contains('darkreader')) {
|
|
|
|
+ this.ownerNode.dispatchEvent(updateSheetEvent);
|
|
|
|
+ }
|
|
|
|
+ return returnValue;
|
|
|
|
+ }
|
|
|
|
+ function proxyDeleteRule(index) {
|
|
|
|
+ deleteRuleDescriptor.value.call(this, index);
|
|
|
|
+ if (this.ownerNode && !this.ownerNode.classList.contains('darkreader')) {
|
|
|
|
+ this.ownerNode.dispatchEvent(updateSheetEvent);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function proxyRemoveRule(index) {
|
|
|
|
+ removeRuleDescriptor.value.call(this, index);
|
|
|
|
+ if (this.ownerNode && !this.ownerNode.classList.contains('darkreader')) {
|
|
|
|
+ this.ownerNode.dispatchEvent(updateSheetEvent);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function proxyDocumentStyleSheets() {
|
|
|
|
+ var _this = this;
|
|
|
|
+ var getCurrentValue = function () {
|
|
|
|
+ var docSheets = documentStyleSheetsDescriptor.get.call(_this);
|
|
|
|
+ var filteredSheets = __spreadArray([], __read(docSheets), false).filter(function (styleSheet) {
|
|
|
|
+ return !styleSheet.ownerNode.classList.contains('darkreader');
|
|
|
|
+ });
|
|
|
|
+ filteredSheets.item = function (item) {
|
|
|
|
+ return filteredSheets[item];
|
|
|
|
+ };
|
|
|
|
+ return Object.setPrototypeOf(filteredSheets, StyleSheetList.prototype);
|
|
|
|
+ };
|
|
|
|
+ var elements = getCurrentValue();
|
|
|
|
+ var styleSheetListBehavior = {
|
|
|
|
+ get: function (_, property) {
|
|
|
|
+ return getCurrentValue()[property];
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ elements = new Proxy(elements, styleSheetListBehavior);
|
|
|
|
+ return elements;
|
|
|
|
+ }
|
|
|
|
+ function proxyGetElementsByTagName(tagName) {
|
|
|
|
+ var _this = this;
|
|
|
|
+ if (tagName !== 'style') {
|
|
|
|
+ return getElementsByTagNameDescriptor.value.call(this, tagName);
|
|
|
|
+ }
|
|
|
|
+ var getCurrentElementValue = function () {
|
|
|
|
+ var elements = getElementsByTagNameDescriptor.value.call(_this, tagName);
|
|
|
|
+ return Object.setPrototypeOf(__spreadArray([], __read(elements), false).filter(function (element) {
|
|
|
|
+ return !element.classList.contains('darkreader');
|
|
|
|
+ }), NodeList.prototype);
|
|
|
|
+ };
|
|
|
|
+ var elements = getCurrentElementValue();
|
|
|
|
+ var nodeListBehavior = {
|
|
|
|
+ get: function (_, property) {
|
|
|
|
+ return getCurrentElementValue()[Number(property) || property];
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ elements = new Proxy(elements, nodeListBehavior);
|
|
|
|
+ return elements;
|
|
|
|
+ }
|
|
|
|
+ Object.defineProperty(CSSStyleSheet.prototype, 'addRule', Object.assign({}, addRuleDescriptor, { value: proxyAddRule }));
|
|
|
|
+ Object.defineProperty(CSSStyleSheet.prototype, 'insertRule', Object.assign({}, insertRuleDescriptor, { value: proxyInsertRule }));
|
|
|
|
+ Object.defineProperty(CSSStyleSheet.prototype, 'deleteRule', Object.assign({}, deleteRuleDescriptor, { value: proxyDeleteRule }));
|
|
|
|
+ Object.defineProperty(CSSStyleSheet.prototype, 'removeRule', Object.assign({}, removeRuleDescriptor, { value: proxyRemoveRule }));
|
|
|
|
+ if (enableStyleSheetsProxy) {
|
|
|
|
+ Object.defineProperty(Document.prototype, 'styleSheets', Object.assign({}, documentStyleSheetsDescriptor, { get: proxyDocumentStyleSheets }));
|
|
|
|
+ }
|
|
|
|
+ if (shouldWrapHTMLElement) {
|
|
|
|
+ Object.defineProperty(Element.prototype, 'getElementsByTagName', Object.assign({}, getElementsByTagNameDescriptor, { value: proxyGetElementsByTagName }));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var INSTANCE_ID = generateUID();
|
|
|
|
+ var styleManagers = new Map();
|
|
|
|
+ var adoptedStyleManagers = [];
|
|
|
|
+ var filter = null;
|
|
|
|
+ var fixes = null;
|
|
|
|
+ var isIFrame$1 = null;
|
|
|
|
+ var ignoredImageAnalysisSelectors = null;
|
|
|
|
+ var ignoredInlineSelectors = null;
|
|
|
|
+ function createOrUpdateStyle(className, root) {
|
|
|
|
+ if (root === void 0) { root = document.head || document; }
|
|
|
|
+ var element = root.querySelector(".".concat(className));
|
|
|
|
+ if (!element) {
|
|
|
|
+ element = document.createElement('style');
|
|
|
|
+ element.classList.add('darkreader');
|
|
|
|
+ element.classList.add(className);
|
|
|
|
+ element.media = 'screen';
|
|
|
|
+ element.textContent = '';
|
|
|
|
+ }
|
|
|
|
+ return element;
|
|
|
|
+ }
|
|
|
|
+ function createOrUpdateScript(className, root) {
|
|
|
|
+ if (root === void 0) { root = document.head || document; }
|
|
|
|
+ var element = root.querySelector(".".concat(className));
|
|
|
|
+ if (!element) {
|
|
|
|
+ element = document.createElement('script');
|
|
|
|
+ element.classList.add('darkreader');
|
|
|
|
+ element.classList.add(className);
|
|
|
|
+ }
|
|
|
|
+ return element;
|
|
|
|
+ }
|
|
|
|
+ var nodePositionWatchers = new Map();
|
|
|
|
+ function setupNodePositionWatcher(node, alias) {
|
|
|
|
+ nodePositionWatchers.has(alias) && nodePositionWatchers.get(alias).stop();
|
|
|
|
+ nodePositionWatchers.set(alias, watchForNodePosition(node, 'parent'));
|
|
|
|
+ }
|
|
|
|
+ function stopStylePositionWatchers() {
|
|
|
|
+ forEach(nodePositionWatchers.values(), function (watcher) { return watcher.stop(); });
|
|
|
|
+ nodePositionWatchers.clear();
|
|
|
|
+ }
|
|
|
|
+ function createStaticStyleOverrides() {
|
|
|
|
+ var fallbackStyle = createOrUpdateStyle('darkreader--fallback', document);
|
|
|
|
+ fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: true });
|
|
|
|
+ document.head.insertBefore(fallbackStyle, document.head.firstChild);
|
|
|
|
+ setupNodePositionWatcher(fallbackStyle, 'fallback');
|
|
|
|
+ var userAgentStyle = createOrUpdateStyle('darkreader--user-agent');
|
|
|
|
+ userAgentStyle.textContent = getModifiedUserAgentStyle(filter, isIFrame$1, filter.styleSystemControls);
|
|
|
|
+ document.head.insertBefore(userAgentStyle, fallbackStyle.nextSibling);
|
|
|
|
+ setupNodePositionWatcher(userAgentStyle, 'user-agent');
|
|
|
|
+ var textStyle = createOrUpdateStyle('darkreader--text');
|
|
|
|
+ if (filter.useFont || filter.textStroke > 0) {
|
|
|
|
+ textStyle.textContent = createTextStyle(filter);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ textStyle.textContent = '';
|
|
|
|
+ }
|
|
|
|
+ document.head.insertBefore(textStyle, fallbackStyle.nextSibling);
|
|
|
|
+ setupNodePositionWatcher(textStyle, 'text');
|
|
|
|
+ var invertStyle = createOrUpdateStyle('darkreader--invert');
|
|
|
|
+ if (fixes && Array.isArray(fixes.invert) && fixes.invert.length > 0) {
|
|
|
|
+ invertStyle.textContent = [
|
|
|
|
+ "".concat(fixes.invert.join(', '), " {"),
|
|
|
|
+ " filter: ".concat(getCSSFilterValue(__assign(__assign({}, filter), { contrast: filter.mode === 0 ? filter.contrast : clamp(filter.contrast - 10, 0, 100) })), " !important;"),
|
|
|
|
+ '}',
|
|
|
|
+ ].join('\n');
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ invertStyle.textContent = '';
|
|
|
|
+ }
|
|
|
|
+ document.head.insertBefore(invertStyle, textStyle.nextSibling);
|
|
|
|
+ setupNodePositionWatcher(invertStyle, 'invert');
|
|
|
|
+ var inlineStyle = createOrUpdateStyle('darkreader--inline');
|
|
|
|
+ inlineStyle.textContent = getInlineOverrideStyle();
|
|
|
|
+ document.head.insertBefore(inlineStyle, invertStyle.nextSibling);
|
|
|
|
+ setupNodePositionWatcher(inlineStyle, 'inline');
|
|
|
|
+ var overrideStyle = createOrUpdateStyle('darkreader--override');
|
|
|
|
+ overrideStyle.textContent = fixes && fixes.css ? replaceCSSTemplates(fixes.css) : '';
|
|
|
|
+ document.head.appendChild(overrideStyle);
|
|
|
|
+ setupNodePositionWatcher(overrideStyle, 'override');
|
|
|
|
+ var variableStyle = createOrUpdateStyle('darkreader--variables');
|
|
|
|
+ var selectionColors = getSelectionColor(filter);
|
|
|
|
+ var darkSchemeBackgroundColor = filter.darkSchemeBackgroundColor, darkSchemeTextColor = filter.darkSchemeTextColor, lightSchemeBackgroundColor = filter.lightSchemeBackgroundColor, lightSchemeTextColor = filter.lightSchemeTextColor, mode = filter.mode;
|
|
|
|
+ var schemeBackgroundColor = mode === 0 ? lightSchemeBackgroundColor : darkSchemeBackgroundColor;
|
|
|
|
+ var schemeTextColor = mode === 0 ? lightSchemeTextColor : darkSchemeTextColor;
|
|
|
|
+ schemeBackgroundColor = modifyBackgroundColor(parse(schemeBackgroundColor), filter);
|
|
|
|
+ schemeTextColor = modifyForegroundColor(parse(schemeTextColor), filter);
|
|
|
|
+ variableStyle.textContent = [
|
|
|
|
+ ":root {",
|
|
|
|
+ " --darkreader-neutral-background: ".concat(schemeBackgroundColor, ";"),
|
|
|
|
+ " --darkreader-neutral-text: ".concat(schemeTextColor, ";"),
|
|
|
|
+ " --darkreader-selection-background: ".concat(selectionColors.backgroundColorSelection, ";"),
|
|
|
|
+ " --darkreader-selection-text: ".concat(selectionColors.foregroundColorSelection, ";"),
|
|
|
|
+ "}"
|
|
|
|
+ ].join('\n');
|
|
|
|
+ document.head.insertBefore(variableStyle, inlineStyle.nextSibling);
|
|
|
|
+ setupNodePositionWatcher(variableStyle, 'variables');
|
|
|
|
+ var rootVarsStyle = createOrUpdateStyle('darkreader--root-vars');
|
|
|
|
+ document.head.insertBefore(rootVarsStyle, variableStyle.nextSibling);
|
|
|
|
+ var proxyScript = createOrUpdateScript('darkreader--proxy');
|
|
|
|
+ proxyScript.append("(".concat(injectProxy, ")(!").concat(fixes && fixes.disableStyleSheetsProxy, ")"));
|
|
|
|
+ document.head.insertBefore(proxyScript, rootVarsStyle.nextSibling);
|
|
|
|
+ proxyScript.remove();
|
|
|
|
+ }
|
|
|
|
+ var shadowRootsWithOverrides = new Set();
|
|
|
|
+ function createShadowStaticStyleOverrides(root) {
|
|
|
|
+ var inlineStyle = createOrUpdateStyle('darkreader--inline', root);
|
|
|
|
+ inlineStyle.textContent = getInlineOverrideStyle();
|
|
|
|
+ root.insertBefore(inlineStyle, root.firstChild);
|
|
|
|
+ var overrideStyle = createOrUpdateStyle('darkreader--override', root);
|
|
|
|
+ overrideStyle.textContent = fixes && fixes.css ? replaceCSSTemplates(fixes.css) : '';
|
|
|
|
+ root.insertBefore(overrideStyle, inlineStyle.nextSibling);
|
|
|
|
+ var invertStyle = createOrUpdateStyle('darkreader--invert', root);
|
|
|
|
+ if (fixes && Array.isArray(fixes.invert) && fixes.invert.length > 0) {
|
|
|
|
+ invertStyle.textContent = [
|
|
|
|
+ "".concat(fixes.invert.join(', '), " {"),
|
|
|
|
+ " filter: ".concat(getCSSFilterValue(__assign(__assign({}, filter), { contrast: filter.mode === 0 ? filter.contrast : clamp(filter.contrast - 10, 0, 100) })), " !important;"),
|
|
|
|
+ '}',
|
|
|
|
+ ].join('\n');
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ invertStyle.textContent = '';
|
|
|
|
+ }
|
|
|
|
+ root.insertBefore(invertStyle, overrideStyle.nextSibling);
|
|
|
|
+ shadowRootsWithOverrides.add(root);
|
|
|
|
+ }
|
|
|
|
+ function replaceCSSTemplates($cssText) {
|
|
|
|
+ return $cssText.replace(/\${(.+?)}/g, function (_, $color) {
|
|
|
|
+ var color = tryParseColor($color);
|
|
|
|
+ if (color) {
|
|
|
|
+ return modifyColor(color, filter);
|
|
|
|
+ }
|
|
|
|
+ logWarn("Couldn't parse CSSTemplate's color.");
|
|
|
|
+ return $color;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ function cleanFallbackStyle() {
|
|
|
|
+ var fallback = document.querySelector('.darkreader--fallback');
|
|
|
|
+ if (fallback) {
|
|
|
|
+ fallback.textContent = '';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function createDynamicStyleOverrides() {
|
|
|
|
+ cancelRendering();
|
|
|
|
+ var allStyles = getManageableStyles(document);
|
|
|
|
+ var newManagers = allStyles
|
|
|
|
+ .filter(function (style) { return !styleManagers.has(style); })
|
|
|
|
+ .map(function (style) { return createManager(style); });
|
|
|
|
+ newManagers
|
|
|
|
+ .map(function (manager) { return manager.details({ secondRound: false }); })
|
|
|
|
+ .filter(function (detail) { return detail && detail.rules.length > 0; })
|
|
|
|
+ .forEach(function (detail) {
|
|
|
|
+ variablesStore.addRulesForMatching(detail.rules);
|
|
|
|
+ });
|
|
|
|
+ variablesStore.matchVariablesAndDependants();
|
|
|
|
+ variablesStore.setOnRootVariableChange(function () {
|
|
|
|
+ variablesStore.putRootVars(document.head.querySelector('.darkreader--root-vars'), filter);
|
|
|
|
+ });
|
|
|
|
+ variablesStore.putRootVars(document.head.querySelector('.darkreader--root-vars'), filter);
|
|
|
|
+ styleManagers.forEach(function (manager) { return manager.render(filter, ignoredImageAnalysisSelectors); });
|
|
|
|
+ if (loadingStyles.size === 0) {
|
|
|
|
+ cleanFallbackStyle();
|
|
|
|
+ }
|
|
|
|
+ newManagers.forEach(function (manager) { return manager.watch(); });
|
|
|
|
+ var inlineStyleElements = toArray(document.querySelectorAll(INLINE_STYLE_SELECTOR));
|
|
|
|
+ iterateShadowHosts(document.documentElement, function (host) {
|
|
|
|
+ createShadowStaticStyleOverrides(host.shadowRoot);
|
|
|
|
+ var elements = host.shadowRoot.querySelectorAll(INLINE_STYLE_SELECTOR);
|
|
|
|
+ if (elements.length > 0) {
|
|
|
|
+ push(inlineStyleElements, elements);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ inlineStyleElements.forEach(function (el) { return overrideInlineStyle(el, filter, ignoredInlineSelectors, ignoredImageAnalysisSelectors); });
|
|
|
|
+ handleAdoptedStyleSheets(document);
|
|
|
|
+ }
|
|
|
|
+ var loadingStylesCounter = 0;
|
|
|
|
+ var loadingStyles = new Set();
|
|
|
|
+ function createManager(element) {
|
|
|
|
+ var loadingStyleId = ++loadingStylesCounter;
|
|
|
|
+ logInfo("New manager for element, with loadingStyleID ".concat(loadingStyleId), element);
|
|
|
|
+ function loadingStart() {
|
|
|
|
+ if (!isDOMReady() || !didDocumentShowUp) {
|
|
|
|
+ loadingStyles.add(loadingStyleId);
|
|
|
|
+ logInfo("Current amount of styles loading: ".concat(loadingStyles.size));
|
|
|
|
+ var fallbackStyle = document.querySelector('.darkreader--fallback');
|
|
|
|
+ if (!fallbackStyle.textContent) {
|
|
|
|
+ fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: false });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function loadingEnd() {
|
|
|
|
+ loadingStyles.delete(loadingStyleId);
|
|
|
|
+ logInfo("Removed loadingStyle ".concat(loadingStyleId, ", now awaiting: ").concat(loadingStyles.size));
|
|
|
|
+ logInfo("To-do to be loaded", loadingStyles);
|
|
|
|
+ if (loadingStyles.size === 0 && isDOMReady()) {
|
|
|
|
+ cleanFallbackStyle();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function update() {
|
|
|
|
+ var details = manager.details({ secondRound: true });
|
|
|
|
+ if (!details) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ variablesStore.addRulesForMatching(details.rules);
|
|
|
|
+ variablesStore.matchVariablesAndDependants();
|
|
|
|
+ manager.render(filter, ignoredImageAnalysisSelectors);
|
|
|
|
+ }
|
|
|
|
+ var manager = manageStyle(element, { update: update, loadingStart: loadingStart, loadingEnd: loadingEnd });
|
|
|
|
+ styleManagers.set(element, manager);
|
|
|
|
+ return manager;
|
|
|
|
+ }
|
|
|
|
+ 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, ignoredImageAnalysisSelectors); });
|
|
|
|
+ adoptedStyleManagers.forEach(function (manager) { return manager.render(filter, ignoredImageAnalysisSelectors); });
|
|
|
|
+ callback && callback();
|
|
|
|
+ });
|
|
|
|
+ var cancelRendering = function () {
|
|
|
|
+ throttledRenderAllStyles.cancel();
|
|
|
|
+ };
|
|
|
|
+ function onDOMReady() {
|
|
|
|
+ if (loadingStyles.size === 0) {
|
|
|
|
+ cleanFallbackStyle();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ logWarn("DOM is ready, but still have styles being loaded.", loadingStyles);
|
|
|
|
+ }
|
|
|
|
+ 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 && !filter.immediateModify) {
|
|
|
|
+ watchForDocumentVisibility(runDynamicStyle);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ runDynamicStyle();
|
|
|
|
+ }
|
|
|
|
+ changeMetaThemeColorWhenAvailable(filter);
|
|
|
|
+ }
|
|
|
|
+ function handleAdoptedStyleSheets(node) {
|
|
|
|
+ try {
|
|
|
|
+ if (Array.isArray(node.adoptedStyleSheets)) {
|
|
|
|
+ if (node.adoptedStyleSheets.length > 0) {
|
|
|
|
+ var newManger = createAdoptedStyleSheetOverride(node);
|
|
|
|
+ adoptedStyleManagers.push(newManger);
|
|
|
|
+ newManger.render(filter, ignoredImageAnalysisSelectors);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ catch (err) {
|
|
|
|
+ logWarn('Error occured in handleAdoptedStyleSheets: ', err);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function watchForUpdates() {
|
|
|
|
+ var managedStyles = Array.from(styleManagers.keys());
|
|
|
|
+ watchForStyleChanges(managedStyles, function (_a) {
|
|
|
|
+ var created = _a.created, updated = _a.updated, removed = _a.removed, moved = _a.moved;
|
|
|
|
+ var stylesToRemove = removed;
|
|
|
|
+ var stylesToManage = created.concat(updated).concat(moved)
|
|
|
|
+ .filter(function (style) { return !styleManagers.has(style); });
|
|
|
|
+ var stylesToRestore = moved
|
|
|
|
+ .filter(function (style) { return styleManagers.has(style); });
|
|
|
|
+ logInfo("Styles to be removed:", stylesToRemove);
|
|
|
|
+ stylesToRemove.forEach(function (style) { return removeManager(style); });
|
|
|
|
+ var newManagers = stylesToManage
|
|
|
|
+ .map(function (style) { return createManager(style); });
|
|
|
|
+ newManagers
|
|
|
|
+ .map(function (manager) { return manager.details({ secondRound: false }); })
|
|
|
|
+ .filter(function (detail) { return detail && detail.rules.length > 0; })
|
|
|
|
+ .forEach(function (detail) {
|
|
|
|
+ variablesStore.addRulesForMatching(detail.rules);
|
|
|
|
+ });
|
|
|
|
+ variablesStore.matchVariablesAndDependants();
|
|
|
|
+ newManagers.forEach(function (manager) { return manager.render(filter, ignoredImageAnalysisSelectors); });
|
|
|
|
+ newManagers.forEach(function (manager) { return manager.watch(); });
|
|
|
|
+ stylesToRestore.forEach(function (style) { return styleManagers.get(style).restore(); });
|
|
|
|
+ }, function (shadowRoot) {
|
|
|
|
+ createShadowStaticStyleOverrides(shadowRoot);
|
|
|
|
+ handleAdoptedStyleSheets(shadowRoot);
|
|
|
|
+ });
|
|
|
|
+ watchForInlineStyles(function (element) {
|
|
|
|
+ overrideInlineStyle(element, filter, ignoredInlineSelectors, ignoredImageAnalysisSelectors);
|
|
|
|
+ if (element === document.documentElement) {
|
|
|
|
+ var styleAttr = element.getAttribute('style') || '';
|
|
|
|
+ if (styleAttr.includes('--')) {
|
|
|
|
+ variablesStore.matchVariablesAndDependants();
|
|
|
|
+ variablesStore.putRootVars(document.head.querySelector('.darkreader--root-vars'), filter);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }, function (root) {
|
|
|
|
+ createShadowStaticStyleOverrides(root);
|
|
|
|
+ var inlineStyleElements = root.querySelectorAll(INLINE_STYLE_SELECTOR);
|
|
|
|
+ if (inlineStyleElements.length > 0) {
|
|
|
|
+ forEach(inlineStyleElements, function (el) { return overrideInlineStyle(el, filter, ignoredInlineSelectors, ignoredImageAnalysisSelectors); });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ addDOMReadyListener(onDOMReady);
|
|
|
|
+ }
|
|
|
|
+ function stopWatchingForUpdates() {
|
|
|
|
+ styleManagers.forEach(function (manager) { return manager.pause(); });
|
|
|
|
+ stopStylePositionWatchers();
|
|
|
|
+ stopWatchingForStyleChanges();
|
|
|
|
+ stopWatchingForInlineStyles();
|
|
|
|
+ removeDOMReadyListener(onDOMReady);
|
|
|
|
+ cleanReadyStateCompleteListeners();
|
|
|
|
+ }
|
|
|
|
+ function createDarkReaderInstanceMarker() {
|
|
|
|
+ var metaElement = document.createElement('meta');
|
|
|
|
+ metaElement.name = 'darkreader';
|
|
|
|
+ metaElement.content = INSTANCE_ID;
|
|
|
|
+ document.head.appendChild(metaElement);
|
|
|
|
+ }
|
|
|
|
+ function isAnotherDarkReaderInstanceActive() {
|
|
|
|
+ var meta = document.querySelector('meta[name="darkreader"]');
|
|
|
|
+ if (meta) {
|
|
|
|
+ if (meta.content !== INSTANCE_ID) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ createDarkReaderInstanceMarker();
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ function createOrUpdateDynamicTheme(filterConfig, dynamicThemeFixes, iframe) {
|
|
|
|
+ filter = filterConfig;
|
|
|
|
+ fixes = dynamicThemeFixes;
|
|
|
|
+ if (fixes) {
|
|
|
|
+ ignoredImageAnalysisSelectors = Array.isArray(fixes.ignoreImageAnalysis) ? fixes.ignoreImageAnalysis : [];
|
|
|
|
+ ignoredInlineSelectors = Array.isArray(fixes.ignoreInlineStyle) ? fixes.ignoreInlineStyle : [];
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ ignoredImageAnalysisSelectors = [];
|
|
|
|
+ ignoredInlineSelectors = [];
|
|
|
|
+ }
|
|
|
|
+ if (filter.immediateModify) {
|
|
|
|
+ setIsDOMReady(function () {
|
|
|
|
+ return true;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ isIFrame$1 = iframe;
|
|
|
|
+ if (document.head) {
|
|
|
|
+ if (isAnotherDarkReaderInstanceActive()) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ document.documentElement.setAttribute('data-darkreader-mode', 'dynamic');
|
|
|
|
+ document.documentElement.setAttribute('data-darkreader-scheme', filter.mode ? 'dark' : 'dimmed');
|
|
|
|
+ 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();
|
|
|
|
+ if (isAnotherDarkReaderInstanceActive()) {
|
|
|
|
+ removeDynamicTheme();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ createThemeAndWatchForUpdates();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ headObserver_1.observe(document, { childList: true, subtree: true });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function removeProxy() {
|
|
|
|
+ document.dispatchEvent(new CustomEvent('__darkreader__cleanUp'));
|
|
|
|
+ removeNode(document.head.querySelector('.darkreader--proxy'));
|
|
|
|
+ }
|
|
|
|
+ function removeDynamicTheme() {
|
|
|
|
+ document.documentElement.removeAttribute("data-darkreader-mode");
|
|
|
|
+ document.documentElement.removeAttribute("data-darkreader-scheme");
|
|
|
|
+ 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'));
|
|
|
|
+ removeNode(document.head.querySelector('.darkreader--variables'));
|
|
|
|
+ removeNode(document.head.querySelector('.darkreader--root-vars'));
|
|
|
|
+ removeNode(document.head.querySelector('meta[name="darkreader"]'));
|
|
|
|
+ removeProxy();
|
|
|
|
+ }
|
|
|
|
+ shadowRootsWithOverrides.forEach(function (root) {
|
|
|
|
+ removeNode(root.querySelector('.darkreader--inline'));
|
|
|
|
+ removeNode(root.querySelector('.darkreader--override'));
|
|
|
|
+ });
|
|
|
|
+ shadowRootsWithOverrides.clear();
|
|
|
|
+ forEach(styleManagers.keys(), function (el) { return removeManager(el); });
|
|
|
|
+ loadingStyles.clear();
|
|
|
|
+ cleanLoadingLinks();
|
|
|
|
+ forEach(document.querySelectorAll('.darkreader'), removeNode);
|
|
|
|
+ adoptedStyleManagers.forEach(function (manager) {
|
|
|
|
+ manager.destroy();
|
|
|
|
+ });
|
|
|
|
+ adoptedStyleManagers.splice(0);
|
|
|
|
+ }
|
|
|
|
+ function cleanDynamicThemeCache() {
|
|
|
|
+ variablesStore.clear();
|
|
|
|
+ parsedURLCache.clear();
|
|
|
|
+ stopWatchingForDocumentVisibility();
|
|
|
|
+ cancelRendering();
|
|
|
|
+ stopWatchingForUpdates();
|
|
|
|
+ cleanModificationCache();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var blobRegex = /url\(\"(blob\:.*?)\"\)/g;
|
|
|
|
+ function replaceBlobs(text) {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ var promises, data;
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ switch (_a.label) {
|
|
|
|
+ case 0:
|
|
|
|
+ promises = [];
|
|
|
|
+ getMatches(blobRegex, text, 1).forEach(function (url) {
|
|
|
|
+ var promise = loadAsDataURL(url);
|
|
|
|
+ promises.push(promise);
|
|
|
|
+ });
|
|
|
|
+ return [4, Promise.all(promises)];
|
|
|
|
+ case 1:
|
|
|
|
+ data = _a.sent();
|
|
|
|
+ return [2, text.replace(blobRegex, function () { return "url(\"".concat(data.shift(), "\")"); })];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ var banner = "/*\n _______\n / \\\n .==. .==.\n (( ))==(( ))\n / \"==\" \"==\"\\\n /____|| || ||___\\\n ________ ____ ________ ___ ___\n | ___ \\ / \\ | ___ \\ | | / /\n | | \\ \\ / /\\ \\ | | \\ \\| |_/ /\n | | ) / /__\\ \\ | |__/ /| ___ \\\n | |__/ / ______ \\| ____ \\| | \\ \\\n_______|_______/__/ ____ \\__\\__|___\\__\\__|___\\__\\____\n| ___ \\ | ____/ / \\ | ___ \\ | ____| ___ \\\n| | \\ \\| |___ / /\\ \\ | | \\ \\| |___| | \\ \\\n| |__/ /| ____/ /__\\ \\ | | ) | ____| |__/ /\n| ____ \\| |__/ ______ \\| |__/ /| |___| ____ \\\n|__| \\__\\____/__/ \\__\\_______/ |______|__| \\__\\\n https://darkreader.org\n*/\n\n/*! Dark reader generated CSS | Licensed under MIT https://github.com/darkreader/darkreader/blob/master/LICENSE */\n";
|
|
|
|
+ function collectCSS() {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ function addStaticCSS(selector, comment) {
|
|
|
|
+ var staticStyle = document.querySelector(selector);
|
|
|
|
+ if (staticStyle && staticStyle.textContent) {
|
|
|
|
+ css.push("/* ".concat(comment, " */"));
|
|
|
|
+ css.push(staticStyle.textContent);
|
|
|
|
+ css.push('');
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ var css, modifiedCSS, formattedCSS, _a, _b;
|
|
|
|
+ return __generator(this, function (_c) {
|
|
|
|
+ switch (_c.label) {
|
|
|
|
+ case 0:
|
|
|
|
+ css = [banner];
|
|
|
|
+ addStaticCSS('.darkreader--fallback', 'Fallback Style');
|
|
|
|
+ addStaticCSS('.darkreader--user-agent', 'User-Agent Style');
|
|
|
|
+ addStaticCSS('.darkreader--text', 'Text Style');
|
|
|
|
+ addStaticCSS('.darkreader--invert', 'Invert Style');
|
|
|
|
+ addStaticCSS('.darkreader--variables', 'Variables Style');
|
|
|
|
+ modifiedCSS = [];
|
|
|
|
+ document.querySelectorAll('.darkreader--sync').forEach(function (element) {
|
|
|
|
+ forEach(element.sheet.cssRules, function (rule) {
|
|
|
|
+ rule && rule.cssText && modifiedCSS.push(rule.cssText);
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ if (!modifiedCSS.length) return [3, 2];
|
|
|
|
+ formattedCSS = formatCSS(modifiedCSS.join('\n'));
|
|
|
|
+ css.push('/* Modified CSS */');
|
|
|
|
+ _b = (_a = css).push;
|
|
|
|
+ return [4, replaceBlobs(formattedCSS)];
|
|
|
|
+ case 1:
|
|
|
|
+ _b.apply(_a, [_c.sent()]);
|
|
|
|
+ css.push('');
|
|
|
|
+ _c.label = 2;
|
|
|
|
+ case 2:
|
|
|
|
+ addStaticCSS('.darkreader--override', 'Override Style');
|
|
|
|
+ return [2, css.join('\n')];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var isDarkReaderEnabled = false;
|
|
|
|
+ var isIFrame = (function () {
|
|
|
|
+ try {
|
|
|
|
+ return window.self !== window.top;
|
|
|
|
+ }
|
|
|
|
+ catch (err) {
|
|
|
|
+ console.warn(err);
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ })();
|
|
|
|
+ function enable(themeOptions, fixes) {
|
|
|
|
+ if (themeOptions === void 0) { themeOptions = {}; }
|
|
|
|
+ if (fixes === void 0) { fixes = null; }
|
|
|
|
+ var theme = __assign(__assign({}, DEFAULT_THEME), themeOptions);
|
|
|
|
+ if (theme.engine !== ThemeEngines.dynamicTheme) {
|
|
|
|
+ throw new Error('Theme engine is not supported.');
|
|
|
|
+ }
|
|
|
|
+ createOrUpdateDynamicTheme(theme, fixes, isIFrame);
|
|
|
|
+ isDarkReaderEnabled = true;
|
|
|
|
+ }
|
|
|
|
+ function isEnabled() {
|
|
|
|
+ return isDarkReaderEnabled;
|
|
|
|
+ }
|
|
|
|
+ function disable() {
|
|
|
|
+ removeDynamicTheme();
|
|
|
|
+ isDarkReaderEnabled = false;
|
|
|
|
+ }
|
|
|
|
+ var darkScheme = matchMedia('(prefers-color-scheme: dark)');
|
|
|
|
+ var store = {
|
|
|
|
+ themeOptions: null,
|
|
|
|
+ fixes: null,
|
|
|
|
+ };
|
|
|
|
+ function handleColorScheme() {
|
|
|
|
+ if (darkScheme.matches) {
|
|
|
|
+ enable(store.themeOptions, store.fixes);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ disable();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function auto(themeOptions, fixes) {
|
|
|
|
+ if (themeOptions === void 0) { themeOptions = {}; }
|
|
|
|
+ if (fixes === void 0) { fixes = null; }
|
|
|
|
+ if (themeOptions) {
|
|
|
|
+ store = { themeOptions: themeOptions, fixes: fixes };
|
|
|
|
+ handleColorScheme();
|
|
|
|
+ if (isMatchMediaChangeEventListenerSupported) {
|
|
|
|
+ darkScheme.addEventListener('change', handleColorScheme);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ darkScheme.addListener(handleColorScheme);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ if (isMatchMediaChangeEventListenerSupported) {
|
|
|
|
+ darkScheme.removeEventListener('change', handleColorScheme);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ darkScheme.removeListener(handleColorScheme);
|
|
|
|
+ }
|
|
|
|
+ disable();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ function exportGeneratedCSS() {
|
|
|
|
+ return __awaiter(this, void 0, void 0, function () {
|
|
|
|
+ return __generator(this, function (_a) {
|
|
|
|
+ switch (_a.label) {
|
|
|
|
+ case 0: return [4, collectCSS()];
|
|
|
|
+ case 1: return [2, _a.sent()];
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ var setFetchMethod = setFetchMethod$1;
|
|
|
|
+
|
|
|
|
+ exports.auto = auto;
|
|
|
|
+ exports.disable = disable;
|
|
|
|
+ exports.enable = enable;
|
|
|
|
+ exports.exportGeneratedCSS = exportGeneratedCSS;
|
|
|
|
+ exports.isEnabled = isEnabled;
|
|
|
|
+ exports.setFetchMethod = setFetchMethod;
|
|
|
|
+
|
|
|
|
+ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
+
|
|
|
|
+}));
|