Code: Select all
SimpleNodeSearch(Chromium1...???, 'link-ajax j-v-contacts-expand-link');
Code: Select all
SimpleNodeSearch(Chromium1...???, 'link-ajax j-v-contacts-expand-link');
// To send messages from the render process you must use the browser.SendProcessMessage
// procedure with a PID_BROWSER parameter. The browser process receives those messages in
// the TChromium.OnProcessMessageReceived event.
Code: Select all
MSG1 = 'mymessage';
...
...
...
procedure TMiniBrowserFrm.Chromium1LoadEnd(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
httpStatusCode: Integer);
var
msg: ICefProcessMessage;
begin
if frame.IsMain then
begin
msg := TCefProcessMessageRef.New(MSG1);
msg.ArgumentList.SetString(0, 'Chromium1LoadEnd');
browser.SendProcessMessage(PID_BROWSER, msg); // error here
end;
end;
Code: Select all
// To send messages from the render process you must use the frame.SendProcessMessage
// procedure with a PID_BROWSER parameter. The browser process receives those messages in
// the TChromium.OnProcessMessageReceived event.
Code: Select all
browser.SendProcessMessage(PID_BROWSER, msg);
Code: Select all
frame.SendProcessMessage(PID_BROWSER, msg);
Code: Select all
procedure CreateGlobalCEFApp;
begin
GlobalCEFApp := TCefApplication.Create;
GlobalCEFApp.RemoteDebuggingPort := 9000;
GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived;
GlobalCEFApp.DisableFeatures := 'NetworkService';
GlobalCEFApp.Cache := 'cache';//ExtractFilePath(Application.ExeName) + 'Cache\' ;
GlobalCEFApp.UserDataPath := 'UserData';// ExtractFilePath(Application.ExeName) + 'UserData\';
GlobalCEFApp.LogFile := 'debug.log';
GlobalCEFApp.LogSeverity := LOGSEVERITY_INFO;
end;
Code: Select all
procedure GlobalCEFApp_OnProcessMessageReceived(const browser : ICefBrowser;
const frame : ICefFrame;
sourceProcess : TCefProcessId;
const message : ICefProcessMessage;
var aHandled : boolean);
var
TempFrame : ICefFrame;
TempVisitor : TCefFastDomVisitor2;
begin
aHandled := False;
MiniBrowserFrm.Memo1.Lines.Add('GlobalCEFApp_OnProcessMessageReceived');
...
....
end;
Code: Select all
procedure TMiniBrowserFrm.Chromium1LoadEnd(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
httpStatusCode: Integer);
var
msg: ICefProcessMessage;
begin
if frame.IsMain then
begin
msg := TCefProcessMessageRef.New(MSG1);
msg.ArgumentList.SetString(0, 'Chromium1LoadEnd');
frame.SendProcessMessage(PID_BROWSER, msg);
Memo1.Lines.Add('Chromium1LoadEnd');
end;
end;
Code: Select all
procedure GlobalCEFApp_OnProcessMessageReceived(const browser : ICefBrowser;
const frame : ICefFrame;
sourceProcess : TCefProcessId;
const message : ICefProcessMessage;
var aHandled : boolean);
var
msg: ICefProcessMessage;
begin
msg := TCefProcessMessageRef.New(MY_CUSTOM_MESSAGE_NAME);
msg.ArgumentList.SetString(0, 'This is the information I need to send to the browser process');
frame.SendProcessMessage(PID_BROWSER, msg);
end;
Code: Select all
procedure TDOMVisitorFrm.Chromium1ProcessMessageReceived(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame; sourceProcess: TCefProcessId;
const message: ICefProcessMessage; out Result: Boolean);
begin
Result := False;
if (message = nil) or (message.ArgumentList = nil) then exit;
if (message.Name = MY_CUSTOM_MESSAGE_NAME) then
begin
// You should save message.ArgumentList.GetString(0) in a class field for later processing because TChromium.OnProcessMessageReceived is executed in a CEF thread and we shouldn't handle VCL controls outside the main application thread.
Memo1.Lines.Add(message.ArgumentList.GetString(0));
Result := True;
end;
end;