2013-03-04 21 views
1

我正在嘗試創建一個監視網頁中一些JavaScript API的使用情況的工具。我的計劃是重寫JavaScript API,將調用信息存儲到全局變量中,然後通過postMessage將其發送到內容腳本。但是,向網頁中注入類似下面的代碼會導致「Aw Snap」錯誤。使用注入調用chrome.devtools.inspectedWindow.reload會導致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的原型導致錯誤。

+0

這是不相關的,但你需要一個;在window.addEventListener行之前。 「};」而不是「}」 – Jono 2014-03-16 15:43:37

+1

啊!這只是一個語法錯誤... – kuu 2014-03-17 16:02:50

+0

無論如何,謝謝你指出了喬諾! – kuu 2014-03-17 16:09:13

回答

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除非關閉窗口,否則Counter始終爲零!

+0

API參考聲明「如果指定,腳本將被注入到每個在任何框架腳本之前,在加載時立即檢查頁面的框架。「 http://developer.chrome.com/extensions/devtools.inspectedWindow.html#method-reload 它實際上按照我在刪除postMessage調用時所述的方式工作。 – kuu 2013-03-05 01:14:51

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);" 
     ]; 
... 
相關問題