5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-04 03:29:03 +08:00

[v2, windows] Load WebView2 loader from embedded only (#1432)

This commit is contained in:
stffabi 2022-05-31 22:00:02 +02:00 committed by GitHub
parent f292e221f1
commit 614f50d5d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -10,11 +10,6 @@ import (
) )
var ( var (
nativeModule = windows.NewLazyDLL("WebView2Loader")
nativeCreate = nativeModule.NewProc("CreateCoreWebView2EnvironmentWithOptions")
nativeCompareBrowserVersions = nativeModule.NewProc("CompareBrowserVersions")
nativeGetAvailableCoreWebView2BrowserVersionString = nativeModule.NewProc("GetAvailableCoreWebView2BrowserVersionString")
memOnce sync.Once memOnce sync.Once
memModule winloader.Module memModule winloader.Module
memCreate winloader.Proc memCreate winloader.Proc
@ -23,6 +18,11 @@ var (
memErr error memErr error
) )
const (
// https://referencesource.microsoft.com/#system.web/Util/hresults.cs,20
E_FILENOTFOUND = 0x80070002
)
// CompareBrowserVersions will compare the 2 given versions and return: // CompareBrowserVersions will compare the 2 given versions and return:
// -1 = v1 < v2 // -1 = v1 < v2
// 0 = v1 == v2 // 0 = v1 == v2
@ -38,26 +38,17 @@ func CompareBrowserVersions(v1 string, v2 string) (int, error) {
return 0, err return 0, err
} }
nativeErr := nativeModule.Load() err = loadFromMemory()
if nativeErr == nil {
nativeErr = nativeCompareBrowserVersions.Find()
}
var result int
if nativeErr != nil {
err := loadFromMemory(nativeErr)
if err != nil { if err != nil {
return 0, fmt.Errorf("Unable to load WebView2Loader.dll from disk: %v -- or from memory: %w", nativeErr, memErr) return 0, err
} }
var result int
_, _, err = memCompareBrowserVersions.Call( _, _, err = memCompareBrowserVersions.Call(
uint64(uintptr(unsafe.Pointer(_v1))), uint64(uintptr(unsafe.Pointer(_v1))),
uint64(uintptr(unsafe.Pointer(_v2))), uint64(uintptr(unsafe.Pointer(_v2))),
uint64(uintptr(unsafe.Pointer(&result)))) uint64(uintptr(unsafe.Pointer(&result))))
} else {
_, _, err = nativeCompareBrowserVersions.Call(
uintptr(unsafe.Pointer(_v1)),
uintptr(unsafe.Pointer(_v2)),
uintptr(unsafe.Pointer(&result)))
}
if err != windows.ERROR_SUCCESS { if err != windows.ERROR_SUCCESS {
return result, err return result, err
} }
@ -67,28 +58,25 @@ func CompareBrowserVersions(v1 string, v2 string) (int, error) {
// GetInstalledVersion returns the installed version of the webview2 runtime. // GetInstalledVersion returns the installed version of the webview2 runtime.
// If there is no version installed, a blank string is returned. // If there is no version installed, a blank string is returned.
func GetInstalledVersion() (string, error) { func GetInstalledVersion() (string, error) {
nativeErr := nativeModule.Load() err := loadFromMemory()
if nativeErr == nil {
nativeErr = nativeGetAvailableCoreWebView2BrowserVersionString.Find()
}
var err error
var result *uint16
if nativeErr != nil {
err := loadFromMemory(nativeErr)
if err != nil {
return "", fmt.Errorf("Unable to load WebView2Loader.dll from disk: %v -- or from memory: %w", nativeErr, memErr)
}
_, _, err = memGetAvailableCoreWebView2BrowserVersionString.Call(
uint64(uintptr(unsafe.Pointer(nil))),
uint64(uintptr(unsafe.Pointer(&result))))
} else {
_, _, err = nativeCompareBrowserVersions.Call(
uintptr(unsafe.Pointer(nil)),
uintptr(unsafe.Pointer(&result)))
}
if err != nil { if err != nil {
return "", err return "", err
} }
var result *uint16
res, _, err := memGetAvailableCoreWebView2BrowserVersionString.Call(
uint64(uintptr(unsafe.Pointer(nil))),
uint64(uintptr(unsafe.Pointer(&result))))
if res != 0 {
if res == E_FILENOTFOUND {
// Webview2 is not installed
return "", nil
}
return "", fmt.Errorf("Unable to call GetAvailableCoreWebView2BrowserVersionString (%x): %w", res, err)
}
version := windows.UTF16PtrToString(result) version := windows.UTF16PtrToString(result)
windows.CoTaskMemFree(unsafe.Pointer(result)) windows.CoTaskMemFree(unsafe.Pointer(result))
return version, nil return version, nil
@ -97,12 +85,7 @@ func GetInstalledVersion() (string, error) {
// CreateCoreWebView2EnvironmentWithOptions tries to load WebviewLoader2 and // CreateCoreWebView2EnvironmentWithOptions tries to load WebviewLoader2 and
// call the CreateCoreWebView2EnvironmentWithOptions routine. // call the CreateCoreWebView2EnvironmentWithOptions routine.
func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder *uint16, environmentOptions uintptr, environmentCompletedHandle uintptr) (uintptr, error) { func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder *uint16, environmentOptions uintptr, environmentCompletedHandle uintptr) (uintptr, error) {
nativeErr := nativeModule.Load() err := loadFromMemory()
if nativeErr == nil {
nativeErr = nativeCreate.Find()
}
if nativeErr != nil {
err := loadFromMemory(nativeErr)
if err != nil { if err != nil {
return 0, err return 0, err
} }
@ -113,23 +96,15 @@ func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataF
uint64(environmentCompletedHandle), uint64(environmentCompletedHandle),
) )
return uintptr(res), nil return uintptr(res), nil
}
res, _, _ := nativeCreate.Call(
uintptr(unsafe.Pointer(browserExecutableFolder)),
uintptr(unsafe.Pointer(userDataFolder)),
environmentOptions,
environmentCompletedHandle,
)
return res, nil
} }
func loadFromMemory(nativeErr error) error { func loadFromMemory() error {
var err error var err error
// DLL is not available natively. Try loading embedded copy. // DLL is not available natively. Try loading embedded copy.
memOnce.Do(func() { memOnce.Do(func() {
memModule, memErr = winloader.LoadFromMemory(WebView2Loader) memModule, memErr = winloader.LoadFromMemory(WebView2Loader)
if memErr != nil { if memErr != nil {
err = fmt.Errorf("Unable to load WebView2Loader.dll from disk: %v -- or from memory: %w", nativeErr, memErr) err = fmt.Errorf("Unable to load WebView2Loader.dll from memory: %w", memErr)
return return
} }
memCreate = memModule.Proc("CreateCoreWebView2EnvironmentWithOptions") memCreate = memModule.Proc("CreateCoreWebView2EnvironmentWithOptions")