Unit2.pas 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. unit Unit2;
  2. interface
  3. uses
  4. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  5. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, cefvcl, ceflib;
  6. type
  7. TForm2 = class(TForm)
  8. crm: TChromium;
  9. btn1: TButton;
  10. procedure btn1Click(Sender: TObject);
  11. procedure FormCreate(Sender: TObject);
  12. procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  13. procedure crmProcessMessageReceived(Sender: TObject;
  14. const browser: ICefBrowser; sourceProcess: TCefProcessId;
  15. const message: ICefProcessMessage; out Result: Boolean);
  16. private
  17. { Private declarations }
  18. public
  19. { Public declarations }
  20. end;
  21. TJSDelphiClass = class(TObject)
  22. private
  23. FContent: string;
  24. procedure SetContent(const Value: string);
  25. protected
  26. public
  27. property Content: string read FContent write SetContent;
  28. end;
  29. TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
  30. private
  31. protected
  32. procedure OnWebKitInitialized; override;
  33. function OnProcessMessageReceived(const browser: ICefBrowser;
  34. sourceProcess: TCefProcessId; const message: ICefProcessMessage)
  35. : Boolean; override;
  36. end;
  37. var
  38. Form2: TForm2;
  39. DelphiVar: TJSDelphiClass;
  40. implementation
  41. {$R *.dfm}
  42. procedure TForm2.btn1Click(Sender: TObject);
  43. begin
  44. crm.browser.MainFrame.ExecuteJavaScript('my_script();', '', 0);
  45. crm.browser.SendProcessMessage(PID_RENDERER,
  46. TCefProcessMessageRef.New('MY_MAIN_MESSAGE'));
  47. end;
  48. procedure TForm2.crmProcessMessageReceived(Sender: TObject;
  49. const browser: ICefBrowser; sourceProcess: TCefProcessId;
  50. const message: ICefProcessMessage; out Result: Boolean);
  51. var
  52. Msg: ICefProcessMessage;
  53. begin
  54. if (message.Name = 'MY_RENDERER_MESSAGE') then
  55. begin
  56. Msg := TCefProcessMessageRef.New('MY_RENDERER_MESSAGE');
  57. ShowMessage('Main:'+DelphiVar.Content);
  58. ShowMessage('From Render:'+message.ArgumentList.GetString(0));
  59. Msg.ArgumentList.SetString(0, DelphiVar.Content);
  60. browser.SendProcessMessage(PID_BROWSER, Msg);
  61. Result := True;
  62. end;
  63. end;
  64. procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  65. begin
  66. if CefSingleProcess then
  67. begin
  68. crm.Load('about:blank');
  69. end;
  70. end;
  71. procedure TForm2.FormCreate(Sender: TObject);
  72. begin
  73. crm.browser.MainFrame.LoadUrl('file:///D:\DelphiProjects\test\index.htm');
  74. end;
  75. { TCustomRenderProcessHandler }
  76. function TCustomRenderProcessHandler.OnProcessMessageReceived(
  77. const browser: ICefBrowser; sourceProcess: TCefProcessId;
  78. const message: ICefProcessMessage): Boolean;
  79. var
  80. Msg: ICefProcessMessage;
  81. begin
  82. if (message.Name = 'MY_MAIN_MESSAGE') then
  83. begin
  84. Msg := TCefProcessMessageRef.New('MY_RENDERER_MESSAGE');
  85. ShowMessage('Render:'+DelphiVar.Content);
  86. Msg.ArgumentList.SetString(0, DelphiVar.Content);
  87. browser.SendProcessMessage(PID_BROWSER, Msg);
  88. Result := True;
  89. end;
  90. end;
  91. procedure TCustomRenderProcessHandler.OnWebKitInitialized;
  92. begin
  93. inherited;
  94. TCefRTTIExtension.Register('jsvar', DelphiVar);
  95. end;
  96. { TJSDelphiClass }
  97. procedure TJSDelphiClass.SetContent(const Value: string);
  98. begin
  99. FContent := Value;
  100. end;
  101. initialization
  102. CefRemoteDebuggingPort := 9000;
  103. CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
  104. CefBrowserProcessHandler := TCefBrowserProcessHandlerOwn.Create;
  105. DelphiVar := TJSDelphiClass.Create;
  106. finalization
  107. DelphiVar.Free;
  108. end.