Передача сообщений расширения Chrome — как передать HTML

Я пытаюсь отправить HTML локально из расширения Chrome в div на активной вкладке. Я отправляю HTML через фоновый скрипт и получаю с помощью скрипта контента, введенного в активную вкладку.

Я заставил порт работать и протестировал различные простые текстовые сообщения. Раздел div также появляется, но он пустой, так как HTML не отправляется должным образом. Кто-нибудь знает, что не так с моим кодом?

фоновый скрипт:

chrome.runtime.onConnect.addListener(function(port) {
    console.assert(port.name == "sidebar");
    port.onMessage.addListener(function(msg) {
        if (msg.command == "read_sidebar")
        {
            //var sidebarURL = chrome.extension.getURL("sidebar.html");
            //console.log(sidebarURL);
            var element = document.createElement('div');
            element.id = "test";
            $("test").load('sidebar.html');
            port.postMessage({command: "load_sidebar", html: element.innerHTML})
        } 
        else if (msg.command == "close_load") {
            console.log("told to close load");
        } 
    });
});

скрипт контента:

function loadSidebar() {

    var port = chrome.runtime.connect({name: "sidebar"});
    port.postMessage({command: "read_sidebar"});
    port.onMessage.addListener(function(msg) {
        if (msg.command == "load_sidebar")
        {
            console.log(msg.html);
            document.getElementById("mySidebar").innerHTML= msg.html;
            port.postMessage({command: "close_load"});
        }
    });
}

person sandrasaur    schedule 24.10.2014    source источник


Ответы (1)


Этот API может отправлять только сериализуемые объекты JSON, а HTMLElement не сериализуем.

Вы можете попытаться добавить свой HTML-код в раздел web_accessible_resources манифеста:

  "web_accessible_resources" : [
    "sidebar.html",
    (any resources used by sidebar.html)
  ],

Затем вы можете напрямую загрузить файл из сценария содержимого, используя

chrome.runtime.getURL('sidebar.html')

как его URL.

Вы можете внедрить его как iframe или, если это статический HTML, вы можете запросить его с помощью XHR и манипулировать ответом.

person Xan    schedule 24.10.2014
comment
Хммм я вижу. Я пытаюсь не вводить его как iframe, так как боковая панель должна взаимодействовать с DOM страницы. Это не статический HTML (у html есть angularJS). Я не знаком с XHR. Какую документацию я могу прочитать, чтобы запросить с помощью XHR и манипулировать ответом? - person sandrasaur; 25.10.2014
comment
Ну, если вы не изолируете свою боковую панель от страницы, будут происходить всевозможные забавные вещи. Так что, возможно, вы захотите переосмыслить это. XHR означает XmlHttpRequest. Он может дать вам необработанный HTML-код, но он бесполезен напрямую, если он не статичен. - person Xan; 25.10.2014
comment
Хорошая точка зрения. Я сделал его iframe и успешно отобразил локальный файл html. Однако угловой код ломается. Я включил angular и все другие соответствующие скрипты в заголовок, но я вижу только простой HTML в iframe. Могут ли внедренные iframe использовать angularJS? - person sandrasaur; 25.10.2014
comment
Вы включили все это в web_accessible_resources? Не забудьте проверить консоль страницы, чтобы увидеть, что ломается (переключение контекста с ‹верхнего фрейма›) - person Xan; 25.10.2014
comment
Ага, все включено. Консоль продолжает выдавать ошибки в коде Angular, говоря, что он не распознан. - person sandrasaur; 25.10.2014
comment
Ну, я лично больше ничем помочь не могу; нет опыта работы с Angular, и это проблема, очень специфичная для вашего кода. - person Xan; 25.10.2014
comment
Спасибо за вашу помощь! - person sandrasaur; 25.10.2014
comment
Можно ли сериализовать массив URL-адресов JSON? - person sandrasaur; 25.10.2014
comment
Простой тест — запустить JSON.parse(JSON.stringify(data)) и посмотреть, сохранит ли он то, что вам нужно. Согласно определению стандарта, допустимы строки и числа, а также объекты и массивы любой глубины. - person Xan; 25.10.2014
comment
@Xan (любые ресурсы, используемые sidebar.html) не нужны. Ресурсы в sidebar.html не обязательно должны быть доступны в Интернете, чтобы их можно было использовать в расширении iframe. - person Rob W; 26.10.2014
comment
@RobW Круто, не знал этого. - person Xan; 26.10.2014