0

Я хочу, чтобы мое расширение Google начало выполнение, как только откроется окно Google Chrome. У меня есть следующий код в моем background.js:Почему кажется, что мое расширение Google начинает выполнение только тогда, когда я наблюдаю консоль фонового сценария

if (window.Notification) { 
    setInterval(function() { callAutomate(); }, 60000); 
} 

function callAutomate() { 
// Code to automate hello-hello.com 
} 

файл манифеста выглядит следующим образом -

{ 
    "name" : "Hello.co Extension", 
    "version" : "1.1", 
    "description" : "Say Hello", 
    "background" : 
    { 
     "scripts": ["background.js"], 
     "persistent": false 
    }, 
    "page_action" : 
    { 
     "default_icon" : "hello-19.png", 
     "default_title": "Hello World", 
     "default_popup": "popup.html" 
    }, 
    "content_scripts": [ 
     { 
     "matches": ["https://www.hellohello.com/*"],  
     "js": [ 
      "content.js", 
      "webDB.js" 
      ] 
     } 
    ], 
    "permissions": [ 
     "tabs", 
     "storage", 
     "unlimitedStorage", 
     "webNavigation", 
     "notifications", 
     "https://www.hellohello.com/" 
    ], 
    "options_page": "options.html", 
    "icons" : { 
     "48" : "hello-48.png", 
     "128" : "hello-128.png" 
    }, 
    "manifest_version": 2, 
    "web_accessible_resources": [ 
     "hello-48.png" 
    ] 
} 

Вот моя проблема callAutomate(); функция, кажется, вызвана только тогда, когда я наблюдаю за консольными журналами для background.js. Однако ожидаемое поведение расширения - вызов callAutomate(); функции каждую минуту с момента открытия окна Google Chrome.

Любая помощь с пояснительным кодом была бы высоко оценена.

ответ

3

Как объяснен в Chrome extension documentation, есть 2 типа фоновых страниц:

  • настойчивая страница фона: всегда «открыто»
  • событие фона страницы: «открытая и закрытый» по мере необходимости

Вы используете второй, как указано в "persistent": false в вашем файле manifest.json, , поэтому фоновый код не будет выполняться, когда вы обычно загружаете свою страницу.
И я уверен, что когда вы используете инструмент разработчика («наблюдая за консолью») на своей фоновой странице, страница «открыта» и не закрывается, пока консоль остается открытой.

Сняв "persistent": false, ваш код будет выполнен.

Но, как указано в документации, вы должны максимально использовать страницы событий, чтобы посмотреть на lifetime documentation, чтобы увидеть различные способы связи с вашей фоновой страницей и, таким образом, выполнить требуемый код.

+0

Большое спасибо, я ценю, что вы нашли время и объяснили мне это. – bluenile

2

Это из-за "persistent": false в манифесте.

Здесь описывается Event page, то есть страница Chrome может разгружаться по желанию, если она простаивает более чем на пару секунд, только отслеживая зарегистрированные обработчики событий.

Примечания для страниц событий явно указать:

Если расширение использует window.setTimeout() или window.setInterval(), переключиться на использование будильников API вместо. Таймеры, основанные на DOM, не будут отмечены, если страница событий отключится.

И если вы откроете окно Dev Tools для фоновой страницы, оно НЕ будет выгружено, что приведет к правильному выполнению вашего кода.


Вы можете переключиться на использование chrome.alarms API, но прежде чем это сделать, тщательно читать документацию страницы событий.Вы должны понимать все ограничения: например, поскольку страница выгружается, все локальное состояние в переменных теряется. Если вам нужно сохранить состояние, вам нужно использовать API хранения.

Если это слишком сложно для ваших целей, удалите "persistent": false, чтобы вернуться на обычную страницу фона.

+0

Я также благодарю вас за то, что вы нашли время и объяснили мои короткие приключения. – bluenile

Смежные вопросы