2014-06-14 35 views
1

對於我的擴展,我有popup.htmlbackground.html。在後臺,當互聯網連接回來時,我收聽window.online事件和chrome.runtime.reload()。但是,如果互聯網離線和聯機時彈出窗口打開,則只有後臺頁面被重新加載,而彈出窗口保持不變。然後,從TypeError以下部分發生擴展中的問題:獲取後臺頁面

apiFunctions.setHandleRequest('getBackgroundPage', function() { 
    return GetExtensionViews(-1, 'BACKGROUND')[0] || null; 
    }); 

GetExtensionViews(-1, '背景')返回undefined,所以它試圖訪問undefined[0]。爲什麼會發生這種情況,我將如何解決這個問題?

+0

請在http://crbug.com/new打開一個新的問題。 –

+0

您正在通過重新加載來終止背景和彈出窗口之間的連接。只需重新加載彈出窗口即可。我用擴展名來做這件事。 –

+0

有人在https://code.google.com/p/chromium/issues/detail?id=384726 –

回答

2

處理你在做什麼的最好方法是不處理你的內容腳本中的在線/離線。在您的內容腳本中處理此類事件的問題是,您在後臺腳本中正在執行重新加載。一旦你重新加載,所有的內容腳本都無法與後端進行通信。例如,

一旦您重新加載,如果您從內容腳本執行chrome.runtime.sendMessage到後端,它將拋出一個錯誤,表示它無法與後端進行通信。這會在選項卡刷新之前發生。

因爲你似乎經常做重新加載,這可能是更好的

  1. 重新注入的內容腳本到在重新加載所有打開的標籤。例如,將讀取清單並重新注入所有內容腳本的後端代碼。這些新的內容腳本可以與您的後端進行交流。只要確定他們是否插入任何DOM或CSS,就可以刪除舊的DOM或CSS,這樣您就不會在頁面中出現重複的元素,這將成爲用戶界面錯誤。

    function isSafeToInjectTo(tabs, i) { 
        if (!tabs[i].url) return false; 
    
        var httpOrHttps = tabs[i].url.indexOf('http://') !== -1 || tabs[i].url.indexOf('https://') !== -1; 
        if (!httpOrHttps) return false; 
    
        var googleWebstoreSite = tabs[i].url.indexOf('https://chrome.google.com/webstore') !== -1; 
        if (googleWebstoreSite) return false; 
    
        return true; 
    } 
    //THIS CODE SHOULD BE PLACED IN BACKGROUND PAGE AND WILL ONLY RUN ONCE WHEN BACKGROUND  SCRIPT STARTS 
    console.log('injecting '); 
    var js = []; 
    var css = []; 
    chrome.runtime.getManifest().content_scripts.forEach(function (element, index, array) { 
        $.each(element.js, function (i, el) { 
         if ($.inArray(el, js) === -1) js.push(el); 
        }); 
        $.each(element.css, function (i, el) { 
         if ($.inArray(el, css) === -1) css.push(el); 
        }); 
    }) 
    chrome.tabs.query({}, function (tabs) { 
        for (var i in tabs) { 
         //not able to inject into chrome:// or other non web pages and on google web store - extension has restrictions 
         if (isSafeToInjectTo(tabs, i)) { 
          //RE INJECT ALL JS 
          for (var s in js) { 
           chrome.tabs.executeScript(tabs[i].id, {file: js[s]}); 
          } 
          //RE INJECT ALL CSS 
          for (var c in css) { 
           chrome.tabs.insertCSS(tabs[i].id, {file: css[c]}); 
          } 
         } 
        } 
    }); 
    
  2. 不要重裝後在線/離線,而是處理聯機/脫機在XHR請求,只是設定一個較短的計時器循環setTimeout()/setInterval()重試或使用一個框架來處理這個要求。

+0

上報告了這個錯誤。這個問題與內容腳本無關。這是一個彈出窗口。 – Xan

相關問題