Chrome 扩展:如何禁用页面可见性 API
Posted
技术标签:
【中文标题】Chrome 扩展:如何禁用页面可见性 API【英文标题】:Chrome Extension: How to Disable Page Visibility API 【发布时间】:2018-05-19 12:42:18 【问题描述】:我正在编写一个 Chrome 扩展程序,它需要防止网页触发 document visibilitychange 事件。至少我需要能够覆盖 document.visibilityState(即使它是只读属性)。如果不可能,因为这个扩展仅用于我的目的,不会出现在 Chrome 扩展商店中,有没有办法可以配置我的 Chrome 浏览器来实现我想要的?我只需要在 Chrome 的“开发者模式”开启时使用此扩展程序,其他时间都不需要。
我希望有人能想出一种创造性的方式来实现这一目标。谢谢。
请注意! 4年前的答案中有一个解决方案不再在较新版本的Chrome中生效: Spoof or disable the Page Visibility API
自己测试一下:
// This codes worked 4 years ago but not anymore
var c='(function()var a=Node.prototype.addEventListener;Node.prototype.addEventListener=function(e)if(e=="visibilitychange"||e=="webkitvisibilitychange")else a.apply(this,arguments))()'
, E=document.documentElement;
E.setAttribute('onreset', c);
E.dispatchEvent(new CustomEvent('reset'));
E.removeAttribute('onreset');
// THIS WILL STILL LOG THE STATES EVEN WITH THE ABOVE CODE RUNNING
document.addEventListener("visibilitychange", function()
console.log( document.visibilityState );
);
如果在 Chrome 中无法实现,是否有 Firefox/Safari/Opera 浏览器代码可以实现这一点?
【问题讨论】:
没有测试,但代码应该使用EventTarget.prototype
,而不是Node。
此外,该页面可能禁止内联代码,因此我会尝试将 c
文本插入到由 Chrome 扩展程序的内容脚本添加时从页面 CSP 中排除的 script
元素中。
我尝试用 EventTarget.prototype 替换 Node.prototype,但仍然没有成功。该代码位于一个单独的文件中,尽管名为 dont.js,我通过在其中抛出一个 alert() 来确保它正在运行,并且我确认它正在运行。
【参考方案1】:
这是我的解决方案:
for (event_name of ["visibilitychange", "webkitvisibilitychange", "blur"])
window.addEventListener(event_name, function(event)
event.stopImmediatePropagation();
, true);
我添加了blur
事件,因为我想跳过的视频 (everfi.net) 使用它来检测我何时切换窗口。与visibilitychange
和webkitvisibilitychange
一起阻止该事件起到了作用:)
我还修改了扩展的清单,使其在 iframe 中工作。
完整代码(chrome 扩展):https://github.com/NavinF/dont
确认使用以下狗牌:
Google Chrome 63.0.3239.132 (Official Build) (64-bit)
Revision 2e6edcfee630baa3775f37cb11796b1603a64360-refs/branch-heads/3239@#709
OS Mac OS X
javascript V8 6.3.292.49
Command Line /Applications/Google Chrome.app/Contents/MacOS/Google Chrome --flag-switches-begin --flag-switches-end
【讨论】:
以上是关于Chrome 扩展:如何禁用页面可见性 API的主要内容,如果未能解决你的问题,请参考以下文章