Поиск по блогу

суббота, 9 февраля 2013 г.

Как удалить кукисы (cookies) в TChromium

В комментариях к статье о начале работы с TChromium спросили, как удалить в нем кукисы? Скажу сразу, решение не мое, нашла в свое время на СтэкОверфлоу, скопировала и с тех пор удачно использую.

Сначала надо отметить, что у интерфейса ICefCookieManager есть метод DeleteCookies, но он почему-то не работает. То есть в результате выполнения кода:

procedure TfrmMain.btnDeleteCookiesClick(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  if not CookieManager.DeleteCookies('', '') then
    ShowMessage('Кукисы не удалены!');
end;

заведомо появится сообщение, что удаление кукисов провалилось. Не знаю, может, это только у меня так...

Решение же таково: надо обойти все хранящиеся кукисы с помощью VisitAllCookiesProc и внутри visitor-а установить их свойство deleteCookie равным True (1).

procedure TfrmMain.btnDeleteCookiesClick(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  CookieManager.VisitAllCookiesProc(
    function(const name, value, domain, path: ustring; secure, httponly,
      hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
      count, total: Integer; out deleteCookie: Boolean): Boolean
    begin
      deleteCookie := True;
      ShowMessage('Кукисы для домена ' + domain + ' удалены!');
    end
  );
end;


Тут ничего такого страшного нет:
name, value, domain, path, secure, httponly, hasExpires, creation, lastAccess, expires — это свойства объекта класса TCefCookie;
count — индекс "текущего" cookie;
total — общее количество кукисов;
deleteCookie — если установите True, то "текущий" кукис будет удален.

На старичке Delphi 7 синтаксис с function в качестве передаваемого параметра не прокатит, поэтому функцию следует вынести отдельно, а передавать ее по названию.

function VisitCookie(const name, value, domain, path: ustring; secure, httponly,
  hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
  count, total: Integer; out deleteCookie: Boolean): Boolean;
begin
  deleteCookie := True;
  // frmMain.Memo.Lines.Add('Кукисы для домена ' + domain + ' удалены!');
end;

а в коде:
procedure TfrmMain.btnDeleteCookiesClick(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.Global;
  CookieManager.VisitAllCookiesProc(VisitCookie);
end;

Есть, конечно, еще один теоретически возможный способ. Если вы устанавливаете место хранения кукисов принудительно с помощью SetStoragePath, то можно удалить все содержимое этой папки. :)

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Статьи схожей тематики:



11 комментариев:

  1. А вот как настроить Proxy. Да еще и с авторизацией, да еще и для каждого созданного экземпляра

    ОтветитьУдалить
  2. Евгений, я пока работу с прокси в Хромиуме не смотрела. По поводу "каждого созданного экземпляра" - у меня он один на форме, я его использую только для просмотра vk под определенным пользователем.

    ОтветитьУдалить
  3. :) это был тонкий троллинг, я както пару дней просидел на форуме разработчиков в изучении этого вопроса, пока оно не реализовано, но вроде скоро обещают. На самом деле, хоть у TWebBrowsera есть свои проблемы, но пока хромиум сыроват. Конкретно с прокси я нашел решение тамже, через winAPI сплайсинг перехватывали функции настройки прокси и подсовывали свои, но тоже можно сделать и для TWebBrowserа.

    ОтветитьУдалить
    Ответы
    1. :) пусть сыроват, но мне нравится. Тем более, раз "скоро обещают"... ;)

      Удалить
  4. А чем нравится? а то я вроде тоже чуствую что что-то есть в нем хорошее, а понять не могу (я имею ввиду в сравнении с IE).

    ОтветитьУдалить
    Ответы
    1. По-моему, скорость загрузки страниц повыше (чисто субъективно, конечно). C кукисами в нем тоже удобнее работать (мне, по крайней мере), и с JavaScript. В общем, тоже еще в режиме тестирования.

      Удалить
    2. Ну скорость может быть... Wininet поумолчанию может создавать 2 вроде одновременных соеденения для одного экземпляра, шаманствами в реестре можно увеличить до 10. В хроме возможно нет этих ограничений, но Я отключаю картинки, Объекты и тд и тп, поэтому в моих приложениях если только фреймов побольше то нужны паралельные соединения(а фреймов обычно в пределах 1-3 штук). А JavaScript по скорости примерно равный стал в IE10. А вот удобство работы со скриптами... Я почитал другой Ваш пост про заполение формы, с виду тотже Document.parentWindow.ExecScript, может я чего-то не знаю? А вот работа с DOM в хроме пока тихий ужас. А с FireMonkes не порбовали может TChromium можно как-то в IOS заюзать?

      Удалить
    3. Я вообще отстала от жизни :) Так давно не пользовалась IE, что сравнить с 10-ой не могу.
      По поводу работы с DOM — полностью согласна.
      С FireMonkes вообще еще пока не доводилось работать (по причине, озвученной в первом предложении).

      Удалить
  5. А как в TChromium добавить свои cookies?
    пробовал метод SetCookie у ICefCookieManager однако без результата...
    Использую cef1, установить cef3 и проверить там, возможности нет...

    ОтветитьУдалить
  6. А как вывести историю просмотров и загрузок TChromium'а?

    ОтветитьУдалить
  7. Доброе утро.
    Постоянно показывает ошибку
    CookieManager := TCefCookieManagerRef.GetGlobalManager;

    [dcc32 Error] Unit1.pas(175): E2003 Undeclared identifier: 'GetGlobalManager'
    [dcc32 Error] Unit1.pas(176): E2035 Not enough actual parameters
    [dcc32 Error] Unit1.pas(184): E2035 Not enough actual parameters
    [dcc32 Fatal Error] SPvk.dpr(5): F2063 Could not compile used unit 'Unit1.pas'

    использую cef3. Код копирую Ваш.

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться