1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-04-27 07:02:21 +02:00

Added all TCefCookieManager functions to TChromium

- Added TChromium.VisitAllCookies
- Added TChromium.VisitURLCookies
- Added TChromium.SetCookie
- Added TChromium.OnCookiesVisited
- Added TChromium.OnCookieSet
- Removed unused constants.
- CookieVisitor demo adapted to the new TChromium functions and events.
This commit is contained in:
Salvador Díaz Fau 2019-10-29 16:13:35 +01:00
parent d8ea60d8fd
commit 2fe89069a4
16 changed files with 697 additions and 256 deletions

@ -14,7 +14,6 @@ object CookieVisitorFrm: TCookieVisitorFrm
Position = poScreenCenter Position = poScreenCenter
OnCloseQuery = FormCloseQuery OnCloseQuery = FormCloseQuery
OnCreate = FormCreate OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow OnShow = FormShow
PixelsPerInch = 96 PixelsPerInch = 96
TextHeight = 13 TextHeight = 13
@ -66,6 +65,8 @@ object CookieVisitorFrm: TCookieVisitorFrm
end end
object Chromium1: TChromium object Chromium1: TChromium
OnCookiesDeleted = Chromium1CookiesDeleted OnCookiesDeleted = Chromium1CookiesDeleted
OnCookiesVisited = Chromium1CookiesVisited
OnCookieSet = Chromium1CookieSet
OnBeforeContextMenu = Chromium1BeforeContextMenu OnBeforeContextMenu = Chromium1BeforeContextMenu
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup

@ -53,12 +53,14 @@ uses
uCEFCookieManager, uCEFCookieVisitor, uCEFWinControl, uCEFSentinel; uCEFCookieManager, uCEFCookieVisitor, uCEFWinControl, uCEFSentinel;
const const
MINIBROWSER_SHOWCOOKIES = WM_APP + $101; MINIBROWSER_SHOWCOOKIES = WM_APP + $101;
MINIBROWSER_SETCOOKIERSLT = WM_APP + $102; MINIBROWSER_COOKIESDELETED = WM_APP + $102;
MINIBROWSER_COOKIESET = WM_APP + $103;
MINIBROWSER_CONTEXTMENU_DELETECOOKIES = MENU_ID_USER_FIRST + 1; MINIBROWSER_CONTEXTMENU_DELETECOOKIES = MENU_ID_USER_FIRST + 1;
MINIBROWSER_CONTEXTMENU_GETCOOKIES = MENU_ID_USER_FIRST + 2; MINIBROWSER_CONTEXTMENU_GETCOOKIES = MENU_ID_USER_FIRST + 2;
MINIBROWSER_CONTEXTMENU_SETCOOKIE = MENU_ID_USER_FIRST + 3; MINIBROWSER_CONTEXTMENU_SETCOOKIE = MENU_ID_USER_FIRST + 3;
MINIBROWSER_CONTEXTMENU_GETGOOGLECOOKIES = MENU_ID_USER_FIRST + 4;
type type
TCookieVisitorFrm = class(TForm) TCookieVisitorFrm = class(TForm)
@ -82,7 +84,6 @@ type
procedure Chromium1CookiesDeleted(Sender: TObject; procedure Chromium1CookiesDeleted(Sender: TObject;
numDeleted: Integer); numDeleted: Integer);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject); procedure Timer1Timer(Sender: TObject);
procedure Chromium1BeforePopup(Sender: TObject; procedure Chromium1BeforePopup(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
@ -98,6 +99,12 @@ type
procedure Chromium1BeforeClose(Sender: TObject; procedure Chromium1BeforeClose(Sender: TObject;
const browser: ICefBrowser); const browser: ICefBrowser);
procedure CEFSentinel1Close(Sender: TObject); procedure CEFSentinel1Close(Sender: TObject);
procedure Chromium1CookiesVisited(Sender: TObject; const name_, value,
domain, path: ustring; secure, httponly, hasExpires: Boolean;
const creation, lastAccess, expires: TDateTime; count,
total, aID : Integer; var aDeleteCookie, aResult: Boolean);
procedure Chromium1CookieSet(Sender: TObject; aSuccess: Boolean;
aID: Integer);
private private
procedure WMMove(var aMessage : TWMMove); message WM_MOVE; procedure WMMove(var aMessage : TWMMove); message WM_MOVE;
@ -107,11 +114,11 @@ type
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY; procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure ShowCookiesMsg(var aMessage : TMessage); message MINIBROWSER_SHOWCOOKIES; procedure ShowCookiesMsg(var aMessage : TMessage); message MINIBROWSER_SHOWCOOKIES;
procedure SetCookieRsltMsg(var aMessage : TMessage); message MINIBROWSER_SETCOOKIERSLT; procedure CookiesDeletedMsg(var aMessage : TMessage); message MINIBROWSER_COOKIESDELETED;
procedure CookieSetMsg(var aMessage : TMessage); message MINIBROWSER_COOKIESET;
protected protected
FText : string; FText : string;
FVisitor : ICefCookieVisitor;
// Variables to control when can we destroy the form safely // Variables to control when can we destroy the form safely
FCanClose : boolean; // Set to True in TChromium.OnBeforeClose FCanClose : boolean; // Set to True in TChromium.OnBeforeClose
FClosing : boolean; // Set to True in the CloseQuery event. FClosing : boolean; // Set to True in the CloseQuery event.
@ -133,12 +140,17 @@ implementation
uses uses
uSimpleTextViewer, uCEFTask, uCEFMiscFunctions; uSimpleTextViewer, uCEFTask, uCEFMiscFunctions;
// This demo has a context menu to test the DeleteCookies function and a CookieVisitor example. // This demo has a context menu to test several TChromium functions related to cookies like TChromium.VisitAllCookies,
// TChromium.SetCookie, TChromium.DeleteCookies, etc.
// The cookie visitor gets the global cookie manager to call the VisitAllCookies function. // TChromium.VisitAllCookies and TChromium.VisitURLCookies trigger the TChromium.OnCookiesVisited event for each
// The cookie visitor will call CookieVisitorProc for each cookie and it'll save the information using the AddCookieInfo function. // cookie and it'll save the information using the AddCookieInfo function.
// When the last cookie arrives we show the information in a SimpleTextViewer form. // When the last cookie arrives we show the information in a SimpleTextViewer form.
// TChromium.SetCookie triggers TChromium.OnCookieSet when it has set the cookie.
// TChromium.DeleteCookies triggers TChromium.OnCookiesDeleted when the cookies have been deleted.
// Destruction steps // Destruction steps
// ================= // =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
@ -153,41 +165,6 @@ begin
//GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE;
end; end;
// This function is called in the IO thread.
function CookieVisitorProc(const name, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean;
const creation, lastAccess, expires: TDateTime;
count, total: Integer;
out deleteCookie: Boolean): Boolean;
var
TempCookie : TCookie;
begin
deleteCookie := False;
TempCookie.name := name;
TempCookie.value := value;
TempCookie.domain := domain;
TempCookie.path := path;
TempCookie.secure := secure;
TempCookie.httponly := httponly;
TempCookie.creation := creation;
TempCookie.last_access := lastAccess;
TempCookie.has_expires := hasExpires;
TempCookie.expires := expires;
CookieVisitorFrm.AddCookieInfo(TempCookie);
if (count = pred(total)) then
begin
if (CookieVisitorFrm <> nil) and CookieVisitorFrm.HandleAllocated then
PostMessage(CookieVisitorFrm.Handle, MINIBROWSER_SHOWCOOKIES, 0, 0);
Result := False;
end
else
Result := True;
end;
procedure TCookieVisitorFrm.AddCookieInfo(const aCookie : TCookie); procedure TCookieVisitorFrm.AddCookieInfo(const aCookie : TCookie);
begin begin
// This should be protected by a mutex. // This should be protected by a mutex.
@ -212,12 +189,17 @@ begin
SimpleTextViewerFrm.ShowModal; SimpleTextViewerFrm.ShowModal;
end; end;
procedure TCookieVisitorFrm.SetCookieRsltMsg(var aMessage : TMessage); procedure TCookieVisitorFrm.CookiesDeletedMsg(var aMessage : TMessage);
begin begin
if (aMessage.wParam = 0) then showmessage('Deleted cookies : ' + inttostr(aMessage.lParam));
showmessage('There was a problem setting the cookie') end;
procedure TCookieVisitorFrm.CookieSetMsg(var aMessage : TMessage);
begin
if (aMessage.wParam <> 0) then
showmessage('Cookie set successfully !')
else else
showmessage('Cookie set successfully !'); showmessage('There was a problem setting the cookie');
end; end;
procedure TCookieVisitorFrm.Timer1Timer(Sender: TObject); procedure TCookieVisitorFrm.Timer1Timer(Sender: TObject);
@ -253,10 +235,11 @@ procedure TCookieVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject;
const params: ICefContextMenuParams; const model: ICefMenuModel); const params: ICefContextMenuParams; const model: ICefMenuModel);
begin begin
model.AddSeparator; model.AddSeparator;
model.AddItem(MINIBROWSER_CONTEXTMENU_DELETECOOKIES, 'Delete cookies'); model.AddItem(MINIBROWSER_CONTEXTMENU_DELETECOOKIES, 'Delete cookies');
model.AddSeparator; model.AddSeparator;
model.AddItem(MINIBROWSER_CONTEXTMENU_GETCOOKIES, 'Visit cookies'); model.AddItem(MINIBROWSER_CONTEXTMENU_GETCOOKIES, 'Visit all cookies');
model.AddItem(MINIBROWSER_CONTEXTMENU_SETCOOKIE, 'Set cookie'); model.AddItem(MINIBROWSER_CONTEXTMENU_GETGOOGLECOOKIES, 'Visit cookies from Google');
model.AddItem(MINIBROWSER_CONTEXTMENU_SETCOOKIE, 'Set cookie');
end; end;
procedure TCookieVisitorFrm.Chromium1BeforePopup(Sender: TObject; procedure TCookieVisitorFrm.Chromium1BeforePopup(Sender: TObject;
@ -284,8 +267,6 @@ procedure TCookieVisitorFrm.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
eventFlags: Cardinal; out Result: Boolean); eventFlags: Cardinal; out Result: Boolean);
var
TempManager : ICefCookieManager;
begin begin
Result := False; Result := False;
@ -295,37 +276,73 @@ begin
MINIBROWSER_CONTEXTMENU_GETCOOKIES : MINIBROWSER_CONTEXTMENU_GETCOOKIES :
begin begin
// This should be protected by a mutex // This should be protected by a mutex
FText := ''; FText := '';
TempManager := TCefCookieManagerRef.Global(nil); Chromium1.VisitAllCookies;
TempManager.VisitAllCookies(FVisitor); end;
MINIBROWSER_CONTEXTMENU_GETGOOGLECOOKIES :
begin
// This should be protected by a mutex
FText := '';
Chromium1.VisitURLCookies('https://www.google.com');
end; end;
MINIBROWSER_CONTEXTMENU_SETCOOKIE : MINIBROWSER_CONTEXTMENU_SETCOOKIE :
begin Chromium1.SetCookie('https://www.example.com',
TempManager := TCefCookieManagerRef.Global(nil); 'example_cookie_name',
'1234',
if TempManager.SetCookie('https://www.example.com', '',
'example_cookie_name', '/',
'1234', True,
'', True,
'/', False,
True, now,
True, now,
False, now,
now, False);
now,
now,
nil) then
PostMessage(Handle, MINIBROWSER_SETCOOKIERSLT, ord(True), 0)
else
PostMessage(Handle, MINIBROWSER_SETCOOKIERSLT, ord(False), 0);
end;
end; end;
end; end;
procedure TCookieVisitorFrm.Chromium1CookiesDeleted(Sender: TObject; numDeleted: Integer); procedure TCookieVisitorFrm.Chromium1CookiesDeleted(Sender: TObject; numDeleted: Integer);
begin begin
showmessage('Deleted cookies : ' + inttostr(numDeleted)); PostMessage(Handle, MINIBROWSER_COOKIESDELETED, 0, numDeleted);
end;
procedure TCookieVisitorFrm.Chromium1CookieSet(Sender: TObject;
aSuccess: Boolean; aID: Integer);
begin
PostMessage(Handle, MINIBROWSER_COOKIESET, ord(aSuccess), aID);
end;
procedure TCookieVisitorFrm.Chromium1CookiesVisited(Sender: TObject;
const name_, value, domain, path: ustring; secure, httponly,
hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
count, total, aID: Integer; var aDeleteCookie, aResult: Boolean);
var
TempCookie : TCookie;
begin
aDeleteCookie := False;
TempCookie.name := name_;
TempCookie.value := value;
TempCookie.domain := domain;
TempCookie.path := path;
TempCookie.secure := secure;
TempCookie.httponly := httponly;
TempCookie.creation := creation;
TempCookie.last_access := lastAccess;
TempCookie.has_expires := hasExpires;
TempCookie.expires := expires;
AddCookieInfo(TempCookie);
if (count = pred(total)) then
begin
PostMessage(Handle, MINIBROWSER_SHOWCOOKIES, 0, 0);
aResult := False;
end
else
aResult := True;
end; end;
procedure TCookieVisitorFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure TCookieVisitorFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
@ -342,16 +359,10 @@ end;
procedure TCookieVisitorFrm.FormCreate(Sender: TObject); procedure TCookieVisitorFrm.FormCreate(Sender: TObject);
begin begin
FVisitor := TCefFastCookieVisitor.Create(CookieVisitorProc);
FCanClose := False; FCanClose := False;
FClosing := False; FClosing := False;
end; end;
procedure TCookieVisitorFrm.FormDestroy(Sender: TObject);
begin
FVisitor := nil;
end;
procedure TCookieVisitorFrm.FormShow(Sender: TObject); procedure TCookieVisitorFrm.FormShow(Sender: TObject);
begin begin
// GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser // GlobalCEFApp.GlobalContextInitialized has to be TRUE before creating any browser

@ -83,7 +83,7 @@
</Other> </Other>
</CompilerOptions> </CompilerOptions>
<Debugging> <Debugging>
<Exceptions Count="3"> <Exceptions Count="4">
<Item1> <Item1>
<Name Value="EAbort"/> <Name Value="EAbort"/>
</Item1> </Item1>
@ -93,6 +93,10 @@
<Item3> <Item3>
<Name Value="EFOpenError"/> <Name Value="EFOpenError"/>
</Item3> </Item3>
<Item4>
<Name Value="EThread"/>
<Enabled Value="False"/>
</Item4>
</Exceptions> </Exceptions>
</Debugging> </Debugging>
</CONFIG> </CONFIG>

@ -10,7 +10,7 @@
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<TopLine Value="40"/> <TopLine Value="40"/>
<CursorPos X="25" Y="74"/> <CursorPos X="25" Y="74"/>
<UsageCount Value="22"/> <UsageCount Value="24"/>
<Loaded Value="True"/> <Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="Delphi"/> <DefaultSyntaxHighlighter Value="Delphi"/>
</Unit0> </Unit0>
@ -22,9 +22,14 @@
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<IsVisibleTab Value="True"/> <IsVisibleTab Value="True"/>
<EditorIndex Value="1"/> <EditorIndex Value="1"/>
<TopLine Value="131"/> <TopLine Value="231"/>
<CursorPos X="82" Y="150"/> <CursorPos X="13" Y="235"/>
<UsageCount Value="22"/> <UsageCount Value="24"/>
<Bookmarks Count="3">
<Item0 Y="350" ID="1"/>
<Item1 X="3" Y="198" ID="2"/>
<Item2 X="66" Y="229" ID="3"/>
</Bookmarks>
<Loaded Value="True"/> <Loaded Value="True"/>
<LoadedDesigner Value="True"/> <LoadedDesigner Value="True"/>
<DefaultSyntaxHighlighter Value="Delphi"/> <DefaultSyntaxHighlighter Value="Delphi"/>
@ -37,73 +42,138 @@
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<EditorIndex Value="-1"/> <EditorIndex Value="-1"/>
<CursorPos X="8" Y="29"/> <CursorPos X="8" Y="29"/>
<UsageCount Value="22"/> <UsageCount Value="24"/>
<DefaultSyntaxHighlighter Value="Delphi"/> <DefaultSyntaxHighlighter Value="Delphi"/>
</Unit2> </Unit2>
<Unit3> <Unit3>
<Filename Value="C:\lazarus\lcl\interfaces\win32\win32object.inc"/> <Filename Value="C:\lazarus\lcl\interfaces\win32\win32object.inc"/>
<EditorIndex Value="-1"/> <EditorIndex Value="-1"/>
<TopLine Value="354"/> <TopLine Value="399"/>
<CursorPos Y="413"/> <CursorPos Y="413"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit3> </Unit3>
</Units> </Units>
<JumpHistory Count="14" HistoryIndex="13"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="CookieVisitor.lpr"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="252" Column="5" TopLine="249"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="CookieVisitor.lpr"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="50" Column="3" TopLine="32"/> <Caret Line="64" Column="35" TopLine="42"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="uCookieVisitor.pas"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="368" TopLine="335"/> <Caret Line="85" Column="41" TopLine="61"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="uCookieVisitor.pas"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="126" Column="8" TopLine="116"/> <Caret Line="356" Column="81" TopLine="334"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="CookieVisitor.lpr"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="74" TopLine="39"/> <Caret Line="223" TopLine="206"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="CookieVisitor.lpr"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="57" TopLine="39"/> <Caret Line="251" Column="70" TopLine="234"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="CookieVisitor.lpr"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="40" TopLine="40"/> <Caret Line="252" Column="3" TopLine="239"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="CookieVisitor.lpr"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="75" TopLine="40"/> <Caret Line="79" Column="67" TopLine="75"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="CookieVisitor.lpr"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="58" Column="31" TopLine="36"/> <Caret Line="352" Column="38" TopLine="336"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="uCookieVisitor.pas"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="86" Column="26" TopLine="72"/> <Caret Line="41" Column="100" TopLine="29"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="uCookieVisitor.pas"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="125" Column="11" TopLine="115"/> <Caret Line="99" Column="40" TopLine="71"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="uCookieVisitor.pas"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="149" Column="69" TopLine="139"/> <Caret Line="119" Column="15" TopLine="103"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="uCookieVisitor.pas"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="150" Column="58" TopLine="139"/> <Caret Line="191" Column="3" TopLine="182"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="uCookieVisitor.pas"/> <Filename Value="uCookieVisitor.pas"/>
<Caret Line="155" Column="58" TopLine="144"/> <Caret Line="339" Column="60" TopLine="324"/>
</Position14> </Position14>
<Position15>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="191" Column="62" TopLine="176"/>
</Position15>
<Position16>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="120" Column="67" TopLine="106"/>
</Position16>
<Position17>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="339" Column="31" TopLine="324"/>
</Position17>
<Position18>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="117" Column="84" TopLine="94"/>
</Position18>
<Position19>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="115" Column="96" TopLine="95"/>
</Position19>
<Position20>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="119" Column="87" TopLine="95"/>
</Position20>
<Position21>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="245" Column="11" TopLine="222"/>
</Position21>
<Position22>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="340" TopLine="325"/>
</Position22>
<Position23>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="339" Column="74" TopLine="325"/>
</Position23>
<Position24>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="216" Column="51" TopLine="202"/>
</Position24>
<Position25>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="340" Column="68" TopLine="326"/>
</Position25>
<Position26>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="121" Column="15" TopLine="109"/>
</Position26>
<Position27>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="198" Column="5" TopLine="190"/>
</Position27>
<Position28>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="221" Column="66" TopLine="208"/>
</Position28>
<Position29>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="198" Column="28" TopLine="178"/>
</Position29>
<Position30>
<Filename Value="uCookieVisitor.pas"/>
<Caret Line="83" Column="72" TopLine="75"/>
</Position30>
</JumpHistory> </JumpHistory>
<RunParams> <RunParams>
<FormatVersion Value="2"/> <FormatVersion Value="2"/>

