Recent

Author Topic: idea for embedding a chromium browser  (Read 43510 times)

zbyna

  • Jr. Member
  • **
  • Posts: 63
Re: idea for embedding a chromium browser
« Reply #15 on: June 04, 2014, 03:21:42 am »
Hi,
thanks for reply. First of all  I appreciate your work.

line: 
Code: [Select]
Chromium.Browser.GetMainFrame.VisitDomProc(pokus1); in my project (please see above) begins to work (means reaching procedure pokus)  after uncommenting
Code: [Select]
visr^.visit(visr, doc);  in cef3ref.pas. But line
Code: [Select]
Mainform.Memo1.text:=document.GetFocusedNode.GetValue; in procedure pokus still does not work. I will try to cope with calling from render process.
Seem like strange (for me  :) ) work with PCefDomVisitor is matter of CEF not fpCEF or wacef issue.  I tried wacef while ago, but it is too slow comparing to fpCEF. I am looking  forward to your updating fpCEF.



Fiji

  • Guest
Re: idea for embedding a chromium browser
« Reply #16 on: June 04, 2014, 11:29:29 am »
AFAIK FPC doesn't use UNICODE yet thats why its slower. So its incompatible with most newer delphi libraries. It won't even support DLL delayed loading..
« Last Edit: June 04, 2014, 11:38:05 am by Fiji »

zbyna

  • Jr. Member
  • **
  • Posts: 63
Re: idea for embedding a chromium browser
« Reply #17 on: June 04, 2014, 04:03:30 pm »
I tried calling from render process, but without success, project can be compiled but do not react on custom message sent to render. Please see lines // pro přístup k DOM
Code: [Select]
Unit Main;

{$MODE objfpc}{$H+}

Interface

Uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLType, ExtCtrls,
  cef3types, cef3lib, cef3intf, cef3lcl,cef3ref,cef3api,cef3own;

