使用chrome.runtime.sendMessage时欺骗window.navigator.userAgent延迟?

时间:2018-02-23 23:50:46

标签: javascript google-chrome-extension

从执行内容脚本(document_start)的Chrome扩展程序中,我运行:

chrome.runtime.sendMessage({agent: "ask"}, function(response) { CA(response.answer); });

function CA(agent) 
{
    var Agent = "Object.defineProperty(navigator, 'userAgent', { value:'"+agent+"' });";
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.textContent = Agent;
    document.documentElement.appendChild(script);
 }

但由于从sendMessage获取响应所需的时间, 如果你加载一个执行以下操作的html页面...它失败了(见下文):

var x = 0;
console.log(navigator.userAgent);
var intervalID = setInterval(function () {
console.log(navigator.userAgent); if (++x === 5) { window.clearInterval(intervalID); }
}, 1);

输出是这样的:

16:31:37.515 [..] Chrome/64.0.3282.168 Safari/537.36 OPR/51.0.2830.40
16:31:37.606 [..] Chrome/64.0.3282.168 Safari/537.36
16:31:37.607 [..] Chrome/64.0.3282.168 Safari/537.36
16:31:37.608 [..] Chrome/64.0.3282.168 Safari/537.36
16:31:37.610 [..] Chrome/64.0.3282.168 Safari/537.36
16:31:37.615 [..] Chrome/64.0.3282.168 Safari/537.36

第一行是浏览器和后续行的默认userAgent 是我的扩展名修改后的userAgent ...

有没有办法修复这个sendMessage延迟,以便简单的console.log(navigator.userAgent);在网页上会立即看到欺骗性的userAgent?

更新:

也尝试从这样的背景页面:

chrome.webNavigation.onDOMContentLoaded.addListener(function(details)
{
    chrome.tabs.executeScript({code: "console.log('here3')", runAt: "document_start"})
});

chrome.webNavigation.onCommitted.addListener(function(tab)
{
    chrome.tabs.executeScript({code: "console.log('here2')", runAt: "document_start"});
});

按以下顺序执行,here2,here1,here3

(here1从内容脚本打印,here2& here3从背景打印。

但是,Object.defineProperty无法从它出现的后台页面重新定义window.navigator - 但不会抛出任何错误!

更新:

我能够通过从后台页面设置cookie然后从内容脚本中读取值来解决此问题。

正如以下评论所示!谢谢:))

2 个答案:

答案 0 :(得分:0)

无法避免sendMessage延迟,因为它是异步操作。

但是,您可以通过在扩展程序中的后台脚本中完全执行此操作来完成您想要执行的操作,而不是使用内容脚本。你需要做的是

  1. 使用chrome.tabs api
  2. 检测标签的打开
  3. 一旦有标签,请使用chrome.debugger附加到标签页(可能的命令为https://chromedevtools.github.io/devtools-protocol/tot/Debugger,足以在页面中运行代码以查询内容并在页面中进行更改)
  4. 如果您检测到需要更改userAgent,请通过chrome.debugger api执行此操作(您甚至可以选择暂停页面中的脚本执行,以确保通过调试器首先运行代码)

答案 1 :(得分:0)

使用cookies修复,见上文。