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.
  • 相关阅读:
    CF 142B Tprimes
    CF 231A Team
    poj 2001 Shortest Prefixes ——字典树入门
    hdu 1039 Easier Done Than Said?
    poj 2528 Mayor's posters
    hdu 1061 Rightmost Digit
    poj 2503 Babelfish
    CF271 A. Beautiful Year
    poj 2752
    CF271 B. Prime Matrix
  • 原文地址:https://www.cnblogs.com/xiefang2008/p/6070141.html
Copyright © 2011-2022 走看看