Расширение Chrome - получение исходного сообщения Gmail

Я работаю над расширением для Chrome. Я хочу разобрать содержимое "оригинального" сообщения Gmail (просматриваемого в настоящее время сообщения).

Я знаком с программным образом нажатием Gmail 'show original " в хромовом расширении?. Но поскольку он не раскрывает много информации, его трудно понять.

Я попытался использовать jQuery.load() следующим образом

$(windows).load(function() { alert(GLOBALS); });

и поместите его в контент script, но он также не работает. Я использую инструменты разработчика Chrome, которые возвращают следующую ошибку при вызове alert(GLOBALS);

Uncaught ReferenceError: GLOBALS is not defined

хотя, используя консоль инструментов разработчиков, набрав в консоль GLOBALS, он возвращает массив. Любая подсказка, как можно программно читать содержимое исходного сообщения? или как получить доступ к GLOBALS из содержимого script?

Ответ 1

Скрипты содержимого работают в изолированной среде. Чтобы получить доступ к любым глобальным свойствам (страницы window), вам нужно либо ввести новый элемент <script>, либо использовать прослушиватели событий для передачи данных.

См. этот ответ, например, при введении элемента <script> в контексте страницы.

Пример

contentcript.js ("run_at": "document_end" в манифесте):

var s = document.createElement('script');
s.src = chrome.extension.getURL('script.js');
(document.head||document.documentElement).appendChild(s);
s.onload = function() {
    s.remove();
};

// Event listener
document.addEventListener('RW759_connectExtension', function(e) {
    // e.detail contains the transferred data (can be anything, ranging
    // from JavaScript objects to strings).
    // Do something, for example:
    alert(e.detail);
});

script.js. Находясь в каталоге расширения, он будет введен в саму страницу:

setTimeout(function() {
    /* Example: Send data from the page to your Chrome extension */
    document.dispatchEvent(new CustomEvent('RW759_connectExtension', {
        detail: GLOBALS // Some variable from Gmail.
    }));
}, 0);

Поскольку этот файл загружается с помощью URL-адреса chrome-extension из DOM, "script.js" должен быть добавлен в раздел web_accessible_resources файла манифеста. В противном случае Chrome откажется загружать файл script.

Вы должны использовать как можно меньше логики на веб-странице и обрабатывать большую часть своей логики в контенте script. Это имеет несколько причин. Прежде всего, любой script, введенный на странице, выполняется в том же контексте, что и веб-страница, поэтому веб-страница может (намеренно или непреднамеренно) изменять методы JavaScript/DOM таким образом, что ваше расширение перестает работать. Во-вторых, контент script имеет доступ к дополнительным функциям, таким ограниченным подмножеством хром. * API и кросс-начальным сетевым запросам (при условии, что расширение объявило разрешения для них).

Ответ 2

Более современное решение для связи между chrome extension content_script и javascript на странице будет состоять в использовании html5 postMessage API. Любые сообщения, отправленные в "окно", видны как из javascript на веб-странице, так и с расширением content_script.

Расширение content_script.js:

window.addEventListener('message', function(event) {
    console.log('content_script.js got message:', event);
    // check event.type and event.data
});

setTimeout(function () {
    console.log('cs sending message');
    window.postMessage({ type: 'content_script_type',
                         text: 'Hello from content_script.js!'},
                       '*' /* targetOrigin: any */ );
}, 1000);

javascript, запущенный на веб-странице:

window.addEventListener('message', function(event) {
    console.log('page javascript got message:', event);
});

setTimeout(function() {
    console.log('page javascript sending message');
    window.postMessage({ type: 'page_js_type',
                         text: "Hello from the page javascript!"},
                       '*' /* targetOrigin: any */);
}, 2000);

Также см. http://developer.chrome.com/extensions/content_scripts.html#host-page-communication

Ответ 3

Существует новый API для веб-страниц для безопасного и без каких-либо побочных эффектов (у window.postMessage могут быть другие слушатели!) до содержимого script.

"С веб-страницы используйте API-интерфейс runtime.sendMessage или runtime.connect для отправки сообщения конкретному приложению или расширению"

// The ID of the extension we want to talk to.
var editorExtensionId = "abcdefghijklmnoabcdefhijklmnoabc";

// Make a simple request:
chrome.runtime.sendMessage(editorExtensionId, {openUrlInEditor: url},
  function(response) {
    if (!response.success)
    handleError(url);
});

"Из вашего приложения или расширения вы можете прослушивать сообщения с веб-страниц через API-интерфейс runtime.onMessageExternal или runtime.onConnectExternal, аналогичный межсетевому обмену сообщениями. Только веб-страница может инициировать соединение. [...]"

(из http://developer.chrome.com/extensions/messaging.html) Это все еще доступно только в chrome dev-канале, но похоже, что он будет в следующей версии или около того.

Не спрашивайте меня, как это работает, это кажется очень запутанным. Как на самом деле chrome.runtime определяется на веб-странице? Что, если script уже определил эту переменную по какой-то причине? Я также не мог найти отчет об ошибке хрома, чтобы увидеть историю разработки этой функции.

Ответ 4

У меня был несколько иной подход, основанный на ваших доступных html-страницах расширения.

Добавьте свою страницу в манифест:

"web_accessible_resources": ["variables.html"]