Comment exposer "fonctions natives" à Javascript dans une page Web à l'aide de Chromium et Delphi 6?

J'ai incorporé Chromium dans mes projets Delphi 6 avec l'aide de Delphi Chromium Embedded . Maintenant, je souhaite pouvoir exécuter le code Javascript et les résultats sont retournés à mon application Delphi hôte. Ma méthode actuelle consiste à appeler ExecuteJavascript () et à utiliser un élément DOM auquel l'appel Javascript écrit ses résultats et à faire un sondage de cet élément dans une méthode TTimer de Delphi pour récupérer les résultats. Cependant, j'ai lu à propos de l'utilisation de fonctions natives et des extensions V8 pour que l'appel Javascript «rappelle» dans mon code Delphi comme moyen de recevoir des résultats à la place:

Http://magpcss.org/ceforum/viewtopic.php?f=7&t=180

J'aimerais essayer cela et j'aimerais aussi savoir comment attacher des auditeurs d'événements basés sur Delphi aux éléments DOM dans la page Web (onblur, onmousedown, etc.). Je cherche des échantillons qui me montrent comment faire ces deux choses si quelqu'un sait où les trouver.

    La connexion des auditeurs est assez simple (uniquement dans les anciennes versions de 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; 

    En ce qui concerne les fonctions étendues pour obtenir directement les résultats JavaScript: le coffre ne les contient pas (encore?). On dirait qu'il y a des travaux en cours.

    Modifier :

    Se débarrasser des sondages par des extensions :

    Il est en effet possible que votre code JavaScript rappelle votre code Delphi en utilisant des extensions. En outre, vous pouvez envoyer des valeurs de JavaScript à Delphi – cela pourrait être utilisé pour transférer les résultats sans avoir besoin de faire un sondage.

    D'abord dans votre section d' initialization , enregistrez l'extension, qui crée un objet JavaScript plus tard pour l'appeler en arrière:

     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 de TMyHandler sera invoquée plus tard. TMyHandler est défini comme

     TMyHandler = class(TCefv8HandlerOwn) protected function Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean; override; end; 

    La mise en œuvre à des fins de démonstration est simple pour l'instant:

     function TMyHandler.Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean; begin ShowMessage('Execute!'); end; 

    Maintenant, pour tester l'appel dans Delphi depuis JavaScript, faites simplement:

     ChromiumComponent.Browser.MainFrame.ExecuteJavaScript('cef.test.test_object().GetMessage();', 'about:blank', 0); 

    Cela devrait afficher la boîte de message en disant «Exécuter!».

    J'ai tiré le script de démonstration à partir d'un échantillon appelé cefclient que vous pouvez trouver dans le dossier \ demos \ cefclient dans le répertoire racine du composant. Le code d'exemple d'extension est un peu masqué et mêlé à d'autres codes de démonstration. Mais d'un intérêt particulier pour nous, c'est la mise en œuvre de TExtension.Execute (l'équivalent de mon TMyHandler.Execute ). Là vous pouvez trouver comment déterminer quelle fonction est appelée et comment passer les paramètres. ( Lien vers le code. )