В комментариях к статье о начале работы с TChromium спросили, как удалить в нем кукисы? Скажу сразу, решение не мое, нашла в свое время на СтэкОверфлоу, скопировала и с тех пор удачно использую.
Сначала надо отметить, что у интерфейса ICefCookieManager есть метод DeleteCookies, но он почему-то не работает. То есть в результате выполнения кода:
заведомо появится сообщение, что удаление кукисов провалилось. Не знаю, может, это только у меня так...
Решение же таково: надо обойти все хранящиеся кукисы с помощью VisitAllCookiesProc и внутри visitor-а установить их свойство deleteCookie равным True (1).
Тут ничего такого страшного нет:
name, value, domain, path, secure, httponly, hasExpires, creation, lastAccess, expires — это свойства объекта класса TCefCookie;
count — индекс "текущего" cookie;
total — общее количество кукисов;
deleteCookie — если установите True, то "текущий" кукис будет удален.
На старичке Delphi 7 синтаксис с function в качестве передаваемого параметра не прокатит, поэтому функцию следует вынести отдельно, а передавать ее по названию.
а в коде:
Есть, конечно, еще один теоретически возможный способ. Если вы устанавливаете место хранения кукисов принудительно с помощью SetStoragePath, то можно удалить все содержимое этой папки. :)
Чтобы быть в курсе обновлений блога, можно подписаться на RSS.
Сначала надо отметить, что у интерфейса 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.
А вот как настроить Proxy. Да еще и с авторизацией, да еще и для каждого созданного экземпляра
ОтветитьУдалитьЕвгений, я пока работу с прокси в Хромиуме не смотрела. По поводу "каждого созданного экземпляра" - у меня он один на форме, я его использую только для просмотра vk под определенным пользователем.
ОтветитьУдалить:) это был тонкий троллинг, я както пару дней просидел на форуме разработчиков в изучении этого вопроса, пока оно не реализовано, но вроде скоро обещают. На самом деле, хоть у TWebBrowsera есть свои проблемы, но пока хромиум сыроват. Конкретно с прокси я нашел решение тамже, через winAPI сплайсинг перехватывали функции настройки прокси и подсовывали свои, но тоже можно сделать и для TWebBrowserа.
ОтветитьУдалить:) пусть сыроват, но мне нравится. Тем более, раз "скоро обещают"... ;)
УдалитьА чем нравится? а то я вроде тоже чуствую что что-то есть в нем хорошее, а понять не могу (я имею ввиду в сравнении с IE).
ОтветитьУдалитьПо-моему, скорость загрузки страниц повыше (чисто субъективно, конечно). C кукисами в нем тоже удобнее работать (мне, по крайней мере), и с JavaScript. В общем, тоже еще в режиме тестирования.
УдалитьНу скорость может быть... Wininet поумолчанию может создавать 2 вроде одновременных соеденения для одного экземпляра, шаманствами в реестре можно увеличить до 10. В хроме возможно нет этих ограничений, но Я отключаю картинки, Объекты и тд и тп, поэтому в моих приложениях если только фреймов побольше то нужны паралельные соединения(а фреймов обычно в пределах 1-3 штук). А JavaScript по скорости примерно равный стал в IE10. А вот удобство работы со скриптами... Я почитал другой Ваш пост про заполение формы, с виду тотже Document.parentWindow.ExecScript, может я чего-то не знаю? А вот работа с DOM в хроме пока тихий ужас. А с FireMonkes не порбовали может TChromium можно как-то в IOS заюзать?
УдалитьЯ вообще отстала от жизни :) Так давно не пользовалась IE, что сравнить с 10-ой не могу.
УдалитьПо поводу работы с DOM — полностью согласна.
С FireMonkes вообще еще пока не доводилось работать (по причине, озвученной в первом предложении).
А как в TChromium добавить свои cookies?
ОтветитьУдалитьпробовал метод SetCookie у ICefCookieManager однако без результата...
Использую cef1, установить cef3 и проверить там, возможности нет...
А как вывести историю просмотров и загрузок TChromium'а?
ОтветитьУдалитьДоброе утро.
ОтветитьУдалитьПостоянно показывает ошибку
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. Код копирую Ваш.