Chrome扩展程序 - 在“document_start”之前获取变量值

时间:2016-08-10 10:04:34

标签: javascript google-chrome google-chrome-extension user-agent

我为伪造User-Agent字符串编写了一个chrome扩展名。替换标题已完成,但我在JavaScript中伪造用户代理字符串时遇到了麻烦。

如我们所知,为了在客户端检测用户代理,我们可以阅读navigator.userAgentwindow.navigator.userAgent,并且要禁用它,我在 content_scripts 中使用此代码:< / p>

var new_ua = 'Hell Yeah!';
if (typeof new_ua === 'string' && new_ua !== '') {
  var d = document.documentElement,
        injection_code = '(' + function(useragent) {
        if (typeof window === 'object' && typeof window.navigator === 'object') {
          navigator = Object.create(window.navigator);
          Object.defineProperties(navigator, {
            userAgent:  {get: function() {return useragent;}},
            appVersion: {get: function() {return useragent;}}
          });
          Object.defineProperty(window, 'navigator', {
            value: navigator, configurable: false, enumerable: false, writable: false
          });
        }
      } + ')("' + new_ua.replace(/([\"\'])/g, '\\$1') + '");';

  d.setAttribute('onreset', injection_code);
  d.dispatchEvent(new CustomEvent('reset'));
  d.removeAttribute('onreset');

  Object.defineProperties(navigator, {
    userAgent:  {get: function() {return new_ua;}},
    appVersion: {get: function() {return new_ua;}}
  });
}

manifest.json

"content_scripts": [{
  "all_frames": true,
  "js": ["/js/inject/content.js"],
  "matches": ["*://*/*"],
  "run_at": "document_start"
}],

"minimum_chrome_version": "49.0",
"permissions": [
  "webRequest", "webRequestBlocking", "*://*/*", "storage", "tabs"
]

一切正常:

enter image description here

测试页面代码:

<html>
  <body>
    headers = <?php echo $_SERVER['HTTP_USER_AGENT']; ?><br />
    <script>
      document.write('navigator.userAgent = ' + navigator.userAgent + '<br />');
      document.write('window.navigator.userAgent = ' + window.navigator.userAgent + '<br />');
    </script>

    <iframe style="display: none"></iframe>
  </body>
</html>

但是,休斯顿,我们有一个小问题。

要从扩展程序设置获取伪造的用户代理,我们可以使用chrome.runtime.sendMessage方法,是的。但是如果我们使用:

chrome.runtime.sendMessage({action: 'useragent.get'}, function(new_ua){
  // code from first snippet is here
});

假装不起作用!为什么?因为我们在页面 onLoad 事件后执行代码。因此,我们必须在没有chrome.runtime.sendMessage和任何其他异步方法的情况下从后台脚本获取实际的用户代理。

但是怎么样?

抱歉我的英文

1 个答案:

答案 0 :(得分:1)

消息在Javascript引擎的下一个事件任务中传递,而您的小而简单的页面完全在活动事件任务中进行解析。

可能的解决方法:

  1. 尝试在内容脚本和扩展程序的其他页面中使用chrome.storage.local API来存储和获取值。尽管API是异步的,但无论如何它都值得一试。
  2. 使用同步localStorage:您的扩展程序会在首次访问该页面时设置一个值,然后您的内容脚本就能及时阅读。当然这是不可靠的,有些人设置他们的浏览器在浏览器重启后清除localStorage。