1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-05-13 21:46:53 +02:00

Partial fix for issue #291

- Create the CefApp handlers only when they are needed in SingleProcess mode.
- Added several "RemoveReferences" procedures to disable events when the application is shutting down in the CefApp handlers.
This commit is contained in:
Salvador Diaz Fau 2020-11-10 15:02:49 +01:00
parent 9ac740613c
commit e72db93dd2
9 changed files with 164 additions and 65 deletions

View File

@ -65,6 +65,8 @@ type
procedure GetBrowserProcessHandler(var aHandler : ICefBrowserProcessHandler); virtual; abstract; procedure GetBrowserProcessHandler(var aHandler : ICefBrowserProcessHandler); virtual; abstract;
procedure GetRenderProcessHandler(var aHandler : ICefRenderProcessHandler); virtual; abstract; procedure GetRenderProcessHandler(var aHandler : ICefRenderProcessHandler); virtual; abstract;
procedure RemoveReferences; virtual; abstract;
public public
constructor Create; virtual; constructor Create; virtual;
end; end;
@ -83,10 +85,11 @@ type
procedure GetRenderProcessHandler(var aHandler : ICefRenderProcessHandler); override; procedure GetRenderProcessHandler(var aHandler : ICefRenderProcessHandler); override;
procedure InitializeVars; procedure InitializeVars;
procedure RemoveReferences; override;
public public
constructor Create(const aCefApp : TCefApplicationCore); reintroduce; constructor Create(const aCefApp : TCefApplicationCore); reintroduce;
procedure BeforeDestruction; override; destructor Destroy; override;
end; end;
@ -104,9 +107,9 @@ uses
// TCefAppOwn // TCefAppOwn
procedure cef_app_on_before_command_line_processing(self: PCefApp; procedure cef_app_on_before_command_line_processing( self : PCefApp;
const process_type: PCefString; const process_type : PCefString;
command_line: PCefCommandLine); stdcall; command_line : PCefCommandLine); stdcall;
var var
TempObject : TObject; TempObject : TObject;
begin begin
@ -117,7 +120,8 @@ begin
TCefCommandLineRef.UnWrap(command_line)); TCefCommandLineRef.UnWrap(command_line));
end; end;
procedure cef_app_on_register_custom_schemes(self: PCefApp; registrar: PCefSchemeRegistrar); stdcall; procedure cef_app_on_register_custom_schemes(self : PCefApp;
registrar : PCefSchemeRegistrar); stdcall;
var var
TempWrapper : TCefSchemeRegistrarRef; TempWrapper : TCefSchemeRegistrarRef;
TempObject : TObject; TempObject : TObject;
@ -216,10 +220,10 @@ constructor TCustomCefApp.Create(const aCefApp : TCefApplicationCore);
begin begin
inherited Create; inherited Create;
FCefApp := aCefApp;
InitializeVars; InitializeVars;
FCefApp := aCefApp;
if (FCefApp <> nil) then if (FCefApp <> nil) then
begin begin
if FCefApp.MustCreateBrowserProcessHandler then if FCefApp.MustCreateBrowserProcessHandler then
@ -233,22 +237,35 @@ begin
end; end;
end; end;
procedure TCustomCefApp.BeforeDestruction; destructor TCustomCefApp.Destroy;
begin begin
FCefApp := nil; RemoveReferences;
InitializeVars; inherited Destroy;
inherited BeforeDestruction;
end; end;
procedure TCustomCefApp.InitializeVars; procedure TCustomCefApp.InitializeVars;
begin begin
FCefApp := nil;
FResourceBundleHandler := nil; FResourceBundleHandler := nil;
FBrowserProcessHandler := nil; FBrowserProcessHandler := nil;
FRenderProcessHandler := nil; FRenderProcessHandler := nil;
end; end;
procedure TCustomCefApp.RemoveReferences;
begin
if (FResourceBundleHandler <> nil) then
FResourceBundleHandler.RemoveReferences;
if (FBrowserProcessHandler <> nil) then
FBrowserProcessHandler.RemoveReferences;
if (FRenderProcessHandler <> nil) then
FRenderProcessHandler.RemoveReferences;
InitializeVars;
end;
procedure TCustomCefApp.OnBeforeCommandLineProcessing(const processType: ustring; const commandLine: ICefCommandLine); procedure TCustomCefApp.OnBeforeCommandLineProcessing(const processType: ustring; const commandLine: ICefCommandLine);
begin begin
try try

View File

@ -80,6 +80,7 @@ type
FDestroyAppWindows : boolean; FDestroyAppWindows : boolean;
procedure BeforeInitSubProcess; override; procedure BeforeInitSubProcess; override;
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;

View File

@ -803,7 +803,11 @@ begin
LoadCEFlibrary then LoadCEFlibrary then
begin begin
TempApp := TCustomCefApp.Create(self); TempApp := TCustomCefApp.Create(self);
Result := InitializeLibrary(TempApp);
if InitializeLibrary(TempApp) then
Result := True
else
TempApp.RemoveReferences;
end; end;
except except
on e : exception do on e : exception do
@ -824,14 +828,24 @@ begin
TempApp := nil; TempApp := nil;
try try
if CheckCEFLibrary and LoadCEFlibrary then try
begin if CheckCEFLibrary and LoadCEFlibrary then
if (FProcessType <> ptBrowser) then begin
BeforeInitSubProcess; if (FProcessType <> ptBrowser) then
BeforeInitSubProcess;
TempApp := TCustomCefApp.Create(self); TempApp := TCustomCefApp.Create(self);
Result := (ExecuteProcess(TempApp) < 0) and InitializeLibrary(TempApp);
end; if (ExecuteProcess(TempApp) < 0) and
InitializeLibrary(TempApp) then
Result := True
else
TempApp.RemoveReferences;
end;
except
on e : exception do
if CustomExceptionHandler('TCefApplicationCore.SingleExeProcessing', e) then raise;
end;
finally finally
TempApp := nil; TempApp := nil;
end; end;
@ -1048,13 +1062,22 @@ begin
TempApp := nil; TempApp := nil;
try try
if not(FSingleProcess) and try
(ProcessType <> ptBrowser) and if not(FSingleProcess) and
LoadCEFlibrary then (ProcessType <> ptBrowser) and
begin LoadCEFlibrary then
TempApp := TCustomCefApp.Create(self); begin
Result := (ExecuteProcess(TempApp) >= 0); TempApp := TCustomCefApp.Create(self);
end;
if (ExecuteProcess(TempApp) >= 0) then
Result := True
else
TempApp.RemoveReferences;
end;
except
on e : exception do
if CustomExceptionHandler('TCefApplicationCore.StartSubProcess', e) then raise;
end;
finally finally
TempApp := nil; TempApp := nil;
end; end;
@ -1924,8 +1947,7 @@ end;
function TCefApplicationCore.GetMustCreateResourceBundleHandler : boolean; function TCefApplicationCore.GetMustCreateResourceBundleHandler : boolean;
begin begin
Result := FSingleProcess or Result := ((FSingleProcess or (FProcessType in [ptBrowser, ptRenderer])) and
((FProcessType in [ptBrowser, ptRenderer]) and
(FMustCreateResourceBundleHandler or (FMustCreateResourceBundleHandler or
assigned(FOnGetLocalizedString) or assigned(FOnGetLocalizedString) or
assigned(FOnGetDataResource) or assigned(FOnGetDataResource) or
@ -1934,8 +1956,7 @@ end;
function TCefApplicationCore.GetMustCreateBrowserProcessHandler : boolean; function TCefApplicationCore.GetMustCreateBrowserProcessHandler : boolean;
begin begin
Result := FSingleProcess or Result := ((FSingleProcess or (FProcessType = ptBrowser)) and
((FProcessType = ptBrowser) and
(FMustCreateBrowserProcessHandler or (FMustCreateBrowserProcessHandler or
assigned(FOnContextInitialized) or assigned(FOnContextInitialized) or
assigned(FOnBeforeChildProcessLaunch) or assigned(FOnBeforeChildProcessLaunch) or
@ -1944,8 +1965,7 @@ end;
function TCefApplicationCore.GetMustCreateRenderProcessHandler : boolean; function TCefApplicationCore.GetMustCreateRenderProcessHandler : boolean;
begin begin
Result := FSingleProcess or Result := ((FSingleProcess or (FProcessType = ptRenderer)) and
((FProcessType = ptRenderer) and
(FMustCreateRenderProcessHandler or (FMustCreateRenderProcessHandler or
MustCreateLoadHandler or MustCreateLoadHandler or
assigned(FOnWebKitInitialized) or assigned(FOnWebKitInitialized) or
@ -1960,8 +1980,7 @@ end;
function TCefApplicationCore.GetMustCreateLoadHandler : boolean; function TCefApplicationCore.GetMustCreateLoadHandler : boolean;
begin begin
Result := FSingleProcess or Result := ((FSingleProcess or (FProcessType = ptRenderer)) and
((FProcessType = ptRenderer) and
(FMustCreateLoadHandler or (FMustCreateLoadHandler or
assigned(FOnLoadingStateChange) or assigned(FOnLoadingStateChange) or
assigned(FOnLoadStart) or assigned(FOnLoadStart) or

View File

@ -59,6 +59,8 @@ type
procedure GetPrintHandler(var aHandler : ICefPrintHandler); virtual; procedure GetPrintHandler(var aHandler : ICefPrintHandler); virtual;
procedure OnScheduleMessagePumpWork(const delayMs: Int64); virtual; abstract; procedure OnScheduleMessagePumpWork(const delayMs: Int64); virtual; abstract;
procedure RemoveReferences; virtual; abstract;
public public
constructor Create; virtual; constructor Create; virtual;
end; end;
@ -71,6 +73,8 @@ type
procedure OnBeforeChildProcessLaunch(const commandLine: ICefCommandLine); override; procedure OnBeforeChildProcessLaunch(const commandLine: ICefCommandLine); override;
procedure OnScheduleMessagePumpWork(const delayMs: Int64); override; procedure OnScheduleMessagePumpWork(const delayMs: Int64); override;
procedure RemoveReferences; override;
public public
constructor Create(const aCefApp : TCefApplicationCore); reintroduce; constructor Create(const aCefApp : TCefApplicationCore); reintroduce;
destructor Destroy; override; destructor Destroy; override;
@ -92,7 +96,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefBrowserProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefBrowserProcessHandlerOwn) then
TCefBrowserProcessHandlerOwn(TempObject).OnContextInitialized; TCefBrowserProcessHandlerOwn(TempObject).OnContextInitialized;
end; end;
@ -103,7 +108,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefBrowserProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefBrowserProcessHandlerOwn) then
TCefBrowserProcessHandlerOwn(TempObject).OnBeforeChildProcessLaunch(TCefCommandLineRef.UnWrap(command_line)); TCefBrowserProcessHandlerOwn(TempObject).OnBeforeChildProcessLaunch(TCefCommandLineRef.UnWrap(command_line));
end; end;
@ -115,7 +121,8 @@ begin
Result := nil; Result := nil;
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefBrowserProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefBrowserProcessHandlerOwn) then
try try
TCefBrowserProcessHandlerOwn(TempObject).GetPrintHandler(TempHandler); TCefBrowserProcessHandlerOwn(TempObject).GetPrintHandler(TempHandler);
if (TempHandler <> nil) then Result := TempHandler.Wrap; if (TempHandler <> nil) then Result := TempHandler.Wrap;
@ -131,7 +138,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefBrowserProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefBrowserProcessHandlerOwn) then
TCefBrowserProcessHandlerOwn(TempObject).OnScheduleMessagePumpWork(delay_ms); TCefBrowserProcessHandlerOwn(TempObject).OnScheduleMessagePumpWork(delay_ms);
end; end;
@ -154,6 +162,7 @@ begin
end; end;
// TCefCustomBrowserProcessHandler // TCefCustomBrowserProcessHandler
@ -166,12 +175,17 @@ end;
destructor TCefCustomBrowserProcessHandler.Destroy; destructor TCefCustomBrowserProcessHandler.Destroy;
begin begin
FCefApp := nil; RemoveReferences;
inherited Destroy; inherited Destroy;
end; end;
procedure TCefCustomBrowserProcessHandler.OnContextInitialized; procedure TCefCustomBrowserProcessHandler.RemoveReferences;
begin
FCefApp := nil;
end;
procedure TCefCustomBrowserProcessHandler.OnContextInitialized;
begin begin
try try
if (FCefApp <> nil) then FCefApp.Internal_OnContextInitialized; if (FCefApp <> nil) then FCefApp.Internal_OnContextInitialized;

View File

@ -1422,6 +1422,8 @@ type
function GetLocalizedString(stringId: Integer; var stringVal: ustring): Boolean; function GetLocalizedString(stringId: Integer; var stringVal: ustring): Boolean;
function GetDataResource(resourceId: Integer; var data: Pointer; var dataSize: NativeUInt): Boolean; function GetDataResource(resourceId: Integer; var data: Pointer; var dataSize: NativeUInt): Boolean;
function GetDataResourceForScale(resourceId: Integer; scaleFactor: TCefScaleFactor; var data: Pointer; var dataSize: NativeUInt): Boolean; function GetDataResourceForScale(resourceId: Integer; scaleFactor: TCefScaleFactor; var data: Pointer; var dataSize: NativeUInt): Boolean;
procedure RemoveReferences; // custom procedure to clear all references
end; end;
// TCefBrowserProcessHandler // TCefBrowserProcessHandler
@ -1432,6 +1434,8 @@ type
procedure OnBeforeChildProcessLaunch(const commandLine: ICefCommandLine); procedure OnBeforeChildProcessLaunch(const commandLine: ICefCommandLine);
procedure GetPrintHandler(var aHandler : ICefPrintHandler); procedure GetPrintHandler(var aHandler : ICefPrintHandler);
procedure OnScheduleMessagePumpWork(const delayMs: Int64); procedure OnScheduleMessagePumpWork(const delayMs: Int64);
procedure RemoveReferences; // custom procedure to clear all references
end; end;
// TCefRenderProcessHandler // TCefRenderProcessHandler
@ -1447,6 +1451,8 @@ type
procedure OnUncaughtException(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context; const V8Exception: ICefV8Exception; const stackTrace: ICefV8StackTrace); procedure OnUncaughtException(const browser: ICefBrowser; const frame: ICefFrame; const context: ICefv8Context; const V8Exception: ICefV8Exception; const stackTrace: ICefV8StackTrace);
procedure OnFocusedNodeChanged(const browser: ICefBrowser; const frame: ICefFrame; const node: ICefDomNode); procedure OnFocusedNodeChanged(const browser: ICefBrowser; const frame: ICefFrame; const node: ICefDomNode);
function OnProcessMessageReceived(const browser: ICefBrowser; const frame: ICefFrame; sourceProcess: TCefProcessId; const aMessage: ICefProcessMessage): Boolean; function OnProcessMessageReceived(const browser: ICefBrowser; const frame: ICefFrame; sourceProcess: TCefProcessId; const aMessage: ICefProcessMessage): Boolean;
procedure RemoveReferences; // custom procedure to clear all references
end; end;
// TCefApp // TCefApp
@ -1458,6 +1464,8 @@ type
procedure GetResourceBundleHandler(var aHandler : ICefResourceBundleHandler); procedure GetResourceBundleHandler(var aHandler : ICefResourceBundleHandler);
procedure GetBrowserProcessHandler(var aHandler : ICefBrowserProcessHandler); procedure GetBrowserProcessHandler(var aHandler : ICefBrowserProcessHandler);
procedure GetRenderProcessHandler(var aHandler : ICefRenderProcessHandler); procedure GetRenderProcessHandler(var aHandler : ICefRenderProcessHandler);
procedure RemoveReferences; // custom procedure to clear all references
end; end;
// TCefCompletionCallback // TCefCompletionCallback

View File

@ -90,6 +90,8 @@ type
procedure OnLoadEnd(const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer); override; procedure OnLoadEnd(const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer); override;
procedure OnLoadError(const browser: ICefBrowser; const frame: ICefFrame; errorCode: TCefErrorCode; const errorText, failedUrl: ustring); override; procedure OnLoadError(const browser: ICefBrowser; const frame: ICefFrame; errorCode: TCefErrorCode; const errorText, failedUrl: ustring); override;
procedure RemoveReferences; override;
public public
constructor Create(const aCefApp : TCefApplicationCore); reintroduce; virtual; constructor Create(const aCefApp : TCefApplicationCore); reintroduce; virtual;
destructor Destroy; override; destructor Destroy; override;
@ -273,11 +275,16 @@ end;
destructor TCustomRenderLoadHandler.Destroy; destructor TCustomRenderLoadHandler.Destroy;
begin begin
FCefApp := nil; RemoveReferences;
inherited Destroy; inherited Destroy;
end; end;
procedure TCustomRenderLoadHandler.RemoveReferences;
begin
FCefApp := nil;
end;
procedure TCustomRenderLoadHandler.OnLoadEnd(const browser : ICefBrowser; procedure TCustomRenderLoadHandler.OnLoadEnd(const browser : ICefBrowser;
const frame : ICefFrame; const frame : ICefFrame;
httpStatusCode : Integer); httpStatusCode : Integer);

View File

@ -70,6 +70,8 @@ type
procedure OnFocusedNodeChanged(const browser: ICefBrowser; const frame: ICefFrame; const node: ICefDomNode); virtual; abstract; procedure OnFocusedNodeChanged(const browser: ICefBrowser; const frame: ICefFrame; const node: ICefDomNode); virtual; abstract;
function OnProcessMessageReceived(const browser: ICefBrowser; const frame: ICefFrame; sourceProcess: TCefProcessId; const aMessage: ICefProcessMessage): Boolean; virtual; function OnProcessMessageReceived(const browser: ICefBrowser; const frame: ICefFrame; sourceProcess: TCefProcessId; const aMessage: ICefProcessMessage): Boolean; virtual;
procedure RemoveReferences; virtual; abstract;
public public
constructor Create; virtual; constructor Create; virtual;
end; end;
@ -89,6 +91,8 @@ type
procedure OnFocusedNodeChanged(const browser: ICefBrowser; const frame: ICefFrame; const node: ICefDomNode); override; procedure OnFocusedNodeChanged(const browser: ICefBrowser; const frame: ICefFrame; const node: ICefDomNode); override;
function OnProcessMessageReceived(const browser: ICefBrowser; const frame: ICefFrame; sourceProcess: TCefProcessId; const aMessage : ICefProcessMessage): Boolean; override; function OnProcessMessageReceived(const browser: ICefBrowser; const frame: ICefFrame; sourceProcess: TCefProcessId; const aMessage : ICefProcessMessage): Boolean; override;
procedure RemoveReferences; override;
public public
constructor Create(const aCefApp : TCefApplicationCore); reintroduce; constructor Create(const aCefApp : TCefApplicationCore); reintroduce;
destructor Destroy; override; destructor Destroy; override;
@ -110,7 +114,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRenderProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefRenderProcessHandlerOwn) then
TCefRenderProcessHandlerOwn(TempObject).OnWebKitInitialized; TCefRenderProcessHandlerOwn(TempObject).OnWebKitInitialized;
end; end;
@ -122,7 +127,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRenderProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefRenderProcessHandlerOwn) then
TCefRenderProcessHandlerOwn(TempObject).OnBrowserCreated(TCefBrowserRef.UnWrap(browser), TCefRenderProcessHandlerOwn(TempObject).OnBrowserCreated(TCefBrowserRef.UnWrap(browser),
TCefDictionaryValueRef.UnWrap(extra_info)); TCefDictionaryValueRef.UnWrap(extra_info));
end; end;
@ -134,7 +140,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRenderProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefRenderProcessHandlerOwn) then
TCefRenderProcessHandlerOwn(TempObject).OnBrowserDestroyed(TCefBrowserRef.UnWrap(browser)); TCefRenderProcessHandlerOwn(TempObject).OnBrowserDestroyed(TCefBrowserRef.UnWrap(browser));
end; end;
@ -145,7 +152,8 @@ begin
Result := nil; Result := nil;
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRenderProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefRenderProcessHandlerOwn) then
Result := CefGetData(TCefRenderProcessHandlerOwn(TempObject).GetLoadHandler); Result := CefGetData(TCefRenderProcessHandlerOwn(TempObject).GetLoadHandler);
end; end;
@ -158,7 +166,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRenderProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefRenderProcessHandlerOwn) then
TCefRenderProcessHandlerOwn(TempObject).OnContextCreated(TCefBrowserRef.UnWrap(browser), TCefRenderProcessHandlerOwn(TempObject).OnContextCreated(TCefBrowserRef.UnWrap(browser),
TCefFrameRef.UnWrap(frame), TCefFrameRef.UnWrap(frame),
TCefv8ContextRef.UnWrap(context)); TCefv8ContextRef.UnWrap(context));
@ -173,7 +182,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRenderProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefRenderProcessHandlerOwn) then
TCefRenderProcessHandlerOwn(TempObject).OnContextReleased(TCefBrowserRef.UnWrap(browser), TCefRenderProcessHandlerOwn(TempObject).OnContextReleased(TCefBrowserRef.UnWrap(browser),
TCefFrameRef.UnWrap(frame), TCefFrameRef.UnWrap(frame),
TCefv8ContextRef.UnWrap(context)); TCefv8ContextRef.UnWrap(context));
@ -190,7 +200,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRenderProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefRenderProcessHandlerOwn) then
TCefRenderProcessHandlerOwn(TempObject).OnUncaughtException(TCefBrowserRef.UnWrap(browser), TCefRenderProcessHandlerOwn(TempObject).OnUncaughtException(TCefBrowserRef.UnWrap(browser),
TCefFrameRef.UnWrap(frame), TCefFrameRef.UnWrap(frame),
TCefv8ContextRef.UnWrap(context), TCefv8ContextRef.UnWrap(context),
@ -207,7 +218,8 @@ var
begin begin
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRenderProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefRenderProcessHandlerOwn) then
TCefRenderProcessHandlerOwn(TempObject).OnFocusedNodeChanged(TCefBrowserRef.UnWrap(browser), TCefRenderProcessHandlerOwn(TempObject).OnFocusedNodeChanged(TCefBrowserRef.UnWrap(browser),
TCefFrameRef.UnWrap(frame), TCefFrameRef.UnWrap(frame),
TCefDomNodeRef.UnWrap(node)); TCefDomNodeRef.UnWrap(node));
@ -224,7 +236,8 @@ begin
Result := Ord(False); Result := Ord(False);
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefRenderProcessHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefRenderProcessHandlerOwn) then
Result := Ord(TCefRenderProcessHandlerOwn(TempObject).OnProcessMessageReceived(TCefBrowserRef.UnWrap(browser), Result := Ord(TCefRenderProcessHandlerOwn(TempObject).OnProcessMessageReceived(TCefBrowserRef.UnWrap(browser),
TCefFrameRef.UnWrap(frame), TCefFrameRef.UnWrap(frame),
source_process, source_process,
@ -274,22 +287,30 @@ constructor TCefCustomRenderProcessHandler.Create(const aCefApp : TCefApplicatio
begin begin
inherited Create; inherited Create;
RemoveReferences;
FCefApp := aCefApp; FCefApp := aCefApp;
if (FCefApp <> nil) and FCefApp.MustCreateLoadHandler then if (FCefApp <> nil) and FCefApp.MustCreateLoadHandler then
FLoadHandler := TCustomRenderLoadHandler.Create(FCefApp) FLoadHandler := TCustomRenderLoadHandler.Create(FCefApp);
else
FLoadHandler := nil;
end; end;
destructor TCefCustomRenderProcessHandler.Destroy; destructor TCefCustomRenderProcessHandler.Destroy;
begin begin
FCefApp := nil; RemoveReferences;
FLoadHandler := nil;
inherited Destroy; inherited Destroy;
end; end;
procedure TCefCustomRenderProcessHandler.RemoveReferences;
begin
if (FLoadHandler <> nil) then
FLoadHandler.RemoveReferences;
FCefApp := nil;
FLoadHandler := nil;
end;
procedure TCefCustomRenderProcessHandler.OnWebKitInitialized; procedure TCefCustomRenderProcessHandler.OnWebKitInitialized;
begin begin
try try
@ -378,10 +399,10 @@ begin
end; end;
end; end;
function TCefCustomRenderProcessHandler.OnProcessMessageReceived(const browser : ICefBrowser; function TCefCustomRenderProcessHandler.OnProcessMessageReceived(const browser : ICefBrowser;
const frame : ICefFrame; const frame : ICefFrame;
sourceProcess : TCefProcessId; sourceProcess : TCefProcessId;
const aMessage : ICefProcessMessage): Boolean; const aMessage : ICefProcessMessage): Boolean;
begin begin
Result := inherited OnProcessMessageReceived(browser, frame, sourceProcess, aMessage); Result := inherited OnProcessMessageReceived(browser, frame, sourceProcess, aMessage);

View File

@ -58,6 +58,8 @@ type
function GetDataResource(resourceId: Integer; var data: Pointer; var dataSize: NativeUInt): Boolean; virtual; abstract; function GetDataResource(resourceId: Integer; var data: Pointer; var dataSize: NativeUInt): Boolean; virtual; abstract;
function GetDataResourceForScale(resourceId: Integer; scaleFactor: TCefScaleFactor; var data: Pointer; var dataSize: NativeUInt): Boolean; virtual; abstract; function GetDataResourceForScale(resourceId: Integer; scaleFactor: TCefScaleFactor; var data: Pointer; var dataSize: NativeUInt): Boolean; virtual; abstract;
procedure RemoveReferences; virtual; abstract;
public public
constructor Create; virtual; constructor Create; virtual;
end; end;
@ -70,6 +72,8 @@ type
function GetDataResource(resourceId: Integer; var data: Pointer; var dataSize: NativeUInt): Boolean; override; function GetDataResource(resourceId: Integer; var data: Pointer; var dataSize: NativeUInt): Boolean; override;
function GetDataResourceForScale(resourceId: Integer; scaleFactor: TCefScaleFactor; var data: Pointer; var dataSize: NativeUInt): Boolean; override; function GetDataResourceForScale(resourceId: Integer; scaleFactor: TCefScaleFactor; var data: Pointer; var dataSize: NativeUInt): Boolean; override;
procedure RemoveReferences; override;
public public
constructor Create(const aCefApp : TCefApplicationCore); reintroduce; constructor Create(const aCefApp : TCefApplicationCore); reintroduce;
destructor Destroy; override; destructor Destroy; override;
@ -95,7 +99,8 @@ begin
Result := Ord(False); Result := Ord(False);
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefResourceBundleHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefResourceBundleHandlerOwn) then
begin begin
TempString := ''; TempString := '';
Result := Ord(TCefResourceBundleHandlerOwn(TempObject).GetLocalizedString(string_id, TempString)); Result := Ord(TCefResourceBundleHandlerOwn(TempObject).GetLocalizedString(string_id, TempString));
@ -118,7 +123,8 @@ begin
Result := Ord(False); Result := Ord(False);
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefResourceBundleHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefResourceBundleHandlerOwn) then
Result := Ord(TCefResourceBundleHandlerOwn(TempObject).GetDataResource(resource_id, data, data_size)); Result := Ord(TCefResourceBundleHandlerOwn(TempObject).GetDataResource(resource_id, data, data_size));
end; end;
@ -133,7 +139,8 @@ begin
Result := Ord(False); Result := Ord(False);
TempObject := CefGetObject(self); TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefResourceBundleHandlerOwn) then if (TempObject <> nil) and
(TempObject is TCefResourceBundleHandlerOwn) then
Result := Ord(TCefResourceBundleHandlerOwn(TempObject).GetDataResourceForScale(resource_id, scale_factor, data, data_size)); Result := Ord(TCefResourceBundleHandlerOwn(TempObject).GetDataResourceForScale(resource_id, scale_factor, data, data_size));
end; end;
@ -162,11 +169,16 @@ end;
destructor TCefCustomResourceBundleHandler.Destroy; destructor TCefCustomResourceBundleHandler.Destroy;
begin begin
FCefApp := nil; RemoveReferences;
inherited Destroy; inherited Destroy;
end; end;
procedure TCefCustomResourceBundleHandler.RemoveReferences;
begin
FCefApp := nil;
end;
function TCefCustomResourceBundleHandler.GetLocalizedString( stringid : Integer; function TCefCustomResourceBundleHandler.GetLocalizedString( stringid : Integer;
var stringVal : ustring): Boolean; var stringVal : ustring): Boolean;
begin begin

View File

@ -2,7 +2,7 @@
"UpdateLazPackages" : [ "UpdateLazPackages" : [
{ {
"ForceNotify" : true, "ForceNotify" : true,
"InternalVersion" : 197, "InternalVersion" : 198,
"Name" : "cef4delphi_lazarus.lpk", "Name" : "cef4delphi_lazarus.lpk",
"Version" : "86.0.21.0" "Version" : "86.0.21.0"
} }