リスナーの接続は非常に簡単です(古いバージョンのCEFのみ)。
procedure MouseDownCallback(const Event: ICefDomEvent);
begin
ShowMessage('Mouse down on '+Event.Target.Name);
end;
procedure AttachMouseDownListenerProc(const Doc: ICefDomDocument);
begin
Doc.Body.AddEventListenerProc('mousedown', True, MouseDownCallback);
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
ChromiumComponent.Browser.MainFrame.VisitDomProc(AttachMouseDownListenerProc);
end;
JavaScriptの結果を直接取得するための拡張関数について:トランクにはそれらが含まれていません(まだ?)。作業中のようです。
編集:
拡張機能を介してポーリングを取り除く:
JavaScriptコードが拡張機能を使用してDelphiコードにコールバックすることは確かに可能です。さらに、JavaScriptからDelphiに値を送信できます。これを使用すると、ポーリングせずに結果を転送できます。
最初にinitialization
セクションで拡張機能を登録します。これにより、後でコールバックするときに使用するJavaScriptオブジェクトが作成されます。
procedure RegisterExtension;
var
Code:string;
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;
initialization
RegisterExtension;
TMyHandler
Execute
は後で呼び出されます。TMyHandler
と定義されている
TMyHandler = class(TCefv8HandlerOwn)
protected
function Execute(const name: ustring; const obj: ICefv8Value;
const arguments: TCefv8ValueArray; var retval: ICefv8Value;
var exception: ustring): Boolean; override;
end;
今のところ、デモンストレーション目的の実装は簡単です。
function TMyHandler.Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean;
begin
ShowMessage('Execute!');
end;
ここで、JavaScriptからDelphiへの呼び出しをテストするには、次のようにします。
ChromiumComponent.Browser.MainFrame.ExecuteJavaScript('cef.test.test_object().GetMessage();', 'about:blank', 0);
これにより、「実行!」というメッセージボックスが表示されます。
コンポーネントのルートディレクトリの\demos\cefclientフォルダーにあるcefclientという名前のサンプルからデモスクリプトを取得しました。拡張機能のサンプルコードは少し隠されており、他のデモコードと混ざっています。しかし、私たちにとって特に興味深いのは、(myと同等の)の実装です。ここでは、呼び出されている関数を判別する方法と、パラメーターを渡す方法を見つけることができます。(コードへのリンク。)TExtension.Execute
TMyHandler.Execute