Switch remote deploy to vendored source builds

Move remote deployment to a vendored source bundle built on the target host via Docker so redeploys no longer require local cross-compilation or host Go installation.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
GitHub Actions
2026-05-08 12:19:18 +08:00
parent bb27566e38
commit c1a0fe2949
1320 changed files with 497125 additions and 11 deletions

View File

@@ -0,0 +1,10 @@
//go:build windows
package edge
type COREWEBVIEW2_BOUNDS_MODE uint32
const (
COREWEBVIEW2_BOUNDS_MODE_USE_RAW_PIXELS = 0
COREWEBVIEW2_BOUNDS_MODE_USE_RASTERIZATION_SCALE = 1
)

View File

@@ -0,0 +1,10 @@
//go:build windows
package edge
type COREWEBVIEW2_COLOR struct {
A uint8
R uint8
G uint8
B uint8
}

View File

@@ -0,0 +1,11 @@
//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
)

View File

@@ -0,0 +1,12 @@
//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
)

View File

@@ -0,0 +1,11 @@
//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
)

View File

@@ -0,0 +1,23 @@
//go:build windows
package edge
type COREWEBVIEW2_PHYSICAL_KEY_STATUS struct {
RepeatCount uint32
ScanCode uint32
IsExtendedKey bool
IsMenuKeyDown bool
WasKeyDown bool
IsKeyReleased bool
}
// Bools need to be int32 in the native struct otherwise we end up in memory corruption. Using the internal
// struct is a hacky way so we don't break the public interface.
type internal_COREWEBVIEW2_PHYSICAL_KEY_STATUS struct {
RepeatCount uint32
ScanCode uint32
IsExtendedKey int32
IsMenuKeyDown int32
WasKeyDown int32
IsKeyReleased int32
}

View File

@@ -0,0 +1,49 @@
//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
)

View File

@@ -0,0 +1,25 @@
//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
)

View File

@@ -0,0 +1,90 @@
//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() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) GetKeyEventKind() (COREWEBVIEW2_KEY_EVENT_KIND, error) {
var keyEventKind COREWEBVIEW2_KEY_EVENT_KIND
hr, _, _ := i.vtbl.GetKeyEventKind.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&keyEventKind)),
)
if windows.Handle(hr) != windows.S_OK {
return 0, windows.Errno(hr)
}
return keyEventKind, nil
}
func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) GetVirtualKey() (uint, error) {
var virtualKey uint
hr, _, _ := i.vtbl.GetVirtualKey.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&virtualKey)),
)
if windows.Handle(hr) != windows.S_OK {
return 0, windows.Errno(hr)
}
return virtualKey, nil
}
func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) GetPhysicalKeyStatus() (COREWEBVIEW2_PHYSICAL_KEY_STATUS, error) {
var physicalKeyStatus internal_COREWEBVIEW2_PHYSICAL_KEY_STATUS
hr, _, _ := i.vtbl.GetPhysicalKeyStatus.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&physicalKeyStatus)),
)
if windows.Handle(hr) != windows.S_OK {
return COREWEBVIEW2_PHYSICAL_KEY_STATUS{}, windows.Errno(hr)
}
return COREWEBVIEW2_PHYSICAL_KEY_STATUS{
RepeatCount: physicalKeyStatus.RepeatCount,
ScanCode: physicalKeyStatus.ScanCode,
IsExtendedKey: physicalKeyStatus.IsExtendedKey != 0,
IsMenuKeyDown: physicalKeyStatus.IsMenuKeyDown != 0,
WasKeyDown: physicalKeyStatus.WasKeyDown != 0,
IsKeyReleased: physicalKeyStatus.IsKeyReleased != 0,
}, nil
}
func (i *ICoreWebView2AcceleratorKeyPressedEventArgs) PutHandled(handled bool) error {
hr, _, _ := i.vtbl.PutHandled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(handled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,66 @@
//go:build windows
package edge
import (
"unsafe"
)
type _ICoreWebView2AcceleratorKeyPressedEventHandlerVtbl struct {
_IUnknownVtbl
Invoke ComProc
}
type ICoreWebView2AcceleratorKeyPressedEventHandler struct {
vtbl *_ICoreWebView2AcceleratorKeyPressedEventHandlerVtbl
impl _ICoreWebView2AcceleratorKeyPressedEventHandlerImpl
}
func (i *ICoreWebView2AcceleratorKeyPressedEventHandler) AddRef() uintptr {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}
func (i *ICoreWebView2AcceleratorKeyPressedEventHandler) Release() uintptr {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return ret
}
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,
}
}

View File

@@ -0,0 +1,64 @@
package edge
import (
"unsafe"
)
type _ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerVtbl struct {
_IUnknownVtbl
Invoke ComProc
}
type iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler struct {
vtbl *_ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerVtbl
impl _ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerImpl
}
func (i *iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func _ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerIUnknownQueryInterface(this *iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler, refiid, object uintptr) uintptr {
return this.impl.QueryInterface(refiid, object)
}
func iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerIUnknownAddRef(this *iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler) uintptr {
return this.impl.AddRef()
}
func _ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerIUnknownRelease(this *iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler) uintptr {
return this.impl.Release()
}
func _ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerInvoke(this *iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler, errorCode uintptr, addedScript *ICoreWebView2Controller) uintptr {
return this.impl.AddScriptToExecuteOnDocumentCreatedCompleted(errorCode, addedScript)
}
type _ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerImpl interface {
_IUnknownImpl
AddScriptToExecuteOnDocumentCreatedCompleted(errorCode uintptr, addedScript *ICoreWebView2Controller) uintptr
}
var _ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerFn = _ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerVtbl{
_IUnknownVtbl{
NewComProc(_ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerIUnknownQueryInterface),
NewComProc(iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerIUnknownAddRef),
NewComProc(_ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerIUnknownRelease),
},
NewComProc(_ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerInvoke),
}
func newICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler(impl _ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerImpl) *iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler {
return &iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler{
vtbl: &_ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandlerFn,
impl: impl,
}
}

View File

@@ -0,0 +1,21 @@
//go:build windows
package edge
import (
"unsafe"
)
type _ICoreWebView2ContainsFullScreenElementChangedEventArgsVtbl struct {
_IUnknownVtbl
}
type ICoreWebView2ContainsFullScreenElementChangedEventArgs struct {
vtbl *_ICoreWebView2ContainsFullScreenElementChangedEventArgsVtbl
}
func (i *ICoreWebView2ContainsFullScreenElementChangedEventArgs) AddRef() uintptr {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}

View File

@@ -0,0 +1,59 @@
//go:build windows
package edge
import (
"unsafe"
)
type _ICoreWebView2ContainsFullScreenElementChangedEventHandlerVtbl struct {
_IUnknownVtbl
Invoke ComProc
}
type ICoreWebView2ContainsFullScreenElementChangedEventHandler struct {
vtbl *_ICoreWebView2ContainsFullScreenElementChangedEventHandlerVtbl
impl _ICoreWebView2ContainsFullScreenElementChangedEventHandlerImpl
}
func (i *ICoreWebView2ContainsFullScreenElementChangedEventHandler) AddRef() uintptr {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}
func _ICoreWebView2ContainsFullScreenElementChangedEventHandlerIUnknownQueryInterface(this *ICoreWebView2ContainsFullScreenElementChangedEventHandler, refiid, object uintptr) uintptr {
return this.impl.QueryInterface(refiid, object)
}
func _ICoreWebView2ContainsFullScreenElementChangedEventHandlerIUnknownAddRef(this *ICoreWebView2ContainsFullScreenElementChangedEventHandler) uintptr {
return this.impl.AddRef()
}
func _ICoreWebView2ContainsFullScreenElementChangedEventHandlerIUnknownRelease(this *ICoreWebView2ContainsFullScreenElementChangedEventHandler) uintptr {
return this.impl.Release()
}
func _ICoreWebView2ContainsFullScreenElementChangedEventHandlerInvoke(this *ICoreWebView2ContainsFullScreenElementChangedEventHandler, sender *ICoreWebView2, args *ICoreWebView2ContainsFullScreenElementChangedEventArgs) uintptr {
return this.impl.ContainsFullScreenElementChanged(sender, args)
}
type _ICoreWebView2ContainsFullScreenElementChangedEventHandlerImpl interface {
_IUnknownImpl
ContainsFullScreenElementChanged(sender *ICoreWebView2, args *ICoreWebView2ContainsFullScreenElementChangedEventArgs) uintptr
}
var _ICoreWebView2ContainsFullScreenElementChangedEventHandlerFn = _ICoreWebView2ContainsFullScreenElementChangedEventHandlerVtbl{
_IUnknownVtbl{
NewComProc(_ICoreWebView2ContainsFullScreenElementChangedEventHandlerIUnknownQueryInterface),
NewComProc(_ICoreWebView2ContainsFullScreenElementChangedEventHandlerIUnknownAddRef),
NewComProc(_ICoreWebView2ContainsFullScreenElementChangedEventHandlerIUnknownRelease),
},
NewComProc(_ICoreWebView2ContainsFullScreenElementChangedEventHandlerInvoke),
}
func newICoreWebView2ContainsFullScreenElementChangedEventHandler(impl *Chromium) *ICoreWebView2ContainsFullScreenElementChangedEventHandler {
return &ICoreWebView2ContainsFullScreenElementChangedEventHandler{
vtbl: &_ICoreWebView2ContainsFullScreenElementChangedEventHandlerFn,
impl: impl,
}
}

View File

@@ -0,0 +1,176 @@
//go:build windows
package edge
import (
"math"
"unsafe"
"github.com/wailsapp/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 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}
func (i *ICoreWebView2Controller) Release() uintptr {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return ret
}
func (i *ICoreWebView2Controller) GetCoreWebView2() (*ICoreWebView2, error) {
var wv2Ptr *ICoreWebView2
hr, _, _ := i.vtbl.GetCoreWebView2.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&wv2Ptr)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
return wv2Ptr, nil
}
func (i *ICoreWebView2Controller) GetBounds() (*w32.Rect, error) {
var bounds w32.Rect
hr, _, _ := i.vtbl.GetBounds.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&bounds)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
return &bounds, nil
}
func (i *ICoreWebView2Controller) PutBounds(bounds w32.Rect) error {
hr, _, _ := i.vtbl.PutBounds.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&bounds)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Controller) MoveFocus(reason COREWEBVIEW2_MOVE_FOCUS_REASON) error {
hr, _, _ := i.vtbl.MoveFocus.Call(
uintptr(unsafe.Pointer(i)),
uintptr(reason),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Controller) AddAcceleratorKeyPressed(eventHandler *ICoreWebView2AcceleratorKeyPressedEventHandler, token *_EventRegistrationToken) error {
hr, _, _ := i.vtbl.AddAcceleratorKeyPressed.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(eventHandler)),
uintptr(unsafe.Pointer(&token)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Controller) PutIsVisible(isVisible bool) error {
hr, _, _ := i.vtbl.PutIsVisible.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(isVisible)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
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 {
hr, _, _ := i.vtbl.NotifyParentWindowPositionChanged.Call(
uintptr(unsafe.Pointer(i)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Controller) PutZoomFactor(zoomFactor float64) error {
hr, _, _ := i.vtbl.PutZoomFactor.Call(
uintptr(unsafe.Pointer(i)),
uintptr(math.Float64bits(zoomFactor)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Controller) GetZoomFactor() (float64, error) {
var zoomFactorUint64 uint64
hr, _, _ := i.vtbl.GetZoomFactor.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&zoomFactorUint64)),
)
if windows.Handle(hr) != windows.S_OK {
return 0.0, windows.Errno(hr)
}
return math.Float64frombits(zoomFactorUint64), nil
}

View File

@@ -0,0 +1,77 @@
//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 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}
func (i *ICoreWebView2Controller2) GetDefaultBackgroundColor() (*COREWEBVIEW2_COLOR, error) {
var backgroundColor *COREWEBVIEW2_COLOR
hr, _, _ := i.vtbl.GetDefaultBackgroundColor.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&backgroundColor)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
return backgroundColor, nil
}
func (i *ICoreWebView2Controller2) PutDefaultBackgroundColor(backgroundColor COREWEBVIEW2_COLOR) error {
// Cast to a uint32 as that's what the call is expecting
col := *(*uint32)(unsafe.Pointer(&backgroundColor))
hr, _, _ := i.vtbl.PutDefaultBackgroundColor.Call(
uintptr(unsafe.Pointer(i)),
uintptr(col),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,174 @@
//go:build windows
package edge
import (
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
type ICoreWebView2Controller3Vtbl 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
GetRasterizationScale ComProc
PutRasterizationScale ComProc
GetShouldDetectMonitorScaleChanges ComProc
PutShouldDetectMonitorScaleChanges ComProc
AddRasterizationScaleChanged ComProc
RemoveRasterizationScaleChanged ComProc
GetBoundsMode ComProc
PutBoundsMode ComProc
}
type ICoreWebView2Controller3 struct {
Vtbl *ICoreWebView2Controller3Vtbl
}
func (i *ICoreWebView2Controller3) AddRef() uintptr {
refCounter, _, _ := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return refCounter
}
func (i *ICoreWebView2Controller) GetICoreWebView2Controller3() *ICoreWebView2Controller3 {
var result *ICoreWebView2Controller3
iidICoreWebView2Controller3 := NewGUID("{f9614724-5d2b-41dc-aef7-73d62b51543b}")
_, _, _ = i.vtbl.QueryInterface.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(iidICoreWebView2Controller3)),
uintptr(unsafe.Pointer(&result)))
return result
}
func (i *ICoreWebView2Controller3) GetRasterizationScale() (float64, error) {
var scale float64
hr, _, _ := i.Vtbl.GetRasterizationScale.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&scale)),
)
if windows.Handle(hr) != windows.S_OK {
return 0.0, syscall.Errno(hr)
}
return scale, nil
}
func (i *ICoreWebView2Controller3) PutRasterizationScale(scale float64) error {
hr, _, _ := i.Vtbl.PutRasterizationScale.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&scale)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Controller3) GetShouldDetectMonitorScaleChanges() (bool, error) {
// Create int32 to hold bool result
var _value int32
hr, _, _ := i.Vtbl.GetShouldDetectMonitorScaleChanges.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_value)),
)
if windows.Handle(hr) != windows.S_OK {
return false, syscall.Errno(hr)
}
// Get result and cleanup
value := _value != 0
return value, nil
}
func (i *ICoreWebView2Controller3) PutShouldDetectMonitorScaleChanges(value bool) error {
hr, _, _ := i.Vtbl.PutShouldDetectMonitorScaleChanges.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&value)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Controller3) AddRasterizationScaleChanged(eventHandler *ICoreWebView2RasterizationScaleChangedEventHandler) (EventRegistrationToken, error) {
var token EventRegistrationToken
hr, _, _ := i.Vtbl.AddRasterizationScaleChanged.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(eventHandler)),
uintptr(unsafe.Pointer(&token)),
)
if windows.Handle(hr) != windows.S_OK {
return EventRegistrationToken{}, syscall.Errno(hr)
}
return token, nil
}
func (i *ICoreWebView2Controller3) RemoveRasterizationScaleChanged(token EventRegistrationToken) error {
hr, _, _ := i.Vtbl.RemoveRasterizationScaleChanged.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&token)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Controller3) GetBoundsMode() (COREWEBVIEW2_BOUNDS_MODE, error) {
var boundsMode COREWEBVIEW2_BOUNDS_MODE
hr, _, _ := i.Vtbl.GetBoundsMode.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&boundsMode)),
)
if windows.Handle(hr) != windows.S_OK {
return 0, syscall.Errno(hr)
}
return boundsMode, nil
}
func (i *ICoreWebView2Controller3) PutBoundsMode(boundsMode COREWEBVIEW2_BOUNDS_MODE) error {
hr, _, _ := i.Vtbl.PutBoundsMode.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boundsMode),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,97 @@
//go:build windows
package edge
import (
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
type ICoreWebView2Controller4Vtbl 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
GetRasterizationScale ComProc
PutRasterizationScale ComProc
GetShouldDetectMonitorScaleChanges ComProc
PutShouldDetectMonitorScaleChanges ComProc
AddRasterizationScaleChanged ComProc
RemoveRasterizationScaleChanged ComProc
GetBoundsMode ComProc
PutBoundsMode ComProc
GetAllowExternalDrop ComProc
PutAllowExternalDrop ComProc
}
type ICoreWebView2Controller4 struct {
Vtbl *ICoreWebView2Controller4Vtbl
}
func (i *ICoreWebView2Controller4) AddRef() uintptr {
refCounter, _, _ := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return refCounter
}
func (i *ICoreWebView2Controller) GetICoreWebView2Controller4() *ICoreWebView2Controller4 {
var result *ICoreWebView2Controller4
iidICoreWebView2Controller4 := NewGUID("{97d418d5-a426-4e49-a151-e1a10f327d9e}")
_, _, _ = i.vtbl.QueryInterface.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(iidICoreWebView2Controller4)),
uintptr(unsafe.Pointer(&result)))
return result
}
func (i *ICoreWebView2Controller4) GetAllowExternalDrop() (bool, error) {
// Create int32 to hold bool result
var _value int32
hr, _, _ := i.Vtbl.GetAllowExternalDrop.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_value)),
)
if windows.Handle(hr) != windows.S_OK {
return false, syscall.Errno(hr)
}
// Get result and cleanup
value := _value != 0
return value, nil
}
func (i *ICoreWebView2Controller4) PutAllowExternalDrop(value bool) error {
hr, _, _ := i.Vtbl.PutAllowExternalDrop.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(value)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,234 @@
package edge
import (
"unsafe"
"math"
"golang.org/x/sys/windows"
)
// ICoreWebView2Cookie vtable
type iCoreWebView2CookieVtbl struct {
_IUnknownVtbl
GetName ComProc
GetValue ComProc
PutValue ComProc
GetDomain ComProc
GetPath ComProc
GetExpires ComProc
PutExpires ComProc
GetIsHttpOnly ComProc
PutIsHttpOnly ComProc
GetSameSite ComProc
PutSameSite ComProc
GetIsSecure ComProc
PutIsSecure ComProc
}
// ICoreWebView2Cookie represents a cookie
type ICoreWebView2Cookie struct {
vtbl *iCoreWebView2CookieVtbl
}
// Addref increments refernce count of the ICoreWebView2Cookie interface
func (i *ICoreWebView2Cookie) AddRef() uintptr {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}
// Release decrements reference count of the ICoreWebView2Cookie interface
func (i *ICoreWebView2Cookie) Release() uintptr {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return ret
}
// GetName gets the cookie name
func (i *ICoreWebView2Cookie) GetName() (string, error) {
var name *uint16
hr, _, _ := i.vtbl.GetName.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&name)),
)
if hr != 0 {
return "", windows.Errno(hr)
}
return windows.UTF16PtrToString(name), nil
}
// GetValue gets the cookie value
func (i *ICoreWebView2Cookie) GetValue() (string, error) {
var value *uint16
hr, _, _ := i.vtbl.GetValue.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&value)),
)
if hr != 0 {
return "", windows.Errno(hr)
}
return windows.UTF16PtrToString(value), nil
}
// PutValue sets the cookie value
func (i *ICoreWebView2Cookie) PutValue(value string) error {
ptr, err := windows.UTF16PtrFromString(value)
if err != nil {
return err
}
hr, _, _ := i.vtbl.PutValue.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(ptr)),
)
if hr != 0 {
return windows.Errno(hr)
}
return nil
}
// GetDomain gets the cookie domain
func (i *ICoreWebView2Cookie) GetDomain() (string, error) {
var domain *uint16
hr, _, _ := i.vtbl.GetDomain.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&domain)),
)
if hr != 0 {
return "", windows.Errno(hr)
}
return windows.UTF16PtrToString(domain), nil
}
// GetPath gets the cookie path
func (i *ICoreWebView2Cookie) GetPath() (string, error) {
var path *uint16
hr, _, _ := i.vtbl.GetPath.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&path)),
)
if hr != 0 {
return "", windows.Errno(hr)
}
return windows.UTF16PtrToString(path), nil
}
// GetExpires gets the cookie expiration time
func (i *ICoreWebView2Cookie) GetExpires() (float64, error) {
var expiresUint64 uint64
hr, _, _ := i.vtbl.GetExpires.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&expiresUint64)),
)
if hr != 0 {
return 0.0, windows.Errno(hr)
}
return math.Float64frombits(expiresUint64), nil
}
// PutExpires sets the cookie expiration time
func (i *ICoreWebView2Cookie) PutExpires(expires float64) error {
hr, _, _ := i.vtbl.PutExpires.Call(
uintptr(unsafe.Pointer(i)),
uintptr(math.Float64bits(expires)),
)
if hr != 0 {
return windows.Errno(hr)
}
return nil
}
// GetIsHttpOnly gets whether the cookie is HTTP-only
func (i *ICoreWebView2Cookie) GetIsHttpOnly() (bool, error) {
var isHttpOnly int32
hr, _, _ := i.vtbl.GetIsHttpOnly.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&isHttpOnly)),
)
if hr != 0 {
return false, windows.Errno(hr)
}
return isHttpOnly != 0, nil
}
// PutIsHttpOnly sets whether the cookie is HTTP-only
func (i *ICoreWebView2Cookie) PutIsHttpOnly(isHttpOnly bool) error {
value := int32(0)
if isHttpOnly {
value = 1
}
hr, _, _ := i.vtbl.PutIsHttpOnly.Call(
uintptr(unsafe.Pointer(i)),
uintptr(value),
)
if hr != 0 {
return windows.Errno(hr)
}
return nil
}
// GetSameSite gets the cookie's SameSite attribute
func (i *ICoreWebView2Cookie) GetSameSite() (int32, error) {
var sameSite int32
hr, _, _ := i.vtbl.GetSameSite.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&sameSite)),
)
if hr != 0 {
return 0, windows.Errno(hr)
}
return sameSite, nil
}
// PutSameSite sets the cookie's SameSite attribute
func (i *ICoreWebView2Cookie) PutSameSite(sameSite int32) error {
hr, _, _ := i.vtbl.PutSameSite.Call(
uintptr(unsafe.Pointer(i)),
uintptr(sameSite),
)
if hr != 0 {
return windows.Errno(hr)
}
return nil
}
// GetIsSecure gets whether the cookie is secure
func (i *ICoreWebView2Cookie) GetIsSecure() (bool, error) {
var isSecure int32
hr, _, _ := i.vtbl.GetIsSecure.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&isSecure)),
)
if hr != 0 {
return false, windows.Errno(hr)
}
return isSecure != 0, nil
}
// PutIsSecure sets whether the cookie is secure
func (i *ICoreWebView2Cookie) PutIsSecure(isSecure bool) error {
value := int32(0)
if isSecure {
value = 1
}
hr, _, _ := i.vtbl.PutIsSecure.Call(
uintptr(unsafe.Pointer(i)),
uintptr(value),
)
if hr != 0 {
return windows.Errno(hr)
}
return nil
}
// QueryInterface queries for a specific interface
func (i *ICoreWebView2Cookie) QueryInterface(riid *windows.GUID, ppvObject *unsafe.Pointer) error {
hr, _, _ := i.vtbl.QueryInterface.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(riid)),
uintptr(unsafe.Pointer(ppvObject)),
)
if hr != 0 {
return windows.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,59 @@
package edge
import (
"syscall"
"unsafe"
)
// ICoreWebView2CookieList vtable
type iCoreWebView2CookieListVtbl struct {
_IUnknownVtbl
GetCount ComProc
GetItem ComProc
}
// ICoreWebView2CookieList represents a list of cookies
type ICoreWebView2CookieList struct {
vtbl *iCoreWebView2CookieListVtbl
}
// AddRef increments reference count of the ICoreWebView2CookieList interface
func (i *ICoreWebView2CookieList) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
// Release decrements reference count of the ICoreWebView2CookieList interface
func (i *ICoreWebView2CookieList) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
// GetCount gets the number of cookies in the list
func (i *ICoreWebView2CookieList) GetCount() (uint32, error) {
var count uint32
hr, _, _ := i.vtbl.GetCount.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&count)),
)
if hr != 0 {
return 0, syscall.Errno(hr)
}
return count, nil
}
// GetItem gets the cookie at the specified index
func (i *ICoreWebView2CookieList) GetItem(index uint32) (*ICoreWebView2Cookie, error) {
var cookie *ICoreWebView2Cookie
hr, _, _ := i.vtbl.GetItem.Call(
uintptr(unsafe.Pointer(i)),
uintptr(index),
uintptr(unsafe.Pointer(&cookie)),
)
if hr != 0 {
return nil, syscall.Errno(hr)
}
return cookie, nil
}

