Chrome расширение: фоновый скрипт не запускается, только после обновления - PullRequest
0 голосов
/ 26 мая 2020

Я начал с chrome продлений на три дня go, и мне это очень нравится. Я столкнулся с проблемой: я минимизировал скрипт, который воспроизводит мою проблему:

Если я нахожусь на stackoverflow.com, я могу щелкнуть значок, и откроется всплывающее окно с надписью «сработало», если оно отправило сообщение в фоновый скрипт и получил сообщение «работает».

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

Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

Я выяснил, что фоновый сценарий НЕ запущен (я не получать оповещений из фона. js или печатает в фоновом режиме. js консоль). Я полагаю, что расширение и, следовательно, фон. js, вероятно, не удалось запустить из-за chrome, поскольку это расширение в режиме разработчика. Единственный способ снова запустить расширение - обновить sh расширение из chrome: //extensions.

Я пробовал это с постоянным и непостоянным фоновым скриптом, но это не изменилось поведение.

Является ли мой анализ правильным и, следовательно, единственным решением для развертывания скрипта в интернет-магазине, чтобы он работал правильно? Или есть другой способ запустить приложение в режиме разработчика при запуске chrome?

Вот минимальный пример:

manifest. json

{
    "name": "BackgroundScript Error",
    "version": "0.0.1",
    "manifest_version": 2,
    "description": "When starting Chrome, background doesn't start, but when refreshing, background starts",
    "page_action": {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
    },
    "permissions": ["declarativeContent", "<all_urls>"],
    "background": {
        "scripts": ["background.js"],
        "persistent": false
    }
}

фон. js

chrome.runtime.onInstalled.addListener(function() {
    console.log('Background script is running');
    alert("Background is running");
    chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    chrome.declarativeContent.onPageChanged.addRules([{
        conditions: [new chrome.declarativeContent.PageStateMatcher({
            pageUrl: {hostEquals: 'stackoverflow.com'},
        })],
        actions: [new chrome.declarativeContent.ShowPageAction()]
    }]);
    });

    console.log('setting up connection to popup');
    chrome.runtime.onConnect.addListener(connected);
});


chrome.runtime.onMessage.addListener(function(request, sender) {
    console.log(request.action);
});

function connected(p) {
    console.log("connected to "+p);
    p.postMessage({action: 'didSomething', result: 'worked' });
    p.onDisconnect.addListener(disconnected);
}

function disconnected(p) {
    console.log("disconnected from "+p);
}

всплывающее окно. js

var myPort

function onWindowLoad() {
    var message = document.getElementById('message');

    myPort = chrome.runtime.connect({name:"port-from-cs"});
    myPort.postMessage({request: "doSomething"});
    myPort.onMessage.addListener(function(m) {
        console.log("In popup script, received message from background script: ");
        message.innerHTML = m.result;
    });
}

window.onload = onWindowLoad;

всплывающее окно. html

<!DOCTYPE html>
<html style=''>
    <head>
        <script src='popup.js' ></script>
    </head>
    <body>

        <div id="message">Popup</div>

    </body>
</html>

Спасибо!

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Нет, вам не нужно развертывать в интернет-магазине, чтобы заставить его работать.

У вас возникла проблема, потому что вы прикрепили большую часть фоновой активности скрипта к chrome.runtime.onInstalled слушателю - который срабатывает только при установке расширения или изменении версии манифеста. Когда вы перезапустили браузер во второй раз, ваше расширение уже установлено, версия манифеста остается той же, поэтому это событие не сработает.

0 голосов
/ 26 мая 2020

Я понял, что делать:

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

Я обнаружил ошибку ie Ладьи: я зарегистрировал слушателей асинхронно, как указано как НЕ ДЕЛАТЬ в документации Chrome . В деталях, эта строка должна go из установленного слушателя:

chrome.runtime.onConnect.addListener(connected);

спасибо, что указали мне в правильном направлении!

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