-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathuCefRenderProcessMessageReceiver.pas
128 lines (105 loc) · 3.32 KB
/
uCefRenderProcessMessageReceiver.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
unit uCefRenderProcessMessageReceiver;
interface
uses
System.SysUtils, System.Generics.Collections,
//
uCEFApplication, uCefTypes, uCefInterfaces;
type
TCefRenderProcessMessageReceiver = class
private
protected
FName: string;
//---
procedure Receive(const ABrowser: ICefBrowser; ASourceProcess: TCefProcessId;
const AMessage: ICefProcessMessage; var AHandled: boolean); virtual;
public
constructor Create(const AName: string);
destructor Destroy; override;
end;
procedure CefAppRenderProcessMessageInit;
procedure CefAppRenderProcessMessageReceiverAdd(const A: TCefRenderProcessMessageReceiver);
implementation
type
TCefRenderProcessMessageReceiverOwner = class
private
FHandlers: TObjectList<TCefRenderProcessMessageReceiver>;
//---
procedure Receive(const ABrowser: ICefBrowser; const AFrame: ICefFrame; ASourceProcess: TCefProcessId; const AMessage: ICefProcessMessage; var AHandled : boolean);
public
constructor Create;
destructor Destroy; override;
//---
procedure InitCefGlobalApp;
procedure AddRceiver(const A: TCefRenderProcessMessageReceiver);
end;
var
gReceiver: TCefRenderProcessMessageReceiverOwner;
procedure CefAppRenderProcessMessageInit;
begin
gReceiver.InitCefGlobalApp()
end;
procedure CefAppRenderProcessMessageReceiverAdd(const A: TCefRenderProcessMessageReceiver);
begin
gReceiver.AddRceiver(A)
end;
{ TCefRenderProcessMessageReceiverOwner }
procedure TCefRenderProcessMessageReceiverOwner.AddRceiver(
const A: TCefRenderProcessMessageReceiver);
begin
FHandlers.Add(A)
end;
constructor TCefRenderProcessMessageReceiverOwner.Create;
begin
FHandlers := TObjectList<TCefRenderProcessMessageReceiver>.Create(True);
InitCefGlobalApp();
end;
destructor TCefRenderProcessMessageReceiverOwner.Destroy;
begin
if Assigned(GlobalCEFApp) then
GlobalCEFApp.OnProcessMessageReceived := nil;
FHandlers.Free;
inherited;
end;
procedure TCefRenderProcessMessageReceiverOwner.InitCefGlobalApp;
begin
if Assigned(GlobalCEFApp) then
begin
GlobalCEFApp.OnProcessMessageReceived := Self.Receive;
//TODO: release callback list uCefCallbackList.pas
// GlobalCEFApp.OnContextReleased := release callback list ?
end;
end;
procedure TCefRenderProcessMessageReceiverOwner.Receive(const ABrowser: ICefBrowser; const AFrame: ICefFrame; ASourceProcess: TCefProcessId; const AMessage: ICefProcessMessage; var AHandled : boolean);
var H: TCefRenderProcessMessageReceiver;
begin
for H in FHandlers do
begin
if H.FName = AMessage.Name then
begin
H.Receive(ABrowser, ASourceProcess, AMessage, AHandled);
if AHandled then
Exit()
end;
end;
AHandled := False
end;
{ TCefRenderProcessMessageReceiver }
constructor TCefRenderProcessMessageReceiver.Create(const AName: string);
begin
FName := AName
end;
destructor TCefRenderProcessMessageReceiver.Destroy;
begin
inherited;
end;
procedure TCefRenderProcessMessageReceiver.Receive(const ABrowser: ICefBrowser;
ASourceProcess: TCefProcessId; const AMessage: ICefProcessMessage;
var AHandled: boolean);
begin
AHandled := False;
end;
initialization
gReceiver := TCefRenderProcessMessageReceiverOwner.Create;
finalization
FreeAndNil(gReceiver)
end.