Начните
с чтения документации.
В background.js:
в функции инициализации (банально отработает когда расширение будет загружено) Вы зануляете счетчики для сайтов где сообщения не были просмотрены и показаны 3 раза.
Делаете запрос за сайтами и обновляете storage, видимо по принципу: что в файле то и в БД, остальное удаляется.
Попутно вешаете таймер который будет раз в N грузить и обрабатывать данные.
Создаете порт коммуникации с контекстом, где ждете сообщения
- на инициализацию, на которое отвечаете надо ли что-то делать т.е. лезете в storage и проверяете есть ли там домен, сколько раз на него ходили. По итогу контекст делает свою работу.
- сообщение что сообщение отображено контекстом юзеру. Тут обновляете хранилище где увеличиваете счетчик показов.
- сообщение что юзер закрыл сообщение. Тут ставите что юзер просмотрел сообщение (в хранилище).
Создаете порт коммуникации с баблом (pupup же):
- сообщение на получение списка доменов из storage.
Бабл (popup):
По инициализации отправляет сообщение "хочу ссылки", строит тыкательный ul/li/a список, где по нажатию через tabs API вы открываете новую вкладку с ссылкой.
Контекст (context.js который грузится на сайты):
Грузите при document_end, подключаетесь к порту коммуникации и отправляете сообщение что такой-то домен загружен. В ответ ждете инструкции.
По получении ничего не делаете либо же отображаете нужное в DOM-сайта, по итогу сообщаете что сообщение показано и вешаете на кнопки ивент который сообщит в bg о том что уведомление отображено.
усё.
Документация:
-
alarms таймеры
-
run-time (обмен сообщениями, коммуникация)
-
хранилище storage
-
вкладки tabs