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条评论
登录后参与评论

相关文章

来自分类Dev

如何确定脚本是否已经从Chrome扩展程序注入到文档中

来自分类Dev

Chrome扩展程序:检查后台脚本是否正在运行

来自分类Dev

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

来自分类Dev

Chrome扩展程序的内容脚本未注入特定网站

来自分类Dev

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

来自分类Dev

Chrome扩展程序的内容脚本未注入特定网站

来自分类Dev

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

来自分类Dev

Chrome扩展程序后台页面以编程方式注入的内容脚本多次注入

来自分类Dev

检查Bootstrap Datepicker脚本是否已加载

来自分类Dev

Chrome扩展程序注入脚本获取错误

来自分类Dev

Chrome扩展程序注入脚本获取错误

来自分类Dev

在chrome扩展程序中,如何使用内容脚本注入Vue页面

来自分类Dev

无法通过Chrome扩展程序中的内容脚本使onclick在注入的按钮上起作用

来自分类Dev

在Chrome扩展程序中停止内容脚本

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Chrome扩展程序内容脚本访问扩展程序框架

来自分类Dev

在注入的脚本和Google Chrome扩展程序代码/内容脚本之间传递消息的最安全方法是什么?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Chrome扩展程序:内容脚本注入时如何解决“不允许加载本地资源”错误

来自分类Dev

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

来自分类Dev

Chrome邮件扩展程序:从注入脚本到后台

来自分类Dev

从注入的脚本中获取Chrome扩展程序调用函数

来自分类Dev

Chrome邮件扩展程序:从注入脚本到后台

来自分类Dev

如何知道脚本是否已加载

来自分类Dev

检查脚本是否成功运行?

来自分类Dev

检查脚本是否正在运行?

Related 相关文章

  1. 1

    如何确定脚本是否已经从Chrome扩展程序注入到文档中

  2. 2

    Chrome扩展程序:检查后台脚本是否正在运行

  3. 3

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

  4. 4

    Chrome扩展程序的内容脚本未注入特定网站

  5. 5

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

  6. 6

    Chrome扩展程序的内容脚本未注入特定网站

  7. 7

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

  8. 8

    Chrome扩展程序后台页面以编程方式注入的内容脚本多次注入

  9. 9

    检查Bootstrap Datepicker脚本是否已加载

  10. 10

    Chrome扩展程序注入脚本获取错误

  11. 11

    Chrome扩展程序注入脚本获取错误

  12. 12

    在chrome扩展程序中,如何使用内容脚本注入Vue页面

  13. 13

    无法通过Chrome扩展程序中的内容脚本使onclick在注入的按钮上起作用

  14. 14

    在Chrome扩展程序中停止内容脚本

  15. 15

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

  16. 16

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

  17. 17

    Chrome扩展程序内容脚本访问扩展程序框架

  18. 18

    在注入的脚本和Google Chrome扩展程序代码/内容脚本之间传递消息的最安全方法是什么?

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

    Chrome扩展程序:内容脚本注入时如何解决“不允许加载本地资源”错误

  23. 23

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

  24. 24

    Chrome邮件扩展程序:从注入脚本到后台

  25. 25

    从注入的脚本中获取Chrome扩展程序调用函数

  26. 26

    Chrome邮件扩展程序:从注入脚本到后台

  27. 27

    如何知道脚本是否已加载

  28. 28

    检查脚本是否成功运行?

  29. 29

    检查脚本是否正在运行?

热门标签

归档