revol0ution
@revol0ution

Пересылка/обработка сообщений в расширениях Opera 11

После прочтения Расширения для 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() «доставит» сообщение фоновому скрипту главной страницы, но его получать и скрипты с других вкладок.



Как решить проблему доставки сообщения скрипту на активной вкладке «основной» страницы?
  • Вопрос задан
  • 3019 просмотров
Пригласить эксперта
Ответы на вопрос 2
@yolk
Как-то всё запутанно. Перед тем, как подписываться на событие BeforeEvent.DOMContentLoaded, проверяйте, что скрипт не в iframe.

if (window==window.top) { здесь не ифрейм }
Ответ написан
Комментировать
revol0ution
@revol0ution Автор вопроса
Спасибо, но это не совсем то.

Проблема в том, что, когда я отправляю сообщение активной вкладке, то его (в 99%) получает фоновый скрипт фрейма, а не основной страницы, как хотелось бы.

Я, вначале, думал, что это потому что фреймовый скрипт выполняется позже и именно он устанавливает свой callback. Но использование broadcastMessage() показывает, что отрабатывают оба обработчика.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы