Получение идентификатора вкладки "this" из содержимого script в расширении Chrome?

Из содержимого script можно ли получить доступ к этому идентификатору вкладки? Я хочу отправить сообщение на фоновое изображение из содержимого script, которое сообщает моему расширению "сделать что-то с этой вкладкой" с помощью chrome.tabs. * Api. Требуется TabID, и нет смысла делать кучу логики на странице фона для поиска TabID, когда мой контент script может просто указать ему TabID в содержимом сообщения.

Ответ 1

Идентификатор вкладки автоматически передается внутри MessageSender object:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    console.log("sent from tab.id=", sender.tab.id);
});

Ответ 2

Если вы используете порты для двусторонних долгоживущих подключений, вторым аргументом в обратном вызове является объект Port, поэтому для доступа к идентификатору табуляции:

chrome.runtime.onConnect.addListener(port => {
  if (port.name === "foo") {
    port.onMessage.addListener((msg, sendingPort) => {
      console.log("sent from tab.id=", sendingPort.sender.tab.id);
    });
  }
});

Ответ 3

Если вы хотите, чтобы tabId (в моем случае в Content Script) не требовал разрешения " tabs ", можно обойти это, если Content Script отправит фиктивное сообщение фоновому сценарию, а затем фоновый сценарий ответит sender.tab.id обратно. к скрипту содержимого!

например, в content.js:

chrome.runtime.sendMessage({ text: "what is my tab_id?" }, tabId => {
    console.log('My tabId is', tabId);
});

и в background.js:

chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
    if (msg.text == "what is my tab_id?") {
        sendResponse({tab: sender.tab.id});
    }
});

это глупый обходной путь, который работал для меня. :)

PS. О, если у вас есть разрешение на tabs вы можете очень легко выполнить этот асинхронный запрос:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    var myTabId = tabs[0].id;
    chrome.tabs.sendMessage(myTabId, {text: "hi"}, function(response) {
        alert(response);
    });
});

Ответ 4

Исправление выбранного ответа на сегодняшний день:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    console.log("sent from tab.id=", sender.id);
});