View File

@@ -0,0 +1,187 @@
package edge
import (
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
// ICoreWebView2CookieManager vtable
type iCoreWebView2CookieManagerVtbl struct {
_IUnknownVtbl
CreateCookie ComProc
CopyCookie ComProc
GetCookies ComProc
AddOrUpdateCookie ComProc
DeleteCookie ComProc
DeleteCookies ComProc
DeleteCookiesWithDomainAndPath ComProc
DeleteAllCookies ComProc
}
// ICoreWebView2CookieManager represents the cookie manager interface
type ICoreWebView2CookieManager struct {
vtbl *iCoreWebView2CookieManagerVtbl
}
// AddRef increments the reference count of ICoreWebView2CookieManager interface
func (i *ICoreWebView2CookieManager) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
// Release decrements the reference count of ICoreWebView2CookieManager interface
func (i *ICoreWebView2CookieManager) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
// CreateCookie creates a new cookie with the given parameters
func (i *ICoreWebView2CookieManager) CreateCookie(name, value, domain, path string) (*ICoreWebView2Cookie, error) {
var cookie *ICoreWebView2Cookie
nameutf16, err := windows.UTF16PtrFromString(name)
if err != nil {
return nil, err
}
valueutf16, err := windows.UTF16PtrFromString(value)
if err != nil {
return nil, err
}
domainutf16, err := windows.UTF16PtrFromString(domain)
if err != nil {
return nil, err
}
pathutf16, err := windows.UTF16PtrFromString(path)
if err != nil {
return nil, err
}
hr, _, _ := i.vtbl.CreateCookie.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(nameutf16)),
uintptr(unsafe.Pointer(valueutf16)),
uintptr(unsafe.Pointer(domainutf16)),
uintptr(unsafe.Pointer(pathutf16)),
uintptr(unsafe.Pointer(&cookie)),
)
if hr != 0 {
return nil, syscall.Errno(hr)
}
return cookie, nil
}
// CopyCookie creates a copy of the given cookie
func (i *ICoreWebView2CookieManager) CopyCookie(cookie *ICoreWebView2Cookie) (*ICoreWebView2Cookie, error) {
var newCookie *ICoreWebView2Cookie
hr, _, _ := i.vtbl.CopyCookie.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(cookie)),
uintptr(unsafe.Pointer(&newCookie)),
)
if hr != 0 {
return nil, syscall.Errno(hr)
}
return newCookie, nil
}
// GetCookies gets all cookies matching the URI
func (i *ICoreWebView2CookieManager) GetCookies(uri string) (*ICoreWebView2CookieList, error) {
var list *ICoreWebView2CookieList
uriutf16, err := windows.UTF16PtrFromString(uri)
if err != nil {
return nil, err
}
hr, _, _ := i.vtbl.GetCookies.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(uriutf16)),
uintptr(unsafe.Pointer(&list)),
)
if hr != 0 {
return nil, syscall.Errno(hr)
}
return list, nil
}
// DeleteCookies deletes all cookies with matching name and uri
func (i *ICoreWebView2CookieManager) DeleteCookies(name, uri string) error {
nameutf16, err := windows.UTF16PtrFromString(name)
if err != nil {
return err
}
uriutf16, err := windows.UTF16PtrFromString(uri)
if err != nil {
return err
}
hr, _, _ := i.vtbl.DeleteCookies.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(nameutf16)),
uintptr(unsafe.Pointer(uriutf16)),
)
if hr != 0 {
return syscall.Errno(hr)
}
return nil
}
// DeleteCookiesWithDomainAndPath deletes all cookies matching the domain and path
func (i *ICoreWebView2CookieManager) DeleteCookiesWithDomainAndPath(domain, path string) error {
domainutf16, err := windows.UTF16PtrFromString(domain)
if err != nil {
return err
}
pathutf16, err := windows.UTF16PtrFromString(path)
if err != nil {
return err
}
hr, _, _ := i.vtbl.DeleteCookiesWithDomainAndPath.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(domainutf16)),
uintptr(unsafe.Pointer(pathutf16)),
)
if hr != 0 {
return syscall.Errno(hr)
}
return nil
}
// AddOrUpdateCookie adds or updates a cookie
func (i *ICoreWebView2CookieManager) AddOrUpdateCookie(cookie *ICoreWebView2Cookie) error {
hr, _, _ := i.vtbl.AddOrUpdateCookie.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(cookie)),
)
if hr != 0 {
return syscall.Errno(hr)
}
return nil
}
// DeleteCookie deletes a specific cookie
func (i *ICoreWebView2CookieManager) DeleteCookie(cookie *ICoreWebView2Cookie) error {
hr, _, _ := i.vtbl.DeleteCookie.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(cookie)),
)
if hr != 0 {
return syscall.Errno(hr)
}
return nil
}
// DeleteAllCookies deletes all cookies
func (i *ICoreWebView2CookieManager) DeleteAllCookies() error {
hr, _, _ := i.vtbl.DeleteAllCookies.Call(
uintptr(unsafe.Pointer(i)),
)
if hr != 0 {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,60 @@
//go:build windows
package edge
import (
"unsafe"
)
type _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl struct {
_IUnknownVtbl
Invoke ComProc
}
type iCoreWebView2CreateCoreWebView2ControllerCompletedHandler struct {
vtbl *_ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl
impl _ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerImpl
}
func (i *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
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,
}
}

View File

@@ -0,0 +1,50 @@
//go:build windows
package edge
import (
"errors"
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
type ICoreWebView2DeferralVtbl struct {
_IUnknownVtbl
Complete ComProc
}
type ICoreWebView2Deferral struct {
Vtbl *ICoreWebView2DeferralVtbl
}
// AddRef increments the reference count of ICoreWebView2Deferral interface
func (i *ICoreWebView2Deferral) AddRef() error {
_, _, err := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
if err != nil && !errors.Is(err, windows.ERROR_SUCCESS) {
return err
}
return nil
}
// Release decrements the reference count of ICoreWebView2Deferral interface
func (i *ICoreWebView2Deferral) Release() error {
_, _, err := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
if err != nil && !errors.Is(err, windows.ERROR_SUCCESS) {
return err
}
return nil
}
func (i *ICoreWebView2Deferral) Complete() error {
hr, _, _ := i.Vtbl.Complete.Call(
uintptr(unsafe.Pointer(i)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,64 @@
package edge
import (
"unsafe"
)
type _ICoreWebView2ExecuteScriptCompletedHandlerVtbl struct {
_IUnknownVtbl
Invoke ComProc
}
type iCoreWebView2ExecuteScriptCompletedHandler struct {
vtbl *_ICoreWebView2ExecuteScriptCompletedHandlerVtbl
impl _ICoreWebView2ExecuteScriptCompletedHandlerImpl
}
func (i *iCoreWebView2ExecuteScriptCompletedHandler) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *iCoreWebView2ExecuteScriptCompletedHandler) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func _ICoreWebView2ExecuteScriptCompletedHandlerIUnknownQueryInterface(this *iCoreWebView2ExecuteScriptCompletedHandler, refiid, object uintptr) uintptr {
return this.impl.QueryInterface(refiid, object)
}
func _ICoreWebView2ExecuteScriptCompletedHandlerIUnknownAddRef(this *iCoreWebView2ExecuteScriptCompletedHandler) uintptr {
return this.impl.AddRef()
}
func _ICoreWebView2ExecuteScriptCompletedHandlerIUnknownRelease(this *iCoreWebView2ExecuteScriptCompletedHandler) uintptr {
return this.impl.Release()
}
func iCoreWebView2ExecuteScriptCompletedHandlerInvoke(this *iCoreWebView2ExecuteScriptCompletedHandler, errorCode uintptr, executedScript *uint16) uintptr {
return this.impl.ExecuteScriptCompleted(errorCode, executedScript)
}
type _ICoreWebView2ExecuteScriptCompletedHandlerImpl interface {
_IUnknownImpl
ExecuteScriptCompleted(errorCode uintptr, executedScript *uint16) uintptr
}
var _ICoreWebView2ExecuteScriptCompletedHandlerFn = _ICoreWebView2ExecuteScriptCompletedHandlerVtbl{
_IUnknownVtbl{
NewComProc(_ICoreWebView2ExecuteScriptCompletedHandlerIUnknownQueryInterface),
NewComProc(_ICoreWebView2ExecuteScriptCompletedHandlerIUnknownAddRef),
NewComProc(_ICoreWebView2ExecuteScriptCompletedHandlerIUnknownRelease),
},
NewComProc(iCoreWebView2ExecuteScriptCompletedHandlerInvoke),
}
func newICoreWebView2ExecuteScriptCompletedHandler(impl _ICoreWebView2ExecuteScriptCompletedHandlerImpl) *iCoreWebView2ExecuteScriptCompletedHandler {
return &iCoreWebView2ExecuteScriptCompletedHandler{
vtbl: &_ICoreWebView2ExecuteScriptCompletedHandlerFn,
impl: impl,
}
}

View File

@@ -0,0 +1,46 @@
//go:build windows
package edge
import (
"unsafe"
"golang.org/x/sys/windows"
)
type _ICoreWebView2FileVtbl struct {
_IUnknownVtbl
GetPath ComProc
}
type ICoreWebView2File struct {
vtbl *_ICoreWebView2FileVtbl
}
func (i *ICoreWebView2File) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2File) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2File) GetPath() (string, error) {
var _path *uint16
hr, _, _ := i.vtbl.GetPath.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_path)),
)
if windows.Handle(hr) != windows.S_OK {
return "", windows.Errno(hr)
}
path := windows.UTF16PtrToString(_path)
windows.CoTaskMemFree(unsafe.Pointer(_path))
return path, nil
}

View File

@@ -0,0 +1,77 @@
//go:build windows
package edge
import (
"unsafe"
"golang.org/x/sys/windows"
)
type _ICoreWebView2HttpHeadersCollectionIteratorVtbl struct {
_IUnknownVtbl
GetCurrentHeader ComProc
GetHasCurrentHeader ComProc
MoveNext ComProc
}
type ICoreWebView2HttpHeadersCollectionIterator struct {
vtbl *_ICoreWebView2HttpHeadersCollectionIteratorVtbl
}
func (i *ICoreWebView2HttpHeadersCollectionIterator) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2HttpHeadersCollectionIterator) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2HttpHeadersCollectionIterator) HasCurrentHeader() (bool, error) {
var hasHeader int32
hr, _, _ := i.vtbl.GetHasCurrentHeader.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&hasHeader)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return hasHeader != 0, nil
}
func (i *ICoreWebView2HttpHeadersCollectionIterator) GetCurrentHeader() (string, string, error) {
// Create *uint16 to hold result
var _name *uint16
var _value *uint16
hr, _, _ := i.vtbl.GetCurrentHeader.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_name)),
uintptr(unsafe.Pointer(&_value)),
)
if windows.Handle(hr) != windows.S_OK {
return "", "", windows.Errno(hr)
}
// 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
hr, _, _ := i.vtbl.MoveNext.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&next)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return next != 0, nil
}

View File

@@ -0,0 +1,102 @@
//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) AddRef() error {
i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return nil
}
func (i *ICoreWebView2HttpRequestHeaders) Release() error {
i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return nil
}
// 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 "", err
}
var _value *uint16
hr, _, _ := i.vtbl.GetHeader.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_name)),
uintptr(unsafe.Pointer(&_value)),
)
if windows.Handle(hr) != windows.S_OK {
return "", windows.Errno(hr)
}
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 err
}
_value, err := windows.UTF16PtrFromString(value)
if err != nil {
return err
}
hr, _, _ := i.vtbl.SetHeader.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_name)),
uintptr(unsafe.Pointer(_value)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
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
hr, _, _ := i.vtbl.GetIterator.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&headers)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
return headers, nil
}

View File

@@ -0,0 +1,58 @@
//go:build windows
package edge
import (
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
type _ICoreWebView2HttpResponseHeadersVtbl struct {
_IUnknownVtbl
AppendHeader ComProc
Contains ComProc
GetHeader ComProc
GetHeaders ComProc
GetIterator ComProc
}
type ICoreWebView2HttpResponseHeaders struct {
vtbl *_ICoreWebView2HttpResponseHeadersVtbl
}
func (i *ICoreWebView2HttpResponseHeaders) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2HttpResponseHeaders) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2HttpResponseHeaders) AppendHeader(name string, value string) error {
// Convert string 'name' to *uint16
_name, err := UTF16PtrFromString(name)
if err != nil {
return err
}
// Convert string 'value' to *uint16
_value, err := UTF16PtrFromString(value)
if err != nil {
return err
}
hr, _, _ := i.vtbl.AppendHeader.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_name)),
uintptr(unsafe.Pointer(_value)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,30 @@
//go:build windows
package edge
import (
"unsafe"
)
type _ICoreWebView2NavigationCompletedEventArgsVtbl struct {
_IUnknownVtbl
GetIsSuccess ComProc
GetWebErrorStatus ComProc
GetNavigationId ComProc
}
type ICoreWebView2NavigationCompletedEventArgs struct {
vtbl *_ICoreWebView2NavigationCompletedEventArgsVtbl
}
func (i *ICoreWebView2NavigationCompletedEventArgs) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2NavigationCompletedEventArgs) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}

View File

@@ -0,0 +1,59 @@
//go:build windows
package edge
import (
"unsafe"
)
type _ICoreWebView2NavigationCompletedEventHandlerVtbl struct {
_IUnknownVtbl
Invoke ComProc
}
type ICoreWebView2NavigationCompletedEventHandler struct {
vtbl *_ICoreWebView2NavigationCompletedEventHandlerVtbl
impl _ICoreWebView2NavigationCompletedEventHandlerImpl
}
func (i *ICoreWebView2NavigationCompletedEventHandler) AddRef() uintptr {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}
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,
}
}

View File

@@ -0,0 +1,58 @@
//go:build windows
package edge
import (
"unsafe"
"golang.org/x/sys/windows"
)
type _ICoreWebView2ObjectCollectionViewVtbl struct {
_IUnknownVtbl
GetCount ComProc
GetValueAtIndex ComProc
}
type ICoreWebView2ObjectCollectionView struct {
vtbl *_ICoreWebView2ObjectCollectionViewVtbl
}
func (i *ICoreWebView2ObjectCollectionView) AddRef() error {
i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return nil
}
func (i *ICoreWebView2ObjectCollectionView) Release() error {
i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return nil
}
func (i *ICoreWebView2ObjectCollectionView) GetCount() (uint32, error) {
var value uint32
hr, _, _ := i.vtbl.GetCount.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&value)),
)
if windows.Handle(hr) != windows.S_OK {
return 0, windows.Errno(hr)
}
return value, nil
}
func (i *ICoreWebView2ObjectCollectionView) GetValueAtIndex(index uint32) (*_IUnknownVtbl, error) {
var value *_IUnknownVtbl
hr, _, _ := i.vtbl.GetValueAtIndex.Call(
uintptr(unsafe.Pointer(i)),
uintptr(index),
uintptr(unsafe.Pointer(&value)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
return value, nil
}

View File

@@ -0,0 +1,38 @@
//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, _, _ := 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 {
return 0, fmt.Errorf("unknown error")
}
return kind, nil
}

View File

@@ -0,0 +1,59 @@
//go:build windows
package edge
import (
"unsafe"
)
type _ICoreWebView2ProcessFailedEventHandlerVtbl struct {
_IUnknownVtbl
Invoke ComProc
}
type ICoreWebView2ProcessFailedEventHandler struct {
vtbl *_ICoreWebView2ProcessFailedEventHandlerVtbl
impl _ICoreWebView2ProcessFailedEventHandlerImpl
}
func (i *ICoreWebView2ProcessFailedEventHandler) AddRef() uintptr {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}
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,
}
}

View File

