Opera 15+ Extension tabs.sendMessage仅在浏览器重启后才有效

时间:2014-05-29 20:23:29

标签: macos opera opera-extension

我重写了“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://*/*" ],
}],

...并且在chrome.browserAction.onClicked.addListener中的main.js中,将消息发送到内容脚本以请求页面标题&内容等。

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});
        }
    }
);

如上所述,它在浏览器重启后工作正常,但它不明白为什么没有它就无法工作。

有没有人有想法(我可能会补充一点,我在编程方面不够强大,而且设计中可能存在根本性缺陷)?

1 个答案:

答案 0 :(得分: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()});
        }
    }
 );