Как прослушать изменение URL с помощью расширения Chrome

Я пишу расширение Google Chrome для автоматизации некоторых общих задач. Я хочу использовать следующие функции:

  1. Создайте новую вкладку и перейдите к моей веб-почте
  2. введите имя пользователя и пароль
  3. нажмите кнопку "отправить"
  4. Подождите, пока появится страница веб-почты, и выберите клиент "roundcube".

Я выполнил шаги 1,2 и 3, и они работают. У меня возникли проблемы с попыткой прослушать изменение URL-адреса после отправки моих учетных данных, чтобы функция, которая выбирает клиента roundcube, может запускаться

Я знаю, что могу запускать скрипт, когда страница выбора клиента появляется, добавляя к моему манифесту, но вместо этого я хочу использовать "chrome.tabs.executeScript", чтобы roundcube был выбран, только если я запустил скрипт из расширения chrome, а не если я пойду на страницу выбора клиента вручную.

Вот мой manifest.json:

{
  "manifest_version": 2,

  "name"       : "Chrome Autobot",
  "description": "This extension will run various automation scripts for google chrome",
  "version"    : "1.0",

  "browser_action" : {
    "default_icon" : "icon.png",
    "default_popup": "index.html"
  },
  "permissions": [
    "activeTab",
    "webNavigation",
    "tabs",
    "http://*/*",
    "https://*/*"
  ]
}

Вот мой хром-скрипт:

jQuery(function($) {
    "Use Strict";

    var openWebmail = function() {
        chrome.tabs.create({
            url: 'http://mywebmaillogin.com:2095/'
        }, function() {
            chrome.tabs.executeScript(null, {file: "scripts/openEmail.js"});
        });
        chrome.tabs.onUpdated.addListener(function(){
            chrome.tabs.executeScript(null, {file: "scripts/openEmail.js"});
            alert('i work');
        });
    };

    var init = $('.script-init');
    init.on('click', function() {
        openWebmail();
    });

});

и здесь сценарий содержимого должен быть выполнен как обратный вызов создания табуляции (когда загружается страница входа в систему электронной почты и загружается DOM), а также после отправки учетных данных электронной почты и загрузки страницы выбора DOM (которая не является работая сейчас)

var openEmail = function() {
    var loc = window.location.href;
    if(loc === 'http://mywebmaillogin.com:2095/') {
        var submit = document.getElementById('login_submit');
        user.value = 'myusername';
        pass.value = 'mypassword';
        if(user.value === 'myusername' && pass.value === 'mypassword') {
            submit.click();
        }
        else {
            openEmail();
        }
    }
    if(loc.indexOf('http://mywebmaillogin:2095/') > -1 && loc.indexOf('login=1') > -1) {
        alert('I work');
    }
}()

любая помощь будет оценена... спасибо!

Ответы

Ответ 1

используйте chrome.tabs.onUpdated

Maifest.json

{
  "name": "My test extension",
  "version": "1",
  "manifest_version": 2,
  "background": {
    "scripts":["background.js"]
  },
  "content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "js": ["contentscript.js"]
    }
  ],
  "permissions": [
    "tabs"
  ]
}

contentscript.js

 chrome.tabs.onUpdated.addListener(
  function(tabId, changeInfo, tab) {
    window.console.log('updated from contentscript');
  }
);

background.js

    chrome.tabs.onUpdated.addListener(function() {
  alert('updated from background');
});

Ответ 2

Как упоминалось в NycCompSci, вы не можете вызвать chrome api из сценариев контента. Я смог передать данные api в скрипты содержания с передачей сообщений, поэтому подумал, что я поделюсь этим здесь. Первый вызов onUpdated в background.js:

манифест

{
  "name": "My test extension",
  "version": "1",
  "manifest_version": 2,
  "background": {
    "scripts":["background.js"]
  },
  "content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "js": ["contentscript.js"]
    }
  ],
  "permissions": [
    "tabs"
  ]
}

background.js

chrome.tabs.onUpdated.addListener(function
  (tabId, changeInfo, tab) {
    // read changeInfo data and do something with it (like read the url)
    if (changeInfo.url) {
      // do something here

    }
  }
);

Затем вы можете развернуть этот скрипт для отправки данных (включая новый url и другие chrome.tabs.onUpdated info) из background.js в ваш скрипт контента следующим образом:

background.js

chrome.tabs.onUpdated.addListener(
  function(tabId, changeInfo, tab) {
    // read changeInfo data and do something with it
    // like send the new url to contentscripts.js
    if (changeInfo.url) {
      chrome.tabs.sendMessage( tabId, {
        message: 'hello!',
        url: changeInfo.url
      })
    }
  }
);

Теперь вам просто нужно прослушать эти данные в вашем сценарии содержимого:

contentscript.js

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    // listen for messages sent from background.js
    if (request.message === 'hello!') {
      console.log(request.url) // new url is now in content scripts!
    }
});

Надеюсь, что кто-то поможет! ʘ‿ʘ