Коротка відповідь
Більшість методів керування вкладками не потребує дозволу tabs. Створення вкладки чи запит ID відрізняється від читання конфіденційних URL, заголовка, pending URL або favicon. Запитуйте tabs, відповідний доступ до хоста чи тимчасовий activeTab лише за потреби відповідної інформації чи операції.
Прив’яжіть дію до вкладки, вибраної під час виклику. Не запитуйте активну вкладку після довгого await, випадково діючи на новій сторінці. ID живе протягом сеансу, але документ може змінитися; прив’язаним до документа результатам потрібна сильніша ідентичність за сам номер.
Практичні кроки реалізації
- Визначте потрібну API-операцію замість доступу до всього простору назв.
tabs.createвідкриває звіт безtabs; заголовок сайту має правила конфіденційних властивостей. - Із вікна вибирайте
currentWindow, для загальної команди воркера розгляньтеlastFocusedWindow. Активна вкладка не обов’язково у вікні з фокусом. Перевірте придатний цілий ID. - Збережіть ID до асинхронної роботи. Для змін сторінки використовуйте ID документа чи запуску й перевірте відповідність відповіді. Нова активна вкладка не замінює закриту початкову ціль.
- Обробляйте відхилені API-проміси. Вкладка може закритися, перейти чи стати недоступною між запитом і дією. Покажіть відновлюваний стан «Відкрийте сторінку й повторіть».
- Вважайте URL введенням. Посилання сторінки не авторизує навігацію, завантаження чи передавання. Для відомого адресата використовуйте дозволений список, а заголовки показуйте текстом.
Явне дослідження на зразок Font Picker відповідає операції, прив’язаній до виклику. Не визначайте маніфест продукту з цього прикладу. Розрізняйте доступ знімка й DOM-впровадження: captureVisibleTab має власні правила та може з activeTab знімати деякі конфіденційні сторінки, де скрипти заборонені.
Приклад реалізації
Функція сторінки розширення знаходить поточну вкладку й надсилає обмежений запит уже встановленому контентному скрипту. Сам запит ID не потребує tabs; встановлення отримувача має власні вимоги доступу.
export async function readSelectionFromCurrentTab() {
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
if (!Number.isInteger(tab?.id) || tab.id < 0) throw new Error("No usable tab");
const tabId = tab.id;
const result = await chrome.tabs.sendMessage(tabId, { type: "selection/read" });
if (typeof result?.text !== "string" || result.text.length > 2000) {
throw new Error("Invalid selection response");
}
return { tabId, text: result.text };
}
Викликач має обробити відсутнього отримувача чи закриту вкладку та показати відмову в UI. Для операції документа використовуйте підтримуваний documentId або власний перевірений контракт запуску замість представлення простого ID вкладки як захисту від навігації.
Компроміси та альтернативи
Широкий tabs підтримує справжні менеджери вкладок, але відкриває конфіденційні метадані. Тимчасовий activeTab підходить явній роботі з однією сторінкою; вузькі хости — автоматичній роботі на відомих сайтах. Вибирайте за функцією, а не стартовим маніфестом.
Поширені помилки
- Додавати
tabsлише через наявність будь-якого методуchrome.tabs. - Повторно запитувати активну вкладку після затримки.
- Зберігати ID як постійну міжсеансову ідентичність запису.
- Вважати знімок доказом доступу впровадження скрипту.
Контрольний список випуску
- Доступ конфіденційних властивостей має пояснення функцією.
- Вибрана вкладка визначена до await.
- Закриття, навігація й відсутність отримувача оброблені.
- Результат документа не стає результатом іншої сторінки мовчки.
- Доступ знімка й впровадження перевірений окремо.
Поширені запитання
Чи доступний Tabs API контентному скрипту?
Ні. За потреби використайте вузьке повідомлення до сторінки розширення чи воркера.
Чому tab.url відсутній?
Може бракувати доступу до конфіденційної властивості, або вкладка ще не має підтвердженого URL. Не припускайте наявності в кожному об’єкті Tab.
Що перевірити далі?
Запускайте операцію під час перемикання чи закриття вкладок і підтвердьте відмову на початковій цілі замість дії на заміну.
Первинні джерела
Пов’язані посібники та приклади
Потрібно реалізувати це у вашому продукті?
Перегляньте відповідні приклади продуктів або поділіться контекстом розробки вебзастосунку, розширення Chrome, API чи SaaS.