@Mercury13
Программист на «си с крестами» и не только

Почему не запускается browser action в расширении Firefox?

На известном сайте по ПДД есть достижение «пройти тест за 30 секунд». Достижение явно нечеловеческое, так и приглашают написать чит, так что я начал с малого: как эту штуку заставить работать. (Предыдущее достижение, тест за 1 минуту, прошёл сам и честно).

Исходный код.
manifest.js
{

  "manifest_version": 2,
  "name": "Green Way Cheat",
  "version": "1.0",
 
  "description": "A simple addon for cheating in green-way.com.ua",
  "icons": {
    "48": "icons/green-way-48.png"
  },

  "applications": {
    "gecko": {
      "id": "green-way-cheater@merc.com",
      "strict_min_version": "45.0"
    }
  },

  "permissions": [ "activeTab", "tabs" ],

  "browser_action": {
    "default_icon": "icons/green-way-48.png",
    "default_title": "Green Way Cheat"
  },
 
 "content_scripts": [
    {
      "matches": [ "https://green-way.com.ua/*" ],
      "js": [ "green-way.js" ]
    }
  ]

}
green-way.js
// Выполняется
document.body.style.border = "5px solid yellow";

// Что-то глючит
browser.browserAction.onClicked.addListener(() => {
	alert("Cheat!");
	document.body.style.border = "5px solid red";
});

// Не выполняется
document.body.style.border = "5px solid blue";


Кнопка не работает, всё, что после addListener , также не выполняется. Из примеров ничего не понятно. Нет разрешений?
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
@Mercury13 Автор вопроса
Программист на «си с крестами» и не только
Опять приходится отвечать самому. Разобрался, хотя мучился долго.

В браузерном расширении два скрипта: фоновый и контентный. Фоновый умеет работать с браузером и его окнами, контентный — со страницей. Единственный обмен между ними — сообщения.

Поскольку конкретно на этом сайте довольно много AJAX, начинающему JS’нику трудно обойтись одним контентным скриптом, так что пусть фоновый скрипт с браузерной панели инициирует жульничество, а контентный — вмешается в страницу. Делается это так.
manifest.json
{

  "manifest_version": 2,
  "name": "Green Way Cheat",
  "version": "1.0",
 
  "description": "A simple addon for cheating in green-way.com.ua",
  "icons": {
    "48": "icons/green-way-48.png"
  },
  
  "applications": {
    "gecko": {
      "id": "green-way-cheater@merc.com",
      "strict_min_version": "45.0"
    }
  },

  "permissions": [ "activeTab", "tabs" ],

  "browser_action": {
    "default_icon": "icons/green-way-48.png",
    "default_title": "Green Way Cheat"
  },
 
 "content_scripts": [
    {
      "matches": [ "https://green-way.com.ua/*" ],
      "js": [ "content.js" ]
    }
  ],
  
  "background": {
      "scripts": [ "bg.js" ]
  }

}
bg.js
function getActiveTab()
{
	return browser.tabs.query({active: true, currentWindow: true});
}

function cheatMain()
{
	getActiveTab().then((tabs) => {
		browser.tabs.sendMessage(tabs[0].id, { command: "cheat" } );
	});
}

browser.browserAction.onClicked.addListener(cheatMain);
content.js
function cheatHere()
{
	alert("Cheat!");
}

browser.runtime.onMessage.addListener(cheatHere);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы