Add files via upload

This commit is contained in:
Salvador Diaz Fau 2017-01-27 16:25:30 +01:00 committed by GitHub
parent 993d07c00f
commit 40370f6c41
9 changed files with 2113 additions and 0 deletions

524
uCEFClient.pas Normal file
View File

@ -0,0 +1,524 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
// 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
//
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
//
// ************************************************************************
// ************ 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 uCEFClient;
{$IFNDEF CPUX64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$ENDIF}
interface
uses
WinApi.Windows,
uCEFBase, uCEFInterfaces, uCEFTypes;
type
TCefClientOwn = class(TCefBaseOwn, ICefClient)
protected
function GetContextMenuHandler: ICefContextMenuHandler; virtual;
function GetDialogHandler: ICefDialogHandler; virtual;
function GetDisplayHandler: ICefDisplayHandler; virtual;
function GetDownloadHandler: ICefDownloadHandler; virtual;
function GetDragHandler: ICefDragHandler; virtual;
function GetFindHandler: ICefFindHandler; virtual;
function GetFocusHandler: ICefFocusHandler; virtual;
function GetGeolocationHandler: ICefGeolocationHandler; virtual;
function GetJsdialogHandler: ICefJsdialogHandler; virtual;
function GetKeyboardHandler: ICefKeyboardHandler; virtual;
function GetLifeSpanHandler: ICefLifeSpanHandler; virtual;
function GetRenderHandler: ICefRenderHandler; virtual;
function GetLoadHandler: ICefLoadHandler; virtual;
function GetRequestHandler: ICefRequestHandler; virtual;
function OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean; virtual;
public
constructor Create; virtual;
end;
TCustomClientHandler = class(TCefClientOwn, ICefClientHandler)
protected
FEvents : IChromiumEvents;
FLoadHandler : ICefLoadHandler;
FFocusHandler : ICefFocusHandler;
FContextMenuHandler : ICefContextMenuHandler;
FDialogHandler : ICefDialogHandler;
FKeyboardHandler : ICefKeyboardHandler;
FDisplayHandler : ICefDisplayHandler;
FDownloadHandler : ICefDownloadHandler;
FGeolocationHandler : ICefGeolocationHandler;
FJsDialogHandler : ICefJsDialogHandler;
FLifeSpanHandler : ICefLifeSpanHandler;
FRenderHandler : ICefRenderHandler;
FRequestHandler : ICefRequestHandler;
FDragHandler : ICefDragHandler;
FFindHandler : ICefFindHandler;
function GetContextMenuHandler: ICefContextMenuHandler; override;
function GetDialogHandler: ICefDialogHandler; override;
function GetDisplayHandler: ICefDisplayHandler; override;
function GetDownloadHandler: ICefDownloadHandler; override;
function GetDragHandler: ICefDragHandler; override;
function GetFindHandler: ICefFindHandler; override;
function GetFocusHandler: ICefFocusHandler; override;
function GetGeolocationHandler: ICefGeolocationHandler; override;
function GetJsdialogHandler: ICefJsdialogHandler; override;
function GetKeyboardHandler: ICefKeyboardHandler; override;
function GetLifeSpanHandler: ICefLifeSpanHandler; override;
function GetRenderHandler: ICefRenderHandler; override;
function GetLoadHandler: ICefLoadHandler; override;
function GetRequestHandler: ICefRequestHandler; override;
function OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean; override;
public
constructor Create(const events: IChromiumEvents; renderer: Boolean); reintroduce; virtual;
procedure Disconnect;
end;
TVCLClientHandler = class(TCustomClientHandler)
protected
function GetMultithreadApp : boolean;
public
constructor Create(const crm: IChromiumEvents; renderer: Boolean); reintroduce;
destructor Destroy; override;
procedure ReleaseOtherInstances;
property MultithreadApp : boolean read GetMultithreadApp;
end;
implementation
uses
System.SysUtils,
uCEFMiscFunctions, uCEFLibFunctions, uCEFProcessMessage, uCEFBrowser, uCEFLoadHandler,
uCEFFocusHandler, uCEFContextMenuHandler, uCEFDialogHandler, uCEFKeyboardHandler,
uCEFDisplayHandler, uCEFDownloadHandler, uCEFGeolocationHandler, uCEFJsDialogHandler,
uCEFLifeSpanHandler, uCEFRequestHandler, uCEFRenderHandler, uCEFDragHandler,
uCEFFindHandler, uCEFConstants, uCEFApplication;
var
looping : Boolean = False;
CefInstances : Integer = 0;
CefTimer : UINT = 0;
function cef_client_get_context_menu_handler(self: PCefClient): PCefContextMenuHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetContextMenuHandler);
end;
function cef_client_get_dialog_handler(self: PCefClient): PCefDialogHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetDialogHandler);
end;
function cef_client_get_display_handler(self: PCefClient): PCefDisplayHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetDisplayHandler);
end;
function cef_client_get_download_handler(self: PCefClient): PCefDownloadHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetDownloadHandler);
end;
function cef_client_get_drag_handler(self: PCefClient): PCefDragHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetDragHandler);
end;
function cef_client_get_find_handler(self: PCefClient): PCefFindHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetFindHandler);
end;
function cef_client_get_focus_handler(self: PCefClient): PCefFocusHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetFocusHandler);
end;
function cef_client_get_geolocation_handler(self: PCefClient): PCefGeolocationHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetGeolocationHandler);
end;
function cef_client_get_jsdialog_handler(self: PCefClient): PCefJsDialogHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetJsdialogHandler);
end;
function cef_client_get_keyboard_handler(self: PCefClient): PCefKeyboardHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetKeyboardHandler);
end;
function cef_client_get_life_span_handler(self: PCefClient): PCefLifeSpanHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetLifeSpanHandler);
end;
function cef_client_get_load_handler(self: PCefClient): PCefLoadHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetLoadHandler);
end;
function cef_client_get_get_render_handler(self: PCefClient): PCefRenderHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetRenderHandler);
end;
function cef_client_get_request_handler(self: PCefClient): PCefRequestHandler; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := CefGetData(GetRequestHandler);
end;
function cef_client_on_process_message_received(self: PCefClient; browser: PCefBrowser;
source_process: TCefProcessId; message: PCefProcessMessage): Integer; stdcall;
begin
with TCefClientOwn(CefGetObject(self)) do
Result := Ord(OnProcessMessageReceived(TCefBrowserRef.UnWrap(browser), source_process, TCefProcessMessageRef.UnWrap(message)));
end;
constructor TCefClientOwn.Create;
begin
inherited CreateData(SizeOf(TCefClient));
with PCefClient(FData)^ do
begin
get_context_menu_handler := cef_client_get_context_menu_handler;
get_dialog_handler := cef_client_get_dialog_handler;
get_display_handler := cef_client_get_display_handler;
get_download_handler := cef_client_get_download_handler;
get_drag_handler := cef_client_get_drag_handler;
get_find_handler := cef_client_get_find_handler;
get_focus_handler := cef_client_get_focus_handler;
get_geolocation_handler := cef_client_get_geolocation_handler;
get_jsdialog_handler := cef_client_get_jsdialog_handler;
get_keyboard_handler := cef_client_get_keyboard_handler;
get_life_span_handler := cef_client_get_life_span_handler;
get_load_handler := cef_client_get_load_handler;
get_render_handler := cef_client_get_get_render_handler;
get_request_handler := cef_client_get_request_handler;
on_process_message_received := cef_client_on_process_message_received;
end;
end;
function TCefClientOwn.GetContextMenuHandler: ICefContextMenuHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetDialogHandler: ICefDialogHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetDisplayHandler: ICefDisplayHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetDownloadHandler: ICefDownloadHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetDragHandler: ICefDragHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetFindHandler: ICefFindHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetFocusHandler: ICefFocusHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetGeolocationHandler: ICefGeolocationHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetJsdialogHandler: ICefJsDialogHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetKeyboardHandler: ICefKeyboardHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetLifeSpanHandler: ICefLifeSpanHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetLoadHandler: ICefLoadHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetRenderHandler: ICefRenderHandler;
begin
Result := nil;
end;
function TCefClientOwn.GetRequestHandler: ICefRequestHandler;
begin
Result := nil;
end;
function TCefClientOwn.OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean;
begin
Result := False;
end;
// TCustomClientHandler
constructor TCustomClientHandler.Create(const events: IChromiumEvents; renderer: Boolean);
begin
inherited Create;
FEvents := events;
FLoadHandler := TCustomLoadHandler.Create(events);
FFocusHandler := TCustomFocusHandler.Create(events);
FContextMenuHandler := TCustomContextMenuHandler.Create(events);
FDialogHandler := TCustomDialogHandler.Create(events);
FKeyboardHandler := TCustomKeyboardHandler.Create(events);
FDisplayHandler := TCustomDisplayHandler.Create(events);
FDownloadHandler := TCustomDownloadHandler.Create(events);
FGeolocationHandler := TCustomGeolocationHandler.Create(events);
FJsDialogHandler := TCustomJsDialogHandler.Create(events);
FLifeSpanHandler := TCustomLifeSpanHandler.Create(events);
FRequestHandler := TCustomRequestHandler.Create(events);
if renderer then
FRenderHandler := TCustomRenderHandler.Create(events)
else
FRenderHandler := nil;
FDragHandler := TCustomDragHandler.Create(events);
FFindHandler := TCustomFindHandler.Create(events);
end;
procedure TCustomClientHandler.Disconnect;
begin
FEvents := nil;
FLoadHandler := nil;
FFocusHandler := nil;
FContextMenuHandler := nil;
FDialogHandler := nil;
FKeyboardHandler := nil;
FDisplayHandler := nil;
FDownloadHandler := nil;
FGeolocationHandler := nil;
FJsDialogHandler := nil;
FLifeSpanHandler := nil;
FRequestHandler := nil;
FRenderHandler := nil;
FDragHandler := nil;
FFindHandler := nil;
end;
function TCustomClientHandler.GetContextMenuHandler: ICefContextMenuHandler;
begin
Result := FContextMenuHandler;
end;
function TCustomClientHandler.GetDialogHandler: ICefDialogHandler;
begin
Result := FDialogHandler;
end;
function TCustomClientHandler.GetDisplayHandler: ICefDisplayHandler;
begin
Result := FDisplayHandler;
end;
function TCustomClientHandler.GetDownloadHandler: ICefDownloadHandler;
begin
Result := FDownloadHandler;
end;
function TCustomClientHandler.GetDragHandler: ICefDragHandler;
begin
Result := FDragHandler;
end;
function TCustomClientHandler.GetFindHandler: ICefFindHandler;
begin
Result := FFindHandler;
end;
function TCustomClientHandler.GetFocusHandler: ICefFocusHandler;
begin
Result := FFocusHandler;
end;
function TCustomClientHandler.GetGeolocationHandler: ICefGeolocationHandler;
begin
Result := FGeolocationHandler;
end;
function TCustomClientHandler.GetJsdialogHandler: ICefJsDialogHandler;
begin
Result := FJsDialogHandler;
end;
function TCustomClientHandler.GetKeyboardHandler: ICefKeyboardHandler;
begin
Result := FKeyboardHandler;
end;
function TCustomClientHandler.GetLifeSpanHandler: ICefLifeSpanHandler;
begin
Result := FLifeSpanHandler;
end;
function TCustomClientHandler.GetLoadHandler: ICefLoadHandler;
begin
Result := FLoadHandler;
end;
function TCustomClientHandler.GetRenderHandler: ICefRenderHandler;
begin
Result := FRenderHandler;
end;
function TCustomClientHandler.GetRequestHandler: ICefRequestHandler;
begin
Result := FRequestHandler;
end;
function TCustomClientHandler.OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean;
begin
if Assigned(FEvents) then
Result := FEvents.doOnProcessMessageReceived(browser, sourceProcess, message)
else
Result := False;
end;
// TVCLClientHandler
procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: Pointer; dwTime: DWORD); stdcall;
begin
if looping then Exit;
if (CefInstances > 0) then
begin
looping := True;
try
cef_do_message_loop_work;
finally
looping := False;
end;
end;
end;
constructor TVCLClientHandler.Create(const crm: IChromiumEvents; renderer : Boolean);
begin
inherited Create(crm, renderer);
if not(MultithreadApp) then
begin
if (CefInstances = 0) then CefTimer := SetTimer(0, 0, USER_TIMER_MINIMUM, @TimerProc);
InterlockedIncrement(CefInstances);
end;
end;
destructor TVCLClientHandler.Destroy;
begin
if not(MultithreadApp) then
begin
InterlockedDecrement(CefInstances);
if (CefInstances = 0) then KillTimer(0, CefTimer);
end;
inherited Destroy;
end;
procedure TVCLClientHandler.ReleaseOtherInstances;
var
i : integer;
begin
i := pred(self.FRefCount);
while (i >= 1) do
begin
self._Release;
dec(i);
end;
end;
function TVCLClientHandler.GetMultithreadApp : boolean;
begin
Result := True;
try
if (GlobalCEFApp <> nil) then Result := GlobalCEFApp.MultiThreadedMessageLoop;
except
on e : exception do
begin
{$IFDEF DEBUG}
OutputDebugString(PWideChar('TVCLClientHandler.GetMultithreadApp error: ' + e.Message + chr(0)));
{$ENDIF}
end;
end;
end;
end.

274
uCEFCommandLine.pas Normal file
View File

@ -0,0 +1,274 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
// 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
//
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
//
// ************************************************************************
// ************ 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 uCEFCommandLine;
{$IFNDEF CPUX64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$ENDIF}
interface
uses
System.Classes,
uCEFBase, uCEFTypes, uCEFInterfaces;
type
TCefCommandLineRef = class(TCefBaseRef, ICefCommandLine)
protected
function IsValid: Boolean;
function IsReadOnly: Boolean;
function Copy: ICefCommandLine;
procedure InitFromArgv(argc: Integer; const argv: PPAnsiChar);
procedure InitFromString(const commandLine: ustring);
procedure Reset;
function GetCommandLineString: ustring;
procedure GetArgv(args: TStrings);
function GetProgram: ustring;
procedure SetProgram(const prog: ustring);
function HasSwitches: Boolean;
function HasSwitch(const name: ustring): Boolean;
function GetSwitchValue(const name: ustring): ustring;
procedure GetSwitches(switches: TStrings);
procedure AppendSwitch(const name: ustring);
procedure AppendSwitchWithValue(const name, value: ustring);
function HasArguments: Boolean;
procedure GetArguments(arguments: TStrings);
procedure AppendArgument(const argument: ustring);
procedure PrependWrapper(const wrapper: ustring);
public
class function UnWrap(data: Pointer): ICefCommandLine;
class function New: ICefCommandLine;
class function Global: ICefCommandLine;
end;
implementation
uses
uCEFMiscFunctions, uCEFLibFunctions;
procedure TCefCommandLineRef.AppendArgument(const argument: ustring);
var
a: TCefString;
begin
a := CefString(argument);
PCefCommandLine(FData).append_argument(PCefCommandLine(FData), @a);
end;
procedure TCefCommandLineRef.AppendSwitch(const name: ustring);
var
n: TCefString;
begin
n := CefString(name);
PCefCommandLine(FData).append_switch(PCefCommandLine(FData), @n);
end;
procedure TCefCommandLineRef.AppendSwitchWithValue(const name, value: ustring);
var
n, v: TCefString;
begin
n := CefString(name);
v := CefString(value);
PCefCommandLine(FData).append_switch_with_value(PCefCommandLine(FData), @n, @v);
end;
function TCefCommandLineRef.Copy: ICefCommandLine;
begin
Result := UnWrap(PCefCommandLine(FData).copy(PCefCommandLine(FData)));
end;
procedure TCefCommandLineRef.GetArguments(arguments: TStrings);
var
list: TCefStringList;
i: Integer;
str: TCefString;
begin
list := cef_string_list_alloc;
try
PCefCommandLine(FData).get_arguments(PCefCommandLine(FData), list);
for i := 0 to cef_string_list_size(list) - 1 do
begin
FillChar(str, SizeOf(str), 0);
cef_string_list_value(list, i, @str);
arguments.Add(CefStringClearAndGet(str));
end;
finally
cef_string_list_free(list);
end;
end;
procedure TCefCommandLineRef.GetArgv(args: TStrings);
var
list: TCefStringList;
i: Integer;
str: TCefString;
begin
list := cef_string_list_alloc;
try
PCefCommandLine(FData).get_argv(FData, list);
for i := 0 to cef_string_list_size(list) - 1 do
begin
FillChar(str, SizeOf(str), 0);
cef_string_list_value(list, i, @str);
args.Add(CefStringClearAndGet(str));
end;
finally
cef_string_list_free(list);
end;
end;
function TCefCommandLineRef.GetCommandLineString: ustring;
begin
Result := CefStringFreeAndGet(PCefCommandLine(FData).get_command_line_string(PCefCommandLine(FData)));
end;
function TCefCommandLineRef.GetProgram: ustring;
begin
Result := CefStringFreeAndGet(PCefCommandLine(FData).get_program(PCefCommandLine(FData)));
end;
procedure TCefCommandLineRef.GetSwitches(switches: TStrings);
var
list: TCefStringList;
i: Integer;
str: TCefString;
begin
list := cef_string_list_alloc;
try
PCefCommandLine(FData).get_switches(PCefCommandLine(FData), list);
for i := 0 to cef_string_list_size(list) - 1 do
begin
FillChar(str, SizeOf(str), 0);
cef_string_list_value(list, i, @str);
switches.Add(CefStringClearAndGet(str));
end;
finally
cef_string_list_free(list);
end;
end;
function TCefCommandLineRef.GetSwitchValue(const name: ustring): ustring;
var
n: TCefString;
begin
n := CefString(name);
Result := CefStringFreeAndGet(PCefCommandLine(FData).get_switch_value(PCefCommandLine(FData), @n));
end;
class function TCefCommandLineRef.Global: ICefCommandLine;
begin
Result := UnWrap(cef_command_line_get_global);
end;
function TCefCommandLineRef.HasArguments: Boolean;
begin
Result := PCefCommandLine(FData).has_arguments(PCefCommandLine(FData)) <> 0;
end;
function TCefCommandLineRef.HasSwitch(const name: ustring): Boolean;
var
n: TCefString;
begin
n := CefString(name);
Result := PCefCommandLine(FData).has_switch(PCefCommandLine(FData), @n) <> 0;
end;
function TCefCommandLineRef.HasSwitches: Boolean;
begin
Result := PCefCommandLine(FData).has_switches(PCefCommandLine(FData)) <> 0;
end;
procedure TCefCommandLineRef.InitFromArgv(argc: Integer;
const argv: PPAnsiChar);
begin
PCefCommandLine(FData).init_from_argv(PCefCommandLine(FData), argc, argv);
end;
procedure TCefCommandLineRef.InitFromString(const commandLine: ustring);
var
cl: TCefString;
begin
cl := CefString(commandLine);
PCefCommandLine(FData).init_from_string(PCefCommandLine(FData), @cl);
end;
function TCefCommandLineRef.IsReadOnly: Boolean;
begin
Result := PCefCommandLine(FData).is_read_only(PCefCommandLine(FData)) <> 0;
end;
function TCefCommandLineRef.IsValid: Boolean;
begin
Result := PCefCommandLine(FData).is_valid(PCefCommandLine(FData)) <> 0;
end;
class function TCefCommandLineRef.New: ICefCommandLine;
begin
Result := UnWrap(cef_command_line_create);
end;
procedure TCefCommandLineRef.PrependWrapper(const wrapper: ustring);
var
w: TCefString;
begin
w := CefString(wrapper);
PCefCommandLine(FData).prepend_wrapper(PCefCommandLine(FData), @w);
end;
procedure TCefCommandLineRef.Reset;
begin
PCefCommandLine(FData).reset(PCefCommandLine(FData));
end;
procedure TCefCommandLineRef.SetProgram(const prog: ustring);
var
p: TCefString;
begin
p := CefString(prog);
PCefCommandLine(FData).set_program(PCefCommandLine(FData), @p);
end;
class function TCefCommandLineRef.UnWrap(data: Pointer): ICefCommandLine;
begin
if data <> nil then
Result := Create(data) as ICefCommandLine else
Result := nil;
end;
end.

107
uCEFCompletionCallback.pas Normal file
View File

@ -0,0 +1,107 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
// 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
//
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
//
// ************************************************************************
// ************ 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 uCEFCompletionCallback;
{$IFNDEF CPUX64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$ENDIF}
interface
uses
uCEFBase, uCEFInterfaces;
type
TCefCompletionCallbackOwn = class(TCefBaseOwn, ICefCompletionCallback)
protected
procedure OnComplete; virtual;
public
constructor Create; virtual;
end;
TCefFastCompletionCallback = class(TCefCompletionCallbackOwn)
protected
FProc: TCefCompletionCallbackProc;
procedure OnComplete; override;
public
constructor Create(const proc: TCefCompletionCallbackProc); reintroduce;
end;
implementation
uses
uCEFMiscFunctions, uCEFLibFunctions, uCEFTypes;
procedure cef_completion_callback_on_complete(self: PCefCompletionCallback); stdcall;
begin
with TCefCompletionCallbackOwn(CefGetObject(self)) do OnComplete();
end;
// TCefCompletionHandlerOwn
constructor TCefCompletionCallbackOwn.Create;
begin
inherited CreateData(SizeOf(TCefCompletionCallback));
with PCefCompletionCallback(FData)^ do on_complete := cef_completion_callback_on_complete;
end;
procedure TCefCompletionCallbackOwn.OnComplete;
begin
end;
// TCefFastCompletionHandler
constructor TCefFastCompletionCallback.Create(const proc: TCefCompletionCallbackProc);
begin
inherited Create;
FProc := proc;
end;
procedure TCefFastCompletionCallback.OnComplete;
begin
FProc();
end;
end.

270
uCEFConstants.pas Normal file
View File

@ -0,0 +1,270 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
// 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
//
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
//
// ************************************************************************
// ************ 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 uCEFConstants;
{$IFNDEF CPUX64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$ENDIF}
interface
uses
Winapi.Messages;
const
// /include/internal/cef_types.h (cef_errorcode_t)
ERR_NONE = 0;
ERR_FAILED = -2;
ERR_ABORTED = -3;
ERR_INVALID_ARGUMENT = -4;
ERR_INVALID_HANDLE = -5;
ERR_FILE_NOT_FOUND = -6;
ERR_TIMED_OUT = -7;
ERR_FILE_TOO_BIG = -8;
ERR_UNEXPECTED = -9;
ERR_ACCESS_DENIED = -10;
ERR_NOT_IMPLEMENTED = -11;
ERR_CONNECTION_CLOSED = -100;
ERR_CONNECTION_RESET = -101;
ERR_CONNECTION_REFUSED = -102;
ERR_CONNECTION_ABORTED = -103;
ERR_CONNECTION_FAILED = -104;
ERR_NAME_NOT_RESOLVED = -105;
ERR_INTERNET_DISCONNECTED = -106;
ERR_SSL_PROTOCOL_ERROR = -107;
ERR_ADDRESS_INVALID = -108;
ERR_ADDRESS_UNREACHABLE = -109;
ERR_SSL_CLIENT_AUTH_CERT_NEEDED = -110;
ERR_TUNNEL_CONNECTION_FAILED = -111;
ERR_NO_SSL_VERSIONS_ENABLED = -112;
ERR_SSL_VERSION_OR_CIPHER_MISMATCH = -113;
ERR_SSL_RENEGOTIATION_REQUESTED = -114;
ERR_CERT_COMMON_NAME_INVALID = -200;
ERR_CERT_BEGIN = ERR_CERT_COMMON_NAME_INVALID;
ERR_CERT_DATE_INVALID = -201;
ERR_CERT_AUTHORITY_INVALID = -202;
ERR_CERT_CONTAINS_ERRORS = -203;
ERR_CERT_NO_REVOCATION_MECHANISM = -204;
ERR_CERT_UNABLE_TO_CHECK_REVOCATION = -205;
ERR_CERT_REVOKED = -206;
ERR_CERT_INVALID = -207;
ERR_CERT_WEAK_SIGNATURE_ALGORITHM = -208;
ERR_CERT_NON_UNIQUE_NAME = -210;
ERR_CERT_WEAK_KEY = -211;
ERR_CERT_NAME_CONSTRAINT_VIOLATION = -212;
ERR_CERT_VALIDITY_TOO_LONG = -213;
ERR_CERT_END = ERR_CERT_VALIDITY_TOO_LONG;
ERR_INVALID_URL = -300;
ERR_DISALLOWED_URL_SCHEME = -301;
ERR_UNKNOWN_URL_SCHEME = -302;
ERR_TOO_MANY_REDIRECTS = -310;
ERR_UNSAFE_REDIRECT = -311;
ERR_UNSAFE_PORT = -312;
ERR_INVALID_RESPONSE = -320;
ERR_INVALID_CHUNKED_ENCODING = -321;
ERR_METHOD_NOT_SUPPORTED = -322;
ERR_UNEXPECTED_PROXY_AUTH = -323;
ERR_EMPTY_RESPONSE = -324;
ERR_RESPONSE_HEADERS_TOO_BIG = -325;
ERR_CACHE_MISS = -400;
ERR_INSECURE_RESPONSE = -501;
// /include/internal/cef_types.h (cef_cert_status_t)
CERT_STATUS_NONE = 0;
CERT_STATUS_COMMON_NAME_INVALID = 1 shl 0;
CERT_STATUS_DATE_INVALID = 1 shl 1;
CERT_STATUS_AUTHORITY_INVALID = 1 shl 2;
CERT_STATUS_NO_REVOCATION_MECHANISM = 1 shl 4;
CERT_STATUS_UNABLE_TO_CHECK_REVOCATION = 1 shl 5;
CERT_STATUS_REVOKED = 1 shl 6;
CERT_STATUS_INVALID = 1 shl 7;
CERT_STATUS_WEAK_SIGNATURE_ALGORITHM = 1 shl 8;
CERT_STATUS_NON_UNIQUE_NAME = 1 shl 10;
CERT_STATUS_WEAK_KEY = 1 shl 11;
CERT_STATUS_PINNED_KEY_MISSING = 1 shl 13;
CERT_STATUS_NAME_CONSTRAINT_VIOLATION = 1 shl 14;
CERT_STATUS_VALIDITY_TOO_LONG = 1 shl 15;
CERT_STATUS_IS_EV = 1 shl 16;
CERT_STATUS_REV_CHECKING_ENABLED = 1 shl 17;
CERT_STATUS_SHA1_SIGNATURE_PRESENT = 1 shl 19;
CERT_STATUS_CT_COMPLIANCE_FAILED = 1 shl 20;
CERT_STATUS_FIRST_ERROR = CERT_STATUS_COMMON_NAME_INVALID;
CERT_STATUS_LAST_ERROR = CERT_STATUS_VALIDITY_TOO_LONG;
// /include/internal/cef_types.h (cef_v8_propertyattribute_t)
V8_PROPERTY_ATTRIBUTE_NONE = [];
// /include/internal/cef_types.h (cef_transition_type_t)
TT_LINK = 0;
TT_EXPLICIT = 1;
TT_AUTO_SUBFRAME = 3;
TT_MANUAL_SUBFRAME = 4;
TT_FORM_SUBMIT = 7;
TT_RELOAD = 8;
TT_SOURCE_MASK = $FF;
TT_BLOCKED_FLAG = $00800000;
TT_FORWARD_BACK_FLAG = $01000000;
TT_CHAIN_START_FLAG = $10000000;
TT_CHAIN_END_FLAG = $20000000;
TT_CLIENT_REDIRECT_FLAG = $40000000;
TT_SERVER_REDIRECT_FLAG = $80000000;
TT_IS_REDIRECT_MASK = $C0000000;
TT_QUALIFIER_MASK = $FFFFFF00;
// /include/internal/cef_types.h (cef_dom_event_category_t)
DOM_EVENT_CATEGORY_UNKNOWN = $0;
DOM_EVENT_CATEGORY_UI = $1;
DOM_EVENT_CATEGORY_MOUSE = $2;
DOM_EVENT_CATEGORY_MUTATION = $4;
DOM_EVENT_CATEGORY_KEYBOARD = $8;
DOM_EVENT_CATEGORY_TEXT = $10;
DOM_EVENT_CATEGORY_COMPOSITION = $20;
DOM_EVENT_CATEGORY_DRAG = $40;
DOM_EVENT_CATEGORY_CLIPBOARD = $80;
DOM_EVENT_CATEGORY_MESSAGE = $100;
DOM_EVENT_CATEGORY_WHEEL = $200;
DOM_EVENT_CATEGORY_BEFORE_TEXT_INSERTED = $400;
DOM_EVENT_CATEGORY_OVERFLOW = $800;
DOM_EVENT_CATEGORY_PAGE_TRANSITION = $1000;
DOM_EVENT_CATEGORY_POPSTATE = $2000;
DOM_EVENT_CATEGORY_PROGRESS = $4000;
DOM_EVENT_CATEGORY_XMLHTTPREQUEST_PROGRESS = $8000;
// /include/internal/cef_types.h (cef_file_dialog_mode_t)
FILE_DIALOG_TYPE_MASK = $FF;
FILE_DIALOG_OVERWRITEPROMPT_FLAG = $01000000;
FILE_DIALOG_HIDEREADONLY_FLAG = $02000000;
// /include/internal/cef_types.h (cef_uri_unescape_rule_t)
UU_NONE = 0;
UU_NORMAL = 1 shl 0;
UU_SPACES = 1 shl 1;
UU_PATH_SEPARATORS = 1 shl 2;
UU_URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS = 1 shl 3;
UU_SPOOFING_AND_CONTROL_CHARS = 1 shl 4;
UU_REPLACE_PLUS_WITH_SPACE = 1 shl 5;
// /include/internal/cef_types.h (cef_menu_id_t)
MENU_ID_BACK = 100;
MENU_ID_FORWARD = 101;
MENU_ID_RELOAD = 102;
MENU_ID_RELOAD_NOCACHE = 103;
MENU_ID_STOPLOAD = 104;
MENU_ID_UNDO = 110;
MENU_ID_REDO = 111;
MENU_ID_CUT = 112;
MENU_ID_COPY = 113;
MENU_ID_PASTE = 114;
MENU_ID_DELETE = 115;
MENU_ID_SELECT_ALL = 116;
MENU_ID_FIND = 130;
MENU_ID_PRINT = 131;
MENU_ID_VIEW_SOURCE = 132;
MENU_ID_SPELLCHECK_SUGGESTION_0 = 200;
MENU_ID_SPELLCHECK_SUGGESTION_1 = 201;
MENU_ID_SPELLCHECK_SUGGESTION_2 = 202;
MENU_ID_SPELLCHECK_SUGGESTION_3 = 203;
MENU_ID_SPELLCHECK_SUGGESTION_4 = 204;
MENU_ID_SPELLCHECK_SUGGESTION_LAST = 204;
MENU_ID_NO_SPELLING_SUGGESTIONS = 205;
MENU_ID_ADD_TO_DICTIONARY = 206;
MENU_ID_CUSTOM_FIRST = 220;
MENU_ID_CUSTOM_LAST = 250;
MENU_ID_USER_FIRST = 26500;
MENU_ID_USER_LAST = 28500;
// /include/internal/cef_types.h (cef_ssl_version_t)
SSL_CONNECTION_VERSION_UNKNOWN = 0;
SSL_CONNECTION_VERSION_SSL2 = 1;
SSL_CONNECTION_VERSION_SSL3 = 2;
SSL_CONNECTION_VERSION_TLS1 = 3;
SSL_CONNECTION_VERSION_TLS1_1 = 4;
SSL_CONNECTION_VERSION_TLS1_2 = 5;
SSL_CONNECTION_VERSION_QUIC = 7;
//******************************************************
//****************** OTHER CONSTANTS *******************
//******************************************************
DEVTOOLS_WINDOWNAME = 'DevTools';
CEF_PROXYTYPE_DIRECT = 0;
CEF_PROXYTYPE_AUTODETECT = 1;
CEF_PROXYTYPE_SYSTEM = 2;
CEF_PROXYTYPE_FIXED_SERVERS = 3;
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;
ZOOM_STEP_25 = 0;
ZOOM_STEP_33 = 1;
ZOOM_STEP_50 = 2;
ZOOM_STEP_67 = 3;
ZOOM_STEP_75 = 4;
ZOOM_STEP_90 = 5;
ZOOM_STEP_100 = 6;
ZOOM_STEP_110 = 7;
ZOOM_STEP_125 = 8;
ZOOM_STEP_150 = 9;
ZOOM_STEP_175 = 10;
ZOOM_STEP_200 = 11;
ZOOM_STEP_250 = 12;
ZOOM_STEP_300 = 13;
ZOOM_STEP_400 = 14;
ZOOM_STEP_500 = 15;
ZOOM_STEP_MIN = ZOOM_STEP_25;
ZOOM_STEP_MAX = ZOOM_STEP_500;
ZOOM_STEP_DEF = ZOOM_STEP_100;
CEF_PREFERENCES_AVAILABLE = WM_APP + $A00;
CEF_DOONCLOSE = WM_APP + $A01;
USER_TIMER_MINIMUM = $0000000A;
USER_TIMER_MAXIMUM = $7FFFFFFF;
implementation
end.

