zoukankan      html  css  js  c++  java
  • dcef3 guiclient demo Full Code

    source code from http://dumpz.org/589068/

        unit main;
    
    interface
    {$I cef.inc}
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ceflib, cefvcl, Buttons, ActnList, Menus, ComCtrls,
      ExtCtrls, XPMan, Registry, ShellApi, SyncObjs, System.Actions;
    
    type
      TMainForm = class(TForm)
        crm: TChromium;
        StatusBar: TStatusBar;
        ActionList: TActionList;
        actPrev: TAction;
        actNext: TAction;
        actHome: TAction;
        actReload: TAction;
        actGoTo: TAction;
        MainMenu: TMainMenu;
        File1: TMenuItem;
        est1: TMenuItem;
        mGetsource: TMenuItem;
        mGetText: TMenuItem;
        actGetSource: TAction;
        actGetText: TAction;
        actZoomIn: TAction;
        actZoomOut: TAction;
        actZoomReset: TAction;
        Zoomin1: TMenuItem;
        Zoomout1: TMenuItem;
        Zoomreset1: TMenuItem;
        actExecuteJS: TAction;
        ExecuteJavaScript1: TMenuItem;
        Exit1: TMenuItem;
        Print1: TMenuItem;
        actFileScheme1: TMenuItem;
        actDom: TAction;
        VisitDOM1: TMenuItem;
        SaveDialog: TSaveDialog;
        actDevTool: TAction;
        DevelopperTools1: TMenuItem;
        debug: TChromium;
        Splitter1: TSplitter;
        Panel1: TPanel;
        SpeedButton1: TSpeedButton;
        SpeedButton2: TSpeedButton;
        SpeedButton3: TSpeedButton;
        SpeedButton4: TSpeedButton;
        edAddress: TEdit;
        SpeedButton5: TSpeedButton;
        actDoc: TAction;
        Help1: TMenuItem;
        Documentation1: TMenuItem;
        actGroup: TAction;
        Googlegroup1: TMenuItem;
        actFileScheme: TAction;
        actChromeDevTool: TAction;
        DebuginChrome1: TMenuItem;
        procedure edAddressKeyPress(Sender: TObject; var Key: Char);
        procedure actPrevExecute(Sender: TObject);
        procedure actNextExecute(Sender: TObject);
        procedure actHomeExecute(Sender: TObject);
        procedure actReloadExecute(Sender: TObject);
        procedure actReloadUpdate(Sender: TObject);
        procedure actGoToExecute(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure actHomeUpdate(Sender: TObject);
        procedure actGetSourceExecute(Sender: TObject);
        procedure actGetTextExecute(Sender: TObject);
        procedure actZoomInExecute(Sender: TObject);
        procedure actZoomOutExecute(Sender: TObject);
        procedure actZoomResetExecute(Sender: TObject);
        procedure actExecuteJSExecute(Sender: TObject);
        procedure Exit1Click(Sender: TObject);
        procedure actFileSchemeExecute(Sender: TObject);
        procedure actDomExecute(Sender: TObject);
        procedure actNextUpdate(Sender: TObject);
        procedure actPrevUpdate(Sender: TObject);
        procedure crmAddressChange(Sender: TObject; const browser: ICefBrowser;
          const frame: ICefFrame; const url: ustring);
        procedure crmLoadEnd(Sender: TObject; const browser: ICefBrowser;
          const frame: ICefFrame; httpStatusCode: Integer);
        procedure crmLoadStart(Sender: TObject; const browser: ICefBrowser;
          const frame: ICefFrame);
        procedure crmStatusMessage(Sender: TObject; const browser: ICefBrowser;
          const value: ustring);
        procedure crmTitleChange(Sender: TObject; const browser: ICefBrowser;
          const title: ustring);
        procedure actDevToolExecute(Sender: TObject);
        procedure actDocExecute(Sender: TObject);
        procedure actGroupExecute(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure crmBeforeDownload(Sender: TObject; const browser: ICefBrowser;
          const downloadItem: ICefDownloadItem; const suggestedName: ustring;
          const callback: ICefBeforeDownloadCallback);
        procedure crmDownloadUpdated(Sender: TObject; const browser: ICefBrowser;
          const downloadItem: ICefDownloadItem;
          const callback: ICefDownloadItemCallback);
        procedure crmProcessMessageReceived(Sender: TObject;
          const browser: ICefBrowser; sourceProcess: TCefProcessId;
          const message: ICefProcessMessage; out Result: Boolean);
        procedure actChromeDevToolExecute(Sender: TObject);
        procedure crmBeforeResourceLoad(Sender: TObject; const browser: ICefBrowser;
          const frame: ICefFrame; const request: ICefRequest; out Result: Boolean);
        procedure crmBeforePopup(Sender: TObject; const browser: ICefBrowser;
          const frame: ICefFrame; const targetUrl, targetFrameName: ustring;
          var popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
          var client: ICefClient; var settings: TCefBrowserSettings;
          var noJavascriptAccess: Boolean; out Result: Boolean);
      private
        { Dйclarations privйes }
        FLoading: Boolean;
        FDevToolLoaded: Boolean;
        function IsMain(const b: ICefBrowser; const f: ICefFrame = nil): Boolean;
      end;
    
      TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
      protected
        procedure OnWebKitInitialized; override;
        function OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId;
          const message: ICefProcessMessage): Boolean; override;
      end;
    
      TTestExtension = class
        class function hello: string;
      end;
    
    var
      MainForm: TMainForm;
    
    implementation
    
    {$R *.dfm}
    
    procedure TMainForm.actChromeDevToolExecute(Sender: TObject);
    var
      reg: TRegistry;
      path, url: string;
    begin
      reg := TRegistry.Create;
      try
        reg.RootKey := HKEY_LOCAL_MACHINE;
        if reg.OpenKeyReadOnly('SOFTWAREMicrosoftWindowsCurrentVersionApp Pathschrome.exe') then
          path := ExtractFilePath(reg.ReadString('')) else
          Exit;
      finally
        reg.Free;
      end;
    
      if DirectoryExists(path) then
      begin
        url := crm.Browser.Host.GetDevToolsUrl(True);
        ShellExecute(0, 'open', 'chrome.exe', PChar(url), PChar(Path), 0);
      end;
    end;
    
    procedure TMainForm.actDevToolExecute(Sender: TObject);
    begin
      actDevTool.Checked := not actDevTool.Checked;
      debug.Visible := actDevTool.Checked;
      Splitter1.Visible := actDevTool.Checked;
      if actDevTool.Checked then
      begin
        if not FDevToolLoaded then
        begin
          debug.Load(crm.Browser.Host.GetDevToolsUrl(True));
    
          FDevToolLoaded := True;
        end;
      end;
    end;
    
    procedure TMainForm.actDocExecute(Sender: TObject);
    begin
      crm.Load('http://magpcss.org/ceforum/apidocs3');
    end;
    
    procedure TMainForm.actDomExecute(Sender: TObject);
    begin
      crm.browser.SendProcessMessage(PID_RENDERER,
        TCefProcessMessageRef.New('visitdom'));
    end;
    
    procedure TMainForm.actExecuteJSExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        crm.Browser.MainFrame.ExecuteJavaScript(
          'alert(''JavaScript execute works!'');', 'about:blank', 0);
    end;
    
    procedure TMainForm.actFileSchemeExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        crm.Browser.MainFrame.LoadUrl('local://c/');
    end;
    
    procedure CallbackGetSource(const src: ustring);
    var
      source: ustring;
    begin
      source := src;
      source := StringReplace(source, '<', '&lt;', [rfReplaceAll]);
      source := StringReplace(source, '>', '&gt;', [rfReplaceAll]);
      source := '<html><body>Source:<pre>' + source + '</pre></body></html>';
      MainForm.crm.Browser.MainFrame.LoadString(source, '');
    end;
    
    procedure TMainForm.actGetSourceExecute(Sender: TObject);
    begin
      crm.Browser.MainFrame.GetSourceProc(CallbackGetSource);
    end;
    
    procedure CallbackGetText(const txt: ustring);
    var
      source: ustring;
    begin
      source := txt;
      source := StringReplace(source, '<', '&lt;', [rfReplaceAll]);
      source := StringReplace(source, '>', '&gt;', [rfReplaceAll]);
      source := '<html><body>Text:<pre>' + source + '</pre></body></html>';
      MainForm.crm.Browser.MainFrame.LoadString(source, '');
    end;
    
    procedure TMainForm.actGetTextExecute(Sender: TObject);
    begin
      crm.Browser.MainFrame.GetTextProc(CallbackGetText);
    end;
    
    procedure TMainForm.actGoToExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        crm.Browser.MainFrame.LoadUrl(edAddress.Text);
    end;
    
    procedure TMainForm.actGroupExecute(Sender: TObject);
    begin
      crm.Load('https://groups.google.com/forum/?fromgroups#!forum/delphichromiumembedded');
    end;
    
    procedure TMainForm.actHomeExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        crm.Browser.MainFrame.LoadUrl(crm.DefaultUrl);
    end;
    
    procedure TMainForm.actHomeUpdate(Sender: TObject);
    begin
      TAction(Sender).Enabled := crm.Browser <> nil;
    end;
    
    procedure TMainForm.actNextExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        crm.Browser.GoForward;
    end;
    
    procedure TMainForm.actNextUpdate(Sender: TObject);
    begin
      if crm.Browser <> nil then
        actNext.Enabled := crm.Browser.CanGoForward else
        actNext.Enabled := False;
    end;
    
    procedure TMainForm.actPrevExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        crm.Browser.GoBack;
    end;
    
    procedure TMainForm.actPrevUpdate(Sender: TObject);
    begin
      if crm.Browser <> nil then
        actPrev.Enabled := crm.Browser.CanGoBack else
        actPrev.Enabled := False;
    end;
    
    procedure TMainForm.actReloadExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        if FLoading then
          crm.Browser.StopLoad else
          crm.Browser.Reload;
    end;
    
    procedure TMainForm.actReloadUpdate(Sender: TObject);
    begin
      if FLoading then
        TAction(sender).Caption := 'X' else
        TAction(sender).Caption := 'R';
      TAction(Sender).Enabled := crm.Browser <> nil;
    end;
    
    function TMainForm.IsMain(const b: ICefBrowser; const f: ICefFrame): Boolean;
    begin
      Result := (b <> nil) and (b.Identifier = crm.BrowserId) and ((f = nil) or (f.IsMain));
    end;
    
    procedure TMainForm.actZoomInExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        crm.Browser.Host.ZoomLevel := crm.Browser.Host.ZoomLevel + 0.5;
    end;
    
    procedure TMainForm.actZoomOutExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        crm.Browser.Host.ZoomLevel := crm.Browser.Host.ZoomLevel - 0.5;
    end;
    
    procedure TMainForm.actZoomResetExecute(Sender: TObject);
    begin
      if crm.Browser <> nil then
        crm.Browser.Host.ZoomLevel := 0;
    end;
    
    procedure TMainForm.crmAddressChange(Sender: TObject;
      const browser: ICefBrowser; const frame: ICefFrame; const url: ustring);
    begin
      if IsMain(browser, frame) then
        edAddress.Text := url;
    end;
    
    procedure TMainForm.crmBeforeDownload(Sender: TObject;
      const browser: ICefBrowser; const downloadItem: ICefDownloadItem;
      const suggestedName: ustring; const callback: ICefBeforeDownloadCallback);
    begin
      callback.Cont(ExtractFilePath(ParamStr(0)) + suggestedName, True);
    end;
    
    procedure TMainForm.crmBeforePopup(Sender: TObject; const browser: ICefBrowser;
      const frame: ICefFrame; const targetUrl, targetFrameName: ustring;
      var popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo;
      var client: ICefClient; var settings: TCefBrowserSettings;
      var noJavascriptAccess: Boolean; out Result: Boolean);
    begin
      // prevent popup
      crm.Load(targetUrl);
      Result := True;
    end;
    
    procedure TMainForm.crmBeforeResourceLoad(Sender: TObject;
      const browser: ICefBrowser; const frame: ICefFrame;
      const request: ICefRequest; out Result: Boolean);
    var
      u: TUrlParts;
    begin
      // redirect home to google
      if CefParseUrl(request.Url, u) then
        if (u.host = 'home') then
        begin
          u.host := 'www.google.com';
          request.Url := CefCreateUrl(u);
        end;
    end;
    
    procedure TMainForm.crmDownloadUpdated(Sender: TObject;
      const browser: ICefBrowser; const downloadItem: ICefDownloadItem;
      const callback: ICefDownloadItemCallback);
    begin
      if downloadItem.IsInProgress then
        StatusBar.SimpleText := IntToStr(downloadItem.PercentComplete) + '%' else
        StatusBar.SimpleText := '';
    end;
    
    procedure TMainForm.crmLoadEnd(Sender: TObject; const browser: ICefBrowser;
      const frame: ICefFrame; httpStatusCode: Integer);
    begin
      if IsMain(browser, frame) then
        FLoading := False;
    end;
    
    procedure TMainForm.crmLoadStart(Sender: TObject; const browser: ICefBrowser;
      const frame: ICefFrame);
    begin
      if IsMain(browser, frame) then
        FLoading := True;
    end;
    
    procedure TMainForm.crmProcessMessageReceived(Sender: TObject;
      const browser: ICefBrowser; sourceProcess: TCefProcessId;
      const message: ICefProcessMessage; out Result: Boolean);
    begin
      if (message.Name = 'mouseover') then
      begin
        StatusBar.SimpleText := message.ArgumentList.GetString(0);
        Result := True;
      end else
        Result := False;
    end;
    
    procedure TMainForm.crmStatusMessage(Sender: TObject;
      const browser: ICefBrowser; const value: ustring);
    begin
      StatusBar.SimpleText := value
    end;
    
    procedure TMainForm.crmTitleChange(Sender: TObject; const browser: ICefBrowser;
      const title: ustring);
    begin
      if IsMain(browser) then
        Caption := title;
    end;
    
    procedure TMainForm.edAddressKeyPress(Sender: TObject; var Key: Char);
    begin
      if Key = #13 then
      begin
        if crm.Browser <> nil then
        begin
          crm.Browser.MainFrame.LoadUrl(edAddress.Text);
          Abort;
        end;
      end;
    end;
    
    procedure TMainForm.Exit1Click(Sender: TObject);
    begin
      Close;
    end;
    
    procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      // avoid AV when closing application
      if CefSingleProcess then
      begin
        crm.Load('about:blank');
        debug.Load('about:blank');
        while debug.Browser.IsLoading or crm.Browser.IsLoading  do
          Application.ProcessMessages;
      end;
      CanClose := True;
    end;
    
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      FLoading := False;
      FDevToolLoaded := False;
    end;
    
    { TCustomRenderProcessHandler }
    
    
    function getpath(const n: ICefDomNode): string;
    begin
      Result := '<' + n.Name + '>';
      if (n.Parent <> nil) then
        Result := getpath(n.Parent) + Result;
    end;
    
    function TCustomRenderProcessHandler.OnProcessMessageReceived(
      const browser: ICefBrowser; sourceProcess: TCefProcessId;
      const message: ICefProcessMessage): Boolean;
    begin
    {$IFDEF DELPHI14_UP}
      if (message.Name = 'visitdom') then
        begin
          browser.MainFrame.VisitDomProc(
            procedure(const doc: ICefDomDocument) begin
              doc.Body.AddEventListenerProc('mouseover', True,
                procedure (const event: ICefDomEvent)
                var
                  msg: ICefProcessMessage;
                begin
                  msg := TCefProcessMessageRef.New('mouseover');
                  msg.ArgumentList.SetString(0, getpath(event.Target));
                  browser.SendProcessMessage(PID_BROWSER, msg);
                end)
            end);
            Result := True;
        end
      else
    {$ENDIF}
        Result := False;
    end;
    
    procedure TCustomRenderProcessHandler.OnWebKitInitialized;
    begin
    {$IFDEF DELPHI14_UP}
      TCefRTTIExtension.Register('app', TTestExtension);
    {$ENDIF}
    end;
    
    { TTestExtension }
    
    class function TTestExtension.hello: string;
    begin
      Result := 'Hello from Delphi';
    end;
    
    initialization
      CefRemoteDebuggingPort := 9000;
      CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
      CefBrowserProcessHandler := TCefBrowserProcessHandlerOwn.Create;
    end.
  • 相关阅读:
    spring参数类型异常输出(二), SpringMvc参数类型转换错误输出(二)
    spring参数类型异常输出,SpringMvc参数类型转换错误输出
    Linux下载jdk ,Linux如何下载jdk
    Linux安装Jdk,CentOS安装Jdk
    Linux系统ifconfig命令找不到,centos ifconfig Command not found
    centos could not retrieve mirrorlist
    Spring声明式事务(xml配置事务方式)
    微信上传图文消息invalid media_id hint,thumb_media_id怎么获取
    云虚拟主机开源 DedeCMS 安装指南
    安装dede显示dir的解决办法
  • 原文地址:https://www.cnblogs.com/xiefang2008/p/6070141.html
Copyright © 2011-2022 走看看