Самый простой способ получить текущий идентификатор вкладки? - PullRequest
1 голос
/ 12 апреля 2019

Я не совсем понимаю, как работает Chrome Extension API.Было трудно понять, как работают background.js и content.js, но моя текущая проблема в том, что функция insertCSS ();похоже, что tabId нужен, даже если в официальной документации сказано, что он необязательный.

Итак, ни один из Ответов на этой платформе не может мне помочь, потому что я даже не понимаю Концепцию всего API.

Так может кто-нибудь объяснить мне, почему что-то подобное не возможно?

var tabInfo = chrome.tabs.getCurrentTab();

var id = tabInfo.tabId;

1 Ответ

1 голос
/ 13 апреля 2019

Здесь можно ответить на несколько вопросов.

Дословный вопрос

Так может ли кто-нибудь объяснить мне, почему что-то подобное не возможно?

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, очень чувствительно к тому, что на самом деле является текущим окном.

Может также случиться так, что у вас нет прав на вставку в текущей активной вкладке, что также приведет к сбою.

Как правило, платят конкретно за идентификатор вкладки, это устраняет неопределенность в логике расширения.

...