Здесь можно ответить на несколько вопросов.
Дословный вопрос
Так может ли кто-нибудь объяснить мне, почему что-то подобное не возможно?
var tabInfo = chrome.tabs.getCurrentTab();
Краткий ответ: потому что большая часть Chrome API не возвращает значение;это асинхронный , означающий, что какой-то другой компонент Chrome будет работать над получением ответа при возобновлении выполнения JS.
Подробный обзор асинхронности JS можно прочитать на этот канонический вопрос.
Есть два способа справиться с этим:
- Использовать обратные вызовы и знать, что фактическое выполнение обратного вызова происходит после остальной частикод вызова.
- Используйте
async
/ await
и / или Promises. WebExtension polyfill может помочь с этим, но это выходит за рамки вопроса.
Вопрос в заголовке
Самый простой способ получить текущийИдентификатор вкладки?
или «почему chrome.tabs.getCurrentTab
вам не поможет».
chrome.tabs.getCurrentTab()
возвращает идентификатор вкладки вызывающей страницы. См. документы .
Это ограниченная утилита: этот API может вызывать только страницы расширения (не скрипты содержимого).
Страницы расширения:
- фон (без идентификатора вкладки),
- всплывающее окно (без идентификатора вкладки), страница параметров
- (это сложно, поскольку она встроена в страницу Chrome),
- «другие» страницы расширения открываются в видимой вкладке (здесь она работает как положено).
Это не ваш вариант использования, как установлено в комментариях.
Фактический способполучите текущую активную вкладку chrome.tabs.query()
с запросом {active: true, currentWindow: true}
, но продолжайте чтение.
Фактический вопрос, который у вас есть
Как восстановлено из комменВот фактический сценарий, который у вас есть:
У меня есть событие в скрипте контента.Мне нужно позвонить по tabs.insertCSS
API , поэтому я отправляю фоновую страницу, чтобы сделать это для меня.Как мне получить tabId
для этого звонка?
Ну, вот ключ, чтобы поближе взглянуть на runtime.onMessage
прослушиватель событий подпись:
Параметром обратного вызова должна быть функция, которая выглядит следующим образом:
function(any message, MessageSender sender, function sendResponse) {...};
Что такое MessageSender ?
Объект, содержащий информацию о контексте скрипта, который отправил сообщение или запрос.
tabs.Tab
(необязательно) tab
Открывшийся tabs.Tab
соединение, если есть.Это свойство будет присутствовать только тогда, когда соединение было открыто с вкладки (включая скрипты содержимого), и только если получатель является расширением, а не приложением.
[...]
Джекпот. Мы отправляем сообщение из скрипта контента, и слушателю вручается информация sender.tab
«бесплатно».Нам просто нужно быстро пройтись по tabs
API документам , чтобы увидеть, что содержит Tab
, и у нас это есть:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
chrome.tabs.insertCSS(sender.tab.id, {/*...*/});
});
Заблуждение
Моя текущая проблема в том, что для функции insertCSS()
, похоже, требуется tabId
, даже если в официальной документации сказано, что ее необязательное
Это не так.Если вы называете его опущенным tabId, который делает объект details
первым аргументом, то Chrome будет считать, что вам нужна «активная вкладка текущего окна».
Может показаться, что это не такработать, если вы пытаетесь выполнить его в окне Dev Tools для фоновой страницы.Это потому, что в данном случае такой вкладки нет. В текущем окне вы вводите консольную команду. Так что то, что делает вызов без tabId, очень чувствительно к тому, что на самом деле является текущим окном.
Может также случиться так, что у вас нет прав на вставку в текущей активной вкладке, что также приведет к сбою.
Как правило, платят конкретно за идентификатор вкладки, это устраняет неопределенность в логике расширения.