Opera 15+ Расширение tabs.sendMessage работает только после перезагрузки браузера

Я переработал «Clip to DEVONthink» для использования в Opera 15+. Проблема, с которой я остался, заключается в том, что расширение работает только после перезапуска браузера.

Обновление 1: протестировано на Mac OS X 10.9.2 с Opera 21.0.1432.67, Opera Next 22.0.1471.40 и Google Chrome 35.0.1916.114. Все они ведут себя одинаково.

Обновление 2: собственный пример Opera для передачи сообщений получил такое же поведение. У меня остался вопрос, является ли это ожидаемым поведением.

В manifest.json определен фоновый скрипт:

"background": {
  "scripts": [ "main.js" ]
},

и сценарий контента:

"content_scripts": [ {
  "js": [ "add_listener.js" ],
  "matches": [ "http://*/*", "https://*/*" ],
}],

... а в main.js в chrome.browserAction.onClicked.addListener сообщение отправляется сценарию содержимого для запроса заголовка и содержимого страницы и т. д.

chrome.browserAction.onClicked.addListener(
    function (tab) {
        chrome.tabs.sendMessage(tab.id, {line: 'getdevonthinkurl' }); 
    }
 );

... и сценарий содержимого отправляет сообщение обратно:

chrome.runtime.onMessage.addListener(
    function (request, sender){
        if (request.line=='getdevonthinkurl'){
        chrome.runtime.sendMessage({devonthinkurl:getDEVONthinkURL()});
        }
    }
);

... и это сообщение получает фоновый скрипт main.js:

chrome.runtime.onMessage.addListener(
    function (request, sender) {
        if (request.devonthinkurl){
            chrome.tabs.update(sender.tab.id, {"url": request.devonthinkurl});
        }
    }
);

Как упоминалось выше, он отлично работает после перезагрузки браузера, но не понимает, почему он не будет работать без него.

У кого-нибудь есть идея (могу добавить, что я не силен в программировании и, возможно, в дизайне есть фундаментальный недостаток)?


person boretom    schedule 29.05.2014    source источник


Ответы (1)


Единственное, что приходит мне на ум, это то, что вы перезагружаете расширение, но сразу после этого шага вы не обновляете страницу, на которую вводится скрипт контента. Есть ли ошибка на фоновой странице? Я пробовал несколько раз, и это работает для меня. В любом случае вы можете использовать обратный вызов в сообщении, которое может быть более читаемым.

Итак, main.js может выглядеть так:

chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.sendMessage(tab.id, {line: 'getdevonthinkurl'},
        function(response){
            chrome.tabs.update(tab.id, {'url': request.devonthinkurl});
    }); 
});

И add_listener.js вот так:

chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse){
        if (request.line=='getdevonthinkurl'){
            sendResponse({devonthinkurl:getDEVONthinkURL()});
        }
    }
 );
person Sławomir Kaczorowski    schedule 30.05.2014
comment
Спасибо за код, стало намного чище! Однако без перезагрузки не работает. Я получаю `Трассировка стека: TypeError: Не удается прочитать свойство 'devonthinkurl' неопределенного в chrome-extension://bpcnacelhegpfbkjkbghdnbhoddaoapd/main.js:7:60 at disconnectListener (extensions::messaging:335:9)` (стек превышает этот длина комментария). - person boretom; 30.05.2014
comment
Суть полной ошибки здесь - person boretom; 30.05.2014
comment
Эта ошибка всегда возникает, когда нет связи между фоновым процессом и сценарием контента. Вы всегда перезагружаете вкладку после перезагрузки расширения и перед тем, как нажать кнопку действия браузера? - person Sławomir Kaczorowski; 30.05.2014
comment
Ты гений - перезагрузка страницы все исправила. Поэтому после установки расширения мне приходится перезагружать все веб-сайты, на которых я хочу его использовать. Ммммм, нужно подумать, как это сделать красиво. - person boretom; 30.05.2014
comment
Перезагрузка страницы не решила проблему для меня. Браузер все равно надо перезапускать и тогда все нормально работает.. Странно. - person SudoPlz; 12.02.2016