unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, cef3lcl, cef3types, cef3intf, cef3ref, cef3own, cef3lib;

type

  { Custom handler for the render process }
  TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
    protected
     // Für Test Window Bindings
     procedure OnContextCreated(const browser: ICefBrowser;
      const frame: ICefFrame; const context: ICefv8Context); override;
     // Für Test Extension
      procedure OnWebKitInitialized; override;
  end;

   TMyHandler = class(TCefv8HandlerOwn)
  protected
  function Execute(const name: ustring; const obj: ICefv8Value;
    const arguments: TCefv8ValueArray; var retval: ICefv8Value;
    var exception: ustring): Boolean; override;
  end;


  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Chromium1: TChromium;
    Edit1: TEdit;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  mystr : String;

implementation

{$R *.lfm}

function TMyHandler.Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean;
begin
  ShowMessage('Execute!');
end;

procedure TCustomRenderProcessHandler.OnContextCreated(const browser: ICefBrowser;
      const frame: ICefFrame; const context: ICefv8Context);
var
  myWin : ICefv8Value;
  str : String;
  args:TCefv8ValueArray;
begin
  myWin := context.GetGlobal;
  mystr := 'Mein Test';
  SetLength(args,1);
  args[0]:= TCefv8ValueRef.NewString(mystr);
  myWin.SetValueByKey('myval', args[0], V8_PROPERTY_ATTRIBUTE_NONE);
end;

procedure TCustomRenderProcessHandler.OnWebKitInitialized;
var
  Code: ustring;
begin

  Code :=
   'var cef;'+
   'if (!cef)'+
   '  cef = {};'+
   'if (!cef.test)'+
   '  cef.test = {};'+
   '(function() {'+
   '  cef.test.__defineGetter__(''test_param'', function() {'+
   '    native function GetTestParam();'+
   '    return GetTestParam();'+
   '  });'+
   '  cef.test.__defineSetter__(''test_param'', function(b) {'+
   '    native function SetTestParam();'+
   '    if(b) SetTestParam(b);'+
   '  });'+
   '  cef.test.test_object = function() {'+
   '    native function GetTestObject();'+
   '    return GetTestObject();'+
   '  };'+
   '})();';

  CefRegisterExtension('example/v8', Code, TMyHandler.Create as ICefv8Handler);

end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Chromium1.Load('about:blank');
  //Chromium1.Load(Edit1.Text);
end;

//Jvascript fragt window.myval ab und gibt den Wert in einem Fenster aus
procedure TForm1.Button2Click(Sender: TObject);
begin
  Chromium1.Browser.MainFrame.ExecuteJavaScript('alert(window.myval);', 'about:blank', 0);
end;

//Jvascript löst TMyHandler.Execute aus
procedure TForm1.Button3Click(Sender: TObject);
begin
  Chromium1.Browser.MainFrame.ExecuteJavaScript('cef.test.test_object().GetMessage();', 'about:blank', 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
end;

initialization
  CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
end.

