I have the following source:
Code: Select all
unit MyUnit;
interface
{$I cef.inc}
uses
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
uCEFWindowParent,
uCEFChromiumWindow,
uCEFChromium,
uCEFInterfaces,
Vcl.ExtCtrls,
Vcl.StdCtrls,
uCEFTypes,
uCEFApplication,
uCEFConstants;
const
MINIBROWSER_VISITDOM = WM_APP + $101;
type
TForm1 = class(TForm)
ChromiumWindow1: TChromiumWindow;
Timer1: TTimer;
Chromium1: TChromium;
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer);
procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
procedure Chromium1ProcessMessageReceived(Sender: TObject; const browser: ICefBrowser;
sourceProcess: TCefProcessId; const message: ICefProcessMessage; out Result: Boolean);
private
{ Private declarations }
FChromiumCreated: Boolean;
FChromiumPageLoaded: Boolean;
procedure WMMove(var aMessage: TWMMove); message WM_MOVE;
procedure WMMoving(var aMessage: TMessage); message WM_MOVING;
public
{ Public declarations }
function IsChromiumCreated: Boolean;
function IsChromiumPageLoaded: Boolean;
procedure RetrieveResult;
end;
var
Form1: TForm1;
procedure GlobalCEFApp_OnProcessMessageReceived(const browser: ICefBrowser;
sourceProcess: TCefProcessId; const message: ICefProcessMessage; var aHandled: boolean);
implementation
uses
uCEFProcessMessage,
uCEFMiscFunctions,
uCEFSchemeRegistrar,
uCEFRenderProcessHandler,
uCEFv8Handler,
uCEFDomVisitor,
uCEFDomNode,
uCEFTask,
StrUtils;
{$R *.dfm}
const
Actions: array[0..0] of string = ('RETRIEVE_RESULT');
var
BrowserAction: Integer;
procedure TForm1.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
begin
FChromiumCreated := True;
end;
procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer);
begin
FChromiumPageLoaded := False;
if frame = nil then
exit;
if (frame <> nil) and frame.IsMain then
begin
FChromiumPageLoaded := True;
end
else
begin
if httpStatusCode = 200 then
begin
if (browser <> nil) and (frame.IsMain = True) then
begin
FChromiumPageLoaded := True;
end;
end;
end;
end;
procedure TForm1.Chromium1ProcessMessageReceived(Sender: TObject; const browser: ICefBrowser;
sourceProcess: TCefProcessId; const message: ICefProcessMessage; out Result: Boolean);
begin
Result := False;
if (message = nil) or (message.ArgumentList = nil) then
exit;
if (message.Name = Actions[0]) then
begin
// ShowStatusText('DOM Visitor result text : ' + message.ArgumentList.GetString(0));
Result := True;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FChromiumCreated := False;
FChromiumPageLoaded := False;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
if not (Chromium1.CreateBrowser(ChromiumWindow1, '')) then
Timer1.Enabled := True;
end;
function TForm1.IsChromiumCreated: Boolean;
begin
Result := FChromiumCreated;
end;
function TForm1.IsChromiumPageLoaded: Boolean;
begin
Result := FChromiumPageLoaded;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
if not (Chromium1.CreateBrowser(ChromiumWindow1, '')) and not (Chromium1.Initialized) then
Timer1.Enabled := True
end;
procedure TForm1.RetrieveResult;
var
TempMsg: ICefProcessMessage;
begin
BrowserAction := 0;
TempMsg := TCefProcessMessageRef.New(actions[0]);
Chromium1.SendProcessMessage(PID_RENDERER, TempMsg);
end;
procedure TForm1.WMMove(var aMessage: TWMMove);
begin
inherited;
if (Chromium1 <> nil) then
Chromium1.NotifyMoveOrResizeStarted;
end;
procedure TForm1.WMMoving(var aMessage: TMessage);
begin
inherited;
if (Chromium1 <> nil) then
Chromium1.NotifyMoveOrResizeStarted;
end;
procedure DOMVisitor_OnDocAvailable(const browser: ICefBrowser; const document: ICefDomDocument);
var
msg: ICefProcessMessage;
begin
case BrowserAction of
0:
begin
msg := TCefProcessMessageRef.New(actions[BrowserAction]);
msg.ArgumentList.SetString(0, 'document.Title : ' + document.Title);
// SimpleNodeSearch(document);
end;
end;
browser.SendProcessMessage(PID_BROWSER, msg);
end;
procedure GlobalCEFApp_OnProcessMessageReceived(const browser: ICefBrowser;
sourceProcess: TCefProcessId; const message: ICefProcessMessage; var aHandled: boolean);
var
TempFrame: ICefFrame;
TempVisitor: TCefFastDomVisitor2;
begin
if (browser <> nil) and (message.name = Actions[0]) then
begin
TempFrame := browser.MainFrame;
if (TempFrame <> nil) then
begin
TempVisitor := TCefFastDomVisitor2.Create(browser, DOMVisitor_OnDocAvailable);
TempFrame.VisitDom(TempVisitor);
end;
aHandled := True
end
else
aHandled := False;
end;
end.
I looked at the DOMVisitor example but I cannot understand why.
Many thanks
Alberto