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('\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.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, '<', '<', [rfReplaceAll]); source := StringReplace(source, '>', '>', [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, '<', '<', [rfReplaceAll]); source := StringReplace(source, '>', '>', [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.