2017-01-27 18:29:37 +02:00
|
|
|
// ************************************************************************
|
|
|
|
// ***************************** CEF4Delphi *******************************
|
|
|
|
// ************************************************************************
|
|
|
|
//
|
2019-10-19 10:58:34 +02:00
|
|
|
// CEF4Delphi is based on DCEF3 which uses CEF to embed a chromium-based
|
2017-01-27 18:29:37 +02:00
|
|
|
// browser in Delphi applications.
|
|
|
|
//
|
|
|
|
// The original license of DCEF3 still applies to CEF4Delphi.
|
|
|
|
//
|
|
|
|
// For more information about CEF4Delphi visit :
|
|
|
|
// https://www.briskbard.com/index.php?lang=en&pageid=cef
|
|
|
|
//
|
2022-01-01 11:41:21 +02:00
|
|
|
// Copyright � 2022 Salvador Diaz Fau. All rights reserved.
|
2017-01-27 18:29:37 +02:00
|
|
|
//
|
|
|
|
// ************************************************************************
|
|
|
|
// ************ vvvv Original license and comments below vvvv *************
|
|
|
|
// ************************************************************************
|
|
|
|
(*
|
|
|
|
* Delphi Chromium Embedded 3
|
|
|
|
*
|
|
|
|
* Usage allowed under the restrictions of the Lesser GNU General Public License
|
|
|
|
* or alternatively the restrictions of the Mozilla Public License 1.1
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
|
|
|
* the specific language governing rights and limitations under the License.
|
|
|
|
*
|
|
|
|
* Unit owner : Henri Gourvest <hgourvest@gmail.com>
|
|
|
|
* Web site : http://www.progdigy.com
|
|
|
|
* Repository : http://code.google.com/p/delphichromiumembedded/
|
|
|
|
* Group : http://groups.google.com/group/delphichromiumembedded
|
|
|
|
*
|
|
|
|
* Embarcadero Technologies, Inc is not permitted to use or redistribute
|
|
|
|
* this source code without explicit permission.
|
|
|
|
*
|
|
|
|
*)
|
|
|
|
|
|
|
|
unit uCEFCookieVisitor;
|
|
|
|
|
2018-05-12 14:50:54 +02:00
|
|
|
{$IFDEF FPC}
|
|
|
|
{$MODE OBJFPC}{$H+}
|
|
|
|
{$ENDIF}
|
|
|
|
|
2017-02-05 21:56:46 +02:00
|
|
|
{$I cef.inc}
|
|
|
|
|
2022-02-19 19:56:41 +02:00
|
|
|
{$IFNDEF TARGET_64BITS}{$ALIGN ON}{$ENDIF}
|
|
|
|
{$MINENUMSIZE 4}
|
|
|
|
|
2017-01-27 18:29:37 +02:00
|
|
|
interface
|
|
|
|
|
|
|
|
uses
|
2017-03-16 20:09:42 +02:00
|
|
|
uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes;
|
2017-01-27 18:29:37 +02:00
|
|
|
|
|
|
|
type
|
2017-03-16 20:09:42 +02:00
|
|
|
TCefCookieVisitorOwn = class(TCefBaseRefCountedOwn, ICefCookieVisitor)
|
2017-01-27 18:29:37 +02:00
|
|
|
protected
|
2020-05-23 15:00:44 +02:00
|
|
|
function visit(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; same_site : TCefCookieSameSite; priority : TCefCookiePriority; out deleteCookie: Boolean): Boolean; virtual;
|
2017-01-27 18:29:37 +02:00
|
|
|
|
|
|
|
public
|
|
|
|
constructor Create; virtual;
|
|
|
|
end;
|
|
|
|
|
|
|
|
TCefFastCookieVisitor = class(TCefCookieVisitorOwn)
|
|
|
|
protected
|
|
|
|
FVisitor: TCefCookieVisitorProc;
|
|
|
|
|
2020-05-23 15:00:44 +02:00
|
|
|
function visit(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; same_site : TCefCookieSameSite; priority : TCefCookiePriority; out deleteCookie: Boolean): Boolean; override;
|
2017-01-27 18:29:37 +02:00
|
|
|
|
|
|
|
public
|
|
|
|
constructor Create(const visitor: TCefCookieVisitorProc); reintroduce;
|
|
|
|
end;
|
|
|
|
|
2019-10-29 17:13:35 +02:00
|
|
|
TCefCustomCookieVisitor = class(TCefCookieVisitorOwn)
|
|
|
|
protected
|
|
|
|
FEvents : Pointer;
|
|
|
|
FID : integer;
|
|
|
|
|
2020-05-23 15:00:44 +02:00
|
|
|
function visit(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; same_site : TCefCookieSameSite; priority : TCefCookiePriority; out deleteCookie: Boolean): Boolean; override;
|
2019-10-29 17:13:35 +02:00
|
|
|
|
|
|
|
public
|
|
|
|
constructor Create(const aEvents : IChromiumEvents; aID : integer); reintroduce;
|
|
|
|
destructor Destroy; override;
|
|
|
|
end;
|
|
|
|
|
2017-01-27 18:29:37 +02:00
|
|
|
implementation
|
|
|
|
|
|
|
|
uses
|
2019-10-29 17:13:35 +02:00
|
|
|
{$IFDEF DELPHI16_UP}
|
|
|
|
System.SysUtils,
|
|
|
|
{$ELSE}
|
|
|
|
SysUtils,
|
|
|
|
{$ENDIF}
|
2017-01-27 18:29:37 +02:00
|
|
|
uCEFMiscFunctions, uCEFLibFunctions;
|
|
|
|
|
2020-05-23 15:00:44 +02:00
|
|
|
function cef_cookie_visitor_visit( self : PCefCookieVisitor;
|
|
|
|
const cookie : PCefCookie;
|
|
|
|
count : Integer;
|
|
|
|
total : Integer;
|
|
|
|
deleteCookie : PInteger): Integer; stdcall;
|
2017-01-27 18:29:37 +02:00
|
|
|
var
|
2018-03-29 20:02:04 +02:00
|
|
|
delete : Boolean;
|
|
|
|
exp : TDateTime;
|
|
|
|
TempObject : TObject;
|
2017-01-27 18:29:37 +02:00
|
|
|
begin
|
2018-03-29 20:02:04 +02:00
|
|
|
delete := False;
|
|
|
|
Result := Ord(True);
|
|
|
|
TempObject := CefGetObject(self);
|
|
|
|
|
2018-05-12 14:50:54 +02:00
|
|
|
if (cookie^.has_expires <> 0) then
|
|
|
|
exp := CefTimeToDateTime(cookie^.expires)
|
2018-03-29 20:02:04 +02:00
|
|
|
else
|
2017-01-27 18:29:37 +02:00
|
|
|
exp := 0;
|
2018-03-29 20:02:04 +02:00
|
|
|
|
|
|
|
if (TempObject <> nil) and (TempObject is TCefCookieVisitorOwn) then
|
2018-05-12 14:50:54 +02:00
|
|
|
Result := Ord(TCefCookieVisitorOwn(TempObject).visit(CefString(@cookie^.name),
|
|
|
|
CefString(@cookie^.value),
|
|
|
|
CefString(@cookie^.domain),
|
|
|
|
CefString(@cookie^.path),
|
|
|
|
Boolean(cookie^.secure),
|
|
|
|
Boolean(cookie^.httponly),
|
|
|
|
Boolean(cookie^.has_expires),
|
|
|
|
CefTimeToDateTime(cookie^.creation),
|
|
|
|
CefTimeToDateTime(cookie^.last_access),
|
2018-03-29 20:02:04 +02:00
|
|
|
exp,
|
|
|
|
count,
|
|
|
|
total,
|
2020-05-23 15:00:44 +02:00
|
|
|
cookie^.same_site,
|
|
|
|
cookie^.priority,
|
2018-03-29 20:02:04 +02:00
|
|
|
delete));
|
|
|
|
|
2017-01-27 18:29:37 +02:00
|
|
|
deleteCookie^ := Ord(delete);
|
|
|
|
end;
|
|
|
|
|
|
|
|
// TCefCookieVisitorOwn
|
|
|
|
|
|
|
|
constructor TCefCookieVisitorOwn.Create;
|
|
|
|
begin
|
|
|
|
inherited CreateData(SizeOf(TCefCookieVisitor));
|
2018-03-29 20:02:04 +02:00
|
|
|
|
2018-05-12 14:50:54 +02:00
|
|
|
PCefCookieVisitor(FData)^.visit := {$IFDEF FPC}@{$ENDIF}cef_cookie_visitor_visit;
|
2017-01-27 18:29:37 +02:00
|
|
|
end;
|
|
|
|
|
|
|
|
function TCefCookieVisitorOwn.visit(const name, value, domain, path: ustring;
|
2018-03-29 20:02:04 +02:00
|
|
|
secure, httponly, hasExpires: Boolean;
|
|
|
|
const creation, lastAccess, expires: TDateTime;
|
|
|
|
count, total: Integer;
|
2020-05-23 15:00:44 +02:00
|
|
|
same_site : TCefCookieSameSite;
|
|
|
|
priority : TCefCookiePriority;
|
2018-03-29 20:02:04 +02:00
|
|
|
out deleteCookie: Boolean): Boolean;
|
2017-01-27 18:29:37 +02:00
|
|
|
begin
|
|
|
|
Result := True;
|
|
|
|
end;
|
|
|
|
|
|
|
|
// TCefFastCookieVisitor
|
|
|
|
|
|
|
|
constructor TCefFastCookieVisitor.Create(const visitor: TCefCookieVisitorProc);
|
|
|
|
begin
|
|
|
|
inherited Create;
|
2018-03-29 20:02:04 +02:00
|
|
|
|
2017-01-27 18:29:37 +02:00
|
|
|
FVisitor := visitor;
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TCefFastCookieVisitor.visit(const name, value, domain, path: ustring;
|
2018-03-29 20:02:04 +02:00
|
|
|
secure, httponly, hasExpires: Boolean;
|
|
|
|
const creation, lastAccess, expires: TDateTime;
|
|
|
|
count, total: Integer;
|
2020-05-23 15:00:44 +02:00
|
|
|
same_site : TCefCookieSameSite;
|
|
|
|
priority : TCefCookiePriority;
|
2018-03-29 20:02:04 +02:00
|
|
|
out deleteCookie: Boolean): Boolean;
|
2017-01-27 18:29:37 +02:00
|
|
|
begin
|
|
|
|
Result := FVisitor(name, value, domain, path, secure, httponly, hasExpires,
|
2020-05-23 15:00:44 +02:00
|
|
|
creation, lastAccess, expires, count, total, same_site,
|
|
|
|
priority, deleteCookie);
|
2017-01-27 18:29:37 +02:00
|
|
|
end;
|
|
|
|
|
2019-10-29 17:13:35 +02:00
|
|
|
|
|
|
|
// TCefCustomCookieVisitor
|
|
|
|
|
|
|
|
constructor TCefCustomCookieVisitor.Create(const aEvents : IChromiumEvents; aID : integer);
|
|
|
|
begin
|
|
|
|
inherited Create;
|
|
|
|
|
|
|
|
FEvents := Pointer(aEvents);
|
|
|
|
FID := aID;
|
|
|
|
end;
|
|
|
|
|
|
|
|
destructor TCefCustomCookieVisitor.Destroy;
|
|
|
|
begin
|
2019-11-08 15:32:03 +02:00
|
|
|
try
|
|
|
|
try
|
|
|
|
if (FEvents <> nil) then
|
|
|
|
IChromiumEvents(FEvents).doOnCookieVisitorDestroyed(FID);
|
|
|
|
except
|
|
|
|
on e : exception do
|
|
|
|
if CustomExceptionHandler('TCefCustomCookieVisitor.Destroy', e) then raise;
|
|
|
|
end;
|
|
|
|
finally
|
|
|
|
FEvents := nil;
|
|
|
|
inherited Destroy;
|
|
|
|
end;
|
2019-10-29 17:13:35 +02:00
|
|
|
end;
|
|
|
|
|
|
|
|
function TCefCustomCookieVisitor.visit(const name, value, domain, path: ustring;
|
|
|
|
secure, httponly, hasExpires: Boolean;
|
|
|
|
const creation, lastAccess, expires: TDateTime;
|
|
|
|
count, total: Integer;
|
2020-05-23 15:00:44 +02:00
|
|
|
same_site : TCefCookieSameSite;
|
|
|
|
priority : TCefCookiePriority;
|
2019-10-29 17:13:35 +02:00
|
|
|
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,
|
2020-05-23 15:00:44 +02:00
|
|
|
creation, lastAccess, expires, count, total, FID,
|
|
|
|
same_site, priority, TempDelete, Result);
|
2019-10-29 17:13:35 +02:00
|
|
|
except
|
|
|
|
on e : exception do
|
|
|
|
if CustomExceptionHandler('TCefCustomCookieVisitor.visit', e) then raise;
|
|
|
|
end;
|
|
|
|
finally
|
|
|
|
deleteCookie := TempDelete;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2017-01-27 18:29:37 +02:00
|
|
|
end.
|