diff --git a/README.md b/README.md index bff3c0f..5291886 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ WebView4Delphi is an open source project created by Salvador Díaz Fau to embed WebView4Delphi only supports Windows. If you need to embed a web browser in Linux, Windows or MacOS consider using [CEF4Delphi](https://github.com/salvadordf/CEF4Delphi) instead. -WebView4Delphi uses the [Microsoft Edge WebView2 Runtime](https://docs.microsoft.com/en-us/microsoft-edge/webview2/) and [Microsoft.Web.WebView2 NuGet package version 1.0.1774.30](https://www.nuget.org/packages/Microsoft.Web.WebView2) to embed a web browser. +WebView4Delphi uses the [Microsoft Edge WebView2 Runtime](https://docs.microsoft.com/en-us/microsoft-edge/webview2/) and [Microsoft.Web.WebView2 NuGet package version 1.0.1823.32](https://www.nuget.org/packages/Microsoft.Web.WebView2) to embed a web browser. WebView4Delphi was developed and tested on Delphi 11.3, Delphi XE2, Delphi 7 and Lazarus 2.2.6/FPC 3.2.2. diff --git a/bin32/WebView2Loader.dll b/bin32/WebView2Loader.dll index 08f2bf6..518bd47 100644 Binary files a/bin32/WebView2Loader.dll and b/bin32/WebView2Loader.dll differ diff --git a/bin64/WebView2Loader.dll b/bin64/WebView2Loader.dll index 866fc5c..f924d92 100644 Binary files a/bin64/WebView2Loader.dll and b/bin64/WebView2Loader.dll differ diff --git a/packages/webview4delphi.lpk b/packages/webview4delphi.lpk index 4973641..88396f2 100644 --- a/packages/webview4delphi.lpk +++ b/packages/webview4delphi.lpk @@ -12,7 +12,7 @@ - + diff --git a/source/uWVBrowser.pas b/source/uWVBrowser.pas index f1bc805..d946045 100644 --- a/source/uWVBrowser.pas +++ b/source/uWVBrowser.pas @@ -121,6 +121,7 @@ TWVBrowser = class(TWVBrowserBase) property OnGetCustomSchemes; property OnGetNonDefaultPermissionSettingsCompleted; property OnSetPermissionStateCompleted; + property OnLaunchingExternalUriScheme; end; {$IFDEF FPC} diff --git a/source/uWVBrowserBase.pas b/source/uWVBrowserBase.pas index 80ba5dd..e2b9b73 100644 --- a/source/uWVBrowserBase.pas +++ b/source/uWVBrowserBase.pas @@ -154,6 +154,7 @@ TWVBrowserBase = class(TComponent, IWVBrowserEvents) FOnGetCustomSchemes : TOnGetCustomSchemesEvent; FOnGetNonDefaultPermissionSettingsCompleted : TOnGetNonDefaultPermissionSettingsCompletedEvent; FOnSetPermissionStateCompleted : TOnSetPermissionStateCompletedEvent; + FOnLaunchingExternalUriScheme : TOnLaunchingExternalUriSchemeEvent; function GetBrowserProcessID : cardinal; function GetBrowserVersionInfo : wvstring; @@ -214,6 +215,9 @@ TWVBrowserBase = class(TComponent, IWVBrowserEvents) function GetPreferredColorScheme : TWVPreferredColorScheme; function GetPreferredTrackingPreventionLevel : TWVTrackingPreventionLevel; function GetProfileCookieManager : ICoreWebView2CookieManager; + function GetProfileIsPasswordAutosaveEnabled : boolean; + function GetProfileIsGeneralAutofillEnabled : boolean; + function GetMemoryUsageTargetLevel : TWVMemoryUsageTargetLevel; procedure SetBuiltInErrorPageEnabled(aValue: boolean); procedure SetDefaultContextMenusEnabled(aValue: boolean); @@ -253,6 +257,9 @@ TWVBrowserBase = class(TComponent, IWVBrowserEvents) procedure SetDefaultDownloadFolderPath(const aValue : wvstring); procedure SetPreferredColorScheme(const aValue : TWVPreferredColorScheme); procedure SetPreferredTrackingPreventionLevel(const aValue : TWVTrackingPreventionLevel); + procedure SetProfileIsPasswordAutosaveEnabled(aValue : boolean); + procedure SetProfileIsGeneralAutofillEnabled(aValue : boolean); + procedure SetMemoryUsageTargetLevel(aValue : TWVMemoryUsageTargetLevel); function CreateEnvironment : boolean; function CreateCompositionController: boolean; @@ -353,6 +360,7 @@ TWVBrowserBase = class(TComponent, IWVBrowserEvents) function PrintToPdfStreamCompletedHandler_Invoke(errorCode: HResult; const pdfStream: IStream): HRESULT; function GetNonDefaultPermissionSettingsCompletedHandler_Invoke(errorCode: HResult; const collectionView: ICoreWebView2PermissionSettingCollectionView): HRESULT; function SetPermissionStateCompletedHandler_Invoke(errorCode: HResult): HRESULT; + function LaunchingExternalUriSchemeEventHandler_Invoke(const sender: ICoreWebView2; const args: ICoreWebView2LaunchingExternalUriSchemeEventArgs): HRESULT; procedure doOnInitializationError(aErrorCode: HRESULT; const aErrorMessage: wvstring); virtual; procedure doOnEnvironmentCompleted; virtual; @@ -435,6 +443,7 @@ TWVBrowserBase = class(TComponent, IWVBrowserEvents) procedure doOnGetCustomSchemes(var aSchemeRegistrations : TWVCustomSchemeRegistrationArray); virtual; procedure doOnGetNonDefaultPermissionSettingsCompleted(errorCode: HResult; const collectionView: ICoreWebView2PermissionSettingCollectionView); virtual; procedure doOnSetPermissionStateCompleted(errorCode: HResult); virtual; + procedure doOnLaunchingExternalUriSchemeEvent(const sender: ICoreWebView2; const args: ICoreWebView2LaunchingExternalUriSchemeEventArgs); virtual; public constructor Create(AOwner: TComponent); override; @@ -618,6 +627,9 @@ TWVBrowserBase = class(TComponent, IWVBrowserEvents) // ICoreWebView2_15 property FaviconURI : wvstring read GetFaviconURI; + // ICoreWebView2_19 + property MemoryUsageTargetLevel : TWVMemoryUsageTargetLevel read GetMemoryUsageTargetLevel write SetMemoryUsageTargetLevel; // ICoreWebView2_19.Get_MemoryUsageTargetLevel + // ICoreWebView2Controller properties property Bounds : TRect read GetBounds write SetBounds; // ICoreWebView2Controller.get_Bounds property IsVisible : boolean read GetIsVisible write SetIsVisible; // ICoreWebView2Controller.get_IsVisible @@ -695,6 +707,10 @@ TWVBrowserBase = class(TComponent, IWVBrowserEvents) // ICoreWebView2Profile5 properties property ProfileCookieManager : ICoreWebView2CookieManager read GetProfileCookieManager; // ICoreWebView2Profile5.get_CookieManager + // ICoreWebView2Profile6 properties + property ProfileIsPasswordAutosaveEnabled : boolean read GetProfileIsPasswordAutosaveEnabled write SetProfileIsPasswordAutosaveEnabled; // ICoreWebView2Profile6.Get_IsPasswordAutosaveEnabled + property ProfileIsGeneralAutofillEnabled : boolean read GetProfileIsGeneralAutofillEnabled write SetProfileIsGeneralAutofillEnabled; // ICoreWebView2Profile6.Get_IsGeneralAutofillEnabled + // ICoreWebView2Environment5 events property OnBrowserProcessExited : TOnBrowserProcessExitedEvent read FOnBrowserProcessExited write FOnBrowserProcessExited; @@ -829,6 +845,7 @@ TWVBrowserBase = class(TComponent, IWVBrowserEvents) property OnGetCustomSchemes : TOnGetCustomSchemesEvent read FOnGetCustomSchemes write FOnGetCustomSchemes; property OnGetNonDefaultPermissionSettingsCompleted : TOnGetNonDefaultPermissionSettingsCompletedEvent read FOnGetNonDefaultPermissionSettingsCompleted write FOnGetNonDefaultPermissionSettingsCompleted; property OnSetPermissionStateCompleted : TOnSetPermissionStateCompletedEvent read FOnSetPermissionStateCompleted write FOnSetPermissionStateCompleted; + property OnLaunchingExternalUriScheme : TOnLaunchingExternalUriSchemeEvent read FOnLaunchingExternalUriScheme write FOnLaunchingExternalUriScheme; end; implementation @@ -964,6 +981,9 @@ constructor TWVBrowserBase.Create(AOwner: TComponent); FOnGetFaviconCompleted := nil; FOnPrintToPdfStreamCompleted := nil; FOnGetCustomSchemes := nil; + FOnGetNonDefaultPermissionSettingsCompleted := nil; + FOnSetPermissionStateCompleted := nil; + FOnLaunchingExternalUriScheme := nil; end; destructor TWVBrowserBase.Destroy; @@ -1996,6 +2016,12 @@ procedure TWVBrowserBase.doOnSetPermissionStateCompleted(errorCode: HResult); FOnSetPermissionStateCompleted(self, errorCode); end; +procedure TWVBrowserBase.doOnLaunchingExternalUriSchemeEvent(const sender: ICoreWebView2; const args: ICoreWebView2LaunchingExternalUriSchemeEventArgs); +begin + if assigned(FOnLaunchingExternalUriScheme) then + FOnLaunchingExternalUriScheme(self, sender, args); +end; + procedure TWVBrowserBase.doOnRetrieveMHTMLCompleted( aErrorCode : HRESULT; const aReturnObjectAsJson : wvstring); var @@ -2290,6 +2316,12 @@ function TWVBrowserBase.SetPermissionStateCompletedHandler_Invoke(errorCode: HRe doOnSetPermissionStateCompleted(errorCode); end; +function TWVBrowserBase.LaunchingExternalUriSchemeEventHandler_Invoke(const sender: ICoreWebView2; const args: ICoreWebView2LaunchingExternalUriSchemeEventArgs): HRESULT; +begin + Result := S_OK; + doOnLaunchingExternalUriSchemeEvent(sender, args); +end; + function TWVBrowserBase.ExecuteScriptCompletedHandler_Invoke(errorCode: HRESULT; resultObjectAsJson: PWideChar; aExecutionID : integer): HRESULT; begin Result := S_OK; @@ -2857,6 +2889,14 @@ function TWVBrowserBase.GetFaviconURI : wvstring; Result := ''; end; +function TWVBrowserBase.GetMemoryUsageTargetLevel : TWVMemoryUsageTargetLevel; +begin + if Initialized then + Result := FCoreWebView2.MemoryUsageTargetLevel + else + Result := COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL_NORMAL; +end; + function TWVBrowserBase.GetScreenScale : single; begin if (GlobalWebView2Loader <> nil) then @@ -4495,6 +4535,40 @@ function TWVBrowserBase.GetProfileCookieManager : ICoreWebView2CookieManager; end; end; +function TWVBrowserBase.GetProfileIsPasswordAutosaveEnabled : boolean; +var + TempProfile : TCoreWebView2Profile; +begin + Result := False; + TempProfile := nil; + + if Initialized then + try + TempProfile := TCoreWebView2Profile.Create(FCoreWebView2.Profile); + Result := TempProfile.IsPasswordAutosaveEnabled; + finally + if assigned(TempProfile) then + FreeAndNil(TempProfile); + end; +end; + +function TWVBrowserBase.GetProfileIsGeneralAutofillEnabled : boolean; +var + TempProfile : TCoreWebView2Profile; +begin + Result := False; + TempProfile := nil; + + if Initialized then + try + TempProfile := TCoreWebView2Profile.Create(FCoreWebView2.Profile); + Result := TempProfile.IsGeneralAutofillEnabled; + finally + if assigned(TempProfile) then + FreeAndNil(TempProfile); + end; +end; + procedure TWVBrowserBase.SetPreferredTrackingPreventionLevel(const aValue : TWVTrackingPreventionLevel); var TempProfile : TCoreWebView2Profile; @@ -4511,6 +4585,44 @@ procedure TWVBrowserBase.SetPreferredTrackingPreventionLevel(const aValue : TWVT end; end; +procedure TWVBrowserBase.SetProfileIsPasswordAutosaveEnabled(aValue : boolean); +var + TempProfile : TCoreWebView2Profile; +begin + TempProfile := nil; + + if Initialized then + try + TempProfile := TCoreWebView2Profile.Create(FCoreWebView2.Profile); + TempProfile.IsPasswordAutosaveEnabled := aValue; + finally + if assigned(TempProfile) then + FreeAndNil(TempProfile); + end; +end; + +procedure TWVBrowserBase.SetProfileIsGeneralAutofillEnabled(aValue : boolean); +var + TempProfile : TCoreWebView2Profile; +begin + TempProfile := nil; + + if Initialized then + try + TempProfile := TCoreWebView2Profile.Create(FCoreWebView2.Profile); + TempProfile.IsGeneralAutofillEnabled := aValue; + finally + if assigned(TempProfile) then + FreeAndNil(TempProfile); + end; +end; + +procedure TWVBrowserBase.SetMemoryUsageTargetLevel(aValue : TWVMemoryUsageTargetLevel); +begin + if Initialized then + FCoreWebView2.MemoryUsageTargetLevel := aValue; +end; + function TWVBrowserBase.CreateSharedBuffer(aSize : Largeuint; var aSharedBuffer : ICoreWebView2SharedBuffer) : boolean; begin Result := Initialized and diff --git a/source/uWVCoreWebView2.pas b/source/uWVCoreWebView2.pas index f163e13..dbc910e 100644 --- a/source/uWVCoreWebView2.pas +++ b/source/uWVCoreWebView2.pas @@ -34,6 +34,8 @@ TCoreWebView2 = class FBaseIntf15 : ICoreWebView2_15; FBaseIntf16 : ICoreWebView2_16; FBaseIntf17 : ICoreWebView2_17; + FBaseIntf18 : ICoreWebView2_18; + FBaseIntf19 : ICoreWebView2_19; FContainsFullScreenElementChangedToken : EventRegistrationToken; FContentLoadingToken : EventRegistrationToken; FDocumentTitleChangedToken : EventRegistrationToken; @@ -63,6 +65,7 @@ TCoreWebView2 = class FStatusBarTextChangedToken : EventRegistrationToken; FServerCertificateErrorDetectedToken : EventRegistrationToken; FFaviconChangedToken : EventRegistrationToken; + FLaunchingExternalUriSchemeToken : EventRegistrationToken; FDevToolsEventNames : TStringList; FDevToolsEventTokens : array of EventRegistrationToken; @@ -86,10 +89,12 @@ TCoreWebView2 = class function GetStatusBarText : wvstring; function GetProfile : ICoreWebView2Profile; function GetFaviconURI : wvstring; + function GetMemoryUsageTargetLevel : TWVMemoryUsageTargetLevel; procedure SetIsMuted(aValue : boolean); procedure SetDefaultDownloadDialogCornerAlignment(aValue : TWVDefaultDownloadDialogCornerAlignment); procedure SetDefaultDownloadDialogMargin(aValue : TPoint); + procedure SetMemoryUsageTargetLevel(aValue : TWVMemoryUsageTargetLevel); procedure InitializeFields; procedure InitializeTokens; @@ -125,6 +130,7 @@ TCoreWebView2 = class function AddStatusBarTextChangedEvent(const aBrowserComponent : TComponent) : boolean; function AddServerCertificateErrorDetectedEvent(const aBrowserComponent : TComponent) : boolean; function AddFaviconChanged(const aBrowserComponent : TComponent) : boolean; + function AddLaunchingExternalUriScheme(const aBrowserComponent : TComponent) : boolean; public constructor Create(const aBaseIntf : ICoreWebView2); reintroduce; @@ -187,6 +193,7 @@ TCoreWebView2 = class property StatusBarText : wvstring read GetStatusBarText; property Profile : ICoreWebView2Profile read GetProfile; property FaviconURI : wvstring read GetFaviconURI; + property MemoryUsageTargetLevel : TWVMemoryUsageTargetLevel read GetMemoryUsageTargetLevel write SetMemoryUsageTargetLevel; end; implementation @@ -217,8 +224,10 @@ constructor TCoreWebView2.Create(const aBaseIntf : ICoreWebView2); LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2_13, FBaseIntf13) and LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2_14, FBaseIntf14) and LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2_15, FBaseIntf15) and - LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2_16, FBaseIntf16) then - LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2_17, FBaseIntf17); + LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2_16, FBaseIntf16) and + LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2_17, FBaseIntf17) and + LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2_18, FBaseIntf18) then + LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2_19, FBaseIntf19); end; destructor TCoreWebView2.Destroy; @@ -267,6 +276,8 @@ procedure TCoreWebView2.InitializeFields; FBaseIntf15 := nil; FBaseIntf16 := nil; FBaseIntf17 := nil; + FBaseIntf18 := nil; + FBaseIntf19 := nil; FDevToolsEventTokens := nil; FDevToolsEventNames := nil; @@ -304,6 +315,7 @@ procedure TCoreWebView2.InitializeTokens; FStatusBarTextChangedToken.value := 0; FServerCertificateErrorDetectedToken.value := 0; FFaviconChangedToken.value := 0; + FLaunchingExternalUriSchemeToken.value := 0; end; function TCoreWebView2.GetInitialized : boolean; @@ -422,6 +434,10 @@ procedure TCoreWebView2.RemoveAllEvents; (FFaviconChangedToken.Value <> 0) then FBaseIntf15.remove_FaviconChanged(FFaviconChangedToken); + if assigned(FBaseIntf18) and + (FLaunchingExternalUriSchemeToken.Value <> 0) then + FBaseIntf18.remove_LaunchingExternalUriScheme(FLaunchingExternalUriSchemeToken); + UnsubscribeAllDevToolsProtocolEvents; end; except @@ -868,6 +884,21 @@ function TCoreWebView2.AddFaviconChanged(const aBrowserComponent : TComponent) : end; end; +function TCoreWebView2.AddLaunchingExternalUriScheme(const aBrowserComponent : TComponent) : boolean; +var + TempHandler : ICoreWebView2LaunchingExternalUriSchemeEventHandler; +begin + Result := False; + + if assigned(FBaseIntf18) and (FLaunchingExternalUriSchemeToken.value = 0) then + try + TempHandler := TCoreWebView2LaunchingExternalUriSchemeEventHandler.Create(TWVBrowserBase(aBrowserComponent)); + Result := succeeded(FBaseIntf18.add_LaunchingExternalUriScheme(TempHandler, FLaunchingExternalUriSchemeToken)); + finally + TempHandler := nil; + end; +end; + function TCoreWebView2.AddAllBrowserEvents(const aBrowserComponent : TComponent) : boolean; begin Result := AddNavigationStartingEvent(aBrowserComponent) and @@ -898,7 +929,8 @@ function TCoreWebView2.AddAllBrowserEvents(const aBrowserComponent : TComponent) AddContextMenuRequestedEvent(aBrowserComponent) and AddStatusBarTextChangedEvent(aBrowserComponent) and AddServerCertificateErrorDetectedEvent(aBrowserComponent) and - AddFaviconChanged(aBrowserComponent); + AddFaviconChanged(aBrowserComponent) and + AddLaunchingExternalUriScheme(aBrowserComponent); end; function TCoreWebView2.AddWebResourceRequestedFilter(const URI : wvstring; @@ -1464,6 +1496,17 @@ function TCoreWebView2.GetFaviconURI : wvstring; end; end; +function TCoreWebView2.GetMemoryUsageTargetLevel : TWVMemoryUsageTargetLevel; +var + TempResult : COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL; +begin + if assigned(FBaseIntf19) and + succeeded(FBaseIntf19.Get_MemoryUsageTargetLevel(TempResult)) then + Result := TempResult + else + Result := COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL_NORMAL; +end; + procedure TCoreWebView2.SetIsMuted(aValue : boolean); begin if assigned(FBaseIntf8) then @@ -1482,4 +1525,10 @@ procedure TCoreWebView2.SetDefaultDownloadDialogMargin(aValue : TPoint); FBaseIntf9.Set_DefaultDownloadDialogMargin(tagPOINT(aValue)); end; +procedure TCoreWebView2.SetMemoryUsageTargetLevel(aValue : TWVMemoryUsageTargetLevel); +begin + if assigned(FBaseIntf19) then + FBaseIntf19.Set_MemoryUsageTargetLevel(aValue); +end; + end. diff --git a/source/uWVCoreWebView2Args.pas b/source/uWVCoreWebView2Args.pas index 4936e8b..6b807c6 100644 --- a/source/uWVCoreWebView2Args.pas +++ b/source/uWVCoreWebView2Args.pas @@ -572,6 +572,32 @@ TCoreWebView2ServerCertificateErrorDetectedEventArgs = class property Deferral : ICoreWebView2Deferral read GetDeferral; end; + TCoreWebView2LaunchingExternalUriSchemeEventArgs = class + protected + FBaseIntf : ICoreWebView2LaunchingExternalUriSchemeEventArgs; + + function GetInitialized : boolean; + function GetUri : wvstring; + function GetInitiatingOrigin : wvstring; + function GetIsUserInitiated : boolean; + function GetCancel : boolean; + function GetDeferral : ICoreWebView2Deferral; + + procedure SetCancel(aValue : boolean); + + public + constructor Create(const aArgs: ICoreWebView2LaunchingExternalUriSchemeEventArgs); reintroduce; + destructor Destroy; override; + + property Initialized : boolean read GetInitialized; + property BaseIntf : ICoreWebView2LaunchingExternalUriSchemeEventArgs read FBaseIntf; + property Uri : wvstring read GetUri; + property InitiatingOrigin : wvstring read GetInitiatingOrigin; + property IsUserInitiated : boolean read GetIsUserInitiated; + property Cancel : boolean read GetCancel write SetCancel; + property Deferral : ICoreWebView2Deferral read GetDeferral; + end; + implementation @@ -2431,4 +2457,93 @@ procedure TCoreWebView2ServerCertificateErrorDetectedEventArgs.SetAction(aValue: FBaseIntf.Set_Action(aValue); end; + +// TCoreWebView2LaunchingExternalUriSchemeEventArgs + +constructor TCoreWebView2LaunchingExternalUriSchemeEventArgs.Create(const aArgs: ICoreWebView2LaunchingExternalUriSchemeEventArgs); +begin + inherited Create; + + FBaseIntf := aArgs; +end; + +destructor TCoreWebView2LaunchingExternalUriSchemeEventArgs.Destroy; +begin + FBaseIntf := nil; + + inherited Destroy; +end; + +function TCoreWebView2LaunchingExternalUriSchemeEventArgs.GetInitialized : boolean; +begin + Result := assigned(FBaseIntf); +end; + +function TCoreWebView2LaunchingExternalUriSchemeEventArgs.GetUri : wvstring; +var + TempString : PWideChar; +begin + Result := ''; + TempString := nil; + + if Initialized and + succeeded(FBaseIntf.Get_Uri(TempString)) then + begin + Result := TempString; + CoTaskMemFree(TempString); + end; +end; + +function TCoreWebView2LaunchingExternalUriSchemeEventArgs.GetInitiatingOrigin : wvstring; +var + TempString : PWideChar; +begin + Result := ''; + TempString := nil; + + if Initialized and + succeeded(FBaseIntf.Get_InitiatingOrigin(TempString)) then + begin + Result := TempString; + CoTaskMemFree(TempString); + end; +end; + +function TCoreWebView2LaunchingExternalUriSchemeEventArgs.GetIsUserInitiated: boolean; +var + TempInt : integer; +begin + Result := Initialized and + succeeded(FBaseIntf.Get_IsUserInitiated(TempInt)) and + (TempInt <> 0); +end; + +function TCoreWebView2LaunchingExternalUriSchemeEventArgs.GetCancel: boolean; +var + TempInt : integer; +begin + Result := Initialized and + succeeded(FBaseIntf.Get_Cancel(TempInt)) and + (TempInt <> 0); +end; + +function TCoreWebView2LaunchingExternalUriSchemeEventArgs.GetDeferral: ICoreWebView2Deferral; +var + TempResult : ICoreWebView2Deferral; +begin + Result := nil; + TempResult := nil; + + if Initialized and + succeeded(FBaseIntf.GetDeferral(TempResult)) and + (TempResult <> nil) then + Result := TempResult; +end; + +procedure TCoreWebView2LaunchingExternalUriSchemeEventArgs.SetCancel(aValue: boolean); +begin + if Initialized then + FBaseIntf.Set_Cancel(ord(aValue)); +end; + end. diff --git a/source/uWVCoreWebView2Delegates.pas b/source/uWVCoreWebView2Delegates.pas index 22e25c8..a12f8ae 100644 --- a/source/uWVCoreWebView2Delegates.pas +++ b/source/uWVCoreWebView2Delegates.pas @@ -814,6 +814,17 @@ TCoreWebView2SetPermissionStateCompletedHandler = class(TInterfacedObject, ICo destructor Destroy; override; end; + TCoreWebView2LaunchingExternalUriSchemeEventHandler = class(TInterfacedObject, ICoreWebView2LaunchingExternalUriSchemeEventHandler) + protected + FEvents : Pointer; + + function Invoke(const sender: ICoreWebView2; const args: ICoreWebView2LaunchingExternalUriSchemeEventArgs): HResult; stdcall; + + public + constructor Create(const aEvents: IWVBrowserEvents); reintroduce; + destructor Destroy; override; + end; + implementation @@ -2640,4 +2651,31 @@ function TCoreWebView2SetPermissionStateCompletedHandler.Invoke(errorCode: HResu Result := E_FAIL; end; + +// TCoreWebView2LaunchingExternalUriSchemeEventHandler + +constructor TCoreWebView2LaunchingExternalUriSchemeEventHandler.Create(const aEvents: IWVBrowserEvents); +begin + inherited Create; + + FEvents := Pointer(aEvents); +end; + +destructor TCoreWebView2LaunchingExternalUriSchemeEventHandler.Destroy; +begin + FEvents := nil; + + inherited Destroy; +end; + +function TCoreWebView2LaunchingExternalUriSchemeEventHandler.Invoke(const sender: ICoreWebView2; + const args: ICoreWebView2LaunchingExternalUriSchemeEventArgs): HResult; stdcall; +begin + if (FEvents <> nil) then + Result := IWVBrowserEvents(FEvents).LaunchingExternalUriSchemeEventHandler_Invoke(sender, args) + else + Result := E_FAIL; +end; + + end. diff --git a/source/uWVCoreWebView2Profile.pas b/source/uWVCoreWebView2Profile.pas index 59318dd..37a6388 100644 --- a/source/uWVCoreWebView2Profile.pas +++ b/source/uWVCoreWebView2Profile.pas @@ -17,6 +17,7 @@ TCoreWebView2Profile = class FBaseIntf3 : ICoreWebView2Profile3; FBaseIntf4 : ICoreWebView2Profile4; FBaseIntf5 : ICoreWebView2Profile5; + FBaseIntf6 : ICoreWebView2Profile6; function GetInitialized : boolean; function GetProfileName : wvstring; @@ -26,10 +27,14 @@ TCoreWebView2Profile = class function GetPreferredColorScheme : TWVPreferredColorScheme; function GetPreferredTrackingPreventionLevel : TWVTrackingPreventionLevel; function GetCookieManager : ICoreWebView2CookieManager; + function GetIsPasswordAutosaveEnabled : boolean; + function GetIsGeneralAutofillEnabled : boolean; procedure SetDefaultDownloadFolderPath(const aValue : wvstring); procedure SetPreferredColorScheme(aValue : TWVPreferredColorScheme); procedure SetPreferredTrackingPreventionLevel(aValue : TWVTrackingPreventionLevel); + procedure SetIsPasswordAutosaveEnabled(aValue : boolean); + procedure SetIsGeneralAutofillEnabled(aValue : boolean); procedure InitializeFields; @@ -51,6 +56,8 @@ TCoreWebView2Profile = class property PreferredColorScheme : TWVPreferredColorScheme read GetPreferredColorScheme write SetPreferredColorScheme; property PreferredTrackingPreventionLevel : TWVTrackingPreventionLevel read GetPreferredTrackingPreventionLevel write SetPreferredTrackingPreventionLevel; property CookieManager : ICoreWebView2CookieManager read GetCookieManager; + property IsPasswordAutosaveEnabled : boolean read GetIsPasswordAutosaveEnabled write SetIsPasswordAutosaveEnabled; + property IsGeneralAutofillEnabled : boolean read GetIsGeneralAutofillEnabled write SetIsGeneralAutofillEnabled; end; implementation @@ -74,8 +81,9 @@ constructor TCoreWebView2Profile.Create(const aBaseIntf: ICoreWebView2Profile); if Initialized and LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2Profile2, FBaseIntf2) and LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2Profile3, FBaseIntf3) and - LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2Profile4, FBaseIntf4) then - LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2Profile5, FBaseIntf5); + LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2Profile4, FBaseIntf4) and + LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2Profile5, FBaseIntf5) then + LoggedQueryInterface(FBaseIntf, IID_ICoreWebView2Profile6, FBaseIntf6); end; destructor TCoreWebView2Profile.Destroy; @@ -92,6 +100,7 @@ procedure TCoreWebView2Profile.InitializeFields; FBaseIntf3 := nil; FBaseIntf4 := nil; FBaseIntf5 := nil; + FBaseIntf6 := nil; end; function TCoreWebView2Profile.GetInitialized : boolean; @@ -192,6 +201,24 @@ function TCoreWebView2Profile.GetCookieManager : ICoreWebView2CookieManager; Result := TempResult; end; +function TCoreWebView2Profile.GetIsPasswordAutosaveEnabled : boolean; +var + TempResult : integer; +begin + Result := assigned(FBaseIntf6) and + succeeded(FBaseIntf6.Get_IsPasswordAutosaveEnabled(TempResult)) and + (TempResult <> 0); +end; + +function TCoreWebView2Profile.GetIsGeneralAutofillEnabled : boolean; +var + TempResult : integer; +begin + Result := assigned(FBaseIntf6) and + succeeded(FBaseIntf6.Get_IsGeneralAutofillEnabled(TempResult)) and + (TempResult <> 0); +end; + procedure TCoreWebView2Profile.SetDefaultDownloadFolderPath(const aValue : wvstring); begin if Initialized then @@ -210,6 +237,18 @@ procedure TCoreWebView2Profile.SetPreferredTrackingPreventionLevel(aValue : TWVT FBaseIntf3.Set_PreferredTrackingPreventionLevel(aValue); end; +procedure TCoreWebView2Profile.SetIsPasswordAutosaveEnabled(aValue: boolean); +begin + if assigned(FBaseIntf6) then + FBaseIntf6.Set_IsPasswordAutosaveEnabled(ord(aValue)); +end; + +procedure TCoreWebView2Profile.SetIsGeneralAutofillEnabled(aValue: boolean); +begin + if assigned(FBaseIntf6) then + FBaseIntf6.Set_IsGeneralAutofillEnabled(ord(aValue)); +end; + function TCoreWebView2Profile.ClearBrowsingData( dataKinds : TWVBrowsingDataKinds; const handler : ICoreWebView2ClearBrowsingDataCompletedHandler): boolean; begin diff --git a/source/uWVEvents.pas b/source/uWVEvents.pas index d3fd040..5f1f88a 100644 --- a/source/uWVEvents.pas +++ b/source/uWVEvents.pas @@ -89,6 +89,7 @@ interface TOnGetCustomSchemesEvent = procedure(Sender: TObject; var aCustomSchemes: TWVCustomSchemeInfoArray) of object; TOnGetNonDefaultPermissionSettingsCompletedEvent = procedure(Sender: TObject; aErrorCode: HRESULT; const aCollectionView: ICoreWebView2PermissionSettingCollectionView) of object; TOnSetPermissionStateCompletedEvent = procedure(Sender: TObject; aErrorCode: HRESULT) of object; + TOnLaunchingExternalUriSchemeEvent = procedure(Sender: TObject; const aWebView: ICoreWebView2; const aArgs: ICoreWebView2LaunchingExternalUriSchemeEventArgs) of object; // Custom events TOnCompMsgEvent = procedure(Sender: TObject; var aMessage: TMessage; var aHandled: Boolean) of object; diff --git a/source/uWVFMXBrowser.pas b/source/uWVFMXBrowser.pas index 4b9ba63..9107310 100644 --- a/source/uWVFMXBrowser.pas +++ b/source/uWVFMXBrowser.pas @@ -121,6 +121,7 @@ TWVFMXBrowser = class(TWVBrowserBase) property OnGetCustomSchemes; property OnGetNonDefaultPermissionSettingsCompleted; property OnSetPermissionStateCompleted; + property OnLaunchingExternalUriScheme; end; implementation diff --git a/source/uWVInterfaces.pas b/source/uWVInterfaces.pas index df5cb66..bc79a38 100644 --- a/source/uWVInterfaces.pas +++ b/source/uWVInterfaces.pas @@ -240,6 +240,9 @@ interface // ICoreWebView2SetPermissionStateCompletedHandler function SetPermissionStateCompletedHandler_Invoke(errorCode: HResult): HResult; + + // ICoreWebView2LaunchingExternalUriSchemeEventHandler + function LaunchingExternalUriSchemeEventHandler_Invoke(const sender: ICoreWebView2; const args: ICoreWebView2LaunchingExternalUriSchemeEventArgs): HResult; end; implementation diff --git a/source/uWVTypeLibrary.pas b/source/uWVTypeLibrary.pas index 000417b..a7f2406 100644 --- a/source/uWVTypeLibrary.pas +++ b/source/uWVTypeLibrary.pas @@ -30,10 +30,10 @@ // ************************************************************************ // // $Rev: 98336 $ -// File generated on 09/05/2023 15:22:18 from Type Library described below. +// File generated on 06/06/2023 11:23:24 from Type Library described below. // ************************************************************************ // -// Type Lib: R:\microsoft.web.webview2.1.0.1774.30.nupkg_FILES\WebView2.tlb (1) +// Type Lib: R:\microsoft.web.webview2.1.0.1823.32.nupkg_FILES\WebView2.tlb (1) // LIBID: {26D34152-879F-4065-BEA2-3DAA2CFADFB8} // LCID: 0 // Helpfile: @@ -197,6 +197,9 @@ interface IID_ICoreWebView2PrintToPdfStreamCompletedHandler: TGUID = '{4C9F8229-8F93-444F-A711-2C0DFD6359D5}'; IID_ICoreWebView2_17: TGUID = '{702E75D4-FD44-434D-9D70-1A68A6B1192A}'; IID_ICoreWebView2SharedBuffer: TGUID = '{B747A495-0C6F-449E-97B8-2F81E9D6AB43}'; + IID_ICoreWebView2_18: TGUID = '{7A626017-28BE-49B2-B865-3BA2B3522D90}'; + IID_ICoreWebView2LaunchingExternalUriSchemeEventHandler: TGUID = '{74F712E0-8165-43A9-A13F-0CCE597E75DF}'; + IID_ICoreWebView2LaunchingExternalUriSchemeEventArgs: TGUID = '{07D1A6C3-7175-4BA1-9306-E593CA07E46C}'; IID_ICoreWebView2BrowserProcessExitedEventArgs: TGUID = '{1F00663F-AF8C-4782-9CDD-DD01C52E34CB}'; IID_ICoreWebView2BrowserProcessExitedEventHandler: TGUID = '{FA504257-A216-4911-A860-FE8825712861}'; IID_ICoreWebView2CompositionController: TGUID = '{3DF9B733-B9AE-4A15-86B4-EB9EE9826469}'; @@ -261,6 +264,7 @@ interface IID_ICoreWebView2Profile4: TGUID = '{8F4AE680-192E-4EC8-833A-21CFADAEF628}'; IID_ICoreWebView2SetPermissionStateCompletedHandler: TGUID = '{FC77FB30-9C9E-4076-B8C7-7644A703CA1B}'; IID_ICoreWebView2Profile5: TGUID = '{2EE5B76E-6E80-4DF2-BCD3-D4EC3340A01B}'; + IID_ICoreWebView2Profile6: TGUID = '{BD82FA6A-1D65-4C33-B2B4-0393020CC61B}'; IID_ICoreWebView2Settings2: TGUID = '{EE9A0F68-F46C-4E32-AC23-EF8CAC224D2A}'; IID_ICoreWebView2Settings3: TGUID = '{FDB5AB74-AF33-4854-84F0-0A631DEB5EBA}'; IID_ICoreWebView2Settings4: TGUID = '{CB56846C-4168-4D53-B04F-03B6D6796FF2}'; @@ -268,6 +272,7 @@ interface IID_ICoreWebView2Settings6: TGUID = '{11CB3ACD-9BC8-43B8-83BF-F40753714F87}'; IID_ICoreWebView2Settings7: TGUID = '{488DC902-35EF-42D2-BC7D-94B65C4BC49C}'; IID_ICoreWebView2Settings8: TGUID = '{9E6B0E8F-86AD-4E81-8147-A9B5EDB68650}'; + IID_ICoreWebView2_19: TGUID = '{6921F954-79B0-437F-A997-C85811897C68}'; IID_ICoreWebView2File: TGUID = '{F2C19559-6BC1-4583-A757-90021BE9AFEC}'; IID_ICoreWebView2ObjectCollectionView: TGUID = '{0F36FD87-4F69-4415-98DA-888F89FB9A33}'; IID_ICoreWebView2WebMessageReceivedEventArgs2: TGUID = '{06FC7AB7-C90C-4297-9389-33CA01CF6D5E}'; @@ -706,6 +711,13 @@ interface COREWEBVIEW2_PDF_TOOLBAR_ITEMS_FULL_SCREEN = $00000800; COREWEBVIEW2_PDF_TOOLBAR_ITEMS_MORE_SETTINGS = $00001000; +// Constants for enum COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL +type + COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL = TOleEnum; +const + COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL_NORMAL = $00000000; + COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL_LOW = $00000001; + type // *********************************************************************// @@ -829,6 +841,9 @@ interface ICoreWebView2PrintToPdfStreamCompletedHandler = interface; ICoreWebView2_17 = interface; ICoreWebView2SharedBuffer = interface; + ICoreWebView2_18 = interface; + ICoreWebView2LaunchingExternalUriSchemeEventHandler = interface; + ICoreWebView2LaunchingExternalUriSchemeEventArgs = interface; ICoreWebView2BrowserProcessExitedEventArgs = interface; ICoreWebView2BrowserProcessExitedEventHandler = interface; ICoreWebView2CompositionController = interface; @@ -893,6 +908,7 @@ interface ICoreWebView2Profile4 = interface; ICoreWebView2SetPermissionStateCompletedHandler = interface; ICoreWebView2Profile5 = interface; + ICoreWebView2Profile6 = interface; ICoreWebView2Settings2 = interface; ICoreWebView2Settings3 = interface; ICoreWebView2Settings4 = interface; @@ -900,6 +916,7 @@ interface ICoreWebView2Settings6 = interface; ICoreWebView2Settings7 = interface; ICoreWebView2Settings8 = interface; + ICoreWebView2_19 = interface; ICoreWebView2File = interface; ICoreWebView2ObjectCollectionView = interface; ICoreWebView2WebMessageReceivedEventArgs2 = interface; @@ -2660,6 +2677,44 @@ COREWEBVIEW2_COLOR = record function Close: HResult; stdcall; end; +// *********************************************************************// +// Interface: ICoreWebView2_18 +// Flags: (0) +// GUID: {7A626017-28BE-49B2-B865-3BA2B3522D90} +// *********************************************************************// + ICoreWebView2_18 = interface(ICoreWebView2_17) + ['{7A626017-28BE-49B2-B865-3BA2B3522D90}'] + function add_LaunchingExternalUriScheme(const eventHandler: ICoreWebView2LaunchingExternalUriSchemeEventHandler; + out token: EventRegistrationToken): HResult; stdcall; + function remove_LaunchingExternalUriScheme(token: EventRegistrationToken): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ICoreWebView2LaunchingExternalUriSchemeEventHandler +// Flags: (0) +// GUID: {74F712E0-8165-43A9-A13F-0CCE597E75DF} +// *********************************************************************// + ICoreWebView2LaunchingExternalUriSchemeEventHandler = interface(IUnknown) + ['{74F712E0-8165-43A9-A13F-0CCE597E75DF}'] + function Invoke(const sender: ICoreWebView2; + const args: ICoreWebView2LaunchingExternalUriSchemeEventArgs): HResult; stdcall; + end; + +// *********************************************************************// +// Interface: ICoreWebView2LaunchingExternalUriSchemeEventArgs +// Flags: (0) +// GUID: {07D1A6C3-7175-4BA1-9306-E593CA07E46C} +// *********************************************************************// + ICoreWebView2LaunchingExternalUriSchemeEventArgs = interface(IUnknown) + ['{07D1A6C3-7175-4BA1-9306-E593CA07E46C}'] + function Get_uri(out value: PWideChar): HResult; stdcall; + function Get_InitiatingOrigin(out value: PWideChar): HResult; stdcall; + function Get_IsUserInitiated(out value: Integer): HResult; stdcall; + function Get_Cancel(out value: Integer): HResult; stdcall; + function Set_Cancel(value: Integer): HResult; stdcall; + function GetDeferral(out value: ICoreWebView2Deferral): HResult; stdcall; + end; + // *********************************************************************// // Interface: ICoreWebView2BrowserProcessExitedEventArgs // Flags: (0) @@ -3497,6 +3552,19 @@ COREWEBVIEW2_COLOR = record function Get_CookieManager(out CookieManager: ICoreWebView2CookieManager): HResult; stdcall; end; +// *********************************************************************// +// Interface: ICoreWebView2Profile6 +// Flags: (0) +// GUID: {BD82FA6A-1D65-4C33-B2B4-0393020CC61B} +// *********************************************************************// + ICoreWebView2Profile6 = interface(ICoreWebView2Profile5) + ['{BD82FA6A-1D65-4C33-B2B4-0393020CC61B}'] + function Get_IsPasswordAutosaveEnabled(out value: Integer): HResult; stdcall; + function Set_IsPasswordAutosaveEnabled(value: Integer): HResult; stdcall; + function Get_IsGeneralAutofillEnabled(out value: Integer): HResult; stdcall; + function Set_IsGeneralAutofillEnabled(value: Integer): HResult; stdcall; + end; + // *********************************************************************// // Interface: ICoreWebView2Settings2 // Flags: (0) @@ -3576,6 +3644,17 @@ COREWEBVIEW2_COLOR = record function Set_IsReputationCheckingRequired(value: Integer): HResult; stdcall; end; +// *********************************************************************// +// Interface: ICoreWebView2_19 +// Flags: (0) +// GUID: {6921F954-79B0-437F-A997-C85811897C68} +// *********************************************************************// + ICoreWebView2_19 = interface(ICoreWebView2_18) + ['{6921F954-79B0-437F-A997-C85811897C68}'] + function Get_MemoryUsageTargetLevel(out level: COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL): HResult; stdcall; + function Set_MemoryUsageTargetLevel(level: COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL): HResult; stdcall; + end; + // *********************************************************************// // Interface: ICoreWebView2File // Flags: (0) diff --git a/source/uWVTypes.pas b/source/uWVTypes.pas index 2c76843..a7049ac 100644 --- a/source/uWVTypes.pas +++ b/source/uWVTypes.pas @@ -64,6 +64,7 @@ interface TWVPrintDialogKind = type COREWEBVIEW2_PRINT_DIALOG_KIND; TWVSharedBufferAccess = type COREWEBVIEW2_SHARED_BUFFER_ACCESS; TWVTrackingPreventionLevel = type COREWEBVIEW2_TRACKING_PREVENTION_LEVEL; + TWVMemoryUsageTargetLevel = type COREWEBVIEW2_MEMORY_USAGE_TARGET_LEVEL; TWV2LoaderStatus = (wvlsCreated, wvlsLoading, diff --git a/source/uWVVersion.inc b/source/uWVVersion.inc index eca75d4..d420920 100644 --- a/source/uWVVersion.inc +++ b/source/uWVVersion.inc @@ -1,12 +1,12 @@ WEBVIEW2LOADERLIB_VERSION_MAJOR = 1; WEBVIEW2LOADERLIB_VERSION_MINOR = 0; - WEBVIEW2LOADERLIB_VERSION_RELEASE = 1774; - WEBVIEW2LOADERLIB_VERSION_BUILD = 30; + WEBVIEW2LOADERLIB_VERSION_RELEASE = 1823; + WEBVIEW2LOADERLIB_VERSION_BUILD = 32; // For full API compatibility, WebView4Delphi requires the same // WebView2 Runtime version mentioned in the release notes : // https://docs.microsoft.com/en-us/microsoft-edge/webview2/release-notes - CHROMIUM_VERSION_MAJOR = 113; + CHROMIUM_VERSION_MAJOR = 114; CHROMIUM_VERSION_MINOR = 0; CHROMIUM_VERSION_RELEASE = WEBVIEW2LOADERLIB_VERSION_RELEASE; CHROMIUM_VERSION_BUILD = WEBVIEW2LOADERLIB_VERSION_BUILD; \ No newline at end of file diff --git a/update_WebView4Delphi.json b/update_WebView4Delphi.json index 93ba8d9..735bb45 100644 --- a/update_WebView4Delphi.json +++ b/update_WebView4Delphi.json @@ -2,9 +2,9 @@ "UpdateLazPackages" : [ { "ForceNotify" : true, - "InternalVersion" : 99, + "InternalVersion" : 100, "Name" : "webview4delphi.lpk", - "Version" : "1.0.1774.30" + "Version" : "1.0.1823.32" } ], "UpdatePackageData" : {