chrome.tabs.executeScript|insertCss срабатывает через раз

175
14 августа 2018, 03:00

Добавляю стили и скрипты на определенный сайт в background.

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
        console.log(tabId, changeInfo, tab);
        if(changeInfo.status === 'complete' && siteUrl.test(tab.url)) {
            insertCss(tab.id, '/css/bootstrap.min.css', function () {
                insertCss(tab.id, '/css/jquery.toast.min.css', function () {
                    insertCss(tab.id, '/css/content_style.css', function () {
                        executeScript(tab.id, '/js/utils/jquery-3.3.1.js', function () {
                            executeScript(tab.id, '/js/utils/js.cookie.js', function () {
                                executeScript(tab.id, '/js/utils/jquery.toast.min.js', function () {
                                    executeScript(tab.id, '/js/utils/sweetalert2.js', function () {
                                        executeScript(tab.id, '/js/core.js', function () {
                                            executeScript(tab.id, '/js/content_script.js', function () {
                                                console.warn('FILES INJECTION COMPLETE');
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    });
                });
            });
        }
    });

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

почему так?

Если писать в manifest.json content_scripts то тоже не всегда срабатывает. Бывает открывает страницу (не перезагружаешь) и ничего не грузится.

Answer 1

Полагаю все необходимые скрипты и стили грузятся локально, т.е. из дирректории расширения. В этом случае рекомендую собрать необходимые бандлы заранее и в правильном порядке, тогда у вас на выходе будет один CSS-файл и один JS.
Современные инструменты позволяют это выполнять автоматически при каждой сборке проекта. Это уменьшит вероятность ошибки и гарантирует всегда правильный порядок.

Как верно заметил Stepan Kasyanenko, более верный способ использовать manifest.json для подобной задачи.

От себя добавлю: обратите внимание на директиву run_at которая позволяет правильно определить время инжекта вашего кода на страницу.

READ ALSO
webpack 4 MiniCssExtractPlugin и webpack-merge

webpack 4 MiniCssExtractPlugin и webpack-merge

Пытаюсь настроить webpack4 , всё работает как надо, за исключением выноса стилей из js файлабез webpack-merge работает, с webpack-merge не видит файла

231
Log-out из сервера авторизации

Log-out из сервера авторизации

На Angular2 для OIDC/OAuth2 авторизации я использую "oidc-client-js" библиотекуСтандартно, для обновления токенов используется silent-refresh

158
javascript и несколько input text

javascript и несколько input text

Прошу помочь решить проблемуЕсть два поля ввода, которые затем формируют список

186