@ -1,7 +1,7 @@
object CookieVisitorFrm: TCookieVisitorFrm object CookieVisitorFrm: TCookieVisitorFrm
Left = 183 Left = 449
Height = 762 Height = 762
Top = 77 Top = 101
Width = 884 Width = 884
Caption = 'Cookie Visitor' Caption = 'Cookie Visitor'
ClientHeight = 762 ClientHeight = 762
@ -59,6 +59,8 @@ object CookieVisitorFrm: TCookieVisitorFrm
end end
object Chromium1: TChromium object Chromium1: TChromium
OnCookiesDeleted = Chromium1CookiesDeleted OnCookiesDeleted = Chromium1CookiesDeleted
OnCookiesVisited = Chromium1CookiesVisited
OnCookieSet = Chromium1CookieSet
OnBeforeContextMenu = Chromium1BeforeContextMenu OnBeforeContextMenu = Chromium1BeforeContextMenu
OnContextMenuCommand = Chromium1ContextMenuCommand OnContextMenuCommand = Chromium1ContextMenuCommand
OnBeforePopup = Chromium1BeforePopup OnBeforePopup = Chromium1BeforePopup

@ -50,15 +50,17 @@ uses
Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
{$ENDIF} {$ENDIF}
uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants, uCEFChromium, uCEFWindowParent, uCEFInterfaces, uCEFApplication, uCEFTypes, uCEFConstants,
uCEFCookieManager, uCEFCookieVisitor, uCEFWinControl, uCEFSentinel; uCEFCookieManager, uCEFCookieVisitor, uCEFWinControl, uCEFSentinel, uCEFChromiumEvents;
const const
MINIBROWSER_SHOWCOOKIES = WM_APP + $101; MINIBROWSER_SHOWCOOKIES = WM_APP + $101;
MINIBROWSER_SETCOOKIERSLT = WM_APP + $102; MINIBROWSER_COOKIESDELETED = WM_APP + $102;
MINIBROWSER_COOKIESET = WM_APP + $103;
MINIBROWSER_CONTEXTMENU_DELETECOOKIES = MENU_ID_USER_FIRST + 1; MINIBROWSER_CONTEXTMENU_DELETECOOKIES = MENU_ID_USER_FIRST + 1;
MINIBROWSER_CONTEXTMENU_GETCOOKIES = MENU_ID_USER_FIRST + 2; MINIBROWSER_CONTEXTMENU_GETCOOKIES = MENU_ID_USER_FIRST + 2;
MINIBROWSER_CONTEXTMENU_SETCOOKIE = MENU_ID_USER_FIRST + 3; MINIBROWSER_CONTEXTMENU_SETCOOKIE = MENU_ID_USER_FIRST + 3;
MINIBROWSER_CONTEXTMENU_GETGOOGLECOOKIES = MENU_ID_USER_FIRST + 4;
type type
@ -74,6 +76,12 @@ type
Timer1: TTimer; Timer1: TTimer;
procedure CEFSentinel1Close(Sender: TObject); procedure CEFSentinel1Close(Sender: TObject);
procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser); procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
procedure Chromium1CookieSet(Sender: TObject; aSuccess: boolean;
aID: integer);
procedure Chromium1CookiesVisited(Sender: TObject; const name_, value,
domain, path: ustring; secure, httponly, hasExpires: Boolean;
const creation, lastAccess, expires: TDateTime; count, total, aID: Integer;
var aDeleteCookie, aResult: Boolean);
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
procedure GoBtnClick(Sender: TObject); procedure GoBtnClick(Sender: TObject);
procedure Chromium1BeforeContextMenu(Sender: TObject; procedure Chromium1BeforeContextMenu(Sender: TObject;
@ -110,11 +118,11 @@ type
procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED; procedure BrowserCreatedMsg(var aMessage : TMessage); message CEF_AFTERCREATED;
procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY; procedure BrowserDestroyMsg(var aMessage : TMessage); message CEF_DESTROY;
procedure ShowCookiesMsg(var aMessage : TMessage); message MINIBROWSER_SHOWCOOKIES; procedure ShowCookiesMsg(var aMessage : TMessage); message MINIBROWSER_SHOWCOOKIES;
procedure SetCookieRsltMsg(var aMessage : TMessage); message MINIBROWSER_SETCOOKIERSLT; procedure CookiesDeletedMsg(var aMessage : TMessage); message MINIBROWSER_COOKIESDELETED;
procedure CookieSetMsg(var aMessage : TMessage); message MINIBROWSER_COOKIESET;
protected protected
FText : string; FText : string;
FVisitor : ICefCookieVisitor;
// Variables to control when can we destroy the form safely // Variables to control when can we destroy the form safely
FCanClose : boolean; // Set to True in TChromium.OnBeforeClose FCanClose : boolean; // Set to True in TChromium.OnBeforeClose
FClosing : boolean; // Set to True in the CloseQuery event. FClosing : boolean; // Set to True in the CloseQuery event.
@ -136,12 +144,17 @@ implementation
uses uses
uSimpleTextViewer, uCEFTask, uCEFMiscFunctions; uSimpleTextViewer, uCEFTask, uCEFMiscFunctions;
// This demo has a context menu to test the DeleteCookies function and a CookieVisitor example. // This demo has a context menu to test several TChromium functions related to cookies like TChromium.VisitAllCookies,
// TChromium.SetCookie, TChromium.DeleteCookies, etc.
// The cookie visitor gets the global cookie manager to call the VisitAllCookies function. // TChromium.VisitAllCookies and TChromium.VisitURLCookies trigger the TChromium.OnCookiesVisited event for each
// The cookie visitor will call CookieVisitorProc for each cookie and it'll save the information using the AddCookieInfo function. // cookie and it'll save the information using the AddCookieInfo function.
// When the last cookie arrives we show the information in a SimpleTextViewer form. // When the last cookie arrives we show the information in a SimpleTextViewer form.
// TChromium.SetCookie triggers TChromium.OnCookieSet when it has set the cookie.
// TChromium.DeleteCookies triggers TChromium.OnCookiesDeleted when the cookies have been deleted.
// Destruction steps // Destruction steps
// ================= // =================
// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event. // 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
@ -156,41 +169,6 @@ begin
//GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE; //GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE;
end; end;
// This function is called in the IO thread.
function CookieVisitorProc(const name, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean;
const creation, lastAccess, expires: TDateTime;
count, total: Integer;
out deleteCookie: Boolean): Boolean;
var
TempCookie : TCookie;
begin
deleteCookie := False;
TempCookie.name := name;
TempCookie.value := value;
TempCookie.domain := domain;
TempCookie.path := path;
TempCookie.secure := secure;
TempCookie.httponly := httponly;
TempCookie.creation := creation;
TempCookie.last_access := lastAccess;
TempCookie.has_expires := hasExpires;
TempCookie.expires := expires;
CookieVisitorFrm.AddCookieInfo(TempCookie);
if (count = pred(total)) then
begin
if (CookieVisitorFrm <> nil) and CookieVisitorFrm.HandleAllocated then
PostMessage(CookieVisitorFrm.Handle, MINIBROWSER_SHOWCOOKIES, 0, 0);
Result := False;
end
else
Result := True;
end;
procedure TCookieVisitorFrm.AddCookieInfo(const aCookie : TCookie); procedure TCookieVisitorFrm.AddCookieInfo(const aCookie : TCookie);
begin begin
// This should be protected by a mutex. // This should be protected by a mutex.
@ -215,12 +193,17 @@ begin
SimpleTextViewerFrm.ShowModal; SimpleTextViewerFrm.ShowModal;
end; end;
procedure TCookieVisitorFrm.SetCookieRsltMsg(var aMessage : TMessage); procedure TCookieVisitorFrm.CookiesDeletedMsg(var aMessage : TMessage);
begin begin
if (aMessage.wParam = 0) then showmessage('Deleted cookies : ' + inttostr(aMessage.lParam));
showmessage('There was a problem setting the cookie') end;
procedure TCookieVisitorFrm.CookieSetMsg(var aMessage : TMessage);
begin
if (aMessage.wParam <> 0) then
showmessage('Cookie set successfully !')
else else
showmessage('Cookie set successfully !'); showmessage('There was a problem setting the cookie');
end; end;
procedure TCookieVisitorFrm.Timer1Timer(Sender: TObject); procedure TCookieVisitorFrm.Timer1Timer(Sender: TObject);
@ -240,6 +223,43 @@ begin
PostMessage(Handle, CEF_AFTERCREATED, 0, 0); PostMessage(Handle, CEF_AFTERCREATED, 0, 0);
end; end;
procedure TCookieVisitorFrm.Chromium1CookieSet(Sender: TObject;
aSuccess: boolean; aID: integer);
begin
PostMessage(Handle, MINIBROWSER_COOKIESET, ord(aSuccess), aID);
end;
procedure TCookieVisitorFrm.Chromium1CookiesVisited(Sender: TObject;
const name_, value, domain, path: ustring; secure, httponly,
hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count,
total, aID: Integer; var aDeleteCookie, aResult: Boolean);
var
TempCookie : TCookie;
begin
aDeleteCookie := False;
TempCookie.name := name_;
TempCookie.value := value;
TempCookie.domain := domain;
TempCookie.path := path;
TempCookie.secure := secure;
TempCookie.httponly := httponly;
TempCookie.creation := creation;
TempCookie.last_access := lastAccess;
TempCookie.has_expires := hasExpires;
TempCookie.expires := expires;
AddCookieInfo(TempCookie);
if (count = pred(total)) then
begin
PostMessage(Handle, MINIBROWSER_SHOWCOOKIES, 0, 0);
aResult := False;
end
else
aResult := True;
end;
procedure TCookieVisitorFrm.CEFSentinel1Close(Sender: TObject); procedure TCookieVisitorFrm.CEFSentinel1Close(Sender: TObject);
begin begin
FCanClose := True; FCanClose := True;
@ -256,10 +276,11 @@ procedure TCookieVisitorFrm.Chromium1BeforeContextMenu(Sender: TObject;
const params: ICefContextMenuParams; const model: ICefMenuModel); const params: ICefContextMenuParams; const model: ICefMenuModel);
begin begin
model.AddSeparator; model.AddSeparator;
model.AddItem(MINIBROWSER_CONTEXTMENU_DELETECOOKIES, 'Delete cookies'); model.AddItem(MINIBROWSER_CONTEXTMENU_DELETECOOKIES, 'Delete cookies');
model.AddSeparator; model.AddSeparator;
model.AddItem(MINIBROWSER_CONTEXTMENU_GETCOOKIES, 'Visit cookies'); model.AddItem(MINIBROWSER_CONTEXTMENU_GETCOOKIES, 'Visit all cookies');
model.AddItem(MINIBROWSER_CONTEXTMENU_SETCOOKIE, 'Set cookie'); model.AddItem(MINIBROWSER_CONTEXTMENU_GETGOOGLECOOKIES, 'Visit cookies from Google');
model.AddItem(MINIBROWSER_CONTEXTMENU_SETCOOKIE, 'Set cookie');
end; end;
procedure TCookieVisitorFrm.Chromium1BeforePopup(Sender: TObject; procedure TCookieVisitorFrm.Chromium1BeforePopup(Sender: TObject;
@ -287,8 +308,6 @@ procedure TCookieVisitorFrm.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer; const params: ICefContextMenuParams; commandId: Integer;
eventFlags: Cardinal; out Result: Boolean); eventFlags: Cardinal; out Result: Boolean);
var
TempManager : ICefCookieManager;
begin begin
Result := False; Result := False;
@ -298,37 +317,36 @@ begin
MINIBROWSER_CONTEXTMENU_GETCOOKIES : MINIBROWSER_CONTEXTMENU_GETCOOKIES :
begin begin
// This should be protected by a mutex // This should be protected by a mutex
FText := ''; FText := '';
TempManager := TCefCookieManagerRef.Global(nil); Chromium1.VisitAllCookies;
TempManager.VisitAllCookies(FVisitor); end;
MINIBROWSER_CONTEXTMENU_GETGOOGLECOOKIES :
begin
// This should be protected by a mutex
FText := '';
Chromium1.VisitURLCookies('https://www.google.com');
end; end;
MINIBROWSER_CONTEXTMENU_SETCOOKIE : MINIBROWSER_CONTEXTMENU_SETCOOKIE :
begin Chromium1.SetCookie('https://www.example.com',
TempManager := TCefCookieManagerRef.Global(nil); 'example_cookie_name',
'1234',
if TempManager.SetCookie('https://www.example.com', '',
'example_cookie_name', '/',
'1234', True,
'', True,
'/', False,
True, now,
True, now,
False, now,
now, False);
now,
now,
nil) then
PostMessage(Handle, MINIBROWSER_SETCOOKIERSLT, ord(True), 0)
else
PostMessage(Handle, MINIBROWSER_SETCOOKIERSLT, ord(False), 0);
end;
end; end;
end; end;
procedure TCookieVisitorFrm.Chromium1CookiesDeleted(Sender: TObject; numDeleted: Integer); procedure TCookieVisitorFrm.Chromium1CookiesDeleted(Sender: TObject; numDeleted: Integer);
begin begin
showmessage('Deleted cookies : ' + inttostr(numDeleted)); PostMessage(Handle, MINIBROWSER_COOKIESDELETED, 0, numDeleted);
end; end;
procedure TCookieVisitorFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure TCookieVisitorFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
@ -345,14 +363,13 @@ end;
procedure TCookieVisitorFrm.FormCreate(Sender: TObject); procedure TCookieVisitorFrm.FormCreate(Sender: TObject);
begin begin
FVisitor := TCefFastCookieVisitor.Create(CookieVisitorProc);
FCanClose := False; FCanClose := False;
FClosing := False; FClosing := False;
end; end;
procedure TCookieVisitorFrm.FormDestroy(Sender: TObject); procedure TCookieVisitorFrm.FormDestroy(Sender: TObject);
begin begin
FVisitor := nil;
end; end;
procedure TCookieVisitorFrm.FormShow(Sender: TObject); procedure TCookieVisitorFrm.FormShow(Sender: TObject);

@ -20,7 +20,6 @@
<ComponentName Value="MainForm"/> <ComponentName Value="MainForm"/>
<HasResources Value="True"/> <HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="1"/> <EditorIndex Value="1"/>
<TopLine Value="128"/> <TopLine Value="128"/>
<CursorPos X="58" Y="152"/> <CursorPos X="58" Y="152"/>
@ -38,7 +37,7 @@
<ComponentName Value="ChildForm"/> <ComponentName Value="ChildForm"/>
<HasResources Value="True"/> <HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<EditorIndex Value="2"/> <EditorIndex Value="3"/>
<TopLine Value="52"/> <TopLine Value="52"/>
<CursorPos X="54" Y="97"/> <CursorPos X="54" Y="97"/>
<UsageCount Value="23"/> <UsageCount Value="23"/>
@ -55,10 +54,12 @@
</Unit3> </Unit3>
<Unit4> <Unit4>
<Filename Value="..\..\..\source\uCEFChromium.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<EditorIndex Value="-1"/> <IsVisibleTab Value="True"/>
<TopLine Value="1009"/> <EditorIndex Value="2"/>
<CursorPos X="9" Y="1022"/> <TopLine Value="2395"/>
<CursorPos X="3" Y="2406"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit4> </Unit4>
<Unit5> <Unit5>
<Filename Value="..\..\..\source\uCEFMiscFunctions.pas"/> <Filename Value="..\..\..\source\uCEFMiscFunctions.pas"/>
@ -86,123 +87,123 @@
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="344" Column="17" TopLine="320"/> <Caret Line="346" Column="58" TopLine="320"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="346" Column="19" TopLine="322"/> <Caret Line="337" TopLine="320"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="197" Column="72" TopLine="182"/> <Caret Line="184" Column="66" TopLine="175"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="352" Column="56" TopLine="322"/> <Caret Line="337" Column="30" TopLine="322"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="332" TopLine="310"/> <Caret Line="67" TopLine="49"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="334" Column="51" TopLine="310"/> <Caret Line="180" Column="40" TopLine="166"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="67" TopLine="49"/> <Caret Line="335" Column="59" TopLine="309"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="340" TopLine="311"/> <Caret Line="333" Column="40" TopLine="309"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="337" TopLine="311"/> <Caret Line="332" TopLine="309"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="343" Column="33" TopLine="314"/> <Caret Line="339" TopLine="309"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="337" TopLine="314"/> <Caret Line="188" Column="99" TopLine="177"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="346" Column="58" TopLine="320"/> <Caret Line="343" Column="19" TopLine="333"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="337" TopLine="320"/> <Caret Line="69" TopLine="52"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="184" Column="66" TopLine="175"/> <Caret Line="336" TopLine="321"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="337" Column="30" TopLine="322"/> <Caret Line="335" TopLine="320"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="67" TopLine="49"/> <Caret Line="330" Column="32" TopLine="320"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="180" Column="40" TopLine="166"/> <Caret Line="67" TopLine="49"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="335" Column="59" TopLine="309"/> <Caret Line="328" Column="59" TopLine="313"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="333" Column="40" TopLine="309"/> <Caret Line="335" Column="59" TopLine="315"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="uMainForm.pas"/> <Filename Value="uMainForm.pas"/>
<Caret Line="332" TopLine="309"/> <Caret Line="152" Column="58" TopLine="128"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="339" TopLine="309"/> <Caret Line="507" Column="42" TopLine="495"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="188" Column="99" TopLine="177"/> <Caret Line="582" Column="55" TopLine="568"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="343" Column="19" TopLine="333"/> <Caret Line="507" Column="44" TopLine="495"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="69" TopLine="52"/> <Caret Line="582" Column="29" TopLine="568"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="336" TopLine="321"/> <Caret Line="2406" Column="3" TopLine="2395"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="335" TopLine="320"/> <Caret Line="582" Column="45" TopLine="569"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="330" Column="32" TopLine="320"/> <Caret Line="2415" Column="68" TopLine="2395"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="67" TopLine="49"/> <Caret Line="507" Column="19" TopLine="497"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="328" Column="59" TopLine="313"/> <Caret Line="3423" Column="60" TopLine="3410"/>
</Position29> </Position29>
<Position30> <Position30>
<Filename Value="uMainForm.pas"/> <Filename Value="..\..\..\source\uCEFChromium.pas"/>
<Caret Line="335" Column="59" TopLine="315"/> <Caret Line="582" Column="19" TopLine="564"/>
</Position30> </Position30>
</JumpHistory> </JumpHistory>
<RunParams> <RunParams>

@ -253,6 +253,8 @@ type
FOnHttpAuthCredentialsCleared : TNotifyEvent; FOnHttpAuthCredentialsCleared : TNotifyEvent;
FOnAllConnectionsClosed : TNotifyEvent; FOnAllConnectionsClosed : TNotifyEvent;
FOnExecuteTaskOnCefThread : TOnExecuteTaskOnCefThread; FOnExecuteTaskOnCefThread : TOnExecuteTaskOnCefThread;
FOnCookiesVisited : TOnCookiesVisited;
FOnCookieSet : TOnCookieSet;
{$IFNDEF FPC} {$IFNDEF FPC}
FOnBrowserCompMsg : TOnCompMsgEvent; FOnBrowserCompMsg : TOnCompMsgEvent;
FOnWidgetCompMsg : TOnCompMsgEvent; FOnWidgetCompMsg : TOnCompMsgEvent;
@ -502,6 +504,8 @@ type
procedure doHttpAuthCredentialsCleared; virtual; procedure doHttpAuthCredentialsCleared; virtual;
procedure doAllConnectionsClosed; virtual; procedure doAllConnectionsClosed; virtual;
procedure doOnExecuteTaskOnCefThread(aTaskID : cardinal); virtual; procedure doOnExecuteTaskOnCefThread(aTaskID : cardinal); virtual;
procedure doOnCookiesVisited(const name_, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total, aID : Integer; var aDeleteCookie, aResult : Boolean); virtual;
procedure doOnCookieSet(aSuccess : boolean; aID : integer); virtual;
function MustCreateLoadHandler : boolean; virtual; function MustCreateLoadHandler : boolean; virtual;
function MustCreateFocusHandler : boolean; virtual; function MustCreateFocusHandler : boolean; virtual;
function MustCreateContextMenuHandler : boolean; virtual; function MustCreateContextMenuHandler : boolean; virtual;
@ -549,8 +553,6 @@ type
procedure DownloadImage(const imageUrl: ustring; isFavicon: Boolean; maxImageSize: cardinal; bypassCache: Boolean); procedure DownloadImage(const imageUrl: ustring; isFavicon: Boolean; maxImageSize: cardinal; bypassCache: Boolean);
procedure SimulateMouseWheel(aDeltaX, aDeltaY : integer); procedure SimulateMouseWheel(aDeltaX, aDeltaY : integer);
function DeleteCookies(const url : ustring = ''; const cookieName : ustring = '') : boolean;
function FlushCookieStore(aFlushImmediately : boolean = True) : boolean;
function ClearCertificateExceptions(aClearImmediately : boolean = True) : boolean; function ClearCertificateExceptions(aClearImmediately : boolean = True) : boolean;
function ClearHttpAuthCredentials(aClearImmediately : boolean = True) : boolean; function ClearHttpAuthCredentials(aClearImmediately : boolean = True) : boolean;
function CloseAllConnections(aCloseImmediately : boolean = True) : boolean; function CloseAllConnections(aCloseImmediately : boolean = True) : boolean;
@ -574,6 +576,12 @@ type
function IsSameBrowser(const aBrowser : ICefBrowser) : boolean; function IsSameBrowser(const aBrowser : ICefBrowser) : boolean;
function ExecuteTaskOnCefThread(aCefThreadId : TCefThreadId; aTaskID : cardinal; aDelayMs : Int64 = 0) : boolean; function ExecuteTaskOnCefThread(aCefThreadId : TCefThreadId; aTaskID : cardinal; aDelayMs : Int64 = 0) : boolean;
function DeleteCookies(const url : ustring = ''; const cookieName : ustring = '') : boolean;
function VisitAllCookies(aID : integer = 0) : boolean;
function VisitURLCookies(const url : ustring; includeHttpOnly : boolean = False; aID : integer = 0) : boolean;
function SetCookie(const url, name_, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; aSetImmediately : boolean = True; aID : integer = 0): Boolean;
function FlushCookieStore(aFlushImmediately : boolean = True) : boolean;
procedure ShowDevTools(inspectElementAt: TPoint; const aDevTools : TWinControl); procedure ShowDevTools(inspectElementAt: TPoint; const aDevTools : TWinControl);
procedure CloseDevTools(const aDevTools : TWinControl = nil); procedure CloseDevTools(const aDevTools : TWinControl = nil);
@ -719,6 +727,8 @@ type
property OnHttpAuthCredentialsCleared : TNotifyEvent read FOnHttpAuthCredentialsCleared write FOnHttpAuthCredentialsCleared; property OnHttpAuthCredentialsCleared : TNotifyEvent read FOnHttpAuthCredentialsCleared write FOnHttpAuthCredentialsCleared;
property OnAllConnectionsClosed : TNotifyEvent read FOnAllConnectionsClosed write FOnAllConnectionsClosed; property OnAllConnectionsClosed : TNotifyEvent read FOnAllConnectionsClosed write FOnAllConnectionsClosed;
property OnExecuteTaskOnCefThread : TOnExecuteTaskOnCefThread read FOnExecuteTaskOnCefThread write FOnExecuteTaskOnCefThread; property OnExecuteTaskOnCefThread : TOnExecuteTaskOnCefThread read FOnExecuteTaskOnCefThread write FOnExecuteTaskOnCefThread;
property OnCookiesVisited : TOnCookiesVisited read FOnCookiesVisited write FOnCookiesVisited;
property OnCookieSet : TOnCookieSet read FOnCookieSet write FOnCookieSet;
{$IFNDEF FPC} {$IFNDEF FPC}
property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg; property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg;
property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg; property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg;
@ -877,7 +887,7 @@ uses
uCEFApplication, uCEFProcessMessage, uCEFRequestContext, {$IFNDEF FPC}uCEFOLEDragAndDrop,{$ENDIF} uCEFApplication, uCEFProcessMessage, uCEFRequestContext, {$IFNDEF FPC}uCEFOLEDragAndDrop,{$ENDIF}
uCEFPDFPrintCallback, uCEFResolveCallback, uCEFDeleteCookiesCallback, uCEFStringVisitor, uCEFPDFPrintCallback, uCEFResolveCallback, uCEFDeleteCookiesCallback, uCEFStringVisitor,
uCEFListValue, uCEFNavigationEntryVisitor, uCEFDownloadImageCallBack, uCEFCookieManager, uCEFListValue, uCEFNavigationEntryVisitor, uCEFDownloadImageCallBack, uCEFCookieManager,
uCEFRequestContextHandler; uCEFRequestContextHandler, uCEFCookieVisitor, uCEFSetCookieCallback;
constructor TChromium.Create(AOwner: TComponent); constructor TChromium.Create(AOwner: TComponent);
begin begin
@ -1252,6 +1262,8 @@ begin
FOnHttpAuthCredentialsCleared := nil; FOnHttpAuthCredentialsCleared := nil;
FOnAllConnectionsClosed := nil; FOnAllConnectionsClosed := nil;
FOnExecuteTaskOnCefThread := nil; FOnExecuteTaskOnCefThread := nil;
FOnCookiesVisited := nil;
FOnCookieSet := nil;
{$IFNDEF FPC} {$IFNDEF FPC}
FOnBrowserCompMsg := nil; FOnBrowserCompMsg := nil;
FOnWidgetCompMsg := nil; FOnWidgetCompMsg := nil;
@ -2340,6 +2352,89 @@ begin
end; end;
end; end;
// TChromium.VisitAllCookies triggers the TChromium.OnCookiesVisited event for each cookie
// aID is an optional parameter to identify which VisitAllCookies call has triggered the
// OnCookiesVisited event.
function TChromium.VisitAllCookies(aID : integer) : boolean;
var
TempManager : ICefCookieManager;
TempVisitor : ICefCookieVisitor;
begin
Result := False;
if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then
begin
TempManager := FBrowser.Host.RequestContext.GetCookieManager(nil);
if (TempManager <> nil) then
try
TempVisitor := TCefCustomCookieVisitor.Create(self, aID);
Result := TempManager.VisitAllCookies(TempVisitor);
finally
TempVisitor := nil;
end;
end;
end;
// TChromium.VisitURLCookies triggers the TChromium.OnCookiesVisited event for each cookie
// aID is an optional parameter to identify which VisitAllCookies call has triggered the
// OnCookiesVisited event.
function TChromium.VisitURLCookies(const url : ustring; includeHttpOnly : boolean; aID : integer) : boolean;
var
TempManager : ICefCookieManager;
TempVisitor : ICefCookieVisitor;
begin
Result := False;
if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then
begin
TempManager := FBrowser.Host.RequestContext.GetCookieManager(nil);
if (TempManager <> nil) then
try
TempVisitor := TCefCustomCookieVisitor.Create(self, aID);
Result := TempManager.VisitUrlCookies(url, includeHttpOnly, TempVisitor);
finally
TempVisitor := nil;
end;
end;
end;
// TChromium.SetCookie triggers the TChromium.OnCookieSet event when the cookie has been set
// aID is an optional parameter to identify which SetCookie call has triggered the
// OnCookieSet event.
function TChromium.SetCookie(const url, name_, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean;
const creation, lastAccess, expires: TDateTime;
aSetImmediately : boolean;
aID : integer): Boolean;
var
TempManager : ICefCookieManager;
TempCallback : ICefSetCookieCallback;
begin
Result := False;
if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then
begin
TempManager := FBrowser.Host.RequestContext.GetCookieManager(nil);
if (TempManager <> nil) then
try
if aSetImmediately then
TempCallback := nil
else
TempCallback := TCefCustomSetCookieCallback.Create(self, aID);
Result := TempManager.SetCookie(url, name_, value, domain, path,
secure, httponly, hasExpires,
creation, lastAccess, expires,
TempCallback);
finally
TempCallback := nil;
end;
end;
end;
// If aFlushImmediately is false then OnCookiesFlushed is triggered when the cookies are flushed // If aFlushImmediately is false then OnCookiesFlushed is triggered when the cookies are flushed
function TChromium.FlushCookieStore(aFlushImmediately : boolean) : boolean; function TChromium.FlushCookieStore(aFlushImmediately : boolean) : boolean;
var var
@ -3323,6 +3418,25 @@ begin
if assigned(FOnExecuteTaskOnCefThread) then FOnExecuteTaskOnCefThread(self, aTaskID); if assigned(FOnExecuteTaskOnCefThread) then FOnExecuteTaskOnCefThread(self, aTaskID);
end; end;
procedure TChromium.doOnCookiesVisited(const name_, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean;
const creation, lastAccess, expires: TDateTime;
count, total, aID : Integer;
var aDeleteCookie, aResult : Boolean);
begin
if assigned(FOnCookiesVisited) then
FOnCookiesVisited(self, name_, value, domain, path,
secure, httponly, hasExpires,
creation, lastAccess, expires,
count, total, aID,
aDeleteCookie, aResult);
end;
procedure TChromium.doOnCookieSet(aSuccess : boolean; aID : integer);
begin
if assigned(FOnCookieSet) then FOnCookieSet(self, aSuccess, aID);
end;
function TChromium.MustCreateLoadHandler : boolean; function TChromium.MustCreateLoadHandler : boolean;
begin begin
Result := assigned(FOnLoadStart) or Result := assigned(FOnLoadStart) or

@ -174,6 +174,8 @@ type
TOnNavigationVisitorResultAvailableEvent = procedure(const entry: ICefNavigationEntry; current: Boolean; index, total: Integer; var aResult : boolean) of object; TOnNavigationVisitorResultAvailableEvent = procedure(const entry: ICefNavigationEntry; current: Boolean; index, total: Integer; var aResult : boolean) of object;
TOnDownloadImageFinishedEvent = procedure(Sender: TObject; const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage) of object; TOnDownloadImageFinishedEvent = procedure(Sender: TObject; const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage) of object;
TOnExecuteTaskOnCefThread = procedure(Sender: TObject; aTaskID : cardinal) of object; TOnExecuteTaskOnCefThread = procedure(Sender: TObject; aTaskID : cardinal) of object;
TOnCookiesVisited = procedure(Sender: TObject; const name_, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total, aID : Integer; var aDeleteCookie, aResult : Boolean) of object;
TOnCookieSet = procedure(Sender: TObject; aSuccess : boolean; aID : integer) of object;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
TOnCompMsgEvent = procedure(var aMessage: TMessage; var aHandled: Boolean) of object; TOnCompMsgEvent = procedure(var aMessage: TMessage; var aHandled: Boolean) of object;
{$ENDIF} {$ENDIF}

@ -536,13 +536,6 @@ const
CEF_PROXYTYPE_FIXED_SERVERS = 3; CEF_PROXYTYPE_FIXED_SERVERS = 3;
CEF_PROXYTYPE_PAC_SCRIPT = 4; CEF_PROXYTYPE_PAC_SCRIPT = 4;
CEF_CONTENT_SETTING_DEFAULT = 0;
CEF_CONTENT_SETTING_ALLOW = 1;
CEF_CONTENT_SETTING_BLOCK = 2;
CEF_CONTENT_SETTING_ASK = 3;
CEF_CONTENT_SETTING_SESSION_ONLY = 4;
CEF_CONTENT_SETTING_NUM_SETTINGS = 5;
// Used in the severity parameter in the 'cef_log' function, also known as 'CefLog' in CEF4Delphi. // Used in the severity parameter in the 'cef_log' function, also known as 'CefLog' in CEF4Delphi.
CEF_LOG_SEVERITY_INFO = 0; CEF_LOG_SEVERITY_INFO = 0;
CEF_LOG_SEVERITY_WARNING = 1; CEF_LOG_SEVERITY_WARNING = 1;

@ -65,7 +65,7 @@ type
function VisitAllCookiesProc(const visitor: TCefCookieVisitorProc): Boolean; function VisitAllCookiesProc(const visitor: TCefCookieVisitorProc): Boolean;
function VisitUrlCookies(const url: ustring; includeHttpOnly: Boolean; const visitor: ICefCookieVisitor): Boolean; function VisitUrlCookies(const url: ustring; includeHttpOnly: Boolean; const visitor: ICefCookieVisitor): Boolean;
function VisitUrlCookiesProc(const url: ustring; includeHttpOnly: Boolean; const visitor: TCefCookieVisitorProc): Boolean; function VisitUrlCookiesProc(const url: ustring; includeHttpOnly: Boolean; const visitor: TCefCookieVisitorProc): Boolean;
function SetCookie(const url: ustring; const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; const callback: ICefSetCookieCallback): Boolean; function SetCookie(const url, name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; const callback: ICefSetCookieCallback): Boolean;
function SetCookieProc(const url: ustring; const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; const callback: TCefSetCookieCallbackProc): Boolean; function SetCookieProc(const url: ustring; const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; const callback: TCefSetCookieCallbackProc): Boolean;
function DeleteCookies(const url, cookieName: ustring; const callback: ICefDeleteCookiesCallback): Boolean; function DeleteCookies(const url, cookieName: ustring; const callback: ICefDeleteCookiesCallback): Boolean;
function DeleteCookiesProc(const url, cookieName: ustring; const callback: TCefDeleteCookiesCallbackProc): Boolean; function DeleteCookiesProc(const url, cookieName: ustring; const callback: TCefDeleteCookiesCallbackProc): Boolean;

@ -70,9 +70,26 @@ type
constructor Create(const visitor: TCefCookieVisitorProc); reintroduce; constructor Create(const visitor: TCefCookieVisitorProc); reintroduce;
end; end;
TCefCustomCookieVisitor = class(TCefCookieVisitorOwn)
protected
FEvents : Pointer;
FID : integer;
function visit(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; out deleteCookie: Boolean): Boolean; override;
public
constructor Create(const aEvents : IChromiumEvents; aID : integer); reintroduce;
destructor Destroy; override;
end;
implementation implementation
uses uses
{$IFDEF DELPHI16_UP}
System.SysUtils,
{$ELSE}
SysUtils,
{$ENDIF}
uCEFMiscFunctions, uCEFLibFunctions; uCEFMiscFunctions, uCEFLibFunctions;
function cef_cookie_visitor_visit(self: PCefCookieVisitor; function cef_cookie_visitor_visit(self: PCefCookieVisitor;
@ -148,4 +165,47 @@ begin
creation, lastAccess, expires, count, total, deleteCookie); creation, lastAccess, expires, count, total, deleteCookie);
end; end;
// TCefCustomCookieVisitor
constructor TCefCustomCookieVisitor.Create(const aEvents : IChromiumEvents; aID : integer);
begin
inherited Create;
FEvents := Pointer(aEvents);
FID := aID;
end;
destructor TCefCustomCookieVisitor.Destroy;
begin
FEvents := nil;
inherited Destroy;
end;
function TCefCustomCookieVisitor.visit(const name, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean;
const creation, lastAccess, expires: TDateTime;
count, total: Integer;
out deleteCookie: Boolean): Boolean;
var
TempDelete : boolean;
begin
Result := True;
TempDelete := False;
try
try
if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnCookiesVisited(name, value, domain, path, secure, httponly, hasExpires,
creation, lastAccess, expires, count, total, FID, TempDelete, Result);
except
on e : exception do
if CustomExceptionHandler('TCefCustomCookieVisitor.visit', e) then raise;
end;
finally
deleteCookie := TempDelete;
end;
end;
end. end.

@ -236,6 +236,8 @@ type
FOnHttpAuthCredentialsCleared : TNotifyEvent; FOnHttpAuthCredentialsCleared : TNotifyEvent;
FOnAllConnectionsClosed : TNotifyEvent; FOnAllConnectionsClosed : TNotifyEvent;
FOnExecuteTaskOnCefThread : TOnExecuteTaskOnCefThread; FOnExecuteTaskOnCefThread : TOnExecuteTaskOnCefThread;
FOnCookiesVisited : TOnCookiesVisited;
FOnCookieSet : TOnCookieSet;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
FOnBrowserCompMsg : TOnCompMsgEvent; FOnBrowserCompMsg : TOnCompMsgEvent;
FOnWidgetCompMsg : TOnCompMsgEvent; FOnWidgetCompMsg : TOnCompMsgEvent;
@ -469,6 +471,8 @@ type
procedure doHttpAuthCredentialsCleared; virtual; procedure doHttpAuthCredentialsCleared; virtual;
procedure doAllConnectionsClosed; virtual; procedure doAllConnectionsClosed; virtual;
procedure doOnExecuteTaskOnCefThread(aTaskID : cardinal); virtual; procedure doOnExecuteTaskOnCefThread(aTaskID : cardinal); virtual;
procedure doOnCookiesVisited(const name_, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total, aID : Integer; var aDeleteCookie, aResult : Boolean); virtual;
procedure doOnCookieSet(aSuccess : boolean; aID : integer); virtual;
function MustCreateLoadHandler : boolean; virtual; function MustCreateLoadHandler : boolean; virtual;
function MustCreateFocusHandler : boolean; virtual; function MustCreateFocusHandler : boolean; virtual;
function MustCreateContextMenuHandler : boolean; virtual; function MustCreateContextMenuHandler : boolean; virtual;
@ -516,8 +520,6 @@ type
procedure DownloadImage(const imageUrl: ustring; isFavicon: Boolean; maxImageSize: cardinal; bypassCache: Boolean); procedure DownloadImage(const imageUrl: ustring; isFavicon: Boolean; maxImageSize: cardinal; bypassCache: Boolean);
procedure SimulateMouseWheel(aDeltaX, aDeltaY : integer); procedure SimulateMouseWheel(aDeltaX, aDeltaY : integer);
function DeleteCookies(const url : ustring = ''; const cookieName : ustring = '') : boolean;
function FlushCookieStore(aFlushImmediately : boolean = True) : boolean;
function ClearCertificateExceptions(aClearImmediately : boolean = True) : boolean; function ClearCertificateExceptions(aClearImmediately : boolean = True) : boolean;
function ClearHttpAuthCredentials(aClearImmediately : boolean = True) : boolean; function ClearHttpAuthCredentials(aClearImmediately : boolean = True) : boolean;
function CloseAllConnections(aCloseImmediately : boolean = True) : boolean; function CloseAllConnections(aCloseImmediately : boolean = True) : boolean;
@ -539,6 +541,12 @@ type
function IsSameBrowser(const aBrowser : ICefBrowser) : boolean; function IsSameBrowser(const aBrowser : ICefBrowser) : boolean;
function ExecuteTaskOnCefThread(aCefThreadId : TCefThreadId; aTaskID : cardinal; aDelayMs : Int64 = 0) : boolean; function ExecuteTaskOnCefThread(aCefThreadId : TCefThreadId; aTaskID : cardinal; aDelayMs : Int64 = 0) : boolean;
function DeleteCookies(const url : ustring = ''; const cookieName : ustring = '') : boolean;
function VisitAllCookies(aID : integer = 0) : boolean;
function VisitURLCookies(const url : ustring; includeHttpOnly : boolean = False; aID : integer = 0) : boolean;
function SetCookie(const url: ustring; const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; aSetImmediately : boolean = True; aID : integer = 0): Boolean;
function FlushCookieStore(aFlushImmediately : boolean = True) : boolean;
procedure ShowDevTools(inspectElementAt: TPoint); procedure ShowDevTools(inspectElementAt: TPoint);
procedure CloseDevTools; procedure CloseDevTools;
@ -678,6 +686,8 @@ type
property OnHttpAuthCredentialsCleared : TNotifyEvent read FOnHttpAuthCredentialsCleared write FOnHttpAuthCredentialsCleared; property OnHttpAuthCredentialsCleared : TNotifyEvent read FOnHttpAuthCredentialsCleared write FOnHttpAuthCredentialsCleared;
property OnAllConnectionsClosed : TNotifyEvent read FOnAllConnectionsClosed write FOnAllConnectionsClosed; property OnAllConnectionsClosed : TNotifyEvent read FOnAllConnectionsClosed write FOnAllConnectionsClosed;
property OnExecuteTaskOnCefThread : TOnExecuteTaskOnCefThread read FOnExecuteTaskOnCefThread write FOnExecuteTaskOnCefThread; property OnExecuteTaskOnCefThread : TOnExecuteTaskOnCefThread read FOnExecuteTaskOnCefThread write FOnExecuteTaskOnCefThread;
property OnCookiesVisited : TOnCookiesVisited read FOnCookiesVisited write FOnCookiesVisited;
property OnCookieSet : TOnCookieSet read FOnCookieSet write FOnCookieSet;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg; property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg;
property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg; property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg;
@ -826,7 +836,7 @@ uses
uCEFApplication, uCEFProcessMessage, uCEFRequestContext, uCEFCookieManager, uCEFApplication, uCEFProcessMessage, uCEFRequestContext, uCEFCookieManager,
uCEFPDFPrintCallback, uCEFResolveCallback, uCEFDeleteCookiesCallback, uCEFStringVisitor, uCEFPDFPrintCallback, uCEFResolveCallback, uCEFDeleteCookiesCallback, uCEFStringVisitor,
uCEFListValue, uCEFNavigationEntryVisitor, uCEFDownloadImageCallBack, uCEFListValue, uCEFNavigationEntryVisitor, uCEFDownloadImageCallBack,
uCEFRequestContextHandler; uCEFRequestContextHandler, uCEFCookieVisitor, uCEFSetCookieCallback;
constructor TFMXChromium.Create(AOwner: TComponent); constructor TFMXChromium.Create(AOwner: TComponent);
begin begin
@ -1155,6 +1165,8 @@ begin
FOnHttpAuthCredentialsCleared := nil; FOnHttpAuthCredentialsCleared := nil;
FOnAllConnectionsClosed := nil; FOnAllConnectionsClosed := nil;
FOnExecuteTaskOnCefThread := nil; FOnExecuteTaskOnCefThread := nil;
FOnCookiesVisited := nil;
FOnCookieSet := nil;
end; end;
function TFMXChromium.CreateBrowser(const aWindowName : ustring; function TFMXChromium.CreateBrowser(const aWindowName : ustring;
@ -2139,6 +2151,89 @@ begin
end; end;
end; end;
// TFMXChromium.VisitAllCookies triggers the TFMXChromium.OnCookiesVisited event for each cookie
// aID is an optional parameter to identify which VisitAllCookies call has triggered the
// OnCookiesVisited event.
function TFMXChromium.VisitAllCookies(aID : integer) : boolean;
var
TempManager : ICefCookieManager;
TempVisitor : ICefCookieVisitor;
begin
Result := False;
if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then
begin
TempManager := FBrowser.Host.RequestContext.GetCookieManager(nil);
if (TempManager <> nil) then
try
TempVisitor := TCefCustomCookieVisitor.Create(self, aID);
Result := TempManager.VisitAllCookies(TempVisitor);
finally
TempVisitor := nil;
end;
end;
end;
// TFMXChromium.VisitURLCookies triggers the TFMXChromium.OnCookiesVisited event for each cookie
// aID is an optional parameter to identify which VisitAllCookies call has triggered the
// OnCookiesVisited event.
function TFMXChromium.VisitURLCookies(const url : ustring; includeHttpOnly : boolean; aID : integer) : boolean;
var
TempManager : ICefCookieManager;
TempVisitor : ICefCookieVisitor;
begin
Result := False;
if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then
begin
TempManager := FBrowser.Host.RequestContext.GetCookieManager(nil);
if (TempManager <> nil) then
try
TempVisitor := TCefCustomCookieVisitor.Create(self, aID);
Result := TempManager.VisitUrlCookies(url, includeHttpOnly, TempVisitor);
finally
TempVisitor := nil;
end;
end;
end;
// TFMXChromium.SetCookie triggers the TFMXChromium.OnCookieSet event when the cookie has been set
// aID is an optional parameter to identify which SetCookie call has triggered the
// OnCookieSet event.
function TFMXChromium.SetCookie(const url, name, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean;
const creation, lastAccess, expires: TDateTime;
aSetImmediately : boolean;
aID : integer): Boolean;
var
TempManager : ICefCookieManager;
TempCallback : ICefSetCookieCallback;
begin
Result := False;
if Initialized and (FBrowser.Host <> nil) and (FBrowser.Host.RequestContext <> nil) then
begin
TempManager := FBrowser.Host.RequestContext.GetCookieManager(nil);
if (TempManager <> nil) then
try
if aSetImmediately then
TempCallback := nil
else
TempCallback := TCefCustomSetCookieCallback.Create(self, aID);
Result := TempManager.SetCookie(url, name, value, domain, path,
secure, httponly, hasExpires,
creation, lastAccess, expires,
TempCallback);
finally
TempCallback := nil;
end;
end;
end;
// If aFlushImmediately is false then OnCookiesFlushed is triggered when the cookies are flushed // If aFlushImmediately is false then OnCookiesFlushed is triggered when the cookies are flushed
function TFMXChromium.FlushCookieStore(aFlushImmediately : boolean) : boolean; function TFMXChromium.FlushCookieStore(aFlushImmediately : boolean) : boolean;
var var
@ -3065,6 +3160,25 @@ begin
if assigned(FOnExecuteTaskOnCefThread) then FOnExecuteTaskOnCefThread(self, aTaskID); if assigned(FOnExecuteTaskOnCefThread) then FOnExecuteTaskOnCefThread(self, aTaskID);
end; end;
procedure TFMXChromium.doOnCookiesVisited(const name_, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean;
const creation, lastAccess, expires: TDateTime;
count, total, aID : Integer;
var aDeleteCookie, aResult : Boolean);
begin
if assigned(FOnCookiesVisited) then
FOnCookiesVisited(self, name, value, domain, path,
secure, httponly, hasExpires,
creation, lastAccess, expires,
count, total, aID,
aDeleteCookie, aResult);
end;
procedure TFMXChromium.doOnCookieSet(aSuccess : boolean; aID : integer);
begin
if assigned(FOnCookieSet) then FOnCookieSet(self, aSuccess, aID);
end;
function TFMXChromium.MustCreateLoadHandler : boolean; function TFMXChromium.MustCreateLoadHandler : boolean;
begin begin
Result := assigned(FOnLoadStart) or Result := assigned(FOnLoadStart) or

@ -394,6 +394,8 @@ type
procedure doHttpAuthCredentialsCleared; procedure doHttpAuthCredentialsCleared;
procedure doAllConnectionsClosed; procedure doAllConnectionsClosed;
procedure doOnExecuteTaskOnCefThread(aTaskID : cardinal); procedure doOnExecuteTaskOnCefThread(aTaskID : cardinal);
procedure doOnCookiesVisited(const name_, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total, aID : Integer; var aDeleteCookie, aResult : Boolean);
procedure doOnCookieSet(aSuccess : boolean; aID : integer);
function MustCreateLoadHandler : boolean; function MustCreateLoadHandler : boolean;
function MustCreateFocusHandler : boolean; function MustCreateFocusHandler : boolean;
function MustCreateContextMenuHandler : boolean; function MustCreateContextMenuHandler : boolean;
@ -1299,7 +1301,7 @@ type
function VisitAllCookiesProc(const visitor: TCefCookieVisitorProc): Boolean; function VisitAllCookiesProc(const visitor: TCefCookieVisitorProc): Boolean;
function VisitUrlCookies(const url: ustring; includeHttpOnly: Boolean; const visitor: ICefCookieVisitor): Boolean; function VisitUrlCookies(const url: ustring; includeHttpOnly: Boolean; const visitor: ICefCookieVisitor): Boolean;
function VisitUrlCookiesProc(const url: ustring; includeHttpOnly: Boolean; const visitor: TCefCookieVisitorProc): Boolean; function VisitUrlCookiesProc(const url: ustring; includeHttpOnly: Boolean; const visitor: TCefCookieVisitorProc): Boolean;
function SetCookie(const url: ustring; const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; const callback: ICefSetCookieCallback): Boolean; function SetCookie(const url, name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; const callback: ICefSetCookieCallback): Boolean;
function SetCookieProc(const url: ustring; const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; const callback: TCefSetCookieCallbackProc): Boolean; function SetCookieProc(const url: ustring; const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; const callback: TCefSetCookieCallbackProc): Boolean;
function DeleteCookies(const url, cookieName: ustring; const callback: ICefDeleteCookiesCallback): Boolean; function DeleteCookies(const url, cookieName: ustring; const callback: ICefDeleteCookiesCallback): Boolean;
function DeleteCookiesProc(const url, cookieName: ustring; const callback: TCefDeleteCookiesCallbackProc): Boolean; function DeleteCookiesProc(const url, cookieName: ustring; const callback: TCefDeleteCookiesCallbackProc): Boolean;

@ -70,9 +70,26 @@ type
constructor Create(const callback: TCefSetCookieCallbackProc); reintroduce; constructor Create(const callback: TCefSetCookieCallbackProc); reintroduce;
end; end;
TCefCustomSetCookieCallback = class(TCefSetCookieCallbackOwn)
protected
FEvents : Pointer;
FID : integer;
procedure OnComplete(success: Boolean); override;
public
constructor Create(const aEvents : IChromiumEvents; aID : integer); reintroduce;
destructor Destroy; override;
end;
implementation implementation
uses uses
{$IFDEF DELPHI16_UP}
System.SysUtils,
{$ELSE}
SysUtils,
{$ENDIF}
uCEFMiscFunctions, uCEFLibFunctions; uCEFMiscFunctions, uCEFLibFunctions;
procedure cef_set_cookie_callback_on_complete(self : PCefSetCookieCallback; procedure cef_set_cookie_callback_on_complete(self : PCefSetCookieCallback;
@ -108,4 +125,37 @@ begin
FCallback(success); FCallback(success);
end; end;
// TCefCustomSetCookieCallback
constructor TCefCustomSetCookieCallback.Create(const aEvents : IChromiumEvents; aID : integer);
begin
inherited Create;
FEvents := Pointer(aEvents);
FID := aID;
end;
destructor TCefCustomSetCookieCallback.Destroy;
begin
FEvents := nil;
inherited Destroy;
end;
procedure TCefCustomSetCookieCallback.OnComplete(success: Boolean);
begin
try
try
if (FEvents <> nil) then IChromiumEvents(FEvents).doOnCookieSet(success, FID);
except
on e : exception do
if CustomExceptionHandler('TCefCustomSetCookieCallback.OnComplete', e) then raise;
end;
finally
FEvents := nil;
end;
end;
end. end.

@ -2,7 +2,7 @@
"UpdateLazPackages" : [ "UpdateLazPackages" : [
{ {
"ForceNotify" : true, "ForceNotify" : true,
"InternalVersion" : 50, "InternalVersion" : 51,
"Name" : "cef4delphi_lazarus.lpk", "Name" : "cef4delphi_lazarus.lpk",
"Version" : "77.1.18.0" "Version" : "77.1.18.0"
} }