Как зарегистрировать в JavaScript свой объект?
uses
{...,} ceflib;
type
TTestExtension = class
public
class function hello: string;
class function showVersion(msg: string): string;
end;
TConsoleExtension = class
public
class procedure log(msg: string);
end;
TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
protected
procedure OnWebKitInitialized; override;
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Chromium1.Load('file:///' + ExtractFilePath(ParamStr(0)) + 'test.html');
// код загружаемого файла:
// <html>
// <head>
// <script>
// alert(app.showVersion(navigator.userAgent));
// function loadPage() {
// console.log("Page loaded.");
// }
// </script>
// </head>
// <body bgcolor='yellow' onload="loadPage()" />
// </html>
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Вызов метода hello из зарегистрированного в JavaScript'е объекта app
Chromium1.Browser.MainFrame.ExecuteJavaScript('alert(app.hello());', 'about:blank', 0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
// Вызов метода log из зарегистрированного в JavaScript'е объекта console
Chromium1.Browser.MainFrame.ExecuteJavaScript('console.log("Message from Delphi");', 'about:blank', 0);
end;
procedure TForm1.Chromium1ConsoleMessage(Sender: TObject;
const browser: ICefBrowser; const message, source: ustring;
line: Integer; out Result: Boolean);
begin
// Этот метод не будет вызываться, так как мы зарегистрировали свой
// объект console, перекрыв тем самым одноименный объект из JavaScript
ShowMessage(message);
Result := True;
end;
{ TTestExtension }
class function TTestExtension.hello: string;
begin
// JavaScript покажет сообщение,
// полученное из Delphi
Result := 'Hello from Delphi';
end;
class function TTestExtension.showVersion(msg: string): string;
begin
// Этот метот "дергается" JavaScript'ом
// из загруженной страницы
Result := 'Browser: ' + msg;
end;
{ TConsoleExtension }
class procedure TConsoleExtension.log(msg: string);
begin
// Перехват сообщений,
// выводимых в console.log
ShowMessage(msg);
end;
{ TCustomRenderProcessHandler }
// Регистрация объектов в JavaScript
procedure TCustomRenderProcessHandler.OnWebKitInitialized;
begin
inherited;
TCefRTTIExtension.Register('app', TTestExtension);
// Будьте внимательны, при регистрации объекта console
// событие OnConsoleMessage вызываться не будет!
TCefRTTIExtension.Register('console', TConsoleExtension);
end;
initialization
CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
|