Может ли всплывающее окно chrome знать, открывается ли оно впервые? - PullRequest
1 голос
/ 01 марта 2020

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

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

Существует ли способ, позволяющий всплывающему окну узнать, открывается ли он в первый раз в текущем вкладка

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Я не эксперт, когда дело доходит до расширений браузера, поэтому у кого-то еще может быть лучшее решение, однако, возможно, вы могли бы сохранить идентификатор вкладки в localStorage или sessionStorage всякий раз, когда открываете всплывающее окно на вкладке, а затем всякий раз, когда вы открываете всплывающее окно, вы можете проверить, найден ли идентификатор в локальном хранилище / хранилище сеансов, чтобы узнать, был ли он уже открыт ранее?

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

Здесь вы можете увидеть, как получить идентификатор вкладки.

0 голосов
/ 19 марта 2020

Решение:

Отправить одноразовое сообщение из всплывающего скрипта при каждом его открытии:

const errString = "Could not establish connection. Receiving end does not exist.";

chrome.tabs.query({active: true}, (tabs) => {
    let tabId = tabs[0].id;

    chrome.tabs.sendMessage(tabId, {event: 'popup-ready'}, {}, (response) => {
        let lastError = chrome.runtime.lastError;

        if (lastError && lastError.message == errString) {
             // Content script not in place -> pop-up running for the first time.
             // Run content script...
        } else if (response.event == 'content-ready') {
             // Content script in place -> pop-up not running for the first time.
        }
} 

В скрипте содержимого необходимо создать обработчик для message событие:

chrome.runtime.onMessage.addListener((req, sender, sendResp) => {
    if (req.event && req.event === 'popup-ready') {
        sendResp({event: 'content-ready'});
    }
});
...