@@ -0,0 +1,59 @@
//go:build windows
package edge
import (
"unsafe"
)
type ICoreWebView2RasterizationScaleChangedEventHandlerVtbl struct {
IUnknownVtbl
Invoke ComProc
}
type ICoreWebView2RasterizationScaleChangedEventHandler struct {
Vtbl *ICoreWebView2RasterizationScaleChangedEventHandlerVtbl
impl ICoreWebView2RasterizationScaleChangedEventHandlerImpl
}
func (i *ICoreWebView2RasterizationScaleChangedEventHandler) AddRef() uintptr {
refCounter, _, _ := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return refCounter
}
func ICoreWebView2RasterizationScaleChangedEventHandlerIUnknownQueryInterface(this *ICoreWebView2RasterizationScaleChangedEventHandler, refiid, object uintptr) uintptr {
return this.impl.QueryInterface(refiid, object)
}
func ICoreWebView2RasterizationScaleChangedEventHandlerIUnknownAddRef(this *ICoreWebView2RasterizationScaleChangedEventHandler) uintptr {
return this.impl.AddRef()
}
func ICoreWebView2RasterizationScaleChangedEventHandlerIUnknownRelease(this *ICoreWebView2RasterizationScaleChangedEventHandler) uintptr {
return this.impl.Release()
}
func ICoreWebView2RasterizationScaleChangedEventHandlerInvoke(this *ICoreWebView2RasterizationScaleChangedEventHandler, sender *ICoreWebView2Controller, args *IUnknown) uintptr {
return this.impl.RasterizationScaleChanged(sender, args)
}
type ICoreWebView2RasterizationScaleChangedEventHandlerImpl interface {
IUnknownImpl
RasterizationScaleChanged(sender *ICoreWebView2Controller, args *IUnknown) uintptr
}
var ICoreWebView2RasterizationScaleChangedEventHandlerFn = ICoreWebView2RasterizationScaleChangedEventHandlerVtbl{
IUnknownVtbl{
NewComProc(ICoreWebView2RasterizationScaleChangedEventHandlerIUnknownQueryInterface),
NewComProc(ICoreWebView2RasterizationScaleChangedEventHandlerIUnknownAddRef),
NewComProc(ICoreWebView2RasterizationScaleChangedEventHandlerIUnknownRelease),
},
NewComProc(ICoreWebView2RasterizationScaleChangedEventHandlerInvoke),
}
func NewICoreWebView2RasterizationScaleChangedEventHandler(impl ICoreWebView2RasterizationScaleChangedEventHandlerImpl) *ICoreWebView2RasterizationScaleChangedEventHandler {
return &ICoreWebView2RasterizationScaleChangedEventHandler{
Vtbl: &ICoreWebView2RasterizationScaleChangedEventHandlerFn,
impl: impl,
}
}

View File

@@ -0,0 +1,273 @@
//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 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}
func (i *ICoreWebView2Settings) GetIsScriptEnabled() (bool, error) {
var isScriptEnabled bool
hr, _, _ := i.vtbl.GetIsScriptEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&isScriptEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return isScriptEnabled, nil
}
func (i *ICoreWebView2Settings) PutIsScriptEnabled(isScriptEnabled bool) error {
hr, _, _ := i.vtbl.PutIsScriptEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(isScriptEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Settings) GetIsWebMessageEnabled() (bool, error) {
var isWebMessageEnabled bool
hr, _, _ := i.vtbl.GetIsWebMessageEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&isWebMessageEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return isWebMessageEnabled, nil
}
func (i *ICoreWebView2Settings) PutIsWebMessageEnabled(isWebMessageEnabled bool) error {
hr, _, _ := i.vtbl.PutIsWebMessageEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(isWebMessageEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Settings) GetAreDefaultScriptDialogsEnabled() (bool, error) {
var areDefaultScriptDialogsEnabled bool
hr, _, _ := i.vtbl.GetAreDefaultScriptDialogsEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&areDefaultScriptDialogsEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return areDefaultScriptDialogsEnabled, nil
}
func (i *ICoreWebView2Settings) PutAreDefaultScriptDialogsEnabled(areDefaultScriptDialogsEnabled bool) error {
hr, _, _ := i.vtbl.PutAreDefaultScriptDialogsEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(areDefaultScriptDialogsEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Settings) GetIsStatusBarEnabled() (bool, error) {
var isStatusBarEnabled bool
hr, _, _ := i.vtbl.GetIsStatusBarEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&isStatusBarEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return isStatusBarEnabled, nil
}
func (i *ICoreWebView2Settings) PutIsStatusBarEnabled(isStatusBarEnabled bool) error {
hr, _, _ := i.vtbl.PutIsStatusBarEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(isStatusBarEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Settings) GetAreDevToolsEnabled() (bool, error) {
var areDevToolsEnabled bool
hr, _, _ := i.vtbl.GetAreDevToolsEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&areDevToolsEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return areDevToolsEnabled, nil
}
func (i *ICoreWebView2Settings) PutAreDevToolsEnabled(areDevToolsEnabled bool) error {
hr, _, _ := i.vtbl.PutAreDevToolsEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(areDevToolsEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Settings) GetAreDefaultContextMenusEnabled() (bool, error) {
var enabled bool
hr, _, _ := i.vtbl.GetAreDefaultContextMenusEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return enabled, nil
}
func (i *ICoreWebView2Settings) PutAreDefaultContextMenusEnabled(enabled bool) error {
hr, _, _ := i.vtbl.PutAreDefaultContextMenusEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Settings) GetAreHostObjectsAllowed() (bool, error) {
var allowed bool
hr, _, _ := i.vtbl.GetAreHostObjectsAllowed.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&allowed)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return allowed, nil
}
func (i *ICoreWebView2Settings) PutAreHostObjectsAllowed(allowed bool) error {
hr, _, _ := i.vtbl.PutAreHostObjectsAllowed.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(allowed)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Settings) GetIsZoomControlEnabled() (bool, error) {
var enabled bool
hr, _, _ := i.vtbl.GetIsZoomControlEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return enabled, nil
}
func (i *ICoreWebView2Settings) PutIsZoomControlEnabled(enabled bool) error {
hr, _, _ := i.vtbl.PutIsZoomControlEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Settings) GetIsBuiltInErrorPageEnabled() (bool, error) {
var enabled bool
hr, _, _ := i.vtbl.GetIsBuiltInErrorPageEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return enabled, nil
}
func (i *ICoreWebView2Settings) PutIsBuiltInErrorPageEnabled(enabled bool) error {
hr, _, _ := i.vtbl.PutIsBuiltInErrorPageEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,89 @@
//go:build windows
package edge
import (
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
type ICoreWebView2Settings2Vtbl 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
PutUserAgent ComProc
}
type ICoreWebView2Settings2 struct {
Vtbl *ICoreWebView2Settings2Vtbl
}
func (i *ICoreWebView2Settings2) AddRef() uintptr {
refCounter, _, _ := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return refCounter
}
func (i *ICoreWebViewSettings) GetICoreWebView2Settings2() *ICoreWebView2Settings2 {
var result *ICoreWebView2Settings2
iidICoreWebView2Settings2 := NewGUID("{ee9a0f68-f46c-4e32-ac23-ef8cac224d2a}")
_, _, _ = i.vtbl.QueryInterface.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(iidICoreWebView2Settings2)),
uintptr(unsafe.Pointer(&result)))
return result
}
func (i *ICoreWebView2Settings2) GetUserAgent() (string, error) {
// Create *uint16 to hold result
var _userAgent *uint16
hr, _, _ := i.Vtbl.GetUserAgent.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_userAgent)),
)
if windows.Handle(hr) != windows.S_OK {
return "", syscall.Errno(hr)
}
// Get result and cleanup
userAgent := UTF16PtrToString(_userAgent)
CoTaskMemFree(unsafe.Pointer(_userAgent))
return userAgent, nil
}
func (i *ICoreWebView2Settings2) PutUserAgent(userAgent string) error {
// Convert string 'userAgent' to *uint16
_userAgent, err := UTF16PtrFromString(userAgent)
if err != nil {
return err
}
hr, _, _ := i.Vtbl.PutUserAgent.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_userAgent)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,84 @@
//go:build windows
package edge
import (
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
type ICoreWebView2Settings3Vtbl 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
PutUserAgent ComProc
GetAreBrowserAcceleratorKeysEnabled ComProc
PutAreBrowserAcceleratorKeysEnabled ComProc
}
type ICoreWebView2Settings3 struct {
Vtbl *ICoreWebView2Settings3Vtbl
}
func (i *ICoreWebView2Settings3) AddRef() uintptr {
refCounter, _, _ := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return refCounter
}
func (i *ICoreWebViewSettings) GetICoreWebView2Settings3() *ICoreWebView2Settings3 {
var result *ICoreWebView2Settings3
iidICoreWebView2Settings3 := NewGUID("{fdb5ab74-af33-4854-84f0-0a631deb5eba}")
_, _, _ = i.vtbl.QueryInterface.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(iidICoreWebView2Settings3)),
uintptr(unsafe.Pointer(&result)))
return result
}
func (i *ICoreWebView2Settings3) GetAreBrowserAcceleratorKeysEnabled() (bool, error) {
// Create int32 to hold bool result
var _areBrowserAcceleratorKeysEnabled int32
hr, _, _ := i.Vtbl.GetAreBrowserAcceleratorKeysEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_areBrowserAcceleratorKeysEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, syscall.Errno(hr)
}
// Get result and cleanup
areBrowserAcceleratorKeysEnabled := _areBrowserAcceleratorKeysEnabled != 0
return areBrowserAcceleratorKeysEnabled, nil
}
func (i *ICoreWebView2Settings3) PutAreBrowserAcceleratorKeysEnabled(areBrowserAcceleratorKeysEnabled bool) error {
hr, _, _ := i.Vtbl.PutAreBrowserAcceleratorKeysEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&areBrowserAcceleratorKeysEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,121 @@
//go:build windows
package edge
import (
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
type ICoreWebView2Settings4Vtbl 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
PutUserAgent ComProc
GetAreBrowserAcceleratorKeysEnabled ComProc
PutAreBrowserAcceleratorKeysEnabled ComProc
GetIsPasswordAutosaveEnabled ComProc
PutIsPasswordAutosaveEnabled ComProc
GetIsGeneralAutofillEnabled ComProc
PutIsGeneralAutofillEnabled ComProc
}
type ICoreWebView2Settings4 struct {
Vtbl *ICoreWebView2Settings4Vtbl
}
func (i *ICoreWebView2Settings4) AddRef() uintptr {
refCounter, _, _ := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return refCounter
}
func (i *ICoreWebViewSettings) GetICoreWebView2Settings4() *ICoreWebView2Settings4 {
var result *ICoreWebView2Settings4
iidICoreWebView2Settings4 := NewGUID("{cb56846c-4168-4d53-b04f-03b6d6796ff2}")
_, _, _ = i.vtbl.QueryInterface.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(iidICoreWebView2Settings4)),
uintptr(unsafe.Pointer(&result)))
return result
}
func (i *ICoreWebView2Settings4) GetIsPasswordAutosaveEnabled() (bool, error) {
// Create int32 to hold bool result
var _value int32
hr, _, _ := i.Vtbl.GetIsPasswordAutosaveEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_value)),
)
if windows.Handle(hr) != windows.S_OK {
return false, syscall.Errno(hr)
}
// Get result and cleanup
value := _value != 0
return value, nil
}
// PutIsPasswordAutosaveEnabled sets the IsPasswordAutosaveEnabled property.
// The default value is `FALSE`.
func (i *ICoreWebView2Settings4) PutIsPasswordAutosaveEnabled(value bool) error {
hr, _, _ := i.Vtbl.PutIsPasswordAutosaveEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(value)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}
func (i *ICoreWebView2Settings4) GetIsGeneralAutofillEnabled() (bool, error) {
// Create int32 to hold bool result
var _value int32
hr, _, _ := i.Vtbl.GetIsGeneralAutofillEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_value)),
)
if windows.Handle(hr) != windows.S_OK {
return false, syscall.Errno(hr)
}
// Get result and cleanup
value := _value != 0
return value, nil
}
func (i *ICoreWebView2Settings4) PutIsGeneralAutofillEnabled(value bool) error {
hr, _, _ := i.Vtbl.PutIsGeneralAutofillEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(value)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,90 @@
//go:build windows
package edge
import (
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
type ICoreWebView2Settings5Vtbl 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
PutUserAgent ComProc
GetAreBrowserAcceleratorKeysEnabled ComProc
PutAreBrowserAcceleratorKeysEnabled ComProc
GetIsPasswordAutosaveEnabled ComProc
PutIsPasswordAutosaveEnabled ComProc
GetIsGeneralAutofillEnabled ComProc
PutIsGeneralAutofillEnabled ComProc
GetIsPinchZoomEnabled ComProc
PutIsPinchZoomEnabled ComProc
}
type ICoreWebView2Settings5 struct {
Vtbl *ICoreWebView2Settings5Vtbl
}
func (i *ICoreWebView2Settings5) AddRef() uintptr {
refCounter, _, _ := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return refCounter
}
func (i *ICoreWebViewSettings) GetICoreWebView2Settings5() *ICoreWebView2Settings5 {
var result *ICoreWebView2Settings5
iidICoreWebView2Settings5 := NewGUID("{183e7052-1d03-43a0-ab99-98e043b66b39}")
_, _, _ = i.vtbl.QueryInterface.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(iidICoreWebView2Settings5)),
uintptr(unsafe.Pointer(&result)))
return result
}
func (i *ICoreWebView2Settings5) GetIsPinchZoomEnabled() (bool, error) {
// Create int32 to hold bool result
var _enabled int32
hr, _, _ := i.Vtbl.GetIsPinchZoomEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, syscall.Errno(hr)
}
// Get result and cleanup
enabled := _enabled != 0
return enabled, nil
}
func (i *ICoreWebView2Settings5) PutIsPinchZoomEnabled(enabled bool) error {
hr, _, _ := i.Vtbl.PutIsPinchZoomEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,92 @@
//go:build windows
package edge
import (
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
type ICoreWebView2Settings6Vtbl 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
PutUserAgent ComProc
GetAreBrowserAcceleratorKeysEnabled ComProc
PutAreBrowserAcceleratorKeysEnabled ComProc
GetIsPasswordAutosaveEnabled ComProc
PutIsPasswordAutosaveEnabled ComProc
GetIsGeneralAutofillEnabled ComProc
PutIsGeneralAutofillEnabled ComProc
GetIsPinchZoomEnabled ComProc
PutIsPinchZoomEnabled ComProc
GetIsSwipeNavigationEnabled ComProc
PutIsSwipeNavigationEnabled ComProc
}
type ICoreWebView2Settings6 struct {
Vtbl *ICoreWebView2Settings6Vtbl
}
func (i *ICoreWebView2Settings6) AddRef() uintptr {
refCounter, _, _ := i.Vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return refCounter
}
func (i *ICoreWebViewSettings) GetICoreWebView2Settings6() *ICoreWebView2Settings6 {
var result *ICoreWebView2Settings6
iidICoreWebView2Settings6 := NewGUID("{11cb3acd-9bc8-43b8-83bf-f40753714f87}")
i.vtbl.QueryInterface.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(iidICoreWebView2Settings6)),
uintptr(unsafe.Pointer(&result)))
return result
}
func (i *ICoreWebView2Settings6) GetIsSwipeNavigationEnabled() (bool, error) {
// Create int32 to hold bool result
var _enabled int32
hr, _, _ := i.Vtbl.GetIsSwipeNavigationEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, syscall.Errno(hr)
}
// Get result and cleanup
enabled := _enabled != 0
return enabled, nil
}
func (i *ICoreWebView2Settings6) PutIsSwipeNavigationEnabled(enabled bool) error {
hr, _, _ := i.Vtbl.PutIsSwipeNavigationEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,65 @@
//go:build windows
package edge
import (
"unsafe"
"golang.org/x/sys/windows"
)
type iCoreWebView2WebMessageReceivedEventArgsVtbl struct {
_IUnknownVtbl
GetSource ComProc
GetWebMessageAsJSON ComProc
TryGetWebMessageAsString ComProc
GetAdditionalObjects ComProc
}
type ICoreWebView2WebMessageReceivedEventArgs struct {
vtbl *iCoreWebView2WebMessageReceivedEventArgsVtbl
}
func (i *ICoreWebView2WebMessageReceivedEventArgs) GetSource() (string, error) {
var _source *uint16
hr, _, _ := i.vtbl.GetSource.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_source)),
)
if windows.Handle(hr) != windows.S_OK {
return "", windows.Errno(hr)
}
source := windows.UTF16PtrToString(_source)
windows.CoTaskMemFree(unsafe.Pointer(_source))
return source, nil
}
func (i *ICoreWebView2WebMessageReceivedEventArgs) GetAdditionalObjects() (*ICoreWebView2ObjectCollectionView, error) {
var value *ICoreWebView2ObjectCollectionView
hr, _, _ := i.vtbl.GetAdditionalObjects.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&value)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
return value, nil
}
func (i *ICoreWebView2WebMessageReceivedEventArgs) TryGetWebMessageAsString() (string, error) {
var u16msg *uint16
hr, _, _ := i.vtbl.TryGetWebMessageAsString.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&u16msg)),
)
if windows.Handle(hr) != windows.S_OK {
return "", windows.Errno(hr)
}
defer windows.CoTaskMemFree(unsafe.Pointer(u16msg))
msg := windows.UTF16PtrToString(u16msg)
return msg, nil
}

View File

@@ -0,0 +1,50 @@
//go:build windows
package edge
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)
}
type iCoreWebView2WebMessageReceivedEventHandlerImpl interface {
_IUnknownImpl
MessageReceived(sender *ICoreWebView2, args *ICoreWebView2WebMessageReceivedEventArgs) uintptr
}
var iCoreWebView2WebMessageReceivedEventHandlerFn = iCoreWebView2WebMessageReceivedEventHandlerVtbl{
_IUnknownVtbl{
NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerIUnknownQueryInterface),
NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerIUnknownAddRef),
NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerIUnknownRelease),
},
NewComProc(_ICoreWebView2WebMessageReceivedEventHandlerInvoke),
}
func newICoreWebView2WebMessageReceivedEventHandler(impl iCoreWebView2WebMessageReceivedEventHandlerImpl) *iCoreWebView2WebMessageReceivedEventHandler {
return &iCoreWebView2WebMessageReceivedEventHandler{
vtbl: &iCoreWebView2WebMessageReceivedEventHandlerFn,
impl: impl,
}
}

View File

@@ -0,0 +1,96 @@
//go:build windows
package edge
import (
"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 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return ret
}
func (i *ICoreWebView2WebResourceRequest) Release() uintptr {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return ret
}
func (i *ICoreWebView2WebResourceRequest) GetMethod() (string, error) {
// Create *uint16 to hold result
var _method *uint16
hr, _, _ := i.vtbl.GetMethod.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_method)),
)
if windows.Handle(hr) != windows.S_OK {
return "", windows.Errno(hr)
}
// Get result and cleanup
uri := windows.UTF16PtrToString(_method)
windows.CoTaskMemFree(unsafe.Pointer(_method))
return uri, nil
}
func (i *ICoreWebView2WebResourceRequest) GetUri() (string, error) {
// Create *uint16 to hold result
var _uri *uint16
hr, _, _ := i.vtbl.GetUri.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_uri)),
)
if windows.Handle(hr) != windows.S_OK {
return "", windows.Errno(hr)
} // 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
hr, _, _ := i.vtbl.GetContent.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&stream)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
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
hr, _, _ := i.vtbl.GetHeaders.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&headers)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
return headers, nil
}

View File

@@ -0,0 +1,80 @@
//go:build windows
package edge
import (
"fmt"
"syscall"
"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() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2WebResourceRequestedEventArgs) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2WebResourceRequestedEventArgs) PutResponse(response *ICoreWebView2WebResourceResponse) error {
hr, _, _ := i.vtbl.PutResponse.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(response)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2WebResourceRequestedEventArgs) GetRequest() (*ICoreWebView2WebResourceRequest, error) {
var request *ICoreWebView2WebResourceRequest
hr, _, _ := i.vtbl.GetRequest.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&request)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
return request, nil
}
func (i *ICoreWebView2WebResourceRequestedEventArgs) GetDeferral() (*ICoreWebView2Deferral, error) {
var deferral *ICoreWebView2Deferral
hr, _, _ := i.vtbl.GetDeferral.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&deferral)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, syscall.Errno(hr)
}
if deferral == nil {
return nil, fmt.Errorf("unknown error")
}
return deferral, nil
}

View File

@@ -0,0 +1,50 @@
//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,
}
}

View File

@@ -0,0 +1,118 @@
//go:build windows
package edge
import (
"errors"
"fmt"
"net/http"
"syscall"
"unsafe"
"github.com/wailsapp/go-webview2/internal/w32"
"golang.org/x/sys/windows"
)
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() error {
_, _, err := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
if err != nil && !errors.Is(err, windows.ERROR_SUCCESS) {
return err
}
return nil
}
func (i *ICoreWebView2WebResourceResponse) Release() error {
_, _, err := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
if err != nil && !errors.Is(err, windows.ERROR_SUCCESS) {
return err
}
return nil
}
// GetHeaders returns the mutable HTTP request headers. Make sure to call
// Release on the returned Object after finished using it.
func (i *ICoreWebView2WebResourceResponse) GetHeaders() (*ICoreWebView2HttpResponseHeaders, error) {
var headers *ICoreWebView2HttpResponseHeaders
hr, _, _ := i.vtbl.GetHeaders.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&headers)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, syscall.Errno(hr)
}
if headers == nil {
return nil, fmt.Errorf("unknown error")
}
return headers, nil
}
func (i *ICoreWebView2WebResourceResponse) PutStatusCode(statusCode int) error {
hr, _, _ := i.vtbl.PutStatusCode.Call(
uintptr(unsafe.Pointer(i)),
uintptr(statusCode),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
// Convert string 'reasonPhrase' to *uint16
_reasonPhrase, err := UTF16PtrFromString(http.StatusText(statusCode))
if err != nil {
return err
}
hr, _, _ = i.vtbl.PutReasonPhrase.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_reasonPhrase)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}
func (i *ICoreWebView2WebResourceResponse) PutContent(content *IStream) error {
hr, _, _ := i.vtbl.PutContent.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(content)),
)
if windows.Handle(hr) != windows.S_OK {
return syscall.Errno(hr)
}
return nil
}
func (i *ICoreWebView2WebResourceResponse) PutByteContent(content []byte) error {
var stream *IStream
if len(content) > 0 {
// Create stream for response
str, err := w32.SHCreateMemStream(content)
if err != nil {
return err
}
stream = (*IStream)(unsafe.Pointer(str))
defer stream.Release()
}
return i.PutContent(stream)
}

