content-script.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /**
  2. * 对整个页面增加多种滤镜选择,比如:增强对比度、反色等
  3. * @example PageGrayTool.init('0/1/2/3/4/5')
  4. */
  5. let PageGrayTool = (function () {
  6. let mode;
  7. let enabled = true;
  8. let scheme = '4';
  9. let svgContent = `
  10. <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  11. <defs>
  12. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_off">
  13. <feComponentTransfer>
  14. <feFuncR type="table" tableValues="0 1"/>
  15. <feFuncG type="table" tableValues="0 1"/>
  16. <feFuncB type="table" tableValues="0 1"/>
  17. </feComponentTransfer>
  18. </filter>
  19. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_highlight">
  20. <feComponentTransfer>
  21. <feFuncR type="gamma" exponent="3.0"/>
  22. <feFuncG type="gamma" exponent="3.0"/>
  23. <feFuncB type="gamma" exponent="3.0"/>
  24. </feComponentTransfer>
  25. </filter>
  26. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_highlight_back">
  27. <feComponentTransfer>
  28. <feFuncR type="gamma" exponent="0.33"/>
  29. <feFuncG type="gamma" exponent="0.33"/>
  30. <feFuncB type="gamma" exponent="0.33"/>
  31. </feComponentTransfer>
  32. </filter>
  33. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_grayscale">
  34. <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"/>
  35. <feComponentTransfer>
  36. <feFuncR type="gamma" exponent="3"/>
  37. <feFuncG type="gamma" exponent="3"/>
  38. <feFuncB type="gamma" exponent="3"/>
  39. </feComponentTransfer>
  40. </filter>
  41. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_grayscale_back">
  42. <feComponentTransfer>
  43. <feFuncR type="gamma" exponent="0.33"/>
  44. <feFuncG type="gamma" exponent="0.33"/>
  45. <feFuncB type="gamma" exponent="0.33"/>
  46. </feComponentTransfer>
  47. </filter>
  48. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_invert">
  49. <feComponentTransfer>
  50. <feFuncR type="gamma" amplitude="-1" exponent="3" offset="1"/>
  51. <feFuncG type="gamma" amplitude="-1" exponent="3" offset="1"/>
  52. <feFuncB type="gamma" amplitude="-1" exponent="3" offset="1"/>
  53. </feComponentTransfer>
  54. </filter>
  55. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_invert_back">
  56. <feComponentTransfer>
  57. <feFuncR type="table" tableValues="1 0"/>
  58. <feFuncG type="table" tableValues="1 0"/>
  59. <feFuncB type="table" tableValues="1 0"/>
  60. </feComponentTransfer>
  61. <feComponentTransfer>
  62. <feFuncR type="gamma" exponent="1.7"/>
  63. <feFuncG type="gamma" exponent="1.7"/>
  64. <feFuncB type="gamma" exponent="1.7"/>
  65. </feComponentTransfer>
  66. </filter>
  67. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_invert_grayscale">
  68. <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"/>
  69. <feComponentTransfer>
  70. <feFuncR type="gamma" amplitude="-1" exponent="3" offset="1"/>
  71. <feFuncG type="gamma" amplitude="-1" exponent="3" offset="1"/>
  72. <feFuncB type="gamma" amplitude="-1" exponent="3" offset="1"/>
  73. </feComponentTransfer>
  74. </filter>
  75. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_yellow_on_black">
  76. <feComponentTransfer>
  77. <feFuncR type="gamma" amplitude="-1" exponent="3" offset="1"/>
  78. <feFuncG type="gamma" amplitude="-1" exponent="3" offset="1"/>
  79. <feFuncB type="gamma" amplitude="-1" exponent="3" offset="1"/>
  80. </feComponentTransfer>
  81. <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"/>
  82. </filter>
  83. <filter x="0" y="0" width="99999" height="99999" id="_fh_page_modifier_yellow_on_black_back">
  84. <feComponentTransfer>
  85. <feFuncR type="table" tableValues="1 0"/>
  86. <feFuncG type="table" tableValues="1 0"/>
  87. <feFuncB type="table" tableValues="1 0"/>
  88. </feComponentTransfer>
  89. <feComponentTransfer>
  90. <feFuncR type="gamma" exponent="0.33"/>
  91. <feFuncG type="gamma" exponent="0.33"/>
  92. <feFuncB type="gamma" exponent="0.33"/>
  93. </feComponentTransfer>
  94. </filter>
  95. </defs>
  96. </svg>`;
  97. let cssTemplate = `
  98. html[hc="a0"] {
  99. -webkit-filter: url("#_fh_page_modifier_off");
  100. }
  101. html[hcx="0"] img[src*="jpg"],
  102. html[hcx="0"] img[src*="jpeg"],
  103. html[hcx="0"] svg image,
  104. html[hcx="0"] img.rg_i,
  105. html[hcx="0"] embed,
  106. html[hcx="0"] object,
  107. html[hcx="0"] video {
  108. -webkit-filter: url("#_fh_page_modifier_off");
  109. }
  110. html[hc="a1"] {
  111. -webkit-filter: url("#_fh_page_modifier_highlight");
  112. }
  113. html[hcx="1"] img[src*="jpg"],
  114. html[hcx="1"] img[src*="jpeg"],
  115. html[hcx="1"] img.rg_i,
  116. html[hcx="1"] svg image,
  117. html[hcx="1"] embed,
  118. html[hcx="1"] object,
  119. html[hcx="1"] video {
  120. -webkit-filter: url("#_fh_page_modifier_highlight_back");
  121. }
  122. html[hc="a2"] {
  123. -webkit-filter: url("#_fh_page_modifier_grayscale");
  124. }
  125. html[hcx="2"] img[src*="jpg"],
  126. html[hcx="2"] img[src*="jpeg"],
  127. html[hcx="2"] img.rg_i,
  128. html[hcx="2"] svg image,
  129. html[hcx="2"] embed,
  130. html[hcx="2"] object,
  131. html[hcx="2"] video {
  132. -webkit-filter: url("#_fh_page_modifier_grayscale_back");
  133. }
  134. html[hc="a3"] {
  135. -webkit-filter: url("#_fh_page_modifier_invert");
  136. }
  137. html[hcx="3"] img[src*="jpg"],
  138. html[hcx="3"] img[src*="jpeg"],
  139. html[hcx="3"] img.rg_i,
  140. html[hcx="3"] svg image,
  141. html[hcx="3"] embed,
  142. html[hcx="3"] object,
  143. html[hcx="3"] video {
  144. -webkit-filter: url("#_fh_page_modifier_invert_back");
  145. }
  146. html[hc="a4"] {
  147. -webkit-filter: url("#_fh_page_modifier_invert_grayscale");
  148. }
  149. html[hcx="4"] img[src*="jpg"],
  150. html[hcx="4"] img[src*="jpeg"],
  151. html[hcx="4"] img.rg_i,
  152. html[hcx="4"] svg image,
  153. html[hcx="4"] embed,
  154. html[hcx="4"] object,
  155. html[hcx="4"] video {
  156. -webkit-filter: url("#_fh_page_modifier_invert_back");
  157. }
  158. html[hc="a5"] {
  159. -webkit-filter: url("#_fh_page_modifier_yellow_on_black");
  160. }
  161. html[hcx="5"] img[src*="jpg"],
  162. html[hcx="5"] img[src*="jpeg"],
  163. html[hcx="5"] img.rg_i,
  164. html[hcx="5"] svg image,
  165. html[hcx="5"] embed,
  166. html[hcx="5"] object,
  167. html[hcx="5"] video {
  168. -webkit-filter: url("#_fh_page_modifier_yellow_on_black_back");
  169. }`;
  170. /**
  171. * Add the elements to the pgae that make high-contrast adjustments possible.
  172. */
  173. function addOrUpdateExtraElements() {
  174. if (!enabled)
  175. return;
  176. let style = document.getElementById('hc_style');
  177. if (!style) {
  178. let baseUrl = window.location.href.replace(window.location.hash, '');
  179. let css = cssTemplate.replace(/#/g, baseUrl + '#');
  180. style = document.createElement('style');
  181. style.id = 'hc_style';
  182. style.setAttribute('type', 'text/css');
  183. style.innerHTML = css;
  184. document.head.appendChild(style);
  185. }
  186. let bg = document.getElementById('_fh_page_modifier_bkgnd');
  187. if (!bg) {
  188. bg = document.createElement('div');
  189. bg.id = '_fh_page_modifier_bkgnd';
  190. bg.style.position = 'fixed';
  191. bg.style.left = '0px';
  192. bg.style.top = '0px';
  193. bg.style.right = '0px';
  194. bg.style.bottom = '0px';
  195. bg.style.zIndex = -1999999999;
  196. document.body.appendChild(bg);
  197. }
  198. bg.style.display = 'block';
  199. bg.style.background = window.getComputedStyle(document.body).background;
  200. let c = bg.style.backgroundColor;
  201. c = c.replace(/\s\s*/g, '');
  202. if (m = /^rgba\(([\d]+),([\d]+),([\d]+),([\d]+|[\d]*.[\d]+)\)/.exec(c)) {
  203. if (m[4] == '0') {
  204. bg.style.backgroundColor = '#fff';
  205. }
  206. }
  207. let wrap = document.getElementById('_fh_page_modifier_svg_filters');
  208. if (wrap)
  209. return;
  210. wrap = document.createElement('span');
  211. wrap.id = '_fh_page_modifier_svg_filters';
  212. wrap.setAttribute('hidden', '');
  213. wrap.innerHTML = svgContent;
  214. document.body.appendChild(wrap);
  215. }
  216. function init(grayLevel) {
  217. if (window === window.top) {
  218. mode = 'a';
  219. } else {
  220. mode = 'b';
  221. }
  222. scheme = grayLevel || scheme;
  223. let html = document.documentElement;
  224. html.setAttribute('hc', mode + scheme);
  225. html.setAttribute('hcx', scheme);
  226. if (window === window.top) {
  227. window.scrollBy(0, 1);
  228. window.scrollBy(0, -1);
  229. }
  230. // Update again after a few seconds and again after load so that
  231. // the background isn't wrong for long.
  232. window.setTimeout(addOrUpdateExtraElements, 2000);
  233. addOrUpdateExtraElements();
  234. // Also update when the document body attributes change.
  235. let config = {attributes: true, childList: true, characterData: true};
  236. let observer = new MutationObserver(function (mutations) {
  237. addOrUpdateExtraElements();
  238. });
  239. observer.observe(document.body, config);
  240. }
  241. return {
  242. init: init
  243. };
  244. })();
  245. /**
  246. * 页面修改器
  247. * @param pageConfig
  248. * @constructor
  249. */
  250. let PageModify = function (pageConfig) {
  251. let pageUrl = location.href;
  252. if (pageConfig.id && pageConfig.mPattern && !pageConfig.mDisabled) {
  253. let m = pageConfig.mPattern.match(/\/(.*)\/(.*)?/);
  254. // 如果正则匹配的话才生效
  255. if ((new RegExp(m[1], m[2] || '')).test(pageUrl)) {
  256. let el = document.createElement('script');
  257. el.type = 'text/javascript';
  258. el.textContent = pageConfig.mScript;
  259. document.body.appendChild(el);
  260. // 如果需要进行页面filter处理的话,直接处理
  261. pageConfig.mFilter && PageGrayTool.init(pageConfig.mFilter);
  262. // 自动刷新
  263. parseInt(pageConfig.mRefresh) && setTimeout(() => {
  264. location.reload(true);
  265. }, parseInt(pageConfig.mRefresh) * 1000);
  266. }
  267. }
  268. };
  269. /**
  270. * 获取当前页面modifier配置
  271. */
  272. let ModifyCurrentPage = function () {
  273. chrome.runtime.sendMessage({
  274. type: MSG_TYPE.GET_PAGE_MODIFIER_CONFIG,
  275. params: {
  276. url: location.href
  277. }
  278. }, function (pageConfig) {
  279. PageModify(pageConfig);
  280. });
  281. };
  282. ModifyCurrentPage();