// ==UserScript== // @name Amazon CPU Tamer // @name:ja Amazon CPU Tamer // @name:zh-CN Amazon CPU Tamer // @namespace knoa.jp // @contributionURL https://paypal.me/kantankikaku // @description It reduces CPU usage on Amazon shopping pages. Enjoy your snappy shopping. // @description:ja AmazonのショッピングページでのCPU使用率を削減します。お買いものをサクサク楽しみましょう。 // @description:zh-CN 减少Amazon购物页面上的CPU利用率。顺利地享受买东西吧。 // @include https://www.amazon.com/* // @include https://www.amazon.co.jp/* // @include https://www.amazon.co.uk/* // @include https://www.amazon.* // @include https://*.amazon-*.com/* // @include https://*.*-amazon.com/* // @exclude */cart/* // @exclude */buy/* // @version 1.3.1 // @grant none // @run-at document-start // @downloadURL none // ==/UserScript== /* [update] Minor fix. [memo] top: interval さまざま多数, timeout インタラクションのみで定常なし iframe: interval なし, timeout 定常 100ms が iframe ごとに1つずつ */ (function(){ const SCRIPTID = 'AmazonCpuTamer'; console.log(SCRIPTID, location.href); const TAMEDINTERVAL = 60*1000;/* a bunch of intervals does cost so much even if the processes do nothing */ const QUICKRESPONSE = 1*1000;/* some of the interactions need rather quick response such as video guides */ const IFRAMETIMEOUT = 1*1000;/* amazon uses timeouts instead of intervals on iframes */ /* tame quick intervals */ const originalSetInterval = window.setInterval.bind(window); window.setInterval = function(f, interval, ...args){ if(interval < TAMEDINTERVAL){ console.log(SCRIPTID, 'interval:', interval, 'to', TAMEDINTERVAL, location.href); interval = TAMEDINTERVAL; window.setTimeout(f, QUICKRESPONSE, ...args); } return originalSetInterval(f, interval, ...args); }; /* tame quick timeouts on iframe ads */ if(window !== top){ const originalSetTimeout = window.setTimeout.bind(window); window.setTimeout = function(f, timeout, ...args){ if(document.hidden) return; if(timeout < IFRAMETIMEOUT){ //console.log(SCRIPTID, 'timeout:', timeout, 'to', IFRAMETIMEOUT, location.href); timeout = IFRAMETIMEOUT; } return originalSetTimeout(f, timeout, ...args); }; } /* add an associate tag */ switch(location.host){ case('www.amazon.com'): addTag('knoa-20'); break; case('www.amazon.co.uk'): addTag('knoa-21'); break; case('www.amazon.co.jp'): addTag('knoa-22'); break; } function addTag(tag){ const url = new URL(location.href); if(url.searchParams.get('tag') !== null) return;/* do not overwrite */ console.log(SCRIPTID, 'associate tag:', tag); document.documentElement.addEventListener('mousedown', function(e){ for(let target = e.target; target; target = target.parentNode){ if(target.href && target.href.startsWith(location.origin)){ const separator = (target.href.includes('?')) ? '&' : '?'; target.href = target.href + separator + 'tag=' + tag; } } }); const separator = (url.search === '') ? '?' : '&'; history.replaceState(null, document.title, location.href + separator + 'tag=' + tag); } })();