Type
   TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)     // pro přístup k DOM
      protected
        function OnProcessMessageReceived(const browser: ICefBrowser;
          sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean;
          override;
      end;
  { TMainform }

  TMainform = class(TForm)
    BGo : TButton;
    Button1: TButton;
    Chromium : TChromium;
    EUrl : TEdit;
    LUrl : TStaticText;
    Memo1: TMemo;
    procedure BGoClick(Sender : TObject);
    procedure ChromiumKeyEvent(Sender: TObject; const Browser: ICefBrowser;
      const event: PCefKeyEvent; osEvent: TCefEventHandle; out Result: Boolean);
    procedure ChromiumLoadEnd(Sender : TObject; const Browser : ICefBrowser;
      const Frame : ICefFrame; httpStatusCode : Integer);
    procedure ChromiumTitleChange(Sender : TObject;
      const Browser : ICefBrowser; const title : ustring);
    procedure EUrlKeyDown(Sender : TObject; var Key : Word;
      Shift : TShiftState);
    procedure FormCreate(Sender : TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;
  procedure pokus(const document:ICefDomDocument);
Var
  Mainform : TMainform;
  pokus1:TCefDomVisitorProc;

Implementation

{$R *.lfm}

{ TMainform }

procedure TMainform.BGoClick(Sender : TObject);
var
    mujFrame : ICefFrame;
begin
  Chromium.Load(EUrl.Text);
end;

procedure pokus(const document:ICefDomDocument);
              begin
                Mainform.Memo1.text:=document.GetTitle;
                ShowMessage('Funguje :-)');
              end;

function TCustomRenderProcessHandler.OnProcessMessageReceived(
      const browser: ICefBrowser; sourceProcess: TCefProcessId;
      const message: ICefProcessMessage): Boolean;            // pro přístup k DOM
    begin
      if (message.Name = 'visitdom') then
          begin
            pokus1:= @pokus;
            browser.MainFrame.VisitDomProc(pokus1);
            Result := True;
          end;
     end;


procedure TMainform.ChromiumKeyEvent(Sender: TObject;
  const Browser: ICefBrowser; const event: PCefKeyEvent;
  osEvent: TCefEventHandle; out Result: Boolean);
var
    mujFrame : ICefFrame;
    dok:ICefDomDocument;
    mojeJmenaFramu: TStrings;
begin
    Chromium.browser.SendProcessMessage(PID_RENDERER,TCefProcessMessageRef.New('visitdom'));// pro přístup k DOM
end;

procedure TMainform.ChromiumLoadEnd(Sender : TObject; const Browser : ICefBrowser; const Frame : ICefFrame;
  httpStatusCode : Integer);
begin
  EUrl.Text := UTF8Encode(Browser.MainFrame.Url);
end;

procedure TMainform.ChromiumTitleChange(Sender : TObject; const Browser : ICefBrowser; const title : ustring);
begin
  Caption := 'Browser - ' + UTF8Encode(title);
end;

procedure TMainform.EUrlKeyDown(Sender : TObject; var Key : Word; Shift : TShiftState);
begin
  If Key = VK_RETURN then BGoClick(Sender);
end;

procedure TMainform.FormCreate(Sender : TObject);
begin
  {$INFO Uncomment to use a subprocess}
  CefBrowserSubprocessPath := '.' + PathDelim + 'subprocess'{$IFDEF WINDOWS}+'.exe'{$ENDIF};

end;

 initialization
  CefRenderProcessHandler := TCustomRenderProcessHandler.Create; // pro přístup k DOM
end.                         

dliw

  • New Member
  • *
  • Posts: 21
Re: idea for embedding a chromium browser
« Reply #18 on: June 04, 2014, 08:34:52 pm »
Quote
visr^.visit(visr, doc);  in cef3ref.pas.
Seems I already had problems with this and did experiments. But this can't be the solution as doc is not defined.
Btw. I did try to get VisitDom working yesterday, but it didn't work - even with the to-be-released version  :(
I will definitely look into this as I'm almost done with the new version, but unfortunately I cannot help you right now.


@Fiji
fpCEF3 *is* using Unicode, default string type is UTF-16 (WideString). IMO *not* using Unicode makes things faster...

dliw

  • New Member
  • *
  • Posts: 21
Re: idea for embedding a chromium browser
« Reply #19 on: June 04, 2014, 10:34:13 pm »
I tried a bit harder - and now I know, how to make it work (at least with the new version).
Basically your last code works just fine as it is.
However there are some pitfalls:

You must *not* use an subprocess, as it does not include your RenderProcessHandler (unless you implement it there).
This also means that you *cannot* access any GUI from your "pokus"- / "try"-procedure, as it is a completely different process - that's how Chromium works. - I know, that won't make you happy.

So it basically comes down to this (assuming you are on Windows):

You start your program, let's say SimpleTest.exe (1)
Then CEF either starts another SimpleTest.exe (2) or the subprocess (2*) you chose, this is the render process.

With SendProcessMessage you send a message from (1) to either (2) or (2*), there OnProcessMessageReceived will be called. If you have (2) running this will call VisitDom otherwise simply nothing happens, as the (default) subprocess (2*) doesn't have this custom RenderProcessHandler.

Note, that all the code inside "pokus" is executed in (2) - this is a separate process so you can't access any of the data / GUI of (1), you will have to use inter-process-communication to share any data, e.g. by using GetArgumentList of TCefProcessMessageRef.


Hope this makes things clear - I took me quite a while to fully understand that  :-X

zbyna

  • Jr. Member
  • **
  • Posts: 63
Re: idea for embedding a chromium browser
« Reply #20 on: June 05, 2014, 12:59:54 am »
Thanks for explanation.

I tried this scenario:
1. comment CefBrowserSubprocessPath
2. started simple32.exe which created two processes: simple32(1) and simple32(2)

unfortunately it did not render any page   :(  but
custom handler worked   :o  :)

I am not able to judge if not rendering was matter of my mistake or issue with CEF.
I will try after your updating of fpCEF3. 
Again thanks for help.

zbyna

  • Jr. Member
  • **
  • Posts: 63
Re: idea for embedding a chromium browser
« Reply #21 on: June 06, 2014, 07:52:49 pm »
Program from:
http://forum.lazarus.freepascal.org/index.php/topic,20103.msg149479.html#msg149479

works  :D after dliw´s updating of https://github.com/dliw/fpCEF3

Thank you very much  dliw for your hard work

dliw

  • New Member
  • *
  • Posts: 21
Re: idea for embedding a chromium browser
« Reply #22 on: June 06, 2014, 09:10:27 pm »
Přístup k DOM funguje? That's nice to hear  ;)

zbyna

  • Jr. Member
  • **
  • Posts: 63
Re: idea for embedding a chromium browser
« Reply #23 on: June 09, 2014, 03:55:58 pm »
Jako z praku  ;)
For me was convenient  to declare
TCefDomVisitorProc procedures
as nested procedures in TCustomRenderProcessHandler.OnProcessMessageReceived.
 
It was only way I managed to send messages with DOM values back to browser process.
To achieve it I added:
{$modeswitch nestedprocvars} switch in units  cef3intf,cef3own, cef3ref;
and "is nested" to line 121 in cef3intf.pas
  (TCefDomVisitorProc = procedure(const document: ICefDomDocument) is nested;)

dliw

  • New Member
  • *
  • Posts: 21
Re: idea for embedding a chromium browser
« Reply #24 on: June 09, 2014, 06:20:47 pm »
Hm, that sounds reasonable...

Can you tell me how you actually pass back the data?

I would like to add a dom access example to fpCEF - I think this would help others and make sure this doesn't brake with future updates - of course I will mention you in the credits...

Maybe it would be even good to add a global switch for nestedprocvars in fpCEF...

zbyna

  • Jr. Member
  • **
  • Posts: 63
Re: idea for embedding a chromium browser
« Reply #25 on: June 10, 2014, 02:14:06 am »
Please see my testing:
1. getting document.GetTitle from render process back to browser process - works
   (messages 'visitdom' and 'hodnota' )
2. trying add AddEventListenerProc for click event - does not work
  (messages 'addListener' and 'click')
     addListener reach the render, listener is set, but
    'click' sent by listener (part of render) does not reach the browser
 (added TCefDomEventListenerProc = procedure(const event: ICefDomEvent) is nested;
  to cef3intf.pas line 123)

Code: [Select]
Unit Main;

{$MODE objfpc}{$H+}
{$modeswitch nestedprocvars}

Interface

Uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLType, ExtCtrls,
  cef3types, cef3lib, cef3intf, cef3lcl,cef3ref,cef3api,cef3own, cef3gui;

Type

   { TCustomRenderProcessHandler }
   TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
      protected
        function OnProcessMessageReceived(const browser: ICefBrowser;
          sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean;
          override;
      end;


  { TMainform }

  TMainform = class(TForm)
    BGo : TButton;
    Button1: TButton;
    Chromium : TChromium;
    EUrl : TEdit;
    LUrl : TStaticText;
    Memo1: TMemo;
    procedure BGoClick(Sender : TObject);
    procedure Button1Click(Sender: TObject);
    procedure ChromiumKeyEvent(Sender: TObject; const Browser: ICefBrowser;
      const event: PCefKeyEvent; osEvent: TCefEventHandle; out Result: Boolean);
    procedure ChromiumLoadEnd(Sender : TObject; const Browser : ICefBrowser;
      const Frame : ICefFrame; httpStatusCode : Integer);
    procedure ChromiumProcessMessageReceived(Sender: TObject;
      const Browser: ICefBrowser; sourceProcess: TCefProcessId;
      const message: ICefProcessMessage; out Result: Boolean);
    procedure ChromiumTitleChange(Sender : TObject;
      const Browser : ICefBrowser; const title : ustring);
    procedure EUrlKeyDown(Sender : TObject; var Key : Word;
      Shift : TShiftState);
    procedure FormCreate(Sender : TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

Var
  Mainform : TMainform;

Implementation

{$R *.lfm}

{ TMainform }

procedure TMainform.BGoClick(Sender : TObject);
var
    mujFrame : ICefFrame;
begin
   Chromium.Load(EUrl.Text);
   mujFrame:=Chromium.Browser.GetMainFrame;
  //mujFrame.ExecuteJavaScript('alert("ExecuteJavaScript works!")',mujFrame.GetURL(), 0);;
  {copy javascript object handsets  to windows clipboard}
  //mujFrame.ExecuteJavaScript( 'var copyDiv = document.createElement("div");'+
  //                            'copyDiv.contentEditable = true;'+
  //                            'document.body.appendChild(copyDiv);'+
  //                            'copyDiv.innerHTML = handsets;'+
  //                            'copyDiv.unselectable = "off"; '+
  //                            'copyDiv.focus();'+
  //                            'document.execCommand("SelectAll");'+
  //                            'document.execCommand("Copy", false, null);'+
  //                            'document.body.removeChild(copyDiv);',mujFrame.GetURL(), 0);
end;

procedure TMainform.Button1Click(Sender: TObject);
begin
  // for adding mouse event DOM listener
  Chromium.browser.SendProcessMessage(PID_RENDERER,TCefProcessMessageRef.New('addListener'));
end;

procedure TMainform.ChromiumKeyEvent(Sender: TObject;
  const Browser: ICefBrowser; const event: PCefKeyEvent;
  osEvent: TCefEventHandle; out Result: Boolean);
begin
  // for entering DOM sends message to render process (only place for obtaining DOM)
  Chromium.browser.SendProcessMessage(PID_RENDERER,TCefProcessMessageRef.New('visitdom'));
end;



 {TCustomRenderProcessHandler - zpracuje message poslaný do render procesu}
function TCustomRenderProcessHandler.OnProcessMessageReceived(
      const browser: ICefBrowser; sourceProcess: TCefProcessId;
      const message: ICefProcessMessage): Boolean;

        procedure mujEventListener(const event: ICefDomEvent);
           var
              mojeMsg: ICefProcessMessage;
              begin
                mojeMsg := TCefProcessMessageRef.New('click');
                mojeMsg.ArgumentList.SetString(0, string(event.Target.Name));
                ShowMessage('Tady to funguje :-)');
                browser.SendProcessMessage(PID_BROWSER, mojeMsg);  //  message to browser process
              end;                                                 // does not reach its destination
        procedure pokus(const document:ICefDomDocument); {user defined nested procedure}
          var
              mojeMessage: ICefProcessMessage;
              begin
                mojeMessage:=TCefProcessMessageRef.New('hodnota');
                mojeMessage.GetArgumentList.SetString(0,document.GetTitle);
                browser.SendProcessMessage(PID_BROWSER,mojeMessage);
                // for nested type procedure variables is needed:
                // adding {$modeswitch nestedprocvars} AFTER {$mode xxx} declaration in units:
                // cef3intf,cef3own, cef3ref;
                // and change line 121 in cef3intf.pas:
                //    TCefDomVisitorProc=procedure(const document:ICefDomDocument);
                // to
                //    TCefDomVisitorProc = procedure(const document: ICefDomDocument) is nested;
              end;
        procedure dalsiPokus(const document:ICefDomDocument);


        var
            mujEventListener1:TCefDomEventListenerProc;
        begin
          mujEventListener1:=@mujEventListener;
          document.Body.AddEventListenerProc('click',true,mujEventListener1);
        end;


   var
       pokus1,dalsiPokus1:TCefDomVisitorProc;

  begin   {TCustomRenderProcessHandler.OnProcessMessageReceived}
    case message.Name of
    'visitdom' :
        begin
          pokus1:= @pokus;
          browser.MainFrame.VisitDomProc(pokus1);
          Result := True;
        end;
     'addListener' :
         begin
           dalsiPokus1:=@dalsiPokus;
           browser.MainFrame.VisitDomProc(dalsiPokus1);
           Result:=true;
         end;
     else
        Result:=false;
    end;
  end;   {TCustomRenderProcessHandler.OnProcessMessageReceived}

{zpracuje message poslaný do browser procesu}
procedure TMainform.ChromiumProcessMessageReceived(Sender: TObject;
  const Browser: ICefBrowser; sourceProcess: TCefProcessId;
  const message: ICefProcessMessage; out Result: Boolean);

  begin
   // ShowMessage('Tady to funguje :-)');
    case message.Name  of
     'hodnota' :
          begin
            mainform.Memo1.Text:= string(message.GetArgumentList.GetString(0));
            Result := True;
          end;

    'click' :
         begin
           ShowMessage('Tady to funguje :-)III');
           mainform.Memo1.Text:='mouseover'+string(message.GetArgumentList.GetString(0));
           Result := True;
         end
    else
      Result:=False;
    end;
  end;


procedure TMainform.ChromiumLoadEnd(Sender : TObject; const Browser : ICefBrowser; const Frame : ICefFrame;
  httpStatusCode : Integer);
begin
  EUrl.Text := UTF8Encode(Browser.MainFrame.Url);
end;

procedure TMainform.ChromiumTitleChange(Sender : TObject; const Browser : ICefBrowser; const title : ustring);
begin
  Caption := 'Browser - ' + UTF8Encode(title);
end;

procedure TMainform.EUrlKeyDown(Sender : TObject; var Key : Word; Shift : TShiftState);
begin
  If Key = VK_RETURN then BGoClick(Sender);
end;

procedure TMainform.FormCreate(Sender : TObject);
begin
  CefSingleProcess:=false;
  {$INFO Uncomment to use a subprocess}
  //CefBrowserSubprocessPath := '.' + PathDelim + 'subprocess'{$IFDEF WINDOWS}+'.exe'{$ENDIF};
  CefRenderProcessHandler := TCustomRenderProcessHandler.Create; // pro přístup k DOM

end;

 initialization
//   CefRenderProcessHandler := TCustomRenderProcessHandler.Create; // pro přístup k DOM

end.                                                                                     

Code: [Select]
[0610/134955:VERBOSE1:ipc_sync_channel.cc(385)] Canceling pending sends
« Last Edit: June 10, 2014, 01:57:02 pm by zbyna »

dliw

  • New Member
  • *
  • Posts: 21
Re: idea for embedding a chromium browser
« Reply #26 on: June 10, 2014, 06:44:22 pm »
I just pushed a new example.
It is loosely based on your code here, you are mentioned in the new Examples.txt file - I hope that is ok with you.
For now I didn't use nestedprocvars, but it definitely is the better approach...

As far as your code is concerned:
The "Here it works" message in your EventListener procedure
Quote
ShowMessage('Tady to funguje :-)');
is shown from a render process.

While this seems to work on Windows (? - I can't test), on Linux a message box is shown that can't be closed.
So generally I would recommend not to do any "GUI" from the render process.


zbyna

  • Jr. Member
  • **
  • Posts: 63
Re: idea for embedding a chromium browser
« Reply #27 on: June 10, 2014, 11:12:00 pm »
Mentioning in examples.txt is OK for me.

Code: [Select]
ShowMessage('Tady to funguje :-)'); should show me the last piece of code which is proceed without errors.
But when I comment it then  the  next line:
Code: [Select]
browser.SendProcessMessage(PID_BROWSER, mojeMsg);  //  message to browser processthrows error  "Access violation"  :(
Without commenting the message seems to be sent, mean no "Access violation" but
this message is cancel by ipc:
Code: [Select]
[0610/134955:VERBOSE1:ipc_sync_channel.cc(385)] Canceling pending sends
 :o  welcome to multiprocess tasks  %)  :D


Proccesses can be spread over threads and it occures me only one idea: sendmessage method of cefbrowser can be run only from the main thread in the renderer http://magpcss.org/ceforum/apidocs3/projects/%28default%29/CefBrowser.html and I will try somehow to find in which thread my code is and post sending message to the main render process https://code.google.com/p/chromiumembedded/source/browse/trunk/cef3/include/cef_task.h



dliw

  • New Member
  • *
  • Posts: 21
Re: idea for embedding a chromium browser
« Reply #28 on: June 11, 2014, 08:42:27 am »
Does this happen with the new example, too?
It should do the same as your code, but at least for my quick test everything worked as expected.
« Last Edit: June 11, 2014, 08:45:22 am by dliw »

zbyna

  • Jr. Member
  • **
  • Posts: 63
Re: idea for embedding a chromium browser
« Reply #29 on: June 11, 2014, 02:24:20 pm »
New example works on windows very well.
May be the issue with
Code: [Select]
procedure mujEventListener(const event: ICefDomEvent)is that it needs the render process browser object reference for sending message
and if nested in :
Code: [Select]
TCustomRenderProcessHandler.OnProcessMessageReceived(const browser:ICefBrowser  ... ; at the time of firing event the browser object has not correct value.

So I moved mujEventListener out of TCustomRenderProcessHandler.OnProcessMessageReceived  nest
and that is why I was not able to find a way how to get render process browser object
I created a new global variable - mujGlobalBrowser and filled it in implemented:
Code: [Select]
procedure TCustomRenderProcessHandler.OnBrowserCreated(
  const browser: ICefBrowser);
begin
  mujGlobalBrowser:=browser;
  //inherited OnBrowserCreated(browser);
end;

It was tough struggle ::) but it works :)

Code: [Select]
Unit Main;

{$MODE objfpc}{$H+}
{$modeswitch nestedprocvars}

Interface

Uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLType, ExtCtrls,
  cef3types, cef3lib, cef3intf, cef3lcl,cef3ref,cef3api,cef3own, cef3gui;

Type

   { TCustomRenderProcessHandler }
   TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
      protected
        function OnProcessMessageReceived(const browser: ICefBrowser;
          sourceProcess: TCefProcessId; const message: ICefProcessMessage): Boolean;
          override;
        procedure OnBrowserCreated(const browser: ICefBrowser); override;
      end;

  { TMainform }

  TMainform = class(TForm)
    BGo : TButton;
    Button1: TButton;
    Chromium : TChromium;
    EUrl : TEdit;
    LUrl : TStaticText;
    Memo1: TMemo;
    procedure BGoClick(Sender : TObject);
    procedure Button1Click(Sender: TObject);
    procedure ChromiumKeyEvent(Sender: TObject; const Browser: ICefBrowser;
      const event: PCefKeyEvent; osEvent: TCefEventHandle; out Result: Boolean);
    procedure ChromiumLoadEnd(Sender : TObject; const Browser : ICefBrowser;
      const Frame : ICefFrame; httpStatusCode : Integer);
    procedure ChromiumProcessMessageReceived(Sender: TObject;
      const Browser: ICefBrowser; sourceProcess: TCefProcessId;
      const message: ICefProcessMessage; out Result: Boolean);
    procedure ChromiumTitleChange(Sender : TObject;
      const Browser : ICefBrowser; const title : ustring);
    procedure EUrlKeyDown(Sender : TObject; var Key : Word;
      Shift : TShiftState);
    procedure FormCreate(Sender : TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

Var
  Mainform : TMainform;
  mujGlobalBrowser:ICefBrowser; //  browser object for render process

Implementation

{$R *.lfm}


{ TMainform }

procedure TMainform.BGoClick(Sender : TObject);
var
    mujFrame : ICefFrame;
begin
   Chromium.Load(EUrl.Text);
   mujFrame:=Chromium.Browser.GetMainFrame;
  //mujFrame.ExecuteJavaScript('alert("ExecuteJavaScript works!")',mujFrame.GetURL(), 0);
end;

procedure TMainform.Button1Click(Sender: TObject);
begin
  // for adding mouse event DOM listener
  Chromium.browser.SendProcessMessage(PID_RENDERER,TCefProcessMessageRef.New('addListener'));
end;

procedure TMainform.ChromiumKeyEvent(Sender: TObject;
  const Browser: ICefBrowser; const event: PCefKeyEvent;
  osEvent: TCefEventHandle; out Result: Boolean);
begin
  // for entering DOM sends message to render process (only place for obtaining DOM)
  Chromium.browser.SendProcessMessage(PID_RENDERER,TCefProcessMessageRef.New('visitdom'));
end;

procedure mujEventListener(const event: ICefDomEvent);

 var
    mojeMsg: ICefProcessMessage;

    begin
      mojeMsg := TCefProcessMessageRef.New('click');
      mojeMsg.ArgumentList.SetString(0, string(event.Target.Name));
      //ShowMessage('Tady to funguje :-) I');
      mujGlobalBrowser.SendProcessMessage(PID_BROWSER, mojeMsg);
    end;


{TCustomRenderProcessHandler - zpracuje message poslaný do render procesu}
function TCustomRenderProcessHandler.OnProcessMessageReceived(
      const browser: ICefBrowser; sourceProcess: TCefProcessId;
      const message: ICefProcessMessage): Boolean ;


        procedure pokus(const document:ICefDomDocument); {user defined nested procedure}
          var
              mojeMessage: ICefProcessMessage;
              begin
                mojeMessage:=TCefProcessMessageRef.New('hodnota');
                mojeMessage.GetArgumentList.SetString(0,document.GetTitle);
                browser.SendProcessMessage(PID_BROWSER,mojeMessage);
              end;

        procedure dalsiPokus(const document:ICefDomDocument);

        var
            mujEventListener1:TCefDomEventListenerProc;

        begin

          mujEventListener1:=@mujEventListener;
          document.Body.AddEventListenerProc('click',true,mujEventListener1);
        end;

  var
       pokus1,dalsiPokus1:TCefDomVisitorProc;

  begin   {TCustomRenderProcessHandler.OnProcessMessageReceived}
    case message.Name of
    'visitdom' :
        begin
          pokus1:= @pokus;
          browser.MainFrame.VisitDomProc(pokus1);
          Result := True;
        end;
     'addListener' :
         begin
           dalsiPokus1:=@dalsiPokus;
           browser.MainFrame.VisitDomProc(dalsiPokus1);
           Result:=true;
         end;
     else
        Result:=inherited;;
    end;
  end;   {TCustomRenderProcessHandler.OnProcessMessageReceived}

procedure TCustomRenderProcessHandler.OnBrowserCreated(
  const browser: ICefBrowser);
begin
  mujGlobalBrowser:=browser;
  //inherited OnBrowserCreated(browser);
end;


{zpracuje message poslaný do browser procesu}
procedure TMainform.ChromiumProcessMessageReceived(Sender: TObject;
  const Browser: ICefBrowser; sourceProcess: TCefProcessId;
  const message: ICefProcessMessage; out Result: Boolean);

  begin
   // ShowMessage('Tady to funguje :-)');
    case message.Name  of
     'hodnota' :
          begin
            mainform.Memo1.Text:= string(message.GetArgumentList.GetString(0));
            Result := True;
          end;

    'click' :
         begin
           //ShowMessage('Tady to funguje :-)III');
           mainform.Memo1.Text:='click'+string(message.GetArgumentList.GetString(0));
           Result := True;
         end
    else
      Result:=False;
    end;
  end;



procedure TMainform.ChromiumLoadEnd(Sender : TObject; const Browser : ICefBrowser; const Frame : ICefFrame;
  httpStatusCode : Integer);
begin
  EUrl.Text := UTF8Encode(Browser.MainFrame.Url);
end;

procedure TMainform.ChromiumTitleChange(Sender : TObject; const Browser : ICefBrowser; const title : ustring);
begin
  Caption := 'Browser - ' + UTF8Encode(title);
end;

procedure TMainform.EUrlKeyDown(Sender : TObject; var Key : Word; Shift : TShiftState);
begin
  If Key = VK_RETURN then BGoClick(Sender);
end;

procedure TMainform.FormCreate(Sender : TObject);
begin
  CefSingleProcess:=false;
  {$INFO Uncomment to use a subprocess}
  //CefBrowserSubprocessPath := '.' + PathDelim + 'subprocess'{$IFDEF WINDOWS}+'.exe'{$ENDIF};
  //CefRenderProcessHandler := TCustomRenderProcessHandler.Create; // pro přístup k DOM
end;

 initialization
 CefRenderProcessHandler := TCustomRenderProcessHandler.Create; // pro přístup k DOM

end.               

 

TinyPortal © 2005-2018