После прочтения
Расширения для Opera: Обмен сообщениями решил проверить.
Фоновый скрипт (index.html):
<!doctype html>
<html lang="en">
<head>
<script>
window.addEventListener('load', function(){
var button = opera.contexts.toolbar.createItem({ title: 'Send message', icon: 'icons/message.png' })
button.addEventListener('click', function(event) {
var tab = opera.extension.tabs.getFocused();
if (tab)
tab.postMessage({}); // можно попробовать и opera.extension.broadcastMessage({});
}, false);
opera.contexts.toolbar.addItem(button);
}, false);
</script>
</head>
<body>
</body>
</html>
Внелряемый скрипт:
(function () {
var storedLocation = '';
if (opera.extension !== undefined) {
opera.extension.onmessage = function(event){
opera.postError('got message: ' + storedLocation);
};
}
window.opera.addEventListener("BeforeEvent.DOMContentLoaded", function (event) {
storedLocation = window.location.href;
opera.postError('loaded: ' + storedLocation);
}, false);
})()
Первое, что я заметил — обработчик BeforeEvent.DOMContentLoaded при открытии новой страницы часто отрабатывает не один раз.
Очевидно, что причиной является iframe с рекламой.
Хорошо, но если мы сейчас кликнем кнопку, то… Сообщение получает фоновый скрипт с рекламой, а хотелось бы совсем другое.
Понятно, что использование для отправки broadcastMessage() «доставит» сообщение фоновому скрипту главной страницы, но его получать и скрипты с других вкладок.
Как решить проблему доставки сообщения скрипту на активной вкладке «основной» страницы?