View File

@@ -0,0 +1,113 @@
//go:build windows
package edge
import (
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
type iCoreWebView2_2Vtbl struct {
QueryInterface ComProc
AddRef ComProc
Release ComProc
// ICoreWebView2 methods
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
// ICoreWebView2_2 methods
AddWebResourceResponseReceived ComProc
RemoveWebResourceResponseReceived ComProc
NavigateWithWebResourceRequest ComProc
AddDomContentLoaded ComProc
RemoveDomContentLoaded ComProc
GetCookieManager ComProc
GetEnvironment ComProc
}
type ICoreWebView2_2 struct {
vtbl *iCoreWebView2_2Vtbl
}
// AddRef increments the reference count of the ICoreWebView2_2 interface
func (i *ICoreWebView2_2) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
// Release decrements the reference count of the ICoreWebView2_2 interface
func (i *ICoreWebView2_2) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2_2) GetCookieManager() (*ICoreWebView2CookieManager, error) {
var cookieManager *ICoreWebView2CookieManager
hr, _, _ := i.vtbl.GetCookieManager.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&cookieManager)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, syscall.Errno(hr)
}
return cookieManager, nil
}

View File

@@ -0,0 +1,74 @@
//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) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2_3) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
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
}
hr, _, _ := i.vtbl.SetVirtualHostNameToFolderMapping.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_hostName)),
uintptr(unsafe.Pointer(_folderPath)),
uintptr(accessKind),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
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()
}

View File

