From f2ab205415eb8aecf4d2f913e7600fad40819540 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 10 Jun 2023 17:04:31 +1000 Subject: [PATCH] [chore] Use webview2 package (#2687) * [v2 windows] Use external webview2 package * Update CHANGELOG --- v2/go.mod | 2 + v2/go.sum | 2 + .../frontend/desktop/windows/frontend.go | 2 +- .../desktop/windows/go-webview2/LICENSE | 22 - .../desktop/windows/go-webview2/README.md | 27 - .../windows/go-webview2/internal/w32/w32.go | 157 ------ .../go-webview2/pkg/combridge/bridge.go | 239 --------- .../go-webview2/pkg/combridge/iunknown.go | 56 -- .../pkg/combridge/iunknown_impl.go | 74 --- .../go-webview2/pkg/combridge/syscall.go | 39 -- .../go-webview2/pkg/combridge/vtables.go | 147 ----- .../pkg/edge/COREWEBVIEW2_COLOR.go | 10 - .../COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go | 11 - .../pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go | 12 - .../edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go | 11 - .../edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go | 12 - .../edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go | 49 -- .../edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go | 25 - ...eWebView2AcceleratorKeyPressedEventArgs.go | 79 --- ...bView2AcceleratorKeyPressedEventHandler.go | 53 -- .../pkg/edge/ICoreWebView2Controller.go | 160 ------ .../pkg/edge/ICoreWebView2Controller2.go | 75 --- ...eCoreWebView2ControllerCompletedHandler.go | 53 -- ...reWebView2HttpHeadersCollectionIterator.go | 78 --- .../edge/ICoreWebView2HttpRequestHeaders.go | 101 ---- ...oreWebView2NavigationCompletedEventArgs.go | 18 - ...WebView2NavigationCompletedEventHandler.go | 53 -- .../ICoreWebView2ProcessFailedEventArgs.go | 41 -- .../ICoreWebView2ProcessFailedEventHandler.go | 53 -- .../pkg/edge/ICoreWebView2Settings.go | 271 ---------- .../edge/ICoreWebView2WebResourceRequest.go | 102 ---- ...reWebView2WebResourceRequestedEventArgs.go | 52 -- ...ebView2WebResourceRequestedEventHandler.go | 50 -- .../edge/ICoreWebView2WebResourceResponse.go | 28 - .../go-webview2/pkg/edge/ICoreWebView2_2.go | 18 - .../go-webview2/pkg/edge/ICoreWebView2_3.go | 62 --- .../pkg/edge/ICoreWebViewSettings.go | 397 -------------- .../windows/go-webview2/pkg/edge/IStream.go | 54 -- .../windows/go-webview2/pkg/edge/chromium.go | 419 --------------- .../go-webview2/pkg/edge/chromium_386.go | 23 - .../go-webview2/pkg/edge/chromium_amd64.go | 20 - .../go-webview2/pkg/edge/chromium_arm64.go | 23 - .../go-webview2/pkg/edge/corewebview2.go | 503 ------------------ .../go-webview2/pkg/edge/create_env_go.go | 29 - .../go-webview2/pkg/edge/create_env_native.go | 41 -- .../windows/go-webview2/pkg/edge/guid.go | 225 -------- .../windows/go-webview2/webviewloader/LICENSE | 16 - .../go-webview2/webviewloader/README.md | 19 - .../webviewloader/arm64/WebView2Loader.dll | Bin 124328 -> 0 bytes .../go-webview2/webviewloader/env_create.go | 176 ------ .../webviewloader/env_create_completed.go | 42 -- .../webviewloader/env_create_options.go | 276 ---------- .../go-webview2/webviewloader/find_dll.go | 74 --- .../webviewloader/find_dll_installed.go | 94 ---- .../webviewloader/native_module.go | 173 ------ .../webviewloader/native_module_386.go | 8 - .../webviewloader/native_module_amd64.go | 8 - .../webviewloader/native_module_arm64.go | 8 - .../go-webview2/webviewloader/syscall.go | 143 ----- .../go-webview2/webviewloader/version.go | 147 ----- .../webviewloader/x64/WebView2Loader.dll | Bin 137640 -> 0 bytes .../webviewloader/x86/WebView2Loader.dll | Bin 107416 -> 0 bytes .../frontend/desktop/windows/window.go | 3 +- v2/internal/system/system_windows.go | 2 +- v2/internal/wv2installer/wv2installer.go | 2 +- website/src/pages/changelog.mdx | 1 + 66 files changed, 9 insertions(+), 5161 deletions(-) delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/LICENSE delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/README.md delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/internal/w32/w32.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/bridge.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown_impl.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/syscall.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/vtables.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller2.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Settings.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_2.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_3.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebViewSettings.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/IStream.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_386.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_amd64.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_arm64.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_go.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_native.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/guid.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/LICENSE delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/README.md delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/arm64/WebView2Loader.dll delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/env_create.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/env_create_completed.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/env_create_options.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll_installed.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_386.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_amd64.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_arm64.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/syscall.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/version.go delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/x64/WebView2Loader.dll delete mode 100644 v2/internal/frontend/desktop/windows/go-webview2/webviewloader/x86/WebView2Loader.dll diff --git a/v2/go.mod b/v2/go.mod index c40a121f9..5d45d171f 100644 --- a/v2/go.mod +++ b/v2/go.mod @@ -35,6 +35,7 @@ require ( github.com/tidwall/sjson v1.1.7 github.com/tkrajina/go-reflector v0.5.6 github.com/wailsapp/mimetype v1.4.1 + github.com/wailsapp/go-webview2 v1.0.1 github.com/wzshiming/ctc v1.2.3 golang.org/x/mod v0.8.0 golang.org/x/net v0.10.0 @@ -59,6 +60,7 @@ require ( github.com/gorilla/css v1.0.0 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect github.com/kr/pretty v0.3.0 // indirect github.com/lithammer/fuzzysearch v1.1.5 // indirect diff --git a/v2/go.sum b/v2/go.sum index 415b4e42d..0a3125661 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -250,6 +250,8 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/wailsapp/go-webview2 v1.0.1 h1:dEJIeEApW/MhO2tTMISZBFZPuW7kwrFA1NtgFB1z1II= +github.com/wailsapp/go-webview2 v1.0.1/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= diff --git a/v2/internal/frontend/desktop/windows/frontend.go b/v2/internal/frontend/desktop/windows/frontend.go index 82289e054..c4186eda6 100644 --- a/v2/internal/frontend/desktop/windows/frontend.go +++ b/v2/internal/frontend/desktop/windows/frontend.go @@ -21,9 +21,9 @@ import ( "time" "github.com/bep/debounce" + "github.com/wailsapp/go-webview2/pkg/edge" "github.com/wailsapp/wails/v2/internal/binding" "github.com/wailsapp/wails/v2/internal/frontend" - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge" "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/win32" "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/winc" "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/winc/w32" diff --git a/v2/internal/frontend/desktop/windows/go-webview2/LICENSE b/v2/internal/frontend/desktop/windows/go-webview2/LICENSE deleted file mode 100644 index ef2a0f485..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) 2020 John Chadwick -Some portions Copyright (c) 2017 Serge Zaitsev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/v2/internal/frontend/desktop/windows/go-webview2/README.md b/v2/internal/frontend/desktop/windows/go-webview2/README.md deleted file mode 100644 index 7379b3025..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# go-webview2 - -This is a proof of concept for embedding Webview2 into Go without CGo. It is based -on [webview/webview](https://github.com/webview/webview) and provides a compatible API. - -## Notice - -Because this version doesn't currently have an EdgeHTML fallback, it will not work unless you have a Webview2 runtime -installed. In addition, it requires the Webview2Loader DLL in order to function. Adding an EdgeHTML fallback should be -technically possible but will likely require much worse hacks since the API is not strictly COM to my knowledge. - -## Demo - -For now, you'll need to install the Webview2 runtime, as it does not ship with Windows. - -[WebView2 runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) - -After that, you should be able to run go-webview2 directly: - -``` -go run go-webview2/cmd/demo -``` - -This will use go-winloader to load an embedded copy of WebView2Loader.dll. - -If this does not work, please try running from a directory that has an appropriate copy of `WebView2Loader.dll` for your -GOARCH. If _that_ worked, *please* file a bug so we can figure out what's wrong with go-winloader :) \ No newline at end of file diff --git a/v2/internal/frontend/desktop/windows/go-webview2/internal/w32/w32.go b/v2/internal/frontend/desktop/windows/go-webview2/internal/w32/w32.go deleted file mode 100644 index 2b564173f..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/internal/w32/w32.go +++ /dev/null @@ -1,157 +0,0 @@ -//go:build windows - -package w32 - -import ( - "syscall" - "unicode/utf16" - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - ole32 = windows.NewLazySystemDLL("ole32") - Ole32CoInitializeEx = ole32.NewProc("CoInitializeEx") - - kernel32 = windows.NewLazySystemDLL("kernel32") - Kernel32GetCurrentThreadID = kernel32.NewProc("GetCurrentThreadId") - - shlwapi = windows.NewLazySystemDLL("shlwapi") - shlwapiSHCreateMemStream = shlwapi.NewProc("SHCreateMemStream") - - user32 = windows.NewLazySystemDLL("user32") - User32LoadImageW = user32.NewProc("LoadImageW") - User32GetSystemMetrics = user32.NewProc("GetSystemMetrics") - User32RegisterClassExW = user32.NewProc("RegisterClassExW") - User32CreateWindowExW = user32.NewProc("CreateWindowExW") - User32DestroyWindow = user32.NewProc("DestroyWindow") - User32ShowWindow = user32.NewProc("ShowWindow") - User32UpdateWindow = user32.NewProc("UpdateWindow") - User32SetFocus = user32.NewProc("SetFocus") - User32GetMessageW = user32.NewProc("GetMessageW") - User32TranslateMessage = user32.NewProc("TranslateMessage") - User32DispatchMessageW = user32.NewProc("DispatchMessageW") - User32DefWindowProcW = user32.NewProc("DefWindowProcW") - User32GetClientRect = user32.NewProc("GetClientRect") - User32PostQuitMessage = user32.NewProc("PostQuitMessage") - User32SetWindowTextW = user32.NewProc("SetWindowTextW") - User32PostThreadMessageW = user32.NewProc("PostThreadMessageW") - User32GetWindowLongPtrW = user32.NewProc("GetWindowLongPtrW") - User32SetWindowLongPtrW = user32.NewProc("SetWindowLongPtrW") - User32AdjustWindowRect = user32.NewProc("AdjustWindowRect") - User32SetWindowPos = user32.NewProc("SetWindowPos") -) - -const ( - SystemMetricsCxIcon = 11 - SystemMetricsCyIcon = 12 -) - -const ( - SWShow = 5 -) - -const ( - SWPNoZOrder = 0x0004 - SWPNoActivate = 0x0010 - SWPNoMove = 0x0002 - SWPFrameChanged = 0x0020 -) - -const ( - WMDestroy = 0x0002 - WMMove = 0x0003 - WMSize = 0x0005 - WMClose = 0x0010 - WMQuit = 0x0012 - WMGetMinMaxInfo = 0x0024 - WMNCLButtonDown = 0x00A1 - WMMoving = 0x0216 - WMApp = 0x8000 -) - -const ( - GWLStyle = -16 -) - -const ( - WSOverlapped = 0x00000000 - WSMaximizeBox = 0x00020000 - WSThickFrame = 0x00040000 - WSCaption = 0x00C00000 - WSSysMenu = 0x00080000 - WSMinimizeBox = 0x00020000 - WSOverlappedWindow = (WSOverlapped | WSCaption | WSSysMenu | WSThickFrame | WSMinimizeBox | WSMaximizeBox) -) - -type WndClassExW struct { - CbSize uint32 - Style uint32 - LpfnWndProc uintptr - CnClsExtra int32 - CbWndExtra int32 - HInstance windows.Handle - HIcon windows.Handle - HCursor windows.Handle - HbrBackground windows.Handle - LpszMenuName *uint16 - LpszClassName *uint16 - HIconSm windows.Handle -} - -type Rect struct { - Left int32 - Top int32 - Right int32 - Bottom int32 -} - -type MinMaxInfo struct { - PtReserved Point - PtMaxSize Point - PtMaxPosition Point - PtMinTrackSize Point - PtMaxTrackSize Point -} - -type Point struct { - X, Y int32 -} - -type Msg struct { - Hwnd syscall.Handle - Message uint32 - WParam uintptr - LParam uintptr - Time uint32 - Pt Point - LPrivate uint32 -} - -func Utf16PtrToString(p *uint16) string { - if p == nil { - return "" - } - // Find NUL terminator. - end := unsafe.Pointer(p) - n := 0 - for *(*uint16)(end) != 0 { - end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p)) - n++ - } - s := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:n:n] - return string(utf16.Decode(s)) -} - -func SHCreateMemStream(data []byte) (uintptr, error) { - ret, _, err := shlwapiSHCreateMemStream.Call( - uintptr(unsafe.Pointer(&data[0])), - uintptr(len(data)), - ) - if ret == 0 { - return 0, err - } - - return ret, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/bridge.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/bridge.go deleted file mode 100644 index ccf04243f..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/bridge.go +++ /dev/null @@ -1,239 +0,0 @@ -//go:build windows - -package combridge - -import ( - "fmt" - "runtime" - "sync" - "sync/atomic" -) - -var ( - comIfcePointersL sync.RWMutex - comIfcePointers = map[uintptr]*comObject{} // Map from ComInterfacePointer to the Go ComObject -) - -// Resolve the GoInterface of the specified ComInterfacePointer -func Resolve[T IUnknown](ifceP uintptr) T { - comIfcePointersL.RLock() - comObj := comIfcePointers[ifceP] - comIfcePointersL.RUnlock() - - var n T - if comObj != nil { - t := comObj.resolve(ifceP) - if t != nil { - n = t.(T) - } - } - - return n -} - -// New returns a new ComObject which implements the specified Com Interface, com calls will be redirected -// to the specified go interface. -func New[T IUnknown](obj T) *ComObject[T] { - cObj := new( - ifceDef[T]{obj}, - ) - return newComObject[T](cObj) -} - -// New2 returns a new ComObject which implements the two specified Com Interfaces, com calls will be redirected -// to those interfaces accordingly. -// This is needed if a ComObject should implement two interfaces that are not descendants of each other, -// then you get multiple inheritance. -func New2[T IUnknown, T2 IUnknown](obj T, obj2 T2) *ComObject[T] { - cObj := new( - ifceDef[T]{obj}, - ifceDef[T2]{obj2}, - ) - return newComObject[T](cObj) -} - -// new returns a new ComObject which implements multiple specified Com Interfaces, com calls will be redirected -// to the specified go interfaces accordingly. -// This is needed if a ComObject should implement multiple interfaces that are not descendants of each other, -// then you get multiple inheritance. -func new(impls ...ifceImpl) *comObject { - impls = append([]ifceImpl{ifceDef[IUnknown]{}}, impls...) - - cObj := &comObject{ - refCount: 1, - ifces: map[string]int{}, - ifcesImpl: make([]comInterfaceDesc, len(impls)), - } - - for i, ifceDef := range impls { - vtable, err := ifceDef.ifce() - if err != nil { - panic(err) - } - - needsImplement := false - for table := vtable; table != nil; table = table.Parent { - guid := table.ComGUID - if i, found := cObj.ifces[guid]; found { - // This Interface is already implemented - if guid == iUnknownGUID { - // IUnknown is a special interface and never has an user specific implementation - } else if cObj.ifcesImpl[i].impl != ifceDef.impl() { - panic(fmt.Sprintf("Interface '%s' is already implemented by another object", table.Name)) - } - - break - } - - needsImplement = true - cObj.ifces[guid] = i - } - - if !needsImplement { - continue - } - - ifceP, ifcePSlice := allocUintptrObject(1) - ifcePSlice[0] = vtable.ComVTable - cObj.ifcesImpl[i] = comInterfaceDesc{ifceP, ifceDef.impl()} - } - - comIfcePointersL.Lock() - for _, ifceImpl := range cObj.ifcesImpl { - comIfcePointers[ifceImpl.ref] = cObj - } - comIfcePointersL.Unlock() - - return cObj -} - -func newComObject[T IUnknown](comObj *comObject) *ComObject[T] { - c := &ComObject[T]{obj: comObj} - // Make sure to async release since release needs locks and might block the finalizer goroutine for a longer period - runtime.SetFinalizer(c, func(obj *ComObject[T]) { obj.close(true) }) - return c -} - -// ComObject describes an exported go instance to be used as a ComObject which implements -// the specified Interface. -type ComObject[T IUnknown] struct { - obj *comObject - closed int32 -} - -// Ref returns the native uintptr that points to the ComObject that is an interface pointer to T. -// This can be used in native calls. If the object has been closed this function will panic. -func (o *ComObject[T]) Ref() uintptr { - if atomic.LoadInt32(&o.closed) != 0 { - panic("ComObject has been released") - } - return o.obj.queryInterface(guidOf[T](), false) -} - -// Close releases the native com object from the go side. It will only be destroyed if the ref counter -// reaches zero. -// After closing `Ref()` will panic. -func (o *ComObject[T]) Close() error { - o.close(false) - return nil -} - -// close releases the native com object from the go side. It will only be destroyed if the ref counter -// reaches zero. -// After closing `Ref()` will panic. -func (o *ComObject[T]) close(asyncRelease bool) { - if atomic.CompareAndSwapInt32(&o.closed, 0, 1) { - runtime.SetFinalizer(o, nil) - if asyncRelease { - go o.obj.release() - } else { - o.obj.release() - } - } -} - -type comInterfaceDesc struct { - ref uintptr // The native Com InterfacePointer - impl any // The golang target object -} - -type comObject struct { - l sync.Mutex - - refCount int32 - ifces map[string]int // Map of ComInterfaceGUID to Interface Slots - ifcesImpl []comInterfaceDesc // Slots with InterfaceDescriptors -} - -func (c *comObject) queryInterface(ifceGUID string, withAddRef bool) uintptr { - c.l.Lock() - defer c.l.Unlock() - if c.refCount <= 0 { - panic("call on released com object") - } - - i, found := c.ifces[ifceGUID] - if !found { - return 0 - } - - if withAddRef { - c.refCount++ - } - return c.ifcesImpl[i].ref -} - -func (c *comObject) resolve(ifceP uintptr) any { - c.l.Lock() - defer c.l.Unlock() - if c.refCount <= 0 { - panic("call on destroyed com object") - } - - for _, ifce := range c.ifcesImpl { - if ifce.ref != ifceP { - continue - } - - return ifce.impl - } - return nil -} - -func (c *comObject) addRef() int32 { - c.l.Lock() - defer c.l.Unlock() - if c.refCount <= 0 { - panic("call on destroyed com object") - } - - c.refCount++ - return c.refCount -} - -func (c *comObject) release() int32 { - c.l.Lock() - defer c.l.Unlock() - if c.refCount <= 0 { - panic("call on destroyed com object") - } - - if c.refCount--; c.refCount == 0 { - comIfcePointersL.Lock() - for _, ref := range c.ifcesImpl { - delete(comIfcePointers, ref.ref) - } - comIfcePointersL.Unlock() - - for _, impl := range c.ifcesImpl { - ref := impl.ref - if ref == 0 { - continue - } - - globalFree(ref) - } - } - - return c.refCount -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown.go deleted file mode 100644 index 90d7247fe..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown.go +++ /dev/null @@ -1,56 +0,0 @@ -//go:build windows - -package combridge - -import ( - "golang.org/x/sys/windows" -) - -const iUnknownGUID = "{00000000-0000-0000-C000-000000000046}" - -func init() { - registerVTableInternal[IUnknown, IUnknown]( - iUnknownGUID, - true, - iUnknownQueryInterface, - iUnknownAddRef, - iUnknownRelease, - ) -} - -type IUnknown interface{} - -func iUnknownQueryInterface(this uintptr, refiid *windows.GUID, ppvObject *uintptr) uintptr { - if refiid == nil || ppvObject == nil { - return uintptr(windows.E_INVALIDARG) - } - - comIfcePointersL.RLock() - obj := comIfcePointers[this] - comIfcePointersL.RUnlock() - - ref := obj.queryInterface(refiid.String(), true) - if ref != 0 { - *ppvObject = ref - return windows.NO_ERROR - } - - *ppvObject = 0 - return uintptr(windows.E_NOINTERFACE) -} - -func iUnknownAddRef(this uintptr) uintptr { - comIfcePointersL.RLock() - obj := comIfcePointers[this] - comIfcePointersL.RUnlock() - - return uintptr(obj.addRef()) -} - -func iUnknownRelease(this uintptr) uintptr { - comIfcePointersL.RLock() - obj := comIfcePointers[this] - comIfcePointersL.RUnlock() - - return uintptr(obj.release()) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown_impl.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown_impl.go deleted file mode 100644 index 4c748d461..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/iunknown_impl.go +++ /dev/null @@ -1,74 +0,0 @@ -//go:build windows - -package combridge - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -// IUnknownFromPointer cast a generic pointer into a IUnknownImpl pointer -func IUnknownFromPointer(ref unsafe.Pointer) *IUnknownImpl { - return (*IUnknownImpl)(ref) -} - -// IUnknownFromPointer cast native pointer into a IUnknownImpl pointer -func IUnknownFromUintptr(ref uintptr) *IUnknownImpl { - return IUnknownFromPointer(unsafe.Pointer(ref)) -} - -type IUnknownVtbl struct { - queryInterface uintptr - addRef uintptr - release uintptr -} - -func (i *IUnknownVtbl) QueryInterface(this unsafe.Pointer, refiid *windows.GUID, ppvObject **IUnknownImpl) error { - r, _, _ := syscall.SyscallN( - i.queryInterface, - uintptr(this), - uintptr(unsafe.Pointer(refiid)), - uintptr(unsafe.Pointer(ppvObject)), - ) - - if r != uintptr(windows.S_OK) { - return syscall.Errno(r) - } - - return nil -} - -func (i *IUnknownVtbl) AddRef(this unsafe.Pointer) uint32 { - r, _, _ := syscall.SyscallN( - i.addRef, - uintptr(this), - ) - return uint32(r) -} - -func (i *IUnknownVtbl) Release(this unsafe.Pointer) uint32 { - r, _, _ := syscall.SyscallN( - i.release, - uintptr(this), - ) - - return uint32(r) -} - -type IUnknownImpl struct { - vtbl *IUnknownVtbl -} - -func (i *IUnknownImpl) QueryInterface(refiid *windows.GUID, ppvObject **IUnknownImpl) error { - return i.vtbl.QueryInterface(unsafe.Pointer(i), refiid, ppvObject) -} - -func (i *IUnknownImpl) AddRef() uint32 { - return i.vtbl.AddRef(unsafe.Pointer(i)) -} - -func (i *IUnknownImpl) Release() uint32 { - return i.vtbl.Release(unsafe.Pointer(i)) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/syscall.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/syscall.go deleted file mode 100644 index 17b7f500e..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/syscall.go +++ /dev/null @@ -1,39 +0,0 @@ -//go:build windows - -package combridge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - procGlobalAlloc = modkernel32.NewProc("GlobalAlloc") - procGlobalFree = modkernel32.NewProc("GlobalFree") - - uintptrSize = unsafe.Sizeof(uintptr(0)) -) - -func allocUintptrObject(size int) (uintptr, []uintptr) { - v := globalAlloc(uintptr(size) * uintptrSize) - slice := unsafe.Slice((*uintptr)(unsafe.Pointer(v)), size) - return v, slice -} - -func globalAlloc(dwBytes uintptr) uintptr { - ret, _, _ := procGlobalAlloc.Call(uintptr(0), dwBytes) - if ret == 0 { - panic("globalAlloc failed") - } - - return ret -} - -func globalFree(data uintptr) { - ret, _, _ := procGlobalFree.Call(data) - if ret != 0 { - panic("globalFree failed") - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/vtables.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/vtables.go deleted file mode 100644 index b099a7848..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/combridge/vtables.go +++ /dev/null @@ -1,147 +0,0 @@ -//go:build windows - -package combridge - -import ( - "fmt" - "reflect" - "sync" - - "golang.org/x/sys/windows" -) - -var ( - vTablesL sync.Mutex - vTables = make(map[string]*vTable) -) - -// RegisterVTable registers the vtable trampoline methods for the specified ComInterface -// TBase is the base interface of T, and must be another ComInterface which roots in IUnknown or IUnknown itself. -// The first paramter of the fn is always the uintptr of the ComObject and the GoObject can be resolved with Resolve(). -// After having resolved the GoObject the call must be redirected to the GoObject. -// Typically a trampoline FN looks like this. -// -// func _ICoreWebView2NavigationCompletedEventHandlerInvoke(this uintptr, sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) uintptr { -// return combridge.Resolve[_ICoreWebView2NavigationCompletedEventHandler](this).NavigationCompleted(sender, args) -// } -// -// The order of registration must be in the correct order as specified in the IDL of the interface. -func RegisterVTable[TParent, T IUnknown](guid string, fns ...interface{}) { - registerVTableInternal[TParent, T](guid, false, fns...) -} - -type vTable struct { - Parent *vTable - - Name string - ComGUID string - ComVTable uintptr - ComProcs []uintptr -} - -func registerVTableInternal[TParent, T IUnknown](guid string, isInternal bool, fns ...interface{}) { - vTablesL.Lock() - defer vTablesL.Unlock() - - t, tName := typeInterfaceToString[T]() - tParent, tParentName := typeInterfaceToString[TParent]() - if !t.Implements(tParent) { - panic(fmt.Errorf("RegisterVTable '%s': '%s' must implement '%s'", tName, tName, tParentName)) - } - - if !isInternal { - if t == reflect.TypeOf((*IUnknown)(nil)).Elem() { - panic(fmt.Errorf("RegisterVTable '%s' IUnknown can't be registered", tName)) - } - - if t == tParent { - panic(fmt.Errorf("RegisterVTable '%s': T and TParent can't be the same type", tName)) - } - } - - var parent *vTable - var parentProcs []uintptr - var parentProcsCount int - if t != tParent { - parent = vTables[tParentName] - if parent == nil { - panic(fmt.Errorf("RegisterVTable '%s': Parent VTable '%s' not registered", tName, tParentName)) - } - - parentProcs = parent.ComProcs - parentProcsCount = len(parentProcs) - } - - comGuid, err := windows.GUIDFromString(guid) - if err != nil { - panic(fmt.Errorf("RegisterVTable '%s': invalid guid: %s", tName, err)) - } - - vTable := &vTable{ - Parent: parent, - Name: tName, - ComGUID: comGuid.String(), - } - vTable.ComVTable, vTable.ComProcs = allocUintptrObject(parentProcsCount + len(fns)) - - for i, proc := range parentProcs { - vTable.ComProcs[i] = proc - } - - for i, fn := range fns { - vTable.ComProcs[parentProcsCount+i] = windows.NewCallback(fn) - } - - vTables[tName] = vTable -} - -func typeInterfaceToString[T any]() (reflect.Type, string) { - t := reflect.TypeOf((*T)(nil)) - if t.Kind() != reflect.Pointer { - panic("must be a (*yourInterfaceType)(nil)") - } - t = t.Elem() - return t, t.PkgPath() + "/" + t.Name() -} - -func typeInterfaceToStringOnly[T any]() string { - _, nane := typeInterfaceToString[T]() - return nane -} - -func guidOf[T any]() string { - vtable := vTableOf[T]() - if vtable == nil { - return "" - } - return vtable.ComGUID -} - -func vTableOf[T any]() *vTable { - name := typeInterfaceToStringOnly[T]() - vTablesL.Lock() - defer vTablesL.Unlock() - - return vTables[name] -} - -type ifceImpl interface { - impl() any - ifce() (*vTable, error) -} - -type ifceDef[T any] struct { - objImpl any -} - -func (i ifceDef[T]) impl() any { - return i.objImpl -} - -func (i ifceDef[T]) ifce() (*vTable, error) { - vtable := vTableOf[T]() - if vtable == nil { - return nil, fmt.Errorf("Unable to find vTable for %s", typeInterfaceToStringOnly[T]()) - } - return vtable, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go deleted file mode 100644 index 429ecef24..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_COLOR struct { - A uint8 - R uint8 - G uint8 - B uint8 -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go deleted file mode 100644 index ed106ed44..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND uint32 - -const ( - COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND_DENY = iota - COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND_ALLOW - COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND_DENY_CORS -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go deleted file mode 100644 index 607147535..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_KEY_EVENT_KIND uint32 - -const ( - COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN = 0 - COREWEBVIEW2_KEY_EVENT_KIND_KEY_UP = 1 - COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_DOWN = 2 - COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_UP = 3 -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go deleted file mode 100644 index c1679cc37..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_MOVE_FOCUS_REASON uint32 - -const ( - COREWEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC = 0 - COREWEBVIEW2_MOVE_FOCUS_REASON_NEXT = 1 - COREWEBVIEW2_MOVE_FOCUS_REASON_PREVIOUS = 2 -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go deleted file mode 100644 index dd8834255..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_PHYSICAL_KEY_STATUS struct { - RepeatCount uint32 - ScanCode uint32 - IsExtendedKey bool - IsMenuKeyDown bool - WasKeyDown bool - IsKeyReleased bool -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go deleted file mode 100644 index a7e9aa339..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go +++ /dev/null @@ -1,49 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_PROCESS_FAILED_KIND uint32 - -const ( - // Indicates that the browser process ended unexpectedly. The WebView - // automatically moves to the Closed state. The app has to recreate a new - // WebView to recover from this failure. - COREWEBVIEW2_PROCESS_FAILED_KIND_BROWSER_PROCESS_EXITED = 0 - - // Indicates that the main frame's render process ended unexpectedly. A new - // render process is created automatically and navigated to an error page. - // You can use the `Reload` method to try to reload the page that failed. - COREWEBVIEW2_PROCESS_FAILED_KIND_RENDER_PROCESS_EXITED = 1 - - // Indicates that the main frame's render process is unresponsive. - // - // Note that this does not seem to work right now. - // Does not fire for simple long running script case, the only related test - // SitePerProcessBrowserTest::NoCommitTimeoutForInvisibleWebContents is - // disabled. - COREWEBVIEW2_PROCESS_FAILED_KIND_RENDER_PROCESS_UNRESPONSIVE = 2 - - // Indicates that a frame-only render process ended unexpectedly. The process - // exit does not affect the top-level document, only a subset of the - // subframes within it. The content in these frames is replaced with an error - // page in the frame. - COREWEBVIEW2_PROCESS_FAILED_KIND_FRAME_RENDER_PROCESS_EXITED = 3 - - // Indicates that a utility process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_UTILITY_PROCESS_EXITED = 4 - - // Indicates that a sandbox helper process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_SANDBOX_HELPER_PROCESS_EXITED = 5 - - // Indicates that the GPU process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_GPU_PROCESS_EXITED = 6 - - // Indicates that a PPAPI plugin process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_PPAPI_PLUGIN_PROCESS_EXITED = 7 - - // Indicates that a PPAPI plugin broker process ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_PPAPI_BROKER_PROCESS_EXITED = 8 - - // Indicates that a process of unspecified kind ended unexpectedly. - COREWEBVIEW2_PROCESS_FAILED_KIND_UNKNOWN_PROCESS_EXITED = 9 -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go deleted file mode 100644 index 2e9261d0e..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go +++ /dev/null @@ -1,25 +0,0 @@ -//go:build windows - -package edge - -type COREWEBVIEW2_WEB_RESOURCE_CONTEXT uint32 - -const ( - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL = 0 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_DOCUMENT = 1 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_STYLESHEET = 2 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_IMAGE = 3 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_MEDIA = 4 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_FONT = 5 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_SCRIPT = 6 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST = 7 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_FETCH = 8 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_TEXT_TRACK = 9 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_EVENT_SOURCE = 10 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_WEBSOCKET = 11 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_MANIFEST = 12 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_SIGNED_EXCHANGE = 13 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_PING = 14 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_CSP_VIOLATION_REPORT = 15 - COREWEBVIEW2_WEB_RESOURCE_CONTEXT_OTHER = 16 -) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go deleted file mode 100644 index 2a3a9c823..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go +++ /dev/null @@ -1,79 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2AcceleratorKeyPressedEventArgsVtbl struct { - _IUnknownVtbl - GetKeyEventKind ComProc - GetVirtualKey ComProc - GetKeyEventLParam ComProc - GetPhysicalKeyStatus ComProc - GetHandled ComProc - PutHandled ComProc -} - -type ICoreWebView2AcceleratorKeyPressedEventArgs struct { - vtbl *_ICoreWebView2AcceleratorKeyPressedEventArgsVtbl -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) GetKeyEventKind() (COREWEBVIEW2_KEY_EVENT_KIND, error) { - var err error - var keyEventKind COREWEBVIEW2_KEY_EVENT_KIND - _, _, err = i.vtbl.GetKeyEventKind.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&keyEventKind)), - ) - if err != windows.ERROR_SUCCESS { - return 0, err - } - return keyEventKind, nil -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) GetVirtualKey() (uint, error) { - var err error - var virtualKey uint - _, _, err = i.vtbl.GetVirtualKey.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&virtualKey)), - ) - if err != windows.ERROR_SUCCESS { - return 0, err - } - return virtualKey, nil -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) GetPhysicalKeyStatus() (COREWEBVIEW2_PHYSICAL_KEY_STATUS, error) { - var err error - var physicalKeyStatus COREWEBVIEW2_PHYSICAL_KEY_STATUS - _, _, err = i.vtbl.GetPhysicalKeyStatus.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&physicalKeyStatus)), - ) - if err != windows.ERROR_SUCCESS { - return COREWEBVIEW2_PHYSICAL_KEY_STATUS{}, err - } - return physicalKeyStatus, nil -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) PutHandled(handled bool) error { - var err error - - _, _, err = i.vtbl.PutHandled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(handled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go deleted file mode 100644 index 2c276560b..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go +++ /dev/null @@ -1,53 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2AcceleratorKeyPressedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type ICoreWebView2AcceleratorKeyPressedEventHandler struct { - vtbl *_ICoreWebView2AcceleratorKeyPressedEventHandlerVtbl - impl _ICoreWebView2AcceleratorKeyPressedEventHandlerImpl -} - -func (i *ICoreWebView2AcceleratorKeyPressedEventHandler) AddRef() uintptr { - return i.AddRef() -} -func _ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownQueryInterface(this *ICoreWebView2AcceleratorKeyPressedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownAddRef(this *ICoreWebView2AcceleratorKeyPressedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownRelease(this *ICoreWebView2AcceleratorKeyPressedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2AcceleratorKeyPressedEventHandlerInvoke(this *ICoreWebView2AcceleratorKeyPressedEventHandler, sender *ICoreWebView2Controller, args *ICoreWebView2AcceleratorKeyPressedEventArgs) uintptr { - return this.impl.AcceleratorKeyPressed(sender, args) -} - -type _ICoreWebView2AcceleratorKeyPressedEventHandlerImpl interface { - _IUnknownImpl - AcceleratorKeyPressed(sender *ICoreWebView2Controller, args *ICoreWebView2AcceleratorKeyPressedEventArgs) uintptr -} - -var _ICoreWebView2AcceleratorKeyPressedEventHandlerFn = _ICoreWebView2AcceleratorKeyPressedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2AcceleratorKeyPressedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2AcceleratorKeyPressedEventHandlerInvoke), -} - -func newICoreWebView2AcceleratorKeyPressedEventHandler(impl _ICoreWebView2AcceleratorKeyPressedEventHandlerImpl) *ICoreWebView2AcceleratorKeyPressedEventHandler { - return &ICoreWebView2AcceleratorKeyPressedEventHandler{ - vtbl: &_ICoreWebView2AcceleratorKeyPressedEventHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller.go deleted file mode 100644 index c95a00ade..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller.go +++ /dev/null @@ -1,160 +0,0 @@ -//go:build windows - -package edge - -import ( - "math" - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - "golang.org/x/sys/windows" -) - -type _ICoreWebView2ControllerVtbl struct { - _IUnknownVtbl - GetIsVisible ComProc - PutIsVisible ComProc - GetBounds ComProc - PutBounds ComProc - GetZoomFactor ComProc - PutZoomFactor ComProc - AddZoomFactorChanged ComProc - RemoveZoomFactorChanged ComProc - SetBoundsAndZoomFactor ComProc - MoveFocus ComProc - AddMoveFocusRequested ComProc - RemoveMoveFocusRequested ComProc - AddGotFocus ComProc - RemoveGotFocus ComProc - AddLostFocus ComProc - RemoveLostFocus ComProc - AddAcceleratorKeyPressed ComProc - RemoveAcceleratorKeyPressed ComProc - GetParentWindow ComProc - PutParentWindow ComProc - NotifyParentWindowPositionChanged ComProc - Close ComProc - GetCoreWebView2 ComProc -} - -type ICoreWebView2Controller struct { - vtbl *_ICoreWebView2ControllerVtbl -} - -func (i *ICoreWebView2Controller) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2Controller) GetBounds() (*w32.Rect, error) { - var err error - var bounds w32.Rect - _, _, err = i.vtbl.GetBounds.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&bounds)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - return &bounds, nil -} - -func (i *ICoreWebView2Controller) PutBounds(bounds w32.Rect) error { - var err error - - _, _, err = i.vtbl.PutBounds.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&bounds)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) MoveFocus(reason COREWEBVIEW2_MOVE_FOCUS_REASON) error { - var err error - - _, _, err = i.vtbl.MoveFocus.Call( - uintptr(unsafe.Pointer(i)), - uintptr(reason), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) AddAcceleratorKeyPressed(eventHandler *ICoreWebView2AcceleratorKeyPressedEventHandler, token *_EventRegistrationToken) error { - var err error - _, _, err = i.vtbl.AddAcceleratorKeyPressed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(eventHandler)), - uintptr(unsafe.Pointer(&token)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) PutIsVisible(isVisible bool) error { - var err error - - _, _, err = i.vtbl.PutIsVisible.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isVisible)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) GetICoreWebView2Controller2() *ICoreWebView2Controller2 { - - var result *ICoreWebView2Controller2 - - iidICoreWebView2Controller2 := NewGUID("{c979903e-d4ca-4228-92eb-47ee3fa96eab}") - i.vtbl.QueryInterface.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(iidICoreWebView2Controller2)), - uintptr(unsafe.Pointer(&result))) - - return result -} - -func (i *ICoreWebView2Controller) NotifyParentWindowPositionChanged() error { - var err error - _, _, err = i.vtbl.NotifyParentWindowPositionChanged.Call( - uintptr(unsafe.Pointer(i)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) PutZoomFactor(zoomFactor float64) error { - var err error - _, _, err = i.vtbl.PutZoomFactor.Call( - uintptr(unsafe.Pointer(i)), - uintptr(math.Float64bits(zoomFactor)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Controller) GetZoomFactor() (float64, error) { - var err error - var zoomFactorUint64 uint64 - _, _, err = i.vtbl.GetZoomFactor.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&zoomFactorUint64)), - ) - if err != windows.ERROR_SUCCESS { - return 0.0, err - } - return math.Float64frombits(zoomFactorUint64), nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller2.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller2.go deleted file mode 100644 index eff315a91..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Controller2.go +++ /dev/null @@ -1,75 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2Controller2Vtbl struct { - _IUnknownVtbl - GetIsVisible ComProc - PutIsVisible ComProc - GetBounds ComProc - PutBounds ComProc - GetZoomFactor ComProc - PutZoomFactor ComProc - AddZoomFactorChanged ComProc - RemoveZoomFactorChanged ComProc - SetBoundsAndZoomFactor ComProc - MoveFocus ComProc - AddMoveFocusRequested ComProc - RemoveMoveFocusRequested ComProc - AddGotFocus ComProc - RemoveGotFocus ComProc - AddLostFocus ComProc - RemoveLostFocus ComProc - AddAcceleratorKeyPressed ComProc - RemoveAcceleratorKeyPressed ComProc - GetParentWindow ComProc - PutParentWindow ComProc - NotifyParentWindowPositionChanged ComProc - Close ComProc - GetCoreWebView2 ComProc - GetDefaultBackgroundColor ComProc - PutDefaultBackgroundColor ComProc -} - -type ICoreWebView2Controller2 struct { - vtbl *_ICoreWebView2Controller2Vtbl -} - -func (i *ICoreWebView2Controller2) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2Controller2) GetDefaultBackgroundColor() (*COREWEBVIEW2_COLOR, error) { - var err error - var backgroundColor *COREWEBVIEW2_COLOR - _, _, err = i.vtbl.GetDefaultBackgroundColor.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&backgroundColor)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - return backgroundColor, nil -} - -func (i *ICoreWebView2Controller2) PutDefaultBackgroundColor(backgroundColor COREWEBVIEW2_COLOR) error { - var err error - - // Cast to a uint32 as that's what the call is expecting - col := *(*uint32)(unsafe.Pointer(&backgroundColor)) - - _, _, err = i.vtbl.PutDefaultBackgroundColor.Call( - uintptr(unsafe.Pointer(i)), - uintptr(col), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go deleted file mode 100644 index c0e4d13b7..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go +++ /dev/null @@ -1,53 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2CreateCoreWebView2ControllerCompletedHandler struct { - vtbl *_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl - impl _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerImpl -} - -func (i *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler) AddRef() uintptr { - return i.AddRef() -} -func _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownQueryInterface(this *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownAddRef(this *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownRelease(this *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerInvoke(this *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler, errorCode uintptr, createdController *ICoreWebView2Controller) uintptr { - return this.impl.CreateCoreWebView2ControllerCompleted(errorCode, createdController) -} - -type _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerImpl interface { - _IUnknownImpl - CreateCoreWebView2ControllerCompleted(errorCode uintptr, createdController *ICoreWebView2Controller) uintptr -} - -var _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerFn = _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerInvoke), -} - -func newICoreWebView2CreateCoreWebView2ControllerCompletedHandler(impl _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerImpl) *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler { - return &iCoreWebView2CreateCoreWebView2ControllerCompletedHandler{ - vtbl: &_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go deleted file mode 100644 index 0c9eacb46..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go +++ /dev/null @@ -1,78 +0,0 @@ -//go:build windows - -package edge - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2HttpHeadersCollectionIteratorVtbl struct { - _IUnknownVtbl - GetCurrentHeader ComProc - GetHasCurrentHeader ComProc - MoveNext ComProc -} - -type ICoreWebView2HttpHeadersCollectionIterator struct { - vtbl *_ICoreWebView2HttpHeadersCollectionIteratorVtbl -} - -func (i *ICoreWebView2HttpHeadersCollectionIterator) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} - -func (i *ICoreWebView2HttpHeadersCollectionIterator) HasCurrentHeader() (bool, error) { - var hasHeader int32 - res, _, err := i.vtbl.GetHasCurrentHeader.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&hasHeader)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - if windows.Handle(res) != windows.S_OK { - return false, syscall.Errno(res) - } - return hasHeader != 0, nil -} - -func (i *ICoreWebView2HttpHeadersCollectionIterator) GetCurrentHeader() (string, string, error) { - // Create *uint16 to hold result - var _name *uint16 - var _value *uint16 - res, _, err := i.vtbl.GetCurrentHeader.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&_name)), - uintptr(unsafe.Pointer(&_value)), - ) - if err != windows.ERROR_SUCCESS { - return "", "", err - } - if windows.Handle(res) != windows.S_OK { - return "", "", syscall.Errno(res) - } - // Get result and cleanup - name := windows.UTF16PtrToString(_name) - windows.CoTaskMemFree(unsafe.Pointer(_name)) - value := windows.UTF16PtrToString(_value) - windows.CoTaskMemFree(unsafe.Pointer(_value)) - return name, value, nil -} - -func (i *ICoreWebView2HttpHeadersCollectionIterator) MoveNext() (bool, error) { - var next int32 - res, _, err := i.vtbl.MoveNext.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&next)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - if windows.Handle(res) != windows.S_OK { - return false, syscall.Errno(res) - } - return next != 0, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go deleted file mode 100644 index 5a147b299..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go +++ /dev/null @@ -1,101 +0,0 @@ -//go:build windows - -package edge - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -const ( - ERROR_ELEMENT_NOT_FOUND syscall.Errno = 0x80070490 -) - -type _ICoreWebView2HttpRequestHeadersVtbl struct { - _IUnknownVtbl - GetHeader ComProc - GetHeaders ComProc - Contains ComProc - SetHeader ComProc - RemoveHeader ComProc - GetIterator ComProc -} - -type ICoreWebView2HttpRequestHeaders struct { - vtbl *_ICoreWebView2HttpRequestHeadersVtbl -} - -func (i *ICoreWebView2HttpRequestHeaders) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} - -// GetHeader returns the value of the specified header. If the header is not found -// ERROR_ELEMENT_NOT_FOUND is returned as error. -func (i *ICoreWebView2HttpRequestHeaders) GetHeader(name string) (string, error) { - _name, err := windows.UTF16PtrFromString(name) - if err != nil { - return "", nil - } - - var _value *uint16 - res, _, err := i.vtbl.GetHeader.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_name)), - uintptr(unsafe.Pointer(&_value)), - ) - if err != windows.ERROR_SUCCESS { - return "", err - } - if windows.Handle(res) != windows.S_OK { - return "", syscall.Errno(res) - } - - value := windows.UTF16PtrToString(_value) - windows.CoTaskMemFree(unsafe.Pointer(_value)) - return value, nil -} - -// SetHeader sets the specified header to the value. -func (i *ICoreWebView2HttpRequestHeaders) SetHeader(name, value string) error { - _name, err := windows.UTF16PtrFromString(name) - if err != nil { - return nil - } - - _value, err := windows.UTF16PtrFromString(value) - if err != nil { - return nil - } - - res, _, err := i.vtbl.SetHeader.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_name)), - uintptr(unsafe.Pointer(_value)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - if windows.Handle(res) != windows.S_OK { - return syscall.Errno(res) - } - return nil -} - -// GetIterator returns an iterator over the collection of request headers. Make sure to call -// Release on the returned Object after finished using it. -func (i *ICoreWebView2HttpRequestHeaders) GetIterator() (*ICoreWebView2HttpHeadersCollectionIterator, error) { - var headers *ICoreWebView2HttpHeadersCollectionIterator - res, _, err := i.vtbl.GetIterator.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&headers)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - if windows.Handle(res) != windows.S_OK { - return nil, syscall.Errno(res) - } - return headers, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go deleted file mode 100644 index c3998e0a2..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go +++ /dev/null @@ -1,18 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2NavigationCompletedEventArgsVtbl struct { - _IUnknownVtbl - GetIsSuccess ComProc - GetWebErrorStatus ComProc - GetNavigationId ComProc -} - -type ICoreWebView2NavigationCompletedEventArgs struct { - vtbl *_ICoreWebView2NavigationCompletedEventArgsVtbl -} - -func (i *ICoreWebView2NavigationCompletedEventArgs) AddRef() uintptr { - return i.AddRef() -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go deleted file mode 100644 index 456da5074..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go +++ /dev/null @@ -1,53 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2NavigationCompletedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type ICoreWebView2NavigationCompletedEventHandler struct { - vtbl *_ICoreWebView2NavigationCompletedEventHandlerVtbl - impl _ICoreWebView2NavigationCompletedEventHandlerImpl -} - -func (i *ICoreWebView2NavigationCompletedEventHandler) AddRef() uintptr { - return i.AddRef() -} -func _ICoreWebView2NavigationCompletedEventHandlerIUnknownQueryInterface(this *ICoreWebView2NavigationCompletedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2NavigationCompletedEventHandlerIUnknownAddRef(this *ICoreWebView2NavigationCompletedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2NavigationCompletedEventHandlerIUnknownRelease(this *ICoreWebView2NavigationCompletedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2NavigationCompletedEventHandlerInvoke(this *ICoreWebView2NavigationCompletedEventHandler, sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) uintptr { - return this.impl.NavigationCompleted(sender, args) -} - -type _ICoreWebView2NavigationCompletedEventHandlerImpl interface { - _IUnknownImpl - NavigationCompleted(sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) uintptr -} - -var _ICoreWebView2NavigationCompletedEventHandlerFn = _ICoreWebView2NavigationCompletedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2NavigationCompletedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2NavigationCompletedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2NavigationCompletedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2NavigationCompletedEventHandlerInvoke), -} - -func newICoreWebView2NavigationCompletedEventHandler(impl _ICoreWebView2NavigationCompletedEventHandlerImpl) *ICoreWebView2NavigationCompletedEventHandler { - return &ICoreWebView2NavigationCompletedEventHandler{ - vtbl: &_ICoreWebView2NavigationCompletedEventHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go deleted file mode 100644 index b6d3cda1b..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go +++ /dev/null @@ -1,41 +0,0 @@ -//go:build windows - -package edge - -import ( - "fmt" - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2ProcessFailedEventArgsVtbl struct { - _IUnknownVtbl - GetProcessFailedKind ComProc -} - -type ICoreWebView2ProcessFailedEventArgs struct { - vtbl *_ICoreWebView2ProcessFailedEventArgsVtbl -} - -func (i *ICoreWebView2ProcessFailedEventArgs) GetProcessFailedKind() (COREWEBVIEW2_PROCESS_FAILED_KIND, error) { - kind := COREWEBVIEW2_PROCESS_FAILED_KIND(0xffffffff) - hr, _, err := i.vtbl.GetProcessFailedKind.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&kind)), - ) - - if windows.Handle(hr) != windows.S_OK { - return 0, syscall.Errno(hr) - } - - if kind == 0xffffffff { - if err == nil { - err = fmt.Errorf("unknown error") - } - return 0, err - } - - return kind, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go deleted file mode 100644 index fc8c7369c..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go +++ /dev/null @@ -1,53 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2ProcessFailedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type ICoreWebView2ProcessFailedEventHandler struct { - vtbl *_ICoreWebView2ProcessFailedEventHandlerVtbl - impl _ICoreWebView2ProcessFailedEventHandlerImpl -} - -func (i *ICoreWebView2ProcessFailedEventHandler) AddRef() uintptr { - return i.AddRef() -} -func _ICoreWebView2ProcessFailedEventHandlerIUnknownQueryInterface(this *ICoreWebView2ProcessFailedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2ProcessFailedEventHandlerIUnknownAddRef(this *ICoreWebView2ProcessFailedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2ProcessFailedEventHandlerIUnknownRelease(this *ICoreWebView2ProcessFailedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2ProcessFailedEventHandlerInvoke(this *ICoreWebView2ProcessFailedEventHandler, sender *ICoreWebView2, args *ICoreWebView2ProcessFailedEventArgs) uintptr { - return this.impl.ProcessFailed(sender, args) -} - -type _ICoreWebView2ProcessFailedEventHandlerImpl interface { - _IUnknownImpl - ProcessFailed(sender *ICoreWebView2, args *ICoreWebView2ProcessFailedEventArgs) uintptr -} - -var _ICoreWebView2ProcessFailedEventHandlerFn = _ICoreWebView2ProcessFailedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2ProcessFailedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2ProcessFailedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2ProcessFailedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2ProcessFailedEventHandlerInvoke), -} - -func newICoreWebView2ProcessFailedEventHandler(impl _ICoreWebView2ProcessFailedEventHandlerImpl) *ICoreWebView2ProcessFailedEventHandler { - return &ICoreWebView2ProcessFailedEventHandler{ - vtbl: &_ICoreWebView2ProcessFailedEventHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Settings.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Settings.go deleted file mode 100644 index a4ba613d2..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2Settings.go +++ /dev/null @@ -1,271 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2SettingsVtbl struct { - _IUnknownVtbl - GetIsScriptEnabled ComProc - PutIsScriptEnabled ComProc - GetIsWebMessageEnabled ComProc - PutIsWebMessageEnabled ComProc - GetAreDefaultScriptDialogsEnabled ComProc - PutAreDefaultScriptDialogsEnabled ComProc - GetIsStatusBarEnabled ComProc - PutIsStatusBarEnabled ComProc - GetAreDevToolsEnabled ComProc - PutAreDevToolsEnabled ComProc - GetAreDefaultContextMenusEnabled ComProc - PutAreDefaultContextMenusEnabled ComProc - GetAreHostObjectsAllowed ComProc - PutAreHostObjectsAllowed ComProc - GetIsZoomControlEnabled ComProc - PutIsZoomControlEnabled ComProc - GetIsBuiltInErrorPageEnabled ComProc - PutIsBuiltInErrorPageEnabled ComProc -} - -type ICoreWebView2Settings struct { - vtbl *_ICoreWebView2SettingsVtbl -} - -func (i *ICoreWebView2Settings) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2Settings) GetIsScriptEnabled() (bool, error) { - var err error - var isScriptEnabled bool - _, _, err = i.vtbl.GetIsScriptEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isScriptEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isScriptEnabled, nil -} - -func (i *ICoreWebView2Settings) PutIsScriptEnabled(isScriptEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsScriptEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isScriptEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetIsWebMessageEnabled() (bool, error) { - var err error - var isWebMessageEnabled bool - _, _, err = i.vtbl.GetIsWebMessageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isWebMessageEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isWebMessageEnabled, nil -} - -func (i *ICoreWebView2Settings) PutIsWebMessageEnabled(isWebMessageEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsWebMessageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isWebMessageEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetAreDefaultScriptDialogsEnabled() (bool, error) { - var err error - var areDefaultScriptDialogsEnabled bool - _, _, err = i.vtbl.GetAreDefaultScriptDialogsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&areDefaultScriptDialogsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return areDefaultScriptDialogsEnabled, nil -} - -func (i *ICoreWebView2Settings) PutAreDefaultScriptDialogsEnabled(areDefaultScriptDialogsEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutAreDefaultScriptDialogsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(areDefaultScriptDialogsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetIsStatusBarEnabled() (bool, error) { - var err error - var isStatusBarEnabled bool - _, _, err = i.vtbl.GetIsStatusBarEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isStatusBarEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isStatusBarEnabled, nil -} - -func (i *ICoreWebView2Settings) PutIsStatusBarEnabled(isStatusBarEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsStatusBarEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isStatusBarEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetAreDevToolsEnabled() (bool, error) { - var err error - var areDevToolsEnabled bool - _, _, err = i.vtbl.GetAreDevToolsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&areDevToolsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return areDevToolsEnabled, nil -} - -func (i *ICoreWebView2Settings) PutAreDevToolsEnabled(areDevToolsEnabled bool) error { - var err error - _, _, err = i.vtbl.PutAreDevToolsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(areDevToolsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetAreDefaultContextMenusEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetAreDefaultContextMenusEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebView2Settings) PutAreDefaultContextMenusEnabled(enabled bool) error { - var err error - _, _, err = i.vtbl.PutAreDefaultContextMenusEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetAreHostObjectsAllowed() (bool, error) { - var err error - var allowed bool - _, _, err = i.vtbl.GetAreHostObjectsAllowed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&allowed)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return allowed, nil -} - -func (i *ICoreWebView2Settings) PutAreHostObjectsAllowed(allowed bool) error { - var err error - - _, _, err = i.vtbl.PutAreHostObjectsAllowed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(allowed)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetIsZoomControlEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsZoomControlEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebView2Settings) PutIsZoomControlEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsZoomControlEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2Settings) GetIsBuiltInErrorPageEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsBuiltInErrorPageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebView2Settings) PutIsBuiltInErrorPageEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsBuiltInErrorPageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go deleted file mode 100644 index fe7f2cfa2..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go +++ /dev/null @@ -1,102 +0,0 @@ -//go:build windows - -package edge - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2WebResourceRequestVtbl struct { - _IUnknownVtbl - GetUri ComProc - PutUri ComProc - GetMethod ComProc - PutMethod ComProc - GetContent ComProc - PutContent ComProc - GetHeaders ComProc -} - -type ICoreWebView2WebResourceRequest struct { - vtbl *_ICoreWebView2WebResourceRequestVtbl -} - -func (i *ICoreWebView2WebResourceRequest) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2WebResourceRequest) GetMethod() (string, error) { - // Create *uint16 to hold result - var _method *uint16 - res, _, err := i.vtbl.GetMethod.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&_method)), - ) - if err != windows.ERROR_SUCCESS { - return "", err - } - if windows.Handle(res) != windows.S_OK { - return "", syscall.Errno(res) - } - // Get result and cleanup - uri := windows.UTF16PtrToString(_method) - windows.CoTaskMemFree(unsafe.Pointer(_method)) - return uri, nil -} - -func (i *ICoreWebView2WebResourceRequest) GetUri() (string, error) { - var err error - // Create *uint16 to hold result - var _uri *uint16 - _, _, err = i.vtbl.GetUri.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&_uri)), - ) - if err != windows.ERROR_SUCCESS { - return "", err - } // Get result and cleanup - uri := windows.UTF16PtrToString(_uri) - windows.CoTaskMemFree(unsafe.Pointer(_uri)) - return uri, nil -} - -// GetContent returns the body of the request. Returns nil if there's no body. Make sure to call -// Release on the returned IStream after finished using it. -func (i *ICoreWebView2WebResourceRequest) GetContent() (*IStream, error) { - var stream *IStream - res, _, err := i.vtbl.GetContent.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&stream)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - if windows.Handle(res) != windows.S_OK { - return nil, syscall.Errno(res) - } - return stream, nil -} - -// GetHeaders returns the mutable HTTP request headers. Make sure to call -// Release on the returned Object after finished using it. -func (i *ICoreWebView2WebResourceRequest) GetHeaders() (*ICoreWebView2HttpRequestHeaders, error) { - var headers *ICoreWebView2HttpRequestHeaders - res, _, err := i.vtbl.GetHeaders.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&headers)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - if windows.Handle(res) != windows.S_OK { - return nil, syscall.Errno(res) - } - return headers, nil -} - -func (i *ICoreWebView2WebResourceRequest) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go deleted file mode 100644 index 614594e87..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go +++ /dev/null @@ -1,52 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type _ICoreWebView2WebResourceRequestedEventArgsVtbl struct { - _IUnknownVtbl - GetRequest ComProc - GetResponse ComProc - PutResponse ComProc - GetDeferral ComProc - GetResourceContext ComProc -} - -type ICoreWebView2WebResourceRequestedEventArgs struct { - vtbl *_ICoreWebView2WebResourceRequestedEventArgsVtbl -} - -func (i *ICoreWebView2WebResourceRequestedEventArgs) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2WebResourceRequestedEventArgs) PutResponse(response *ICoreWebView2WebResourceResponse) error { - var err error - - _, _, err = i.vtbl.PutResponse.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(response)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2WebResourceRequestedEventArgs) GetRequest() (*ICoreWebView2WebResourceRequest, error) { - var err error - var request *ICoreWebView2WebResourceRequest - _, _, err = i.vtbl.GetRequest.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&request)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - return request, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go deleted file mode 100644 index d0860c3be..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go +++ /dev/null @@ -1,50 +0,0 @@ -//go:build windows - -package edge - -type _ICoreWebView2WebResourceRequestedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2WebResourceRequestedEventHandler struct { - vtbl *_ICoreWebView2WebResourceRequestedEventHandlerVtbl - impl _ICoreWebView2WebResourceRequestedEventHandlerImpl -} - -func _ICoreWebView2WebResourceRequestedEventHandlerIUnknownQueryInterface(this *iCoreWebView2WebResourceRequestedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2WebResourceRequestedEventHandlerIUnknownAddRef(this *iCoreWebView2WebResourceRequestedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2WebResourceRequestedEventHandlerIUnknownRelease(this *iCoreWebView2WebResourceRequestedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2WebResourceRequestedEventHandlerInvoke(this *iCoreWebView2WebResourceRequestedEventHandler, sender *ICoreWebView2, args *ICoreWebView2WebResourceRequestedEventArgs) uintptr { - return this.impl.WebResourceRequested(sender, args) -} - -type _ICoreWebView2WebResourceRequestedEventHandlerImpl interface { - _IUnknownImpl - WebResourceRequested(sender *ICoreWebView2, args *ICoreWebView2WebResourceRequestedEventArgs) uintptr -} - -var _ICoreWebView2WebResourceRequestedEventHandlerFn = _ICoreWebView2WebResourceRequestedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2WebResourceRequestedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2WebResourceRequestedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2WebResourceRequestedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2WebResourceRequestedEventHandlerInvoke), -} - -func newICoreWebView2WebResourceRequestedEventHandler(impl _ICoreWebView2WebResourceRequestedEventHandlerImpl) *iCoreWebView2WebResourceRequestedEventHandler { - return &iCoreWebView2WebResourceRequestedEventHandler{ - vtbl: &_ICoreWebView2WebResourceRequestedEventHandlerFn, - impl: impl, - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go deleted file mode 100644 index dd02e6089..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go +++ /dev/null @@ -1,28 +0,0 @@ -//go:build windows - -package edge - -import "unsafe" - -type _ICoreWebView2WebResourceResponseVtbl struct { - _IUnknownVtbl - GetContent ComProc - PutContent ComProc - GetHeaders ComProc - GetStatusCode ComProc - PutStatusCode ComProc - GetReasonPhrase ComProc - PutReasonPhrase ComProc -} - -type ICoreWebView2WebResourceResponse struct { - vtbl *_ICoreWebView2WebResourceResponseVtbl -} - -func (i *ICoreWebView2WebResourceResponse) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebView2WebResourceResponse) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_2.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_2.go deleted file mode 100644 index 85a4f71fa..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_2.go +++ /dev/null @@ -1,18 +0,0 @@ -//go:build windows - -package edge - -type iCoreWebView2_2Vtbl struct { - iCoreWebView2Vtbl - AddWebResourceResponseReceived ComProc - RemoveWebResourceResponseReceived ComProc - NavigateWithWebResourceRequest ComProc - AddDomContentLoaded ComProc - RemoveDomContentLoaded ComProc - GetCookieManager ComProc - GetEnvironment ComProc -} - -type ICoreWebView2_2 struct { - vtbl *iCoreWebView2_2Vtbl -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_3.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_3.go deleted file mode 100644 index 58424bd6a..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebView2_3.go +++ /dev/null @@ -1,62 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -type iCoreWebView2_3Vtbl struct { - iCoreWebView2_2Vtbl - TrySuspend ComProc - Resume ComProc - GetIsSuspended ComProc - SetVirtualHostNameToFolderMapping ComProc - ClearVirtualHostNameToFolderMapping ComProc -} - -type ICoreWebView2_3 struct { - vtbl *iCoreWebView2_3Vtbl -} - -func (i *ICoreWebView2_3) SetVirtualHostNameToFolderMapping(hostName, folderPath string, accessKind COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND) error { - _hostName, err := windows.UTF16PtrFromString(hostName) - if err != nil { - return err - } - - _folderPath, err := windows.UTF16PtrFromString(folderPath) - if err != nil { - return err - } - - _, _, err = i.vtbl.SetVirtualHostNameToFolderMapping.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_hostName)), - uintptr(unsafe.Pointer(_folderPath)), - uintptr(accessKind), - ) - if err != windows.ERROR_SUCCESS { - return err - } - - return nil -} - -func (i *ICoreWebView2) GetICoreWebView2_3() *ICoreWebView2_3 { - var result *ICoreWebView2_3 - - iidICoreWebView2_3 := NewGUID("{A0D6DF20-3B92-416D-AA0C-437A9C727857}") - _, _, _ = i.vtbl.QueryInterface.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(iidICoreWebView2_3)), - uintptr(unsafe.Pointer(&result))) - - return result -} - -func (e *Chromium) GetICoreWebView2_3() *ICoreWebView2_3 { - return e.webview.GetICoreWebView2_3() -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebViewSettings.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebViewSettings.go deleted file mode 100644 index 6c6b16d74..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/ICoreWebViewSettings.go +++ /dev/null @@ -1,397 +0,0 @@ -//go:build windows - -package edge - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -// ICoreWebviewSettings is the merged settings class - -type _ICoreWebViewSettingsVtbl struct { - _IUnknownVtbl - GetIsScriptEnabled ComProc - PutIsScriptEnabled ComProc - GetIsWebMessageEnabled ComProc - PutIsWebMessageEnabled ComProc - GetAreDefaultScriptDialogsEnabled ComProc - PutAreDefaultScriptDialogsEnabled ComProc - GetIsStatusBarEnabled ComProc - PutIsStatusBarEnabled ComProc - GetAreDevToolsEnabled ComProc - PutAreDevToolsEnabled ComProc - GetAreDefaultContextMenusEnabled ComProc - PutAreDefaultContextMenusEnabled ComProc - GetAreHostObjectsAllowed ComProc - PutAreHostObjectsAllowed ComProc - GetIsZoomControlEnabled ComProc - PutIsZoomControlEnabled ComProc - GetIsBuiltInErrorPageEnabled ComProc - PutIsBuiltInErrorPageEnabled ComProc - GetUserAgent ComProc // ICoreWebView2Settings2: SDK 1.0.864.35 - PutUserAgent ComProc - GetAreBrowserAcceleratorKeysEnabled ComProc // ICoreWebView2Settings3: SDK 1.0.864.35 - PutAreBrowserAcceleratorKeysEnabled ComProc - GetIsPasswordAutosaveEnabled ComProc // ICoreWebView2Settings4: SDK 1.0.902.49 - PutIsPasswordAutosaveEnabled ComProc - GetIsGeneralAutofillEnabled ComProc - PutIsGeneralAutofillEnabled ComProc - GetIsPinchZoomEnabled ComProc // ICoreWebView2Settings5: SDK 1.0.902.49 - PutIsPinchZoomEnabled ComProc - GetIsSwipeNavigationEnabled ComProc // ICoreWebView2Settings6: SDK 1.0.992.28 - PutIsSwipeNavigationEnabled ComProc -} - -type ICoreWebViewSettings struct { - vtbl *_ICoreWebViewSettingsVtbl -} - -func (i *ICoreWebViewSettings) AddRef() uintptr { - return i.AddRef() -} - -func (i *ICoreWebViewSettings) GetIsScriptEnabled() (bool, error) { - var err error - var isScriptEnabled bool - _, _, err = i.vtbl.GetIsScriptEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isScriptEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isScriptEnabled, nil -} - -func (i *ICoreWebViewSettings) PutIsScriptEnabled(isScriptEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsScriptEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isScriptEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsWebMessageEnabled() (bool, error) { - var err error - var isWebMessageEnabled bool - _, _, err = i.vtbl.GetIsWebMessageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isWebMessageEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isWebMessageEnabled, nil -} - -func (i *ICoreWebViewSettings) PutIsWebMessageEnabled(isWebMessageEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsWebMessageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isWebMessageEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreDefaultScriptDialogsEnabled() (bool, error) { - var err error - var areDefaultScriptDialogsEnabled bool - _, _, err = i.vtbl.GetAreDefaultScriptDialogsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&areDefaultScriptDialogsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return areDefaultScriptDialogsEnabled, nil -} - -func (i *ICoreWebViewSettings) PutAreDefaultScriptDialogsEnabled(areDefaultScriptDialogsEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutAreDefaultScriptDialogsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(areDefaultScriptDialogsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsStatusBarEnabled() (bool, error) { - var err error - var isStatusBarEnabled bool - _, _, err = i.vtbl.GetIsStatusBarEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&isStatusBarEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return isStatusBarEnabled, nil -} - -func (i *ICoreWebViewSettings) PutIsStatusBarEnabled(isStatusBarEnabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsStatusBarEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(isStatusBarEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreDevToolsEnabled() (bool, error) { - var err error - var areDevToolsEnabled bool - _, _, err = i.vtbl.GetAreDevToolsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&areDevToolsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return areDevToolsEnabled, nil -} - -func (i *ICoreWebViewSettings) PutAreDevToolsEnabled(areDevToolsEnabled bool) error { - var err error - _, _, err = i.vtbl.PutAreDevToolsEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(areDevToolsEnabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreDefaultContextMenusEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetAreDefaultContextMenusEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutAreDefaultContextMenusEnabled(enabled bool) error { - var err error - _, _, err = i.vtbl.PutAreDefaultContextMenusEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreHostObjectsAllowed() (bool, error) { - var err error - var allowed bool - _, _, err = i.vtbl.GetAreHostObjectsAllowed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&allowed)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return allowed, nil -} - -func (i *ICoreWebViewSettings) PutAreHostObjectsAllowed(allowed bool) error { - var err error - - _, _, err = i.vtbl.PutAreHostObjectsAllowed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(allowed)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsZoomControlEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsZoomControlEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutIsZoomControlEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsZoomControlEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsBuiltInErrorPageEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsBuiltInErrorPageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutIsBuiltInErrorPageEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsBuiltInErrorPageEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetUserAgent() (string, error) { - var err error - // Create *uint16 to hold result - var _userAgent *uint16 - _, _, err = i.vtbl.GetUserAgent.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_userAgent)), - ) - if err != windows.ERROR_SUCCESS { - return "", err - } // Get result and cleanup - userAgent := windows.UTF16PtrToString(_userAgent) - windows.CoTaskMemFree(unsafe.Pointer(_userAgent)) - return userAgent, nil -} - -func (i *ICoreWebViewSettings) PutUserAgent(userAgent string) error { - var err error - // Convert string 'userAgent' to *uint16 - _userAgent, err := windows.UTF16PtrFromString(userAgent) - if err != nil { - return err - } - - _, _, err = i.vtbl.PutUserAgent.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_userAgent)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetAreBrowserAcceleratorKeysEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetAreBrowserAcceleratorKeysEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutAreBrowserAcceleratorKeysEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutAreBrowserAcceleratorKeysEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsPinchZoomEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsPinchZoomEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutIsPinchZoomEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsPinchZoomEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebViewSettings) GetIsSwipeNavigationEnabled() (bool, error) { - var err error - var enabled bool - _, _, err = i.vtbl.GetIsSwipeNavigationEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&enabled)), - ) - if err != windows.ERROR_SUCCESS { - return false, err - } - return enabled, nil -} - -func (i *ICoreWebViewSettings) PutIsSwipeNavigationEnabled(enabled bool) error { - var err error - - _, _, err = i.vtbl.PutIsSwipeNavigationEnabled.Call( - uintptr(unsafe.Pointer(i)), - uintptr(boolToInt(enabled)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/IStream.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/IStream.go deleted file mode 100644 index 9e29ca4f0..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/IStream.go +++ /dev/null @@ -1,54 +0,0 @@ -//go:build windows - -package edge - -import ( - "io" - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -type _IStreamVtbl struct { - _IUnknownVtbl - Read ComProc - Write ComProc -} - -type IStream struct { - vtbl *_IStreamVtbl -} - -func (i *IStream) Release() error { - return i.vtbl.CallRelease(unsafe.Pointer(i)) -} - -func (i *IStream) Read(p []byte) (int, error) { - bufLen := len(p) - if bufLen == 0 { - return 0, nil - } - - var n int - res, _, err := i.vtbl.Read.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&p[0])), - uintptr(bufLen), - uintptr(unsafe.Pointer(&n)), - ) - if err != windows.ERROR_SUCCESS { - return 0, err - } - - switch windows.Handle(res) { - case windows.S_OK: - // The buffer has been completely filled - return n, nil - case windows.S_FALSE: - // The buffer has been filled with less than len data and the stream is EOF - return n, io.EOF - default: - return 0, syscall.Errno(res) - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go deleted file mode 100644 index 376891bb1..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go +++ /dev/null @@ -1,419 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "errors" - "log" - "os" - "path/filepath" - "strings" - "sync/atomic" - "syscall" - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - "golang.org/x/sys/windows" -) - -type Rect = w32.Rect - -type Chromium struct { - hwnd uintptr - controller *ICoreWebView2Controller - webview *ICoreWebView2 - inited uintptr - envCompleted *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler - controllerCompleted *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler - webMessageReceived *iCoreWebView2WebMessageReceivedEventHandler - permissionRequested *iCoreWebView2PermissionRequestedEventHandler - webResourceRequested *iCoreWebView2WebResourceRequestedEventHandler - acceleratorKeyPressed *ICoreWebView2AcceleratorKeyPressedEventHandler - navigationCompleted *ICoreWebView2NavigationCompletedEventHandler - processFailed *ICoreWebView2ProcessFailedEventHandler - - environment *ICoreWebView2Environment - - padding Rect - - // Settings - Debug bool - DataPath string - BrowserPath string - AdditionalBrowserArgs []string - - // permissions - permissions map[CoreWebView2PermissionKind]CoreWebView2PermissionState - globalPermission *CoreWebView2PermissionState - - // Callbacks - MessageCallback func(string) - WebResourceRequestedCallback func(request *ICoreWebView2WebResourceRequest, args *ICoreWebView2WebResourceRequestedEventArgs) - NavigationCompletedCallback func(sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) - ProcessFailedCallback func(sender *ICoreWebView2, args *ICoreWebView2ProcessFailedEventArgs) - AcceleratorKeyCallback func(uint) bool -} - -func NewChromium() *Chromium { - e := &Chromium{} - /* - All these handlers are passed to native code through syscalls with 'uintptr(unsafe.Pointer(handler))' and we know - that a pointer to those will be kept in the native code. Furthermore these handlers als contain pointer to other Go - structs like the vtable. - This violates the unsafe.Pointer rule '(4) Conversion of a Pointer to a uintptr when calling syscall.Syscall.' because - theres no guarantee that Go doesn't move these objects. - AFAIK currently the Go runtime doesn't move HEAP objects, so we should be safe with these handlers. But they don't - guarantee it, because in the future Go might use a compacting GC. - There's a proposal to add a runtime.Pin function, to prevent moving pinned objects, which would allow to easily fix - this issue by just pinning the handlers. The https://go-review.googlesource.com/c/go/+/367296/ should land in Go 1.19. - */ - e.envCompleted = newICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler(e) - e.controllerCompleted = newICoreWebView2CreateCoreWebView2ControllerCompletedHandler(e) - e.webMessageReceived = newICoreWebView2WebMessageReceivedEventHandler(e) - e.permissionRequested = newICoreWebView2PermissionRequestedEventHandler(e) - e.webResourceRequested = newICoreWebView2WebResourceRequestedEventHandler(e) - e.acceleratorKeyPressed = newICoreWebView2AcceleratorKeyPressedEventHandler(e) - e.navigationCompleted = newICoreWebView2NavigationCompletedEventHandler(e) - e.processFailed = newICoreWebView2ProcessFailedEventHandler(e) - e.permissions = make(map[CoreWebView2PermissionKind]CoreWebView2PermissionState) - - return e -} - -func (e *Chromium) Embed(hwnd uintptr) bool { - e.hwnd = hwnd - - dataPath := e.DataPath - if dataPath == "" { - currentExePath := make([]uint16, windows.MAX_PATH) - _, err := windows.GetModuleFileName(windows.Handle(0), ¤tExePath[0], windows.MAX_PATH) - if err != nil { - // What to do here? - return false - } - currentExeName := filepath.Base(windows.UTF16ToString(currentExePath)) - dataPath = filepath.Join(os.Getenv("AppData"), currentExeName) - } - - if e.BrowserPath != "" { - if _, err := os.Stat(e.BrowserPath); errors.Is(err, os.ErrNotExist) { - log.Printf("Browser path %s does not exist", e.BrowserPath) - return false - } - } - - browserArgs := strings.Join(e.AdditionalBrowserArgs, " ") - if err := createCoreWebView2EnvironmentWithOptions(e.BrowserPath, dataPath, e.envCompleted, browserArgs); err != nil { - log.Printf("Error calling Webview2Loader: %v", err) - return false - } - - var msg w32.Msg - for { - if atomic.LoadUintptr(&e.inited) != 0 { - break - } - r, _, _ := w32.User32GetMessageW.Call( - uintptr(unsafe.Pointer(&msg)), - 0, - 0, - 0, - ) - if r == 0 { - break - } - w32.User32TranslateMessage.Call(uintptr(unsafe.Pointer(&msg))) - w32.User32DispatchMessageW.Call(uintptr(unsafe.Pointer(&msg))) - } - e.Init("window.external={invoke:s=>window.chrome.webview.postMessage(s)}") - return true -} - -func (e *Chromium) SetPadding(padding Rect) { - if e.padding.Top == padding.Top && e.padding.Bottom == padding.Bottom && - e.padding.Left == padding.Left && e.padding.Right == padding.Right { - - return - } - - e.padding = padding - e.Resize() -} - -func (e *Chromium) Resize() { - if e.hwnd == 0 { - return - } - - var bounds w32.Rect - w32.User32GetClientRect.Call(e.hwnd, uintptr(unsafe.Pointer(&bounds))) - - bounds.Top += e.padding.Top - bounds.Bottom -= e.padding.Bottom - bounds.Left += e.padding.Left - bounds.Right -= e.padding.Right - - e.SetSize(bounds) -} - -func (e *Chromium) Navigate(url string) { - e.webview.vtbl.Navigate.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(url))), - ) -} - -func (e *Chromium) Init(script string) { - e.webview.vtbl.AddScriptToExecuteOnDocumentCreated.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(script))), - 0, - ) -} - -func (e *Chromium) Eval(script string) { - - _script, err := windows.UTF16PtrFromString(script) - if err != nil { - log.Fatal(err) - } - - e.webview.vtbl.ExecuteScript.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(_script)), - 0, - ) -} - -func (e *Chromium) Show() error { - return e.controller.PutIsVisible(true) -} - -func (e *Chromium) Hide() error { - return e.controller.PutIsVisible(false) -} - -func (e *Chromium) QueryInterface(_, _ uintptr) uintptr { - return 0 -} - -func (e *Chromium) AddRef() uintptr { - return 1 -} - -func (e *Chromium) Release() uintptr { - return 1 -} - -func (e *Chromium) EnvironmentCompleted(res uintptr, env *ICoreWebView2Environment) uintptr { - if int32(res) < 0 { - log.Fatalf("Creating environment failed with %08x: %s", res, syscall.Errno(res)) - } - env.vtbl.AddRef.Call(uintptr(unsafe.Pointer(env))) - e.environment = env - - env.vtbl.CreateCoreWebView2Controller.Call( - uintptr(unsafe.Pointer(env)), - e.hwnd, - uintptr(unsafe.Pointer(e.controllerCompleted)), - ) - return 0 -} - -func (e *Chromium) CreateCoreWebView2ControllerCompleted(res uintptr, controller *ICoreWebView2Controller) uintptr { - if int32(res) < 0 { - log.Fatalf("Creating controller failed with %08x: %s", res, syscall.Errno(res)) - } - controller.vtbl.AddRef.Call(uintptr(unsafe.Pointer(controller))) - e.controller = controller - - var token _EventRegistrationToken - controller.vtbl.GetCoreWebView2.Call( - uintptr(unsafe.Pointer(controller)), - uintptr(unsafe.Pointer(&e.webview)), - ) - e.webview.vtbl.AddRef.Call( - uintptr(unsafe.Pointer(e.webview)), - ) - e.webview.vtbl.AddWebMessageReceived.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.webMessageReceived)), - uintptr(unsafe.Pointer(&token)), - ) - e.webview.vtbl.AddPermissionRequested.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.permissionRequested)), - uintptr(unsafe.Pointer(&token)), - ) - e.webview.vtbl.AddWebResourceRequested.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.webResourceRequested)), - uintptr(unsafe.Pointer(&token)), - ) - e.webview.vtbl.AddNavigationCompleted.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.navigationCompleted)), - uintptr(unsafe.Pointer(&token)), - ) - e.webview.vtbl.AddProcessFailed.Call( - uintptr(unsafe.Pointer(e.webview)), - uintptr(unsafe.Pointer(e.processFailed)), - uintptr(unsafe.Pointer(&token)), - ) - - e.controller.AddAcceleratorKeyPressed(e.acceleratorKeyPressed, &token) - - atomic.StoreUintptr(&e.inited, 1) - - return 0 -} - -func (e *Chromium) MessageReceived(sender *ICoreWebView2, args *iCoreWebView2WebMessageReceivedEventArgs) uintptr { - var message *uint16 - args.vtbl.TryGetWebMessageAsString.Call( - uintptr(unsafe.Pointer(args)), - uintptr(unsafe.Pointer(&message)), - ) - if e.MessageCallback != nil { - e.MessageCallback(w32.Utf16PtrToString(message)) - } - sender.vtbl.PostWebMessageAsString.Call( - uintptr(unsafe.Pointer(sender)), - uintptr(unsafe.Pointer(message)), - ) - windows.CoTaskMemFree(unsafe.Pointer(message)) - return 0 -} - -func (e *Chromium) SetPermission(kind CoreWebView2PermissionKind, state CoreWebView2PermissionState) { - e.permissions[kind] = state -} - -func (e *Chromium) SetGlobalPermission(state CoreWebView2PermissionState) { - e.globalPermission = &state -} - -func (e *Chromium) PermissionRequested(_ *ICoreWebView2, args *iCoreWebView2PermissionRequestedEventArgs) uintptr { - var kind CoreWebView2PermissionKind - args.vtbl.GetPermissionKind.Call( - uintptr(unsafe.Pointer(args)), - uintptr(kind), - ) - var result CoreWebView2PermissionState - if e.globalPermission != nil { - result = *e.globalPermission - } else { - var ok bool - result, ok = e.permissions[kind] - if !ok { - result = CoreWebView2PermissionStateDefault - } - } - args.vtbl.PutState.Call( - uintptr(unsafe.Pointer(args)), - uintptr(result), - ) - return 0 -} - -func (e *Chromium) WebResourceRequested(sender *ICoreWebView2, args *ICoreWebView2WebResourceRequestedEventArgs) uintptr { - req, err := args.GetRequest() - if err != nil { - log.Fatal(err) - } - defer req.Release() - - if e.WebResourceRequestedCallback != nil { - e.WebResourceRequestedCallback(req, args) - } - return 0 -} - -func (e *Chromium) AddWebResourceRequestedFilter(filter string, ctx COREWEBVIEW2_WEB_RESOURCE_CONTEXT) { - err := e.webview.AddWebResourceRequestedFilter(filter, ctx) - if err != nil { - log.Fatal(err) - } -} - -func (e *Chromium) Environment() *ICoreWebView2Environment { - return e.environment -} - -// AcceleratorKeyPressed is called when an accelerator key is pressed. -// If the AcceleratorKeyCallback method has been set, it will defer handling of the keypress -// to the callback. That callback returns a bool indicating if the event was handled. -func (e *Chromium) AcceleratorKeyPressed(sender *ICoreWebView2Controller, args *ICoreWebView2AcceleratorKeyPressedEventArgs) uintptr { - if e.AcceleratorKeyCallback == nil { - return 0 - } - eventKind, _ := args.GetKeyEventKind() - if eventKind == COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN || - eventKind == COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_DOWN { - virtualKey, _ := args.GetVirtualKey() - status, _ := args.GetPhysicalKeyStatus() - if !status.WasKeyDown { - args.PutHandled(e.AcceleratorKeyCallback(virtualKey)) - return 0 - } - } - args.PutHandled(false) - return 0 -} - -func (e *Chromium) GetSettings() (*ICoreWebViewSettings, error) { - return e.webview.GetSettings() -} - -func (e *Chromium) GetController() *ICoreWebView2Controller { - return e.controller -} - -func boolToInt(input bool) int { - if input { - return 1 - } - return 0 -} - -func (e *Chromium) NavigationCompleted(sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) uintptr { - if e.NavigationCompletedCallback != nil { - e.NavigationCompletedCallback(sender, args) - } - return 0 -} - -func (e *Chromium) ProcessFailed(sender *ICoreWebView2, args *ICoreWebView2ProcessFailedEventArgs) uintptr { - if e.ProcessFailedCallback != nil { - e.ProcessFailedCallback(sender, args) - } - return 0 -} - -func (e *Chromium) NotifyParentWindowPositionChanged() error { - //It looks like the wndproc function is called before the controller initialization is complete. - //Because of this the controller is nil - if e.controller == nil { - return nil - } - return e.controller.NotifyParentWindowPositionChanged() -} - -func (e *Chromium) Focus() { - err := e.controller.MoveFocus(COREWEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC) - if err != nil { - log.Fatal(err) - } -} - -func (e *Chromium) PutZoomFactor(zoomFactor float64) { - err := e.controller.PutZoomFactor(zoomFactor) - if err != nil { - log.Fatal(err) - } -} - -func (e *Chromium) OpenDevToolsWindow() { - e.webview.OpenDevToolsWindow() -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_386.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_386.go deleted file mode 100644 index 00f6f42fb..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_386.go +++ /dev/null @@ -1,23 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - "unsafe" -) - -func (e *Chromium) SetSize(bounds w32.Rect) { - if e.controller == nil { - return - } - - e.controller.vtbl.PutBounds.Call( - uintptr(unsafe.Pointer(e.controller)), - uintptr(bounds.Left), - uintptr(bounds.Top), - uintptr(bounds.Right), - uintptr(bounds.Bottom), - ) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_amd64.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_amd64.go deleted file mode 100644 index 858b93f17..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_amd64.go +++ /dev/null @@ -1,20 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - "unsafe" -) - -func (e *Chromium) SetSize(bounds w32.Rect) { - if e.controller == nil { - return - } - - e.controller.vtbl.PutBounds.Call( - uintptr(unsafe.Pointer(e.controller)), - uintptr(unsafe.Pointer(&bounds)), - ) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_arm64.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_arm64.go deleted file mode 100644 index b237792e4..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium_arm64.go +++ /dev/null @@ -1,23 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" -) - -func (e *Chromium) SetSize(bounds w32.Rect) { - if e.controller == nil { - return - } - - words := (*[2]uintptr)(unsafe.Pointer(&bounds)) - e.controller.vtbl.PutBounds.Call( - uintptr(unsafe.Pointer(e.controller)), - words[0], - words[1], - ) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go deleted file mode 100644 index 6f1afbd87..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go +++ /dev/null @@ -1,503 +0,0 @@ -//go:build windows -// +build windows - -package edge - -import ( - "fmt" - "log" - "runtime" - "syscall" - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/internal/w32" - - "golang.org/x/sys/windows" -) - -func init() { - runtime.LockOSThread() - - r, _, _ := w32.Ole32CoInitializeEx.Call(0, 2) - if int(r) < 0 { - log.Printf("Warning: CoInitializeEx call failed: E=%08x", r) - } -} - -type _EventRegistrationToken struct { - value int64 -} - -type CoreWebView2PermissionKind uint32 - -const ( - CoreWebView2PermissionKindUnknownPermission CoreWebView2PermissionKind = iota - CoreWebView2PermissionKindMicrophone - CoreWebView2PermissionKindCamera - CoreWebView2PermissionKindGeolocation - CoreWebView2PermissionKindNotifications - CoreWebView2PermissionKindOtherSensors - CoreWebView2PermissionKindClipboardRead -) - -type CoreWebView2PermissionState uint32 - -const ( - CoreWebView2PermissionStateDefault CoreWebView2PermissionState = iota - CoreWebView2PermissionStateAllow - CoreWebView2PermissionStateDeny -) - -// ComProc stores a COM procedure. -type ComProc uintptr - -// NewComProc creates a new COM proc from a Go function. -func NewComProc(fn interface{}) ComProc { - return ComProc(windows.NewCallback(fn)) -} - -// Call calls a COM procedure. -// -//go:uintptrescapes -func (p ComProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { - // The magic uintptrescapes comment is needed to prevent moving uintptr(unsafe.Pointer(p)) so calls to .Call() also - // satisfy the unsafe.Pointer rule "(4) Conversion of a Pointer to a uintptr when calling syscall.Syscall." - // Otherwise it might be that pointers get moved, especially pointer onto the Go stack which might grow dynamically. - // See https://pkg.go.dev/unsafe#Pointer and https://github.com/golang/go/issues/34474 - switch len(a) { - case 0: - return syscall.Syscall(uintptr(p), 0, 0, 0, 0) - case 1: - return syscall.Syscall(uintptr(p), 1, a[0], 0, 0) - case 2: - return syscall.Syscall(uintptr(p), 2, a[0], a[1], 0) - case 3: - return syscall.Syscall(uintptr(p), 3, a[0], a[1], a[2]) - case 4: - return syscall.Syscall6(uintptr(p), 4, a[0], a[1], a[2], a[3], 0, 0) - case 5: - return syscall.Syscall6(uintptr(p), 5, a[0], a[1], a[2], a[3], a[4], 0) - case 6: - return syscall.Syscall6(uintptr(p), 6, a[0], a[1], a[2], a[3], a[4], a[5]) - case 7: - return syscall.Syscall9(uintptr(p), 7, a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0) - case 8: - return syscall.Syscall9(uintptr(p), 8, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0) - case 9: - return syscall.Syscall9(uintptr(p), 9, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) - case 10: - return syscall.Syscall12(uintptr(p), 10, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0) - case 11: - return syscall.Syscall12(uintptr(p), 11, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0) - case 12: - return syscall.Syscall12(uintptr(p), 12, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]) - case 13: - return syscall.Syscall15(uintptr(p), 13, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0) - case 14: - return syscall.Syscall15(uintptr(p), 14, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0) - case 15: - return syscall.Syscall15(uintptr(p), 15, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]) - default: - panic("too many arguments") - } -} - -// IUnknown - -type _IUnknownVtbl struct { - QueryInterface ComProc - AddRef ComProc - Release ComProc -} - -func (i *_IUnknownVtbl) CallRelease(this unsafe.Pointer) error { - _, _, err := i.Release.Call( - uintptr(this), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -type _IUnknownImpl interface { - QueryInterface(refiid, object uintptr) uintptr - AddRef() uintptr - Release() uintptr -} - -// ICoreWebView2 - -type iCoreWebView2Vtbl struct { - _IUnknownVtbl - GetSettings ComProc - GetSource ComProc - Navigate ComProc - NavigateToString ComProc - AddNavigationStarting ComProc - RemoveNavigationStarting ComProc - AddContentLoading ComProc - RemoveContentLoading ComProc - AddSourceChanged ComProc - RemoveSourceChanged ComProc - AddHistoryChanged ComProc - RemoveHistoryChanged ComProc - AddNavigationCompleted ComProc - RemoveNavigationCompleted ComProc - AddFrameNavigationStarting ComProc - RemoveFrameNavigationStarting ComProc - AddFrameNavigationCompleted ComProc - RemoveFrameNavigationCompleted ComProc - AddScriptDialogOpening ComProc - RemoveScriptDialogOpening ComProc - AddPermissionRequested ComProc - RemovePermissionRequested ComProc - AddProcessFailed ComProc - RemoveProcessFailed ComProc - AddScriptToExecuteOnDocumentCreated ComProc - RemoveScriptToExecuteOnDocumentCreated ComProc - ExecuteScript ComProc - CapturePreview ComProc - Reload ComProc - PostWebMessageAsJSON ComProc - PostWebMessageAsString ComProc - AddWebMessageReceived ComProc - RemoveWebMessageReceived ComProc - CallDevToolsProtocolMethod ComProc - GetBrowserProcessID ComProc - GetCanGoBack ComProc - GetCanGoForward ComProc - GoBack ComProc - GoForward ComProc - GetDevToolsProtocolEventReceiver ComProc - Stop ComProc - AddNewWindowRequested ComProc - RemoveNewWindowRequested ComProc - AddDocumentTitleChanged ComProc - RemoveDocumentTitleChanged ComProc - GetDocumentTitle ComProc - AddHostObjectToScript ComProc - RemoveHostObjectFromScript ComProc - OpenDevToolsWindow ComProc - AddContainsFullScreenElementChanged ComProc - RemoveContainsFullScreenElementChanged ComProc - GetContainsFullScreenElement ComProc - AddWebResourceRequested ComProc - RemoveWebResourceRequested ComProc - AddWebResourceRequestedFilter ComProc - RemoveWebResourceRequestedFilter ComProc - AddWindowCloseRequested ComProc - RemoveWindowCloseRequested ComProc -} - -type ICoreWebView2 struct { - vtbl *iCoreWebView2Vtbl -} - -func (i *ICoreWebView2) GetSettings() (*ICoreWebViewSettings, error) { - var err error - var settings *ICoreWebViewSettings - _, _, err = i.vtbl.GetSettings.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(&settings)), - ) - if err != windows.ERROR_SUCCESS { - return nil, err - } - return settings, nil -} - -// ICoreWebView2Environment - -type iCoreWebView2EnvironmentVtbl struct { - _IUnknownVtbl - CreateCoreWebView2Controller ComProc - CreateWebResourceResponse ComProc - GetBrowserVersionString ComProc - AddNewBrowserVersionAvailable ComProc - RemoveNewBrowserVersionAvailable ComProc -} - -type ICoreWebView2Environment struct { - vtbl *iCoreWebView2EnvironmentVtbl -} - -// CreateWebResourceResponse creates a new ICoreWebView2WebResourceResponse, it must be released after finishing using it. -func (e *ICoreWebView2Environment) CreateWebResourceResponse(content []byte, statusCode int, reasonPhrase string, headers string) (*ICoreWebView2WebResourceResponse, error) { - var err error - var stream uintptr - - if len(content) > 0 { - // Create stream for response - stream, err = w32.SHCreateMemStream(content) - if err != nil { - return nil, err - } - - // Release the IStream after we are finished, CreateWebResourceResponse Call will increase the reference - // count on IStream and therefore it won't be freed until the reference count of the response is 0. - defer (*IStream)(unsafe.Pointer(stream)).Release() - } - - // Convert string 'uri' to *uint16 - _reason, err := windows.UTF16PtrFromString(reasonPhrase) - if err != nil { - return nil, err - } - // Convert string 'uri' to *uint16 - _headers, err := windows.UTF16PtrFromString(headers) - if err != nil { - return nil, err - } - var response *ICoreWebView2WebResourceResponse - hr, _, err := e.vtbl.CreateWebResourceResponse.Call( - uintptr(unsafe.Pointer(e)), - stream, - uintptr(statusCode), - uintptr(unsafe.Pointer(_reason)), - uintptr(unsafe.Pointer(_headers)), - uintptr(unsafe.Pointer(&response)), - ) - if windows.Handle(hr) != windows.S_OK { - return nil, syscall.Errno(hr) - } - - if response == nil { - if err == nil { - err = fmt.Errorf("unknown error") - } - return nil, err - } - return response, nil - -} - -// ICoreWebView2WebMessageReceivedEventArgs - -type iCoreWebView2WebMessageReceivedEventArgsVtbl struct { - _IUnknownVtbl - GetSource ComProc - GetWebMessageAsJSON ComProc - TryGetWebMessageAsString ComProc -} - -type iCoreWebView2WebMessageReceivedEventArgs struct { - vtbl *iCoreWebView2WebMessageReceivedEventArgsVtbl -} - -// ICoreWebView2PermissionRequestedEventArgs - -type iCoreWebView2PermissionRequestedEventArgsVtbl struct { - _IUnknownVtbl - GetURI ComProc - GetPermissionKind ComProc - GetIsUserInitiated ComProc - GetState ComProc - PutState ComProc - GetDeferral ComProc -} - -type iCoreWebView2PermissionRequestedEventArgs struct { - vtbl *iCoreWebView2PermissionRequestedEventArgsVtbl -} - -// ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler - -type iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerImpl interface { - _IUnknownImpl - EnvironmentCompleted(res uintptr, env *ICoreWebView2Environment) uintptr -} - -type iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler struct { - vtbl *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl - impl iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerImpl -} - -func _ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownQueryInterface(this *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownAddRef(this *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownRelease(this *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerInvoke(this *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, res uintptr, env *ICoreWebView2Environment) uintptr { - return this.impl.EnvironmentCompleted(res, env) -} - -var iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerFn = iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerInvoke), -} - -func newICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler(impl iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerImpl) *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler { - return &iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler{ - vtbl: &iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerFn, - impl: impl, - } -} - -// ICoreWebView2WebMessageReceivedEventHandler - -type iCoreWebView2WebMessageReceivedEventHandlerImpl interface { - _IUnknownImpl - MessageReceived(sender *ICoreWebView2, args *iCoreWebView2WebMessageReceivedEventArgs) uintptr -} - -type iCoreWebView2WebMessageReceivedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2WebMessageReceivedEventHandler struct { - vtbl *iCoreWebView2WebMessageReceivedEventHandlerVtbl - impl iCoreWebView2WebMessageReceivedEventHandlerImpl -} - -func _ICoreWebView2WebMessageReceivedEventHandlerIUnknownQueryInterface(this *iCoreWebView2WebMessageReceivedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2WebMessageReceivedEventHandlerIUnknownAddRef(this *iCoreWebView2WebMessageReceivedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2WebMessageReceivedEventHandlerIUnknownRelease(this *iCoreWebView2WebMessageReceivedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2WebMessageReceivedEventHandlerInvoke(this *iCoreWebView2WebMessageReceivedEventHandler, sender *ICoreWebView2, args *iCoreWebView2WebMessageReceivedEventArgs) uintptr { - return this.impl.MessageReceived(sender, args) -} - -var iCoreWebView2WebMessageReceivedEventHandlerFn = iCoreWebView2WebMessageReceivedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerInvoke), -} - -func newICoreWebView2WebMessageReceivedEventHandler(impl iCoreWebView2WebMessageReceivedEventHandlerImpl) *iCoreWebView2WebMessageReceivedEventHandler { - return &iCoreWebView2WebMessageReceivedEventHandler{ - vtbl: &iCoreWebView2WebMessageReceivedEventHandlerFn, - impl: impl, - } -} - -// ICoreWebView2PermissionRequestedEventHandler - -type iCoreWebView2PermissionRequestedEventHandlerImpl interface { - _IUnknownImpl - PermissionRequested(sender *ICoreWebView2, args *iCoreWebView2PermissionRequestedEventArgs) uintptr -} - -type iCoreWebView2PermissionRequestedEventHandlerVtbl struct { - _IUnknownVtbl - Invoke ComProc -} - -type iCoreWebView2PermissionRequestedEventHandler struct { - vtbl *iCoreWebView2PermissionRequestedEventHandlerVtbl - impl iCoreWebView2PermissionRequestedEventHandlerImpl -} - -func _ICoreWebView2PermissionRequestedEventHandlerIUnknownQueryInterface(this *iCoreWebView2PermissionRequestedEventHandler, refiid, object uintptr) uintptr { - return this.impl.QueryInterface(refiid, object) -} - -func _ICoreWebView2PermissionRequestedEventHandlerIUnknownAddRef(this *iCoreWebView2PermissionRequestedEventHandler) uintptr { - return this.impl.AddRef() -} - -func _ICoreWebView2PermissionRequestedEventHandlerIUnknownRelease(this *iCoreWebView2PermissionRequestedEventHandler) uintptr { - return this.impl.Release() -} - -func _ICoreWebView2PermissionRequestedEventHandlerInvoke(this *iCoreWebView2PermissionRequestedEventHandler, sender *ICoreWebView2, args *iCoreWebView2PermissionRequestedEventArgs) uintptr { - return this.impl.PermissionRequested(sender, args) -} - -var iCoreWebView2PermissionRequestedEventHandlerFn = iCoreWebView2PermissionRequestedEventHandlerVtbl{ - _IUnknownVtbl{ - NewComProc(_ICoreWebView2PermissionRequestedEventHandlerIUnknownQueryInterface), - NewComProc(_ICoreWebView2PermissionRequestedEventHandlerIUnknownAddRef), - NewComProc(_ICoreWebView2PermissionRequestedEventHandlerIUnknownRelease), - }, - NewComProc(_ICoreWebView2PermissionRequestedEventHandlerInvoke), -} - -func newICoreWebView2PermissionRequestedEventHandler(impl iCoreWebView2PermissionRequestedEventHandlerImpl) *iCoreWebView2PermissionRequestedEventHandler { - return &iCoreWebView2PermissionRequestedEventHandler{ - vtbl: &iCoreWebView2PermissionRequestedEventHandlerFn, - impl: impl, - } -} - -func (i *ICoreWebView2) AddWebResourceRequestedFilter(uri string, resourceContext COREWEBVIEW2_WEB_RESOURCE_CONTEXT) error { - var err error - // Convert string 'uri' to *uint16 - _uri, err := windows.UTF16PtrFromString(uri) - if err != nil { - return err - } - _, _, err = i.vtbl.AddWebResourceRequestedFilter.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(_uri)), - uintptr(resourceContext), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} -func (i *ICoreWebView2) AddNavigationCompleted(eventHandler *ICoreWebView2NavigationCompletedEventHandler, token *_EventRegistrationToken) error { - var err error - _, _, err = i.vtbl.AddNavigationCompleted.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(eventHandler)), - uintptr(unsafe.Pointer(&token)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2) AddProcessFailed(eventHandler *ICoreWebView2ProcessFailedEventHandler, token *_EventRegistrationToken) error { - var err error - _, _, err = i.vtbl.AddProcessFailed.Call( - uintptr(unsafe.Pointer(i)), - uintptr(unsafe.Pointer(eventHandler)), - uintptr(unsafe.Pointer(&token)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} - -func (i *ICoreWebView2) OpenDevToolsWindow() error { - var err error - _, _, err = i.vtbl.OpenDevToolsWindow.Call( - uintptr(unsafe.Pointer(i)), - ) - if err != windows.ERROR_SUCCESS { - return err - } - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_go.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_go.go deleted file mode 100644 index a3b7374ca..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_go.go +++ /dev/null @@ -1,29 +0,0 @@ -//go:build windows && !native_webview2loader - -package edge - -import ( - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader" -) - -func createCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder string, environmentCompletedHandle *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, additionalBrowserArgs string) error { - e := &environmentCreatedHandler{environmentCompletedHandle} - return webviewloader.CreateCoreWebView2EnvironmentWithOptions( - e, - webviewloader.WithBrowserExecutableFolder(browserExecutableFolder), - webviewloader.WithUserDataFolder(userDataFolder), - webviewloader.WithAdditionalBrowserArguments(additionalBrowserArgs), - ) -} - -type environmentCreatedHandler struct { - originalHandler *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler -} - -func (r *environmentCreatedHandler) EnvironmentCompleted(errorCode webviewloader.HRESULT, createdEnvironment *webviewloader.ICoreWebView2Environment) webviewloader.HRESULT { - env := (*ICoreWebView2Environment)(unsafe.Pointer(createdEnvironment)) - res := r.originalHandler.impl.EnvironmentCompleted(uintptr(errorCode), env) - return webviewloader.HRESULT(res) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_native.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_native.go deleted file mode 100644 index 9b4f02bfd..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/create_env_native.go +++ /dev/null @@ -1,41 +0,0 @@ -//go:build windows && native_webview2loader - -package edge - -import ( - "fmt" - "syscall" - "unsafe" - - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader" - - "golang.org/x/sys/windows" -) - -func createCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder string, environmentCompletedHandle *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, additionalBrowserArgs string) error { - browserPathPtr, err := windows.UTF16PtrFromString(browserExecutableFolder) - if err != nil { - return fmt.Errorf("Error calling UTF16PtrFromString for %s: %v", browserExecutableFolder, err) - } - - userPathPtr, err := windows.UTF16PtrFromString(userDataFolder) - if err != nil { - return fmt.Errorf("Error calling UTF16PtrFromString for %s: %v", userDataFolder, err) - } - - hr, err := webviewloader.CreateCoreWebView2EnvironmentWithOptions( - browserPathPtr, - userPathPtr, - uintptr(unsafe.Pointer(environmentCompletedHandle)), - additionalBrowserArgs, - ) - - if hr != 0 { - if err == nil || err == windows.ERROR_SUCCESS { - err = syscall.Errno(hr) - } - return err - } - - return nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/guid.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/guid.go deleted file mode 100644 index 007e60586..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/guid.go +++ /dev/null @@ -1,225 +0,0 @@ -//go:build windows - -package edge - -// This code has been adapted from: https://github.com/go-ole/go-ole - -/* - -The MIT License (MIT) - -Copyright © 2013-2017 Yasuhiro Matsumoto, - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the “Software”), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -const hextable = "0123456789ABCDEF" -const emptyGUID = "{00000000-0000-0000-0000-000000000000}" - -// GUID is Windows API specific GUID type. -// -// This exists to match Windows GUID type for direct passing for COM. -// Format is in xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx. -type GUID struct { - Data1 uint32 - Data2 uint16 - Data3 uint16 - Data4 [8]byte -} - -// NewGUID converts the given string into a globally unique identifier that is -// compliant with the Windows API. -// -// The supplied string may be in any of these formats: -// -// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -// -// The conversion of the supplied string is not case-sensitive. -func NewGUID(guid string) *GUID { - d := []byte(guid) - var d1, d2, d3, d4a, d4b []byte - - switch len(d) { - case 38: - if d[0] != '{' || d[37] != '}' { - return nil - } - d = d[1:37] - fallthrough - case 36: - if d[8] != '-' || d[13] != '-' || d[18] != '-' || d[23] != '-' { - return nil - } - d1 = d[0:8] - d2 = d[9:13] - d3 = d[14:18] - d4a = d[19:23] - d4b = d[24:36] - case 32: - d1 = d[0:8] - d2 = d[8:12] - d3 = d[12:16] - d4a = d[16:20] - d4b = d[20:32] - default: - return nil - } - - var g GUID - var ok1, ok2, ok3, ok4 bool - g.Data1, ok1 = decodeHexUint32(d1) - g.Data2, ok2 = decodeHexUint16(d2) - g.Data3, ok3 = decodeHexUint16(d3) - g.Data4, ok4 = decodeHexByte64(d4a, d4b) - if ok1 && ok2 && ok3 && ok4 { - return &g - } - return nil -} - -func decodeHexUint32(src []byte) (value uint32, ok bool) { - var b1, b2, b3, b4 byte - var ok1, ok2, ok3, ok4 bool - b1, ok1 = decodeHexByte(src[0], src[1]) - b2, ok2 = decodeHexByte(src[2], src[3]) - b3, ok3 = decodeHexByte(src[4], src[5]) - b4, ok4 = decodeHexByte(src[6], src[7]) - value = (uint32(b1) << 24) | (uint32(b2) << 16) | (uint32(b3) << 8) | uint32(b4) - ok = ok1 && ok2 && ok3 && ok4 - return -} - -func decodeHexUint16(src []byte) (value uint16, ok bool) { - var b1, b2 byte - var ok1, ok2 bool - b1, ok1 = decodeHexByte(src[0], src[1]) - b2, ok2 = decodeHexByte(src[2], src[3]) - value = (uint16(b1) << 8) | uint16(b2) - ok = ok1 && ok2 - return -} - -func decodeHexByte64(s1 []byte, s2 []byte) (value [8]byte, ok bool) { - var ok1, ok2, ok3, ok4, ok5, ok6, ok7, ok8 bool - value[0], ok1 = decodeHexByte(s1[0], s1[1]) - value[1], ok2 = decodeHexByte(s1[2], s1[3]) - value[2], ok3 = decodeHexByte(s2[0], s2[1]) - value[3], ok4 = decodeHexByte(s2[2], s2[3]) - value[4], ok5 = decodeHexByte(s2[4], s2[5]) - value[5], ok6 = decodeHexByte(s2[6], s2[7]) - value[6], ok7 = decodeHexByte(s2[8], s2[9]) - value[7], ok8 = decodeHexByte(s2[10], s2[11]) - ok = ok1 && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8 - return -} - -func decodeHexByte(c1, c2 byte) (value byte, ok bool) { - var n1, n2 byte - var ok1, ok2 bool - n1, ok1 = decodeHexChar(c1) - n2, ok2 = decodeHexChar(c2) - value = (n1 << 4) | n2 - ok = ok1 && ok2 - return -} - -func decodeHexChar(c byte) (byte, bool) { - switch { - case '0' <= c && c <= '9': - return c - '0', true - case 'a' <= c && c <= 'f': - return c - 'a' + 10, true - case 'A' <= c && c <= 'F': - return c - 'A' + 10, true - } - - return 0, false -} - -// String converts the GUID to string form. It will adhere to this pattern: -// -// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -// -// If the GUID is nil, the string representation of an empty GUID is returned: -// -// {00000000-0000-0000-0000-000000000000} -func (guid *GUID) String() string { - if guid == nil { - return emptyGUID - } - - var c [38]byte - c[0] = '{' - putUint32Hex(c[1:9], guid.Data1) - c[9] = '-' - putUint16Hex(c[10:14], guid.Data2) - c[14] = '-' - putUint16Hex(c[15:19], guid.Data3) - c[19] = '-' - putByteHex(c[20:24], guid.Data4[0:2]) - c[24] = '-' - putByteHex(c[25:37], guid.Data4[2:8]) - c[37] = '}' - return string(c[:]) -} - -func putUint32Hex(b []byte, v uint32) { - b[0] = hextable[byte(v>>24)>>4] - b[1] = hextable[byte(v>>24)&0x0f] - b[2] = hextable[byte(v>>16)>>4] - b[3] = hextable[byte(v>>16)&0x0f] - b[4] = hextable[byte(v>>8)>>4] - b[5] = hextable[byte(v>>8)&0x0f] - b[6] = hextable[byte(v)>>4] - b[7] = hextable[byte(v)&0x0f] -} - -func putUint16Hex(b []byte, v uint16) { - b[0] = hextable[byte(v>>8)>>4] - b[1] = hextable[byte(v>>8)&0x0f] - b[2] = hextable[byte(v)>>4] - b[3] = hextable[byte(v)&0x0f] -} - -func putByteHex(dst, src []byte) { - for i := 0; i < len(src); i++ { - dst[i*2] = hextable[src[i]>>4] - dst[i*2+1] = hextable[src[i]&0x0f] - } -} - -// IsEqualGUID compares two GUID. -// -// Not constant time comparison. -func IsEqualGUID(guid1 *GUID, guid2 *GUID) bool { - return guid1.Data1 == guid2.Data1 && - guid1.Data2 == guid2.Data2 && - guid1.Data3 == guid2.Data3 && - guid1.Data4[0] == guid2.Data4[0] && - guid1.Data4[1] == guid2.Data4[1] && - guid1.Data4[2] == guid2.Data4[2] && - guid1.Data4[3] == guid2.Data4[3] && - guid1.Data4[4] == guid2.Data4[4] && - guid1.Data4[5] == guid2.Data4[5] && - guid1.Data4[6] == guid2.Data4[6] && - guid1.Data4[7] == guid2.Data4[7] -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/LICENSE b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/LICENSE deleted file mode 100644 index af1894c87..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -ISC License (ISC) - -Copyright (c) 2020 John Chadwick -Copyright (c) 2022 Wails Project Developers - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/README.md b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/README.md deleted file mode 100644 index f3e020ec4..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Webviewloader - -Webviewloader is a port of [OpenWebView2Loader](https://github.com/jchv/OpenWebView2Loader) to Go. - -It is intended to be feature-complete with the original WebView2Loader distributed with -the WebView2 NuGet package, but some features are intentionally not implemented. - -## Status - -- [x] CompareBrowserVersions -- [x] CreateCoreWebView2Environment -- [x] CreateCoreWebView2EnvironmentWithOptions -- [x] GetAvailableCoreWebView2BrowserVersionString - -## Not implemented features - -- Registry Overrides of Parameters -- Env Variable Overrides of Parameters -- Does not incorporate `GetCurrentPackageInfo` to search for an installed runtime diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/arm64/WebView2Loader.dll b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/arm64/WebView2Loader.dll deleted file mode 100644 index cd1c694b845a66c30fef09ca675ae539107477d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124328 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 [!NOTE]\n\> A merge of the different values of the same switch is not attempted, -// except for disabled and enabled features. The features specified by -// `--enable-features` and `--disable-features` are merged with simple -// logic.\n\> * The features is the union of the specified features -// and built-in features. If a feature is disabled, it is removed from the -// enabled features list. -// -// If you specify command-line switches and use the -// `additionalBrowserArguments` parameter, the `--edge-webview-switches` -// value takes precedence and is processed last. If a switch fails to -// parse, the switch is ignored. The default state for the operation is -// to run the browser process with no extra flags. -// -// [ChromiumDevelopersHowTosRunWithFlags]: https://www.chromium.org/developers/how-tos/run-chromium-with-flags "Run Chromium with flags | The Chromium Projects" -func WithAdditionalBrowserArguments(args string) option { - return func(wvep *environmentOptions) { - wvep.additionalBrowserArguments = args - } -} - -// WithLanguage sets the default display language for WebView. -// -// It applies to browser UI such as -// context menu and dialogs. It also applies to the `accept-languages` HTTP -// header that WebView sends to websites. It is in the format of -// -// `language[-country]` where `language` is the 2-letter code from -// [ISO 639][ISO639LanguageCodesHtml] -// and `country` is the -// 2-letter code from -// [ISO 3166][ISOStandard72482Html]. -// -// [ISO639LanguageCodesHtml]: https://www.iso.org/iso-639-language-codes.html "ISO 639 | ISO" -// [ISOStandard72482Html]: https://www.iso.org/standard/72482.html "ISO 3166-1:2020 | ISO" -func WithLanguage(lang string) option { - return func(wvep *environmentOptions) { - wvep.language = lang - } -} - -// WithTargetCompatibleBrowserVersion secifies the version of the WebView2 Runtime binaries required to be -// compatible with your app. -// -// This defaults to the WebView2 Runtime version -// that corresponds with the version of the SDK the app is using. The -// format of this value is the same as the format of the -// `BrowserVersionString` property and other `BrowserVersion` values. Only -// the version part of the `BrowserVersion` value is respected. The channel -// suffix, if it exists, is ignored. The version of the WebView2 Runtime -// binaries actually used may be different from the specified -// `TargetCompatibleBrowserVersion`. The binaries are only guaranteed to be -// compatible. Verify the actual version on the `BrowserVersionString` -// property on the `ICoreWebView2Environment`. -func WithTargetCompatibleBrowserVersion(version string) option { - return func(wvep *environmentOptions) { - wvep.targetCompatibleBrowserVersion = version - } -} - -// WithAllowSingleSignOnUsingOSPrimaryAccount is used to enable -// single sign on with Azure Active Directory (AAD) and personal Microsoft -// Account (MSA) resources inside WebView. All AAD accounts, connected to -// Windows and shared for all apps, are supported. For MSA, SSO is only enabled -// for the account associated for Windows account login, if any. -// Default is disabled. Universal Windows Platform apps must also declare -// `enterpriseCloudSSO` -// [Restricted capabilities][WindowsUwpPackagingAppCapabilityDeclarationsRestrictedCapabilities] -// for the single sign on (SSO) to work. -// -// [WindowsUwpPackagingAppCapabilityDeclarationsRestrictedCapabilities]: /windows/uwp/packaging/app-capability-declarations\#restricted-capabilities "Restricted capabilities - App capability declarations | Microsoft Docs" -func WithAllowSingleSignOnUsingOSPrimaryAccount(allow bool) option { - return func(wvep *environmentOptions) { - wvep.allowSingleSignOnUsingOSPrimaryAccount = allow - } -} - -// WithExclusiveUserDataFolderAccess specifies that the WebView environment -// obtains exclusive access to the user data folder. -// -// If the user data folder is already being used by another WebView environment with a -// different value for `ExclusiveUserDataFolderAccess` property, the creation of a WebView2Controller -// using the environment object will fail with `HRESULT_FROM_WIN32(ERROR_INVALID_STATE)`. -// When set as TRUE, no other WebView can be created from other processes using WebView2Environment -// objects with the same UserDataFolder. This prevents other processes from creating WebViews -// which share the same browser process instance, since sharing is performed among -// WebViews that have the same UserDataFolder. When another process tries to create a -// WebView2Controller from an WebView2Environment object created with the same user data folder, -// it will fail with `HRESULT_FROM_WIN32(ERROR_INVALID_STATE)`. -func WithExclusiveUserDataFolderAccess(exclusive bool) option { - return func(wvep *environmentOptions) { - wvep.exclusiveUserDataFolderAccess = exclusive - } -} - -type option func(*environmentOptions) - -var _ iCoreWebView2EnvironmentOptions = &environmentOptions{} -var _ iCoreWebView2EnvironmentOptions2 = &environmentOptions{} - -type environmentOptions struct { - browserExecutableFolder string - userDataFolder string - preferCanary bool - - additionalBrowserArguments string - language string - targetCompatibleBrowserVersion string - allowSingleSignOnUsingOSPrimaryAccount bool - exclusiveUserDataFolderAccess bool -} - -func (o *environmentOptions) AdditionalBrowserArguments() string { - return o.additionalBrowserArguments -} - -func (o *environmentOptions) Language() string { - return o.language -} - -func (o *environmentOptions) TargetCompatibleBrowserVersion() string { - v := o.targetCompatibleBrowserVersion - if v == "" { - v = kMinimumCompatibleVersion - } - return v -} - -func (o *environmentOptions) AllowSingleSignOnUsingOSPrimaryAccount() bool { - return o.allowSingleSignOnUsingOSPrimaryAccount -} - -func (o *environmentOptions) ExclusiveUserDataFolderAccess() bool { - return o.exclusiveUserDataFolderAccess -} - -type iCoreWebView2EnvironmentOptions interface { - combridge.IUnknown - - AdditionalBrowserArguments() string - Language() string - TargetCompatibleBrowserVersion() string - AllowSingleSignOnUsingOSPrimaryAccount() bool -} - -type iCoreWebView2EnvironmentOptions2 interface { - combridge.IUnknown - - ExclusiveUserDataFolderAccess() bool -} - -func init() { - combridge.RegisterVTable[combridge.IUnknown, iCoreWebView2EnvironmentOptions]( - "{2fde08a8-1e9a-4766-8c05-95a9ceb9d1c5}", - _iCoreWebView2EnvironmentOptionsAdditionalBrowserArguments, - _iCoreWebView2EnvironmentOptionsNOP, - _iCoreWebView2EnvironmentOptionsLanguage, - _iCoreWebView2EnvironmentOptionsNOP, - _iCoreWebView2EnvironmentTargetCompatibleBrowserVersion, - _iCoreWebView2EnvironmentOptionsNOP, - _iCoreWebView2EnvironmentOptionsAllowSingleSignOnUsingOSPrimaryAccount, - _iCoreWebView2EnvironmentOptionsNOP, - ) - - combridge.RegisterVTable[combridge.IUnknown, iCoreWebView2EnvironmentOptions2]( - "{ff85c98a-1ba7-4a6b-90c8-2b752c89e9e2}", - _iCoreWebView2EnvironmentOptions2ExclusiveUserDataFolderAccess, - _iCoreWebView2EnvironmentOptionsNOP, - ) -} -func _iCoreWebView2EnvironmentOptionsNOP(this uintptr) uintptr { - return uintptr(windows.S_FALSE) -} - -func _iCoreWebView2EnvironmentOptionsAdditionalBrowserArguments(this uintptr, value **uint16) uintptr { - v := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).AdditionalBrowserArguments() - *value = stringToOleString(v) - return uintptr(windows.S_OK) -} - -func _iCoreWebView2EnvironmentOptionsLanguage(this uintptr, value **uint16) uintptr { - args := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).Language() - *value = stringToOleString(args) - return uintptr(windows.S_OK) -} - -func _iCoreWebView2EnvironmentTargetCompatibleBrowserVersion(this uintptr, value **uint16) uintptr { - args := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).TargetCompatibleBrowserVersion() - *value = stringToOleString(args) - return uintptr(windows.S_OK) -} - -func _iCoreWebView2EnvironmentOptionsAllowSingleSignOnUsingOSPrimaryAccount(this uintptr, value *int32) uintptr { - v := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).AllowSingleSignOnUsingOSPrimaryAccount() - *value = boolToInt(v) - return uintptr(windows.S_OK) -} - -func _iCoreWebView2EnvironmentOptions2ExclusiveUserDataFolderAccess(this uintptr, value *int32) uintptr { - v := combridge.Resolve[iCoreWebView2EnvironmentOptions2](this).ExclusiveUserDataFolderAccess() - *value = boolToInt(v) - return uintptr(windows.S_OK) -} - -func stringToOleString(v string) *uint16 { - wstr := utf16.Encode([]rune(v + "\x00")) - lwstr := len(wstr) - ptr := (*uint16)(coTaskMemAlloc(2 * lwstr)) - - copy(unsafe.Slice(ptr, lwstr), wstr) - - return ptr -} - -func boolToInt(v bool) int32 { - if v { - return 1 - } - return 0 -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll.go deleted file mode 100644 index da9472ff1..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll.go +++ /dev/null @@ -1,74 +0,0 @@ -//go:build windows - -package webviewloader - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "runtime" - - "golang.org/x/sys/windows/registry" -) - -var ( - errNoClientDLLFound = errors.New("no webview2 found") -) - -func findEmbeddedBrowserVersion(filename string) (string, error) { - block, err := getFileVersionInfo(filename) - if err != nil { - return "", err - } - - info, err := verQueryValueString(block, "\\StringFileInfo\\040904B0\\ProductVersion") - if err != nil { - return "", err - } - - return info, nil -} - -func findEmbeddedClientDll(embeddedEdgeSubFolder string) (outClientPath string, err error) { - if !filepath.IsAbs(embeddedEdgeSubFolder) { - exe, err := os.Executable() - if err != nil { - return "", err - } - - embeddedEdgeSubFolder = filepath.Join(filepath.Dir(exe), embeddedEdgeSubFolder) - } - - return findClientDllInFolder(embeddedEdgeSubFolder) -} - -func findClientDllInFolder(folder string) (string, error) { - arch := "" - switch runtime.GOARCH { - case "arm64": - arch = "arm64" - case "amd64": - arch = "x64" - case "386": - arch = "x86" - default: - return "", fmt.Errorf("Unsupported architecture") - } - - dllPath := filepath.Join(folder, "EBWebView", arch, "EmbeddedBrowserWebView.dll") - if _, err := os.Stat(dllPath); err != nil { - return "", mapFindErr(err) - } - return dllPath, nil -} - -func mapFindErr(err error) error { - if errors.Is(err, registry.ErrNotExist) { - return errNoClientDLLFound - } - if errors.Is(err, os.ErrNotExist) { - return errNoClientDLLFound - } - return err -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll_installed.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll_installed.go deleted file mode 100644 index 7ee171b2a..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/find_dll_installed.go +++ /dev/null @@ -1,94 +0,0 @@ -//go:build windows && !native_webview2loader - -package webviewloader - -import ( - "path/filepath" - - "golang.org/x/sys/windows/registry" -) - -const ( - kNumChannels = 4 - kInstallKeyPath = "Software\\Microsoft\\EdgeUpdate\\ClientState\\" - kMinimumCompatibleVersion = "86.0.616.0" -) - -var ( - kChannelName = [kNumChannels]string{ - "", "beta", "dev", "canary", // "internal" - } - - kChannelUuid = [kNumChannels]string{ - "{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}", - "{2CD8A007-E189-409D-A2C8-9AF4EF3C72AA}", - "{0D50BFEC-CD6A-4F9A-964C-C7416E3ACB10}", - "{65C35B14-6C1D-4122-AC46-7148CC9D6497}", - //"{BE59E8FD-089A-411B-A3B0-051D9E417818}", - } - - minimumCompatibleVersion, _ = parseVersion(kMinimumCompatibleVersion) -) - -func findInstalledClientDll(preferCanary bool) (clientPath string, version *version, err error) { - for i := 0; i < kNumChannels; i++ { - channel := i - if preferCanary { - channel = (kNumChannels - 1) - i - } - - key := kInstallKeyPath + kChannelUuid[channel] - for _, checkSystem := range []bool{true, false} { - clientPath, version, err := findInstalledClientDllForChannel(key, checkSystem) - if err == errNoClientDLLFound { - continue - } - if err != nil { - return "", nil, err - } - - version.channel = kChannelName[channel] - return clientPath, version, nil - } - } - return "", nil, errNoClientDLLFound -} - -func findInstalledClientDllForChannel(subKey string, system bool) (clientPath string, clientVersion *version, err error) { - key := registry.LOCAL_MACHINE - if !system { - key = registry.CURRENT_USER - } - - regKey, err := registry.OpenKey(key, subKey, registry.READ|registry.WOW64_32KEY) - if err != nil { - return "", nil, mapFindErr(err) - } - defer regKey.Close() - - embeddedEdgeSubFolder, _, err := regKey.GetStringValue("EBWebView") - if err != nil { - return "", nil, mapFindErr(err) - } - - if embeddedEdgeSubFolder == "" { - return "", nil, errNoClientDLLFound - } - - versionString := filepath.Base(embeddedEdgeSubFolder) - version, err := parseVersion(versionString) - if err != nil { - return "", nil, errNoClientDLLFound - } - - if version.compare(minimumCompatibleVersion) < 0 { - return "", nil, errNoClientDLLFound - } - - dllPath, err := findEmbeddedClientDll(embeddedEdgeSubFolder) - if err != nil { - return "", nil, mapFindErr(err) - } - - return dllPath, &version, nil -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module.go deleted file mode 100644 index 3e02fe985..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module.go +++ /dev/null @@ -1,173 +0,0 @@ -//go:build windows && native_webview2loader - -package webviewloader - -import ( - "errors" - "fmt" - "os" - "sync" - "unsafe" - - "github.com/jchv/go-winloader" - - "golang.org/x/sys/windows" -) - -func init() { - preventEnvAndRegistryOverrides(nil, nil, "") -} - -var ( - memOnce sync.Once - memModule winloader.Module - memCreate winloader.Proc - memCompareBrowserVersions winloader.Proc - memGetAvailableCoreWebView2BrowserVersionString winloader.Proc - 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: -// -// Less than zero: v1 < v2 -// zero: v1 == v2 -// Greater than zero: v1 > v2 -func CompareBrowserVersions(v1 string, v2 string) (int, error) { - _v1, err := windows.UTF16PtrFromString(v1) - if err != nil { - return 0, err - } - _v2, err := windows.UTF16PtrFromString(v2) - if err != nil { - return 0, err - } - - err = loadFromMemory() - if err != nil { - return 0, err - } - - var result int32 - _, _, err = memCompareBrowserVersions.Call( - uint64(uintptr(unsafe.Pointer(_v1))), - uint64(uintptr(unsafe.Pointer(_v2))), - uint64(uintptr(unsafe.Pointer(&result)))) - - if err != windows.ERROR_SUCCESS { - return 0, err - } - return int(result), nil -} - -// GetAvailableCoreWebView2BrowserVersionString returns version of the webview2 runtime. -// If path is empty, it will try to find installed webview2 is the system. -// If there is no version installed, a blank string is returned. -func GetAvailableCoreWebView2BrowserVersionString(path string) (string, error) { - if path != "" { - // The default implementation fails if CGO and a fixed browser path is used. It's caused by the go-winloader - // which loads the native DLL from memory. - // Use the new GoWebView2Loader in this case, in the future we will make GoWebView2Loader - // feature-complete and remove the use of the native DLL and go-winloader. - version, err := goGetAvailableCoreWebView2BrowserVersionString(path) - if errors.Is(err, errNoClientDLLFound) { - // WebView2 is not found - return "", nil - } else if err != nil { - return "", err - } - - return version, nil - } - - err := loadFromMemory() - if err != nil { - return "", err - } - - var browserPath *uint16 = nil - if path != "" { - browserPath, err = windows.UTF16PtrFromString(path) - if err != nil { - return "", fmt.Errorf("error calling UTF16PtrFromString for %s: %v", path, err) - } - } - - preventEnvAndRegistryOverrides(browserPath, nil, "") - var result *uint16 - res, _, err := memGetAvailableCoreWebView2BrowserVersionString.Call( - uint64(uintptr(unsafe.Pointer(browserPath))), - 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 -} - -// CreateCoreWebView2EnvironmentWithOptions tries to load WebviewLoader2 and -// call the CreateCoreWebView2EnvironmentWithOptions routine. -func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder *uint16, environmentCompletedHandle uintptr, additionalBrowserArgs string) (uintptr, error) { - err := loadFromMemory() - if err != nil { - return 0, err - } - - preventEnvAndRegistryOverrides(browserExecutableFolder, userDataFolder, additionalBrowserArgs) - res, _, _ := memCreate.Call( - uint64(uintptr(unsafe.Pointer(browserExecutableFolder))), - uint64(uintptr(unsafe.Pointer(userDataFolder))), - 0, - uint64(environmentCompletedHandle), - ) - return uintptr(res), nil -} - -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 memory: %w", memErr) - return - } - memCreate = memModule.Proc("CreateCoreWebView2EnvironmentWithOptions") - memCompareBrowserVersions = memModule.Proc("CompareBrowserVersions") - memGetAvailableCoreWebView2BrowserVersionString = memModule.Proc("GetAvailableCoreWebView2BrowserVersionString") - }) - return err -} - -func preventEnvAndRegistryOverrides(browserFolder, userDataFolder *uint16, additionalBrowserArgs string) { - // Setting these env variables to empty string also prevents registry overrides because webview2loader - // checks for existence and not for empty value - os.Setenv("WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER", "") - - // Set these overrides to the values or empty to prevent registry and external env overrides - os.Setenv("WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS", additionalBrowserArgs) - os.Setenv("WEBVIEW2_RELEASE_CHANNEL_PREFERENCE", "0") - os.Setenv("WEBVIEW2_BROWSER_EXECUTABLE_FOLDER", windows.UTF16PtrToString(browserFolder)) - os.Setenv("WEBVIEW2_USER_DATA_FOLDER", windows.UTF16PtrToString(userDataFolder)) -} - -func goGetAvailableCoreWebView2BrowserVersionString(browserExecutableFolder string) (string, error) { - clientPath, err := findEmbeddedClientDll(browserExecutableFolder) - if err != nil { - return "", err - } - - return findEmbeddedBrowserVersion(clientPath) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_386.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_386.go deleted file mode 100644 index e4ff44ff3..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_386.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build windows && native_webview2loader - -package webviewloader - -import _ "embed" - -//go:embed x86/WebView2Loader.dll -var WebView2Loader []byte diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_amd64.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_amd64.go deleted file mode 100644 index 27423ae8a..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_amd64.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build windows && native_webview2loader - -package webviewloader - -import _ "embed" - -//go:embed x64/WebView2Loader.dll -var WebView2Loader []byte diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_arm64.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_arm64.go deleted file mode 100644 index bba6a88cb..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/native_module_arm64.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build windows && native_webview2loader - -package webviewloader - -import _ "embed" - -//go:embed arm64/WebView2Loader.dll -var WebView2Loader []byte diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/syscall.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/syscall.go deleted file mode 100644 index 24d0856a5..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/syscall.go +++ /dev/null @@ -1,143 +0,0 @@ -//go:build windows - -package webviewloader - -import ( - "fmt" - "syscall" - "unicode/utf16" - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - procGlobalAlloc = modkernel32.NewProc("GlobalAlloc") - procGlobalFree = modkernel32.NewProc("GlobalFree") - - modversion = windows.NewLazySystemDLL("version.dll") - procGetFileVersionInfoSize = modversion.NewProc("GetFileVersionInfoSizeW") - procGetFileVersionInfo = modversion.NewProc("GetFileVersionInfoW") - procVerQueryValue = modversion.NewProc("VerQueryValueW") - - modole32 = windows.NewLazySystemDLL("ole32.dll") - procCoTaskMemAlloc = modole32.NewProc("CoTaskMemAlloc") -) - -func getFileVersionInfo(path string) ([]byte, error) { - lptstrFilename, err := syscall.UTF16PtrFromString(path) - if err != nil { - return nil, err - } - - size, _, err := procGetFileVersionInfoSize.Call( - uintptr(unsafe.Pointer(lptstrFilename)), - 0, - ) - - err = maskErrorSuccess(err) - if size == 0 && err == nil { - err = fmt.Errorf("GetFileVersionInfoSize failed") - } - - if err != nil { - return nil, err - } - - data := make([]byte, size) - ret, _, err := procGetFileVersionInfo.Call( - uintptr(unsafe.Pointer(lptstrFilename)), - 0, - uintptr(size), - uintptr(unsafe.Pointer(&data[0])), - ) - - err = maskErrorSuccess(err) - if ret == 0 && err == nil { - err = fmt.Errorf("GetFileVersionInfo failed") - } - - if err != nil { - return nil, err - } - return data, nil -} - -func verQueryValueString(block []byte, subBlock string) (string, error) { - // Allocate memory from native side to make sure the block doesn't get moved - // because we get a pointer into that memory block from the native verQueryValue - // call back. - pBlock := globalAlloc(0, uint32(len(block))) - defer globalFree(unsafe.Pointer(pBlock)) - - // Copy the memory region into native side memory - copy(unsafe.Slice((*byte)(pBlock), len(block)), block) - - lpSubBlock, err := syscall.UTF16PtrFromString(subBlock) - if err != nil { - return "", err - } - - var lplpBuffer unsafe.Pointer - var puLen uint - ret, _, err := procVerQueryValue.Call( - uintptr(pBlock), - uintptr(unsafe.Pointer(lpSubBlock)), - uintptr(unsafe.Pointer(&lplpBuffer)), - uintptr(unsafe.Pointer(&puLen)), - ) - - err = maskErrorSuccess(err) - if ret == 0 && err == nil { - err = fmt.Errorf("VerQueryValue failed") - } - - if err != nil { - return "", err - } - - if puLen <= 1 { - return "", nil - } - puLen -= 1 // Remove Null-Terminator - - wchar := unsafe.Slice((*uint16)(lplpBuffer), puLen) - return string(utf16.Decode(wchar)), nil -} - -func globalAlloc(uFlags uint, dwBytes uint32) unsafe.Pointer { - ret, _, _ := procGlobalAlloc.Call( - uintptr(uFlags), - uintptr(dwBytes)) - - if ret == 0 { - panic("globalAlloc failed") - } - - return unsafe.Pointer(ret) -} - -func globalFree(data unsafe.Pointer) { - ret, _, _ := procGlobalFree.Call(uintptr(data)) - if ret != 0 { - panic("globalFree failed") - } -} - -func maskErrorSuccess(err error) error { - if err == windows.ERROR_SUCCESS { - return nil - } - return err -} - -func coTaskMemAlloc(size int) unsafe.Pointer { - ret, _, _ := procCoTaskMemAlloc.Call( - uintptr(size)) - - if ret == 0 { - panic("coTaskMemAlloc failed") - } - return unsafe.Pointer(ret) -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/version.go b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/version.go deleted file mode 100644 index cf278d950..000000000 --- a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/version.go +++ /dev/null @@ -1,147 +0,0 @@ -//go:build windows && !native_webview2loader - -package webviewloader - -import ( - "errors" - "fmt" - "strconv" - "strings" -) - -// CompareBrowserVersions will compare the 2 given versions and return: -// -// -1 = v1 < v2 -// 0 = v1 == v2 -// 1 = v1 > v2 -func CompareBrowserVersions(v1 string, v2 string) (int, error) { - v, err := parseVersion(v1) - if err != nil { - return 0, fmt.Errorf("v1 invalid: %w", err) - } - - w, err := parseVersion(v2) - if err != nil { - return 0, fmt.Errorf("v2 invalid: %w", err) - } - - return v.compare(w), nil -} - -// GetAvailableCoreWebView2BrowserVersionString get the browser version info including channel name -// if it is the WebView2 Runtime. -// Channel names are Beta, Dev, and Canary. -func GetAvailableCoreWebView2BrowserVersionString(browserExecutableFolder string) (string, error) { - if browserExecutableFolder != "" { - clientPath, err := findEmbeddedClientDll(browserExecutableFolder) - if errors.Is(err, errNoClientDLLFound) { - // WebView2 is not found - return "", nil - } else if err != nil { - return "", err - } - - return findEmbeddedBrowserVersion(clientPath) - } - - _, version, err := findInstalledClientDll(false) - if errors.Is(err, errNoClientDLLFound) { - return "", nil - } else if err != nil { - return "", err - } - - return version.String(), nil -} - -type version struct { - major int - minor int - patch int - build int - - channel string -} - -func (v version) String() string { - vv := fmt.Sprintf("%d.%d.%d.%d", v.major, v.minor, v.patch, v.build) - if v.channel != "" { - vv += " " + v.channel - } - - return vv -} - -func (v version) compare(o version) int { - if c := compareInt(v.major, o.major); c != 0 { - return c - } - if c := compareInt(v.minor, o.minor); c != 0 { - return c - } - if c := compareInt(v.patch, o.patch); c != 0 { - return c - } - return compareInt(v.build, o.build) -} - -func parseVersion(v string) (version, error) { - var p version - - // Split away channel information... - if i := strings.Index(v, " "); i > 0 { - p.channel = v[i+1:] - v = v[:i] - } - - vv := strings.Split(v, ".") - if len(vv) > 4 { - return p, fmt.Errorf("too many version parts") - } - - var err error - vv, p.major, err = parseInt(vv) - if err != nil { - return p, fmt.Errorf("bad major version: %w", err) - } - - vv, p.minor, err = parseInt(vv) - if err != nil { - return p, fmt.Errorf("bad minor version: %w", err) - } - - vv, p.patch, err = parseInt(vv) - if err != nil { - return p, fmt.Errorf("bad patch version: %w", err) - } - - _, p.build, err = parseInt(vv) - if err != nil { - return p, fmt.Errorf("bad build version: %w", err) - } - - return p, nil -} - -func parseInt(v []string) ([]string, int, error) { - if len(v) == 0 { - return nil, 0, nil - } - - p, err := strconv.ParseInt(v[0], 10, 32) - if err != nil { - return nil, 0, err - } - return v[1:], int(p), nil -} - -func compareInt(v1, v2 int) int { - if v1 == v2 { - return 0 - } - if v1 < v2 { - return -1 - } else { - return +1 - } -} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/x64/WebView2Loader.dll b/v2/internal/frontend/desktop/windows/go-webview2/webviewloader/x64/WebView2Loader.dll deleted file mode 100644 index ab15cffb45a9d3b243b35dbdda9252cae7dd183e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137640 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.Z?_t#Y)^6H*_u3=Qpjey{kj>u=`zx?AOD>u9Z1a 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%0DC^z2wad3A^i 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 WdhP?WPUTgd^3Mus({knJ(EkT%P(z*o diff --git a/v2/internal/frontend/desktop/windows/window.go b/v2/internal/frontend/desktop/windows/window.go index 43ec57c72..a513e875a 100644 --- a/v2/internal/frontend/desktop/windows/window.go +++ b/v2/internal/frontend/desktop/windows/window.go @@ -3,11 +3,10 @@ package windows import ( + "github.com/wailsapp/go-webview2/pkg/edge" "sync" "unsafe" - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge" - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/win32" "github.com/wailsapp/wails/v2/internal/system/operatingsystem" diff --git a/v2/internal/system/system_windows.go b/v2/internal/system/system_windows.go index 1ef076cd8..40b8f0340 100644 --- a/v2/internal/system/system_windows.go +++ b/v2/internal/system/system_windows.go @@ -4,7 +4,7 @@ package system import ( - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader" + "github.com/wailsapp/go-webview2/webviewloader" "github.com/wailsapp/wails/v2/internal/system/operatingsystem" "github.com/wailsapp/wails/v2/internal/system/packagemanager" ) diff --git a/v2/internal/wv2installer/wv2installer.go b/v2/internal/wv2installer/wv2installer.go index ce754cee7..c89ad196f 100644 --- a/v2/internal/wv2installer/wv2installer.go +++ b/v2/internal/wv2installer/wv2installer.go @@ -5,7 +5,7 @@ package wv2installer import ( "fmt" - "github.com/wailsapp/wails/v2/internal/frontend/desktop/windows/go-webview2/webviewloader" + "github.com/wailsapp/go-webview2/webviewloader" "github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options/windows" ) diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 0ed111b6f..921521e85 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Now uses new `go-webview2` module. Added by @leaanthony in [PR](https://github.com/wailsapp/wails/pull/2687). - Changed styling of `doctor` command. Changed by @MarvinJWendt in [PR](https://github.com/wailsapp/wails/pull/2660) - Enable HiDPI option by default in windows nsis installer by @5aaee9 in [PR](https://github.com/wailsapp/wails/pull/2694)