Блокировка сайта на основе заголовка с помощью расширений Chrome - PullRequest
0 голосов
/ 15 февраля 2019

Я экспериментировал с расширениями Chrome, пытаясь создать такое, которое могло бы блокировать и перенаправлять веб-сайт в зависимости от его названия.В этом примере, когда заголовок любой веб-страницы имеет значение «Microsoft - официальная домашняя страница», я хочу, чтобы он перенаправлялся на https://example.com/.. Пример кода, который я привел ниже, почти работает, проблема в том, что мне нужно обновить страницув первый раз, когда я иду на него, иначе он не перенаправляет меня на example.com.Почему он не перенаправляет меня в первый раз, когда видит страницу с указанным заголовком без необходимости ее обновления, и что мне с этим делать?

background.js:

// Listens for a change to occur.
chrome.tabs.onUpdated.addListener(function() {

  // Gets the URL and title of the webpage in the selected tab.
  chrome.tabs.getSelected(function(tab) {
    var currentUrl = tab.url;
    var currentTitle = tab.title;

    // Tests if the page title is equal to the given string.
    if(currentTitle == "Microsoft - Official Home Page") {

      chrome.webRequest.onBeforeRequest.addListener(
        function() {
          return {redirectUrl: "https://example.com/"};
        },
        {urls: [currentUrl]}, // Blocks the URL of the current tab.
        ["blocking"]
      );

    }
  }
}

manifest.json:

{
  "name": "Test Extension",
  "version": "1.0",
  "description": "An extension to block sites by title.",
  "permissions": [
    "tabs",
    "tabCapture",
    "webRequest",
    "webRequestBlocking",
    "<all_urls>"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },
  "manifest_version": 2
}

1 Ответ

0 голосов
/ 15 февраля 2019

Проблемы:

  • Ваш код регистрирует нового слушателя webRequest в дополнение ко всем предыдущим каждый раз, когда условие заголовка выполнялось.
  • Слушатель webRequest работает на последующемнавигации, он не запускается сам по себе.
  • chrome.tabs.getSelected устарело и здесь вообще не нужно.

Решение:

Когда вкладкиназвание становится известным, слушатель onUpdated вызывается с параметром change, содержащим новое название.Если заголовок уже известен - например, когда вкладка перезагружается - для заголовка нет уведомления об изменении, но только для статуса (например, загрузка / завершение), поэтому вместо него мы используем tab.title.

Вот правильныйbackground.js:

chrome.tabs.onUpdated.addListener((tabId, change, tab) => {
  const title = 'title' in change ? change.title : tab.title;
  if (title === 'Microsoft - Official Home Page') {
    chrome.tabs.update(tabId, {url: 'https://example.com/'});
  }
});

Единственные разрешения manifest.json, необходимые для работы вышеуказанного:

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