Chrome扩展程序:检查是否已插入内容脚本

林庆丰:

我正在开发Chrome扩展程序。我没有使用manifest.json匹配所有URL的内容脚本的方式,而是通过chrome.tabs.executeScript在用户单击扩展图标时进行调用来懒惰地注入内容脚本

我正在尝试避免多次执行脚本。因此,我的内容脚本中包含以下代码:

if (!window.ALREADY_INJECTED_FLAG) {
    window.ALREADY_INJECTED_FLAG = true
    init() // <- All side effects go here
}

问题#1,这样安全到足以在chrome.tabs.executeScript每次单击扩展程序图标时天真地调用它吗?换句话说,这是幂等的吗?

问题2,是否有类似的方法chrome.tabs.insertCSS

由于无法访问网页的DOM,因此似乎无法检查backgroud脚本中的内容脚本注入状态。我尝试过ping / pong方法来检查任何内容脚本实例是否存在。但这引入了设计ping超时的开销和复杂性。

问题#3,有没有更好的方法让后台脚本检查内容脚本的插入状态,因此我只能防止chrome.tabs.executeScript每次用户单击图标时都调用它

提前致谢!

罗伯·W:

这样安全吗,足以确保chrome.tabs.executeScript每次单击扩展程序图标时都可以天真地呼叫它换句话说,这是幂等的吗?

  1. 是的,除非您的内容脚本修改了页面的DOM并且重新加载了扩展名(通过在设置页面,更新等方式重新加载了扩展名)。在这种情况下,您的旧内容脚本将不再在扩展程序的上下文中运行,因此它无法使用扩展程序API,也不能直接与您的扩展程序通信。

有类似的方法chrome.tabs.insertCSS吗?

  1. 不,没有适用于的包容护卫chrome.tabs.insertCSS但是,再次插入相同的样式表不会改变页面的外观,因为所有规则都具有相同的CSS专用性,在这种情况下,最后一个样式表具有优先权。但是,如果样式表与您的扩展紧密结合,那么您可以简单地使用executeScript注入脚本,检查是否是第一次注入脚本,如果是,则插入样式表(请参见下面的示例)。

还有什么更好的方法可以让后台脚本检查内容脚本的注入状态,因此我可以防止chrome.tabs.executeScript每次用户单击图标时都调用它

  1. 您可以向选项卡(chrome.tabs.sendMessage发送一条消息,如果未得到答复,则假定选项卡中没有内容脚本,然后插入内容脚本。

2的代码示例

在弹出/后台脚本中:

chrome.tabs.executeScript(tabId, {
    file: 'contentscript.js',
}, function(results) {
    if (chrome.runtime.lastError || !results || !results.length) {
        return;  // Permission error, tab closed, etc.
    }
    if (results[0] !== true) {
        // Not already inserted before, do your thing, e.g. add your CSS:
        chrome.tabs.insertCSS(tabId, { file: 'yourstylesheet.css' });
    }
});

contentscript.js:

// Wrapping in a function to not leak/modify variables if the script
// was already inserted before.
(function() {
    if (window.hasRun === true)
        return true;  // Will ultimately be passed back to executeScript
    window.hasRun = true;
    // rest of code ... 
    // No return value here, so the return value is "undefined" (without quotes).
})(); // <-- Invoke function. The return value is passed back to executeScript

请注意,window.hasRun显式检查很重要true在上面的示例中),否则它可以是具有id="hasRun"属性的DOM元素的自动创建的全局变量,请参见是否存在将元素ID设置为全局变量的规范?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

动态地注入内容脚本 - Chrome扩展程序

Chrome 扩展程序在重定向后不会注入内容脚本

是否可以通过Chrome扩展程序内容脚本修改Cookie?

Chrome扩展程序-内容脚本匹配是否仅限权限?

jQuery可以检查输入内容是否已更改?

内容脚本之间的通信| Chrome 扩展程序

检查是否已安装某些程序的脚本

Chrome扩展程序内容脚本未插入大多数页面

插入内容时防止<td>扩展

如何确定内容脚本的弹出窗口中是否包含Chrome扩展程序?

是否将扩展程序内容脚本绑定到Chrome的起始页?

是否可以在查看源页面上的Chrome扩展程序中运行内容脚本?

Chrome 扩展:我希望在网页完全加载后注入内容脚本

在Chrome扩展程序中将远程脚本作为内容脚本

bash脚本,用于检查输入内容是否为“ y”,“ n”或其他-不起作用

如何包含Chrome扩展程序内容脚本的样式?

Chrome扩展程序-在内容脚本中接收请求

Chrome扩展程序内容脚本未触发代码

如何选择何时启动Chrome扩展程序的内容脚本?

Chrome扩展程序:内容脚本未找到dom元素

Chrome扩展程序的内容脚本不影响特定网站

Chrome扩展程序:如何全局捕获/处理内容脚本错误?

使用背景页面和内容脚本的Chrome扩展程序

Chrome扩展程序-在URL更新上加载内容脚本

Chrome扩展程序后台页面和内容脚本同步

Chrome扩展程序,内容脚本和XSS攻击

允许在Chrome扩展程序内容脚本中使用jQuery

将按钮注入网站(Chrome扩展程序内容脚本)

Chrome扩展程序内容脚本中的Polymer元素