| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- unit Unit2;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, cefvcl, ceflib;
- type
- TForm2 = class(TForm)
- crm: TChromium;
- btn1: TButton;
- procedure btn1Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- procedure crmProcessMessageReceived(Sender: TObject;
- const browser: ICefBrowser; sourceProcess: TCefProcessId;
- const message: ICefProcessMessage; out Result: Boolean);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- TJSDelphiClass = class(TObject)
- private
- FContent: string;
- procedure SetContent(const Value: string);
- protected
- public
- property Content: string read FContent write SetContent;
- end;
- TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
- private
- protected
- procedure OnWebKitInitialized; override;
- function OnProcessMessageReceived(const browser: ICefBrowser;
- sourceProcess: TCefProcessId; const message: ICefProcessMessage)
- : Boolean; override;
- end;
- var
- Form2: TForm2;
- DelphiVar: TJSDelphiClass;
- implementation
- {$R *.dfm}
- procedure TForm2.btn1Click(Sender: TObject);
- begin
- crm.browser.MainFrame.ExecuteJavaScript('my_script();', '', 0);
- crm.browser.SendProcessMessage(PID_RENDERER,
- TCefProcessMessageRef.New('MY_MAIN_MESSAGE'));
- end;
- procedure TForm2.crmProcessMessageReceived(Sender: TObject;
- const browser: ICefBrowser; sourceProcess: TCefProcessId;
- const message: ICefProcessMessage; out Result: Boolean);
- var
- Msg: ICefProcessMessage;
- begin
- if (message.Name = 'MY_RENDERER_MESSAGE') then
- begin
- Msg := TCefProcessMessageRef.New('MY_RENDERER_MESSAGE');
- ShowMessage('Main:'+DelphiVar.Content);
- ShowMessage('From Render:'+message.ArgumentList.GetString(0));
- Msg.ArgumentList.SetString(0, DelphiVar.Content);
- browser.SendProcessMessage(PID_BROWSER, Msg);
- Result := True;
- end;
- end;
- procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- begin
- if CefSingleProcess then
- begin
- crm.Load('about:blank');
- end;
- end;
- procedure TForm2.FormCreate(Sender: TObject);
- begin
- crm.browser.MainFrame.LoadUrl('file:///D:\DelphiProjects\test\index.htm');
- end;
- { TCustomRenderProcessHandler }
- function TCustomRenderProcessHandler.OnProcessMessageReceived(
- const browser: ICefBrowser; sourceProcess: TCefProcessId;
- const message: ICefProcessMessage): Boolean;
- var
- Msg: ICefProcessMessage;
- begin
- if (message.Name = 'MY_MAIN_MESSAGE') then
- begin
- Msg := TCefProcessMessageRef.New('MY_RENDERER_MESSAGE');
- ShowMessage('Render:'+DelphiVar.Content);
- Msg.ArgumentList.SetString(0, DelphiVar.Content);
- browser.SendProcessMessage(PID_BROWSER, Msg);
- Result := True;
- end;
- end;
- procedure TCustomRenderProcessHandler.OnWebKitInitialized;
- begin
- inherited;
- TCefRTTIExtension.Register('jsvar', DelphiVar);
- end;
- { TJSDelphiClass }
- procedure TJSDelphiClass.SetContent(const Value: string);
- begin
- FContent := Value;
- end;
- initialization
- CefRemoteDebuggingPort := 9000;
- CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
- CefBrowserProcessHandler := TCefBrowserProcessHandlerOwn.Create;
- DelphiVar := TJSDelphiClass.Create;
- finalization
- DelphiVar.Free;
- end.
|