Chrome history API — Epic Fail

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

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


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

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

В результате функция возвращает массив объектов
HistoryItem ( object )
   id ( string )
   url ( optional string )
   title ( optional string )
   lastVisitTime ( optional number )
   visitCount ( optional integer )
   typedCount ( 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
Поделиться публикацией
Похожие публикации
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 12
  • +6
    lastVisitTime так и должен себя вести
    • +1
      Некоторые ограничения видимо в угоду быстродействию самого браузера.
      • 0
        habrastorage.org/storage1/d66c3bd7/0b637a85/d7fef89a/322c3106.jpg

        странный бажек 15.0.874.5 dev-m
        • 0
          Этот баг относится ко всей dev-ветке Хрома, а не к моему расширению лично.
        • 0
          А я люблю здесь смотреть www.google.com/history/
          • 0
            рано отправилось, естественно это не полноценная защита, но хотел бы чтоб туда синхронизировалось.
            • 0
              С этой задачей прекрасно справляется Google Web History Updater.
              • 0
                Да вот что-то он иногда не так как нужно работает. Те есть мелкие, но неприятные баги.
                Может написать свое расширение, гм…
                PS ну и вообще хочется чтоб этот функционал был вне расширения, тем более итак вся синхронизация выведена в облако.
          • +1
            Разбейте статью на отдельные тикеты на crbug.com/new
            • 0
              Не хватает Esc для закрытия «всплывающих» блоков =) А так круто, пощупаем.
              • 0
                Как-то и не пришло в голову. Добавлю.
              • 0
                в свое время отказался от вашего расширения из огромных лагов даже просто при открытии вкладки истории
                недавно поставил new history выглядит очень хорошо и вроде не лагает

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