Сценарий содержимого запущен для омнибокса - PullRequest
0 голосов
/ 27 марта 2012

Расширение My Chrome внедряет контент-скрипт на каждую страницу ("matches": ["http://*/*", "https://*/*"]).Сценарий содержимого отправит сообщение (chrome.extension.sendRequest) на фоновую страницу, а на фоновой странице регистрируется обработчик события:

chrome.extension.onRequest.addListener(
  function (request, sender, callback) {…}
);

Я заметил, что эти события запускаются, когда я начинаю печатать в омнибоксе- даже до того, как я нажму Enter, чтобы загрузить страницу назначения.

Сценарий:

  • Запустить Chrome
  • Начать вводить в омнибоксе.Фактически, как только омнибокс имеет фокус, запускается мой обработчик событий chrome.extension.onRequest.addListener() [background.html].

Странно то, что значение sender.tab.index равно -1,поэтому он не отображается на «реальную» вкладку.Кроме того, когда я продолжаю переключать фокус с омнибокса и обратно, события продолжают срабатывать.Каждый раз sender.tab.index равен -1, но sender.tab.id увеличивается на 2 (43, 45, 47,…).Это поведение легко воспроизводимо.

Затем, когда я на самом деле выбираю URL (скажем, example.com), нажимая Enter в омнибоксе, и страница загружается в браузере / вкладке, я получаю еще одно событие.На этот раз, однако, sender.tab.index неотрицателен - он представляет фактическую вкладку браузера, и мой обработчик скриптов контента может выполнять свою работу.

Это поведение - скрипт контента внедряется в «фантом»”Страница для действий омнибокса - известна, и документирована ли она где-нибудь?И как правильно обработать мой обработчик событий?Допустим, мой обработчик скриптов контента должен манипулировать веб-страницей.Должен ли я проверять sender.tab.index и выполнять эту работу, только если sender.tab.index != -1?

Ответы [ 3 ]

1 голос
/ 28 марта 2012

Не так много, как это происходит.Поведение ожидается с предварительно обработанными страницами, но это должно происходить гораздо реже.В этих случаях вы можете использовать API видимости страницы в вашем скрипте содержимого и не отправлять сообщение на фоновую страницу, если страница не видна.

Вы также должны отправить сообщение об ошибке отчет для большого количества "вкладок", в которые вставляется скрипт содержимого.

1 голос
/ 25 ноября 2013

Поведение, которое вы описываете, называется поиском «Chrome Instant» и включает в себя Chrome, который подготавливает невидимые вкладки результатов поиска, а затем заменяет их на видимые вкладки для более быстрого восприятия результатов поиска. Chrome также иногда «предварительно отображает» другие веб-страницы для более быстрой загрузки страниц.

Да, идентификатор вкладки -1 указывает, что эта вкладка в настоящее время является фантомной вкладкой (недоступна для пользователя).

Я еще не нашел подробной документации о фантомных (предварительно отрисованных) вкладках, но есть два события, которые происходят, когда Chrome заменяет обычную вкладку предварительно отрендеренной вкладкой, и в их документации упоминается предварительная отрисовка и Хром Мгновенное действие:

0 голосов
/ 27 марта 2012

API расширения Google не полностью задокументирован, и существует множество недокументированных вариантов поведения. Эти события, запускаемые из омнибокса, не новы и также не документированы.

Я рекомендую не вставлять скрипт контента автоматически, а делать это программно, как ответ на событие chrome.tabs.onUpdated.

http://code.google.com/chrome/extensions/tabs.html#event-onUpdated

Он будет срабатывать при изменении вкладки каждого URL. Вы должны прослушать его в своем background.html, а затем выполнить скрипт содержимого, используя chrome.tabs.executeScript.

http://code.google.com/chrome/extensions/tabs.html#method-executeScript

Таким образом, вы сможете проверить идентификатор и URL-адрес вкладки перед выполнением сценария содержимого.

Кстати, я предполагаю, что ваш шаблон совпадения http://* / *

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