@@ -0,0 +1,370 @@
//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() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebViewSettings) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebViewSettings) GetIsScriptEnabled() (bool, error) {
var isScriptEnabled bool
hr, _, _ := i.vtbl.GetIsScriptEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&isScriptEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return isScriptEnabled, nil
}
func (i *ICoreWebViewSettings) PutIsScriptEnabled(isScriptEnabled bool) error {
hr, _, _ := i.vtbl.PutIsScriptEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(isScriptEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetIsWebMessageEnabled() (bool, error) {
var isWebMessageEnabled bool
hr, _, _ := i.vtbl.GetIsWebMessageEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&isWebMessageEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return isWebMessageEnabled, nil
}
func (i *ICoreWebViewSettings) PutIsWebMessageEnabled(isWebMessageEnabled bool) error {
hr, _, _ := i.vtbl.PutIsWebMessageEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(isWebMessageEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetAreDefaultScriptDialogsEnabled() (bool, error) {
var areDefaultScriptDialogsEnabled bool
hr, _, _ := i.vtbl.GetAreDefaultScriptDialogsEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&areDefaultScriptDialogsEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return areDefaultScriptDialogsEnabled, nil
}
func (i *ICoreWebViewSettings) PutAreDefaultScriptDialogsEnabled(areDefaultScriptDialogsEnabled bool) error {
hr, _, _ := i.vtbl.PutAreDefaultScriptDialogsEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(areDefaultScriptDialogsEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetIsStatusBarEnabled() (bool, error) {
var isStatusBarEnabled bool
hr, _, _ := i.vtbl.GetIsStatusBarEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&isStatusBarEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return isStatusBarEnabled, nil
}
func (i *ICoreWebViewSettings) PutIsStatusBarEnabled(isStatusBarEnabled bool) error {
hr, _, _ := i.vtbl.PutIsStatusBarEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(isStatusBarEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetAreDevToolsEnabled() (bool, error) {
var areDevToolsEnabled bool
hr, _, _ := i.vtbl.GetAreDevToolsEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&areDevToolsEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return areDevToolsEnabled, nil
}
func (i *ICoreWebViewSettings) PutAreDevToolsEnabled(areDevToolsEnabled bool) error {
hr, _, _ := i.vtbl.PutAreDevToolsEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(areDevToolsEnabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetAreDefaultContextMenusEnabled() (bool, error) {
var enabled bool
hr, _, _ := i.vtbl.GetAreDefaultContextMenusEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return enabled, nil
}
func (i *ICoreWebViewSettings) PutAreDefaultContextMenusEnabled(enabled bool) error {
hr, _, _ := i.vtbl.PutAreDefaultContextMenusEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetAreHostObjectsAllowed() (bool, error) {
var allowed bool
hr, _, _ := i.vtbl.GetAreHostObjectsAllowed.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&allowed)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return allowed, nil
}
func (i *ICoreWebViewSettings) PutAreHostObjectsAllowed(allowed bool) error {
hr, _, _ := i.vtbl.PutAreHostObjectsAllowed.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(allowed)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetIsZoomControlEnabled() (bool, error) {
var enabled bool
hr, _, _ := i.vtbl.GetIsZoomControlEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return enabled, nil
}
func (i *ICoreWebViewSettings) PutIsZoomControlEnabled(enabled bool) error {
hr, _, _ := i.vtbl.PutIsZoomControlEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetIsBuiltInErrorPageEnabled() (bool, error) {
var enabled bool
hr, _, _ := i.vtbl.GetIsBuiltInErrorPageEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return enabled, nil
}
func (i *ICoreWebViewSettings) PutIsBuiltInErrorPageEnabled(enabled bool) error {
hr, _, _ := i.vtbl.PutIsBuiltInErrorPageEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetUserAgent() (string, error) {
// Create *uint16 to hold result
var _userAgent *uint16
hr, _, _ := i.vtbl.GetUserAgent.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_userAgent)),
)
if windows.Handle(hr) != windows.S_OK {
return "", windows.Errno(hr)
} // Get result and cleanup
userAgent := windows.UTF16PtrToString(_userAgent)
windows.CoTaskMemFree(unsafe.Pointer(_userAgent))
return userAgent, nil
}
func (i *ICoreWebViewSettings) PutUserAgent(userAgent string) error {
// Convert string 'userAgent' to *uint16
_userAgent, err := windows.UTF16PtrFromString(userAgent)
if err != nil {
return err
}
hr, _, _ := i.vtbl.PutUserAgent.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_userAgent)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetAreBrowserAcceleratorKeysEnabled() (bool, error) {
var enabled bool
hr, _, _ := i.vtbl.GetAreBrowserAcceleratorKeysEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return enabled, nil
}
func (i *ICoreWebViewSettings) PutAreBrowserAcceleratorKeysEnabled(enabled bool) error {
hr, _, _ := i.vtbl.PutAreBrowserAcceleratorKeysEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetIsPinchZoomEnabled() (bool, error) {
var enabled bool
hr, _, _ := i.vtbl.GetIsPinchZoomEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return enabled, nil
}
func (i *ICoreWebViewSettings) PutIsPinchZoomEnabled(enabled bool) error {
hr, _, _ := i.vtbl.PutIsPinchZoomEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebViewSettings) GetIsSwipeNavigationEnabled() (bool, error) {
var enabled bool
hr, _, _ := i.vtbl.GetIsSwipeNavigationEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return enabled, nil
}
func (i *ICoreWebViewSettings) PutIsSwipeNavigationEnabled(enabled bool) error {
hr, _, _ := i.vtbl.PutIsSwipeNavigationEnabled.Call(
uintptr(unsafe.Pointer(i)),
uintptr(boolToInt(enabled)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,66 @@
//go:build windows
package edge
import (
"errors"
"io"
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
type _IStreamVtbl struct {
_IUnknownVtbl
Read ComProc
Write ComProc
}
type IStream struct {
vtbl *_IStreamVtbl
}
func (i *IStream) AddRef() error {
_, _, err := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
if err != nil && !errors.Is(err, windows.ERROR_SUCCESS) {
return err
}
return nil
}
func (i *IStream) Release() error {
_, _, err := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
if err != nil && !errors.Is(err, windows.ERROR_SUCCESS) {
return err
}
return nil
}
func (i *IStream) Read(p []byte) (int, error) {
bufLen := len(p)
if bufLen == 0 {
return 0, nil
}
var n int
hr, _, _ := i.vtbl.Read.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&p[0])),
uintptr(bufLen),
uintptr(unsafe.Pointer(&n)),
)
switch windows.Handle(hr) {
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(hr)
}
}

View File

@@ -0,0 +1,170 @@
package edge
import "github.com/wailsapp/go-webview2/webviewloader"
type Capability string
var UnsupportedCapabilityError = &unsupportedCapabilityError{}
type unsupportedCapabilityError struct{}
func (u *unsupportedCapabilityError) Error() string {
return "unsupported capability"
}
// Capabilities is a list of capabilities with their corresponding minimum runtime version
// Internal Capabilities are not exposed to the user
// Larger capabilities such as DragAndDrop should be exported with a capital letter
// WebView2 Runtime Version 131.0.2903.40 (Released: September 2023)
const (
ScreenCapture = Capability("131.0.2903.40") // Screen capture support
NonClientRegion = Capability("131.0.2903.40") // Non-client region customization
DownloadDialog = Capability("131.0.2903.40") // Download dialog handling
BrowserExtension = Capability("131.0.2903.40") // Browser extension support
BasicAuthentication = Capability("131.0.2903.40") // Basic authentication handling
SaveFileDialog = Capability("131.0.2903.40") // Save file dialog support
)
// WebView2 Runtime Version 113.0.1774.30 (Released: Unknown)
const (
GetAdditionalObjects = Capability("113.0.1774.30") // Additional objects support
)
// WebView2 Runtime Version 100.0.1185.39 (Released: April 2022)
const (
AllowExternalDrop = Capability("100.0.1185.39") // External drop support
GeneralAutofillEnabled = Capability("100.0.1185.39") // General autofill features
PasswordAutosaveEnabled = Capability("100.0.1185.39") // Password autosave support
)
// WebView2 Runtime Version 98.0.1108.43 (Released: February 2022)
const (
CustomScheme = Capability("98.0.1108.43") // Custom scheme support
PrintToPdf = Capability("98.0.1108.43") // Print to PDF functionality
SharedBuffer = Capability("98.0.1108.43") // Shared buffer for performance
ServerCertificate = Capability("98.0.1108.43") // Server certificate handling
FrameNavigation = Capability("98.0.1108.43") // Frame navigation events
)
// WebView2 Runtime Version 97.0.1072.69 (Released: January 2022)
const (
ClientCertificate = Capability("97.0.1072.69") // Client certificate selection
ContextMenus = Capability("97.0.1072.69") // Custom context menus
BackgroundColor = Capability("97.0.1072.69") // Background color customization
ScriptEnabled = Capability("97.0.1072.69") // JavaScript execution control
StatusBar = Capability("97.0.1072.69") // Status bar customization
)
// WebView2 Runtime Version 95.0.1020.44 (Released: October 2021)
const (
WebMessageReceived = Capability("95.0.1020.44") // Web message handling
NewWindowRequested = Capability("95.0.1020.44") // New window request handling
DocumentTitleChanged = Capability("95.0.1020.44") // Document title change events
ContainsFullScreen = Capability("95.0.1020.44") // Fullscreen mode detection
WebResourceRequested = Capability("95.0.1020.44") // Web resource request handling
)
// WebView2 Runtime Version 94.0.992.31 (Released: September 2021)
const (
NavigationStarting = Capability("94.0.992.31") // Navigation start events
NavigationCompleted = Capability("94.0.992.31") // Navigation completion events
FrameNavigationStarting = Capability("94.0.992.31") // Frame navigation start
SourceChanged = Capability("94.0.992.31") // Source change detection
HistoryChanged = Capability("94.0.992.31") // Browser history changes
SwipeNavigation = Capability("94.0.992.31") // Swipe navigation support
)
// WebView2 Runtime Version 93.0.961.52 (Released: August 2021)
const (
DOMContentLoaded = Capability("93.0.961.52") // DOM content loaded events
WebResourceLoaded = Capability("93.0.961.52") // Resource load events
ScriptDialogOpening = Capability("93.0.961.52") // Script dialog handling
PermissionRequested = Capability("93.0.961.52") // Permission request handling
ProcessFailed = Capability("93.0.961.52") // Process failure detection
)
// WebView2 Runtime Version 92.0.902.78 (Released: July 2021)
const (
AcceleratorKeyPressed = Capability("92.0.902.78") // Accelerator key handling
ZoomFactorChanged = Capability("92.0.902.78") // Zoom factor change events
MoveFocusRequested = Capability("92.0.902.78") // Focus movement handling
DevToolsProtocol = Capability("92.0.902.78") // DevTools protocol support
BrowserProcessExited = Capability("92.0.902.78") // Browser process exit handling
)
// WebView2 Runtime Version 91.0.864.41 (Released: June 2021)
const (
DefaultDownloadDialog = Capability("91.0.864.41") // Default download dialog
DefaultContextMenus = Capability("91.0.864.41") // Default context menus
FaviconChanged = Capability("91.0.864.41") // Favicon change events
WindowCloseRequested = Capability("91.0.864.41") // Window close request handling
RasterizationScale = Capability("91.0.864.41") // Display scaling support
SecurityUpdated = Capability("91.0.864.41") // Security state updates
ProcessInfoReceived = Capability("91.0.864.41") // Process info events
FramePermissionRequested = Capability("91.0.864.41") // Frame permission requests
ClearBrowsingData = Capability("91.0.864.41") // Clear browsing data support
IsMutedChanged = Capability("91.0.864.41") // Audio mute state changes
)
// WebView2 Runtime Version 90.0.818.41 (Released: May 2021)
const (
WebResourceResponseReceived = Capability("90.0.818.41") // Web resource response handling
DOMContentLoaded90 = Capability("90.0.818.41") // DOM content loaded events (v90)
WebResourceRequested90 = Capability("90.0.818.41") // Web resource requests (v90)
NewWindowWithOptions = Capability("90.0.818.41") // New window with options
CookieManagement = Capability("90.0.818.41") // Cookie management support
)
// WebView2 Runtime Version 89.0.774.75 (Released: April 2021)
const (
IsBuiltInErrorPageEnabled = Capability("89.0.774.75") // Built-in error page support
WebResourceResponse = Capability("89.0.774.75") // Web resource response handling
ScriptToExecuteOnDocumentCreated = Capability("89.0.774.75") // Document creation scripts
EnvironmentOptions = Capability("89.0.774.75") // Environment options support
FrameNavigation89 = Capability("89.0.774.75") // Frame navigation (v89)
)
// WebView2 Runtime Version 88.0.705.74 (Released: March 2021)
const (
WebResourceRequested88 = Capability("88.0.705.74") // Web resource requests (v88)
PermissionRequested88 = Capability("88.0.705.74") // Permission requests (v88)
ProcessFailed88 = Capability("88.0.705.74") // Process failure handling (v88)
AddHostObjectToScript = Capability("88.0.705.74") // Host object scripting
IsMuted = Capability("88.0.705.74") // Audio mute state
)
// WebView2 Runtime Version 87.0.664.75 (Released: February 2021)
const (
WebMessageReceived87 = Capability("87.0.664.75") // Web message handling (v87)
CallDevToolsProtocolMethod = Capability("87.0.664.75") // DevTools protocol method calls
NewWindow87 = Capability("87.0.664.75") // New window creation (v87)
DocumentTitleChanged87 = Capability("87.0.664.75") // Document title changes (v87)
IsSuspended = Capability("87.0.664.75") // Suspension state
)
// WebView2 Runtime Version 86.0.622.58 (Released: January 2021)
const (
NavigationStarting86 = Capability("86.0.622.58") // Navigation start events (v86)
NavigationCompleted86 = Capability("86.0.622.58") // Navigation completion (v86)
FrameNavigationStarting86 = Capability("86.0.622.58") // Frame navigation start (v86)
BasicWebView = Capability("86.0.622.58") // Basic WebView2 functionality
WindowBounds = Capability("86.0.622.58") // Window bounds control
)
// WebView2 Runtime Version 85.0.564.70 (Released: December 2020)
const (
WebView2Environment = Capability("85.0.564.70") // WebView2 environment
WebView2Controller = Capability("85.0.564.70") // WebView2 controller
BasicSettings = Capability("85.0.564.70") // Basic settings support
UserDataFolder = Capability("85.0.564.70") // User data folder
BrowserVersionString = Capability("85.0.564.70") // Browser version info
)
func HasCapability(webview2RuntimeVersion string, capability Capability) bool {
result, err := webviewloader.CompareBrowserVersions(webview2RuntimeVersion, string(capability))
if err != nil {
return false
}
return result >= 0
}

View File

@@ -0,0 +1,716 @@
//go:build windows
// +build windows
package edge
import (
"errors"
"fmt"
"log"
"os"
"path/filepath"
"runtime"
"strings"
"sync/atomic"
"syscall"
"time"
"unsafe"
"github.com/wailsapp/go-webview2/internal/w32"
"github.com/wailsapp/go-webview2/webviewloader"
"golang.org/x/sys/windows"
)
type Rect = w32.Rect
func globalErrorHandler(err error) {
if err == nil {
return
}
fmt.Printf("[WebView2 Error] %v\n", err)
stackBuf := make([]uintptr, 64)
stackSize := runtime.Callers(2, stackBuf)
frames := runtime.CallersFrames(stackBuf[:stackSize])
fmt.Println("\nStack trace:")
stackIndex := 1
for {
frame, more := frames.Next()
if !more {
break
}
log.Printf("%d: %s\n\t%s:%d\n", stackIndex, frame.Function, frame.File, frame.Line)
stackIndex++
}
}
type Chromium struct {
hwnd uintptr
padding struct {
Left int32
Top int32
Right int32
Bottom int32
}
controller *ICoreWebView2Controller
webview *ICoreWebView2
inited uintptr
envCompleted *iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler
controllerCompleted *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler
webMessageReceived *iCoreWebView2WebMessageReceivedEventHandler
containsFullScreenElementChanged *ICoreWebView2ContainsFullScreenElementChangedEventHandler
permissionRequested *iCoreWebView2PermissionRequestedEventHandler
webResourceRequested *iCoreWebView2WebResourceRequestedEventHandler
acceleratorKeyPressed *ICoreWebView2AcceleratorKeyPressedEventHandler
navigationCompleted *ICoreWebView2NavigationCompletedEventHandler
processFailed *ICoreWebView2ProcessFailedEventHandler
environment *ICoreWebView2Environment
webview2RuntimeVersion string
// Settings
Debug bool
DataPath string
BrowserPath string
AdditionalBrowserArgs []string
// permissions
permissions map[CoreWebView2PermissionKind]CoreWebView2PermissionState
globalPermission *CoreWebView2PermissionState
// Callbacks
MessageCallback func(message string, sender *ICoreWebView2, args *ICoreWebView2WebMessageReceivedEventArgs)
MessageWithAdditionalObjectsCallback func(message string, sender *ICoreWebView2, args *ICoreWebView2WebMessageReceivedEventArgs)
WebResourceRequestedCallback func(request *ICoreWebView2WebResourceRequest, args *ICoreWebView2WebResourceRequestedEventArgs)
NavigationCompletedCallback func(sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs)
ProcessFailedCallback func(sender *ICoreWebView2, args *ICoreWebView2ProcessFailedEventArgs)
ContainsFullScreenElementChangedCallback func(sender *ICoreWebView2, args *ICoreWebView2ContainsFullScreenElementChangedEventArgs)
AcceleratorKeyCallback func(uint) bool
// Error handling
globalErrorCallback func(error)
shuttingDown bool
// Resize debouncing
lastBounds *w32.Rect
resizeTimer *time.Timer
}
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.containsFullScreenElementChanged = newICoreWebView2ContainsFullScreenElementChangedEventHandler(e)
/*
// Pinner seems to panic in some cases as reported on Discord, maybe during shutdown when GC detects pinned objects
// to be released that have not been unpinned.
// It would also be better to use our ComBridge for this event handlers implementation instead of pinning them.
// So all COM Implementations on the go-side use the same code.
var pinner runtime.Pinner
pinner.Pin(e.envCompleted)
pinner.Pin(e.controllerCompleted)
pinner.Pin(e.webMessageReceived)
pinner.Pin(e.permissionRequested)
pinner.Pin(e.webResourceRequested)
pinner.Pin(e.acceleratorKeyPressed)
pinner.Pin(e.navigationCompleted)
pinner.Pin(e.processFailed)
pinner.Pin(e.containsFullScreenElementChanged)
*/
e.permissions = make(map[CoreWebView2PermissionKind]CoreWebView2PermissionState)
e.globalErrorCallback = globalErrorHandler
return e
}
func (e *Chromium) ShuttingDown() {
e.shuttingDown = true
}
func (e *Chromium) errorCallback(err error) {
e.globalErrorCallback(err)
os.Exit(1)
}
func (e *Chromium) SetErrorCallback(callback func(error)) {
if callback != nil {
e.globalErrorCallback = callback
}
}
func (e *Chromium) Embed(hwnd uintptr) bool {
var err error
e.hwnd = hwnd
dataPath := e.DataPath
if dataPath == "" {
currentExePath := make([]uint16, windows.MAX_PATH)
_, err = windows.GetModuleFileName(windows.Handle(0), &currentExePath[0], windows.MAX_PATH)
if err != nil {
e.errorCallback(err)
}
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) {
e.errorCallback(fmt.Errorf("browser path '%s' does not exist", e.BrowserPath))
}
}
browserArgs := strings.Join(e.AdditionalBrowserArgs, " ")
if err := createCoreWebView2EnvironmentWithOptions(e.BrowserPath, dataPath, e.envCompleted, browserArgs); err != nil {
e.errorCallback(fmt.Errorf("error calling Webview2Loader: %s", err.Error()))
}
e.webview2RuntimeVersion, err = webviewloader.GetAvailableCoreWebView2BrowserVersionString(e.BrowserPath)
if err != nil {
e.errorCallback(fmt.Errorf("error getting Webview2 runtime version: %s", err.Error()))
}
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.Left == padding.Left && e.padding.Top == padding.Top &&
e.padding.Right == padding.Right && e.padding.Bottom == padding.Bottom {
return
}
e.padding.Left = padding.Left
e.padding.Top = padding.Top
e.padding.Right = padding.Right
e.padding.Bottom = padding.Bottom
e.Resize()
}
func (e *Chromium) ResizeWithBounds(bounds *Rect) {
if e.hwnd == 0 {
return
}
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) Resize() {
if e.hwnd == 0 {
return
}
bounds, err := w32.GetClientRect(e.hwnd)
if err != nil {
e.errorCallback(err)
return
}
e.ResizeWithBounds(&bounds)
}
func (e *Chromium) Navigate(url string) {
err := e.webview.Navigate(url)
if err != nil {
e.errorCallback(err)
}
}
func (e *Chromium) NavigateToString(content string) {
err := e.webview.NavigateToString(content)
if err != nil {
e.errorCallback(err)
}
}
func (e *Chromium) Init(script string) {
err := e.webview.AddScriptToExecuteOnDocumentCreated(script, nil)
if err != nil {
e.errorCallback(err)
}
}
func (e *Chromium) Eval(script string) {
if e.webview == nil || e.shuttingDown {
return
}
err := e.webview.ExecuteScript(script, nil)
if err != nil && !errors.Is(err, windows.ERROR_IO_PENDING) {
e.errorCallback(err)
}
}
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 env == nil {
err := syscall.Errno(res)
log.Printf("[WebView2] Environment creation failed with error code %v: %v\n", res, err)
if e.globalErrorCallback != nil {
e.globalErrorCallback(fmt.Errorf("failed to create WebView2 environment: %w", err))
}
return res
}
log.Printf("[WebView2] Environment created successfully\n")
env.vtbl.AddRef.Call(uintptr(unsafe.Pointer(env)))
e.environment = env
err := env.CreateCoreWebView2Controller(e.hwnd, e.controllerCompleted)
if err != nil {
e.errorCallback(err)
}
return 0
}
func (e *Chromium) CreateCoreWebView2ControllerCompleted(res uintptr, controller *ICoreWebView2Controller) uintptr {
if int32(res) < 0 {
e.errorCallback(fmt.Errorf("error creating controller with %08x: %s", res, syscall.Errno(res)))
}
var err error
controller.vtbl.AddRef.Call(uintptr(unsafe.Pointer(controller)))
e.controller = controller
// Try to get ICoreWebView2Controller3 interface for better performance
if controller3 := e.controller.GetICoreWebView2Controller3(); controller3 != nil {
// Use raw pixels mode for better performance during resize
if err := controller3.PutBoundsMode(COREWEBVIEW2_BOUNDS_MODE_USE_RAW_PIXELS); err != nil {
e.errorCallback(err)
}
// Disable monitor scale changes since we're using raw pixels
if err := controller3.PutShouldDetectMonitorScaleChanges(false); err != nil {
e.errorCallback(err)
}
}
var token _EventRegistrationToken
e.webview, err = e.controller.GetCoreWebView2()
if err != nil {
e.errorCallback(err)
}
e.webview.vtbl.AddRef.Call(uintptr(unsafe.Pointer(e.webview)))
err = e.webview.AddWebMessageReceived(e.webMessageReceived, &token)
if err != nil {
e.errorCallback(err)
}
err = e.webview.AddPermissionRequested(e.permissionRequested, &token)
if err != nil {
e.errorCallback(err)
}
err = e.webview.AddWebResourceRequested(e.webResourceRequested, &token)
if err != nil {
e.errorCallback(err)
}
err = e.webview.AddNavigationCompleted(e.navigationCompleted, &token)
if err != nil {
e.errorCallback(err)
}
err = e.webview.AddProcessFailed(e.processFailed, &token)
if err != nil {
e.errorCallback(err)
}
err = e.webview.AddContainsFullScreenElementChanged(e.containsFullScreenElementChanged, &token)
if err != nil {
e.errorCallback(err)
}
err = e.controller.AddAcceleratorKeyPressed(e.acceleratorKeyPressed, &token)
if err != nil {
e.errorCallback(err)
}
atomic.StoreUintptr(&e.inited, 1)
return 0
}
func (e *Chromium) ContainsFullScreenElementChanged(sender *ICoreWebView2, args *ICoreWebView2ContainsFullScreenElementChangedEventArgs) uintptr {
if e.ContainsFullScreenElementChangedCallback != nil {
e.ContainsFullScreenElementChangedCallback(sender, args)
}
return 0
}
func (e *Chromium) MessageReceived(sender *ICoreWebView2, args *ICoreWebView2WebMessageReceivedEventArgs) uintptr {
message, err := args.TryGetWebMessageAsString()
if err != nil {
e.errorCallback(err)
}
if HasCapability(e.webview2RuntimeVersion, GetAdditionalObjects) {
obj, err := args.GetAdditionalObjects()
if err != nil {
e.errorCallback(err)
}
if obj != nil && e.MessageWithAdditionalObjectsCallback != nil {
defer obj.Release()
e.MessageWithAdditionalObjectsCallback(message, sender, args)
} else if e.MessageCallback != nil {
e.MessageCallback(message, sender, args)
}
} else if e.MessageCallback != nil {
e.MessageCallback(message, sender, args)
}
err = sender.PostWebMessageAsString(message)
if err != nil && !errors.Is(err, windows.ERROR_IO_PENDING) {
e.errorCallback(err)
}
return 0
}
func (e *Chromium) SetPermission(kind CoreWebView2PermissionKind, state CoreWebView2PermissionState) {
e.permissions[kind] = state
}
func (e *Chromium) SetBackgroundColour(R, G, B, A uint8) {
controller := e.GetController()
controller2 := controller.GetICoreWebView2Controller2()
backgroundCol := COREWEBVIEW2_COLOR{
A: A,
R: R,
G: G,
B: B,
}
// WebView2 only has 0 and 255 as valid values.
if backgroundCol.A > 0 && backgroundCol.A < 255 {
backgroundCol.A = 255
}
err := controller2.PutDefaultBackgroundColor(backgroundCol)
if err != nil {
e.errorCallback(err)
}
}
func (e *Chromium) SetGlobalPermission(state CoreWebView2PermissionState) {
e.globalPermission = &state
}
func (e *Chromium) PermissionRequested(_ *ICoreWebView2, args *iCoreWebView2PermissionRequestedEventArgs) uintptr {
kind, err := args.GetPermissionKind()
if err != nil {
e.errorCallback(err)
}
var result CoreWebView2PermissionState
if e.globalPermission != nil {
result = *e.globalPermission
} else {
var ok bool
result, ok = e.permissions[kind]
if !ok {
result = CoreWebView2PermissionStateDefault
}
}
err = args.PutState(result)
if err != nil {
e.errorCallback(err)
}
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 {
e.errorCallback(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 {
err := args.PutHandled(e.AcceleratorKeyCallback(virtualKey))
if err != nil {
e.errorCallback(err)
}
} else {
return 0
}
}
err := args.PutHandled(false)
if err != nil {
e.errorCallback(err)
}
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 {
e.errorCallback(err)
}
}
func (e *Chromium) PutZoomFactor(zoomFactor float64) {
err := e.controller.PutZoomFactor(zoomFactor)
if err != nil {
e.errorCallback(err)
}
}
func (e *Chromium) OpenDevToolsWindow() {
err := e.webview.OpenDevToolsWindow()
if err != nil {
e.errorCallback(err)
}
}
func (e *Chromium) HasCapability(c Capability) bool {
return HasCapability(e.webview2RuntimeVersion, c)
}
func (e *Chromium) GetIsSwipeNavigationEnabled() (bool, error) {
if !HasCapability(e.webview2RuntimeVersion, SwipeNavigation) {
return false, UnsupportedCapabilityError
}
webview2Settings, err := e.webview.GetSettings()
if err != nil {
return false, err
}
webview2Settings6 := webview2Settings.GetICoreWebView2Settings6()
var result bool
result, err = webview2Settings6.GetIsSwipeNavigationEnabled()
if err != nil {
return false, err
}
return result, nil
}
// PutIsGeneralAutofillEnabled controls whether autofill for information
// like names, street and email addresses, phone numbers, and arbitrary input
// is enabled. This excludes password and credit card information. When
// IsGeneralAutofillEnabled is false, no suggestions appear, and no new information
// is saved. When IsGeneralAutofillEnabled is true, information is saved, suggestions
// appear and clicking on one will populate the form fields.
// It will take effect immediately after setting.
// The default value is `FALSE`.
func (e *Chromium) PutIsGeneralAutofillEnabled(value bool) error {
if !HasCapability(e.webview2RuntimeVersion, GeneralAutofillEnabled) {
return UnsupportedCapabilityError
}
webview2Settings, err := e.webview.GetSettings()
if err != nil {
return err
}
webview2Settings4 := webview2Settings.GetICoreWebView2Settings4()
return webview2Settings4.PutIsGeneralAutofillEnabled(value)
}
// PutIsPasswordAutosaveEnabled sets whether the browser should offer to save passwords and other
// identifying information entered into forms automatically.
// The default value is `FALSE`.
func (e *Chromium) PutIsPasswordAutosaveEnabled(value bool) error {
if !HasCapability(e.webview2RuntimeVersion, PasswordAutosaveEnabled) {
return UnsupportedCapabilityError
}
webview2Settings, err := e.webview.GetSettings()
if err != nil {
return err
}
webview2Settings4 := webview2Settings.GetICoreWebView2Settings4()
return webview2Settings4.PutIsPasswordAutosaveEnabled(value)
}
func (e *Chromium) PutIsSwipeNavigationEnabled(enabled bool) error {
if !HasCapability(e.webview2RuntimeVersion, SwipeNavigation) {
return UnsupportedCapabilityError
}
webview2Settings, err := e.webview.GetSettings()
if err != nil {
return err
}
webview2Settings6 := webview2Settings.GetICoreWebView2Settings6()
err = webview2Settings6.PutIsSwipeNavigationEnabled(enabled)
if err != nil {
return err
}
return nil
}
func (e *Chromium) AllowExternalDrag(allow bool) error {
if !HasCapability(e.webview2RuntimeVersion, AllowExternalDrop) {
return UnsupportedCapabilityError
}
controller := e.GetController()
controller4 := controller.GetICoreWebView2Controller4()
err := controller4.PutAllowExternalDrop(allow)
if err != nil {
return err
}
return nil
}
func (e *Chromium) GetAllowExternalDrag() (bool, error) {
if !HasCapability(e.webview2RuntimeVersion, AllowExternalDrop) {
return false, UnsupportedCapabilityError
}
controller := e.GetController()
controller4 := controller.GetICoreWebView2Controller4()
result, err := controller4.GetAllowExternalDrop()
if err != nil {
return false, err
}
return result, nil
}
func (e *Chromium) GetCookieManager() (*ICoreWebView2CookieManager, error) {
if e.webview == nil {
return nil, errors.New("webview not initialized")
}
// Check WebView2 version
if e.webview2RuntimeVersion == "" {
return nil, errors.New("WebView2 runtime version not available")
}
// Get ICoreWebView2_2 interface
webview2, err := e.webview.QueryInterface2()
if err != nil {
return nil, fmt.Errorf("failed to get ICoreWebView2_2: %w\nThis functionality requires WebView2 Runtime version 89.0.721.0 or later. Current version: %s", err, e.webview2RuntimeVersion)
}
defer webview2.Release()
// Get cookie manager
cookieManager, err := webview2.GetCookieManager()
if err != nil {
return nil, fmt.Errorf("failed to get cookie manager: %w", err)
}
// Note: The caller is responsible for calling Release() on the returned cookieManager
return cookieManager, nil
}

View File

@@ -0,0 +1,28 @@
//go:build windows
// +build windows
package edge
import (
"github.com/wailsapp/go-webview2/internal/w32"
"golang.org/x/sys/windows"
"unsafe"
)
func (e *Chromium) SetSize(bounds w32.Rect) {
if e.controller == nil {
return
}
hr, _, _ := e.controller.vtbl.PutBounds.Call(
uintptr(unsafe.Pointer(e.controller)),
uintptr(bounds.Left),
uintptr(bounds.Top),
uintptr(bounds.Right),
uintptr(bounds.Bottom),
)
if windows.Handle(hr) != windows.S_OK {
e.errorCallback(windows.Errno(hr))
}
}

View File

@@ -0,0 +1,19 @@
//go:build windows
// +build windows
package edge
import (
"github.com/wailsapp/go-webview2/internal/w32"
)
func (e *Chromium) SetSize(bounds w32.Rect) {
if e.controller == nil {
return
}
err := e.controller.PutBounds(bounds)
if err != nil {
e.errorCallback(err)
}
}

View File

@@ -0,0 +1,27 @@
//go:build windows
// +build windows
package edge
import (
"unsafe"
"github.com/wailsapp/go-webview2/internal/w32"
"golang.org/x/sys/windows"
)
func (e *Chromium) SetSize(bounds w32.Rect) {
if e.controller == nil {
return
}
words := (*[2]uintptr)(unsafe.Pointer(&bounds))
hr, _, _ := e.controller.vtbl.PutBounds.Call(
uintptr(unsafe.Pointer(e.controller)),
words[0],
words[1],
)
if windows.Handle(hr) != windows.S_OK {
e.errorCallback(windows.Errno(hr))
}
}

80
vendor/github.com/wailsapp/go-webview2/pkg/edge/com.go generated vendored Normal file
View File

@@ -0,0 +1,80 @@
//go:build windows
package edge
import (
"golang.org/x/sys/windows"
"unsafe"
)
type EventRegistrationToken struct {
value int64
}
// IUnknown
type IUnknown struct {
Vtbl *IUnknownVtbl
}
type IUnknownVtbl struct {
QueryInterface ComProc
AddRef ComProc
Release ComProc
}
func (i *IUnknownVtbl) CallRelease(this unsafe.Pointer) uint32 {
ret, _, _ := i.Release.Call(
uintptr(this),
)
return uint32(ret)
}
type IUnknownImpl interface {
QueryInterface(refiid, object uintptr) uintptr
AddRef() uintptr
Release() uintptr
}
type POINT struct {
X, Y int32
}
type RECT struct {
Left int32
Top int32
Right int32
Bottom int32
}
type HANDLE uintptr
type HBRUSH uintptr
type HCURSOR uintptr
type HICON uintptr
type HINSTANCE uintptr
type HMENU uintptr
type HMODULE uintptr
type HWND uintptr
// NOTE: For sure, this is wrong!
type VARIANT uintptr
type IDataObject struct {
IUnknown
}
func ptr[T any](p T) *T {
return &p
}
const ERROR_SUCCESS = windows.ERROR_SUCCESS
func UTF16PtrFromString(s string) (*uint16, error) {
return windows.UTF16PtrFromString(s)
}
func UTF16PtrToString(s *uint16) string {
return windows.UTF16PtrToString(s)
}
func CoTaskMemFree(pv unsafe.Pointer) {
windows.CoTaskMemFree(pv)
}

View File

@@ -0,0 +1,663 @@
//go:build windows
// +build windows
package edge
import (
"fmt"
"log"
"runtime"
"syscall"
"unsafe"
"github.com/wailsapp/go-webview2/internal/w32"
"golang.org/x/sys/windows"
)
func init() {
runtime.LockOSThread()
r, _, _ := w32.Ole32CoInitializeEx.Call(0, uintptr(w32.COINIT_APARTMENTTHREADED))
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
}
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) AddRef() uint32 {
ret, _, _ := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2) Release() uint32 {
ret, _, _ := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
return uint32(ret)
}
func (i *ICoreWebView2) AddContainsFullScreenElementChanged(eventHandler *ICoreWebView2ContainsFullScreenElementChangedEventHandler, token *_EventRegistrationToken) error {
hr, _, _ := i.vtbl.AddContainsFullScreenElementChanged.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(eventHandler)),
uintptr(unsafe.Pointer(token)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) AddNavigationCompleted(eventHandler *ICoreWebView2NavigationCompletedEventHandler, token *_EventRegistrationToken) error {
hr, _, _ := i.vtbl.AddNavigationCompleted.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(eventHandler)),
uintptr(unsafe.Pointer(token)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) AddPermissionRequested(handler *iCoreWebView2PermissionRequestedEventHandler, token *_EventRegistrationToken) error {
hr, _, _ := i.vtbl.AddPermissionRequested.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(handler)),
uintptr(unsafe.Pointer(token)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) AddProcessFailed(eventHandler *ICoreWebView2ProcessFailedEventHandler, token *_EventRegistrationToken) error {
hr, _, _ := i.vtbl.AddProcessFailed.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(eventHandler)),
uintptr(unsafe.Pointer(token)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) AddWebMessageReceived(handler *iCoreWebView2WebMessageReceivedEventHandler, token *_EventRegistrationToken) error {
hr, _, _ := i.vtbl.AddWebMessageReceived.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(handler)),
uintptr(unsafe.Pointer(token)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) AddWebResourceRequested(handler *iCoreWebView2WebResourceRequestedEventHandler, token *_EventRegistrationToken) error {
hr, _, _ := i.vtbl.AddWebResourceRequested.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(handler)),
uintptr(unsafe.Pointer(token)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) AddScriptToExecuteOnDocumentCreated(javaScript string, handler *iCoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler) error {
u16js, err := windows.UTF16PtrFromString(javaScript)
if err != nil {
return err
}
hr, _, _ := i.vtbl.AddScriptToExecuteOnDocumentCreated.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(u16js)),
uintptr(unsafe.Pointer(handler)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) ExecuteScript(javascript string, handler *iCoreWebView2ExecuteScriptCompletedHandler) error {
u16js, err := windows.UTF16PtrFromString(javascript)
if err != nil {
return err
}
hr, _, _ := i.vtbl.ExecuteScript.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(u16js)),
uintptr(unsafe.Pointer(handler)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) GetSettings() (*ICoreWebViewSettings, error) {
var settings *ICoreWebViewSettings
hr, _, _ := i.vtbl.GetSettings.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&settings)),
)
if windows.Handle(hr) != windows.S_OK {
return nil, windows.Errno(hr)
}
return settings, nil
}
func (i *ICoreWebView2) GetSource() (string, error) {
var _source *uint16
hr, _, _ := i.vtbl.GetSource.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&_source)),
)
if windows.Handle(hr) != windows.S_OK {
return "", windows.Errno(hr)
}
source := windows.UTF16PtrToString(_source)
windows.CoTaskMemFree(unsafe.Pointer(_source))
return source, nil
}
func (i *ICoreWebView2) GetContainsFullScreenElement() (bool, error) {
var result bool
hr, _, _ := i.vtbl.GetContainsFullScreenElement.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&result)),
)
if windows.Handle(hr) != windows.S_OK {
return false, windows.Errno(hr)
}
return result, nil
}
func (i *ICoreWebView2) Navigate(url string) error {
u16url, err := windows.UTF16PtrFromString(url)
if err != nil {
return err
}
hr, _, _ := i.vtbl.Navigate.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(u16url)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) NavigateToString(htmlContent string) error {
u16Html, err := windows.UTF16PtrFromString(htmlContent)
if err != nil {
return err
}
hr, _, _ := i.vtbl.NavigateToString.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(u16Html)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) PostWebMessageAsString(webMessageAsString string) error {
u16msg, err := windows.UTF16PtrFromString(webMessageAsString)
if err != nil {
return err
}
hr, _, _ := i.vtbl.PostWebMessageAsString.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(u16msg)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) QueryInterface2() (*ICoreWebView2_2, error) {
var result *ICoreWebView2_2
iid := windows.GUID{
Data1: 0x9E8F0CF8,
Data2: 0xE670,
Data3: 0x4B5E,
Data4: [8]byte{0xB2, 0xBC, 0x73, 0xE0, 0x61, 0xE3, 0x18, 0x4C},
}
hr, _, _ := i.vtbl.QueryInterface.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&iid)),
uintptr(unsafe.Pointer(&result)))
if hr != 0 {
return nil, windows.Errno(hr)
}
return result, nil
}
// ICoreWebView2EnvironmentVtbl
type iCoreWebView2EnvironmentVtbl struct {
_IUnknownVtbl
CreateCoreWebView2Controller ComProc
CreateWebResourceResponse ComProc
GetBrowserVersionString ComProc
AddNewBrowserVersionAvailable ComProc
RemoveNewBrowserVersionAvailable ComProc
}
type ICoreWebView2Environment struct {
vtbl *iCoreWebView2EnvironmentVtbl
}
// CreateCoreWebView2Controller asynchronously creates a new WebView.
func (e *ICoreWebView2Environment) CreateCoreWebView2Controller(parentWindow uintptr, handler *iCoreWebView2CreateCoreWebView2ControllerCompletedHandler) error {
hr, _, _ := e.vtbl.CreateCoreWebView2Controller.Call(
uintptr(unsafe.Pointer(e)),
parentWindow,
uintptr(unsafe.Pointer(handler)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
// 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 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, _, _ := 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 {
return nil, fmt.Errorf("unknown error")
}
return response, nil
}
// ICoreWebView2PermissionRequestedEventArgs
type iCoreWebView2PermissionRequestedEventArgsVtbl struct {
_IUnknownVtbl
GetURI ComProc
GetPermissionKind ComProc
GetIsUserInitiated ComProc
GetState ComProc
PutState ComProc
GetDeferral ComProc
}
type iCoreWebView2PermissionRequestedEventArgs struct {
vtbl *iCoreWebView2PermissionRequestedEventArgsVtbl
}
func (i *iCoreWebView2PermissionRequestedEventArgs) GetPermissionKind() (CoreWebView2PermissionKind, error) {
var kind CoreWebView2PermissionKind
hr, _, _ := i.vtbl.GetPermissionKind.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(&kind)),
)
if windows.Handle(hr) != windows.S_OK {
return 0, windows.Errno(hr)
}
return kind, nil
}
func (i *iCoreWebView2PermissionRequestedEventArgs) PutState(state CoreWebView2PermissionState) error {
hr, _, _ := i.vtbl.PutState.Call(
uintptr(unsafe.Pointer(i)),
uintptr(state),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
// 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,
}
}
// 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 {
// Convert string 'uri' to *uint16
_uri, err := windows.UTF16PtrFromString(uri)
if err != nil {
return err
}
hr, _, _ := i.vtbl.AddWebResourceRequestedFilter.Call(
uintptr(unsafe.Pointer(i)),
uintptr(unsafe.Pointer(_uri)),
uintptr(resourceContext),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}
func (i *ICoreWebView2) OpenDevToolsWindow() error {
hr, _, _ := i.vtbl.OpenDevToolsWindow.Call(
uintptr(unsafe.Pointer(i)),
)
if windows.Handle(hr) != windows.S_OK {
return windows.Errno(hr)
}
return nil
}

