mirror of
https://github.com/salvadordf/CEF4Delphi.git
synced 2024-11-16 00:05:55 +01:00
2851 lines
111 KiB
ObjectPascal
2851 lines
111 KiB
ObjectPascal
// ************************************************************************
|
|
// ***************************** CEF4Delphi *******************************
|
|
// ************************************************************************
|
|
//
|
|
// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
|
|
// browser in Delphi applications.
|
|
//
|
|
// The original license of DCEF3 still applies to CEF4Delphi.
|
|
//
|
|
// For more information about CEF4Delphi visit :
|
|
// https://www.briskbard.com/index.php?lang=en&pageid=cef
|
|
//
|
|
// Copyright © 2017 Salvador Díaz Fau. All rights reserved.
|
|
//
|
|
// ************************************************************************
|
|
// ************ vvvv Original license and comments below vvvv *************
|
|
// ************************************************************************
|
|
(*
|
|
* Delphi Chromium Embedded 3
|
|
*
|
|
* Usage allowed under the restrictions of the Lesser GNU General Public License
|
|
* or alternatively the restrictions of the Mozilla Public License 1.1
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
|
* the specific language governing rights and limitations under the License.
|
|
*
|
|
* Unit owner : Henri Gourvest <hgourvest@gmail.com>
|
|
* Web site : http://www.progdigy.com
|
|
* Repository : http://code.google.com/p/delphichromiumembedded/
|
|
* Group : http://groups.google.com/group/delphichromiumembedded
|
|
*
|
|
* Embarcadero Technologies, Inc is not permitted to use or redistribute
|
|
* this source code without explicit permission.
|
|
*
|
|
*)
|
|
|
|
unit uCEFChromium;
|
|
|
|
{$IFNDEF CPUX64}
|
|
{$ALIGN ON}
|
|
{$MINENUMSIZE 4}
|
|
{$ENDIF}
|
|
|
|
interface
|
|
|
|
uses
|
|
WinApi.Windows, WinApi.Messages, System.Classes, Vcl.Controls, Vcl.Graphics, Vcl.Forms,
|
|
uCEFTypes, uCEFInterfaces, uCEFLibFunctions, uCEFMiscFunctions, uCEFClient,
|
|
uCEFPDFPrintCallback, uCEFStringVisitor, uCEFConstants, uCEFTask,
|
|
uCEFDeleteCookiesCallback, uCEFDomVisitor, uCEFChromiumEvents,
|
|
uCEFChromiumOptions, uCEFChromiumFontOptions, uCEFPDFPrintOptions;
|
|
|
|
type
|
|
TChromium = class(TComponent, IChromiumEvents)
|
|
protected
|
|
FCompHandle : HWND;
|
|
FVisitor : ICefStringVisitor;
|
|
FPDFPrintcb : ICefPdfPrintCallback;
|
|
FCookiDeletercb : ICefDeleteCookiesCallback;
|
|
FDOMVisitor : ICefDomVisitor;
|
|
FClientHandler : TVCLClientHandler;
|
|
FHandler : ICefClient;
|
|
FBrowser : ICefBrowser;
|
|
FBrowserId : Integer;
|
|
FDefaultUrl : ustring;
|
|
FOptions : TChromiumOptions;
|
|
FFontOptions : TChromiumFontOptions;
|
|
FPDFPrintOptions : TPDFPrintOptions;
|
|
FDefaultEncoding : ustring;
|
|
FPrefs : TStringList;
|
|
FProxyType : integer;
|
|
FProxyServer : string;
|
|
FProxyPort : integer;
|
|
FProxyUsername : string;
|
|
FProxyPassword : string;
|
|
FProxyScriptURL : string;
|
|
FProxyByPassList : string;
|
|
FUpdatePreferences : boolean;
|
|
FGetPreferences : boolean;
|
|
FCustomHeaderName : string;
|
|
FCustomHeaderValue : string;
|
|
FAddCustomHeader : boolean;
|
|
FDoNotTrack : boolean;
|
|
FSendReferrer : boolean;
|
|
FHyperlinkAuditing : boolean;
|
|
FCookiePrefs : integer;
|
|
FImagesPrefs : integer;
|
|
FCMStoragePath : ustring;
|
|
FZoomStep : byte;
|
|
FWindowName : string;
|
|
FIsOSR : boolean;
|
|
FInitialized : boolean;
|
|
FClosing : boolean;
|
|
|
|
// ICefClient
|
|
FOnProcessMessageReceived : TOnProcessMessageReceived;
|
|
|
|
// ICefLoadHandler
|
|
FOnLoadStart : TOnLoadStart;
|
|
FOnLoadEnd : TOnLoadEnd;
|
|
FOnLoadError : TOnLoadError;
|
|
FOnLoadingStateChange : TOnLoadingStateChange;
|
|
|
|
// ICefFocusHandler
|
|
FOnTakeFocus : TOnTakeFocus;
|
|
FOnSetFocus : TOnSetFocus;
|
|
FOnGotFocus : TOnGotFocus;
|
|
|
|
// ICefContextMenuHandler
|
|
FOnBeforeContextMenu : TOnBeforeContextMenu;
|
|
FOnContextMenuCommand : TOnContextMenuCommand;
|
|
FOnContextMenuDismissed : TOnContextMenuDismissed;
|
|
|
|
// ICefKeyboardHandler
|
|
FOnPreKeyEvent : TOnPreKeyEvent;
|
|
FOnKeyEvent : TOnKeyEvent;
|
|
|
|
// ICefDisplayHandler
|
|
FOnAddressChange : TOnAddressChange;
|
|
FOnTitleChange : TOnTitleChange;
|
|
FOnFavIconUrlChange : TOnFavIconUrlChange;
|
|
FOnFullScreenModeChange : TOnFullScreenModeChange;
|
|
FOnTooltip : TOnTooltip;
|
|
FOnStatusMessage : TOnStatusMessage;
|
|
FOnConsoleMessage : TOnConsoleMessage;
|
|
|
|
// ICefDownloadHandler
|
|
FOnBeforeDownload : TOnBeforeDownload;
|
|
FOnDownloadUpdated : TOnDownloadUpdated;
|
|
|
|
// ICefGeolocationHandler
|
|
FOnRequestGeolocationPermission : TOnRequestGeolocationPermission;
|
|
FOnCancelGeolocationPermission : TOnCancelGeolocationPermission;
|
|
|
|
// ICefJsDialogHandler
|
|
FOnJsdialog : TOnJsdialog;
|
|
FOnBeforeUnloadDialog : TOnBeforeUnloadDialog;
|
|
FOnResetDialogState : TOnResetDialogState;
|
|
FOnDialogClosed : TOnDialogClosed;
|
|
|
|
// ICefLifeSpanHandler
|
|
FOnBeforePopup : TOnBeforePopup;
|
|
FOnAfterCreated : TOnAfterCreated;
|
|
FOnBeforeClose : TOnBeforeClose;
|
|
FOnClose : TOnClose;
|
|
|
|
// ICefRequestHandler
|
|
FOnBeforeBrowse : TOnBeforeBrowse;
|
|
FOnOpenUrlFromTab : TOnOpenUrlFromTab;
|
|
FOnBeforeResourceLoad : TOnBeforeResourceLoad;
|
|
FOnGetResourceHandler : TOnGetResourceHandler;
|
|
FOnResourceRedirect : TOnResourceRedirect;
|
|
FOnResourceResponse : TOnResourceResponse;
|
|
FOnGetResourceResponseFilter : TOnGetResourceResponseFilter;
|
|
FOnResourceLoadComplete : TOnResourceLoadComplete;
|
|
FOnGetAuthCredentials : TOnGetAuthCredentials;
|
|
FOnQuotaRequest : TOnQuotaRequest;
|
|
FOnProtocolExecution : TOnProtocolExecution;
|
|
FOnCertificateError : TOnCertificateError;
|
|
FOnSelectClientCertificate : TOnSelectClientCertificate;
|
|
FOnPluginCrashed : TOnPluginCrashed;
|
|
FOnRenderViewReady : TOnRenderViewReady;
|
|
FOnRenderProcessTerminated : TOnRenderProcessTerminated;
|
|
|
|
// ICefDialogHandler
|
|
FOnFileDialog : TOnFileDialog;
|
|
|
|
// ICefRenderHandler
|
|
FOnGetRootScreenRect : TOnGetRootScreenRect;
|
|
FOnGetViewRect : TOnGetViewRect;
|
|
FOnGetScreenPoint : TOnGetScreenPoint;
|
|
FOnGetScreenInfo : TOnGetScreenInfo;
|
|
FOnPopupShow : TOnPopupShow;
|
|
FOnPopupSize : TOnPopupSize;
|
|
FOnPaint : TOnPaint;
|
|
FOnCursorChange : TOnCursorChange;
|
|
FOnStartDragging : TOnStartDragging;
|
|
FOnUpdateDragCursor : TOnUpdateDragCursor;
|
|
FOnScrollOffsetChanged : TOnScrollOffsetChanged;
|
|
FOnIMECompositionRangeChanged : TOnIMECompositionRangeChanged;
|
|
|
|
// ICefDragHandler
|
|
FOnDragEnter : TOnDragEnter;
|
|
FOnDraggableRegionsChanged : TOnDraggableRegionsChanged;
|
|
|
|
// ICefFindHandler
|
|
FOnFindResult : TOnFindResult;
|
|
|
|
// Custom
|
|
FOnTextResultAvailable : TOnTextResultAvailableEvent;
|
|
FOnPdfPrintFinished : TOnPdfPrintFinishedEvent;
|
|
FOnPrefsAvailable : TOnTextResultAvailableEvent;
|
|
FOnCookiesDeleted : TOnCookiesDeletedEvent;
|
|
FOnDocumentAvailable : TOnDocumentAvailableEvent;
|
|
|
|
function GetIsLoading : boolean;
|
|
function GetMultithreadApp : boolean;
|
|
function GetHasDocument : boolean;
|
|
function GetHasView : boolean;
|
|
function GetHasDevTools : boolean;
|
|
function GetCanGoBack : boolean;
|
|
function GetCanGoForward : boolean;
|
|
function GetDocumentURL : string;
|
|
function GetZoomLevel : double;
|
|
function GetZoomPct : double;
|
|
function GetIsPopUp : boolean;
|
|
function GetWindowHandle : THandle;
|
|
function GetWindowlessFrameRate : integer;
|
|
function GetFrameIsFocused : boolean;
|
|
function GetInitialized : boolean;
|
|
function GetVisibleNavigationEntry : ICefNavigationEntry;
|
|
function GetHasValidMainFrame : boolean;
|
|
|
|
procedure SetDoNotTrack(aValue : boolean);
|
|
procedure SetSendReferrer(aValue : boolean);
|
|
procedure SetHyperlinkAuditing(aValue : boolean);
|
|
procedure SetCookiePrefs(aValue : integer);
|
|
procedure SetImagesPrefs(aValue : integer);
|
|
procedure SetProxyType(aValue : integer);
|
|
procedure SetProxyServer(const aValue : string);
|
|
procedure SetProxyPort(aValue : integer);
|
|
procedure SetProxyUsername(const aValue : string);
|
|
procedure SetProxyPassword(const aValue : string);
|
|
procedure SetProxyScriptURL(const aValue : string);
|
|
procedure SetProxyByPassList(const aValue : string);
|
|
procedure SetCustomHeaderName(const aValue : string);
|
|
procedure SetCustomHeaderValue(const aValue : string);
|
|
procedure SetCMStoragePath(const aValue : ustring);
|
|
procedure SetZoomLevel(const aValue : double);
|
|
procedure SetZoomPct(const aValue : double);
|
|
procedure SetZoomStep(aValue : byte);
|
|
procedure SetWindowlessFrameRate(aValue : integer);
|
|
|
|
|
|
function CreateBrowserHost(aWindowInfo : PCefWindowInfo; const aClient : ICefClient; const aURL : ustring; const aSettings : PCefBrowserSettings; const aContext : ICefRequestContext): Boolean;
|
|
function CreateBrowserHostSync(aWindowInfo : PCefWindowInfo; const aClient : ICefClient; const aURL : ustring; const aSettings : PCefBrowserSettings; const aContext : ICefRequestContext): ICefBrowser;
|
|
|
|
procedure InitializeEvents;
|
|
procedure InitializeSettings(var aSettings : TCefBrowserSettings);
|
|
|
|
procedure GetSettings(var aSettings : TCefBrowserSettings);
|
|
procedure GetPrintPDFSettings(var aSettings : TCefPdfPrintSettings; const aTitle, aURL : string);
|
|
|
|
procedure UpdateAllPreferences;
|
|
function UpdateProxyPrefs : boolean;
|
|
function UpdatePreference(const aName : string; aValue : boolean) : boolean; overload;
|
|
function UpdatePreference(const aName : string; aValue : integer) : boolean; overload;
|
|
function UpdatePreference(const aName : string; const aValue : double) : boolean; overload;
|
|
function UpdatePreference(const aName, aValue : string) : boolean; overload;
|
|
|
|
procedure HandleDictionary(const aDict : ICefDictionaryValue; var aResultSL : TStringList; const aRoot : string);
|
|
procedure HandleNull(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
procedure HandleBool(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
procedure HandleInteger(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
procedure HandleDouble(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
procedure HandleString(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
procedure HandleBinary(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
procedure HandleList(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
procedure HandleInvalid(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
|
|
procedure PrefsAvailableMsg(var aMessage : TMessage);
|
|
function GetParentForm : TCustomForm;
|
|
procedure ApplyZoomStep;
|
|
function GetAllPreferences : boolean;
|
|
function SendCompMessage(aMsg : cardinal; wParam : cardinal = 0; lParam : integer = 0) : boolean;
|
|
procedure WndProc(var aMessage: TMessage);
|
|
|
|
|
|
// ICefClient
|
|
function doOnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const aMessage: ICefProcessMessage): Boolean; virtual;
|
|
|
|
// ICefLoadHandler
|
|
procedure doOnLoadStart(const browser: ICefBrowser; const frame: ICefFrame; transitionType: TCefTransitionType); virtual;
|
|
procedure doOnLoadEnd(const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer); virtual;
|
|
procedure doOnLoadError(const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer; const errorText, failedUrl: ustring); virtual;
|
|
procedure doOnLoadingStateChange(const browser: ICefBrowser; isLoading, canGoBack, canGoForward: Boolean); virtual;
|
|
|
|
// ICefFocusHandler
|
|
procedure doOnTakeFocus(const browser: ICefBrowser; next: Boolean); virtual;
|
|
function doOnSetFocus(const browser: ICefBrowser; source: TCefFocusSource): Boolean; virtual;
|
|
procedure doOnGotFocus(const browser: ICefBrowser); virtual;
|
|
|
|
// ICefContextMenuHandler
|
|
procedure doOnBeforeContextMenu(const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel); virtual;
|
|
function doOnContextMenuCommand(const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; commandId: Integer; eventFlags: TCefEventFlags): Boolean; virtual;
|
|
procedure doOnContextMenuDismissed(const browser: ICefBrowser; const frame: ICefFrame); virtual;
|
|
|
|
// ICefKeyboardHandler
|
|
function doOnPreKeyEvent(const browser: ICefBrowser; const event: PCefKeyEvent; osEvent: TCefEventHandle; out isKeyboardShortcut: Boolean): Boolean; virtual;
|
|
function doOnKeyEvent(const browser: ICefBrowser; const event: PCefKeyEvent; osEvent: TCefEventHandle): Boolean; virtual;
|
|
|
|
// ICefDisplayHandler
|
|
procedure doOnAddressChange(const browser: ICefBrowser; const frame: ICefFrame; const url: ustring); virtual;
|
|
procedure doOnTitleChange(const browser: ICefBrowser; const title: ustring); virtual;
|
|
procedure doOnFaviconUrlChange(const browser: ICefBrowser; iconUrls: TStrings); virtual;
|
|
procedure doOnFullScreenModeChange(const browser: ICefBrowser; fullscreen: Boolean); virtual;
|
|
function doOnTooltip(const browser: ICefBrowser; var text: ustring): Boolean; virtual;
|
|
procedure doOnStatusMessage(const browser: ICefBrowser; const value: ustring); virtual;
|
|
function doOnConsoleMessage(const browser: ICefBrowser; const aMessage, source: ustring; line: Integer): Boolean; virtual;
|
|
|
|
// ICefDownloadHandler
|
|
procedure doOnBeforeDownload(const browser: ICefBrowser; const downloadItem: ICefDownloadItem; const suggestedName: ustring; const callback: ICefBeforeDownloadCallback); virtual;
|
|
procedure doOnDownloadUpdated(const browser: ICefBrowser; const downloadItem: ICefDownloadItem; const callback: ICefDownloadItemCallback); virtual;
|
|
|
|
// ICefGeolocationHandler
|
|
function doOnRequestGeolocationPermission(const browser: ICefBrowser; const requestingUrl: ustring; requestId: Integer; const callback: ICefGeolocationCallback): Boolean; virtual;
|
|
procedure doOnCancelGeolocationPermission(const browser: ICefBrowser; requestId: Integer); virtual;
|
|
|
|
// ICefJsDialogHandler
|
|
function doOnJsdialog(const browser: ICefBrowser; const originUrl: ustring; dialogType: TCefJsDialogType; const messageText, defaultPromptText: ustring; const callback: ICefJsDialogCallback; out suppressMessage: Boolean): Boolean; virtual;
|
|
function doOnBeforeUnloadDialog(const browser: ICefBrowser; const messageText: ustring; isReload: Boolean; const callback: ICefJsDialogCallback): Boolean; virtual;
|
|
procedure doOnResetDialogState(const browser: ICefBrowser); virtual;
|
|
procedure doOnDialogClosed(const browser: ICefBrowser); virtual;
|
|
|
|
// ICefLifeSpanHandler
|
|
function doOnBeforePopup(const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; var popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var noJavascriptAccess: Boolean): Boolean; virtual;
|
|
procedure doOnAfterCreated(const browser: ICefBrowser); virtual;
|
|
procedure doOnBeforeClose(const browser: ICefBrowser); virtual;
|
|
function doOnClose(const browser: ICefBrowser): Boolean; virtual;
|
|
|
|
// ICefRequestHandler
|
|
function doOnBeforeBrowse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; isRedirect: Boolean): Boolean; virtual;
|
|
function doOnOpenUrlFromTab(const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean): Boolean; virtual;
|
|
function doOnBeforeResourceLoad(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const callback: ICefRequestCallback): TCefReturnValue;
|
|
function doOnGetResourceHandler(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest): ICefResourceHandler; virtual;
|
|
procedure doOnResourceRedirect(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; var newUrl: ustring); virtual;
|
|
function doOnResourceResponse(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse): Boolean; virtual;
|
|
function doOnGetResourceResponseFilter(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse): ICefResponseFilter;
|
|
procedure doOnResourceLoadComplete(const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse; status: TCefUrlRequestStatus; receivedContentLength: Int64); virtual;
|
|
function doOnGetAuthCredentials(const browser: ICefBrowser; const frame: ICefFrame; isProxy: Boolean; const host: ustring; port: Integer; const realm, scheme: ustring; const callback: ICefAuthCallback): Boolean; virtual;
|
|
function doOnQuotaRequest(const browser: ICefBrowser; const originUrl: ustring; newSize: Int64; const callback: ICefRequestCallback): Boolean; virtual;
|
|
procedure doOnProtocolExecution(const browser: ICefBrowser; const url: ustring; out allowOsExecution: Boolean); virtual;
|
|
function doOnCertificateError(const browser: ICefBrowser; certError: TCefErrorcode; const requestUrl: ustring; const sslInfo: ICefSslInfo; const callback: ICefRequestCallback): Boolean; virtual;
|
|
function doOnSelectClientCertificate(const browser: ICefBrowser; isProxy: boolean; const host: ustring; port: integer; certificatesCount: NativeUInt; const certificates: TCefX509CertificateArray; const callback: ICefSelectClientCertificateCallback): boolean;
|
|
procedure doOnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring); virtual;
|
|
procedure doOnRenderViewReady(const browser: ICefBrowser); virtual;
|
|
procedure doOnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus); virtual;
|
|
|
|
// ICefDialogHandler
|
|
function doOnFileDialog(const browser: ICefBrowser; mode: TCefFileDialogMode; const title, defaultFilePath: ustring; acceptFilters: TStrings; selectedAcceptFilter: Integer; const callback: ICefFileDialogCallback): Boolean;
|
|
|
|
// ICefRenderHandler
|
|
function doOnGetRootScreenRect(const browser: ICefBrowser; rect: PCefRect): Boolean;
|
|
function doOnGetViewRect(const browser: ICefBrowser; rect: PCefRect): Boolean;
|
|
function doOnGetScreenPoint(const browser: ICefBrowser; viewX, viewY: Integer; screenX, screenY: PInteger): Boolean;
|
|
function doOnGetScreenInfo(const browser: ICefBrowser; screenInfo: PCefScreenInfo): Boolean;
|
|
procedure doOnPopupShow(const browser: ICefBrowser; show: Boolean);
|
|
procedure doOnPopupSize(const browser: ICefBrowser; const rect: PCefRect);
|
|
procedure doOnPaint(const browser: ICefBrowser; kind: TCefPaintElementType; dirtyRectsCount: NativeUInt; const dirtyRects: PCefRectArray; const buffer: Pointer; width, height: Integer);
|
|
procedure doOnCursorChange(const browser: ICefBrowser; cursor: TCefCursorHandle; cursorType: TCefCursorType; const customCursorInfo: PCefCursorInfo);
|
|
function doOnStartDragging(const browser: ICefBrowser; const dragData: ICefDragData; allowedOps: TCefDragOperations; x, y: Integer): Boolean;
|
|
procedure doOnUpdateDragCursor(const browser: ICefBrowser; operation: TCefDragOperation);
|
|
procedure doOnScrollOffsetChanged(const browser: ICefBrowser; x, y: Double);
|
|
procedure doOnIMECompositionRangeChanged(const browser: ICefBrowser; const selected_range: PCefRange; character_boundsCount: NativeUInt; const character_bounds: PCefRect);
|
|
|
|
// ICefDragHandler
|
|
function doOnDragEnter(const browser: ICefBrowser; const dragData: ICefDragData; mask: TCefDragOperations): Boolean;
|
|
procedure doOnDraggableRegionsChanged(const browser: ICefBrowser; regionsCount: NativeUInt; regions: PCefDraggableRegionArray);
|
|
|
|
// ICefFindHandler
|
|
procedure doOnFindResult(const browser: ICefBrowser; identifier, count: Integer; const selectionRect: PCefRect; activeMatchOrdinal: Integer; finalUpdate: Boolean);
|
|
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure AfterConstruction; override;
|
|
function CreateClientHandler(aIsOSR : boolean) : boolean;
|
|
function CreateBrowser(const aBrowserParent : TWinControl = nil; const aWindowName : string = '') : boolean;
|
|
procedure CloseBrowser(aForceClose : boolean);
|
|
|
|
procedure DOMVisitorVisit(const document: ICefDomDocument);
|
|
procedure CookiesDeleted(numDeleted : integer);
|
|
procedure GetHTML;
|
|
procedure VisitDOM;
|
|
procedure PdfPrintFinished(aResultOK : boolean);
|
|
procedure TextResultAvailable(const aText : string);
|
|
|
|
procedure LoadURL(const aURL : ustring);
|
|
procedure LoadString(const aString : ustring; const aURL : ustring = '');
|
|
procedure GoBack;
|
|
procedure GoForward;
|
|
procedure Reload;
|
|
procedure ReloadIgnoreCache;
|
|
procedure StopLoad;
|
|
procedure StartDownload(const aURL : ustring);
|
|
|
|
procedure SimulateMouseWheel(aDeltaX, aDeltaY : integer);
|
|
procedure DeleteCookies;
|
|
procedure RetrieveDOMDocument;
|
|
procedure RetrieveHTML;
|
|
|
|
procedure ShowDevTools(inspectElementAt: TPoint; const aDevTools : TWinControl);
|
|
procedure CloseDevTools(const aDevTools : TWinControl = nil);
|
|
|
|
procedure Find(aIdentifier : integer; const aSearchText : ustring; aForward, aMatchCase, aFindNext : Boolean);
|
|
procedure StopFinding(aClearSelection : Boolean);
|
|
|
|
procedure Print;
|
|
procedure PrintToPDF(const aFilePath, aTitle, aURL : ustring);
|
|
|
|
procedure ClipboardCopy;
|
|
procedure ClipboardPaste;
|
|
procedure ClipboardCut;
|
|
procedure ClipboardUndo;
|
|
procedure ClipboardRedo;
|
|
procedure ClipboardDel;
|
|
procedure SelectAll;
|
|
|
|
procedure IncZoomStep;
|
|
procedure DecZoomStep;
|
|
procedure ResetZoomStep;
|
|
|
|
procedure MoveFormTo(const x, y: Integer);
|
|
procedure MoveFormBy(const x, y: Integer);
|
|
procedure ResizeFormWidthTo(const x : Integer);
|
|
procedure ResizeFormHeightTo(const y : Integer);
|
|
procedure SetFormLeftTo(const x : Integer);
|
|
procedure SetFormTopTo(const y : Integer);
|
|
|
|
procedure WasResized;
|
|
procedure WasHidden(hidden: Boolean);
|
|
procedure NotifyScreenInfoChanged;
|
|
procedure Invalidate(kind: TCefPaintElementType);
|
|
procedure SendKeyEvent(const event: PCefKeyEvent);
|
|
procedure SendMouseClickEvent(const event: PCefMouseEvent; kind: TCefMouseButtonType; mouseUp: Boolean; clickCount: Integer);
|
|
procedure SendMouseMoveEvent(const event: PCefMouseEvent; mouseLeave: Boolean);
|
|
procedure SendMouseWheelEvent(const event: PCefMouseEvent; deltaX, deltaY: Integer);
|
|
procedure SendFocusEvent(setFocus: Boolean);
|
|
procedure SendCaptureLostEvent;
|
|
procedure SetFocus(focus: Boolean);
|
|
|
|
|
|
property DefaultUrl : ustring read FDefaultUrl write FDefaultUrl;
|
|
property Options : TChromiumOptions read FOptions write FOptions;
|
|
property FontOptions : TChromiumFontOptions read FFontOptions write FFontOptions;
|
|
property PDFPrintOptions : TPDFPrintOptions read FPDFPrintOptions write FPDFPrintOptions;
|
|
property DefaultEncoding : ustring read FDefaultEncoding write FDefaultEncoding;
|
|
property BrowserId : integer read FBrowserId;
|
|
property Browser : ICefBrowser read FBrowser;
|
|
property CefClient : ICefClient read FHandler;
|
|
property VisibleNavigationEntry : ICefNavigationEntry read GetVisibleNavigationEntry;
|
|
property MultithreadApp : boolean read GetMultithreadApp;
|
|
property IsLoading : boolean read GetIsLoading;
|
|
property HasDocument : boolean read GetHasDocument;
|
|
property HasView : boolean read GetHasView;
|
|
property HasDevTools : boolean read GetHasDevTools;
|
|
property CanGoBack : boolean read GetCanGoBack;
|
|
property CanGoForward : boolean read GetCanGoForward;
|
|
property IsPopUp : boolean read GetIsPopUp;
|
|
property WindowHandle : THandle read GetWindowHandle;
|
|
property FrameIsFocused : boolean read GetFrameIsFocused;
|
|
property Initialized : boolean read GetInitialized;
|
|
property GetPreferences : boolean read FGetPreferences write FGetPreferences;
|
|
property CookiePrefs : integer read FCookiePrefs write SetCookiePrefs;
|
|
property ImagesPrefs : integer read FImagesPrefs write SetImagesPrefs;
|
|
property CMStoragePath : ustring read FCMStoragePath write SetCMStoragePath;
|
|
property DocumentURL : string read GetDocumentURL;
|
|
property WindowName : string read FWindowName write FWindowName;
|
|
property ZoomLevel : double read GetZoomLevel write SetZoomLevel;
|
|
property ZoomPct : double read GetZoomPct write SetZoomPct;
|
|
property ZoomStep : byte read FZoomStep write SetZoomStep;
|
|
property WindowlessFrameRate : integer read GetWindowlessFrameRate write SetWindowlessFrameRate;
|
|
property CustomHeaderName : string read FCustomHeaderName write SetCustomHeaderName;
|
|
property CustomHeaderValue : string read FCustomHeaderValue write SetCustomHeaderValue;
|
|
property DoNotTrack : boolean read FDoNotTrack write SetDoNotTrack;
|
|
property SendReferrer : boolean read FSendReferrer write SetSendReferrer;
|
|
property HyperlinkAuditing : boolean read FHyperlinkAuditing write SetHyperlinkAuditing;
|
|
property HasValidMainFrame : boolean read GetHasValidMainFrame;
|
|
|
|
property ProxyType : integer read FProxyType write SetProxyType;
|
|
property ProxyServer : string read FProxyServer write SetProxyServer;
|
|
property ProxyPort : integer read FProxyPort write SetProxyPort;
|
|
property ProxyUsername : string read FProxyUsername write SetProxyUsername;
|
|
property ProxyPassword : string read FProxyPassword write SetProxyPassword;
|
|
property ProxyScriptURL : string read FProxyScriptURL write SetProxyScriptURL;
|
|
property ProxyByPassList : string read FProxyByPassList write SetProxyByPassList;
|
|
|
|
published
|
|
property OnTextResultAvailable : TOnTextResultAvailableEvent read FOnTextResultAvailable write FOnTextResultAvailable;
|
|
property OnPdfPrintFinished : TOnPdfPrintFinishedEvent read FOnPdfPrintFinished write FOnPdfPrintFinished;
|
|
property OnPrefsAvailable : TOnTextResultAvailableEvent read FOnPrefsAvailable write FOnPrefsAvailable;
|
|
property OnCookiesDeleted : TOnCookiesDeletedEvent read FOnCookiesDeleted write FOnCookiesDeleted;
|
|
property OnDocumentAvailable : TOnDocumentAvailableEvent read FOnDocumentAvailable write FOnDocumentAvailable;
|
|
|
|
// ICefClient
|
|
property OnProcessMessageReceived : TOnProcessMessageReceived read FOnProcessMessageReceived write FOnProcessMessageReceived;
|
|
|
|
// ICefLoadHandler
|
|
property OnLoadStart : TOnLoadStart read FOnLoadStart write FOnLoadStart;
|
|
property OnLoadEnd : TOnLoadEnd read FOnLoadEnd write FOnLoadEnd;
|
|
property OnLoadError : TOnLoadError read FOnLoadError write FOnLoadError;
|
|
property OnLoadingStateChange : TOnLoadingStateChange read FOnLoadingStateChange write FOnLoadingStateChange;
|
|
|
|
// ICefFocusHandler
|
|
property OnTakeFocus : TOnTakeFocus read FOnTakeFocus write FOnTakeFocus;
|
|
property OnSetFocus : TOnSetFocus read FOnSetFocus write FOnSetFocus;
|
|
property OnGotFocus : TOnGotFocus read FOnGotFocus write FOnGotFocus;
|
|
|
|
// ICefContextMenuHandler
|
|
property OnBeforeContextMenu : TOnBeforeContextMenu read FOnBeforeContextMenu write FOnBeforeContextMenu;
|
|
property OnContextMenuCommand : TOnContextMenuCommand read FOnContextMenuCommand write FOnContextMenuCommand;
|
|
property OnContextMenuDismissed : TOnContextMenuDismissed read FOnContextMenuDismissed write FOnContextMenuDismissed;
|
|
|
|
// ICefKeyboardHandler
|
|
property OnPreKeyEvent : TOnPreKeyEvent read FOnPreKeyEvent write FOnPreKeyEvent;
|
|
property OnKeyEvent : TOnKeyEvent read FOnKeyEvent write FOnKeyEvent;
|
|
|
|
// ICefDisplayHandler
|
|
property OnAddressChange : TOnAddressChange read FOnAddressChange write FOnAddressChange;
|
|
property OnTitleChange : TOnTitleChange read FOnTitleChange write FOnTitleChange;
|
|
property OnFavIconUrlChange : TOnFavIconUrlChange read FOnFavIconUrlChange write FOnFavIconUrlChange;
|
|
property OnFullScreenModeChange : TOnFullScreenModeChange read FOnFullScreenModeChange write FOnFullScreenModeChange;
|
|
property OnTooltip : TOnTooltip read FOnTooltip write FOnTooltip;
|
|
property OnStatusMessage : TOnStatusMessage read FOnStatusMessage write FOnStatusMessage;
|
|
property OnConsoleMessage : TOnConsoleMessage read FOnConsoleMessage write FOnConsoleMessage;
|
|
|
|
// ICefDownloadHandler
|
|
property OnBeforeDownload : TOnBeforeDownload read FOnBeforeDownload write FOnBeforeDownload;
|
|
property OnDownloadUpdated : TOnDownloadUpdated read FOnDownloadUpdated write FOnDownloadUpdated;
|
|
|
|
// ICefGeolocationHandler
|
|
property OnRequestGeolocationPermission : TOnRequestGeolocationPermission read FOnRequestGeolocationPermission write FOnRequestGeolocationPermission;
|
|
property OnCancelGeolocationPermission : TOnCancelGeolocationPermission read FOnCancelGeolocationPermission write FOnCancelGeolocationPermission;
|
|
|
|
// ICefJsDialogHandler
|
|
property OnJsdialog : TOnJsdialog read FOnJsdialog write FOnJsdialog;
|
|
property OnBeforeUnloadDialog : TOnBeforeUnloadDialog read FOnBeforeUnloadDialog write FOnBeforeUnloadDialog;
|
|
property OnResetDialogState : TOnResetDialogState read FOnResetDialogState write FOnResetDialogState;
|
|
property OnDialogClosed : TOnDialogClosed read FOnDialogClosed write FOnDialogClosed;
|
|
|
|
// ICefLifeSpanHandler
|
|
property OnBeforePopup : TOnBeforePopup read FOnBeforePopup write FOnBeforePopup;
|
|
property OnAfterCreated : TOnAfterCreated read FOnAfterCreated write FOnAfterCreated;
|
|
property OnBeforeClose : TOnBeforeClose read FOnBeforeClose write FOnBeforeClose;
|
|
property OnClose : TOnClose read FOnClose write FOnClose;
|
|
|
|
// ICefRequestHandler
|
|
property OnBeforeBrowse : TOnBeforeBrowse read FOnBeforeBrowse write FOnBeforeBrowse;
|
|
property OnOpenUrlFromTab : TOnOpenUrlFromTab read FOnOpenUrlFromTab write FOnOpenUrlFromTab;
|
|
property OnBeforeResourceLoad : TOnBeforeResourceLoad read FOnBeforeResourceLoad write FOnBeforeResourceLoad;
|
|
property OnGetResourceHandler : TOnGetResourceHandler read FOnGetResourceHandler write FOnGetResourceHandler;
|
|
property OnResourceRedirect : TOnResourceRedirect read FOnResourceRedirect write FOnResourceRedirect;
|
|
property OnResourceResponse : TOnResourceResponse read FOnResourceResponse write FOnResourceResponse;
|
|
property OnGetResourceResponseFilter : TOnGetResourceResponseFilter read FOnGetResourceResponseFilter write FOnGetResourceResponseFilter;
|
|
property OnResourceLoadComplete : TOnResourceLoadComplete read FOnResourceLoadComplete write FOnResourceLoadComplete;
|
|
property OnGetAuthCredentials : TOnGetAuthCredentials read FOnGetAuthCredentials write FOnGetAuthCredentials;
|
|
property OnQuotaRequest : TOnQuotaRequest read FOnQuotaRequest write FOnQuotaRequest;
|
|
property OnProtocolExecution : TOnProtocolExecution read FOnProtocolExecution write FOnProtocolExecution;
|
|
property OnCertificateError : TOnCertificateError read FOnCertificateError write FOnCertificateError;
|
|
property OnSelectClientCertificate : TOnSelectClientCertificate read FOnSelectClientCertificate write FOnSelectClientCertificate;
|
|
property OnPluginCrashed : TOnPluginCrashed read FOnPluginCrashed write FOnPluginCrashed;
|
|
property OnRenderViewReady : TOnRenderViewReady read FOnRenderViewReady write FOnRenderViewReady;
|
|
property OnRenderProcessTerminated : TOnRenderProcessTerminated read FOnRenderProcessTerminated write FOnRenderProcessTerminated;
|
|
|
|
// ICefDialogHandler
|
|
property OnFileDialog : TOnFileDialog read FOnFileDialog write FOnFileDialog;
|
|
|
|
// ICefRenderHandler
|
|
property OnGetRootScreenRect : TOnGetRootScreenRect read FOnGetRootScreenRect write FOnGetRootScreenRect;
|
|
property OnGetViewRect : TOnGetViewRect read FOnGetViewRect write FOnGetViewRect;
|
|
property OnGetScreenPoint : TOnGetScreenPoint read FOnGetScreenPoint write FOnGetScreenPoint;
|
|
property OnGetScreenInfo : TOnGetScreenInfo read FOnGetScreenInfo write FOnGetScreenInfo;
|
|
property OnPopupShow : TOnPopupShow read FOnPopupShow write FOnPopupShow;
|
|
property OnPopupSize : TOnPopupSize read FOnPopupSize write FOnPopupSize;
|
|
property OnPaint : TOnPaint read FOnPaint write FOnPaint;
|
|
property OnCursorChange : TOnCursorChange read FOnCursorChange write FOnCursorChange;
|
|
property OnStartDragging : TOnStartDragging read FOnStartDragging write FOnStartDragging;
|
|
property OnUpdateDragCursor : TOnUpdateDragCursor read FOnUpdateDragCursor write FOnUpdateDragCursor;
|
|
property OnScrollOffsetChanged : TOnScrollOffsetChanged read FOnScrollOffsetChanged write FOnScrollOffsetChanged;
|
|
property OnIMECompositionRangeChanged : TOnIMECompositionRangeChanged read FOnIMECompositionRangeChanged write FOnIMECompositionRangeChanged;
|
|
|
|
// ICefDragHandler
|
|
property OnDragEnter : TOnDragEnter read FOnDragEnter write FOnDragEnter;
|
|
property OnDraggableRegionsChanged : TOnDraggableRegionsChanged read FOnDraggableRegionsChanged write FOnDraggableRegionsChanged;
|
|
|
|
// ICefFindHandler
|
|
property OnFindResult : TOnFindResult read FOnFindResult write FOnFindResult;
|
|
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
System.SysUtils, System.Math,
|
|
uCEFBrowser, uCEFValue, uCEFDictionaryValue, uCEFStringMultimap, uCEFCookieManager, uCEFFrame,
|
|
uCEFApplication;
|
|
|
|
constructor TChromium.Create(AOwner: TComponent);
|
|
begin
|
|
FBrowser := nil;
|
|
FBrowserId := 0;
|
|
FCompHandle := 0;
|
|
FClosing := False;
|
|
FInitialized := False;
|
|
FIsOSR := False;
|
|
FDefaultUrl := 'about:blank';
|
|
FClientHandler := nil;
|
|
FHandler := nil;
|
|
FOptions := nil;
|
|
FFontOptions := nil;
|
|
FDefaultEncoding := '';
|
|
FVisitor := nil;
|
|
FPDFPrintcb := nil;
|
|
FCookiDeletercb := nil;
|
|
FDOMVisitor := nil;
|
|
FPDFPrintOptions := nil;
|
|
FPrefs := nil;
|
|
FUpdatePreferences := False;
|
|
FGetPreferences := False;
|
|
FCustomHeaderName := '';
|
|
FCustomHeaderValue := '';
|
|
FAddCustomHeader := False;
|
|
FDoNotTrack := True;
|
|
FSendReferrer := True;
|
|
FHyperlinkAuditing := False;
|
|
FCookiePrefs := CEF_CONTENT_SETTING_ALLOW;
|
|
FImagesPrefs := CEF_CONTENT_SETTING_ALLOW;
|
|
FZoomStep := ZOOM_STEP_DEF;
|
|
FWindowName := '';
|
|
|
|
FProxyType := CEF_PROXYTYPE_DIRECT;
|
|
FProxyServer := '';
|
|
FProxyPort := 80;
|
|
FProxyUsername := '';
|
|
FProxyPassword := '';
|
|
FProxyScriptURL := '';
|
|
FProxyByPassList := '';
|
|
|
|
InitializeEvents;
|
|
|
|
inherited Create(AOwner);
|
|
end;
|
|
|
|
destructor TChromium.Destroy;
|
|
begin
|
|
try
|
|
try
|
|
FBrowser := nil;
|
|
FBrowserId := 0;
|
|
|
|
if (FCompHandle <> 0) then
|
|
begin
|
|
DeallocateHWnd(FCompHandle);
|
|
FCompHandle := 0;
|
|
end;
|
|
|
|
if (FHandler <> nil) then
|
|
begin
|
|
(FHandler as ICefClientHandler).Disconnect;
|
|
FHandler := nil;
|
|
end;
|
|
|
|
if (FClientHandler <> nil) then
|
|
begin
|
|
FClientHandler.Disconnect;
|
|
FClientHandler.ReleaseOtherInstances;
|
|
FClientHandler := nil;
|
|
end;
|
|
|
|
FVisitor := nil;
|
|
FPDFPrintcb := nil;
|
|
FCookiDeletercb := nil;
|
|
FDOMVisitor := nil;
|
|
|
|
if (FFontOptions <> nil) then FreeAndNil(FFontOptions);
|
|
if (FOptions <> nil) then FreeAndNil(FOptions);
|
|
if (FPDFPrintOptions <> nil) then FreeAndNil(FPDFPrintOptions);
|
|
if (FPrefs <> nil) then FreeAndNil(FPrefs);
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.Destroy error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
finally
|
|
inherited Destroy;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.AfterConstruction;
|
|
begin
|
|
inherited AfterConstruction;
|
|
|
|
try
|
|
if not(csDesigning in ComponentState) then
|
|
begin
|
|
FCompHandle := AllocateHWnd(WndProc);
|
|
FOptions := TChromiumOptions.Create;
|
|
FFontOptions := TChromiumFontOptions.Create;
|
|
FPDFPrintOptions := TPDFPrintOptions.Create;
|
|
FPrefs := TStringList.Create;
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.AfterConstruction error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TChromium.CreateClientHandler(aIsOSR : boolean) : boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
try
|
|
if (FHandler = nil) then
|
|
begin
|
|
FIsOSR := aIsOsr;
|
|
FClientHandler := TVCLClientHandler.Create(Self, FIsOSR);
|
|
FHandler := FClientHandler as ICefClient;
|
|
Result := (FHandler <> nil);
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.CreateClientHandler error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.InitializeEvents;
|
|
begin
|
|
// ICefClient
|
|
FOnProcessMessageReceived := nil;
|
|
|
|
// ICefLoadHandler
|
|
FOnLoadStart := nil;
|
|
FOnLoadEnd := nil;
|
|
FOnLoadError := nil;
|
|
FOnLoadingStateChange := nil;
|
|
|
|
// ICefFocusHandler
|
|
FOnTakeFocus := nil;
|
|
FOnSetFocus := nil;
|
|
FOnGotFocus := nil;
|
|
|
|
// ICefContextMenuHandler
|
|
FOnBeforeContextMenu := nil;
|
|
FOnContextMenuCommand := nil;
|
|
FOnContextMenuDismissed := nil;
|
|
|
|
// ICefKeyboardHandler
|
|
FOnPreKeyEvent := nil;
|
|
FOnKeyEvent := nil;
|
|
|
|
// ICefDisplayHandler
|
|
FOnAddressChange := nil;
|
|
FOnTitleChange := nil;
|
|
FOnFavIconUrlChange := nil;
|
|
FOnFullScreenModeChange := nil;
|
|
FOnTooltip := nil;
|
|
FOnStatusMessage := nil;
|
|
FOnConsoleMessage := nil;
|
|
|
|
// ICefDownloadHandler
|
|
FOnBeforeDownload := nil;
|
|
FOnDownloadUpdated := nil;
|
|
|
|
// ICefGeolocationHandler
|
|
FOnRequestGeolocationPermission := nil;
|
|
FOnCancelGeolocationPermission := nil;
|
|
|
|
// ICefJsDialogHandler
|
|
FOnJsdialog := nil;
|
|
FOnBeforeUnloadDialog := nil;
|
|
FOnResetDialogState := nil;
|
|
FOnDialogClosed := nil;
|
|
|
|
// ICefLifeSpanHandler
|
|
FOnBeforePopup := nil;
|
|
FOnAfterCreated := nil;
|
|
FOnBeforeClose := nil;
|
|
FOnClose := nil;
|
|
|
|
// ICefRequestHandler
|
|
FOnBeforeBrowse := nil;
|
|
FOnOpenUrlFromTab := nil;
|
|
FOnBeforeResourceLoad := nil;
|
|
FOnGetResourceHandler := nil;
|
|
FOnResourceRedirect := nil;
|
|
FOnResourceResponse := nil;
|
|
FOnGetResourceResponseFilter := nil;
|
|
FOnResourceLoadComplete := nil;
|
|
FOnGetAuthCredentials := nil;
|
|
FOnQuotaRequest := nil;
|
|
FOnProtocolExecution := nil;
|
|
FOnCertificateError := nil;
|
|
FOnSelectClientCertificate := nil;
|
|
FOnPluginCrashed := nil;
|
|
FOnRenderViewReady := nil;
|
|
FOnRenderProcessTerminated := nil;
|
|
|
|
// ICefDialogHandler
|
|
FOnFileDialog := nil;
|
|
|
|
// ICefRenderHandler
|
|
FOnGetRootScreenRect := nil;
|
|
FOnGetViewRect := nil;
|
|
FOnGetScreenPoint := nil;
|
|
FOnGetScreenInfo := nil;
|
|
FOnPopupShow := nil;
|
|
FOnPopupSize := nil;
|
|
FOnPaint := nil;
|
|
FOnCursorChange := nil;
|
|
FOnStartDragging := nil;
|
|
FOnUpdateDragCursor := nil;
|
|
FOnScrollOffsetChanged := nil;
|
|
FOnIMECompositionRangeChanged := nil;
|
|
|
|
// ICefDragHandler
|
|
FOnDragEnter := nil;
|
|
FOnDraggableRegionsChanged := nil;
|
|
|
|
// ICefFindHandler
|
|
FOnFindResult := nil;
|
|
|
|
// Custom
|
|
FOnTextResultAvailable := nil;
|
|
FOnPdfPrintFinished := nil;
|
|
FOnPrefsAvailable := nil;
|
|
FOnCookiesDeleted := nil;
|
|
FOnDocumentAvailable := nil;
|
|
end;
|
|
|
|
function TChromium.CreateBrowser(const aBrowserParent : TWinControl; const aWindowName : string) : boolean;
|
|
var
|
|
TempInfo : TCefWindowInfo;
|
|
TempSettings : TCefBrowserSettings;
|
|
begin
|
|
Result := False;
|
|
|
|
try
|
|
if not(csDesigning in ComponentState) and
|
|
(FBrowser = nil) and
|
|
(FBrowserId = 0) and
|
|
CreateClientHandler(aBrowserParent = nil) then
|
|
begin
|
|
GetSettings(TempSettings);
|
|
|
|
if FIsOSR then
|
|
WindowInfoAsWindowless(TempInfo, FCompHandle, False, aWindowName)
|
|
else
|
|
WindowInfoAsChild(TempInfo, aBrowserParent.Handle, aBrowserParent.ClientRect, aWindowName);
|
|
|
|
|
|
if MultithreadApp then
|
|
Result := CreateBrowserHost(@TempInfo, FHandler, FDefaultUrl, @TempSettings, nil)
|
|
else
|
|
begin
|
|
FBrowser := CreateBrowserHostSync(@TempInfo, FHandler, FDefaultUrl, @TempSettings, nil);
|
|
|
|
if (FBrowser <> nil) then
|
|
begin
|
|
FBrowserId := FBrowser.Identifier;
|
|
Result := True;
|
|
end;
|
|
end;
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.CreateBrowser error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.CloseBrowser(aForceClose : boolean);
|
|
begin
|
|
if Initialized then FBrowser.Host.CloseBrowser(aForceClose);
|
|
end;
|
|
|
|
function TChromium.CreateBrowserHost(aWindowInfo : PCefWindowInfo;
|
|
const aClient : ICefClient;
|
|
const aURL : ustring;
|
|
const aSettings : PCefBrowserSettings;
|
|
const aContext : ICefRequestContext): Boolean;
|
|
var
|
|
TempURL : TCefString;
|
|
begin
|
|
TempURL := CefString(aURL);
|
|
Result := cef_browser_host_create_browser(aWindowInfo, CefGetData(aClient), @TempURL, aSettings, CefGetData(aContext)) <> 0;
|
|
end;
|
|
|
|
function TChromium.CreateBrowserHostSync(aWindowInfo : PCefWindowInfo;
|
|
const aClient : ICefClient;
|
|
const aURL : ustring;
|
|
const aSettings : PCefBrowserSettings;
|
|
const aContext : ICefRequestContext): ICefBrowser;
|
|
var
|
|
TempURL : TCefString;
|
|
TempBrowser : PCefBrowser;
|
|
begin
|
|
TempURL := CefString(aURL);
|
|
TempBrowser := cef_browser_host_create_browser_sync(aWindowInfo, CefGetData(aClient), @TempURL, aSettings, CefGetData(aContext));
|
|
Result := TCefBrowserRef.UnWrap(TempBrowser);
|
|
end;
|
|
|
|
procedure TChromium.Find(aIdentifier : integer; const aSearchText : ustring; aForward, aMatchCase, aFindNext : Boolean);
|
|
begin
|
|
if Initialized then FBrowser.Host.Find(aIdentifier, aSearchText, aForward, aMatchCase, aFindNext);
|
|
end;
|
|
|
|
procedure TChromium.StopFinding(aClearSelection : Boolean);
|
|
begin
|
|
if Initialized then FBrowser.Host.StopFinding(aClearSelection);
|
|
end;
|
|
|
|
procedure TChromium.Print;
|
|
begin
|
|
if Initialized then FBrowser.Host.Print;
|
|
end;
|
|
|
|
procedure TChromium.PrintToPDF(const aFilePath, aTitle, aURL : ustring);
|
|
var
|
|
TempSettings : TCefPdfPrintSettings;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
GetPrintPDFSettings(TempSettings, aTitle, aURL);
|
|
if (FPDFPrintcb = nil) then FPDFPrintcb := TCefPDFPrintCallBack.Create(self);
|
|
FBrowser.Host.PrintToPdf(aFilePath, @TempSettings, FPDFPrintcb);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.VisitDOM;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
try
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.MainFrame;
|
|
|
|
if (TempFrame <> nil) then
|
|
begin
|
|
if (FDOMVisitor = nil) then FDOMVisitor := TCustomDomVisitor.Create(self);
|
|
TempFrame.VisitDom(FDOMVisitor);
|
|
end;
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.VisitDOM error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.ClipboardCopy;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.FocusedFrame;
|
|
if (TempFrame = nil) then TempFrame := FBrowser.MainFrame;
|
|
|
|
if (TempFrame <> nil) then TempFrame.Copy;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.ClipboardPaste;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.FocusedFrame;
|
|
if (TempFrame = nil) then TempFrame := FBrowser.MainFrame;
|
|
|
|
if (TempFrame <> nil) then TempFrame.Paste;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.ClipboardCut;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.FocusedFrame;
|
|
if (TempFrame = nil) then TempFrame := FBrowser.MainFrame;
|
|
|
|
if (TempFrame <> nil) then TempFrame.Cut;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.ClipboardUndo;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.FocusedFrame;
|
|
if (TempFrame = nil) then TempFrame := FBrowser.MainFrame;
|
|
|
|
if (TempFrame <> nil) then TempFrame.Undo;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.ClipboardRedo;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.FocusedFrame;
|
|
if (TempFrame = nil) then TempFrame := FBrowser.MainFrame;
|
|
|
|
if (TempFrame <> nil) then TempFrame.Redo;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.ClipboardDel;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.FocusedFrame;
|
|
if (TempFrame = nil) then TempFrame := FBrowser.MainFrame;
|
|
|
|
if (TempFrame <> nil) then TempFrame.Del;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SelectAll;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.FocusedFrame;
|
|
if (TempFrame = nil) then TempFrame := FBrowser.MainFrame;
|
|
|
|
if (TempFrame <> nil) then TempFrame.SelectAll;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.GetPrintPDFSettings(var aSettings : TCefPdfPrintSettings; const aTitle, aURL : string);
|
|
begin
|
|
if (FPDFPrintOptions <> nil) then
|
|
begin
|
|
aSettings.header_footer_title := CefString(aTitle);
|
|
aSettings.header_footer_url := CefString(aURL);
|
|
aSettings.page_width := FPDFPrintOptions.page_width;
|
|
aSettings.page_height := FPDFPrintOptions.page_height;
|
|
aSettings.margin_top := FPDFPrintOptions.margin_top;
|
|
aSettings.margin_right := FPDFPrintOptions.margin_right;
|
|
aSettings.margin_bottom := FPDFPrintOptions.margin_bottom;
|
|
aSettings.margin_left := FPDFPrintOptions.margin_left;
|
|
aSettings.margin_type := FPDFPrintOptions.margin_type;
|
|
aSettings.header_footer_enabled := FPDFPrintOptions.header_footer_enabled;
|
|
aSettings.selection_only := FPDFPrintOptions.selection_only;
|
|
aSettings.landscape := FPDFPrintOptions.landscape;
|
|
aSettings.backgrounds_enabled := FPDFPrintOptions.backgrounds_enabled;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.GetSettings(var aSettings : TCefBrowserSettings);
|
|
begin
|
|
if (FFontOptions <> nil) and (FOptions <> nil) then
|
|
begin
|
|
aSettings.size := SizeOf(TCefBrowserSettings);
|
|
aSettings.windowless_frame_rate := FOptions.WindowlessFrameRate;
|
|
aSettings.standard_font_family := CefString(FFontOptions.StandardFontFamily);
|
|
aSettings.fixed_font_family := CefString(FFontOptions.FixedFontFamily);
|
|
aSettings.serif_font_family := CefString(FFontOptions.SerifFontFamily);
|
|
aSettings.sans_serif_font_family := CefString(FFontOptions.SansSerifFontFamily);
|
|
aSettings.cursive_font_family := CefString(FFontOptions.CursiveFontFamily);
|
|
aSettings.fantasy_font_family := CefString(FFontOptions.FantasyFontFamily);
|
|
aSettings.default_font_size := FFontOptions.DefaultFontSize;
|
|
aSettings.default_fixed_font_size := FFontOptions.DefaultFixedFontSize;
|
|
aSettings.minimum_font_size := FFontOptions.MinimumFontSize;
|
|
aSettings.minimum_logical_font_size := FFontOptions.MinimumLogicalFontSize;
|
|
aSettings.remote_fonts := FFontOptions.RemoteFonts;
|
|
aSettings.default_encoding := CefString(DefaultEncoding);
|
|
aSettings.javascript := FOptions.Javascript;
|
|
aSettings.javascript_open_windows := FOptions.JavascriptOpenWindows;
|
|
aSettings.javascript_close_windows := FOptions.JavascriptCloseWindows;
|
|
aSettings.javascript_access_clipboard := FOptions.JavascriptAccessClipboard;
|
|
aSettings.javascript_dom_paste := FOptions.JavascriptDomPaste;
|
|
aSettings.plugins := FOptions.Plugins;
|
|
aSettings.universal_access_from_file_urls := FOptions.UniversalAccessFromFileUrls;
|
|
aSettings.file_access_from_file_urls := FOptions.FileAccessFromFileUrls;
|
|
aSettings.web_security := FOptions.WebSecurity;
|
|
aSettings.image_loading := FOptions.ImageLoading;
|
|
aSettings.image_shrink_standalone_to_fit := FOptions.ImageShrinkStandaloneToFit;
|
|
aSettings.text_area_resize := FOptions.TextAreaResize;
|
|
aSettings.tab_to_links := FOptions.TabToLinks;
|
|
aSettings.local_storage := FOptions.LocalStorage;
|
|
aSettings.databases := FOptions.Databases;
|
|
aSettings.application_cache := FOptions.ApplicationCache;
|
|
aSettings.webgl := FOptions.Webgl;
|
|
aSettings.background_color := FOptions.BackgroundColor;
|
|
aSettings.accept_language_list := CefString(FOptions.AcceptLanguageList);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.InitializeSettings(var aSettings : TCefBrowserSettings);
|
|
begin
|
|
aSettings.size := SizeOf(TCefBrowserSettings);
|
|
aSettings.windowless_frame_rate := 30;
|
|
aSettings.standard_font_family := CefString('');
|
|
aSettings.fixed_font_family := CefString('');
|
|
aSettings.serif_font_family := CefString('');
|
|
aSettings.sans_serif_font_family := CefString('');
|
|
aSettings.cursive_font_family := CefString('');
|
|
aSettings.fantasy_font_family := CefString('');
|
|
aSettings.default_font_size := 0;
|
|
aSettings.default_fixed_font_size := 0;
|
|
aSettings.minimum_font_size := 0;
|
|
aSettings.minimum_logical_font_size := 0;
|
|
aSettings.remote_fonts := STATE_DEFAULT;
|
|
aSettings.default_encoding := CefString('');
|
|
aSettings.javascript := STATE_DEFAULT;
|
|
aSettings.javascript_open_windows := STATE_DEFAULT;
|
|
aSettings.javascript_close_windows := STATE_DEFAULT;
|
|
aSettings.javascript_access_clipboard := STATE_DEFAULT;
|
|
aSettings.javascript_dom_paste := STATE_DEFAULT;
|
|
aSettings.plugins := STATE_DEFAULT;
|
|
aSettings.universal_access_from_file_urls := STATE_DEFAULT;
|
|
aSettings.file_access_from_file_urls := STATE_DEFAULT;
|
|
aSettings.web_security := STATE_DEFAULT;
|
|
aSettings.image_loading := STATE_DEFAULT;
|
|
aSettings.image_shrink_standalone_to_fit := STATE_DEFAULT;
|
|
aSettings.text_area_resize := STATE_DEFAULT;
|
|
aSettings.tab_to_links := STATE_DEFAULT;
|
|
aSettings.local_storage := STATE_DEFAULT;
|
|
aSettings.databases := STATE_DEFAULT;
|
|
aSettings.application_cache := STATE_DEFAULT;
|
|
aSettings.webgl := STATE_DEFAULT;
|
|
aSettings.background_color := 0;
|
|
aSettings.accept_language_list := CefString('');
|
|
end;
|
|
|
|
procedure TChromium.LoadURL(const aURL : ustring);
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.MainFrame;
|
|
if (TempFrame <> nil) then TempFrame.LoadUrl(aURL);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.LoadString(const aString : ustring; const aURL : ustring);
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.MainFrame;
|
|
if (TempFrame <> nil) then TempFrame.LoadString(aString, aURL);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.GoBack;
|
|
begin
|
|
if Initialized and CanGoBack then FBrowser.GoBack;
|
|
end;
|
|
|
|
procedure TChromium.GoForward;
|
|
begin
|
|
if Initialized and CanGoForward then FBrowser.GoForward;
|
|
end;
|
|
|
|
procedure TChromium.Reload;
|
|
begin
|
|
if Initialized then FBrowser.Reload;
|
|
end;
|
|
|
|
procedure TChromium.ReloadIgnoreCache;
|
|
begin
|
|
if Initialized then FBrowser.ReloadIgnoreCache;
|
|
end;
|
|
|
|
procedure TChromium.StopLoad;
|
|
begin
|
|
if Initialized then FBrowser.StopLoad;
|
|
end;
|
|
|
|
procedure TChromium.StartDownload(const aURL : ustring);
|
|
begin
|
|
if Initialized then FBrowser.Host.StartDownload(aURL);
|
|
end;
|
|
|
|
function TChromium.GetIsLoading : boolean;
|
|
begin
|
|
Result := Initialized and FBrowser.IsLoading;
|
|
end;
|
|
|
|
function TChromium.GetMultithreadApp : boolean;
|
|
begin
|
|
Result := True;
|
|
|
|
try
|
|
if (GlobalCEFApp <> nil) then Result := GlobalCEFApp.MultiThreadedMessageLoop;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.GetMultithreadApp error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TChromium.GetHasDocument : boolean;
|
|
begin
|
|
Result := Initialized and FBrowser.HasDocument;
|
|
end;
|
|
|
|
function TChromium.GetHasView : boolean;
|
|
begin
|
|
Result := Initialized and FBrowser.Host.HasView;
|
|
end;
|
|
|
|
function TChromium.GetHasDevTools : boolean;
|
|
begin
|
|
Result := Initialized and FBrowser.Host.HasDevTools;
|
|
end;
|
|
|
|
function TChromium.GetWindowHandle : THandle;
|
|
begin
|
|
if Initialized then
|
|
Result := FBrowser.Host.WindowHandle
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TChromium.GetFrameIsFocused : boolean;
|
|
begin
|
|
Result := Initialized and (FBrowser.FocusedFrame <> nil);
|
|
end;
|
|
|
|
function TChromium.GetWindowlessFrameRate : integer;
|
|
begin
|
|
if Initialized then
|
|
Result := FBrowser.Host.GetWindowlessFrameRate
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TChromium.GetVisibleNavigationEntry : ICefNavigationEntry;
|
|
begin
|
|
if Initialized then
|
|
Result := FBrowser.Host.VisibleNavigationEntry
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TChromium.GetHasValidMainFrame : boolean;
|
|
begin
|
|
Result := Initialized and (FBrowser.MainFrame <> nil) and FBrowser.MainFrame.IsValid;
|
|
end;
|
|
|
|
procedure TChromium.SetWindowlessFrameRate(aValue : integer);
|
|
begin
|
|
if Initialized then FBrowser.Host.SetWindowlessFrameRate(aValue);
|
|
end;
|
|
|
|
function TChromium.GetCanGoBack : boolean;
|
|
begin
|
|
Result := Initialized and FBrowser.CanGoBack;
|
|
end;
|
|
|
|
function TChromium.GetCanGoForward : boolean;
|
|
begin
|
|
Result := Initialized and FBrowser.CanGoForward;
|
|
end;
|
|
|
|
function TChromium.GetIsPopUp : boolean;
|
|
begin
|
|
Result := Initialized and FBrowser.IsPopUp;
|
|
end;
|
|
|
|
function TChromium.GetInitialized : boolean;
|
|
begin
|
|
Result := FInitialized and not(FClosing) and (FBrowser <> nil);
|
|
end;
|
|
|
|
function TChromium.GetDocumentURL : string;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
Result := '';
|
|
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.MainFrame;
|
|
if (TempFrame <> nil) then Result := TempFrame.URL;
|
|
end;
|
|
end;
|
|
|
|
function TChromium.GetZoomLevel : double;
|
|
begin
|
|
Result := 0;
|
|
|
|
if Initialized then Result := FBrowser.Host.ZoomLevel;
|
|
end;
|
|
|
|
procedure TChromium.SetZoomLevel(const aValue : double);
|
|
begin
|
|
if Initialized then FBrowser.Host.ZoomLevel := aValue;
|
|
end;
|
|
|
|
function TChromium.GetZoomPct : double;
|
|
begin
|
|
Result := power(1.2, ZoomLevel) * 100;
|
|
end;
|
|
|
|
procedure TChromium.SetZoomPct(const aValue : double);
|
|
begin
|
|
if Initialized and (aValue > 0) then ZoomLevel := LogN(1.2, aValue / 100);
|
|
end;
|
|
|
|
procedure TChromium.ApplyZoomStep;
|
|
begin
|
|
case FZoomStep of
|
|
ZOOM_STEP_25 : ZoomPct := 25;
|
|
ZOOM_STEP_33 : ZoomPct := 33;
|
|
ZOOM_STEP_50 : ZoomPct := 50;
|
|
ZOOM_STEP_67 : ZoomPct := 67;
|
|
ZOOM_STEP_75 : ZoomPct := 75;
|
|
ZOOM_STEP_90 : ZoomPct := 90;
|
|
ZOOM_STEP_100 : ZoomPct := 100;
|
|
ZOOM_STEP_110 : ZoomPct := 110;
|
|
ZOOM_STEP_125 : ZoomPct := 125;
|
|
ZOOM_STEP_150 : ZoomPct := 150;
|
|
ZOOM_STEP_175 : ZoomPct := 175;
|
|
ZOOM_STEP_200 : ZoomPct := 200;
|
|
ZOOM_STEP_250 : ZoomPct := 250;
|
|
ZOOM_STEP_300 : ZoomPct := 300;
|
|
ZOOM_STEP_400 : ZoomPct := 400;
|
|
ZOOM_STEP_500 : ZoomPct := 500;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetZoomStep(aValue : byte);
|
|
begin
|
|
if Initialized and (aValue in [ZOOM_STEP_MIN..ZOOM_STEP_MAX]) then
|
|
begin
|
|
FZoomStep := aValue;
|
|
ApplyZoomStep;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.IncZoomStep;
|
|
begin
|
|
if Initialized and (FZoomStep < ZOOM_STEP_MAX) then
|
|
begin
|
|
inc(FZoomStep);
|
|
ApplyZoomStep;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.DecZoomStep;
|
|
begin
|
|
if Initialized and (FZoomStep > ZOOM_STEP_MIN) then
|
|
begin
|
|
dec(FZoomStep);
|
|
ApplyZoomStep;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.ResetZoomStep;
|
|
begin
|
|
ZoomStep := ZOOM_STEP_DEF;
|
|
end;
|
|
|
|
procedure TChromium.SetDoNotTrack(aValue : boolean);
|
|
begin
|
|
if (FDoNotTrack <> aValue) then
|
|
begin
|
|
FDoNotTrack := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetSendReferrer(aValue : boolean);
|
|
begin
|
|
if (FSendReferrer <> aValue) then
|
|
begin
|
|
FSendReferrer := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetHyperlinkAuditing(aValue : boolean);
|
|
begin
|
|
if (FHyperlinkAuditing <> aValue) then
|
|
begin
|
|
FHyperlinkAuditing := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetCookiePrefs(aValue : integer);
|
|
begin
|
|
if (FCookiePrefs <> aValue) then
|
|
begin
|
|
FCookiePrefs := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetImagesPrefs(aValue : integer);
|
|
begin
|
|
if (FImagesPrefs <> aValue) then
|
|
begin
|
|
FImagesPrefs := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetProxyType(aValue : integer);
|
|
begin
|
|
if (FProxyType <> aValue) then
|
|
begin
|
|
FProxyType := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetProxyServer(const aValue : string);
|
|
begin
|
|
if (FProxyServer <> aValue) then
|
|
begin
|
|
FProxyServer := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetProxyPort(aValue : integer);
|
|
begin
|
|
if (FProxyPort <> aValue) then
|
|
begin
|
|
FProxyPort := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetProxyUsername(const aValue : string);
|
|
begin
|
|
if (FProxyUsername <> aValue) then
|
|
begin
|
|
FProxyUsername := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetProxyPassword(const aValue : string);
|
|
begin
|
|
if (FProxyPassword <> aValue) then
|
|
begin
|
|
FProxyPassword := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetProxyScriptURL(const aValue : string);
|
|
begin
|
|
if (FProxyScriptURL <> aValue) then
|
|
begin
|
|
FProxyScriptURL := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetProxyByPassList(const aValue : string);
|
|
begin
|
|
if (FProxyByPassList <> aValue) then
|
|
begin
|
|
FProxyByPassList := aValue;
|
|
FUpdatePreferences := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetCustomHeaderName(const aValue : string);
|
|
begin
|
|
if (FCustomHeaderName <> aValue) then
|
|
begin
|
|
FCustomHeaderName := aValue;
|
|
FAddCustomHeader := (length(FCustomHeaderName) > 0) and (length(FCustomHeaderValue) > 0);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetCustomHeaderValue(const aValue : string);
|
|
begin
|
|
if (FCustomHeaderValue <> aValue) then
|
|
begin
|
|
FCustomHeaderValue := aValue;
|
|
FAddCustomHeader := (length(FCustomHeaderName) > 0) and (length(FCustomHeaderValue) > 0);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetCMStoragePath(const aValue : ustring);
|
|
var
|
|
CookieManager : ICefCookieManager;
|
|
begin
|
|
FCMStoragePath := aValue;
|
|
CookieManager := TCefCookieManagerRef.Global(nil);
|
|
|
|
if (CookieManager <> nil) then
|
|
CookieManager.SetStoragePath(FCMStoragePath, False, nil);
|
|
end;
|
|
|
|
procedure TChromium.GetHTML;
|
|
var
|
|
TempFrame : ICefFrame;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempFrame := FBrowser.MainFrame;
|
|
if (TempFrame <> nil) then
|
|
begin
|
|
if (FVisitor = nil) then FVisitor := TCustomCefStringVisitor.Create(self);
|
|
TempFrame.GetSource(FVisitor);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.DeleteCookies;
|
|
var
|
|
TempTask: ICefTask;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
if (FCookiDeletercb = nil) then FCookiDeletercb := TCefCustomDeleteCookiesCallback.Create(self);
|
|
TempTask := TCefDeleteCookiesTask.Create(FCookiDeletercb);
|
|
CefPostTask(TID_IO, TempTask);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.RetrieveDOMDocument;
|
|
var
|
|
TempTask: ICefTask;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempTask := TCefGetDocumentTask.Create(self);
|
|
CefPostTask(TID_RENDERER, TempTask);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.RetrieveHTML;
|
|
var
|
|
TempTask: ICefTask;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempTask := TCefGetHTMLTask.Create(self);
|
|
CefPostTask(TID_UI, TempTask);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SimulateMouseWheel(aDeltaX, aDeltaY : integer);
|
|
var
|
|
TempEvent : TCefMouseEvent;
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
TempEvent.x := 0;
|
|
TempEvent.y := 0;
|
|
TempEvent.modifiers := [];
|
|
FBrowser.Host.SendMouseWheelEvent(@TempEvent, aDeltaX, aDeltaY);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.UpdateAllPreferences;
|
|
begin
|
|
UpdateProxyPrefs;
|
|
UpdatePreference('enable_do_not_track', FDoNotTrack);
|
|
UpdatePreference('enable_referrers', FSendReferrer);
|
|
UpdatePreference('enable_a_ping', FHyperlinkAuditing);
|
|
end;
|
|
|
|
function TChromium.UpdateProxyPrefs : boolean;
|
|
var
|
|
TempError : ustring;
|
|
TempProxy : ICefValue;
|
|
TempValue : ICefValue;
|
|
TempDict : ICefDictionaryValue;
|
|
begin
|
|
Result := False;
|
|
|
|
try
|
|
if (FBrowser <> nil) and FBrowser.Host.RequestContext.CanSetPreference('proxy') then
|
|
begin
|
|
TempProxy := TCefValueRef.New;
|
|
TempValue := TCefValueRef.New;
|
|
TempDict := TCefDictionaryValueRef.New;
|
|
|
|
case FProxyType of
|
|
CEF_PROXYTYPE_AUTODETECT :
|
|
begin
|
|
TempValue.SetString('auto_detect');
|
|
TempDict.SetValue('mode', TempValue);
|
|
end;
|
|
|
|
CEF_PROXYTYPE_SYSTEM :
|
|
begin
|
|
TempValue.SetString('system');
|
|
TempDict.SetValue('mode', TempValue);
|
|
end;
|
|
|
|
CEF_PROXYTYPE_FIXED_SERVERS :
|
|
begin
|
|
TempValue.SetString('fixed_servers');
|
|
TempDict.SetValue('mode', TempValue);
|
|
TempDict.SetString('server', FProxyServer + ':' + inttostr(FProxyPort));
|
|
if (length(FProxyByPassList) > 0) then TempDict.SetString('bypass_list', FProxyByPassList);
|
|
end;
|
|
|
|
|
|
CEF_PROXYTYPE_PAC_SCRIPT :
|
|
begin
|
|
TempValue.SetString('pac_script');
|
|
TempDict.SetValue('mode', TempValue);
|
|
TempDict.SetString('pac_url', FProxyScriptURL);
|
|
end;
|
|
|
|
else // CEF_PROXYTYPE_DIRECT
|
|
begin
|
|
TempValue.SetString('direct');
|
|
TempDict.SetValue('mode', TempValue);
|
|
end;
|
|
end;
|
|
|
|
Result := TempProxy.SetDictionary(TempDict) and
|
|
FBrowser.Host.RequestContext.SetPreference('proxy', TempProxy, TempError);
|
|
|
|
{$IFDEF DEBUG}
|
|
if not(Result) then OutputDebugString(PWideChar('UpdateProxyPrefs error : ' + quotedstr(TempError) + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.UpdateProxyPrefs error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TChromium.UpdatePreference(const aName : string; aValue : boolean) : boolean;
|
|
var
|
|
TempError : ustring;
|
|
TempValue : ICefValue;
|
|
begin
|
|
Result := False;
|
|
|
|
try
|
|
if (FBrowser <> nil) and FBrowser.Host.RequestContext.CanSetPreference(aName) then
|
|
begin
|
|
TempValue := TCefValueRef.New;
|
|
|
|
if aValue then
|
|
TempValue.SetBool(1)
|
|
else
|
|
TempValue.SetBool(0);
|
|
|
|
Result := FBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError);
|
|
|
|
{$IFDEF DEBUG}
|
|
if not(Result) then OutputDebugString(PWideChar('UpdatePreference error : ' + quotedstr(TempError) + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.UpdatePreference error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TChromium.UpdatePreference(const aName : string; aValue : integer) : boolean;
|
|
var
|
|
TempError : ustring;
|
|
TempValue : ICefValue;
|
|
begin
|
|
Result := False;
|
|
|
|
try
|
|
if (FBrowser <> nil) and FBrowser.Host.RequestContext.CanSetPreference(aName) then
|
|
begin
|
|
TempValue := TCefValueRef.New;
|
|
TempValue.SetInt(aValue);
|
|
Result := FBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError);
|
|
|
|
{$IFDEF DEBUG}
|
|
if not(Result) then OutputDebugString(PWideChar('UpdatePreference error : ' + quotedstr(TempError) + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.UpdatePreference error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TChromium.UpdatePreference(const aName : string; const aValue : double) : boolean;
|
|
var
|
|
TempError : ustring;
|
|
TempValue : ICefValue;
|
|
begin
|
|
Result := False;
|
|
|
|
try
|
|
if (FBrowser <> nil) and FBrowser.Host.RequestContext.CanSetPreference(aName) then
|
|
begin
|
|
TempValue := TCefValueRef.New;
|
|
TempValue.SetDouble(aValue);
|
|
Result := FBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError);
|
|
|
|
{$IFDEF DEBUG}
|
|
if not(Result) then OutputDebugString(PWideChar('UpdatePreference error : ' + quotedstr(TempError) + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.UpdatePreference error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TChromium.UpdatePreference(const aName, aValue : string) : boolean;
|
|
var
|
|
TempError : ustring;
|
|
TempValue : ICefValue;
|
|
begin
|
|
Result := False;
|
|
|
|
try
|
|
if (FBrowser <> nil) and FBrowser.Host.RequestContext.CanSetPreference(aName) then
|
|
begin
|
|
TempValue := TCefValueRef.New;
|
|
TempValue.SetString(aValue);
|
|
Result := FBrowser.Host.RequestContext.SetPreference(aName, TempValue, TempError);
|
|
|
|
{$IFDEF DEBUG}
|
|
if not(Result) then OutputDebugString(PWideChar('UpdatePreference error : ' + quotedstr(TempError) + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.UpdatePreference error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.HandleNull(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
var
|
|
TempKey : string;
|
|
begin
|
|
if (aRoot <> '') then
|
|
TempKey := aRoot + '.' + aKey
|
|
else
|
|
TempKey := aKey;
|
|
|
|
if (length(TempKey) > 0) then
|
|
aResultSL.Add(TempKey + ' : -null-')
|
|
else
|
|
aResultSL.Add('-null-');
|
|
end;
|
|
|
|
procedure TChromium.HandleBool(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
var
|
|
TempKey : string;
|
|
begin
|
|
if (aRoot <> '') then
|
|
TempKey := aRoot + '.' + aKey
|
|
else
|
|
TempKey := aKey;
|
|
|
|
if (length(TempKey) > 0) then
|
|
aResultSL.Add(TempKey + ' : ' + BoolToStr(aValue.GetBool, true))
|
|
else
|
|
aResultSL.Add(BoolToStr(aValue.GetBool, true));
|
|
end;
|
|
|
|
procedure TChromium.HandleInteger(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
var
|
|
TempKey : string;
|
|
begin
|
|
if (aRoot <> '') then
|
|
TempKey := aRoot + '.' + aKey
|
|
else
|
|
TempKey := aKey;
|
|
|
|
if (length(TempKey) > 0) then
|
|
aResultSL.Add(TempKey + ' : ' + IntToStr(aValue.GetInt))
|
|
else
|
|
aResultSL.Add(IntToStr(aValue.GetInt));
|
|
end;
|
|
|
|
procedure TChromium.HandleDouble(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
var
|
|
TempKey : string;
|
|
begin
|
|
if (aRoot <> '') then
|
|
TempKey := aRoot + '.' + aKey
|
|
else
|
|
TempKey := aKey;
|
|
|
|
if (length(TempKey) > 0) then
|
|
aResultSL.Add(TempKey + ' : ' + FloatToStr(aValue.GetDouble))
|
|
else
|
|
aResultSL.Add(FloatToStr(aValue.GetDouble));
|
|
end;
|
|
|
|
procedure TChromium.HandleString(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
var
|
|
TempKey : string;
|
|
begin
|
|
if (aRoot <> '') then
|
|
TempKey := aRoot + '.' + aKey
|
|
else
|
|
TempKey := aKey;
|
|
|
|
if (length(TempKey) > 0) then
|
|
aResultSL.Add(TempKey + ' : ' + aValue.GetString)
|
|
else
|
|
aResultSL.Add(aValue.GetString);
|
|
end;
|
|
|
|
procedure TChromium.HandleBinary(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
var
|
|
TempKey : string;
|
|
begin
|
|
if (aRoot <> '') then
|
|
TempKey := aRoot + '.' + aKey
|
|
else
|
|
TempKey := aKey;
|
|
|
|
if (length(TempKey) > 0) then
|
|
aResultSL.Add(TempKey + ' : -binary-')
|
|
else
|
|
aResultSL.Add('-binary-');
|
|
end;
|
|
|
|
procedure TChromium.HandleList(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
var
|
|
TempKey, TempResult : string;
|
|
i, j : integer;
|
|
TempList : ICefListValue;
|
|
TempValue : ICefValue;
|
|
TempSL : TStringList;
|
|
begin
|
|
if (aRoot <> '') then
|
|
TempKey := aRoot + '.' + aKey
|
|
else
|
|
TempKey := aKey;
|
|
|
|
TempList := aValue.GetList;
|
|
TempSL := TStringList.Create;
|
|
|
|
i := 0;
|
|
j := TempList.GetSize;
|
|
|
|
TempResult := '(' + inttostr(j) + '){';
|
|
|
|
while (i < j) do
|
|
begin
|
|
TempValue := TempList.GetValue(i);
|
|
|
|
case TempValue.GetType of
|
|
VTYPE_NULL : TempResult := TempResult + '-null-,';
|
|
VTYPE_BOOL : TempResult := TempResult + BoolToStr(aValue.GetBool, true) + ',';
|
|
VTYPE_INT : TempResult := TempResult + IntToStr(aValue.GetInt) + ',';
|
|
VTYPE_DOUBLE : TempResult := TempResult + FloatToStr(aValue.GetDouble) + ',';
|
|
VTYPE_STRING : TempResult := TempResult + aValue.GetString + ',';
|
|
VTYPE_BINARY : TempResult := TempResult + '-binary-,';
|
|
VTYPE_DICTIONARY :
|
|
begin
|
|
TempSL.Clear;
|
|
HandleDictionary(TempValue.GetDictionary, TempSL, '');
|
|
TempResult := TempResult + TempSL.CommaText + ',';
|
|
end;
|
|
|
|
VTYPE_LIST :
|
|
begin
|
|
TempSL.Clear;
|
|
HandleList(TempValue, TempSL, '', '');
|
|
TempResult := TempResult + TempSL.CommaText + ',';
|
|
end;
|
|
|
|
else TempResult := TempResult + '-invalid-,';
|
|
end;
|
|
|
|
inc(i);
|
|
end;
|
|
|
|
i := length(TempResult);
|
|
if (i > 0) and (TempResult[i] = ',') then TempResult := copy(TempResult, 1, pred(i));
|
|
TempResult := TempResult + '}';
|
|
|
|
if (length(TempKey) > 0) then
|
|
aResultSL.Add(TempKey + ' : ' + TempResult)
|
|
else
|
|
aResultSL.Add(TempResult);
|
|
|
|
TempSL.Free;
|
|
end;
|
|
|
|
procedure TChromium.HandleInvalid(const aValue : ICefValue; var aResultSL : TStringList; const aRoot, aKey : string);
|
|
var
|
|
TempKey : string;
|
|
begin
|
|
if (aRoot <> '') then
|
|
TempKey := aRoot + '.' + aKey
|
|
else
|
|
TempKey := aKey;
|
|
|
|
if (length(TempKey) > 0) then
|
|
aResultSL.Add(TempKey + ' : -invalid-')
|
|
else
|
|
aResultSL.Add('-invalid-');
|
|
end;
|
|
|
|
procedure TChromium.HandleDictionary(const aDict : ICefDictionaryValue; var aResultSL : TStringList; const aRoot : string);
|
|
var
|
|
TempKeys : TStringList;
|
|
i, j : integer;
|
|
TempValue : ICefValue;
|
|
TempNewKey : string;
|
|
begin
|
|
TempKeys := nil;
|
|
|
|
try
|
|
try
|
|
if (aDict <> nil) then
|
|
begin
|
|
TempKeys := TStringList.Create;
|
|
aDict.GetKeys(TempKeys);
|
|
|
|
i := 0;
|
|
j := TempKeys.Count;
|
|
|
|
while (i < j) do
|
|
begin
|
|
TempValue := aDict.GetValue(TempKeys[i]);
|
|
|
|
case TempValue.GetType of
|
|
VTYPE_NULL : HandleNull(TempValue, aResultSL, aRoot, TempKeys[i]);
|
|
VTYPE_BOOL : HandleBool(TempValue, aResultSL, aRoot, TempKeys[i]);
|
|
VTYPE_INT : HandleInteger(TempValue, aResultSL, aRoot, TempKeys[i]);
|
|
VTYPE_DOUBLE : HandleDouble(TempValue, aResultSL, aRoot, TempKeys[i]);
|
|
VTYPE_STRING : HandleString(TempValue, aResultSL, aRoot, TempKeys[i]);
|
|
VTYPE_BINARY : HandleBinary(TempValue, aResultSL, aRoot, TempKeys[i]);
|
|
VTYPE_LIST : HandleList(TempValue, aResultSL, aRoot, TempKeys[i]);
|
|
VTYPE_DICTIONARY :
|
|
begin
|
|
if (length(aRoot) > 0) then
|
|
TempNewKey := aRoot + '.' + TempKeys[i]
|
|
else
|
|
TempNewKey := TempKeys[i];
|
|
|
|
HandleDictionary(TempValue.GetDictionary, aResultSL, TempNewKey);
|
|
end;
|
|
|
|
else
|
|
HandleInvalid(TempValue, aResultSL, aRoot, TempKeys[i]);
|
|
end;
|
|
|
|
inc(i);
|
|
end;
|
|
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.HandleDictionary error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
finally
|
|
if (TempKeys <> nil) then TempKeys.Free;
|
|
end;
|
|
end;
|
|
|
|
function TChromium.GetAllPreferences : boolean;
|
|
var
|
|
TempDict : ICefDictionaryValue;
|
|
begin
|
|
Result := False;
|
|
|
|
try
|
|
if (FBrowser <> nil) and (FPrefs <> nil) then
|
|
begin
|
|
FPrefs.Clear;
|
|
TempDict := FBrowser.Host.RequestContext.GetAllPreferences(True);
|
|
HandleDictionary(TempDict, FPrefs, '');
|
|
Result := SendCompMessage(CEF_PREFERENCES_AVAILABLE);
|
|
end;
|
|
except
|
|
on e : exception do
|
|
begin
|
|
{$IFDEF DEBUG}
|
|
OutputDebugString(PWideChar('TChromium.GetAllPreferences error: ' + e.Message + chr(0)));
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.PrefsAvailableMsg(var aMessage : TMessage);
|
|
begin
|
|
if (FPrefs <> nil) and assigned(FOnPrefsAvailable) then FOnPrefsAvailable(self, FPrefs.Text);
|
|
end;
|
|
|
|
function TChromium.SendCompMessage(aMsg : cardinal; wParam : cardinal; lParam : integer) : boolean;
|
|
begin
|
|
Result := (FCompHandle <> 0) and PostMessage(FCompHandle, aMsg, wParam, lParam);
|
|
end;
|
|
|
|
procedure TChromium.TextResultAvailable(const aText : string);
|
|
begin
|
|
if assigned(FOnTextResultAvailable) then FOnTextResultAvailable(self, aText);
|
|
end;
|
|
|
|
procedure TChromium.CookiesDeleted(numDeleted : integer);
|
|
begin
|
|
if assigned(FOnCookiesDeleted) then FOnCookiesDeleted(self, numDeleted);
|
|
end;
|
|
|
|
procedure TChromium.DOMVisitorVisit(const document: ICefDomDocument);
|
|
begin
|
|
if assigned(FOnDocumentAvailable) then FOnDocumentAvailable(self, document);
|
|
end;
|
|
|
|
procedure TChromium.PdfPrintFinished(aResultOK : boolean);
|
|
begin
|
|
if assigned(FOnPdfPrintFinished) then FOnPdfPrintFinished(self, aResultOK);
|
|
end;
|
|
|
|
procedure TChromium.ShowDevTools(inspectElementAt: TPoint; const aDevTools : TWinControl);
|
|
var
|
|
TempInfo : TCefWindowInfo;
|
|
TempSettings : TCefBrowserSettings;
|
|
TempPoint : TCefPoint;
|
|
TempPPoint : PCefPoint;
|
|
begin
|
|
if not(Initialized) or HasDevTools then Exit;
|
|
|
|
InitializeSettings(TempSettings);
|
|
|
|
if (aDevTools <> nil) then
|
|
WindowInfoAsChild(TempInfo, aDevTools.Handle, aDevTools.ClientRect, aDevTools.Name)
|
|
else
|
|
WindowInfoAsPopUp(TempInfo, WindowHandle, DEVTOOLS_WINDOWNAME);
|
|
|
|
|
|
if (inspectElementAt.x <> low(integer)) and
|
|
(inspectElementAt.y <> low(integer)) then
|
|
begin
|
|
TempPoint.x := inspectElementAt.x;
|
|
TempPoint.y := inspectElementAt.y;
|
|
TempPPoint := @TempPoint;
|
|
end
|
|
else
|
|
TempPPoint := nil;
|
|
|
|
FBrowser.Host.ShowDevTools(@TempInfo, TCefClientOwn.Create as ICefClient, @TempSettings, TempPPoint);
|
|
end;
|
|
|
|
procedure TChromium.CloseDevTools(const aDevTools : TWinControl);
|
|
begin
|
|
if Initialized then
|
|
begin
|
|
if (aDevTools <> nil) then WinApi.Windows.SetParent(GetWindow(aDevTools.Handle, GW_CHILD), 0);
|
|
if (FBrowser <> nil) then FBrowser.Host.CloseDevTools;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.WndProc(var aMessage: TMessage);
|
|
begin
|
|
case aMessage.Msg of
|
|
CEF_PREFERENCES_AVAILABLE : PrefsAvailableMsg(aMessage);
|
|
|
|
else aMessage.Result := DefWindowProc(FCompHandle, aMessage.Msg, aMessage.WParam, aMessage.LParam);
|
|
end;
|
|
end;
|
|
|
|
function TChromium.doOnClose(const browser: ICefBrowser): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnClose) then FOnClose(Self, browser, Result);
|
|
|
|
FClosing := True;
|
|
end;
|
|
|
|
procedure TChromium.doOnAddressChange(const browser: ICefBrowser; const frame: ICefFrame; const url: ustring);
|
|
begin
|
|
if Assigned(FOnAddressChange) then FOnAddressChange(Self, browser, frame, url);
|
|
end;
|
|
|
|
procedure TChromium.doOnAfterCreated(const browser: ICefBrowser);
|
|
begin
|
|
if MultithreadApp and (FBrowser = nil) then
|
|
begin
|
|
FBrowser := browser;
|
|
if (FBrowser <> nil) then FBrowserId := FBrowser.Identifier;
|
|
end;
|
|
|
|
UpdateAllPreferences;
|
|
|
|
FInitialized := (FBrowser <> nil) and (FBrowserId <> 0);
|
|
|
|
if Assigned(FOnAfterCreated) then FOnAfterCreated(Self, browser);
|
|
end;
|
|
|
|
function TChromium.doOnBeforeBrowse(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const request : ICefRequest;
|
|
isRedirect : Boolean): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if FUpdatePreferences then
|
|
begin
|
|
FUpdatePreferences := False;
|
|
UpdateAllPreferences;
|
|
end;
|
|
|
|
if FGetPreferences then
|
|
begin
|
|
FGetPreferences := False;
|
|
GetAllPreferences;
|
|
end;
|
|
|
|
if Assigned(FOnBeforeBrowse) then FOnBeforeBrowse(Self, browser, frame, request, isRedirect, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnBeforeClose(const browser: ICefBrowser);
|
|
begin
|
|
FInitialized := False;
|
|
FBrowser := nil;
|
|
FBrowserId := 0;
|
|
|
|
if Assigned(FOnBeforeClose) then FOnBeforeClose(Self, browser);
|
|
end;
|
|
|
|
procedure TChromium.doOnBeforeContextMenu(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const params : ICefContextMenuParams;
|
|
const model : ICefMenuModel);
|
|
begin
|
|
if Assigned(FOnBeforeContextMenu) then FOnBeforeContextMenu(Self, browser, frame, params, model);
|
|
end;
|
|
|
|
procedure TChromium.doOnBeforeDownload(const browser : ICefBrowser;
|
|
const downloadItem : ICefDownloadItem;
|
|
const suggestedName : ustring;
|
|
const callback : ICefBeforeDownloadCallback);
|
|
begin
|
|
if Assigned(FOnBeforeDownload) then FOnBeforeDownload(Self, browser, downloadItem, suggestedName, callback);
|
|
end;
|
|
|
|
function TChromium.doOnBeforePopup(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const targetUrl : ustring;
|
|
const targetFrameName : ustring;
|
|
targetDisposition : TCefWindowOpenDisposition;
|
|
userGesture : Boolean;
|
|
var popupFeatures : TCefPopupFeatures;
|
|
var windowInfo : TCefWindowInfo;
|
|
var client : ICefClient;
|
|
var settings : TCefBrowserSettings;
|
|
var noJavascriptAccess : Boolean): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnBeforePopup) then
|
|
FOnBeforePopup(Self, browser, frame, targetUrl, targetFrameName,
|
|
targetDisposition, userGesture, popupFeatures, windowInfo, client,
|
|
settings, noJavascriptAccess, Result);
|
|
end;
|
|
|
|
function TChromium.doOnBeforeResourceLoad(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const request : ICefRequest;
|
|
const callback : ICefRequestCallback): TCefReturnValue;
|
|
var
|
|
TempHeaderMap : ICefStringMultimap;
|
|
begin
|
|
if FAddCustomHeader then
|
|
begin
|
|
TempHeaderMap := TCefStringMultimapOwn.Create;
|
|
request.GetHeaderMap(TempHeaderMap);
|
|
TempHeaderMap.Append(FCustomHeaderName, FCustomHeaderValue);
|
|
request.SetHeaderMap(TempHeaderMap);
|
|
TempHeaderMap := nil;
|
|
end;
|
|
|
|
if not(FSendReferrer) then request.SetReferrer('', REFERRER_POLICY_NEVER);
|
|
|
|
Result := RV_CONTINUE;
|
|
|
|
if Assigned(FOnBeforeResourceLoad) then FOnBeforeResourceLoad(Self, browser, frame, request, callback, Result);
|
|
end;
|
|
|
|
function TChromium.doOnBeforeUnloadDialog(const browser : ICefBrowser;
|
|
const messageText : ustring;
|
|
isReload : Boolean;
|
|
const callback : ICefJsDialogCallback): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnBeforeUnloadDialog) then FOnBeforeUnloadDialog(Self, browser, messageText, isReload, callback, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnCancelGeolocationPermission(const browser : ICefBrowser; requestId : Integer);
|
|
begin
|
|
if Assigned(FOnCancelGeolocationPermission) then
|
|
FOnCancelGeolocationPermission(Self, browser, requestId);
|
|
end;
|
|
|
|
function TChromium.doOnCertificateError(const browser : ICefBrowser;
|
|
certError : TCefErrorcode;
|
|
const requestUrl : ustring;
|
|
const sslInfo : ICefSslInfo;
|
|
const callback : ICefRequestCallback): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnCertificateError) then
|
|
FOnCertificateError(Self, browser, certError, requestUrl, sslInfo, callback, Result);
|
|
end;
|
|
|
|
function TChromium.doOnConsoleMessage(const browser : ICefBrowser;
|
|
const aMessage : ustring;
|
|
const source : ustring;
|
|
line : Integer): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnConsoleMessage) then FOnConsoleMessage(Self, browser, aMessage, source, line, Result);
|
|
end;
|
|
|
|
function TChromium.doOnContextMenuCommand(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const params : ICefContextMenuParams;
|
|
commandId : Integer;
|
|
eventFlags : TCefEventFlags): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnContextMenuCommand) then
|
|
FOnContextMenuCommand(Self, browser, frame, params, commandId, eventFlags, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnContextMenuDismissed(const browser: ICefBrowser; const frame: ICefFrame);
|
|
begin
|
|
if Assigned(FOnContextMenuDismissed) then FOnContextMenuDismissed(Self, browser, frame);
|
|
end;
|
|
|
|
procedure TChromium.doOnCursorChange(const browser : ICefBrowser;
|
|
cursor : TCefCursorHandle;
|
|
cursorType : TCefCursorType;
|
|
const customCursorInfo : PCefCursorInfo);
|
|
begin
|
|
if assigned(FOnCursorChange) then FOnCursorChange(self, browser, cursor, cursorType, customCursorInfo);
|
|
end;
|
|
|
|
procedure TChromium.doOnDialogClosed(const browser: ICefBrowser);
|
|
begin
|
|
if Assigned(FOnDialogClosed) then FOnDialogClosed(Self, browser);
|
|
end;
|
|
|
|
procedure TChromium.doOnDownloadUpdated(const browser : ICefBrowser;
|
|
const downloadItem : ICefDownloadItem;
|
|
const callback : ICefDownloadItemCallback);
|
|
begin
|
|
if Assigned(FOnDownloadUpdated) then FOnDownloadUpdated(Self, browser, downloadItem, callback);
|
|
end;
|
|
|
|
function TChromium.doOnDragEnter(const browser : ICefBrowser;
|
|
const dragData : ICefDragData;
|
|
mask : TCefDragOperations): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnDragEnter) then FOnDragEnter(Self, browser, dragData, mask, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnDraggableRegionsChanged(const browser : ICefBrowser;
|
|
regionsCount : NativeUInt;
|
|
regions : PCefDraggableRegionArray);
|
|
begin
|
|
if Assigned(FOnDraggableRegionsChanged) then FOnDraggableRegionsChanged(Self, browser, regionsCount, regions);
|
|
end;
|
|
|
|
procedure TChromium.doOnFaviconUrlChange(const browser: ICefBrowser; iconUrls: TStrings);
|
|
begin
|
|
if Assigned(FOnFavIconUrlChange) then FOnFavIconUrlChange(Self, browser, iconUrls);
|
|
end;
|
|
|
|
function TChromium.doOnFileDialog(const browser : ICefBrowser;
|
|
mode : TCefFileDialogMode;
|
|
const title : ustring;
|
|
const defaultFilePath : ustring;
|
|
acceptFilters : TStrings;
|
|
selectedAcceptFilter : Integer;
|
|
const callback : ICefFileDialogCallback): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnFileDialog) then
|
|
FOnFileDialog(Self, browser, mode, title, defaultFilePath, acceptFilters,
|
|
selectedAcceptFilter, callback, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnFindResult(const browser : ICefBrowser;
|
|
identifier : integer;
|
|
count : Integer;
|
|
const selectionRect : PCefRect;
|
|
activeMatchOrdinal : Integer;
|
|
finalUpdate : Boolean);
|
|
begin
|
|
if Assigned(FOnFindResult) then
|
|
FOnFindResult(Self, browser, identifier, count, selectionRect, activeMatchOrdinal, finalUpdate);
|
|
end;
|
|
|
|
procedure TChromium.doOnFullScreenModeChange(const browser: ICefBrowser; fullscreen: Boolean);
|
|
begin
|
|
if Assigned(FOnFullScreenModeChange) then FOnFullScreenModeChange(Self, browser, fullscreen);
|
|
end;
|
|
|
|
function TChromium.doOnGetAuthCredentials(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
isProxy : Boolean;
|
|
const host : ustring;
|
|
port : Integer;
|
|
const realm : ustring;
|
|
const scheme : ustring;
|
|
const callback : ICefAuthCallback): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if isProxy then
|
|
begin
|
|
if (FProxyType = CEF_PROXYTYPE_FIXED_SERVERS) and (callback <> nil) then
|
|
begin
|
|
Result := True;
|
|
callback.cont(FProxyUsername, FProxyPassword);
|
|
end;
|
|
end
|
|
else
|
|
if (frame <> nil) and frame.IsMain and Assigned(FOnGetAuthCredentials) then
|
|
FOnGetAuthCredentials(Self, browser, frame, isProxy, host, port, realm, scheme, callback, Result);
|
|
end;
|
|
|
|
function TChromium.doOnGetResourceHandler(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const request : ICefRequest): ICefResourceHandler;
|
|
begin
|
|
Result := nil;
|
|
|
|
if Assigned(FOnGetResourceHandler) then
|
|
FOnGetResourceHandler(Self, browser, frame, request, Result);
|
|
end;
|
|
|
|
function TChromium.doOnGetRootScreenRect(const browser: ICefBrowser; rect: PCefRect): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnGetRootScreenRect) then FOnGetRootScreenRect(Self, browser, rect, Result);
|
|
end;
|
|
|
|
function TChromium.doOnGetScreenInfo(const browser: ICefBrowser; screenInfo: PCefScreenInfo): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnGetScreenInfo) then FOnGetScreenInfo(Self, browser, screenInfo, Result);
|
|
end;
|
|
|
|
function TChromium.doOnGetScreenPoint(const browser: ICefBrowser; viewX, viewY: Integer; screenX, screenY: PInteger): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnGetScreenPoint) then FOnGetScreenPoint(Self, browser, viewX, viewY, screenX, screenY, Result);
|
|
end;
|
|
|
|
function TChromium.doOnGetViewRect(const browser: ICefBrowser; rect: PCefRect): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnGetViewRect) then FOnGetViewRect(Self, browser, rect, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnGotFocus(const browser: ICefBrowser);
|
|
begin
|
|
if Assigned(FOnGotFocus) then FOnGotFocus(Self, browser)
|
|
end;
|
|
|
|
function TChromium.doOnJsdialog(const browser : ICefBrowser;
|
|
const originUrl : ustring;
|
|
dialogType : TCefJsDialogType;
|
|
const messageText : ustring;
|
|
const defaultPromptText : ustring;
|
|
const callback : ICefJsDialogCallback;
|
|
out suppressMessage : Boolean): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if not(Initialized) then
|
|
suppressMessage := True
|
|
else
|
|
if Assigned(FOnJsdialog) then
|
|
FOnJsdialog(Self, browser, originUrl, dialogType, messageText,
|
|
defaultPromptText, callback, suppressMessage, Result);
|
|
end;
|
|
|
|
function TChromium.doOnKeyEvent(const browser : ICefBrowser;
|
|
const event : PCefKeyEvent;
|
|
osEvent : TCefEventHandle): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnKeyEvent) then FOnKeyEvent(Self, browser, event, osEvent, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnLoadEnd(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
httpStatusCode : Integer);
|
|
begin
|
|
if Assigned(FOnLoadEnd) then FOnLoadEnd(Self, browser, frame, httpStatusCode);
|
|
end;
|
|
|
|
procedure TChromium.doOnLoadError(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
errorCode : Integer;
|
|
const errorText : ustring;
|
|
const failedUrl : ustring);
|
|
begin
|
|
if Assigned(FOnLoadError) then FOnLoadError(Self, browser, frame, errorCode, errorText, failedUrl);
|
|
end;
|
|
|
|
procedure TChromium.doOnLoadingStateChange(const browser: ICefBrowser; isLoading, canGoBack, canGoForward: Boolean);
|
|
begin
|
|
if Assigned(FOnLoadingStateChange) then FOnLoadingStateChange(Self, browser, isLoading, canGoBack, canGoForward);
|
|
end;
|
|
|
|
procedure TChromium.doOnLoadStart(const browser: ICefBrowser; const frame: ICefFrame; transitionType: TCefTransitionType);
|
|
begin
|
|
if Assigned(FOnLoadStart) then FOnLoadStart(Self, browser, frame, transitionType);
|
|
end;
|
|
|
|
function TChromium.doOnOpenUrlFromTab(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const targetUrl : ustring;
|
|
targetDisposition : TCefWindowOpenDisposition;
|
|
userGesture : Boolean): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnOpenUrlFromTab) then
|
|
FOnOpenUrlFromTab(Self, browser, frame, targetUrl, targetDisposition, userGesture, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnPaint(const browser : ICefBrowser;
|
|
kind : TCefPaintElementType;
|
|
dirtyRectsCount : NativeUInt;
|
|
const dirtyRects : PCefRectArray;
|
|
const buffer : Pointer;
|
|
width : Integer;
|
|
height : Integer);
|
|
begin
|
|
if Assigned(FOnPaint) then FOnPaint(Self, browser, kind, dirtyRectsCount, dirtyRects, buffer, width, height);
|
|
end;
|
|
|
|
function TChromium.doOnSelectClientCertificate(const browser : ICefBrowser;
|
|
isProxy : boolean;
|
|
const host : ustring;
|
|
port : integer;
|
|
certificatesCount : NativeUInt;
|
|
const certificates : TCefX509CertificateArray;
|
|
const callback : ICefSelectClientCertificateCallback): boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if assigned(FOnSelectClientCertificate) then
|
|
FOnSelectClientCertificate(self, browser, isProxy, host, port, certificatesCount, certificates, callback, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnPluginCrashed(const browser: ICefBrowser; const pluginPath: ustring);
|
|
begin
|
|
if Assigned(FOnPluginCrashed) then FOnPluginCrashed(Self, browser, pluginPath);
|
|
end;
|
|
|
|
procedure TChromium.doOnPopupShow(const browser: ICefBrowser; show: Boolean);
|
|
begin
|
|
if assigned(FOnPopupShow) then FOnPopupShow(self, browser, show);
|
|
end;
|
|
|
|
procedure TChromium.doOnPopupSize(const browser: ICefBrowser; const rect: PCefRect);
|
|
begin
|
|
if assigned(FOnPopupSize) then FOnPopupSize(self, browser, rect);
|
|
end;
|
|
|
|
function TChromium.doOnPreKeyEvent(const browser : ICefBrowser;
|
|
const event : PCefKeyEvent;
|
|
osEvent : TCefEventHandle;
|
|
out isKeyboardShortcut : Boolean): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnPreKeyEvent) then FOnPreKeyEvent(Self, browser, event, osEvent, isKeyboardShortcut, Result);
|
|
end;
|
|
|
|
function TChromium.doOnProcessMessageReceived(const browser : ICefBrowser;
|
|
sourceProcess : TCefProcessId;
|
|
const aMessage : ICefProcessMessage): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnProcessMessageReceived) then
|
|
FOnProcessMessageReceived(Self, browser, sourceProcess, aMessage, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnProtocolExecution(const browser : ICefBrowser;
|
|
const url : ustring;
|
|
out allowOsExecution : Boolean);
|
|
begin
|
|
if Assigned(FOnProtocolExecution) then FOnProtocolExecution(Self, browser, url, allowOsExecution);
|
|
end;
|
|
|
|
function TChromium.doOnQuotaRequest(const browser : ICefBrowser;
|
|
const originUrl : ustring;
|
|
newSize : Int64;
|
|
const callback : ICefRequestCallback): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnQuotaRequest) then FOnQuotaRequest(Self, browser, originUrl, newSize, callback, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnRenderProcessTerminated(const browser: ICefBrowser; status: TCefTerminationStatus);
|
|
begin
|
|
if Assigned(FOnRenderProcessTerminated) then FOnRenderProcessTerminated(Self, browser, status);
|
|
end;
|
|
|
|
procedure TChromium.doOnRenderViewReady(const browser: ICefBrowser);
|
|
begin
|
|
if Assigned(FOnRenderViewReady) then FOnRenderViewReady(Self, browser);
|
|
end;
|
|
|
|
function TChromium.doOnRequestGeolocationPermission(const browser : ICefBrowser;
|
|
const requestingUrl : ustring;
|
|
requestId : Integer;
|
|
const callback : ICefGeolocationCallback): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnRequestGeolocationPermission) then
|
|
FOnRequestGeolocationPermission(Self, browser, requestingUrl, requestId, callback, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnResetDialogState(const browser: ICefBrowser);
|
|
begin
|
|
if Assigned(FOnResetDialogState) then FOnResetDialogState(Self, browser);
|
|
end;
|
|
|
|
procedure TChromium.doOnResourceRedirect(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const request : ICefRequest;
|
|
const response : ICefResponse;
|
|
var newUrl : ustring);
|
|
begin
|
|
if Assigned(FOnResourceRedirect) then FOnResourceRedirect(Self, browser, frame, request, response, newUrl);
|
|
end;
|
|
|
|
function TChromium.doOnResourceResponse(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const request : ICefRequest;
|
|
const response : ICefResponse): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnResourceResponse) then FOnResourceResponse(Self, browser, frame, request, response, Result);
|
|
end;
|
|
function TChromium.doOnGetResourceResponseFilter(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const request : ICefRequest;
|
|
const response : ICefResponse) : ICefResponseFilter;
|
|
begin
|
|
Result := nil;
|
|
|
|
if Assigned(FOnGetResourceResponseFilter) then
|
|
FOnGetResourceResponseFilter(self, browser, frame, request, response, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnResourceLoadComplete(const browser : ICefBrowser;
|
|
const frame : ICefFrame;
|
|
const request : ICefRequest;
|
|
const response : ICefResponse;
|
|
status : TCefUrlRequestStatus;
|
|
receivedContentLength : Int64);
|
|
begin
|
|
if Assigned(FOnResourceLoadComplete) then
|
|
FOnResourceLoadComplete(self, browser, frame, request, response, status, receivedContentLength);
|
|
end;
|
|
|
|
procedure TChromium.doOnScrollOffsetChanged(const browser: ICefBrowser; x, y: Double);
|
|
begin
|
|
if Assigned(FOnScrollOffsetChanged) then FOnScrollOffsetChanged(Self, browser, x, y);
|
|
end;
|
|
|
|
procedure TChromium.doOnIMECompositionRangeChanged(const browser : ICefBrowser;
|
|
const selected_range : PCefRange;
|
|
character_boundsCount : NativeUInt;
|
|
const character_bounds : PCefRect);
|
|
begin
|
|
if assigned(FOnIMECompositionRangeChanged) then
|
|
FOnIMECompositionRangeChanged(self, browser, selected_range, character_boundsCount, character_bounds);
|
|
end;
|
|
|
|
function TChromium.doOnSetFocus(const browser: ICefBrowser; source: TCefFocusSource): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnSetFocus) then FOnSetFocus(Self, browser, source, Result);
|
|
end;
|
|
|
|
function TChromium.doOnStartDragging(const browser : ICefBrowser;
|
|
const dragData : ICefDragData;
|
|
allowedOps : TCefDragOperations;
|
|
x : integer;
|
|
y : Integer): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnStartDragging) then FOnStartDragging(Self, browser, dragData, allowedOps, x, y, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnStatusMessage(const browser: ICefBrowser; const value: ustring);
|
|
begin
|
|
if Assigned(FOnStatusMessage) then FOnStatusMessage(Self, browser, value);
|
|
end;
|
|
|
|
procedure TChromium.doOnTakeFocus(const browser: ICefBrowser; next: Boolean);
|
|
begin
|
|
if Assigned(FOnTakeFocus) then FOnTakeFocus(Self, browser, next);
|
|
end;
|
|
|
|
procedure TChromium.doOnTitleChange(const browser: ICefBrowser; const title: ustring);
|
|
begin
|
|
if Assigned(FOnTitleChange) then FOnTitleChange(Self, browser, title);
|
|
end;
|
|
|
|
function TChromium.doOnTooltip(const browser: ICefBrowser; var text: ustring): Boolean;
|
|
begin
|
|
Result := False;
|
|
|
|
if Assigned(FOnTooltip) then FOnTooltip(Self, browser, text, Result);
|
|
end;
|
|
|
|
procedure TChromium.doOnUpdateDragCursor(const browser: ICefBrowser; operation: TCefDragOperation);
|
|
begin
|
|
if Assigned(FOnUpdateDragCursor) then FOnUpdateDragCursor(Self, browser, operation);
|
|
end;
|
|
|
|
function TChromium.GetParentForm : TCustomForm;
|
|
var
|
|
TempComp : TComponent;
|
|
begin
|
|
Result := nil;
|
|
TempComp := Owner;
|
|
|
|
while (TempComp <> nil) do
|
|
if (TempComp is TCustomForm) then
|
|
begin
|
|
Result := TCustomForm(TempComp);
|
|
exit;
|
|
end
|
|
else
|
|
TempComp := TempComp.owner;
|
|
end;
|
|
|
|
procedure TChromium.MoveFormTo(const x, y: Integer);
|
|
var
|
|
TempForm : TCustomForm;
|
|
TempRect : TRect;
|
|
begin
|
|
TempForm := GetParentForm;
|
|
|
|
if (TempForm <> nil) then
|
|
begin
|
|
TempRect.Left := min(max(x, max(screen.DesktopLeft, 0)), screen.DesktopWidth - TempForm.Width);
|
|
TempRect.Top := min(max(y, max(screen.DesktopTop, 0)), screen.DesktopHeight - TempForm.Height);
|
|
TempRect.Width := TempForm.Width;
|
|
TempRect.Height := TempForm.Height;
|
|
|
|
TempForm.SetBounds(TempRect.Left, TempRect.Top, TempRect.Width, TempRect.Height);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.MoveFormBy(const x, y: Integer);
|
|
var
|
|
TempForm : TCustomForm;
|
|
TempRect : TRect;
|
|
begin
|
|
TempForm := GetParentForm;
|
|
|
|
if (TempForm <> nil) then
|
|
begin
|
|
TempRect.Left := min(max(TempForm.Left + x, max(screen.DesktopLeft, 0)), screen.DesktopWidth - TempForm.Width);
|
|
TempRect.Top := min(max(TempForm.Top + y, max(screen.DesktopTop, 0)), screen.DesktopHeight - TempForm.Height);
|
|
TempRect.Width := TempForm.Width;
|
|
TempRect.Height := TempForm.Height;
|
|
|
|
TempForm.SetBounds(TempRect.Left, TempRect.Top, TempRect.Width, TempRect.Height);
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.ResizeFormWidthTo(const x : Integer);
|
|
var
|
|
TempForm : TCustomForm;
|
|
TempX, TempDeltaX : integer;
|
|
begin
|
|
TempForm := GetParentForm;
|
|
|
|
if (TempForm <> nil) then
|
|
begin
|
|
TempX := max(x, 100);
|
|
TempDeltaX := TempForm.Width - TempForm.ClientWidth;
|
|
TempForm.Width := TempX + TempDeltaX;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.ResizeFormHeightTo(const y : Integer);
|
|
var
|
|
TempForm : TCustomForm;
|
|
TempY, TempDeltaY : integer;
|
|
begin
|
|
TempForm := GetParentForm;
|
|
|
|
if (TempForm <> nil) then
|
|
begin
|
|
TempY := max(y, 100);
|
|
TempDeltaY := TempForm.Height - TempForm.ClientHeight;
|
|
TempForm.Height := TempY + TempDeltaY;
|
|
end;
|
|
end;
|
|
|
|
procedure TChromium.SetFormLeftTo(const x : Integer);
|
|
var
|
|
TempForm : TCustomForm;
|
|
begin
|
|
TempForm := GetParentForm;
|
|
|
|
if (TempForm <> nil) then
|
|
TempForm.Left := min(max(x, max(screen.DesktopLeft, 0)), screen.DesktopWidth - TempForm.Width);
|
|
end;
|
|
|
|
procedure TChromium.SetFormTopTo(const y : Integer);
|
|
var
|
|
TempForm : TCustomForm;
|
|
begin
|
|
TempForm := GetParentForm;
|
|
|
|
if (TempForm <> nil) then
|
|
TempForm.Top := min(max(y, max(screen.DesktopTop, 0)), screen.DesktopHeight - TempForm.Height);
|
|
end;
|
|
|
|
procedure TChromium.WasResized;
|
|
begin
|
|
if Initialized then FBrowser.Host.WasResized;
|
|
end;
|
|
|
|
procedure TChromium.WasHidden(hidden: Boolean);
|
|
begin
|
|
if Initialized then FBrowser.Host.WasHidden(hidden);
|
|
end;
|
|
|
|
procedure TChromium.NotifyScreenInfoChanged;
|
|
begin
|
|
if Initialized then FBrowser.Host.NotifyScreenInfoChanged;
|
|
end;
|
|
|
|
procedure TChromium.Invalidate(kind: TCefPaintElementType);
|
|
begin
|
|
if Initialized then FBrowser.Host.Invalidate(kind);
|
|
end;
|
|
|
|
procedure TChromium.SendKeyEvent(const event: PCefKeyEvent);
|
|
begin
|
|
if Initialized then FBrowser.Host.SendKeyEvent(event);
|
|
end;
|
|
|
|
procedure TChromium.SendMouseClickEvent(const event : PCefMouseEvent;
|
|
kind : TCefMouseButtonType;
|
|
mouseUp : Boolean;
|
|
clickCount : Integer);
|
|
begin
|
|
if Initialized then FBrowser.Host.SendMouseClickEvent(event, kind, mouseUp, clickCount);
|
|
end;
|
|
|
|
procedure TChromium.SendMouseMoveEvent(const event: PCefMouseEvent; mouseLeave: Boolean);
|
|
begin
|
|
if Initialized then FBrowser.Host.SendMouseMoveEvent(event, mouseLeave);
|
|
end;
|
|
|
|
procedure TChromium.SendMouseWheelEvent(const event: PCefMouseEvent; deltaX, deltaY: Integer);
|
|
begin
|
|
if Initialized then FBrowser.Host.SendMouseWheelEvent(event, deltaX, deltaY);
|
|
end;
|
|
|
|
procedure TChromium.SendFocusEvent(setFocus: Boolean);
|
|
begin
|
|
if Initialized then FBrowser.Host.SendFocusEvent(setFocus);
|
|
end;
|
|
|
|
procedure TChromium.SendCaptureLostEvent;
|
|
begin
|
|
if Initialized then FBrowser.Host.SendCaptureLostEvent;
|
|
end;
|
|
|
|
procedure TChromium.SetFocus(focus: Boolean);
|
|
begin
|
|
if Initialized then FBrowser.Host.SetFocus(focus);
|
|
end;
|
|
|
|
end.
|