У меня постоянно открыто несколько окон Chrome, в каждом из которых куча вкладок. В одном окне — десяток медленных аналитических запросов, которые я проверю «в любую минуту». В другом — мои исследования по $lookup и $unwind в MongoDB. В третьем — с наибольшим количеством вкладок — правила зачисления в местные школы, просто так, в жизни.
Конечно, появляется более срочная задача, и старые окна закрываются... только чтобы я через неделю возобновил исследование тех же тем, не в силах вспомнить, на чём остановился. Расширения для сохранения вкладок существуют уже давно, но в обзорах часто жалуются на потерю данных — так почему бы не создать своё собственное, специально разработанное для резервного копирования? У каждого пользователя Chrome уже есть аккаунт Google, обычно с включенной синхронизацией. А что если я просто буду сохранять вкладки там — без регистрации, без серверов, без подписок?
Демонстрация сохранения вкладок
В результате получилось приложение Tab Saver . Один клик — все вкладки сохранены и резервно скопированы в ваш аккаунт Google.
Использовать его очень просто:
// Сохранять
await browser.storage.sync.set({
myData: { tabs: [...], savedAt: new Date().toISOString() }
});
// Читать
const result = await browser.storage.sync.get('myData');
console.log(result.myData);
Как следует из названия, после выполнения команды browser.storage.sync ваши данные не только резервируются, но и волшебным образом появляются на других компьютерах, подключенных к той же учетной записи Google. Ограничения скромные, но достаточные для синхронизации вкладок: 100 КБ всего, до 512 клавиш, до 8 КБ на элемент.
Всё звучит замечательно, но есть подвох. Даже несколько подвохов.
Если вы удалите расширение — например, чтобы переустановить его — после переустановки ваши данные будут потеряны. Они будут удалены вместе с расширением. Chrome считает данные расширения принадлежащими расширению, а не пользователю. Удалите расширение — удалите данные. Всё, что вы можете сделать, это предупредить пользователей в пользовательском интерфейсе, что я и делаю. Или добавить экспорт/импорт и другие места для резервного копирования — это для второй версии.
const userInfo = await chrome.identity.getProfileUserInfo({
accountStatus: 'SYNC'
});
// Это лишь подтверждает, что полная синхронизация учетных записей включена.
Для синхронизации данных расширения требуются настройки синхронизации учетной записи Google.
В Chrome Web Store это отображается как «Прочитать ваш адрес электронной почты». Это не очень хорошо. Расширению для резервного копирования вкладок ваш адрес электронной почты вообще не нужен, но без этого разрешения невозможно проверить статус синхронизации и убедиться, что мои вкладки резервно копируются.
API для этого не существует:
Конечно, появляется более срочная задача, и старые окна закрываются... только чтобы я через неделю возобновил исследование тех же тем, не в силах вспомнить, на чём остановился. Расширения для сохранения вкладок существуют уже давно, но в обзорах часто жалуются на потерю данных — так почему бы не создать своё собственное, специально разработанное для резервного копирования? У каждого пользователя Chrome уже есть аккаунт Google, обычно с включенной синхронизацией. А что если я просто буду сохранять вкладки там — без регистрации, без серверов, без подписок?
Демонстрация сохранения вкладок
В результате получилось приложение Tab Saver . Один клик — все вкладки сохранены и резервно скопированы в ваш аккаунт Google.
storage.sync
Chrome предоставляет расширения с API chrome.storage.sync — хранилищем, которое автоматически синхронизируется во всех браузерах, где пользователь авторизован в одной и той же учетной записи Google.Использовать его очень просто:
// Сохранять
await browser.storage.sync.set({
myData: { tabs: [...], savedAt: new Date().toISOString() }
});
// Читать
const result = await browser.storage.sync.get('myData');
console.log(result.myData);
Как следует из названия, после выполнения команды browser.storage.sync ваши данные не только резервируются, но и волшебным образом появляются на других компьютерах, подключенных к той же учетной записи Google. Ограничения скромные, но достаточные для синхронизации вкладок: 100 КБ всего, до 512 клавиш, до 8 КБ на элемент.
Всё звучит замечательно, но есть подвох. Даже несколько подвохов.
Подвох 1: "Синхронизация" не означает "резервное копирование".
Самый неприятный сюрприз: при удалении расширения Chrome удаляет ВСЕ данные storage.sync .Если вы удалите расширение — например, чтобы переустановить его — после переустановки ваши данные будут потеряны. Они будут удалены вместе с расширением. Chrome считает данные расширения принадлежащими расширению, а не пользователю. Удалите расширение — удалите данные. Всё, что вы можете сделать, это предупредить пользователей в пользовательском интерфейсе, что я и делаю. Или добавить экспорт/импорт и другие места для резервного копирования — это для второй версии.
Подвох 2: API идентификации предоставляет неточную информацию.
Для синхронизации данных с облаком Google пользователь должен быть авторизован и иметь включенную либо полную синхронизацию учетной записи, либо синхронизацию отдельных приложений . К сожалению, API Identity в Chrome показывает только наличие включенной полной синхронизации учетной записи. Что ж, это можно точно отобразить только в пользовательском интерфейсе.const userInfo = await chrome.identity.getProfileUserInfo({
accountStatus: 'SYNC'
});
// Это лишь подтверждает, что полная синхронизация учетных записей включена.
Для синхронизации данных расширения требуются настройки синхронизации учетной записи Google.
Подвох 3: Для проверки статуса необходим доступ к электронной почте.
Для вызова метода chrome.identity.getProfileUserInfo() расширению требуется разрешение identity.email.В Chrome Web Store это отображается как «Прочитать ваш адрес электронной почты». Это не очень хорошо. Расширению для резервного копирования вкладок ваш адрес электронной почты вообще не нужен, но без этого разрешения невозможно проверить статус синхронизации и убедиться, что мои вкладки резервно копируются.
Подвох 4: Нет подтверждения того, что данные действительно синхронизировались.
Метод storage.sync.set() возвращает Promise, который разрешается, когда данные записываются локально. После этого остается только надеяться, что они действительно попали в облако, или проверять, когда они появятся в Chrome на другом вашем ноутбуке. Конечно, синхронизация нескольких URL-адресов вкладок занимает всего несколько секунд по офисному Wi-Fi, но точно это узнать невозможно.API для этого не существует:
- Данные синхронизированы.
- Когда произошла синхронизация
- Были ли ошибки синхронизации?
Лучшие моменты
- Нет серверов — нет бэкэнда, который нужно поддерживать.
- Аутентификация не требуется — пользователь уже авторизован в Chrome.
- Бесплатно — данные размещает Google.
- Кроссплатформенное приложение — работает на всех устройствах с Chrome.