Доступ к NPAPI со страниц DOM - PullRequest
1 голос
/ 07 января 2011

Я пытаюсь переопределить функциональность по умолчанию для webkitNotifications.createNotification, и через расширение Chrome я могу добавить скрипт на страницах DOM, который это делает. У меня сейчас проблема в том, что мне нужен доступ к chrome.extension.sendRequest со страниц DOM, чтобы отправить мой запрос к NPAPI, встроенному в фоновую страницу. Ранее я выполнял рендеринг объекта embed на каждой странице во время выполнения сценария содержимого, но считаю, что он более эффективен (и безопасен), если NPAPI встроен в расширение, а не вставлено на каждую страницу.

if (window.webkitNotifications)
{
    (function()
    {
        window.webkitNotifications.originalCreateNotification = window.webkitNotifications.createNotification;
        window.webkitNotifications.createNotification = function (iconUrl, title, body) {
            var n = window.webkitNotifications.originalCreateNotification(iconUrl, title, body);
            n.original_show = n.show;
            n.show = function ()
            {
                console.log("Chrome object", chrome);
                console.log("Chrome.extension object", chrome.extension);
                chrome.extension.sendRequest({'title' : title, 'body' : body, 'icon' : iconUrl});
            }
            return n;
        }
    })();
}

Это то, что вводится в DOM как элемент скрипта. Фоновая страница выглядит следующим образом:

<embed type="application/x-npapiplugz" id="plugz">
<script>
var osd = document.getElementById('plugz');

function processReq(req, sender, callback)
{
    osd.notify(req.title, req.body, req.image);

    console.log("NOTIFY!", req.title, req.body, req.image);
};

chrome.extension.onRequest.addListener(processReq);
</script>

1 Ответ

1 голос
/ 08 января 2011

Как только ваше расширение включает в себя плагин NPAPI, оно перестает быть безопасным :) Но вы правильно сделали, вместо того, чтобы каждая страница имела доступ к плагину, лучше позволить вашему расширению иметь его. Я предполагаю, что вы знаете о свойстве "public", которое указывает, можно ли получить доступ к вашему плагину с обычных веб-страниц, по умолчанию установлено значение false.

Ниже я объясню, в чем ваша проблема, это не проблема доступа к NPAPI со страниц DOM, а в основном то, почему ваши уведомления не могут получить доступ к вашему скрипту контента или страницам расширения.

Как вы заметили, доступ к сценариям содержимого и страницам DOM изолирован друг от друга. Единственное, что они разделяют, это DOM. Если вы хотите, чтобы переопределение уведомлений связывалось с вашим скриптом контента, вы должны сделать это в общем DOM. Это объясняется в Связь со страницей встраивания в документации по сценариям содержимого.

Вы можете сделать это так, чтобы ваш контент-скрипт прослушивал такое событие для данных, поступающих из вашей DOM, что-то вроде следующего:

var exportEvent = document.createEvent('Event');
exportEvent.initEvent('notificationCallback', true, true);
window.webkitNotifications.createNotification = function (iconUrl, title, body) {
  var n = window.webkitNotifications.createNotification(iconUrl, title, body);
  n.show = function() {
    var data = JSON.stringify({title: title, body: body, icon: iconUrl});
    document.getElementById('transfer-dom-area').innerText = data;
    window.dispatchEvent(exportEvent);
  };
  return n;
}
window.webkitNotifications.createHTMLNotification = function (url) {
  var n = window.webkitNotifications.createHTMLNotification(url);
  n.show = function() {
    var data = JSON.stringify({'url' : url});
    document.getElementById('transfer-dom-area').innerText = data;
    window.dispatchEvent(exportEvent);
  };
  return n;
};

Тогда ваш слушатель событий может отправить это на фоновую страницу:

// Listen for that notification callback from your content script.
window.addEventListener('notificationCallback', function(e) {
  var transferObject = JSON.parse(transferDOM.innerText);
  chrome.extension.sendRequest({NotificationCallback: transferObject});
});

Я добавил это в свою суть на GitHub для всего расширения (https://gist.github.com/771033), На вашей фоновой странице вы можете вызвать свой плагин NPAPI.

Я надеюсь, что это поможет вам, я чувствую изящную идею из этого:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...