2013-04-29 2 views
2

Я прочитал все связанные с этим ошибки, и я думаю, что этот случай немного отличается. Я пытаюсь отправить сообщение из фонового контекста в сценарий содержимого. Например.chrome.tabs.sendMessage: «Ошибка порта: не удалось установить соединение. Окончание приема не существует »только на кэшированных страницах

chrome.tabs.query({ 
    currentWindow: true, 
    active: true 
}, function(tabs){ 
    chrome.tabs.sendMessage(tabs[0].id, { 
     name: name, 
     args: args 
    }, function(response){ 
     if (!response) return callback('You tried to message a tab that does not exist'); 
    }); 
}); 

Это будет бросать Port error если вкладка открыта была загружена до установки расширения. Для воссоздания:

  1. Открыть новую вкладку и загрузить веб-страницу
  2. Перейдите на вкладку Расширения и перезагрузить локальное распакованное расширение
  3. Перейдите обратно на вкладку веба и вызывать расширение через браузер Action- - он будет бросать Port error, если веб-страница не будет перезагружена вручную.

Есть ли обходной путь для этого?

ответ

2

Вместо отправки сообщения, programatically insert a content script и использовать результаты выполнения обратного вызова в:

chrome.tabs.query({ 
    currentWindow: true, 
    active: true 
}, function(tabs) { 
    chrome.tabs.executeScript(tabs[0].id, { 
     code: 'location.href', 
     runAt: 'document_start', 
     allFrames: false  // Run at the top-level frame only to get 
           // just one result 
    }, function(results) { 
     var result = results[0]; 
     console.log(result); // Example 
    }); 
}); 

Вместо specifiying кода в строке, вы можете также запустить файл с помощью file: 'code.js' вместо code: '...'.

+0

Спасибо, я боялся, что это может быть так. Возможно, вы знаете, что с рук - если пользователь повторно вызывает действие браузера на той же вкладке/url, будет ли повторяться сценарий на этой странице повторно, что приведет к дублированию сообщений? –

+0

@ChristopherCliff Да, но вы можете сохранить переменную, чтобы увидеть, запущен ли скрипт. Пример: https://github.com/Rob--W/pdf.js/blob/57e623/extensions/chrome/insertviewer.js#L126-L128 –

+0

Очень приятно, спасибо! –