186
uCEFContextMenuHandler.pas Normal file
View File

@ -0,0 +1,186 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
// 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
//
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
//
// ************************************************************************
// ************ 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 uCEFContextMenuHandler;
{$IFNDEF CPUX64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$ENDIF}
interface
uses
uCEFBase, uCEFInterfaces, uCEFTypes;
type
TCefContextMenuHandlerOwn = class(TCefBaseOwn, ICefContextMenuHandler)
protected
procedure OnBeforeContextMenu(const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel); virtual;
function RunContextMenu(const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel; const callback: ICefRunContextMenuCallback): Boolean; virtual;
function OnContextMenuCommand(const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; commandId: Integer; eventFlags: TCefEventFlags): Boolean; virtual;
procedure OnContextMenuDismissed(const browser: ICefBrowser; const frame: ICefFrame); virtual;
public
constructor Create; virtual;
end;
TCustomContextMenuHandler = class(TCefContextMenuHandlerOwn)
protected
FEvent: IChromiumEvents;
procedure OnBeforeContextMenu(const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel); override;
function OnContextMenuCommand(const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; commandId: Integer; eventFlags: TCefEventFlags): Boolean; override;
procedure OnContextMenuDismissed(const browser: ICefBrowser; const frame: ICefFrame); override;
public
constructor Create(const events: IChromiumEvents); reintroduce; virtual;
end;
implementation
uses
uCEFMiscFunctions, uCEFLibFunctions, uCEFBrowser, uCEFFrame, uCEFContextMenuParams,
uCEFMenuModel, uCEFRunContextMenuCallback;
procedure cef_context_menu_handler_on_before_context_menu(self: PCefContextMenuHandler;
browser: PCefBrowser; frame: PCefFrame; params: PCefContextMenuParams;
model: PCefMenuModel); stdcall;
begin
with TCefContextMenuHandlerOwn(CefGetObject(self)) do
OnBeforeContextMenu(TCefBrowserRef.UnWrap(browser), TCefFrameRef.UnWrap(frame),
TCefContextMenuParamsRef.UnWrap(params), TCefMenuModelRef.UnWrap(model));
end;
function cef_context_menu_handler_run_context_menu(self: PCefContextMenuHandler;
browser: PCefBrowser; frame: PCefFrame; params: PCefContextMenuParams;
model: PCefMenuModel; callback: PCefRunContextMenuCallback): Integer; stdcall;
begin
with TCefContextMenuHandlerOwn(CefGetObject(self)) do
Result := Ord(RunContextMenu(TCefBrowserRef.UnWrap(browser), TCefFrameRef.UnWrap(frame),
TCefContextMenuParamsRef.UnWrap(params), TCefMenuModelRef.UnWrap(model),
TCefRunContextMenuCallbackRef.UnWrap(callback)));
end;
function cef_context_menu_handler_on_context_menu_command(self: PCefContextMenuHandler;
browser: PCefBrowser; frame: PCefFrame; params: PCefContextMenuParams;
command_id: Integer; event_flags: Integer): Integer; stdcall;
begin
with TCefContextMenuHandlerOwn(CefGetObject(self)) do
Result := Ord(OnContextMenuCommand(TCefBrowserRef.UnWrap(browser), TCefFrameRef.UnWrap(frame),
TCefContextMenuParamsRef.UnWrap(params), command_id, TCefEventFlags(Pointer(@event_flags)^)));
end;
procedure cef_context_menu_handler_on_context_menu_dismissed(self: PCefContextMenuHandler;
browser: PCefBrowser; frame: PCefFrame); stdcall;
begin
with TCefContextMenuHandlerOwn(CefGetObject(self)) do
OnContextMenuDismissed(TCefBrowserRef.UnWrap(browser), TCefFrameRef.UnWrap(frame));
end;
constructor TCefContextMenuHandlerOwn.Create;
begin
inherited CreateData(SizeOf(TCefContextMenuHandler));
with PCefContextMenuHandler(FData)^ do
begin
on_before_context_menu := cef_context_menu_handler_on_before_context_menu;
run_context_menu := cef_context_menu_handler_run_context_menu;
on_context_menu_command := cef_context_menu_handler_on_context_menu_command;
on_context_menu_dismissed := cef_context_menu_handler_on_context_menu_dismissed;
end;
end;
procedure TCefContextMenuHandlerOwn.OnBeforeContextMenu(
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
end;
function TCefContextMenuHandlerOwn.OnContextMenuCommand(
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer;
eventFlags: TCefEventFlags): Boolean;
begin
Result := False;
end;
procedure TCefContextMenuHandlerOwn.OnContextMenuDismissed(
const browser: ICefBrowser; const frame: ICefFrame);
begin
end;
function TCefContextMenuHandlerOwn.RunContextMenu(const browser: ICefBrowser;
const frame: ICefFrame; const params: ICefContextMenuParams;
const model: ICefMenuModel;
const callback: ICefRunContextMenuCallback): Boolean;
begin
Result := False;
end;
// TCustomContextMenuHandler
constructor TCustomContextMenuHandler.Create(const events: IChromiumEvents);
begin
inherited Create;
FEvent := events;
end;
procedure TCustomContextMenuHandler.OnBeforeContextMenu(
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
FEvent.doOnBeforeContextMenu(browser, frame, params, model);
end;
function TCustomContextMenuHandler.OnContextMenuCommand(
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer;
eventFlags: TCefEventFlags): Boolean;
begin
Result := FEvent.doOnContextMenuCommand(browser, frame, params, commandId,
eventFlags);
end;
procedure TCustomContextMenuHandler.OnContextMenuDismissed(
const browser: ICefBrowser; const frame: ICefFrame);
begin
FEvent.doOnContextMenuDismissed(browser, frame);
end;
end.

215
uCEFContextMenuParams.pas Normal file
View File

@ -0,0 +1,215 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
// 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
//
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
//
// ************************************************************************
// ************ 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 uCEFContextMenuParams;
{$IFNDEF CPUX64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$ENDIF}
interface
uses
System.Classes,
uCEFBase, uCEFInterfaces, uCEFTypes;
type
TCefContextMenuParamsRef = class(TCefBaseRef, ICefContextMenuParams)
protected
function GetXCoord: Integer;
function GetYCoord: Integer;
function GetTypeFlags: TCefContextMenuTypeFlags;
function GetLinkUrl: ustring;
function GetUnfilteredLinkUrl: ustring;
function GetSourceUrl: ustring;
function HasImageContents: Boolean;
function GetTitleText: ustring;
function GetPageUrl: ustring;
function GetFrameUrl: ustring;
function GetFrameCharset: ustring;
function GetMediaType: TCefContextMenuMediaType;
function GetMediaStateFlags: TCefContextMenuMediaStateFlags;
function GetSelectionText: ustring;
function GetMisspelledWord: ustring;
function GetDictionarySuggestions(const suggestions: TStringList): Boolean;
function IsEditable: Boolean;
function IsSpellCheckEnabled: Boolean;
function GetEditStateFlags: TCefContextMenuEditStateFlags;
function IsCustomMenu: Boolean;
function IsPepperMenu: Boolean;
public
class function UnWrap(data: Pointer): ICefContextMenuParams;
end;
implementation
uses
uCEFMiscFunctions, uCEFLibFunctions;
function TCefContextMenuParamsRef.GetDictionarySuggestions(
const suggestions: TStringList): Boolean;
var
list: TCefStringList;
i: Integer;
str: TCefString;
begin
list := cef_string_list_alloc;
try
Result := PCefContextMenuParams(FData).get_dictionary_suggestions(PCefContextMenuParams(FData), list) <> 0;
FillChar(str, SizeOf(str), 0);
for i := 0 to cef_string_list_size(list) - 1 do
begin
FillChar(str, SizeOf(str), 0);
cef_string_list_value(list, i, @str);
suggestions.Add(CefStringClearAndGet(str));
end;
finally
cef_string_list_free(list);
end;
end;
function TCefContextMenuParamsRef.GetEditStateFlags: TCefContextMenuEditStateFlags;
begin
Byte(Result) := PCefContextMenuParams(FData).get_edit_state_flags(PCefContextMenuParams(FData));
end;
function TCefContextMenuParamsRef.GetFrameCharset: ustring;
begin
Result := CefStringFreeAndGet(PCefContextMenuParams(FData).get_frame_charset(PCefContextMenuParams(FData)));
end;
function TCefContextMenuParamsRef.GetFrameUrl: ustring;
begin
Result := CefStringFreeAndGet(PCefContextMenuParams(FData).get_frame_url(PCefContextMenuParams(FData)));
end;
function TCefContextMenuParamsRef.GetLinkUrl: ustring;
begin
Result := CefStringFreeAndGet(PCefContextMenuParams(FData).get_link_url(PCefContextMenuParams(FData)));
end;
function TCefContextMenuParamsRef.GetMediaStateFlags: TCefContextMenuMediaStateFlags;
begin
Word(Result) := PCefContextMenuParams(FData).get_media_state_flags(PCefContextMenuParams(FData));
end;
function TCefContextMenuParamsRef.GetMediaType: TCefContextMenuMediaType;
begin
Result := PCefContextMenuParams(FData).get_media_type(PCefContextMenuParams(FData));
end;
function TCefContextMenuParamsRef.GetMisspelledWord: ustring;
begin
Result := CefStringFreeAndGet(PCefContextMenuParams(FData).get_misspelled_word(PCefContextMenuParams(FData)));
end;
function TCefContextMenuParamsRef.GetTitleText: ustring;
begin
Result := CefStringFreeAndGet(PCefContextMenuParams(FData).get_title_text(PCefContextMenuParams(FData)));
end;
function TCefContextMenuParamsRef.GetPageUrl: ustring;
begin
Result := CefStringFreeAndGet(PCefContextMenuParams(FData).get_page_url(PCefContextMenuParams(FData)));
end;
function TCefContextMenuParamsRef.GetSelectionText: ustring;
begin
Result := CefStringFreeAndGet(PCefContextMenuParams(FData).get_selection_text(PCefContextMenuParams(FData)));
end;
function TCefContextMenuParamsRef.GetSourceUrl: ustring;
begin
Result := CefStringFreeAndGet(PCefContextMenuParams(FData).get_source_url(PCefContextMenuParams(FData)));
end;
function TCefContextMenuParamsRef.GetTypeFlags: TCefContextMenuTypeFlags;
begin
Byte(Result) := PCefContextMenuParams(FData).get_type_flags(PCefContextMenuParams(FData));
end;
function TCefContextMenuParamsRef.GetUnfilteredLinkUrl: ustring;
begin
Result := CefStringFreeAndGet(PCefContextMenuParams(FData).get_unfiltered_link_url(PCefContextMenuParams(FData)));
end;
function TCefContextMenuParamsRef.GetXCoord: Integer;
begin
Result := PCefContextMenuParams(FData).get_xcoord(PCefContextMenuParams(FData));
end;
function TCefContextMenuParamsRef.GetYCoord: Integer;
begin
Result := PCefContextMenuParams(FData).get_ycoord(PCefContextMenuParams(FData));
end;
function TCefContextMenuParamsRef.IsCustomMenu: Boolean;
begin
Result := PCefContextMenuParams(FData).is_custom_menu(PCefContextMenuParams(FData)) <> 0;
end;
function TCefContextMenuParamsRef.IsEditable: Boolean;
begin
Result := PCefContextMenuParams(FData).is_editable(PCefContextMenuParams(FData)) <> 0;
end;
function TCefContextMenuParamsRef.IsPepperMenu: Boolean;
begin
Result := PCefContextMenuParams(FData).is_pepper_menu(PCefContextMenuParams(FData)) <> 0;
end;
function TCefContextMenuParamsRef.IsSpellCheckEnabled: Boolean;
begin
Result := PCefContextMenuParams(FData).is_spell_check_enabled(PCefContextMenuParams(FData)) <> 0;
end;
function TCefContextMenuParamsRef.HasImageContents: Boolean;
begin
Result := PCefContextMenuParams(FData).has_image_contents(PCefContextMenuParams(FData)) <> 0;
end;
class function TCefContextMenuParamsRef.UnWrap(
data: Pointer): ICefContextMenuParams;
begin
if data <> nil then
Result := Create(data) as ICefContextMenuParams else
Result := nil;
end;
end.

256
uCEFCookieManager.pas Normal file
View File

@ -0,0 +1,256 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
// 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
//
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
//
// ************************************************************************
// ************ 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 uCEFCookieManager;
{$IFNDEF CPUX64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$ENDIF}
interface
uses
System.Classes,
uCEFBase, uCEFInterfaces, uCEFTypes;
type
TCefCookieManagerRef = class(TCefBaseRef, ICefCookieManager)
protected
procedure SetSupportedSchemes(schemes: TStrings; const callback: ICefCompletionCallback);
procedure SetSupportedSchemesProc(schemes: TStrings; const callback: TCefCompletionCallbackProc);
function VisitAllCookies(const visitor: ICefCookieVisitor): Boolean;
function VisitAllCookiesProc(const visitor: TCefCookieVisitorProc): Boolean;
function VisitUrlCookies(const url: ustring; includeHttpOnly: Boolean; const visitor: ICefCookieVisitor): 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 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 DeleteCookiesProc(const url, cookieName: ustring; const callback: TCefDeleteCookiesCallbackProc): Boolean;
function SetStoragePath(const path: ustring; persistSessionCookies: Boolean; const callback: ICefCompletionCallback): Boolean;
function SetStoragePathProc(const path: ustring; persistSessionCookies: Boolean; const callback: TCefCompletionCallbackProc): Boolean;
function FlushStore(const handler: ICefCompletionCallback): Boolean;
function FlushStoreProc(const proc: TCefCompletionCallbackProc): Boolean;
public
class function UnWrap(data: Pointer): ICefCookieManager;
class function Global(const callback: ICefCompletionCallback): ICefCookieManager;
class function GlobalProc(const callback: TCefCompletionCallbackProc): ICefCookieManager;
class function New(const path: ustring; persistSessionCookies: Boolean; const callback: ICefCompletionCallback): ICefCookieManager;
class function NewProc(const path: ustring; persistSessionCookies: Boolean; const callback: TCefCompletionCallbackProc): ICefCookieManager;
end;
implementation
uses
uCEFMiscFunctions, uCEFLibFunctions, uCEFCompletionCallback, uCEFDeleteCookiesCallback,
uCEFSetCookieCallback, uCEFCookieVisitor;
class function TCefCookieManagerRef.New(const path: ustring; persistSessionCookies: Boolean;
const callback: ICefCompletionCallback): ICefCookieManager;
var
pth: TCefString;
begin
pth := CefString(path);
Result := UnWrap(cef_cookie_manager_create_manager(@pth, Ord(persistSessionCookies), CefGetData(callback)));
end;
class function TCefCookieManagerRef.NewProc(const path: ustring;
persistSessionCookies: Boolean;
const callback: TCefCompletionCallbackProc): ICefCookieManager;
begin
Result := New(path, persistSessionCookies, TCefFastCompletionCallback.Create(callback));
end;
function TCefCookieManagerRef.DeleteCookies(const url,
cookieName: ustring; const callback: ICefDeleteCookiesCallback): Boolean;
var
u, n: TCefString;
begin
u := CefString(url);
n := CefString(cookieName);
Result := PCefCookieManager(FData).delete_cookies(
PCefCookieManager(FData), @u, @n, CefGetData(callback)) <> 0;
end;
function TCefCookieManagerRef.DeleteCookiesProc(const url, cookieName: ustring;
const callback: TCefDeleteCookiesCallbackProc): Boolean;
begin
Result := DeleteCookies(url, cookieName, TCefFastDeleteCookiesCallback.Create(callback));
end;
function TCefCookieManagerRef.FlushStore(
const handler: ICefCompletionCallback): Boolean;
begin
Result := PCefCookieManager(FData).flush_store(PCefCookieManager(FData),
CefGetData(handler)) <> 0;
end;
function TCefCookieManagerRef.FlushStoreProc(
const proc: TCefCompletionCallbackProc): Boolean;
begin
Result := FlushStore(TCefFastCompletionCallback.Create(proc))
end;
class function TCefCookieManagerRef.Global(const callback: ICefCompletionCallback): ICefCookieManager;
begin
Result := UnWrap(cef_cookie_manager_get_global_manager(CefGetData(callback)));
end;
class function TCefCookieManagerRef.GlobalProc(
const callback: TCefCompletionCallbackProc): ICefCookieManager;
begin
Result := Global(TCefFastCompletionCallback.Create(callback));
end;
function TCefCookieManagerRef.SetCookie(const url, name, value, domain,
path: ustring; secure, httponly, hasExpires: Boolean; const creation,
lastAccess, expires: TDateTime; const callback: ICefSetCookieCallback): Boolean;
var
str: TCefString;
cook: TCefCookie;
begin
str := CefString(url);
cook.name := CefString(name);
cook.value := CefString(value);
cook.domain := CefString(domain);
cook.path := CefString(path);
cook.secure := Ord(secure);
cook.httponly := Ord(httponly);
cook.creation := DateTimeToCefTime(creation);
cook.last_access := DateTimeToCefTime(lastAccess);
cook.has_expires := Ord(hasExpires);
if hasExpires then
cook.expires := DateTimeToCefTime(expires) else
FillChar(cook.expires, SizeOf(TCefTime), 0);
Result := PCefCookieManager(FData).set_cookie(
PCefCookieManager(FData), @str, @cook, CefGetData(callback)) <> 0;
end;
function TCefCookieManagerRef.SetCookieProc(const url, name, value, domain,
path: ustring; secure, httponly, hasExpires: Boolean; const creation,
lastAccess, expires: TDateTime;
const callback: TCefSetCookieCallbackProc): Boolean;
begin
Result := SetCookie(url, name, value, domain, path, secure,
httponly, hasExpires, creation, lastAccess, expires,
TCefFastSetCookieCallback.Create(callback));
end;
function TCefCookieManagerRef.SetStoragePath(const path: ustring;
persistSessionCookies: Boolean; const callback: ICefCompletionCallback): Boolean;
var
p: TCefString;
begin
p := CefString(path);
Result := PCefCookieManager(FData)^.set_storage_path(
PCefCookieManager(FData), @p, Ord(persistSessionCookies), CefGetData(callback)) <> 0;
end;
function TCefCookieManagerRef.SetStoragePathProc(const path: ustring;
persistSessionCookies: Boolean;
const callback: TCefCompletionCallbackProc): Boolean;
begin
Result := SetStoragePath(path, persistSessionCookies, TCefFastCompletionCallback.Create(callback));
end;
procedure TCefCookieManagerRef.SetSupportedSchemes(schemes: TStrings; const callback: ICefCompletionCallback);
var
list: TCefStringList;
i: Integer;
item: TCefString;
begin
list := cef_string_list_alloc();
try
if (schemes <> nil) then
for i := 0 to schemes.Count - 1 do
begin
item := CefString(schemes[i]);
cef_string_list_append(list, @item);
end;
PCefCookieManager(FData).set_supported_schemes(
PCefCookieManager(FData), list, CefGetData(callback));
finally
cef_string_list_free(list);
end;
end;
procedure TCefCookieManagerRef.SetSupportedSchemesProc(schemes: TStrings;
const callback: TCefCompletionCallbackProc);
begin
SetSupportedSchemes(schemes, TCefFastCompletionCallback.Create(callback));
end;
class function TCefCookieManagerRef.UnWrap(data: Pointer): ICefCookieManager;
begin
if data <> nil then
Result := Create(data) as ICefCookieManager else
Result := nil;
end;
function TCefCookieManagerRef.VisitAllCookies(
const visitor: ICefCookieVisitor): Boolean;
begin
Result := PCefCookieManager(FData).visit_all_cookies(
PCefCookieManager(FData), CefGetData(visitor)) <> 0;
end;
function TCefCookieManagerRef.VisitAllCookiesProc(
const visitor: TCefCookieVisitorProc): Boolean;
begin
Result := VisitAllCookies(
TCefFastCookieVisitor.Create(visitor) as ICefCookieVisitor);
end;
function TCefCookieManagerRef.VisitUrlCookies(const url: ustring;
includeHttpOnly: Boolean; const visitor: ICefCookieVisitor): Boolean;
var
str: TCefString;
begin
str := CefString(url);
Result := PCefCookieManager(FData).visit_url_cookies(PCefCookieManager(FData), @str, Ord(includeHttpOnly), CefGetData(visitor)) <> 0;
end;
function TCefCookieManagerRef.VisitUrlCookiesProc(const url: ustring;
includeHttpOnly: Boolean; const visitor: TCefCookieVisitorProc): Boolean;
begin
Result := VisitUrlCookies(url, includeHttpOnly,
TCefFastCookieVisitor.Create(visitor) as ICefCookieVisitor);
end;
end.

124
uCEFCookieVisitor.pas Normal file
View File

@ -0,0 +1,124 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
// 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
//
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
//
// ************************************************************************
// ************ 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;
{$IFNDEF CPUX64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$ENDIF}
interface
uses
uCEFBase, uCEFInterfaces, uCEFTypes;
type
TCefCookieVisitorOwn = class(TCefBaseOwn, ICefCookieVisitor)
protected
function visit(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; out deleteCookie: Boolean): Boolean; virtual;
public
constructor Create; virtual;
end;
TCefFastCookieVisitor = class(TCefCookieVisitorOwn)
protected
FVisitor: TCefCookieVisitorProc;
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 visitor: TCefCookieVisitorProc); reintroduce;
end;
implementation
uses
uCEFMiscFunctions, uCEFLibFunctions;
function cef_cookie_visitor_visit(self: PCefCookieVisitor; const cookie: PCefCookie;
count, total: Integer; deleteCookie: PInteger): Integer; stdcall;
var
delete: Boolean;
exp: TDateTime;
begin
delete := False;
if cookie.has_expires <> 0 then
exp := CefTimeToDateTime(cookie.expires) else
exp := 0;
Result := Ord(TCefCookieVisitorOwn(CefGetObject(self)).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), exp, count, total, delete));
deleteCookie^ := Ord(delete);
end;
// TCefCookieVisitorOwn
constructor TCefCookieVisitorOwn.Create;
begin
inherited CreateData(SizeOf(TCefCookieVisitor));
PCefCookieVisitor(FData)^.visit := cef_cookie_visitor_visit;
end;
function TCefCookieVisitorOwn.visit(const name, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
count, total: Integer; out deleteCookie: Boolean): Boolean;
begin
Result := True;
end;
// TCefFastCookieVisitor
constructor TCefFastCookieVisitor.Create(const visitor: TCefCookieVisitorProc);
begin
inherited Create;
FVisitor := visitor;
end;
function TCefFastCookieVisitor.visit(const name, value, domain, path: ustring;
secure, httponly, hasExpires: Boolean; const creation, lastAccess,
expires: TDateTime; count, total: Integer; out deleteCookie: Boolean): Boolean;
begin
Result := FVisitor(name, value, domain, path, secure, httponly, hasExpires,
creation, lastAccess, expires, count, total, deleteCookie);
end;
end.

