5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 02:31:58 +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 (
nativeModule = windows.NewLazyDLL("WebView2Loader")
nativeCreate = nativeModule.NewProc("CreateCoreWebView2EnvironmentWithOptions")
nativeCompareBrowserVersions = nativeModule.NewProc("CompareBrowserVersions")
nativeGetAvailableCoreWebView2BrowserVersionString = nativeModule.NewProc("GetAvailableCoreWebView2BrowserVersionString")
memOnce sync.Once
memModule winloader.Module
memCreate winloader.Proc
@ -23,6 +18,11 @@ var (
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:
// -1 = v1 < v2
// 0 = v1 == v2
@ -38,26 +38,17 @@ func CompareBrowserVersions(v1 string, v2 string) (int, error) {
return 0, err
}
nativeErr := nativeModule.Load()
if nativeErr == nil {
nativeErr = nativeCompareBrowserVersions.Find()
err = loadFromMemory()
if err != nil {
return 0, err
}
var result int
if nativeErr != nil {
err := loadFromMemory(nativeErr)
if err != nil {
return 0, fmt.Errorf("Unable to load WebView2Loader.dll from disk: %v -- or from memory: %w", nativeErr, memErr)
}
_, _, err = memCompareBrowserVersions.Call(
uint64(uintptr(unsafe.Pointer(_v1))),
uint64(uintptr(unsafe.Pointer(_v2))),
uint64(uintptr(unsafe.Pointer(&result))))
} else {
_, _, err = nativeCompareBrowserVersions.Call(
uintptr(unsafe.Pointer(_v1)),
uintptr(unsafe.Pointer(_v2)),
uintptr(unsafe.Pointer(&result)))
}
_, _, err = memCompareBrowserVersions.Call(
uint64(uintptr(unsafe.Pointer(_v1))),
uint64(uintptr(unsafe.Pointer(_v2))),
uint64(uintptr(unsafe.Pointer(&result))))
if err != windows.ERROR_SUCCESS {
return result, err
}
@ -67,28 +58,25 @@ func CompareBrowserVersions(v1 string, v2 string) (int, error) {
// GetInstalledVersion returns the installed version of the webview2 runtime.
// If there is no version installed, a blank string is returned.
func GetInstalledVersion() (string, error) {
nativeErr := nativeModule.Load()
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)))
}
err := loadFromMemory()
if err != nil {
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)
windows.CoTaskMemFree(unsafe.Pointer(result))
return version, nil
@ -97,39 +85,26 @@ func GetInstalledVersion() (string, error) {
// CreateCoreWebView2EnvironmentWithOptions tries to load WebviewLoader2 and
// call the CreateCoreWebView2EnvironmentWithOptions routine.
func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder *uint16, environmentOptions uintptr, environmentCompletedHandle uintptr) (uintptr, error) {
nativeErr := nativeModule.Load()
if nativeErr == nil {
nativeErr = nativeCreate.Find()
err := loadFromMemory()
if err != nil {
return 0, err
}
if nativeErr != nil {
err := loadFromMemory(nativeErr)
if err != nil {
return 0, err
}
res, _, _ := memCreate.Call(
uint64(uintptr(unsafe.Pointer(browserExecutableFolder))),
uint64(uintptr(unsafe.Pointer(userDataFolder))),
uint64(environmentOptions),
uint64(environmentCompletedHandle),
)
return uintptr(res), nil
}
res, _, _ := nativeCreate.Call(
uintptr(unsafe.Pointer(browserExecutableFolder)),
uintptr(unsafe.Pointer(userDataFolder)),
environmentOptions,
environmentCompletedHandle,
res, _, _ := memCreate.Call(
uint64(uintptr(unsafe.Pointer(browserExecutableFolder))),
uint64(uintptr(unsafe.Pointer(userDataFolder))),
uint64(environmentOptions),
uint64(environmentCompletedHandle),
)
return res, nil
return uintptr(res), nil
}
func loadFromMemory(nativeErr error) error {
func loadFromMemory() error {
var err error
// DLL is not available natively. Try loading embedded copy.
memOnce.Do(func() {
memModule, memErr = winloader.LoadFromMemory(WebView2Loader)
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
}
memCreate = memModule.Proc("CreateCoreWebView2EnvironmentWithOptions")