123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- /**
- * 对整个页面增加多种滤镜选择,比如:增强对比度、反色等
- * @example PageGrayTool.init('0/1/2/3/4/5')
- */
- let PageGrayTool = (function () {
- let mode;
- let enabled = true;
- let scheme = '4';
- let svgContent = `
- <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
- <defs>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_off">
- <feComponentTransfer>
- <feFuncR type="table" tableValues="0 1"/>
- <feFuncG type="table" tableValues="0 1"/>
- <feFuncB type="table" tableValues="0 1"/>
- </feComponentTransfer>
- </filter>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_highlight">
- <feComponentTransfer>
- <feFuncR type="gamma" exponent="3.0"/>
- <feFuncG type="gamma" exponent="3.0"/>
- <feFuncB type="gamma" exponent="3.0"/>
- </feComponentTransfer>
- </filter>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_highlight_back">
- <feComponentTransfer>
- <feFuncR type="gamma" exponent="0.33"/>
- <feFuncG type="gamma" exponent="0.33"/>
- <feFuncB type="gamma" exponent="0.33"/>
- </feComponentTransfer>
- </filter>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_grayscale">
- <feColorMatrix type="matrix" values="0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"/>
- <feComponentTransfer>
- <feFuncR type="gamma" exponent="3"/>
- <feFuncG type="gamma" exponent="3"/>
- <feFuncB type="gamma" exponent="3"/>
- </feComponentTransfer>
- </filter>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_grayscale_back">
- <feComponentTransfer>
- <feFuncR type="gamma" exponent="0.33"/>
- <feFuncG type="gamma" exponent="0.33"/>
- <feFuncB type="gamma" exponent="0.33"/>
- </feComponentTransfer>
- </filter>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_invert">
- <feComponentTransfer>
- <feFuncR type="gamma" amplitude="-1" exponent="3" offset="1"/>
- <feFuncG type="gamma" amplitude="-1" exponent="3" offset="1"/>
- <feFuncB type="gamma" amplitude="-1" exponent="3" offset="1"/>
- </feComponentTransfer>
- </filter>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_invert_back">
- <feComponentTransfer>
- <feFuncR type="table" tableValues="1 0"/>
- <feFuncG type="table" tableValues="1 0"/>
- <feFuncB type="table" tableValues="1 0"/>
- </feComponentTransfer>
- <feComponentTransfer>
- <feFuncR type="gamma" exponent="1.7"/>
- <feFuncG type="gamma" exponent="1.7"/>
- <feFuncB type="gamma" exponent="1.7"/>
- </feComponentTransfer>
- </filter>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_invert_grayscale">
- <feColorMatrix type="matrix" values="0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"/>
- <feComponentTransfer>
- <feFuncR type="gamma" amplitude="-1" exponent="3" offset="1"/>
- <feFuncG type="gamma" amplitude="-1" exponent="3" offset="1"/>
- <feFuncB type="gamma" amplitude="-1" exponent="3" offset="1"/>
- </feComponentTransfer>
- </filter>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_yellow_on_black">
- <feComponentTransfer>
- <feFuncR type="gamma" amplitude="-1" exponent="3" offset="1"/>
- <feFuncG type="gamma" amplitude="-1" exponent="3" offset="1"/>
- <feFuncB type="gamma" amplitude="-1" exponent="3" offset="1"/>
- </feComponentTransfer>
- <feColorMatrix type="matrix" values="0.3 0.5 0.2 0 0 0.3 0.5 0.2 0 0 0 0 0 0 0 0 0 0 1 0"/>
- </filter>
- <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_yellow_on_black_back">
- <feComponentTransfer>
- <feFuncR type="table" tableValues="1 0"/>
- <feFuncG type="table" tableValues="1 0"/>
- <feFuncB type="table" tableValues="1 0"/>
- </feComponentTransfer>
- <feComponentTransfer>
- <feFuncR type="gamma" exponent="0.33"/>
- <feFuncG type="gamma" exponent="0.33"/>
- <feFuncB type="gamma" exponent="0.33"/>
- </feComponentTransfer>
- </filter>
- </defs>
- </svg>`;
- let cssTemplate = `
- html[hc="a0"] {
- -webkit-filter: url("#_fh_page_modifier_off");
- }
- html[hcx="0"] img[src*="jpg"],
- html[hcx="0"] img[src*="jpeg"],
- html[hcx="0"] svg image,
- html[hcx="0"] img.rg_i,
- html[hcx="0"] embed,
- html[hcx="0"] object,
- html[hcx="0"] video {
- -webkit-filter: url("#_fh_page_modifier_off");
- }
- html[hc="a1"] {
- -webkit-filter: url("#_fh_page_modifier_highlight");
- }
- html[hcx="1"] img[src*="jpg"],
- html[hcx="1"] img[src*="jpeg"],
- html[hcx="1"] img.rg_i,
- html[hcx="1"] svg image,
- html[hcx="1"] embed,
- html[hcx="1"] object,
- html[hcx="1"] video {
- -webkit-filter: url("#_fh_page_modifier_highlight_back");
- }
- html[hc="a2"] {
- -webkit-filter: url("#_fh_page_modifier_grayscale");
- }
- html[hcx="2"] img[src*="jpg"],
- html[hcx="2"] img[src*="jpeg"],
- html[hcx="2"] img.rg_i,
- html[hcx="2"] svg image,
- html[hcx="2"] embed,
- html[hcx="2"] object,
- html[hcx="2"] video {
- -webkit-filter: url("#_fh_page_modifier_grayscale_back");
- }
- html[hc="a3"] {
- -webkit-filter: url("#_fh_page_modifier_invert");
- }
- html[hcx="3"] img[src*="jpg"],
- html[hcx="3"] img[src*="jpeg"],
- html[hcx="3"] img.rg_i,
- html[hcx="3"] svg image,
- html[hcx="3"] embed,
- html[hcx="3"] object,
- html[hcx="3"] video {
- -webkit-filter: url("#_fh_page_modifier_invert_back");
- }
- html[hc="a4"] {
- -webkit-filter: url("#_fh_page_modifier_invert_grayscale");
- }
- html[hcx="4"] img[src*="jpg"],
- html[hcx="4"] img[src*="jpeg"],
- html[hcx="4"] img.rg_i,
- html[hcx="4"] svg image,
- html[hcx="4"] embed,
- html[hcx="4"] object,
- html[hcx="4"] video {
- -webkit-filter: url("#_fh_page_modifier_invert_back");
- }
- html[hc="a5"] {
- -webkit-filter: url("#_fh_page_modifier_yellow_on_black");
- }
- html[hcx="5"] img[src*="jpg"],
- html[hcx="5"] img[src*="jpeg"],
- html[hcx="5"] img.rg_i,
- html[hcx="5"] svg image,
- html[hcx="5"] embed,
- html[hcx="5"] object,
- html[hcx="5"] video {
- -webkit-filter: url("#_fh_page_modifier_yellow_on_black_back");
- }`;
- /**
- * Add the elements to the pgae that make high-contrast adjustments possible.
- */
- function addOrUpdateExtraElements() {
- if (!enabled)
- return;
- let style = document.getElementById('hc_style');
- if (!style) {
- let baseUrl = window.location.href.replace(window.location.hash, '');
- let css = cssTemplate.replace(/#/g, baseUrl + '#');
- style = document.createElement('style');
- style.id = 'hc_style';
- style.setAttribute('type', 'text/css');
- style.innerHTML = css;
- document.head.appendChild(style);
- }
- let bg = document.getElementById('_fh_page_modifier_bkgnd');
- if (!bg) {
- bg = document.createElement('div');
- bg.id = '_fh_page_modifier_bkgnd';
- bg.style.position = 'fixed';
- bg.style.left = '0px';
- bg.style.top = '0px';
- bg.style.right = '0px';
- bg.style.bottom = '0px';
- bg.style.zIndex = -1999999999;
- document.body.appendChild(bg);
- }
- bg.style.display = 'block';
- bg.style.background = window.getComputedStyle(document.body).background;
- let c = bg.style.backgroundColor;
- c = c.replace(/\s\s*/g, '');
- if (m = /^rgba\(([\d]+),([\d]+),([\d]+),([\d]+|[\d]*.[\d]+)\)/.exec(c)) {
- if (m[4] == '0') {
- bg.style.backgroundColor = '#fff';
- }
- }
- let wrap = document.getElementById('_fh_page_modifier_svg_filters');
- if (wrap)
- return;
- wrap = document.createElement('span');
- wrap.id = '_fh_page_modifier_svg_filters';
- wrap.setAttribute('hidden', '');
- wrap.innerHTML = svgContent;
- document.body.appendChild(wrap);
- }
- function init(grayLevel) {
- if (window === window.top) {
- mode = 'a';
- } else {
- mode = 'b';
- }
- scheme = grayLevel || scheme;
- let html = document.documentElement;
- html.setAttribute('hc', mode + scheme);
- html.setAttribute('hcx', scheme);
- if (window === window.top) {
- window.scrollBy(0, 1);
- window.scrollBy(0, -1);
- }
- // Update again after a few seconds and again after load so that
- // the background isn't wrong for long.
- window.setTimeout(addOrUpdateExtraElements, 2000);
- addOrUpdateExtraElements();
- // Also update when the document body attributes change.
- let config = {attributes: true, childList: true, characterData: true};
- let observer = new MutationObserver(function (mutations) {
- addOrUpdateExtraElements();
- });
- observer.observe(document.body, config);
- }
- return {
- init: init
- };
- })();
- /**
- * 页面修改器
- * @param pageConfig
- * @constructor
- */
- let PageModify = function (pageConfig) {
- let pageUrl = location.href;
- if (pageConfig.id && pageConfig.mPattern && !pageConfig.mDisabled) {
- let m = pageConfig.mPattern.match(/\/(.*)\/(.*)?/);
- // 如果正则匹配的话才生效
- if ((new RegExp(m[1], m[2] || '')).test(pageUrl)) {
- let el = document.createElement('script');
- el.type = 'text/javascript';
- el.textContent = pageConfig.mScript;
- document.body.appendChild(el);
- // 如果需要进行页面filter处理的话,直接处理
- pageConfig.mFilter && PageGrayTool.init(pageConfig.mFilter);
- // 自动刷新
- parseInt(pageConfig.mRefresh) && setTimeout(() => {
- location.reload(true);
- }, parseInt(pageConfig.mRefresh) * 1000);
- }
- }
- };
- /**
- * 获取当前页面modifier配置
- */
- let ModifyCurrentPage = function () {
- chrome.runtime.sendMessage({
- type: MSG_TYPE.GET_PAGE_MODIFIER_CONFIG,
- params: {
- url: location.href
- }
- }, function (pageConfig) {
- PageModify(pageConfig);
- });
- };
- ModifyCurrentPage();
|