使用注入调用chrome.devtools.inspectedWindow.reload会导致Aw Snap

时间:2013-03-04 07:21:15

标签: google-chrome-extension google-chrome-devtools

我正在尝试创建一个监视网页中某些JavaScript API使用情况的工具。我的计划是覆盖JavaScript API,将调用信息存储到全局变量中,然后通过postMessage将其发送到内容脚本。但是,在网页中注入类似下面的代码会导致“Aw Snap”错误。

chrome.devtools.panels.create("Test Dev Panel",
  "icon.png",
  "panel.html",
  function (panel) {
    var code = [ 
        "window.counter = 0;",
        "Array.prototype.push = function () {",
          "window.counter++;",
        "}",
        "window.addEventListener('message', function(event) {",
          "window.postMessage('Array.push() has been called ' + window.counter + ' times.', '*');",
        "}, false);"
      ];

    chrome.devtools.inspectedWindow.reload({
      injectedScript: code.join('')
    });
...
  });

这可能是一项安全限制。但有没有办法实现我的目标?

---更新--- 如果我删除postMessage()调用,则不会发生错误。 此外,如果我删除Array.prototype重写代码,它不会。 在我看来,调用postMessage()并同时覆盖Array的原型会导致错误。

2 个答案:

答案 0 :(得分:1)

这是Array.prototype.push之后的语法错误。

您需要以分号结束该行。

...
var code = [ 
        "window.counter = 0;",
        "Array.prototype.push = function () {",
          "window.counter++;",
        "};", //<-- Here
        "window.addEventListener('message', function(event) {",
          "window.postMessage('Array.push() has been called ' + window.counter + ' times.', '*');",
        "}, false);"
      ];
...

答案 1 :(得分:0)

问题在于

"window.counter = 0;",
"Array.prototype.push = function () {",
"window.counter++;",
"}",
"window.addEventListener('message', function(event) {",
"window.postMessage('Array.push() has been called ' + window.counter + ' times.', '*');",
"}, false);"

代码,我不确定你想要实现什么!

我希望你知道,除非关闭窗口,否则Counter在帧中始终为零!