В фоновом скрипте if / else не выполняется при нажатии расширения, а только после обновления распакованного расширения - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь загрузить фоновый скрипт (extension-starter.js), который содержит оператор if / else.Я сохраняю предпочтения пользователя по открытию расширения (всплывающее окно, новое окно, новая вкладка) в локальном хранилище.После открытия расширения я ожидаю, что оно извлечет сохраненное значение и откроет расширение соответствующим образом, но по какой-то причине при изменении предпочтения (например, из всплывающего окна на новую вкладку) щелчок значка расширения открывает расширение в предыдущем состоянии.Только после того, как я обновлю распакованное расширение, оно откроет приложение, как и ожидалось.

    // Here is the manifest.json...(took out unnecessary info)
    {
    "manifest_version": 2,
    "background": {
    "persistent": false,
    "scripts": ["extension-starter.js"]
    },
    "browser_action": {}
}
    // Here is the extension-starter.js...
    const extPrefer = localStorage.getItem('extensionPreference');

    if (extPrefer === null) {
    localStorage.setItem('extensionPreference', 'popup');
    }

    chrome.browserAction.onClicked.addListener(function () {
    if (extPrefer === 'window') {
        chrome.windows.create({url: chrome.runtime.getURL("index.html"), width: 500, height: 600});
    }
    else if (extPrefer === 'tab') {
        chrome.tabs.create({url:chrome.extension.getURL("index.html")});
    }
    else {
    chrome.browserAction.setPopup({
        popup: "index.html"
    });
    }
    })

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


ОБНОВЛЕНИЕ Вышеуказанная проблема вызвана chrome.browserAction.setPopup({popup: "index.html"});.После выполнения setPopup я не могу вернуться к настройкам окна или вкладки.Похоже, что setPopup устанавливается в манифесте и не может быть перезаписано при изменении предпочтения с всплывающего окна на вкладку или окно.

Обновленный вопрос: 1. Есть ли способ сделатьпротивоположность setPopup?2. Есть ли другой метод для setPopup?

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Хорошо, я понял это! Ниже я объясню основную проблему, а затем решение.

Выпуск

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

chrome.browserAction.setPopup({popup: "index.html"});.

Решение

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

Сначала , в функции обратного вызова метода chrome.browserAction.onClicked.addListener передается tab. chrome.browserAction.onClicked.addListener(function (tab) {

Второй , установите setPopup для выполнения на вкладке, выполнив следующие действия ... chrome.browserAction.setPopup({tabId: tab.id, popup: "index.html"});

Приведенное выше решение работает как шарм. Если что-то не понятно, пожалуйста, дайте мне знать! Спасибо JamesWasson за помощь!

0 голосов
/ 12 июня 2019

Пожалуйста, попробуйте это, скажите мне, как это происходит:

    if (localStorage.getItem('extensionPreference') === null) {
        localStorage.setItem('extensionPreference', 'popup');
    }

    chrome.browserAction.onClicked.addListener(function () {
        // move this inside the click function
        const extPrefer = localStorage.getItem('extensionPreference');

        if (extPrefer === 'window') {
            chrome.windows.create({ url: chrome.runtime.getURL("index.html"), width: 500, height: 600 });
        }
        else if (extPrefer === 'tab') {
            chrome.tabs.create({ url: chrome.extension.getURL("index.html") });
        }
        else {
            chrome.browserAction.setPopup({
                popup: "index.html"
            });
        }
    })
...