Вывести URL для текущей вкладки

Drylozav

Добрый День. Для тестового примера хочу попробовать вывести URL для текущей вкладки. Мой manifest.json

{
"manifest_version": 2,
"name": "Chrome Extension",
"description": "MyExtension",
"icons": {
    "16": "img/favicon.png",
    "48": "img/48.png"
},
"version": "0.1",
"background": {
    "scripts": ["js/content.js"],
    "persistent": false
},
"permissions": [
    "tabs", "https://*/*", "http://*/*"
],
"browser_action": {
    "default_icon": "img/default_icon.png",
    "default_title": "Get URL"
},
"content_scripts": [{
    "matches": ["<all_urls>"],
    "all_frames": true,
    "css": ["css/style.css"]
}],
    "short_name": "GetURL"
}
</all_urls>

Код в content.js

chrome.tabs.query({ active: true, lastFocusedWindow: true }, tabs => {
  alert(tabs[0].url);
});

Проблема в том, что URL выводится только для первой каждой текущей вкладки. Менял lastFocusedWindow на currentWindow но это проблему не решило. Подскажите, что делаю не так ?

1 ответ

Drylozav

Дело в том, что background скрипты живут в едином экземпляре, в фоне расширения.

Ваш скрипт стартует вместе с запуском расширения и в соответствии кодом тут же выводит активную вкладку.

Для того чтобы отслеживать переключение активных вкладок можно сделать так:

chrome.tabs.onActivated.addListener(function(activeInfo) {
    // можно получить детальное инфо по табу:
    chrome.tabs.get(activeInfo.tabId, function(tabInfo) {
         console.log(tabInfo.url);
    });
});

Обратите внимание, что во время возникновения этого события вкладка может не иметь URL. В таком случае поможет chrome.tabs.onUpdated

Еще рекомендую использовать имена вида content.js или content-script.js именно для content скриптов.

licensed under cc by-sa 3.0 with attribution.