13 September 2011

Chrome history API — Epic Fail

Google ChromeBrowser extensions
Chrome с момента своего рождения прошёл длинный и успешный путь, но так ли он хорош на самом деле? Не возьмусь утверждать о всех его гранях, но хочу попытаться привлечь внимание общественности к тем проблемам с которыми мне довелось столкнуться лично.

Несколько месяцев назад я решился на написание своего расширения для Хрома. В голове давно затаилась маленькая, но очень жгучая идея переделать страницу выдачи Истории chrome://history/. И вот что из этого получилось.


API для работы с историей описано здесь.

Для начала я добавил календарь на свою страницу и занялся получением списка адресов за произвольный день. Для этого предназначена функция chrome.history.search() где в качестве запроса надо передать объект содержащий:
&nbsp&nbsp&nbsptext — текст для поиска (если нужны все адреса этот текст передаётся пустым)
&nbsp&nbsp&nbspstartTime, endTime — временной промежуток
&nbsp&nbsp&nbspmaxResults — ограничитель количества результатов (0 для поиска всех)

В результате функция возвращает массив объектов
HistoryItem ( object )
&nbsp&nbsp&nbspid ( string )
&nbsp&nbsp&nbspurl ( optional string )
&nbsp&nbsp&nbsptitle ( optional string )
&nbsp&nbsp&nbsplastVisitTime ( optional number )
&nbsp&nbsp&nbspvisitCount ( optional integer )
&nbsp&nbsp&nbsptypedCount ( optional integer )

Где особое внимание заслуживает lastVisitTime , этот параметр содержит в себе время последнего посещения страницы. Т.е. если я пытался получить список адресов за промежуток времени с 1 сентября по 6 сентября 2011, и там содержался адрес http://example.com/, который я посещал последний раз, например, сегодня 9 сентября 2011, то параметр lastVisitTime всегда содержал сегодняшнюю дату, а в результатах выдачи получалась полнейшая несуразица наподобие этой:

image

Изначально я хотел показывать дату посещения адреса именно за нужный день, но из-за странностей API пришлось отображать время последнего визита. Данный недочёт не так критичен при просмотре истории за какой-то определенный день, но начинает доставлять огромный дискомфорт при просмотре истории за интервал времени.

Казалось бы на выручку приходит chrome.history.getVisits(), возвращающая массив объектов со всеми датами посещения URL, но вызывать её для каждого адреса слишком ресурсо-затратное дело. Поэтому я добавил кнопку информация о URL.
image

Следующим разочарованием стал поиск текста в адресах и заголовках истории. Что бы я не передавал в параметр text у объекта запроса, API Хрома мне старательно возвращало всё что угодно, но не то, что я пытался найти. Пришлось написать собственный разбор результатов.

Затем я занялся удалением элементов истории. Вы наверное уже догадались, что в очередной раз меня постигла неудача и как следствие множество костылей для достижения желаемых результатов.

Есть две функции:
chrome.history.deleteUrl() — для полного удаления адреса из истории.
chrome.history.deleteRange() — удаляет все адреса входящие в промежуток времени.

Недолго думая добавил кнопку «Удалить» возле каждого адреса и повесил на неё deleteUrl(). Но каждое нажатие вызывает 2-4 секундную задержку, а последовательная цепочка нажатий «Удалить» у разных URL может подвесить браузер на минуты. Логичным продолжением стало добавление корзины, но это всё равно не избавило от проблемы. Удаление 300-400 адресов подвешивает браузер минут на 10 (Intel Core 2 Duo E8400).

C deleteRange() вышло ещё печальней. В окошке «Информация о URL» (см. скриншот выше)я хотел добавить кнопку Удалить напротив каждого посещения, но как оказалось это бесполезная затея. Функция лишь в состоянии удалить информацию о последнем посещении.

Так же непонятно почему в HistoryItem ( object ) есть id для каждой записи, но нет функции позволяющей произвести удаление по id.

Когда расширение уже было выложено в паблик и успешно использовалось тысячами пользователей, моё внимание привлёк отзыв «Doesn't fix the problem of going farther back than 10 weeks in history…». выяснилось Хром очень ограниченно хранит историю посещений, что-то около 25 000 последних адресов. При моей интенсивности использования браузера на домашнем ПК это три последних месяца.

image

Все остальные URL тихо и незаметно для пользователя отправляются в /dev/null.

К чему это я всё написал? Скорее всего это порыв излить душу о наболевшем, а так же попытка объяснить пользователям (не только моего расширения) почему 300 адресов приходится удалять по 10 минут. Быть может кто из корпорации добра заинтересуется этой заметкой…

Вот ссылка на моё расширение:
History Calendar
History Calendar Button

Так же в репозитории Хрома есть два достойных конкурента аналога:
Recent History
History 2
Tags:google chromehistory apiextensionsрасширения
Hubs: Google Chrome Browser extensions
+23
9.4k 8
Comments 12
Popular right now
Machine Learning. Professional
November 26, 202048,000 ₽OTUS
Тренажер product-менеджера
November 26, 202028,900 ₽SkillFactory
SMM-менеджер
November 27, 202069,900 ₽Нетология