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) 使用它来检测我何时切换窗口。与visibilitychangewebkitvisibilitychange 一起阻止该事件起到了作用:)

我还修改了扩展的清单,使其在 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的主要内容,如果未能解决你的问题,请参考以下文章

Page Visibility API(页面可见性)

折叠可见性时如何禁用对组合框元素的验证?

如何在 BIRT 中禁用或启用图表可见性

可见性的替代方案:折叠不适用于 IE 和 Chrome

页面可见性 API 是不是在脚本中的任何其他内容之前运行

Page Visibility(页面可见性) API介绍微拓展[转]