从执行内容脚本(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然后从内容脚本中读取值来解决此问题。
正如以下评论所示!谢谢:))
答案 0 :(得分:0)
无法避免sendMessage延迟,因为它是异步操作。
但是,您可以通过在扩展程序中的后台脚本中完全执行此操作来完成您想要执行的操作,而不是使用内容脚本。你需要做的是
答案 1 :(得分:0)
使用cookies修复,见上文。