View File

@@ -0,0 +1,29 @@
//go:build windows && !native_webview2loader
package edge
import (
"unsafe"
"github.com/wailsapp/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)
}

View File

@@ -0,0 +1,41 @@
//go:build windows && native_webview2loader
package edge
import (
"fmt"
"syscall"
"unsafe"
"github.com/wailsapp/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 err != nil {
return fmt.Errorf("Error calling CreateCoreWebView2EnvironmentWithOptions: %v", err)
}
if hr != 0 {
return syscall.Errno(hr)
}
return nil
}

225
vendor/github.com/wailsapp/go-webview2/pkg/edge/guid.go generated vendored Normal file
View File

@@ -0,0 +1,225 @@
//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, <mattn.jp@gmail.com>
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]
}

View File

@@ -0,0 +1,944 @@
//go:build windows
package edge
type Version struct {
SDKVersion string
ReleaseNotes string
RuntimeVersion string
Notes string
}
var versionMapping = map[string]Version{
"1.0.2903.40": {
SDKVersion: "1.0.2903.40",
ReleaseNotes: "https://learn.microsoft.com/en-us/microsoft-edge/webview2/release-notes?tabs=win32cpp#10290340",
RuntimeVersion: "131.0.2903.40",
Notes: `
<!-- ------------------------------ -->
#### Promotions
The following APIs have been promoted to Stable and are now included in this Release SDK.
<!-- ---------- -->
###### Control whether the screen capture UI is shown (ScreenCaptureStarting event)
Added a new 'ScreenCaptureStarting' event. This event is raised whenever the WebView2 and/or iframe that corresponds to the 'CoreWebView2Frame' (or to any of its descendant iframes) requests permission to use the Screen Capture API before the UI is shown. The app can then block the UI from being displayed, or allow the UI to be displayed.
##### [.NET/C#](#tab/dotnetcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.ScreenCaptureStarting Event](/dotnet/api/microsoft.web.webview2.core.corewebview2.screencapturestarting?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
* 'CoreWebView2Frame' Class:
* [CoreWebView2Frame.ScreenCaptureStarting Event](/dotnet/api/microsoft.web.webview2.core.corewebview2frame.screencapturestarting?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
* 'CoreWebView2NonClientRegionKind' Enum:
* [CoreWebView2NonClientRegionKind.Minimize](/dotnet/api/microsoft.web.webview2.core.corewebview2nonclientregionkind?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
* [CoreWebView2NonClientRegionKind.Maximize](/dotnet/api/microsoft.web.webview2.core.corewebview2nonclientregionkind?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
* [CoreWebView2NonClientRegionKind.Close](/dotnet/api/microsoft.web.webview2.core.corewebview2nonclientregionkind?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs Class](/dotnet/api/microsoft.web.webview2.core.corewebview2screencapturestartingeventargs?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.Cancel Property](/dotnet/api/microsoft.web.webview2.core.corewebview2screencapturestartingeventargs.cancel?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.Handled Property](/dotnet/api/microsoft.web.webview2.core.corewebview2screencapturestartingeventargs.handled?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.OriginalSourceFrameInfo Property](/dotnet/api/microsoft.web.webview2.core.corewebview2screencapturestartingeventargs.originalsourceframeinfo?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.GetDeferral Method](/dotnet/api/microsoft.web.webview2.core.corewebview2screencapturestartingeventargs.getdeferral?view=webview2-dotnet-1.0.2903.40&preserve-view=true)
##### [WinRT/C#](#tab/winrtcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.ScreenCaptureStarting Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2?view=webview2-winrt-1.0.2903.40&preserve-view=true#screencapturestarting)
* 'CoreWebView2Frame' Class:
* [CoreWebView2Frame.ScreenCaptureStarting Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2frame?view=webview2-winrt-1.0.2903.40&preserve-view=true#screencapturestarting)
* 'CoreWebView2NonClientRegionKind' Enum:
* [CoreWebView2NonClientRegionKind.Minimize](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2nonclientregionkind?view=webview2-winrt-1.0.2903.40&preserve-view=true)
* [CoreWebView2NonClientRegionKind.Maximize](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2nonclientregionkind?view=webview2-winrt-1.0.2903.40&preserve-view=true)
* [CoreWebView2NonClientRegionKind.Close](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2nonclientregionkind?view=webview2-winrt-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs Class](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2screencapturestartingeventargs?view=webview2-winrt-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.Cancel Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2screencapturestartingeventargs?view=webview2-winrt-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.Handled Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2screencapturestartingeventargs?view=webview2-winrt-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.OriginalSourceFrameInfo Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2screencapturestartingeventargs?view=webview2-winrt-1.0.2903.40&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.GetDeferral Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2screencapturestartingeventargs?view=webview2-winrt-1.0.2903.40&preserve-view=true)
##### [Win32/C++](#tab/win32cpp)
* [ICoreWebView2_27](/microsoft-edge/webview2/reference/win32/icorewebview2_27?view=webview2-1.0.2903.40&preserve-view=true)
* [ICoreWebView2_27::add_ScreenCaptureStarting](/microsoft-edge/webview2/reference/win32/icorewebview2_27?view=webview2-1.0.2903.40&preserve-view=true#add_screencapturestarting)
* [ICoreWebView2_27::remove_ScreenCaptureStarting](/microsoft-edge/webview2/reference/win32/icorewebview2_27?view=webview2-1.0.2903.40&preserve-view=true#remove_screencapturestarting)
* [ICoreWebView2Frame6](/microsoft-edge/webview2/reference/win32/icorewebview2frame6?view=webview2-1.0.2903.40&preserve-view=true)
* [ICoreWebView2Frame6::add_ScreenCaptureStarting](/microsoft-edge/webview2/reference/win32/icorewebview2frame6?view=webview2-1.0.2903.40&preserve-view=true#add_screencapturestarting)
* [ICoreWebView2Frame6::remove_ScreenCaptureStarting](/microsoft-edge/webview2/reference/win32/icorewebview2frame6?view=webview2-1.0.2903.40&preserve-view=true#remove_screencapturestarting)
* [ICoreWebView2FrameScreenCaptureStartingEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2framescreencapturestartingeventhandler?view=webview2-1.0.2903.40&preserve-view=true)<!-- win32 only -->
* [ICoreWebView2ScreenCaptureStartingEventArgs](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2903.40&preserve-view=true)
* [ICoreWebView2ScreenCaptureStartingEventArgs::get_Cancel](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2903.40&preserve-view=true#get_cancel)
* [ICoreWebView2ScreenCaptureStartingEventArgs::get_Handled](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2903.40&preserve-view=true#get_handled)
* [ICoreWebView2ScreenCaptureStartingEventArgs::get_OriginalSourceFrameInfo](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2903.40&preserve-view=true#get_originalsourceframeinfo)
* [ICoreWebView2ScreenCaptureStartingEventArgs::GetDeferral](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2903.40&preserve-view=true#getdeferral)
* [ICoreWebView2ScreenCaptureStartingEventArgs::put_Cancel](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2903.40&preserve-view=true#put_cancel)
* [ICoreWebView2ScreenCaptureStartingEventArgs::put_Handled](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2903.40&preserve-view=true#put_handled)
* [ICoreWebView2ScreenCaptureStartingEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventhandler?view=webview2-1.0.2903.40&preserve-view=true)<!-- win32 only -->
* 'COREWEBVIEW2_NON_CLIENT_REGION_KIND' enum:
* [COREWEBVIEW2_NON_CLIENT_REGION_KIND_MINIMIZE](/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.2903.40&preserve-view=true#corewebview2_non_client_region_kind)
* [COREWEBVIEW2_NON_CLIENT_REGION_KIND_MAXIMIZE](/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.2903.40&preserve-view=true#corewebview2_non_client_region_kind)
* [COREWEBVIEW2_NON_CLIENT_REGION_KIND_CLOSE](/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.2903.40&preserve-view=true#corewebview2_non_client_region_kind)
---
<!-- ------------------------------ -->
#### Bug fixes
<!-- ---------- -->
###### Runtime-only
* Allowed the **Download** dialog to receive initial focus on launch.
<!-- end of Nov 2024 Release SDK -->
<!-- ====================================================================== -->
Release Date: November 18, 2024`,
},
"1.0.2950-prerelease": {
SDKVersion: "1.0.2950-prerelease",
ReleaseNotes: "https://learn.microsoft.com/en-us/microsoft-edge/webview2/release-notes?tabs=win32cpp#102950-prerelease",
RuntimeVersion: "132.0.2950.0",
Notes: `
<!-- ------------------------------ -->
#### Experimental APIs
No Experimental APIs have been added in this Prerelease SDK.
<!-- ------------------------------ -->
#### Promotions
No APIs have been promoted from Experimental to Stable in this Prerelease SDK.
<!-- ------------------------------ -->
#### Bug fixes
<!-- ---------- -->
###### Runtime-only
* Allowed the **Download** dialog to receive initial focus on launch.
* Fixed a crash while cancelling navigation to certain sites in 'FrameNavigationStarting'. ([Issue #4843](https://github.com/MicrosoftEdge/WebView2Feedback/issues/4843))
* Postponed customizing the context menu when the touch selection menu is being displayed. ([Issue #4737](https://github.com/MicrosoftEdge/WebView2Feedback/issues/4737))
<!-- ---------- -->
###### SDK-only
* Added Arm64ec support.
* Fixed an issue where WebView2 running in "Window to Visual" mode couldn't receive accelerator input.
<!-- end of Nov 2024 Prerelease SDK -->
<!-- ====================================================================== -->
Release Date: October 21, 2024`,
},
"1.0.2849.39": {
SDKVersion: "1.0.2849.39",
ReleaseNotes: "https://learn.microsoft.com/en-us/microsoft-edge/webview2/release-notes?tabs=win32cpp#10284939",
RuntimeVersion: "130.0.2849.39",
Notes: `
<!-- ------------------------------ -->
#### Promotions
The following APIs have been promoted to Stable and are now included in this Release SDK.
<!-- ---------- -->
###### Configure the security warning when saving a file ('SaveFileSecurityCheckStarting' event)
<!--
promoted to Stable in Oct Release SDK
promoted from Experimental to Stable in Oct Prerelease SDK
-->
Added a new 'SaveFileSecurityCheckStarting' event. Your app can register a handler on this event to get the file path, filename extension, and document origin URI information. You can then apply your own rules to do actions such as the following:
* Allow saving the file without presenting a default security-warning UI about the file-type policy.
* Cancel the saving.
* Create your own UI to manage runtime file-type policies.
##### [.NET/C#](#tab/dotnetcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.SaveFileSecurityCheckStarting Event](/dotnet/api/microsoft.web.webview2.core.corewebview2.savefilesecuritycheckstarting?view=webview2-dotnet-1.0.2849.39&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs Class](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs?view=webview2-dotnet-1.0.2849.39&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.CancelSave Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.cancelsave?view=webview2-dotnet-1.0.2849.39&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.DocumentOriginUri Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.documentoriginuri?view=webview2-dotnet-1.0.2849.39&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.FileExtension Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.fileextension?view=webview2-dotnet-1.0.2849.39&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.FilePath Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.filepath?view=webview2-dotnet-1.0.2849.39&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.SuppressDefaultPolicy Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.suppressdefaultpolicy?view=webview2-dotnet-1.0.2849.39&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.GetDeferral Method](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.getdeferral?view=webview2-dotnet-1.0.2849.39&preserve-view=true)
##### [WinRT/C#](#tab/winrtcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.SaveFileSecurityCheckStarting Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2?view=webview2-winrt-1.0.2849.39&preserve-view=true#savefilesecuritycheckstarting)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs Class](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2849.39&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.CancelSave Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2849.39&preserve-view=true#cancelsave)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.DocumentOriginUri Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2849.39&preserve-view=true#documentoriginuri)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.FileExtension Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2849.39&preserve-view=true#fileextension)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.FilePath Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2849.39&preserve-view=true#filepath)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.SuppressDefaultPolicy Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2849.39&preserve-view=true#suppressdefaultpolicy)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.GetDeferral Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2849.39&preserve-view=true#getdeferral)
##### [Win32/C++](#tab/win32cpp)
* [ICoreWebView2_26](/microsoft-edge/webview2/reference/win32/icorewebview2_26?view=webview2-1.0.2849.39&preserve-view=true)
* [ICoreWebView2_26::add_SaveFileSecurityCheckStarting](/microsoft-edge/webview2/reference/win32/icorewebview2_26?view=webview2-1.0.2849.39&preserve-view=true#add_savefilesecuritycheckstarting)
* [ICoreWebView2_26::remove_SaveFileSecurityCheckStarting](/microsoft-edge/webview2/reference/win32/icorewebview2_26?view=webview2-1.0.2849.39&preserve-view=true#remove_savefilesecuritycheckstarting)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2849.39&preserve-view=true)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_CancelSave](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2849.39&preserve-view=true#get_cancelsave)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_DocumentOriginUri](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2849.39&preserve-view=true#get_documentoriginuri)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_FileExtension](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2849.39&preserve-view=true#get_fileextension)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_FilePath](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2849.39&preserve-view=true#get_filepath)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_SuppressDefaultPolicy](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2849.39&preserve-view=true#get_suppressdefaultpolicy)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::GetDeferral](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2849.39&preserve-view=true#getdeferral)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::put_CancelSave](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2849.39&preserve-view=true#put_cancelsave)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::put_SuppressDefaultPolicy](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2849.39&preserve-view=true#put_suppressdefaultpolicy)
* [ICoreWebView2SaveFileSecurityCheckStartingEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventhandler?view=webview2-1.0.2849.39&preserve-view=true)<!-- Win32-only -->
---
<!-- ------------------------------ -->
#### Bug fixes
<!-- ---------- -->
###### Runtime-only
* Fixed a **Download** dialog focus issue when pressing **Tab** or **Shift+Tab** to switch into the Webview2 control.
<!-- ---------- -->
###### SDK-only
* Using 'CoreWebView2.AddWebResourceRequestedFilter' without a 'CoreWebView2WebResourceRequestSourceKinds' parameter is now deprecated. See the .NET [CoreWebView2.AddWebResourceRequestedFilter Method](https://go.microsoft.com/fwlink/?linkid=2286319).<!-- points to WebView2Announcements -->
* Added the .NET 8 'TargetFramework' for C# WinRT, enabled AOT (ahead-of-time) compatibility, and disabled runtime marshalling.
<!-- end of Oct 2024 Release SDK -->
<!-- ====================================================================== -->
Release Date: October 21, 2024`,
},
"1.0.2895-prerelease": {
SDKVersion: "1.0.2895-prerelease",
ReleaseNotes: "https://learn.microsoft.com/en-us/microsoft-edge/webview2/release-notes?tabs=win32cpp#102895-prerelease",
RuntimeVersion: "131.0.2895.0",
Notes: `
<!-- ------------------------------ -->
#### Experimental APIs
The following Experimental APIs have been added in this Prerelease SDK.
<!-- ---------- -->
###### 'RestartRequested' event when WebView2 needs to restart
Added a new 'RestartRequested' event. The 'RestartRequested' event is raised whenever WebView2 needs to restart to apply updates or configuration changes. You can use this API to detect when WebView2 needs to restart, and take appropriate actions. The 'Priority' property of the 'RestartRequested' event arguments indicates the priority of the restart request:
* 'High' indicates that the app should prompt users to restart as soon as possible.
* 'Normal' indicates that the app should remind users to restart, on a best-effort basis.
##### [.NET/C#](#tab/dotnetcsharp)
* 'CoreWebView2Environment' Class:
* [CoreWebView2Environment.RestartRequested Event](/dotnet/api/microsoft.web.webview2.core.corewebview2environment.restartrequested?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* 'CoreWebView2RestartRequestedEventArgs' Class:
* [CoreWebView2RestartRequestedEventArgs.Priority Property](/dotnet/api/microsoft.web.webview2.core.corewebview2restartrequestedeventargs.priority?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2RestartRequestedPriority Enum](/dotnet/api/microsoft.web.webview2.core.corewebview2restartrequestedpriority?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* 'CoreWebView2RestartRequestedPriority.Normal'
* 'CoreWebView2RestartRequestedPriority.High'
##### [WinRT/C#](#tab/winrtcsharp)
* 'CoreWebView2Environment' Class:
* [CoreWebView2Environment.RestartRequested Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2environment?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#restartrequested)
* 'CoreWebView2RestartRequestedEventArgs' Class:
* [CoreWebView2RestartRequestedEventArgs.Priority Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2restartrequestedeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#priority)
* [CoreWebView2RestartRequestedPriority Enum](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2restartrequestedpriority?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true)
* 'CoreWebView2RestartRequestedPriority.Normal'
* 'CoreWebView2RestartRequestedPriority.High'
##### [Win32/C++](#tab/win32cpp)
* [ICoreWebView2ExperimentalEnvironment15](/microsoft-edge/webview2/reference/win32/icorewebview2experimentalenvironment15?view=webview2-1.0.2895-prerelease&preserve-view=true)
* [ICoreWebView2ExperimentalEnvironment15::add_RestartRequested](/microsoft-edge/webview2/reference/win32/icorewebview2experimentalenvironment15?view=webview2-1.0.2895-prerelease&preserve-view=true#add_restartrequested)
* [ICoreWebView2ExperimentalEnvironment15::remove_RestartRequested](/microsoft-edge/webview2/reference/win32/icorewebview2experimentalenvironment15?view=webview2-1.0.2895-prerelease&preserve-view=true#remove_restartrequested)
* [ICoreWebView2ExperimentalRestartRequestedEventArgs](/microsoft-edge/webview2/reference/win32/icorewebview2experimentalrestartrequestedeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true)
* [ICoreWebView2ExperimentalRestartRequestedEventArgs::get_Priority](/microsoft-edge/webview2/reference/win32/icorewebview2experimentalrestartrequestedeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#get_priority)<!-- no put -->
* [ICoreWebView2ExperimentalRestartRequestedEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2experimentalrestartrequestedeventhandler?view=webview2-1.0.2895-prerelease&preserve-view=true)
* [COREWEBVIEW2_RESTART_REQUESTED_PRIORITY Enum](/microsoft-edge/webview2/reference/win32/webview2experimental-idl?view=webview2-1.0.2895-prerelease&preserve-view=true#corewebview2_restart_requested_priority)
* 'COREWEBVIEW2_RESTART_REQUESTED_PRIORITY_NORMAL'
* 'COREWEBVIEW2_RESTART_REQUESTED_PRIORITY_HIGH'
---
<!-- ------------------------------ -->
#### Promotions
The following APIs have been promoted from Experimental to Stable in this Prerelease SDK.
<!-- ---------- -->
###### Control whether the screen capture UI is shown ('ScreenCaptureStarting' event)
Added a new 'ScreenCaptureStarting' event. This event is raised whenever the WebView2 and/or iframe that corresponds to the 'CoreWebView2Frame' (or to any of its descendant iframes) requests permission to use the Screen Capture API before the UI is shown. The app can then block the UI from being displayed, or allow the UI to be displayed.
##### [.NET/C#](#tab/dotnetcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.ScreenCaptureStarting Event](/dotnet/api/microsoft.web.webview2.core.corewebview2.screencapturestarting?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* 'CoreWebView2Frame' Class:
* [CoreWebView2Frame.ScreenCaptureStarting Event](/dotnet/api/microsoft.web.webview2.core.corewebview2frame.screencapturestarting?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* 'CoreWebView2ScreenCaptureStartingEventArgs' Class:
* [CoreWebView2ScreenCaptureStartingEventArgs.Cancel Property](/dotnet/api/microsoft.web.webview2.core.corewebview2screencapturestartingeventargs.cancel?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.Handled Property](/dotnet/api/microsoft.web.webview2.core.corewebview2screencapturestartingeventargs.handled?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.OriginalSourceFrameInfo Property](/dotnet/api/microsoft.web.webview2.core.corewebview2screencapturestartingeventargs.originalsourceframeinfo?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2ScreenCaptureStartingEventArgs.GetDeferral Method](/dotnet/api/microsoft.web.webview2.core.corewebview2screencapturestartingeventargs.getdeferral?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
##### [WinRT/C#](#tab/winrtcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.ScreenCaptureStarting Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#screencapturestarting)
* 'CoreWebView2Frame' Class:
* [CoreWebView2Frame.ScreenCaptureStarting Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2frame?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#screencapturestarting)
* 'CoreWebView2ScreenCaptureStartingEventArgs' Class:
* [CoreWebView2ScreenCaptureStartingEventArgs.Cancel Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2screencapturestartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#cancel)
* [CoreWebView2ScreenCaptureStartingEventArgs.Handled Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2screencapturestartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#handled)
* [CoreWebView2ScreenCaptureStartingEventArgs.OriginalSourceFrameInfo Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2screencapturestartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#originalsourceframeinfo)
* [CoreWebView2ScreenCaptureStartingEventArgs.GetDeferral Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2screencapturestartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#getdeferral)
##### [Win32/C++](#tab/win32cpp)
* [ICoreWebView2_27](/microsoft-edge/webview2/reference/win32/icorewebview2_27?view=webview2-1.0.2895-prerelease&preserve-view=true)
* [ICoreWebView2_27::add_ScreenCaptureStarting](/microsoft-edge/webview2/reference/win32/icorewebview2_27?view=webview2-1.0.2895-prerelease&preserve-view=true#add_screencapturestarting)
* [ICoreWebView2_27::remove_ScreenCaptureStarting](/microsoft-edge/webview2/reference/win32/icorewebview2_27?view=webview2-1.0.2895-prerelease&preserve-view=true#remove_screencapturestarting)
* [ICoreWebView2Frame6](/microsoft-edge/webview2/reference/win32/icorewebview2frame6?view=webview2-1.0.2895-prerelease&preserve-view=true)
* [ICoreWebView2Frame6::add_ScreenCaptureStarting](/microsoft-edge/webview2/reference/win32/icorewebview2frame6?view=webview2-1.0.2895-prerelease&preserve-view=true#add_screencapturestarting)
* [ICoreWebView2Frame6::remove_ScreenCaptureStarting](/microsoft-edge/webview2/reference/win32/icorewebview2frame6?view=webview2-1.0.2895-prerelease&preserve-view=true#remove_screencapturestarting)
* [ICoreWebView2FrameScreenCaptureStartingEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2framescreencapturestartingeventhandler?view=webview2-1.0.2895-prerelease&preserve-view=true)
* [ICoreWebView2ScreenCaptureStartingEventArgs](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true)
* [ICoreWebView2ScreenCaptureStartingEventArgs::get_Cancel](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#get_cancel)
* [ICoreWebView2ScreenCaptureStartingEventArgs::get_Handled](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#get_handled)
* [ICoreWebView2ScreenCaptureStartingEventArgs::get_OriginalSourceFrameInfo](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#get_originalsourceframeinfo)<!-- no put -->
* [ICoreWebView2ScreenCaptureStartingEventArgs::GetDeferral](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#getdeferral)
* [ICoreWebView2ScreenCaptureStartingEventArgs::put_Cancel](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#put_cancel)
* [ICoreWebView2ScreenCaptureStartingEventArgs::put_Handled](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#put_handled)
* [ICoreWebView2ScreenCaptureStartingEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2screencapturestartingeventhandler?view=webview2-1.0.2895-prerelease&preserve-view=true)
---
<!-- ---------- -->
###### Configure the security warning when saving a file ('SaveFileSecurityCheckStarting' event)
<!--
promoted to Stable in Oct Release SDK
promoted from Experimental to Stable in Oct Prerelease SDK
-->
Added a new 'SaveFileSecurityCheckStarting' event. Your app can register a handler on this event to get the file path, filename extension, and document origin URI information. You can then apply your own rules to do actions such as the following:
* Allow saving the file without presenting a default security-warning UI about the file-type policy.
* Cancel the saving.
* Create your own UI to manage runtime file-type policies.
##### [.NET/C#](#tab/dotnetcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.SaveFileSecurityCheckStarting Event](/dotnet/api/microsoft.web.webview2.core.corewebview2.savefilesecuritycheckstarting?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs Class](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.CancelSave Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.cancelsave?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.DocumentOriginUri Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.documentoriginuri?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.FileExtension Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.fileextension?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.FilePath Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.filepath?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.SuppressDefaultPolicy Property](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.suppressdefaultpolicy?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.GetDeferral Method](/dotnet/api/microsoft.web.webview2.core.corewebview2savefilesecuritycheckstartingeventargs.getdeferral?view=webview2-dotnet-1.0.2895-prerelease&preserve-view=true)
##### [WinRT/C#](#tab/winrtcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.SaveFileSecurityCheckStarting Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#savefilesecuritycheckstarting)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs Class](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.CancelSave Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#cancelsave)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.DocumentOriginUri Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#documentoriginuri)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.FileExtension Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#fileextension)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.FilePath Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#filepath)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.SuppressDefaultPolicy Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#suppressdefaultpolicy)
* [CoreWebView2SaveFileSecurityCheckStartingEventArgs.GetDeferral Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2savefilesecuritycheckstartingeventargs?view=webview2-winrt-1.0.2895-prerelease&preserve-view=true#getdeferral)
##### [Win32/C++](#tab/win32cpp)
* [ICoreWebView2_26](/microsoft-edge/webview2/reference/win32/icorewebview2_26?view=webview2-1.0.2895-prerelease&preserve-view=true)
* [ICoreWebView2_26::add_SaveFileSecurityCheckStarting](/microsoft-edge/webview2/reference/win32/icorewebview2_26?view=webview2-1.0.2895-prerelease&preserve-view=true#add_savefilesecuritycheckstarting)
* [ICoreWebView2_26::remove_SaveFileSecurityCheckStarting](/microsoft-edge/webview2/reference/win32/icorewebview2_26?view=webview2-1.0.2895-prerelease&preserve-view=true#remove_savefilesecuritycheckstarting)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_CancelSave](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#get_cancelsave)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_DocumentOriginUri](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#get_documentoriginuri)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_FileExtension](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#get_fileextension)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_FilePath](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#get_filepath)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::get_SuppressDefaultPolicy](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#get_suppressdefaultpolicy)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::GetDeferral](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#getdeferral)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::put_CancelSave](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#put_cancelsave)
* [ICoreWebView2SaveFileSecurityCheckStartingEventArgs::put_SuppressDefaultPolicy](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventargs?view=webview2-1.0.2895-prerelease&preserve-view=true#put_suppressdefaultpolicy)
* [ICoreWebView2SaveFileSecurityCheckStartingEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2savefilesecuritycheckstartingeventhandler?view=webview2-1.0.2895-prerelease&preserve-view=true)
---
<!-- ------------------------------ -->
#### Bug fixes
<!-- ---------- -->
##### SDK-only
* Fixed Arm64 incompatibility with WindowsAppSDK 1.6.
* Removed extra 'WebView2Loader.dll' in WinAppSDK case.
* Using 'CoreWebView2.AddWebResourceRequestedFilter' without a 'CoreWebView2WebResourceRequestSourceKinds' parameter is now deprecated. See the .NET [CoreWebView2.AddWebResourceRequestedFilter Method](https://go.microsoft.com/fwlink/?linkid=2286319).<!-- points to WebView2Announcements -->
<!-- end of Oct 2024 Prerelease SDK -->
<!-- ====================================================================== -->
Release Date: September 23, 2024`,
},
"1.0.2792.45": {
SDKVersion: "1.0.2792.45",
ReleaseNotes: "https://learn.microsoft.com/en-us/microsoft-edge/webview2/release-notes?tabs=win32cpp#10279245",
RuntimeVersion: "129.0.2792.45",
Notes: `
<!-- ------------------------------ -->
#### Promotions
No additional APIs have been promoted to Stable and added in this Release SDK.
<!-- ------------------------------ -->
#### Bug fixes
<!-- ---------- -->
###### SDK-only
* Fixed an SDK dependency for .NET projects. ([Issue #4743](https://github.com/MicrosoftEdge/WebView2Feedback/issues/4743))
<!-- end of Sep 2024 Release SDK -->
<!-- ====================================================================== -->
Release Date: September 23, 2024`,
},
"1.0.2839-prerelease": {
SDKVersion: "1.0.2839-prerelease",
ReleaseNotes: "https://learn.microsoft.com/en-us/microsoft-edge/webview2/release-notes?tabs=win32cpp#102839-prerelease",
RuntimeVersion: "130.0.2839.0",
Notes: `
<!-- ------------------------------ -->
#### Experimental APIs
No Experimental APIs have been added in this Prerelease SDK.
<!-- ------------------------------ -->
#### Promotions
No APIs have been promoted from Experimental to Stable in this Prerelease SDK.
<!-- ------------------------------ -->
#### Bug fixes
<!-- ---------- -->
###### Runtime-only
* Fixed an issue where focusing on a WebView2 control in WinAppSDK with the Windows "Scroll inactive windows" setting disabled caused scrolling to fail.
* Blocked 'edge://wallet' in WebView2. ([Issue #4710](https://github.com/MicrosoftEdge/WebView2Feedback/issues/4710))
* Cleared the environment variable for default background color in .NET WebView2 controls after the controller has finished creation.
* Enabled accessibility support for Webview2 in visual hosting mode.
* Fixed a bug with removing a "web resource requested" filter for multiple sources when one of them is Document.
* Fixed a regression where 'DataList' was not visible in WinUI or in other visually hosted WebView2 instances.
<!-- ---------- -->
###### SDK-only
* Fixed an SDK dependency for .NET projects. ([Issue #4743](https://github.com/MicrosoftEdge/WebView2Feedback/issues/4743))
* Fixed a compatibility issue when calling 'GetAvailableBrowserVersionString()' with an older 'WebView2Loader.dll'. ([Issue #4395](https://github.com/MicrosoftEdge/WebView2Feedback/issues/4395))
* Fixed issues when compiling wv2winrt-generated code with the 'cpp20' and '/permissive-' options.
* Added the .NET 8 'TargetFramework' for C# WinRT, enabled AOT (ahead-of-time) compatibility, and disabled runtime marshalling.
<!-- end of Sep 2024 Prerelease SDK -->
<!-- ====================================================================== -->
Release Date: August 26, 2024`,
},
"1.0.2739.15": {
SDKVersion: "1.0.2739.15",
ReleaseNotes: "https://learn.microsoft.com/en-us/microsoft-edge/webview2/release-notes?tabs=win32cpp#10273915",
RuntimeVersion: "128.0.2739.15",
Notes: `
<!-- ------------------------------ -->
#### Promotions
The following APIs have been promoted to Stable and are now included in this Release SDK.
<!-- ---------- -->
###### Web notification handling
Added support for Web Notification, for non-persistent notifications. The 'NotificationReceived' event for 'CoreWebView2' controls web notification handling, allowing customization or suppression by the host app. Unhandled notifications default to WebView2's UI.
##### [.NET/C#](#tab/dotnetcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.NotificationReceived Event](/dotnet/api/microsoft.web.webview2.core.corewebview2.notificationreceived?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification Class](/dotnet/api/microsoft.web.webview2.core.corewebview2notification?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.BadgeUri Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.badgeuri?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.Body Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.body?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.BodyImageUri Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.bodyimageuri?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.Direction Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.direction?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.IconUri Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.iconuri?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.IsSilent Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.issilent?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.Language Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.language?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.RequiresInteraction Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.requiresinteraction?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.ShouldRenotify Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.shouldrenotify?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.Tag Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.tag?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.Timestamp Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.timestamp?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.Title Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.title?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.VibrationPattern Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.vibrationpattern?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.ReportClicked Method](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.reportclicked?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.ReportClosed Method](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.reportclosed?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.ReportShown Method](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.reportshown?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.CloseRequested Event](/dotnet/api/microsoft.web.webview2.core.corewebview2notification.closerequested?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2NotificationReceivedEventArgs Class](/dotnet/api/microsoft.web.webview2.core.corewebview2notificationreceivedeventargs?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2NotificationReceivedEventArgs.Handled Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notificationreceivedeventargs.handled?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2NotificationReceivedEventArgs.Notification Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notificationreceivedeventargs.notification?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2NotificationReceivedEventArgs.SenderOrigin Property](/dotnet/api/microsoft.web.webview2.core.corewebview2notificationreceivedeventargs.senderorigin?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2NotificationReceivedEventArgs.GetDeferral Method](/dotnet/api/microsoft.web.webview2.core.corewebview2notificationreceivedeventargs.getdeferral?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2TextDirectionKind Enum](/dotnet/api/microsoft.web.webview2.core.corewebview2textdirectionkind?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* 'Default'
* 'LeftToRight'
* 'RightToLeft'
##### [WinRT/C#](#tab/winrtcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.NotificationReceived Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2?view=webview2-winrt-1.0.2739.15&preserve-view=true#notificationreceived)
* [CoreWebView2Notification Class](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true)
* [CoreWebView2Notification.BadgeUri Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#badgeuri)
* [CoreWebView2Notification.Body Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#body)
* [CoreWebView2Notification.BodyImageUri Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#bodyimageuri)
* [CoreWebView2Notification.Direction Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#direction)
* [CoreWebView2Notification.IconUri Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#iconuri)
* [CoreWebView2Notification.IsSilent Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#issilent)
* [CoreWebView2Notification.Language Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#language)
* [CoreWebView2Notification.RequiresInteraction Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#requiresinteraction)
* [CoreWebView2Notification.ShouldRenotify Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#shouldrenotify)
* [CoreWebView2Notification.Tag Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#tag)
* [CoreWebView2Notification.Timestamp Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#timestamp)
* [CoreWebView2Notification.Title Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#title)
* [CoreWebView2Notification.VibrationPattern Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#vibrationpattern)
* [CoreWebView2Notification.ReportClicked Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#reportclicked)
* [CoreWebView2Notification.ReportClosed Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#reportclosed)
* [CoreWebView2Notification.ReportShown Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#reportshown)
* [CoreWebView2Notification.CloseRequested Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notification?view=webview2-winrt-1.0.2739.15&preserve-view=true#closerequested)
* [CoreWebView2NotificationReceivedEventArgs Class](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notificationreceivedeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true)
* [CoreWebView2NotificationReceivedEventArgs.Handled Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notificationreceivedeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#handled)
* [CoreWebView2NotificationReceivedEventArgs.Notification Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notificationreceivedeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#notification)
* [CoreWebView2NotificationReceivedEventArgs.SenderOrigin Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notificationreceivedeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#senderorigin)
* [CoreWebView2NotificationReceivedEventArgs.GetDeferral Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2notificationreceivedeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#getdeferral)
* [CoreWebView2TextDirectionKind Enum](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2textdirectionkind?view=webview2-winrt-1.0.2739.15&preserve-view=true)
* 'Default'
* 'LeftToRight'
* 'RightToLeft'
##### [Win32/C++](#tab/win32cpp)
* [ICoreWebView2_24](/microsoft-edge/webview2/reference/win32/icorewebview2_24?view=webview2-1.0.2739.15&preserve-view=true)
* [ICoreWebView2_24::add_NotificationReceived](/microsoft-edge/webview2/reference/win32/icorewebview2_24?view=webview2-1.0.2739.15&preserve-view=true#add_notificationreceived)
* [ICoreWebView2_24::remove_NotificationReceived](/microsoft-edge/webview2/reference/win32/icorewebview2_24?view=webview2-1.0.2739.15&preserve-view=true#remove_notificationreceived)
* [ICoreWebView2Notification](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true)
* [ICoreWebView2Notification::add_CloseRequested](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#add_closerequested)
* [ICoreWebView2Notification::get_BadgeUri](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_badgeuri)
* [ICoreWebView2Notification::get_Body](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_body)
* [ICoreWebView2Notification::get_BodyImageUri](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_bodyimageuri)
* [ICoreWebView2Notification::get_Direction](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_direction)
* [ICoreWebView2Notification::get_IconUri](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_iconuri)
* [ICoreWebView2Notification::get_IsSilent](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_issilent)
* [ICoreWebView2Notification::get_Language](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_language)
* [ICoreWebView2Notification::get_RequiresInteraction](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_requiresinteraction)
* [ICoreWebView2Notification::get_ShouldRenotify](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_shouldrenotify)
* [ICoreWebView2Notification::get_Tag](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_tag)
* [ICoreWebView2Notification::get_Timestamp](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_timestamp)
* [ICoreWebView2Notification::get_Title](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#get_title)
* [ICoreWebView2Notification::GetVibrationPattern](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#getvibrationpattern)
* [ICoreWebView2Notification::remove_CloseRequested](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#remove_closerequested)
* [ICoreWebView2Notification::ReportClicked](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#reportclicked)
* [ICoreWebView2Notification::ReportClosed](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#reportclosed)
* [ICoreWebView2Notification::ReportShown](/microsoft-edge/webview2/reference/win32/icorewebview2notification?view=webview2-1.0.2739.15&preserve-view=true#reportshown)
* [ICoreWebView2NotificationCloseRequestedEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2notificationcloserequestedeventhandler?view=webview2-1.0.2739.15&preserve-view=true)<!-- Win32-only -->
* [ICoreWebView2NotificationReceivedEventArgs](/microsoft-edge/webview2/reference/win32/icorewebview2notificationreceivedeventargs?view=webview2-1.0.2739.15&preserve-view=true)
* [ICoreWebView2NotificationReceivedEventArgs::get_Handled](/microsoft-edge/webview2/reference/win32/icorewebview2notificationreceivedeventargs?view=webview2-1.0.2739.15&preserve-view=true#get_handled)
* [ICoreWebView2NotificationReceivedEventArgs::get_Notification](/microsoft-edge/webview2/reference/win32/icorewebview2notificationreceivedeventargs?view=webview2-1.0.2739.15&preserve-view=true#get_notification)
* [ICoreWebView2NotificationReceivedEventArgs::get_SenderOrigin](/microsoft-edge/webview2/reference/win32/icorewebview2notificationreceivedeventargs?view=webview2-1.0.2739.15&preserve-view=true#get_senderorigin)
* [ICoreWebView2NotificationReceivedEventArgs::GetDeferral](/microsoft-edge/webview2/reference/win32/icorewebview2notificationreceivedeventargs?view=webview2-1.0.2739.15&preserve-view=true#getdeferral)
* [ICoreWebView2NotificationReceivedEventArgs::put_Handled](/microsoft-edge/webview2/reference/win32/icorewebview2notificationreceivedeventargs?view=webview2-1.0.2739.15&preserve-view=true#put_handled)
* [ICoreWebView2NotificationReceivedEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2notificationreceivedeventhandler?view=webview2-1.0.2739.15&preserve-view=true)<!-- Win32-only -->
* ['COREWEBVIEW2_TEXT_DIRECTION_KIND' Enum](/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.2739.15&preserve-view=true#corewebview2_text_direction_kind)
* 'COREWEBVIEW2_TEXT_DIRECTION_KIND_DEFAULT'
* 'COREWEBVIEW2_TEXT_DIRECTION_KIND_LEFT_TO_RIGHT'
* 'COREWEBVIEW2_TEXT_DIRECTION_KIND_RIGHT_TO_LEFT'
---
<!-- ---------- -->
###### Save as
Added 'SaveAs' APIs that allow you to programmatically perform the **Save as** operation. You can use these APIs to block the default **Save as** dialog, and then either save silently, or build your own UI for **Save as**. These APIs pertain only to the **Save as** dialog, not the **Download** dialog, which continues to use the existing Download APIs.
##### [.NET/C#](#tab/dotnetcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.ShowSaveAsUIAsync Method](/dotnet/api/microsoft.web.webview2.core.corewebview2.showsaveasuiasync?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2.SaveAsUIShowing Event](/dotnet/api/microsoft.web.webview2.core.corewebview2.saveasuishowing?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2SaveAsKind Enum](/dotnet/api/microsoft.web.webview2.core.corewebview2saveaskind?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* 'Complete'
* 'Default'
* 'HtmlOnly'
* 'SingleFile'
* [CoreWebView2SaveAsUIResult Enum](/dotnet/api/microsoft.web.webview2.core.corewebview2saveasuiresult?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* 'Cancelled'
* 'FileAlreadyExists'
* 'InvalidPath'
* 'KindNotSupported'
* 'Success'
* [CoreWebView2SaveAsUIShowingEventArgs Class](/dotnet/api/microsoft.web.webview2.core.corewebview2saveasuishowingeventargs?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2SaveAsUIShowingEventArgs.AllowReplace Property](/dotnet/api/microsoft.web.webview2.core.corewebview2saveasuishowingeventargs.allowreplace?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2SaveAsUIShowingEventArgs.Cancel Property](/dotnet/api/microsoft.web.webview2.core.corewebview2saveasuishowingeventargs.cancel?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2SaveAsUIShowingEventArgs.ContentMimeType Property](/dotnet/api/microsoft.web.webview2.core.corewebview2saveasuishowingeventargs.contentmimetype?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2SaveAsUIShowingEventArgs.Kind Property](/dotnet/api/microsoft.web.webview2.core.corewebview2saveasuishowingeventargs.kind?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2SaveAsUIShowingEventArgs.SaveAsFilePath Property](/dotnet/api/microsoft.web.webview2.core.corewebview2saveasuishowingeventargs.saveasfilepath?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2SaveAsUIShowingEventArgs.SuppressDefaultDialog Property](/dotnet/api/microsoft.web.webview2.core.corewebview2saveasuishowingeventargs.suppressdefaultdialog?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
* [CoreWebView2SaveAsUIShowingEventArgs.GetDeferral Method](/dotnet/api/microsoft.web.webview2.core.corewebview2saveasuishowingeventargs.getdeferral?view=webview2-dotnet-1.0.2739.15&preserve-view=true)
##### [WinRT/C#](#tab/winrtcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.ShowSaveAsUIAsync Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2?view=webview2-winrt-1.0.2739.15&preserve-view=true#showsaveasuiasync)
* [CoreWebView2.SaveAsUIShowing Event](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2?view=webview2-winrt-1.0.2739.15&preserve-view=true#saveasuishowing)
* [CoreWebView2SaveAsKind Enum](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveaskind?view=webview2-winrt-1.0.2739.15&preserve-view=true)
* 'Default'
* 'HtmlOnly'
* 'SingleFile'
* 'Complete'
* [CoreWebView2SaveAsUIResult Enum](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveasuiresult?view=webview2-winrt-1.0.2739.15&preserve-view=true)
* 'Success'
* 'InvalidPath'
* 'FileAlreadyExists'
* 'KindNotSupported'
* 'Cancelled'
* [CoreWebView2SaveAsUIShowingEventArgs Class](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveasuishowingeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true)
* [CoreWebView2SaveAsUIShowingEventArgs.AllowReplace Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveasuishowingeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#allowreplace)
* [CoreWebView2SaveAsUIShowingEventArgs.Cancel Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveasuishowingeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#cancel)
* [CoreWebView2SaveAsUIShowingEventArgs.ContentMimeType Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveasuishowingeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#contentmimetype)
* [CoreWebView2SaveAsUIShowingEventArgs.Kind Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveasuishowingeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#kind)
* [CoreWebView2SaveAsUIShowingEventArgs.SaveAsFilePath Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveasuishowingeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#saveasfilepath)
* [CoreWebView2SaveAsUIShowingEventArgs.SuppressDefaultDialog Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveasuishowingeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#suppressdefaultdialog)
* [CoreWebView2SaveAsUIShowingEventArgs.GetDeferral Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2saveasuishowingeventargs?view=webview2-winrt-1.0.2739.15&preserve-view=true#getdeferral)
##### [Win32/C++](#tab/win32cpp)
* [ICoreWebView2_25](/microsoft-edge/webview2/reference/win32/icorewebview2_25?view=webview2-1.0.2739.15&preserve-view=true)
* [ICoreWebView2_25::add_SaveAsUIShowing](/microsoft-edge/webview2/reference/win32/icorewebview2_25?view=webview2-1.0.2739.15&preserve-view=true#add_saveasuishowing)
* [ICoreWebView2_25::remove_SaveAsUIShowing](/microsoft-edge/webview2/reference/win32/icorewebview2_25?view=webview2-1.0.2739.15&preserve-view=true#remove_saveasuishowing)
* [ICoreWebView2_25::ShowSaveAsUI](/microsoft-edge/webview2/reference/win32/icorewebview2_25?view=webview2-1.0.2739.15&preserve-view=true#showsaveasui)
* [ICoreWebView2SaveAsUIShowingEventHandler](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventhandler?view=webview2-1.0.2739.15&preserve-view=true)<!-- Win32-only -->
* [ICoreWebView2SaveAsUIShowingEventArgs](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true)
* [ICoreWebView2SaveAsUIShowingEventArgs::get_AllowReplace](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#get_allowreplace)
* [ICoreWebView2SaveAsUIShowingEventArgs::get_Cancel](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#get_cancel)
* [ICoreWebView2SaveAsUIShowingEventArgs::get_ContentMimeType](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#get_contentmimetype)
* [ICoreWebView2SaveAsUIShowingEventArgs::get_Kind](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#get_kind)
* [ICoreWebView2SaveAsUIShowingEventArgs::get_SaveAsFilePath](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#get_saveasfilepath)
* [ICoreWebView2SaveAsUIShowingEventArgs::get_SuppressDefaultDialog](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#get_suppressdefaultdialog)
* [ICoreWebView2SaveAsUIShowingEventArgs::GetDeferral](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#getdeferral)
* [ICoreWebView2SaveAsUIShowingEventArgs::put_AllowReplace](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#put_allowreplace)
* [ICoreWebView2SaveAsUIShowingEventArgs::put_Cancel](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#put_cancel)
* [ICoreWebView2SaveAsUIShowingEventArgs::put_Kind](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#put_kind)
* [ICoreWebView2SaveAsUIShowingEventArgs::put_SaveAsFilePath](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#put_saveasfilepath)
* [ICoreWebView2SaveAsUIShowingEventArgs::put_SuppressDefaultDialog](/microsoft-edge/webview2/reference/win32/icorewebview2saveasuishowingeventargs?view=webview2-1.0.2739.15&preserve-view=true#put_suppressdefaultdialog)
* [ICoreWebView2ShowSaveAsUICompletedHandler](/microsoft-edge/webview2/reference/win32/icorewebview2showsaveasuicompletedhandler?view=webview2-1.0.2739.15&preserve-view=true)<!-- Win32-only -->
* ['COREWEBVIEW2_SAVE_AS_KIND' Enum](/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.2739.15&preserve-view=true#corewebview2_save_as_kind)
* 'COREWEBVIEW2_SAVE_AS_KIND_DEFAULT'
* 'COREWEBVIEW2_SAVE_AS_KIND_HTML_ONLY'
* 'COREWEBVIEW2_SAVE_AS_KIND_SINGLE_FILE'
* 'COREWEBVIEW2_SAVE_AS_KIND_COMPLETE'
* ['COREWEBVIEW2_SAVE_AS_UI_RESULT' Enum](/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.2739.15&preserve-view=true#corewebview2_save_as_ui_result)
* 'COREWEBVIEW2_SAVE_AS_UI_RESULT_SUCCESS'
* 'COREWEBVIEW2_SAVE_AS_UI_RESULT_INVALID_PATH'
* 'COREWEBVIEW2_SAVE_AS_UI_RESULT_FILE_ALREADY_EXISTS'
* 'COREWEBVIEW2_SAVE_AS_UI_RESULT_KIND_NOT_SUPPORTED'
* 'COREWEBVIEW2_SAVE_AS_UI_RESULT_CANCELLED'
---
<!-- ------------------------------ -->
#### Bug fixes
There are no bug fixes in this Release SDK.
<!-- end of Aug 2024 Release SDK -->
<!-- ====================================================================== -->
Release Date: August 26, 2024`,
},
"1.0.2783-prerelease": {
SDKVersion: "1.0.2783-prerelease",
ReleaseNotes: "https://learn.microsoft.com/en-us/microsoft-edge/webview2/release-notes?tabs=win32cpp#102783-prerelease",
RuntimeVersion: "129.0.2783.0",
Notes: `
<!-- ------------------------------ -->
#### Experimental APIs
No Experimental APIs have been added in this Prerelease SDK.
<!-- ------------------------------ -->
#### Promotions
No APIs have been promoted from Experimental to Stable in this Prerelease SDK.
<!-- ------------------------------ -->
#### Bug fixes
<!-- ---------- -->
###### Runtime and SDK
* Re-enabled the default behavior of 'SetUserAgent': by default, 'SetUserAgent' is effective for cross-origin iframes.
<!-- ---------- -->
###### Runtime-only
* Enabled the interactive dragging feature by default. See 'edge-webview-interactive-dragging' in [WebView2 browser flags](../concepts/webview-features-flags.md).
* Disabled 'IsolateSandboxedIframes' for WebView2.
* Fixed an issue where WebView creation fails when multiple instances are launched at the same time. ([Issue #4731](https://github.com/MicrosoftEdge/WebView2Feedback/issues/4731))
* Fixed a bug in WinRT JavaScript projection where caching existing properties in objects whose name contains 'Proxy' or 'Function' caused an error due to name collision.
* Fixed a bug where the WebView2 control became the wrong size after disconnecting and reconnecting a monitor.
* Fixed an issue where "mailto:" links leave an untitled popup window open, instead of automatically closing the popup window.
<!-- ---------- -->
###### SDK-only
* C# WinRT projection now works on UWP.
* Fixed an issue to ensure that 'GeneratedFilesDir' no longer appears in Visual Studio for C# WinRT projection.
<!-- end of Aug 2024 Prerelease SDK -->
<!-- ====================================================================== -->
<!-- July/August 2024 Release SDK -->
Release Date: August 13, 2024`,
},
"1.0.2651.64": {
SDKVersion: "1.0.2651.64",
ReleaseNotes: "https://learn.microsoft.com/en-us/microsoft-edge/webview2/release-notes?tabs=win32cpp#10265164",
RuntimeVersion: "127.0.2651.64",
Notes: `
<!-- ------------------------------ -->
#### Promotions
The following APIs have been promoted to Stable and are now included in this Release SDK.
<!-- ---------- -->
* Updated the WebMessageObjects API to allow injecting DOM objects into WebView2 content that's constructed via the app, and via the 'CoreWebView2.PostWebMessage' API in the other direction. Added a new web object type ('CoreWebView2FileSystemHandle') to represent a file system handle that can be posted to the web content to provide it with filesystem access.
##### [.NET/C#](#tab/dotnetcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.PostWebMessageAsJson(webMessageAsJson, additionalObjects) Method](/dotnet/api/microsoft.web.webview2.core.corewebview2.postwebmessageasjson?view=webview2-dotnet-1.0.2651.64&preserve-view=true#microsoft-web-webview2-core-corewebview2-postwebmessageasjson(system-string-system-collections-generic-list((system-object))))<!-- overload w/ "additionalObjects" param, keep detailed anchor -->
* 'CoreWebView2Environment' Class:
* [CoreWebView2Environment.CreateWebFileSystemDirectoryHandle Method](/dotnet/api/microsoft.web.webview2.core.corewebview2environment.createwebfilesystemdirectoryhandle?view=webview2-dotnet-1.0.2651.64&preserve-view=true)
* [CoreWebView2Environment.CreateWebFileSystemFileHandle Method](/dotnet/api/microsoft.web.webview2.core.corewebview2environment.createwebfilesystemfilehandle?view=webview2-dotnet-1.0.2651.64&preserve-view=true)
* 'CoreWebView2FileSystemHandle' Class:
* [CoreWebView2FileSystemHandle.Kind Property](/dotnet/api/microsoft.web.webview2.core.corewebview2filesystemhandle.kind?view=webview2-dotnet-1.0.2651.64&preserve-view=true)
* [CoreWebView2FileSystemHandle.Path Property](/dotnet/api/microsoft.web.webview2.core.corewebview2filesystemhandle.path?view=webview2-dotnet-1.0.2651.64&preserve-view=true)
* [CoreWebView2FileSystemHandle.Permission Property](/dotnet/api/microsoft.web.webview2.core.corewebview2filesystemhandle.permission?view=webview2-dotnet-1.0.2651.64&preserve-view=true)
* [CoreWebView2FileSystemHandleKind Enum](/dotnet/api/microsoft.web.webview2.core.corewebview2filesystemhandlekind?view=webview2-dotnet-1.0.2651.64&preserve-view=true)
* 'File'
* 'Directory'
* [CoreWebView2FileSystemHandlePermission Enum](/dotnet/api/microsoft.web.webview2.core.corewebview2filesystemhandlepermission?view=webview2-dotnet-1.0.2651.64&preserve-view=true)
* 'ReadOnly'
* 'ReadWrite'
##### [WinRT/C#](#tab/winrtcsharp)
* 'CoreWebView2' Class:
* [CoreWebView2.PostWebMessageAsJson(webMessageAsJson, additionalObjects) Method](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2?view=webview2-winrt-1.0.2651.64&preserve-view=true#postwebmessageasjson)<!-- overload w/ "additionalObjects" param. currently the first overload in Ref page so no -1 appended. url will need to append -1 or -2 if addl overloads are later added above this one in Ref page -->
* 'CoreWebView2Environment' Class:
* [CoreWebView2Environment.CreateWebFileSystemDirectoryHandle Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2environment?view=webview2-winrt-1.0.2651.64&preserve-view=true#createwebfilesystemdirectoryhandle)
* [CoreWebView2Environment.CreateWebFileSystemFileHandle Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2environment?view=webview2-winrt-1.0.2651.64&preserve-view=true#createwebfilesystemfilehandle)
* 'CoreWebView2FileSystemHandle' Class:
* [CoreWebView2FileSystemHandle.Kind Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2filesystemhandle?view=webview2-winrt-1.0.2651.64&preserve-view=true#kind)
* [CoreWebView2FileSystemHandle.Path Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2filesystemhandle?view=webview2-winrt-1.0.2651.64&preserve-view=true#path)
* [CoreWebView2FileSystemHandle.Permission Property](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2filesystemhandle?view=webview2-winrt-1.0.2651.64&preserve-view=true#permission)
* [CoreWebView2FileSystemHandleKind Enum](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2filesystemhandlekind?view=webview2-winrt-1.0.2651.64&preserve-view=true)
* 'File'
* 'Directory'
* [CoreWebView2FileSystemHandlePermission Enum](/microsoft-edge/webview2/reference/winrt/microsoft_web_webview2_core/corewebview2filesystemhandlepermission?view=webview2-winrt-1.0.2651.64&preserve-view=true)
* 'ReadOnly'
* 'ReadWrite'
##### [Win32/C++](#tab/win32cpp)
* [ICoreWebView2_23](/microsoft-edge/webview2/reference/win32/icorewebview2_23?view=webview2-1.0.2651.64&preserve-view=true)
* [ICoreWebView2_23::PostWebMessageAsJsonWithAdditionalObjects](/microsoft-edge/webview2/reference/win32/icorewebview2_23?view=webview2-1.0.2651.64&preserve-view=true#postwebmessageasjsonwithadditionalobjects)<!-- long name, not overload + param -->
* [ICoreWebView2Environment14](/microsoft-edge/webview2/reference/win32/icorewebview2environment14?view=webview2-1.0.2651.64&preserve-view=true)
* [ICoreWebView2Environment14::CreateObjectCollection](/microsoft-edge/webview2/reference/win32/icorewebview2environment14?view=webview2-1.0.2651.64&preserve-view=true#createobjectcollection)<!--win32 only-->
* [ICoreWebView2Environment14::CreateWebFileSystemDirectoryHandle](/microsoft-edge/webview2/reference/win32/icorewebview2environment14?view=webview2-1.0.2651.64&preserve-view=true#createwebfilesystemdirectoryhandle)
* [ICoreWebView2Environment14::CreateWebFileSystemFileHandle](/microsoft-edge/webview2/reference/win32/icorewebview2environment14?view=webview2-1.0.2651.64&preserve-view=true#createwebfilesystemfilehandle)
* [ICoreWebView2FileSystemHandle](/microsoft-edge/webview2/reference/win32/icorewebview2filesystemhandle?view=webview2-1.0.2651.64&preserve-view=true)
* [ICoreWebView2FileSystemHandle::get_Kind](/microsoft-edge/webview2/reference/win32/icorewebview2filesystemhandle?view=webview2-1.0.2651.64&preserve-view=true#get_kind)
* [ICoreWebView2FileSystemHandle::get_Path](/microsoft-edge/webview2/reference/win32/icorewebview2filesystemhandle?view=webview2-1.0.2651.64&preserve-view=true#get_path)
* [ICoreWebView2FileSystemHandle::get_Permission](/microsoft-edge/webview2/reference/win32/icorewebview2filesystemhandle?view=webview2-1.0.2651.64&preserve-view=true#get_permission)
* [ICoreWebView2ObjectCollection](/microsoft-edge/webview2/reference/win32/icorewebview2objectcollection?view=webview2-1.0.2651.64&preserve-view=true)
* [ICoreWebView2ObjectCollection::InsertValueAtIndex](/microsoft-edge/webview2/reference/win32/icorewebview2objectcollection?view=webview2-1.0.2651.64&preserve-view=true#insertvalueatindex)
* [ICoreWebView2ObjectCollection::RemoveValueAtIndex](/microsoft-edge/webview2/reference/win32/icorewebview2objectcollection?view=webview2-1.0.2651.64&preserve-view=true#removevalueatindex)
* [COREWEBVIEW2_FILE_SYSTEM_HANDLE_KIND enum](/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.2651.64&preserve-view=true#corewebview2_file_system_handle_kind)
* 'COREWEBVIEW2_FILE_SYSTEM_HANDLE_KIND_FILE'
* 'COREWEBVIEW2_FILE_SYSTEM_HANDLE_KIND_DIRECTORY'
* [COREWEBVIEW2_FILE_SYSTEM_HANDLE_PERMISSION enum](/microsoft-edge/webview2/reference/win32/webview2-idl?view=webview2-1.0.2651.64&preserve-view=true#corewebview2_file_system_handle_permission)
* 'COREWEBVIEW2_FILE_SYSTEM_HANDLE_PERMISSION_READ_ONLY'
* 'COREWEBVIEW2_FILE_SYSTEM_HANDLE_PERMISSION_READ_WRITE'
---
<!-- ------------------------------ -->
#### Bug fixes
<!-- ---------- -->
###### Runtime-only
* Fixed a regression where 'WebResourceRequested' events crash on certain sites. ([Issue #4602](https://github.com/MicrosoftEdge/WebView2Feedback/issues/4602))
<!-- ---------- -->
###### SDK-only
* Fixed x86 for WinRT C# projection.
<!-- end of Jul/Aug 2024 Release SDK -->
<!-- ====================================================================== -->
<!-- July/August 2024 Prerelease SDK -->
Release Date: August 7, 2024`,
},
}