Инжектиран HTML за достъп до API на Chrome и глобални променливи

Работя върху разширение за Chrome и съм нов в процеса. Разширението, върху което работя, инжектира HTML странична лента в страницата, инжектира функции на java-script към заглавката, след което позволява на потребителя да натисне бутоните в страничната лента, за да създаде/запише данните на моето разширение.

Въпреки това, когато искам да запазя информацията, използвам localStorage, но localStorage винаги записва по отношение на текущия уебсайт. Как мога да използвам localStorage за запазване по отношение на нашето разширение?

Освен това бих искал да използвам някои глобални javascript променливи в разширението за chrome. Къде принадлежат тези? Знам, че в момента нямам достъп до тях от инжектирания Javascript.

Разгледах предаването на съобщения и имах проблеми с него. Не съм сигурен как работи в обхвата на инжектиран javascript в заглавката на страницата. Опитах се да работя с този пример, но разширението ми изглежда не улавя съобщението.

// This function is called in the injected header javascript.
function sendToExtension() {
    setTimeout(function() {
    console.log('page javascript sending message');
    window.postMessage({ type: 'page_js_type',
        text: "Hello from the page's javascript!"},
        '*' /* targetOrigin: any */);
    }, 10);
}

// This is installed in a background script.
window.addEventListener('message', function(event) {
    console.log('content_script.js got message:', event);
});

comment
Съвет: Използвайте chrome.storage вместо localStorage. Тъй като postMessage вече е асинхронен, вероятно няма да имате проблеми с промяната на вашия код.   -  person Rob W    schedule 30.03.2013
comment
Хм, бих разгледал това повече, тъй като изглежда като полезен API - но все още имам проблема, че инжектираният HTML не може да получи достъп до API на chrome.   -  person yellow    schedule 31.03.2013
comment
Поставили сте правилното решение в отговора си: Използвайте postMessage и onmessage.   -  person Rob W    schedule 31.03.2013


Отговори (1)


Трябва да използвате функцията sendMessage на Chrome и слушателя onMessage. Виж отдолу:

function sendToExtension() {
    console.log('Sending message');
    chrome.runtime.sendMessage({ext: "myExtension"}, function(response) {
      console.log(response.ack);
    });
}

// Listener - Put this in the background script to listen to all the events.
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.ext) {
        console.log('Message received from ' + request.ext);
        sendResponse({ack:'received'}); // This send a response message to the requestor
    }
});
person ricardohdz    schedule 30.03.2013
comment
Това е почти това, което търся, но sendToExtension се извиква от инжектиран HTML скрипт. Оттам не мога да осъществя достъп до API „chrome.runtime.sendMessage“. - person yellow; 31.03.2013
comment
Това, което в крайна сметка направих, беше преминаване от прозореца към скрипта за съдържание и след това от скрипта за съдържание към скрипта за фон. - person yellow; 07.04.2013