157
uCEFCustomStreamReader.pas Normal file
View File

@ -0,0 +1,157 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
// 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
//
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
//
// ************************************************************************
// ************ 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 uCEFCustomStreamReader;
{$IFNDEF CPUX64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$ENDIF}
interface
uses
System.Classes, System.SysUtils,
uCEFBase, uCEFInterfaces, uCEFTypes;
type
TCefCustomStreamReader = class(TCefBaseOwn, ICefCustomStreamReader)
protected
FStream: TStream;
FOwned: Boolean;
function Read(ptr: Pointer; size, n: NativeUInt): NativeUInt; virtual;
function Seek(offset: Int64; whence: Integer): Integer; virtual;
function Tell: Int64; virtual;
function Eof: Boolean; virtual;
function MayBlock: Boolean; virtual;
public
constructor Create(Stream: TStream; Owned: Boolean); overload; virtual;
constructor Create(const filename: string); overload; virtual;
destructor Destroy; override;
end;
implementation
uses
uCEFMiscFunctions, uCEFLibFunctions;
function cef_stream_reader_read(self: PCefReadHandler; ptr: Pointer; size, n: NativeUInt): NativeUInt; stdcall;
begin
with TCefCustomStreamReader(CefGetObject(self)) do
Result := Read(ptr, size, n);
end;
function cef_stream_reader_seek(self: PCefReadHandler; offset: Int64; whence: Integer): Integer; stdcall;
begin
with TCefCustomStreamReader(CefGetObject(self)) do
Result := Seek(offset, whence);
end;
function cef_stream_reader_tell(self: PCefReadHandler): Int64; stdcall;
begin
with TCefCustomStreamReader(CefGetObject(self)) do
Result := Tell;
end;
function cef_stream_reader_eof(self: PCefReadHandler): Integer; stdcall;
begin
with TCefCustomStreamReader(CefGetObject(self)) do
Result := Ord(Eof);
end;
function cef_stream_reader_may_block(self: PCefReadHandler): Integer; stdcall;
begin
with TCefCustomStreamReader(CefGetObject(self)) do
Result := Ord(MayBlock);
end;
constructor TCefCustomStreamReader.Create(Stream: TStream; Owned: Boolean);
begin
inherited CreateData(SizeOf(TCefReadHandler));
FStream := stream;
FOwned := Owned;
with PCefReadHandler(FData)^ do
begin
read := cef_stream_reader_read;
seek := cef_stream_reader_seek;
tell := cef_stream_reader_tell;
eof := cef_stream_reader_eof;
may_block := cef_stream_reader_may_block;
end;
end;
constructor TCefCustomStreamReader.Create(const filename: string);
begin
Create(TFileStream.Create(filename, fmOpenRead or fmShareDenyWrite), True);
end;
destructor TCefCustomStreamReader.Destroy;
begin
if FOwned then
FStream.Free;
inherited;
end;
function TCefCustomStreamReader.Eof: Boolean;
begin
Result := FStream.Position = FStream.size;
end;
function TCefCustomStreamReader.MayBlock: Boolean;
begin
Result := False;
end;
function TCefCustomStreamReader.Read(ptr: Pointer; size, n: NativeUInt): NativeUInt;
begin
result := NativeUInt(FStream.Read(ptr^, n * size)) div size;
end;
function TCefCustomStreamReader.Seek(offset: Int64; whence: Integer): Integer;
begin
Result := FStream.Seek(offset, TSeekOrigin(whence));
end;
function TCefCustomStreamReader.Tell: Int64;
begin
Result := FStream.Position;
end;
end.