Chrome расширение: pageAction.onClicked нужно щелкнуть дважды - PullRequest
0 голосов
/ 05 апреля 2020

В настоящее время я работаю над расширением chrome, которое использует PageAction. Я хочу, чтобы PageAction вставлял скрипт и показывал всплывающее окно при нажатии. Я использую следующий код:

// Called when the user clicks on the page action.
chrome.pageAction.onClicked.addListener(function (tab) {
  chrome.pageAction.setPopup({ tabId: tab.id, popup: "popup.html" });
  chrome.pageAction.show(tab.id);
  // No tabs or host permissions needed!
  console.log(`We're on fire! Injecting script for ${tab.url}`);
  chrome.tabs.executeScript({
    file: 'js-libs/uuidv4.min.js'
  });
  chrome.tabs.executeScript({
    file: 'js-libs/loglevel.min.js'
  });
  chrome.tabs.executeScript({
    file: 'contentScript.js'
  });
});

Однако я сталкиваюсь со следующей проблемой: при первом щелчке скрипты внедряются (что подтверждается contentScript -логами), но всплывающее окно не не показывать Каждый следующий щелчок затем показывает popup.html, и сценарии, кажется, не вводятся снова.

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

1 Ответ

0 голосов
/ 05 апреля 2020

С помощью wOxxOm я смог найти решение. Наиболее важно отметить, что pageAction.onClicked срабатывает, только когда no default_popup указано в файле manifest.json или задано с помощью функции pageAction.setPopup (спасибо, wOxxOm!).

решение для popup.html всплывающих и внедренных сценариев контента состоит в том, чтобы внедрить скрипты контента из файла popup.js. Однако есть предостережение: popup.js выполняется при каждом открытии всплывающего окна, тогда как скрипт содержимого является постоянным (для контекста окна текущей вкладки). Чтобы избежать выполнения popup.js скрипта содержимого при каждом открытии popup.html, можно придерживаться следующего шаблона:

if (typeof scriptAlreadyExecuted === 'undefined') {
    // scriptAlreadyExecuted is undefined, therefore let's execute our content script
    var scriptAlreadyExecuted = true; // let's define this variable in window context to avoid re-executing the content script
    executeContentScript();
else {
    // scriptAlreadyExecuted in window range -> let's skip injecting script again.
    console.log("No need to execute script again. Skipping script execution.")
}

Альтернативой может быть расширение, отправляющее сообщение о том, что фоновый скрипт слушает, но это избавит от необходимости следить за тем, чтобы скрипт контента не выполнялся дважды.

Хорошей альтернативой может быть использование webNavigation.onCompleted -API в сочетании с фильтрами событий. - Я еще не пробовал это, так как я еще не узнал, как использовать CSS фильтры с этим (что легко с PageStateMatcher -API).

Надеюсь, это кому-нибудь поможет!

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