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:
22
vendor/github.com/wailsapp/go-webview2/LICENSE
generated
vendored
Normal file
22
vendor/github.com/wailsapp/go-webview2/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 John Chadwick
|
||||
Some portions Copyright (c) 2017 Serge Zaitsev
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
195
vendor/github.com/wailsapp/go-webview2/internal/w32/w32.go
generated
vendored
Normal file
195
vendor/github.com/wailsapp/go-webview2/internal/w32/w32.go
generated
vendored
Normal file
@@ -0,0 +1,195 @@
|
||||
//go:build windows
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unicode/utf16"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
var (
|
||||
ole32 = windows.NewLazySystemDLL("ole32")
|
||||
Ole32CoInitializeEx = ole32.NewProc("CoInitializeEx")
|
||||
|
||||
kernel32 = windows.NewLazySystemDLL("kernel32")
|
||||
Kernel32GetCurrentThreadID = kernel32.NewProc("GetCurrentThreadId")
|
||||
|
||||
shlwapi = windows.NewLazySystemDLL("shlwapi")
|
||||
shlwapiSHCreateMemStream = shlwapi.NewProc("SHCreateMemStream")
|
||||
|
||||
user32 = windows.NewLazySystemDLL("user32")
|
||||
User32LoadImageW = user32.NewProc("LoadImageW")
|
||||
User32GetSystemMetrics = user32.NewProc("GetSystemMetrics")
|
||||
User32RegisterClassExW = user32.NewProc("RegisterClassExW")
|
||||
User32CreateWindowExW = user32.NewProc("CreateWindowExW")
|
||||
User32DestroyWindow = user32.NewProc("DestroyWindow")
|
||||
User32ShowWindow = user32.NewProc("ShowWindow")
|
||||
User32UpdateWindow = user32.NewProc("UpdateWindow")
|
||||
User32SetFocus = user32.NewProc("SetFocus")
|
||||
User32GetMessageW = user32.NewProc("GetMessageW")
|
||||
User32TranslateMessage = user32.NewProc("TranslateMessage")
|
||||
User32DispatchMessageW = user32.NewProc("DispatchMessageW")
|
||||
User32DefWindowProcW = user32.NewProc("DefWindowProcW")
|
||||
User32GetClientRect = user32.NewProc("GetClientRect")
|
||||
User32PostQuitMessage = user32.NewProc("PostQuitMessage")
|
||||
User32SetWindowTextW = user32.NewProc("SetWindowTextW")
|
||||
User32PostThreadMessageW = user32.NewProc("PostThreadMessageW")
|
||||
User32GetWindowLongPtrW = user32.NewProc("GetWindowLongPtrW")
|
||||
User32SetWindowLongPtrW = user32.NewProc("SetWindowLongPtrW")
|
||||
User32AdjustWindowRect = user32.NewProc("AdjustWindowRect")
|
||||
User32SetWindowPos = user32.NewProc("SetWindowPos")
|
||||
)
|
||||
|
||||
const (
|
||||
SystemMetricsCxIcon = 11
|
||||
SystemMetricsCyIcon = 12
|
||||
)
|
||||
|
||||
const (
|
||||
COINIT_APARTMENTTHREADED = 0x2
|
||||
COINIT_MULTITHREADED = 0x0
|
||||
COINIT_DISABLE_OLE1DDE = 0x4
|
||||
COINIT_SPEED_OVER_MEMORY = 0x8
|
||||
)
|
||||
|
||||
const (
|
||||
SWShow = 5
|
||||
)
|
||||
|
||||
const (
|
||||
SWPNoZOrder = 0x0004
|
||||
SWPNoActivate = 0x0010
|
||||
SWPNoMove = 0x0002
|
||||
SWPFrameChanged = 0x0020
|
||||
)
|
||||
|
||||
const (
|
||||
WMDestroy = 0x0002
|
||||
WMMove = 0x0003
|
||||
WMSize = 0x0005
|
||||
WMClose = 0x0010
|
||||
WMQuit = 0x0012
|
||||
WMGetMinMaxInfo = 0x0024
|
||||
WMNCLButtonDown = 0x00A1
|
||||
WMMoving = 0x0216
|
||||
WMApp = 0x8000
|
||||
)
|
||||
|
||||
const (
|
||||
GWLStyle = -16
|
||||
)
|
||||
|
||||
const (
|
||||
WSOverlapped = 0x00000000
|
||||
WSMaximizeBox = 0x00020000
|
||||
WSThickFrame = 0x00040000
|
||||
WSCaption = 0x00C00000
|
||||
WSSysMenu = 0x00080000
|
||||
WSMinimizeBox = 0x00020000
|
||||
WSOverlappedWindow = (WSOverlapped | WSCaption | WSSysMenu | WSThickFrame | WSMinimizeBox | WSMaximizeBox)
|
||||
)
|
||||
|
||||
type WndClassExW struct {
|
||||
CbSize uint32
|
||||
Style uint32
|
||||
LpfnWndProc uintptr
|
||||
CnClsExtra int32
|
||||
CbWndExtra int32
|
||||
HInstance windows.Handle
|
||||
HIcon windows.Handle
|
||||
HCursor windows.Handle
|
||||
HbrBackground windows.Handle
|
||||
LpszMenuName *uint16
|
||||
LpszClassName *uint16
|
||||
HIconSm windows.Handle
|
||||
}
|
||||
|
||||
type Rect struct {
|
||||
Left int32
|
||||
Top int32
|
||||
Right int32
|
||||
Bottom int32
|
||||
}
|
||||
|
||||
type MinMaxInfo struct {
|
||||
PtReserved Point
|
||||
PtMaxSize Point
|
||||
PtMaxPosition Point
|
||||
PtMinTrackSize Point
|
||||
PtMaxTrackSize Point
|
||||
}
|
||||
|
||||
type Point struct {
|
||||
X, Y int32
|
||||
}
|
||||
|
||||
type Msg struct {
|
||||
Hwnd syscall.Handle
|
||||
Message uint32
|
||||
WParam uintptr
|
||||
LParam uintptr
|
||||
Time uint32
|
||||
Pt Point
|
||||
LPrivate uint32
|
||||
}
|
||||
|
||||
func Utf16PtrToString(p *uint16) string {
|
||||
if p == nil {
|
||||
return ""
|
||||
}
|
||||
// Find NUL terminator.
|
||||
end := unsafe.Pointer(p)
|
||||
n := 0
|
||||
for *(*uint16)(end) != 0 {
|
||||
end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
|
||||
n++
|
||||
}
|
||||
s := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:n:n]
|
||||
return string(utf16.Decode(s))
|
||||
}
|
||||
|
||||
func SHCreateMemStream(data []byte) (uintptr, error) {
|
||||
ret, _, err := shlwapiSHCreateMemStream.Call(
|
||||
uintptr(unsafe.Pointer(&data[0])),
|
||||
uintptr(len(data)),
|
||||
)
|
||||
if ret == 0 {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
const CW_USEDEFAULT = 0x80000000
|
||||
|
||||
// GetClientRect retrieves the coordinates of a window's client area. The client coordinates specify the upper-left and lower-right corners of the
|
||||
// client area. Because client coordinates are relative to the upper-left corner of a window's client area, the coordinates of the upper-left
|
||||
// corner are (0,0).
|
||||
func GetClientRect(hwnd uintptr) (Rect, error) {
|
||||
var rect Rect
|
||||
ret, _, err := User32GetClientRect.Call(hwnd, uintptr(unsafe.Pointer(&rect)))
|
||||
if ret == 0 {
|
||||
return Rect{}, err
|
||||
}
|
||||
|
||||
return rect, nil
|
||||
}
|
||||
|
||||
// DefWindowProc calls the default window procedure to provide default processing for any window messages that an application does not process.
|
||||
func DefWindowProc(hwnd, msg, wparam, lparam uintptr) uintptr {
|
||||
ret, _, _ := User32DefWindowProcW.Call(hwnd, msg, wparam, lparam)
|
||||
return ret
|
||||
}
|
||||
|
||||
// DestroyWindow destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages to the window
|
||||
// to deactivate it and remove the keyboard focus from it.
|
||||
func DestroyWindow(hwnd uintptr) error {
|
||||
ret, _, err := User32DestroyWindow.Call(hwnd)
|
||||
if ret == 0 {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
239
vendor/github.com/wailsapp/go-webview2/pkg/combridge/bridge.go
generated
vendored
Normal file
239
vendor/github.com/wailsapp/go-webview2/pkg/combridge/bridge.go
generated
vendored
Normal file
@@ -0,0 +1,239 @@
|
||||
//go:build windows
|
||||
|
||||
package combridge
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
var (
|
||||
comIfcePointersL sync.RWMutex
|
||||
comIfcePointers = map[uintptr]*comObject{} // Map from ComInterfacePointer to the Go ComObject
|
||||
)
|
||||
|
||||
// Resolve the GoInterface of the specified ComInterfacePointer
|
||||
func Resolve[T IUnknown](ifceP uintptr) T {
|
||||
comIfcePointersL.RLock()
|
||||
comObj := comIfcePointers[ifceP]
|
||||
comIfcePointersL.RUnlock()
|
||||
|
||||
var n T
|
||||
if comObj != nil {
|
||||
t := comObj.resolve(ifceP)
|
||||
if t != nil {
|
||||
n = t.(T)
|
||||
}
|
||||
}
|
||||
|
||||
return n
|
||||
}
|
||||
|
||||
// New returns a new ComObject which implements the specified Com Interface, com calls will be redirected
|
||||
// to the specified go interface.
|
||||
func New[T IUnknown](obj T) *ComObject[T] {
|
||||
cObj := new(
|
||||
ifceDef[T]{obj},
|
||||
)
|
||||
return newComObject[T](cObj)
|
||||
}
|
||||
|
||||
// New2 returns a new ComObject which implements the two specified Com Interfaces, com calls will be redirected
|
||||
// to those interfaces accordingly.
|
||||
// This is needed if a ComObject should implement two interfaces that are not descendants of each other,
|
||||
// then you get multiple inheritance.
|
||||
func New2[T IUnknown, T2 IUnknown](obj T, obj2 T2) *ComObject[T] {
|
||||
cObj := new(
|
||||
ifceDef[T]{obj},
|
||||
ifceDef[T2]{obj2},
|
||||
)
|
||||
return newComObject[T](cObj)
|
||||
}
|
||||
|
||||
// new returns a new ComObject which implements multiple specified Com Interfaces, com calls will be redirected
|
||||
// to the specified go interfaces accordingly.
|
||||
// This is needed if a ComObject should implement multiple interfaces that are not descendants of each other,
|
||||
// then you get multiple inheritance.
|
||||
func new(impls ...ifceImpl) *comObject {
|
||||
impls = append([]ifceImpl{ifceDef[IUnknown]{}}, impls...)
|
||||
|
||||
cObj := &comObject{
|
||||
refCount: 1,
|
||||
ifces: map[string]int{},
|
||||
ifcesImpl: make([]comInterfaceDesc, len(impls)),
|
||||
}
|
||||
|
||||
for i, ifceDef := range impls {
|
||||
vtable, err := ifceDef.ifce()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
needsImplement := false
|
||||
for table := vtable; table != nil; table = table.Parent {
|
||||
guid := table.ComGUID
|
||||
if i, found := cObj.ifces[guid]; found {
|
||||
// This Interface is already implemented
|
||||
if guid == iUnknownGUID {
|
||||
// IUnknown is a special interface and never has an user specific implementation
|
||||
} else if cObj.ifcesImpl[i].impl != ifceDef.impl() {
|
||||
panic(fmt.Sprintf("Interface '%s' is already implemented by another object", table.Name))
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
|
||||
needsImplement = true
|
||||
cObj.ifces[guid] = i
|
||||
}
|
||||
|
||||
if !needsImplement {
|
||||
continue
|
||||
}
|
||||
|
||||
ifceP, ifcePSlice := allocUintptrObject(1)
|
||||
ifcePSlice[0] = vtable.ComVTable
|
||||
cObj.ifcesImpl[i] = comInterfaceDesc{ifceP, ifceDef.impl()}
|
||||
}
|
||||
|
||||
comIfcePointersL.Lock()
|
||||
for _, ifceImpl := range cObj.ifcesImpl {
|
||||
comIfcePointers[ifceImpl.ref] = cObj
|
||||
}
|
||||
comIfcePointersL.Unlock()
|
||||
|
||||
return cObj
|
||||
}
|
||||
|
||||
func newComObject[T IUnknown](comObj *comObject) *ComObject[T] {
|
||||
c := &ComObject[T]{obj: comObj}
|
||||
// Make sure to async release since release needs locks and might block the finalizer goroutine for a longer period
|
||||
runtime.SetFinalizer(c, func(obj *ComObject[T]) { obj.close(true) })
|
||||
return c
|
||||
}
|
||||
|
||||
// ComObject describes an exported go instance to be used as a ComObject which implements
|
||||
// the specified Interface.
|
||||
type ComObject[T IUnknown] struct {
|
||||
obj *comObject
|
||||
closed int32
|
||||
}
|
||||
|
||||
// Ref returns the native uintptr that points to the ComObject that is an interface pointer to T.
|
||||
// This can be used in native calls. If the object has been closed this function will panic.
|
||||
func (o *ComObject[T]) Ref() uintptr {
|
||||
if atomic.LoadInt32(&o.closed) != 0 {
|
||||
panic("ComObject has been released")
|
||||
}
|
||||
return o.obj.queryInterface(guidOf[T](), false)
|
||||
}
|
||||
|
||||
// Close releases the native com object from the go side. It will only be destroyed if the ref counter
|
||||
// reaches zero.
|
||||
// After closing `Ref()` will panic.
|
||||
func (o *ComObject[T]) Close() error {
|
||||
o.close(false)
|
||||
return nil
|
||||
}
|
||||
|
||||
// close releases the native com object from the go side. It will only be destroyed if the ref counter
|
||||
// reaches zero.
|
||||
// After closing `Ref()` will panic.
|
||||
func (o *ComObject[T]) close(asyncRelease bool) {
|
||||
if atomic.CompareAndSwapInt32(&o.closed, 0, 1) {
|
||||
runtime.SetFinalizer(o, nil)
|
||||
if asyncRelease {
|
||||
go o.obj.release()
|
||||
} else {
|
||||
o.obj.release()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type comInterfaceDesc struct {
|
||||
ref uintptr // The native Com InterfacePointer
|
||||
impl any // The golang target object
|
||||
}
|
||||
|
||||
type comObject struct {
|
||||
l sync.Mutex
|
||||
|
||||
refCount int32
|
||||
ifces map[string]int // Map of ComInterfaceGUID to Interface Slots
|
||||
ifcesImpl []comInterfaceDesc // Slots with InterfaceDescriptors
|
||||
}
|
||||
|
||||
func (c *comObject) queryInterface(ifceGUID string, withAddRef bool) uintptr {
|
||||
c.l.Lock()
|
||||
defer c.l.Unlock()
|
||||
if c.refCount <= 0 {
|
||||
panic("call on released com object")
|
||||
}
|
||||
|
||||
i, found := c.ifces[ifceGUID]
|
||||
if !found {
|
||||
return 0
|
||||
}
|
||||
|
||||
if withAddRef {
|
||||
c.refCount++
|
||||
}
|
||||
return c.ifcesImpl[i].ref
|
||||
}
|
||||
|
||||
func (c *comObject) resolve(ifceP uintptr) any {
|
||||
c.l.Lock()
|
||||
defer c.l.Unlock()
|
||||
if c.refCount <= 0 {
|
||||
panic("call on destroyed com object")
|
||||
}
|
||||
|
||||
for _, ifce := range c.ifcesImpl {
|
||||
if ifce.ref != ifceP {
|
||||
continue
|
||||
}
|
||||
|
||||
return ifce.impl
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *comObject) addRef() int32 {
|
||||
c.l.Lock()
|
||||
defer c.l.Unlock()
|
||||
if c.refCount <= 0 {
|
||||
panic("call on destroyed com object")
|
||||
}
|
||||
|
||||
c.refCount++
|
||||
return c.refCount
|
||||
}
|
||||
|
||||
func (c *comObject) release() int32 {
|
||||
c.l.Lock()
|
||||
defer c.l.Unlock()
|
||||
if c.refCount <= 0 {
|
||||
panic("call on destroyed com object")
|
||||
}
|
||||
|
||||
if c.refCount--; c.refCount == 0 {
|
||||
comIfcePointersL.Lock()
|
||||
for _, ref := range c.ifcesImpl {
|
||||
delete(comIfcePointers, ref.ref)
|
||||
}
|
||||
comIfcePointersL.Unlock()
|
||||
|
||||
for _, impl := range c.ifcesImpl {
|
||||
ref := impl.ref
|
||||
if ref == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
globalFree(ref)
|
||||
}
|
||||
}
|
||||
|
||||
return c.refCount
|
||||
}
|
||||
56
vendor/github.com/wailsapp/go-webview2/pkg/combridge/iunknown.go
generated
vendored
Normal file
56
vendor/github.com/wailsapp/go-webview2/pkg/combridge/iunknown.go
generated
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
//go:build windows
|
||||
|
||||
package combridge
|
||||
|
||||
import (
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
const iUnknownGUID = "{00000000-0000-0000-C000-000000000046}"
|
||||
|
||||
func init() {
|
||||
registerVTableInternal[IUnknown, IUnknown](
|
||||
iUnknownGUID,
|
||||
true,
|
||||
iUnknownQueryInterface,
|
||||
iUnknownAddRef,
|
||||
iUnknownRelease,
|
||||
)
|
||||
}
|
||||
|
||||
type IUnknown interface{}
|
||||
|
||||
func iUnknownQueryInterface(this uintptr, refiid *windows.GUID, ppvObject *uintptr) uintptr {
|
||||
if refiid == nil || ppvObject == nil {
|
||||
return uintptr(windows.E_INVALIDARG)
|
||||
}
|
||||
|
||||
comIfcePointersL.RLock()
|
||||
obj := comIfcePointers[this]
|
||||
comIfcePointersL.RUnlock()
|
||||
|
||||
ref := obj.queryInterface(refiid.String(), true)
|
||||
if ref != 0 {
|
||||
*ppvObject = ref
|
||||
return windows.NO_ERROR
|
||||
}
|
||||
|
||||
*ppvObject = 0
|
||||
return uintptr(windows.E_NOINTERFACE)
|
||||
}
|
||||
|
||||
func iUnknownAddRef(this uintptr) uintptr {
|
||||
comIfcePointersL.RLock()
|
||||
obj := comIfcePointers[this]
|
||||
comIfcePointersL.RUnlock()
|
||||
|
||||
return uintptr(obj.addRef())
|
||||
}
|
||||
|
||||
func iUnknownRelease(this uintptr) uintptr {
|
||||
comIfcePointersL.RLock()
|
||||
obj := comIfcePointers[this]
|
||||
comIfcePointersL.RUnlock()
|
||||
|
||||
return uintptr(obj.release())
|
||||
}
|
||||
74
vendor/github.com/wailsapp/go-webview2/pkg/combridge/iunknown_impl.go
generated
vendored
Normal file
74
vendor/github.com/wailsapp/go-webview2/pkg/combridge/iunknown_impl.go
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
//go:build windows
|
||||
|
||||
package combridge
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
// IUnknownFromPointer cast a generic pointer into a IUnknownImpl pointer
|
||||
func IUnknownFromPointer(ref unsafe.Pointer) *IUnknownImpl {
|
||||
return (*IUnknownImpl)(ref)
|
||||
}
|
||||
|
||||
// IUnknownFromPointer cast native pointer into a IUnknownImpl pointer
|
||||
func IUnknownFromUintptr(ref uintptr) *IUnknownImpl {
|
||||
return IUnknownFromPointer(unsafe.Pointer(ref))
|
||||
}
|
||||
|
||||
type IUnknownVtbl struct {
|
||||
queryInterface uintptr
|
||||
addRef uintptr
|
||||
release uintptr
|
||||
}
|
||||
|
||||
func (i *IUnknownVtbl) QueryInterface(this unsafe.Pointer, refiid *windows.GUID, ppvObject **IUnknownImpl) error {
|
||||
r, _, _ := syscall.SyscallN(
|
||||
i.queryInterface,
|
||||
uintptr(this),
|
||||
uintptr(unsafe.Pointer(refiid)),
|
||||
uintptr(unsafe.Pointer(ppvObject)),
|
||||
)
|
||||
|
||||
if r != uintptr(windows.S_OK) {
|
||||
return syscall.Errno(r)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i *IUnknownVtbl) AddRef(this unsafe.Pointer) uint32 {
|
||||
r, _, _ := syscall.SyscallN(
|
||||
i.addRef,
|
||||
uintptr(this),
|
||||
)
|
||||
return uint32(r)
|
||||
}
|
||||
|
||||
func (i *IUnknownVtbl) Release(this unsafe.Pointer) uint32 {
|
||||
r, _, _ := syscall.SyscallN(
|
||||
i.release,
|
||||
uintptr(this),
|
||||
)
|
||||
|
||||
return uint32(r)
|
||||
}
|
||||
|
||||
type IUnknownImpl struct {
|
||||
vtbl *IUnknownVtbl
|
||||
}
|
||||
|
||||
func (i *IUnknownImpl) QueryInterface(refiid *windows.GUID, ppvObject **IUnknownImpl) error {
|
||||
return i.vtbl.QueryInterface(unsafe.Pointer(i), refiid, ppvObject)
|
||||
}
|
||||
|
||||
func (i *IUnknownImpl) AddRef() uint32 {
|
||||
return i.vtbl.AddRef(unsafe.Pointer(i))
|
||||
}
|
||||
|
||||
func (i *IUnknownImpl) Release() uint32 {
|
||||
return i.vtbl.Release(unsafe.Pointer(i))
|
||||
}
|
||||
39
vendor/github.com/wailsapp/go-webview2/pkg/combridge/syscall.go
generated
vendored
Normal file
39
vendor/github.com/wailsapp/go-webview2/pkg/combridge/syscall.go
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
//go:build windows
|
||||
|
||||
package combridge
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
var (
|
||||
modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
|
||||
procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
|
||||
procGlobalFree = modkernel32.NewProc("GlobalFree")
|
||||
|
||||
uintptrSize = unsafe.Sizeof(uintptr(0))
|
||||
)
|
||||
|
||||
func allocUintptrObject(size int) (uintptr, []uintptr) {
|
||||
v := globalAlloc(uintptr(size) * uintptrSize)
|
||||
slice := unsafe.Slice((*uintptr)(unsafe.Pointer(v)), size)
|
||||
return v, slice
|
||||
}
|
||||
|
||||
func globalAlloc(dwBytes uintptr) uintptr {
|
||||
ret, _, _ := procGlobalAlloc.Call(uintptr(0), dwBytes)
|
||||
if ret == 0 {
|
||||
panic("globalAlloc failed")
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func globalFree(data uintptr) {
|
||||
ret, _, _ := procGlobalFree.Call(data)
|
||||
if ret != 0 {
|
||||
panic("globalFree failed")
|
||||
}
|
||||
}
|
||||
147
vendor/github.com/wailsapp/go-webview2/pkg/combridge/vtables.go
generated
vendored
Normal file
147
vendor/github.com/wailsapp/go-webview2/pkg/combridge/vtables.go
generated
vendored
Normal file
@@ -0,0 +1,147 @@
|
||||
//go:build windows
|
||||
|
||||
package combridge
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
var (
|
||||
vTablesL sync.Mutex
|
||||
vTables = make(map[string]*vTable)
|
||||
)
|
||||
|
||||
// RegisterVTable registers the vtable trampoline methods for the specified ComInterface
|
||||
// TBase is the base interface of T, and must be another ComInterface which roots in IUnknown or IUnknown itself.
|
||||
// The first paramter of the fn is always the uintptr of the ComObject and the GoObject can be resolved with Resolve().
|
||||
// After having resolved the GoObject the call must be redirected to the GoObject.
|
||||
// Typically a trampoline FN looks like this.
|
||||
//
|
||||
// func _ICoreWebView2NavigationCompletedEventHandlerInvoke(this uintptr, sender *ICoreWebView2, args *ICoreWebView2NavigationCompletedEventArgs) uintptr {
|
||||
// return combridge.Resolve[_ICoreWebView2NavigationCompletedEventHandler](this).NavigationCompleted(sender, args)
|
||||
// }
|
||||
//
|
||||
// The order of registration must be in the correct order as specified in the IDL of the interface.
|
||||
func RegisterVTable[TParent, T IUnknown](guid string, fns ...interface{}) {
|
||||
registerVTableInternal[TParent, T](guid, false, fns...)
|
||||
}
|
||||
|
||||
type vTable struct {
|
||||
Parent *vTable
|
||||
|
||||
Name string
|
||||
ComGUID string
|
||||
ComVTable uintptr
|
||||
ComProcs []uintptr
|
||||
}
|
||||
|
||||
func registerVTableInternal[TParent, T IUnknown](guid string, isInternal bool, fns ...interface{}) {
|
||||
vTablesL.Lock()
|
||||
defer vTablesL.Unlock()
|
||||
|
||||
t, tName := typeInterfaceToString[T]()
|
||||
tParent, tParentName := typeInterfaceToString[TParent]()
|
||||
if !t.Implements(tParent) {
|
||||
panic(fmt.Errorf("RegisterVTable '%s': '%s' must implement '%s'", tName, tName, tParentName))
|
||||
}
|
||||
|
||||
if !isInternal {
|
||||
if t == reflect.TypeOf((*IUnknown)(nil)).Elem() {
|
||||
panic(fmt.Errorf("RegisterVTable '%s' IUnknown can't be registered", tName))
|
||||
}
|
||||
|
||||
if t == tParent {
|
||||
panic(fmt.Errorf("RegisterVTable '%s': T and TParent can't be the same type", tName))
|
||||
}
|
||||
}
|
||||
|
||||
var parent *vTable
|
||||
var parentProcs []uintptr
|
||||
var parentProcsCount int
|
||||
if t != tParent {
|
||||
parent = vTables[tParentName]
|
||||
if parent == nil {
|
||||
panic(fmt.Errorf("RegisterVTable '%s': Parent VTable '%s' not registered", tName, tParentName))
|
||||
}
|
||||
|
||||
parentProcs = parent.ComProcs
|
||||
parentProcsCount = len(parentProcs)
|
||||
}
|
||||
|
||||
comGuid, err := windows.GUIDFromString(guid)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("RegisterVTable '%s': invalid guid: %s", tName, err))
|
||||
}
|
||||
|
||||
vTable := &vTable{
|
||||
Parent: parent,
|
||||
Name: tName,
|
||||
ComGUID: comGuid.String(),
|
||||
}
|
||||
vTable.ComVTable, vTable.ComProcs = allocUintptrObject(parentProcsCount + len(fns))
|
||||
|
||||
for i, proc := range parentProcs {
|
||||
vTable.ComProcs[i] = proc
|
||||
}
|
||||
|
||||
for i, fn := range fns {
|
||||
vTable.ComProcs[parentProcsCount+i] = windows.NewCallback(fn)
|
||||
}
|
||||
|
||||
vTables[tName] = vTable
|
||||
}
|
||||
|
||||
func typeInterfaceToString[T any]() (reflect.Type, string) {
|
||||
t := reflect.TypeOf((*T)(nil))
|
||||
if t.Kind() != reflect.Pointer {
|
||||
panic("must be a (*yourInterfaceType)(nil)")
|
||||
}
|
||||
t = t.Elem()
|
||||
return t, t.PkgPath() + "/" + t.Name()
|
||||
}
|
||||
|
||||
func typeInterfaceToStringOnly[T any]() string {
|
||||
_, nane := typeInterfaceToString[T]()
|
||||
return nane
|
||||
}
|
||||
|
||||
func guidOf[T any]() string {
|
||||
vtable := vTableOf[T]()
|
||||
if vtable == nil {
|
||||
return ""
|
||||
}
|
||||
return vtable.ComGUID
|
||||
}
|
||||
|
||||
func vTableOf[T any]() *vTable {
|
||||
name := typeInterfaceToStringOnly[T]()
|
||||
vTablesL.Lock()
|
||||
defer vTablesL.Unlock()
|
||||
|
||||
return vTables[name]
|
||||
}
|
||||
|
||||
type ifceImpl interface {
|
||||
impl() any
|
||||
ifce() (*vTable, error)
|
||||
}
|
||||
|
||||
type ifceDef[T any] struct {
|
||||
objImpl any
|
||||
}
|
||||
|
||||
func (i ifceDef[T]) impl() any {
|
||||
return i.objImpl
|
||||
}
|
||||
|
||||
func (i ifceDef[T]) ifce() (*vTable, error) {
|
||||
vtable := vTableOf[T]()
|
||||
if vtable == nil {
|
||||
return nil, fmt.Errorf("Unable to find vTable for %s", typeInterfaceToStringOnly[T]())
|
||||
}
|
||||
return vtable, nil
|
||||
}
|
||||
10
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_BOUNDS_MODE.go
generated
vendored
Normal file
10
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_BOUNDS_MODE.go
generated
vendored
Normal 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
|
||||
)
|
||||
10
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go
generated
vendored
Normal file
10
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_COLOR.go
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
//go:build windows
|
||||
|
||||
package edge
|
||||
|
||||
type COREWEBVIEW2_COLOR struct {
|
||||
A uint8
|
||||
R uint8
|
||||
G uint8
|
||||
B uint8
|
||||
}
|
||||
11
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go
generated
vendored
Normal file
11
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_HOST_RESOURCE_ACCESS_KIND.go
generated
vendored
Normal 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
|
||||
)
|
||||
12
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go
generated
vendored
Normal file
12
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_KEY_EVENT_KIND.go
generated
vendored
Normal 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
|
||||
)
|
||||
11
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go
generated
vendored
Normal file
11
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_MOVE_FOCUS_REASON.go
generated
vendored
Normal 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
|
||||
)
|
||||
23
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go
generated
vendored
Normal file
23
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_PHYSICAL_KEY_STATUS.go
generated
vendored
Normal 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
|
||||
}
|
||||
49
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go
generated
vendored
Normal file
49
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_PROCESS_FAILED_KIND.go
generated
vendored
Normal 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
|
||||
)
|
||||
25
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go
generated
vendored
Normal file
25
vendor/github.com/wailsapp/go-webview2/pkg/edge/COREWEBVIEW2_WEB_RESOURCE_CONTEXT.go
generated
vendored
Normal 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
|
||||
)
|
||||
90
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go
generated
vendored
Normal file
90
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventArgs.go
generated
vendored
Normal 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
|
||||
}
|
||||
66
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go
generated
vendored
Normal file
66
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2AcceleratorKeyPressedEventHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
64
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler.go
generated
vendored
Normal file
64
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
21
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ContainsFullScreenElementChangedEventArgs.go
generated
vendored
Normal file
21
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ContainsFullScreenElementChangedEventArgs.go
generated
vendored
Normal 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
|
||||
}
|
||||
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ContainsFullScreenElementChangedEventHandler.go
generated
vendored
Normal file
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ContainsFullScreenElementChangedEventHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
176
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Controller.go
generated
vendored
Normal file
176
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Controller.go
generated
vendored
Normal 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
|
||||
}
|
||||
77
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Controller2.go
generated
vendored
Normal file
77
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Controller2.go
generated
vendored
Normal 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
|
||||
}
|
||||
174
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Controller3.go
generated
vendored
Normal file
174
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Controller3.go
generated
vendored
Normal 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
|
||||
}
|
||||
97
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Controller4.go
generated
vendored
Normal file
97
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Controller4.go
generated
vendored
Normal 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
|
||||
}
|
||||
234
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Cookie.go
generated
vendored
Normal file
234
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Cookie.go
generated
vendored
Normal 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
|
||||
}
|
||||
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2CookieList.go
generated
vendored
Normal file
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2CookieList.go
generated
vendored
Normal 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
|
||||
}
|
||||
187
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2CookieManager.go
generated
vendored
Normal file
187
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2CookieManager.go
generated
vendored
Normal 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
|
||||
}
|
||||
60
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go
generated
vendored
Normal file
60
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2CreateCoreWebView2ControllerCompletedHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
50
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Deferral.go
generated
vendored
Normal file
50
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Deferral.go
generated
vendored
Normal 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
|
||||
}
|
||||
64
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ExecuteScriptCompletedHandler.go
generated
vendored
Normal file
64
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ExecuteScriptCompletedHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
46
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2File.go
generated
vendored
Normal file
46
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2File.go
generated
vendored
Normal 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
|
||||
}
|
||||
77
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go
generated
vendored
Normal file
77
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2HttpHeadersCollectionIterator.go
generated
vendored
Normal 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
|
||||
}
|
||||
102
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go
generated
vendored
Normal file
102
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2HttpRequestHeaders.go
generated
vendored
Normal 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
|
||||
}
|
||||
58
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2HttpResponseHeaders.go
generated
vendored
Normal file
58
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2HttpResponseHeaders.go
generated
vendored
Normal 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
|
||||
}
|
||||
30
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go
generated
vendored
Normal file
30
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventArgs.go
generated
vendored
Normal 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)
|
||||
}
|
||||
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go
generated
vendored
Normal file
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2NavigationCompletedEventHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
58
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ObjectCollectionView.go
generated
vendored
Normal file
58
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ObjectCollectionView.go
generated
vendored
Normal 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
|
||||
}
|
||||
38
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go
generated
vendored
Normal file
38
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventArgs.go
generated
vendored
Normal 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
|
||||
}
|
||||
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go
generated
vendored
Normal file
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2ProcessFailedEventHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2RasterizationScaleChangedEventHandler.go
generated
vendored
Normal file
59
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2RasterizationScaleChangedEventHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
273
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings.go
generated
vendored
Normal file
273
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings.go
generated
vendored
Normal 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
|
||||
}
|
||||
89
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings2.go
generated
vendored
Normal file
89
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings2.go
generated
vendored
Normal 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
|
||||
}
|
||||
84
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings3.go
generated
vendored
Normal file
84
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings3.go
generated
vendored
Normal 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
|
||||
}
|
||||
121
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings4.go
generated
vendored
Normal file
121
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings4.go
generated
vendored
Normal 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
|
||||
}
|
||||
90
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings5.go
generated
vendored
Normal file
90
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings5.go
generated
vendored
Normal 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
|
||||
}
|
||||
92
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings6.go
generated
vendored
Normal file
92
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2Settings6.go
generated
vendored
Normal 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
|
||||
}
|
||||
65
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebMessageReceivedEventArgs.go
generated
vendored
Normal file
65
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebMessageReceivedEventArgs.go
generated
vendored
Normal 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
|
||||
}
|
||||
50
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebMessageReceivedEventHandler.go
generated
vendored
Normal file
50
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebMessageReceivedEventHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
96
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go
generated
vendored
Normal file
96
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebResourceRequest.go
generated
vendored
Normal 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
|
||||
}
|
||||
80
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go
generated
vendored
Normal file
80
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventArgs.go
generated
vendored
Normal 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
|
||||
}
|
||||
50
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go
generated
vendored
Normal file
50
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebResourceRequestedEventHandler.go
generated
vendored
Normal 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,
|
||||
}
|
||||
}
|
||||
118
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go
generated
vendored
Normal file
118
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2WebResourceResponse.go
generated
vendored
Normal 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)
|
||||
}
|
||||
113
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2_2.go
generated
vendored
Normal file
113
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2_2.go
generated
vendored
Normal 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
|
||||
}
|
||||
74
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2_3.go
generated
vendored
Normal file
74
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebView2_3.go
generated
vendored
Normal 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()
|
||||
}
|
||||
370
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebViewSettings.go
generated
vendored
Normal file
370
vendor/github.com/wailsapp/go-webview2/pkg/edge/ICoreWebViewSettings.go
generated
vendored
Normal 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
|
||||
}
|
||||
66
vendor/github.com/wailsapp/go-webview2/pkg/edge/IStream.go
generated
vendored
Normal file
66
vendor/github.com/wailsapp/go-webview2/pkg/edge/IStream.go
generated
vendored
Normal 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)
|
||||
}
|
||||
}
|
||||
170
vendor/github.com/wailsapp/go-webview2/pkg/edge/capabilities.go
generated
vendored
Normal file
170
vendor/github.com/wailsapp/go-webview2/pkg/edge/capabilities.go
generated
vendored
Normal 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
|
||||
}
|
||||
716
vendor/github.com/wailsapp/go-webview2/pkg/edge/chromium.go
generated
vendored
Normal file
716
vendor/github.com/wailsapp/go-webview2/pkg/edge/chromium.go
generated
vendored
Normal 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), ¤tExePath[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
|
||||
}
|
||||
28
vendor/github.com/wailsapp/go-webview2/pkg/edge/chromium_386.go
generated
vendored
Normal file
28
vendor/github.com/wailsapp/go-webview2/pkg/edge/chromium_386.go
generated
vendored
Normal 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))
|
||||
}
|
||||
}
|
||||
19
vendor/github.com/wailsapp/go-webview2/pkg/edge/chromium_amd64.go
generated
vendored
Normal file
19
vendor/github.com/wailsapp/go-webview2/pkg/edge/chromium_amd64.go
generated
vendored
Normal 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)
|
||||
}
|
||||
}
|
||||
27
vendor/github.com/wailsapp/go-webview2/pkg/edge/chromium_arm64.go
generated
vendored
Normal file
27
vendor/github.com/wailsapp/go-webview2/pkg/edge/chromium_arm64.go
generated
vendored
Normal 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
80
vendor/github.com/wailsapp/go-webview2/pkg/edge/com.go
generated
vendored
Normal 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)
|
||||
}
|
||||
663
vendor/github.com/wailsapp/go-webview2/pkg/edge/corewebview2.go
generated
vendored
Normal file
663
vendor/github.com/wailsapp/go-webview2/pkg/edge/corewebview2.go
generated
vendored
Normal 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
|
||||
}
|
||||
29
vendor/github.com/wailsapp/go-webview2/pkg/edge/create_env_go.go
generated
vendored
Normal file
29
vendor/github.com/wailsapp/go-webview2/pkg/edge/create_env_go.go
generated
vendored
Normal 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)
|
||||
}
|
||||
41
vendor/github.com/wailsapp/go-webview2/pkg/edge/create_env_native.go
generated
vendored
Normal file
41
vendor/github.com/wailsapp/go-webview2/pkg/edge/create_env_native.go
generated
vendored
Normal 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
225
vendor/github.com/wailsapp/go-webview2/pkg/edge/guid.go
generated
vendored
Normal 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]
|
||||
}
|
||||
944
vendor/github.com/wailsapp/go-webview2/pkg/edge/version_map.go
generated
vendored
Normal file
944
vendor/github.com/wailsapp/go-webview2/pkg/edge/version_map.go
generated
vendored
Normal 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`,
|
||||
},
|
||||
}
|
||||
16
vendor/github.com/wailsapp/go-webview2/webviewloader/LICENSE
generated
vendored
Normal file
16
vendor/github.com/wailsapp/go-webview2/webviewloader/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
ISC License (ISC)
|
||||
|
||||
Copyright (c) 2020 John Chadwick
|
||||
Copyright (c) 2022 Wails Project Developers
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
19
vendor/github.com/wailsapp/go-webview2/webviewloader/README.md
generated
vendored
Normal file
19
vendor/github.com/wailsapp/go-webview2/webviewloader/README.md
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# Webviewloader
|
||||
|
||||
Webviewloader is a port of [OpenWebView2Loader](https://github.com/jchv/OpenWebView2Loader) to Go.
|
||||
|
||||
It is intended to be feature-complete with the original WebView2Loader distributed with
|
||||
the WebView2 NuGet package, but some features are intentionally not implemented.
|
||||
|
||||
## Status
|
||||
|
||||
- [x] CompareBrowserVersions
|
||||
- [x] CreateCoreWebView2Environment
|
||||
- [x] CreateCoreWebView2EnvironmentWithOptions
|
||||
- [x] GetAvailableCoreWebView2BrowserVersionString
|
||||
|
||||
## Not implemented features
|
||||
|
||||
- Registry Overrides of Parameters
|
||||
- Env Variable Overrides of Parameters
|
||||
- Does not incorporate `GetCurrentPackageInfo` to search for an installed runtime
|
||||
176
vendor/github.com/wailsapp/go-webview2/webviewloader/env_create.go
generated
vendored
Normal file
176
vendor/github.com/wailsapp/go-webview2/webviewloader/env_create.go
generated
vendored
Normal file
@@ -0,0 +1,176 @@
|
||||
//go:build windows && !native_webview2loader
|
||||
|
||||
package webviewloader
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"github.com/wailsapp/go-webview2/pkg/combridge"
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
func init() {
|
||||
UsingGoWebview2Loader = true
|
||||
preventEnvAndRegistryOverrides()
|
||||
}
|
||||
|
||||
type webView2RunTimeType int32
|
||||
|
||||
const (
|
||||
webView2RunTimeTypeInstalled webView2RunTimeType = 0x00
|
||||
webView2RunTimeTypeRedistributable webView2RunTimeType = 0x01
|
||||
)
|
||||
|
||||
// CreateCoreWebView2Environment creates an evergreen WebView2 Environment using the installed WebView2 Runtime version.
|
||||
//
|
||||
// This is equivalent to running CreateCoreWebView2EnvironmentWithOptions without any options.
|
||||
// For more information, see CreateCoreWebView2EnvironmentWithOptions.
|
||||
func CreateCoreWebView2Environment(environmentCompletedHandler ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler) error {
|
||||
return CreateCoreWebView2EnvironmentWithOptions(environmentCompletedHandler)
|
||||
}
|
||||
|
||||
// CreateCoreWebView2EnvironmentWithOptions creates an environment with a custom version of WebView2 Runtime,
|
||||
// user data folder, and with or without additional options.
|
||||
//
|
||||
// See https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/webview2-idl?#createcorewebview2environmentwithoptions
|
||||
func CreateCoreWebView2EnvironmentWithOptions(environmentCompletedHandler ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, opts ...option) error {
|
||||
var params environmentOptions
|
||||
for _, opt := range opts {
|
||||
opt(¶ms)
|
||||
}
|
||||
|
||||
var err error
|
||||
var dllPath string
|
||||
var runtimeType webView2RunTimeType
|
||||
if browserExecutableFolder := params.browserExecutableFolder; browserExecutableFolder != "" {
|
||||
runtimeType = webView2RunTimeTypeRedistributable
|
||||
dllPath, err = findEmbeddedClientDll(browserExecutableFolder)
|
||||
} else {
|
||||
runtimeType = webView2RunTimeTypeInstalled
|
||||
dllPath, _, err = findInstalledClientDll(params.preferCanary)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return createWebViewEnvironmentWithClientDll(dllPath, runtimeType, params.userDataFolder,
|
||||
¶ms, environmentCompletedHandler)
|
||||
}
|
||||
|
||||
func createWebViewEnvironmentWithClientDll(lpLibFileName string, runtimeType webView2RunTimeType, userDataFolder string,
|
||||
envOptions *environmentOptions, envCompletedHandler ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler) error {
|
||||
|
||||
if !filepath.IsAbs(lpLibFileName) {
|
||||
return fmt.Errorf("lpLibFileName must be absolute")
|
||||
}
|
||||
|
||||
dll, err := windows.LoadDLL(lpLibFileName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Loading DLL failed: %w", err)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
canUnloadProc, err := dll.FindProc("DllCanUnloadNow")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if r1, _, _ := canUnloadProc.Call(); r1 != windows.NO_ERROR {
|
||||
return
|
||||
}
|
||||
|
||||
dll.Release()
|
||||
}()
|
||||
|
||||
createProc, err := dll.FindProc("CreateWebViewEnvironmentWithOptionsInternal")
|
||||
if err != nil {
|
||||
return fmt.Errorf("Unable to find CreateWebViewEnvironmentWithOptionsInternal entrypoint: %w", err)
|
||||
}
|
||||
|
||||
userDataPtr, err := windows.UTF16PtrFromString(userDataFolder)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
envOptionsCom := combridge.New2[iCoreWebView2EnvironmentOptions, iCoreWebView2EnvironmentOptions2](
|
||||
envOptions, envOptions)
|
||||
|
||||
defer envOptionsCom.Close()
|
||||
|
||||
envCompletedHandler = &environmentCreatedHandler{envCompletedHandler}
|
||||
envCompletedCom := combridge.New[iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler](envCompletedHandler)
|
||||
defer envCompletedCom.Close()
|
||||
|
||||
preventEnvAndRegistryOverrides()
|
||||
|
||||
const unknown = 1
|
||||
hr, _, err := createProc.Call(
|
||||
uintptr(unknown),
|
||||
uintptr(runtimeType),
|
||||
uintptr(unsafe.Pointer(userDataPtr)),
|
||||
uintptr(envOptionsCom.Ref()),
|
||||
uintptr(envCompletedCom.Ref()))
|
||||
|
||||
if hr != 0 {
|
||||
if err == nil || err == windows.ERROR_SUCCESS {
|
||||
err = syscall.Errno(hr)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type environmentCreatedHandler struct {
|
||||
originalHandler ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler
|
||||
}
|
||||
|
||||
func (r *environmentCreatedHandler) EnvironmentCompleted(errorCode HRESULT, createdEnvironment *ICoreWebView2Environment) HRESULT {
|
||||
// The OpenWebview2Loader has some retry logic and retries once, didn't encounter any case when this would have been
|
||||
// needed during the development: https://github.com/jchv/OpenWebView2Loader/blob/master/Source/WebView2Loader.cpp#L202
|
||||
|
||||
if createdEnvironment != nil {
|
||||
// May or may not be necessary, but the official WebView2Loader seems to do it.
|
||||
iidICoreWebView2Environment := windows.GUID{
|
||||
Data1: 0xb96d755e,
|
||||
Data2: 0x0319,
|
||||
Data3: 0x4e92,
|
||||
Data4: [8]byte{0xa2, 0x96, 0x23, 0x43, 0x6f, 0x46, 0xa1, 0xfc},
|
||||
}
|
||||
|
||||
if err := createdEnvironment.QueryInterface(&iidICoreWebView2Environment, &createdEnvironment); err != nil {
|
||||
createdEnvironment = nil
|
||||
errNo, ok := err.(syscall.Errno)
|
||||
if !ok {
|
||||
errNo = syscall.Errno(windows.E_FAIL)
|
||||
}
|
||||
errorCode = HRESULT(errNo)
|
||||
}
|
||||
}
|
||||
|
||||
r.originalHandler.EnvironmentCompleted(errorCode, createdEnvironment)
|
||||
|
||||
if createdEnvironment != nil {
|
||||
createdEnvironment.Release()
|
||||
}
|
||||
|
||||
return HRESULT(windows.S_OK)
|
||||
}
|
||||
|
||||
func preventEnvAndRegistryOverrides() {
|
||||
// Setting these env variables to empty string also prevents registry overrides because webview2
|
||||
// checks for existence and not for empty value
|
||||
os.Setenv("WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER", "")
|
||||
os.Setenv("WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS", "")
|
||||
os.Setenv("WEBVIEW2_RELEASE_CHANNEL_PREFERENCE", "0")
|
||||
|
||||
// The following seems not be be required because those are only used by the webview2loader which
|
||||
// in this case is implemented on our own. But nevertheless set them to empty to be consistent.
|
||||
os.Setenv("WEBVIEW2_BROWSER_EXECUTABLE_FOLDER", "")
|
||||
os.Setenv("WEBVIEW2_USER_DATA_FOLDER", "")
|
||||
}
|
||||
42
vendor/github.com/wailsapp/go-webview2/webviewloader/env_create_completed.go
generated
vendored
Normal file
42
vendor/github.com/wailsapp/go-webview2/webviewloader/env_create_completed.go
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
//go:build windows && !native_webview2loader
|
||||
|
||||
package webviewloader
|
||||
|
||||
import (
|
||||
"github.com/wailsapp/go-webview2/pkg/combridge"
|
||||
)
|
||||
|
||||
// HRESULT
|
||||
//
|
||||
// See https://docs.microsoft.com/en-us/windows/win32/seccrypto/common-hresult-values
|
||||
type HRESULT int32
|
||||
|
||||
// ICoreWebView2Environment Represents the WebView2 Environment
|
||||
//
|
||||
// See https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2environment
|
||||
type ICoreWebView2Environment = combridge.IUnknownImpl
|
||||
|
||||
// ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler receives the WebView2Environment created using CreateCoreWebView2Environment.
|
||||
type ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler interface {
|
||||
// EnvironmentCompleted is invoked to receive the created WebView2Environment
|
||||
//
|
||||
// See https://docs.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2createcorewebview2environmentcompletedhandler?#invoke
|
||||
EnvironmentCompleted(errorCode HRESULT, createdEnvironment *ICoreWebView2Environment) HRESULT
|
||||
}
|
||||
|
||||
type iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler interface {
|
||||
combridge.IUnknown
|
||||
ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler
|
||||
}
|
||||
|
||||
func init() {
|
||||
combridge.RegisterVTable[combridge.IUnknown, iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler](
|
||||
"{4e8a3389-c9d8-4bd2-b6b5-124fee6cc14d}",
|
||||
_iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerInvoke,
|
||||
)
|
||||
}
|
||||
|
||||
func _iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerInvoke(this uintptr, errorCode HRESULT, env *combridge.IUnknownImpl) uintptr {
|
||||
res := combridge.Resolve[iCoreWebView2CreateCoreWebView2EnvironmentCompletedHandler](this).EnvironmentCompleted(errorCode, env)
|
||||
return uintptr(res)
|
||||
}
|
||||
276
vendor/github.com/wailsapp/go-webview2/webviewloader/env_create_options.go
generated
vendored
Normal file
276
vendor/github.com/wailsapp/go-webview2/webviewloader/env_create_options.go
generated
vendored
Normal file
@@ -0,0 +1,276 @@
|
||||
//go:build windows && !native_webview2loader
|
||||
|
||||
package webviewloader
|
||||
|
||||
import (
|
||||
"unicode/utf16"
|
||||
"unsafe"
|
||||
|
||||
"github.com/wailsapp/go-webview2/pkg/combridge"
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
// WithBrowserExecutableFolder to specify whether WebView2 controls use a fixed or installed version
|
||||
// of the WebView2 Runtime that exists on a user machine.
|
||||
//
|
||||
// To use a fixed version of the WebView2 Runtime,
|
||||
// pass the folder path that contains the fixed version of the WebView2 Runtime.
|
||||
// BrowserExecutableFolder supports both relative (to the application's executable) and absolute files paths.
|
||||
// To create WebView2 controls that use the installed version of the WebView2 Runtime that exists on user
|
||||
// machines, pass a empty string to WithBrowserExecutableFolder. In this scenario, the API tries to find a
|
||||
// compatible version of the WebView2 Runtime that is installed on the user machine (first at the machine level,
|
||||
// and then per user) using the selected channel preference. The path of fixed version of the WebView2 Runtime
|
||||
// should not contain \Edge\Application\. When such a path is used, the API fails with HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED).
|
||||
func WithBrowserExecutableFolder(folder string) option {
|
||||
return func(wvep *environmentOptions) {
|
||||
wvep.browserExecutableFolder = folder
|
||||
}
|
||||
}
|
||||
|
||||
// WithUserDataFolder specifies to user data folder location for WebView2
|
||||
//
|
||||
// You may specify the userDataFolder to change the default user data folder location for WebView2.
|
||||
// The path is either an absolute file path or a relative file path that is interpreted as relative
|
||||
// to the compiled code for the current process.
|
||||
// Dhe default user data ({Executable File Name}.WebView2) folder is created in the same directory
|
||||
// next to the compiled code for the app. WebView2 creation fails if the compiled code is running
|
||||
// in a directory in which the process does not have permission to create a new directory.
|
||||
// The app is responsible to clean up the associated user data folder when it is done.
|
||||
func WithUserDataFolder(folder string) option {
|
||||
return func(wvep *environmentOptions) {
|
||||
wvep.userDataFolder = folder
|
||||
}
|
||||
}
|
||||
|
||||
// WithAdditionalBrowserArguments changes the behavior of the WebView.
|
||||
//
|
||||
// The arguments are passed to the
|
||||
// browser process as part of the command. For more information about
|
||||
// using command-line switches with Chromium browser processes, navigate to
|
||||
// [Run Chromium with Flags][ChromiumDevelopersHowTosRunWithFlags].
|
||||
// The value appended to a switch is appended to the browser process, for
|
||||
// example, in `--edge-webview-switches=xxx` the value is `xxx`. If you
|
||||
// specify a switch that is important to WebView functionality, it is
|
||||
// ignored, for example, `--user-data-dir`. Specific features are disabled
|
||||
// internally and blocked from being enabled. If a switch is specified
|
||||
// multiple times, only the last instance is used.
|
||||
//
|
||||
// \> [!NOTE]\n\> A merge of the different values of the same switch is not attempted,
|
||||
// except for disabled and enabled features. The features specified by
|
||||
// `--enable-features` and `--disable-features` are merged with simple
|
||||
// logic.\n\> * The features is the union of the specified features
|
||||
// and built-in features. If a feature is disabled, it is removed from the
|
||||
// enabled features list.
|
||||
//
|
||||
// If you specify command-line switches and use the
|
||||
// `additionalBrowserArguments` parameter, the `--edge-webview-switches`
|
||||
// value takes precedence and is processed last. If a switch fails to
|
||||
// parse, the switch is ignored. The default state for the operation is
|
||||
// to run the browser process with no extra flags.
|
||||
//
|
||||
// [ChromiumDevelopersHowTosRunWithFlags]: https://www.chromium.org/developers/how-tos/run-chromium-with-flags "Run Chromium with flags | The Chromium Projects"
|
||||
func WithAdditionalBrowserArguments(args string) option {
|
||||
return func(wvep *environmentOptions) {
|
||||
wvep.additionalBrowserArguments = args
|
||||
}
|
||||
}
|
||||
|
||||
// WithLanguage sets the default display language for WebView.
|
||||
//
|
||||
// It applies to browser UI such as
|
||||
// context menu and dialogs. It also applies to the `accept-languages` HTTP
|
||||
// header that WebView sends to websites. It is in the format of
|
||||
//
|
||||
// `language[-country]` where `language` is the 2-letter code from
|
||||
// [ISO 639][ISO639LanguageCodesHtml]
|
||||
// and `country` is the
|
||||
// 2-letter code from
|
||||
// [ISO 3166][ISOStandard72482Html].
|
||||
//
|
||||
// [ISO639LanguageCodesHtml]: https://www.iso.org/iso-639-language-codes.html "ISO 639 | ISO"
|
||||
// [ISOStandard72482Html]: https://www.iso.org/standard/72482.html "ISO 3166-1:2020 | ISO"
|
||||
func WithLanguage(lang string) option {
|
||||
return func(wvep *environmentOptions) {
|
||||
wvep.language = lang
|
||||
}
|
||||
}
|
||||
|
||||
// WithTargetCompatibleBrowserVersion secifies the version of the WebView2 Runtime binaries required to be
|
||||
// compatible with your app.
|
||||
//
|
||||
// This defaults to the WebView2 Runtime version
|
||||
// that corresponds with the version of the SDK the app is using. The
|
||||
// format of this value is the same as the format of the
|
||||
// `BrowserVersionString` property and other `BrowserVersion` values. Only
|
||||
// the version part of the `BrowserVersion` value is respected. The channel
|
||||
// suffix, if it exists, is ignored. The version of the WebView2 Runtime
|
||||
// binaries actually used may be different from the specified
|
||||
// `TargetCompatibleBrowserVersion`. The binaries are only guaranteed to be
|
||||
// compatible. Verify the actual version on the `BrowserVersionString`
|
||||
// property on the `ICoreWebView2Environment`.
|
||||
func WithTargetCompatibleBrowserVersion(version string) option {
|
||||
return func(wvep *environmentOptions) {
|
||||
wvep.targetCompatibleBrowserVersion = version
|
||||
}
|
||||
}
|
||||
|
||||
// WithAllowSingleSignOnUsingOSPrimaryAccount is used to enable
|
||||
// single sign on with Azure Active Directory (AAD) and personal Microsoft
|
||||
// Account (MSA) resources inside WebView. All AAD accounts, connected to
|
||||
// Windows and shared for all apps, are supported. For MSA, SSO is only enabled
|
||||
// for the account associated for Windows account login, if any.
|
||||
// Default is disabled. Universal Windows Platform apps must also declare
|
||||
// `enterpriseCloudSSO`
|
||||
// [Restricted capabilities][WindowsUwpPackagingAppCapabilityDeclarationsRestrictedCapabilities]
|
||||
// for the single sign on (SSO) to work.
|
||||
//
|
||||
// [WindowsUwpPackagingAppCapabilityDeclarationsRestrictedCapabilities]: /windows/uwp/packaging/app-capability-declarations\#restricted-capabilities "Restricted capabilities - App capability declarations | Microsoft Docs"
|
||||
func WithAllowSingleSignOnUsingOSPrimaryAccount(allow bool) option {
|
||||
return func(wvep *environmentOptions) {
|
||||
wvep.allowSingleSignOnUsingOSPrimaryAccount = allow
|
||||
}
|
||||
}
|
||||
|
||||
// WithExclusiveUserDataFolderAccess specifies that the WebView environment
|
||||
// obtains exclusive access to the user data folder.
|
||||
//
|
||||
// If the user data folder is already being used by another WebView environment with a
|
||||
// different value for `ExclusiveUserDataFolderAccess` property, the creation of a WebView2Controller
|
||||
// using the environment object will fail with `HRESULT_FROM_WIN32(ERROR_INVALID_STATE)`.
|
||||
// When set as TRUE, no other WebView can be created from other processes using WebView2Environment
|
||||
// objects with the same UserDataFolder. This prevents other processes from creating WebViews
|
||||
// which share the same browser process instance, since sharing is performed among
|
||||
// WebViews that have the same UserDataFolder. When another process tries to create a
|
||||
// WebView2Controller from an WebView2Environment object created with the same user data folder,
|
||||
// it will fail with `HRESULT_FROM_WIN32(ERROR_INVALID_STATE)`.
|
||||
func WithExclusiveUserDataFolderAccess(exclusive bool) option {
|
||||
return func(wvep *environmentOptions) {
|
||||
wvep.exclusiveUserDataFolderAccess = exclusive
|
||||
}
|
||||
}
|
||||
|
||||
type option func(*environmentOptions)
|
||||
|
||||
var _ iCoreWebView2EnvironmentOptions = &environmentOptions{}
|
||||
var _ iCoreWebView2EnvironmentOptions2 = &environmentOptions{}
|
||||
|
||||
type environmentOptions struct {
|
||||
browserExecutableFolder string
|
||||
userDataFolder string
|
||||
preferCanary bool
|
||||
|
||||
additionalBrowserArguments string
|
||||
language string
|
||||
targetCompatibleBrowserVersion string
|
||||
allowSingleSignOnUsingOSPrimaryAccount bool
|
||||
exclusiveUserDataFolderAccess bool
|
||||
}
|
||||
|
||||
func (o *environmentOptions) AdditionalBrowserArguments() string {
|
||||
return o.additionalBrowserArguments
|
||||
}
|
||||
|
||||
func (o *environmentOptions) Language() string {
|
||||
return o.language
|
||||
}
|
||||
|
||||
func (o *environmentOptions) TargetCompatibleBrowserVersion() string {
|
||||
v := o.targetCompatibleBrowserVersion
|
||||
if v == "" {
|
||||
v = kMinimumCompatibleVersion
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (o *environmentOptions) AllowSingleSignOnUsingOSPrimaryAccount() bool {
|
||||
return o.allowSingleSignOnUsingOSPrimaryAccount
|
||||
}
|
||||
|
||||
func (o *environmentOptions) ExclusiveUserDataFolderAccess() bool {
|
||||
return o.exclusiveUserDataFolderAccess
|
||||
}
|
||||
|
||||
type iCoreWebView2EnvironmentOptions interface {
|
||||
combridge.IUnknown
|
||||
|
||||
AdditionalBrowserArguments() string
|
||||
Language() string
|
||||
TargetCompatibleBrowserVersion() string
|
||||
AllowSingleSignOnUsingOSPrimaryAccount() bool
|
||||
}
|
||||
|
||||
type iCoreWebView2EnvironmentOptions2 interface {
|
||||
combridge.IUnknown
|
||||
|
||||
ExclusiveUserDataFolderAccess() bool
|
||||
}
|
||||
|
||||
func init() {
|
||||
combridge.RegisterVTable[combridge.IUnknown, iCoreWebView2EnvironmentOptions](
|
||||
"{2fde08a8-1e9a-4766-8c05-95a9ceb9d1c5}",
|
||||
_iCoreWebView2EnvironmentOptionsAdditionalBrowserArguments,
|
||||
_iCoreWebView2EnvironmentOptionsNOP,
|
||||
_iCoreWebView2EnvironmentOptionsLanguage,
|
||||
_iCoreWebView2EnvironmentOptionsNOP,
|
||||
_iCoreWebView2EnvironmentTargetCompatibleBrowserVersion,
|
||||
_iCoreWebView2EnvironmentOptionsNOP,
|
||||
_iCoreWebView2EnvironmentOptionsAllowSingleSignOnUsingOSPrimaryAccount,
|
||||
_iCoreWebView2EnvironmentOptionsNOP,
|
||||
)
|
||||
|
||||
combridge.RegisterVTable[combridge.IUnknown, iCoreWebView2EnvironmentOptions2](
|
||||
"{ff85c98a-1ba7-4a6b-90c8-2b752c89e9e2}",
|
||||
_iCoreWebView2EnvironmentOptions2ExclusiveUserDataFolderAccess,
|
||||
_iCoreWebView2EnvironmentOptionsNOP,
|
||||
)
|
||||
}
|
||||
func _iCoreWebView2EnvironmentOptionsNOP(this uintptr) uintptr {
|
||||
return uintptr(windows.S_FALSE)
|
||||
}
|
||||
|
||||
func _iCoreWebView2EnvironmentOptionsAdditionalBrowserArguments(this uintptr, value **uint16) uintptr {
|
||||
v := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).AdditionalBrowserArguments()
|
||||
*value = stringToOleString(v)
|
||||
return uintptr(windows.S_OK)
|
||||
}
|
||||
|
||||
func _iCoreWebView2EnvironmentOptionsLanguage(this uintptr, value **uint16) uintptr {
|
||||
args := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).Language()
|
||||
*value = stringToOleString(args)
|
||||
return uintptr(windows.S_OK)
|
||||
}
|
||||
|
||||
func _iCoreWebView2EnvironmentTargetCompatibleBrowserVersion(this uintptr, value **uint16) uintptr {
|
||||
args := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).TargetCompatibleBrowserVersion()
|
||||
*value = stringToOleString(args)
|
||||
return uintptr(windows.S_OK)
|
||||
}
|
||||
|
||||
func _iCoreWebView2EnvironmentOptionsAllowSingleSignOnUsingOSPrimaryAccount(this uintptr, value *int32) uintptr {
|
||||
v := combridge.Resolve[iCoreWebView2EnvironmentOptions](this).AllowSingleSignOnUsingOSPrimaryAccount()
|
||||
*value = boolToInt(v)
|
||||
return uintptr(windows.S_OK)
|
||||
}
|
||||
|
||||
func _iCoreWebView2EnvironmentOptions2ExclusiveUserDataFolderAccess(this uintptr, value *int32) uintptr {
|
||||
v := combridge.Resolve[iCoreWebView2EnvironmentOptions2](this).ExclusiveUserDataFolderAccess()
|
||||
*value = boolToInt(v)
|
||||
return uintptr(windows.S_OK)
|
||||
}
|
||||
|
||||
func stringToOleString(v string) *uint16 {
|
||||
wstr := utf16.Encode([]rune(v + "\x00"))
|
||||
lwstr := len(wstr)
|
||||
ptr := (*uint16)(coTaskMemAlloc(2 * lwstr))
|
||||
|
||||
copy(unsafe.Slice(ptr, lwstr), wstr)
|
||||
|
||||
return ptr
|
||||
}
|
||||
|
||||
func boolToInt(v bool) int32 {
|
||||
if v {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
74
vendor/github.com/wailsapp/go-webview2/webviewloader/find_dll.go
generated
vendored
Normal file
74
vendor/github.com/wailsapp/go-webview2/webviewloader/find_dll.go
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
//go:build windows
|
||||
|
||||
package webviewloader
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
|
||||
"golang.org/x/sys/windows/registry"
|
||||
)
|
||||
|
||||
var (
|
||||
errNoClientDLLFound = errors.New("no webview2 found")
|
||||
)
|
||||
|
||||
func findEmbeddedBrowserVersion(filename string) (string, error) {
|
||||
block, err := getFileVersionInfo(filename)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
info, err := verQueryValueString(block, "\\StringFileInfo\\040904B0\\ProductVersion")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return info, nil
|
||||
}
|
||||
|
||||
func findEmbeddedClientDll(embeddedEdgeSubFolder string) (outClientPath string, err error) {
|
||||
if !filepath.IsAbs(embeddedEdgeSubFolder) {
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
embeddedEdgeSubFolder = filepath.Join(filepath.Dir(exe), embeddedEdgeSubFolder)
|
||||
}
|
||||
|
||||
return findClientDllInFolder(embeddedEdgeSubFolder)
|
||||
}
|
||||
|
||||
func findClientDllInFolder(folder string) (string, error) {
|
||||
arch := ""
|
||||
switch runtime.GOARCH {
|
||||
case "arm64":
|
||||
arch = "arm64"
|
||||
case "amd64":
|
||||
arch = "x64"
|
||||
case "386":
|
||||
arch = "x86"
|
||||
default:
|
||||
return "", fmt.Errorf("Unsupported architecture")
|
||||
}
|
||||
|
||||
dllPath := filepath.Join(folder, "EBWebView", arch, "EmbeddedBrowserWebView.dll")
|
||||
if _, err := os.Stat(dllPath); err != nil {
|
||||
return "", mapFindErr(err)
|
||||
}
|
||||
return dllPath, nil
|
||||
}
|
||||
|
||||
func mapFindErr(err error) error {
|
||||
if errors.Is(err, registry.ErrNotExist) {
|
||||
return errNoClientDLLFound
|
||||
}
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
return errNoClientDLLFound
|
||||
}
|
||||
return err
|
||||
}
|
||||
94
vendor/github.com/wailsapp/go-webview2/webviewloader/find_dll_installed.go
generated
vendored
Normal file
94
vendor/github.com/wailsapp/go-webview2/webviewloader/find_dll_installed.go
generated
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
//go:build windows && !native_webview2loader
|
||||
|
||||
package webviewloader
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
|
||||
"golang.org/x/sys/windows/registry"
|
||||
)
|
||||
|
||||
const (
|
||||
kNumChannels = 4
|
||||
kInstallKeyPath = "Software\\Microsoft\\EdgeUpdate\\ClientState\\"
|
||||
kMinimumCompatibleVersion = "86.0.616.0"
|
||||
)
|
||||
|
||||
var (
|
||||
kChannelName = [kNumChannels]string{
|
||||
"", "beta", "dev", "canary", // "internal"
|
||||
}
|
||||
|
||||
kChannelUuid = [kNumChannels]string{
|
||||
"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}",
|
||||
"{2CD8A007-E189-409D-A2C8-9AF4EF3C72AA}",
|
||||
"{0D50BFEC-CD6A-4F9A-964C-C7416E3ACB10}",
|
||||
"{65C35B14-6C1D-4122-AC46-7148CC9D6497}",
|
||||
//"{BE59E8FD-089A-411B-A3B0-051D9E417818}",
|
||||
}
|
||||
|
||||
minimumCompatibleVersion, _ = parseVersion(kMinimumCompatibleVersion)
|
||||
)
|
||||
|
||||
func findInstalledClientDll(preferCanary bool) (clientPath string, version *version, err error) {
|
||||
for i := 0; i < kNumChannels; i++ {
|
||||
channel := i
|
||||
if preferCanary {
|
||||
channel = (kNumChannels - 1) - i
|
||||
}
|
||||
|
||||
key := kInstallKeyPath + kChannelUuid[channel]
|
||||
for _, checkSystem := range []bool{true, false} {
|
||||
clientPath, version, err := findInstalledClientDllForChannel(key, checkSystem)
|
||||
if err == errNoClientDLLFound {
|
||||
continue
|
||||
}
|
||||
if err != nil {
|
||||
return "", nil, err
|
||||
}
|
||||
|
||||
version.channel = kChannelName[channel]
|
||||
return clientPath, version, nil
|
||||
}
|
||||
}
|
||||
return "", nil, errNoClientDLLFound
|
||||
}
|
||||
|
||||
func findInstalledClientDllForChannel(subKey string, system bool) (clientPath string, clientVersion *version, err error) {
|
||||
key := registry.LOCAL_MACHINE
|
||||
if !system {
|
||||
key = registry.CURRENT_USER
|
||||
}
|
||||
|
||||
regKey, err := registry.OpenKey(key, subKey, registry.READ|registry.WOW64_32KEY)
|
||||
if err != nil {
|
||||
return "", nil, mapFindErr(err)
|
||||
}
|
||||
defer regKey.Close()
|
||||
|
||||
embeddedEdgeSubFolder, _, err := regKey.GetStringValue("EBWebView")
|
||||
if err != nil {
|
||||
return "", nil, mapFindErr(err)
|
||||
}
|
||||
|
||||
if embeddedEdgeSubFolder == "" {
|
||||
return "", nil, errNoClientDLLFound
|
||||
}
|
||||
|
||||
versionString := filepath.Base(embeddedEdgeSubFolder)
|
||||
version, err := parseVersion(versionString)
|
||||
if err != nil {
|
||||
return "", nil, errNoClientDLLFound
|
||||
}
|
||||
|
||||
if version.compare(minimumCompatibleVersion) < 0 {
|
||||
return "", nil, errNoClientDLLFound
|
||||
}
|
||||
|
||||
dllPath, err := findEmbeddedClientDll(embeddedEdgeSubFolder)
|
||||
if err != nil {
|
||||
return "", nil, mapFindErr(err)
|
||||
}
|
||||
|
||||
return dllPath, &version, nil
|
||||
}
|
||||
173
vendor/github.com/wailsapp/go-webview2/webviewloader/native_module.go
generated
vendored
Normal file
173
vendor/github.com/wailsapp/go-webview2/webviewloader/native_module.go
generated
vendored
Normal file
@@ -0,0 +1,173 @@
|
||||
//go:build windows && native_webview2loader
|
||||
|
||||
package webviewloader
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
"unsafe"
|
||||
|
||||
"github.com/jchv/go-winloader"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
func init() {
|
||||
preventEnvAndRegistryOverrides(nil, nil, "")
|
||||
}
|
||||
|
||||
var (
|
||||
memOnce sync.Once
|
||||
memModule winloader.Module
|
||||
memCreate winloader.Proc
|
||||
memCompareBrowserVersions winloader.Proc
|
||||
memGetAvailableCoreWebView2BrowserVersionString winloader.Proc
|
||||
memErr error
|
||||
)
|
||||
|
||||
const (
|
||||
// https://referencesource.microsoft.com/#system.web/Util/hresults.cs,20
|
||||
E_FILENOTFOUND = 0x80070002
|
||||
)
|
||||
|
||||
// CompareBrowserVersions will compare the 2 given versions and return:
|
||||
//
|
||||
// Less than zero: v1 < v2
|
||||
// zero: v1 == v2
|
||||
// Greater than zero: v1 > v2
|
||||
func CompareBrowserVersions(v1 string, v2 string) (int, error) {
|
||||
_v1, err := windows.UTF16PtrFromString(v1)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
_v2, err := windows.UTF16PtrFromString(v2)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
err = loadFromMemory()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
var result int32
|
||||
_, _, err = memCompareBrowserVersions.Call(
|
||||
uint64(uintptr(unsafe.Pointer(_v1))),
|
||||
uint64(uintptr(unsafe.Pointer(_v2))),
|
||||
uint64(uintptr(unsafe.Pointer(&result))))
|
||||
|
||||
if err != windows.ERROR_SUCCESS {
|
||||
return 0, err
|
||||
}
|
||||
return int(result), nil
|
||||
}
|
||||
|
||||
// GetAvailableCoreWebView2BrowserVersionString returns version of the webview2 runtime.
|
||||
// If path is empty, it will try to find installed webview2 is the system.
|
||||
// If there is no version installed, a blank string is returned.
|
||||
func GetAvailableCoreWebView2BrowserVersionString(path string) (string, error) {
|
||||
if path != "" {
|
||||
// The default implementation fails if CGO and a fixed browser path is used. It's caused by the go-winloader
|
||||
// which loads the native DLL from memory.
|
||||
// Use the new GoWebView2Loader in this case, in the future we will make GoWebView2Loader
|
||||
// feature-complete and remove the use of the native DLL and go-winloader.
|
||||
version, err := goGetAvailableCoreWebView2BrowserVersionString(path)
|
||||
if errors.Is(err, errNoClientDLLFound) {
|
||||
// WebView2 is not found
|
||||
return "", nil
|
||||
} else if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return version, nil
|
||||
}
|
||||
|
||||
err := loadFromMemory()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var browserPath *uint16 = nil
|
||||
if path != "" {
|
||||
browserPath, err = windows.UTF16PtrFromString(path)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("error calling UTF16PtrFromString for %s: %v", path, err)
|
||||
}
|
||||
}
|
||||
|
||||
preventEnvAndRegistryOverrides(browserPath, nil, "")
|
||||
var result *uint16
|
||||
res, _, err := memGetAvailableCoreWebView2BrowserVersionString.Call(
|
||||
uint64(uintptr(unsafe.Pointer(browserPath))),
|
||||
uint64(uintptr(unsafe.Pointer(&result))))
|
||||
|
||||
if res != 0 {
|
||||
if res == E_FILENOTFOUND {
|
||||
// WebView2 is not installed
|
||||
return "", nil
|
||||
}
|
||||
|
||||
return "", fmt.Errorf("Unable to call GetAvailableCoreWebView2BrowserVersionString (%x): %w", res, err)
|
||||
}
|
||||
|
||||
version := windows.UTF16PtrToString(result)
|
||||
windows.CoTaskMemFree(unsafe.Pointer(result))
|
||||
return version, nil
|
||||
}
|
||||
|
||||
// CreateCoreWebView2EnvironmentWithOptions tries to load WebviewLoader2 and
|
||||
// call the CreateCoreWebView2EnvironmentWithOptions routine.
|
||||
func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder *uint16, environmentCompletedHandle uintptr, additionalBrowserArgs string) (uintptr, error) {
|
||||
err := loadFromMemory()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
preventEnvAndRegistryOverrides(browserExecutableFolder, userDataFolder, additionalBrowserArgs)
|
||||
res, _, _ := memCreate.Call(
|
||||
uint64(uintptr(unsafe.Pointer(browserExecutableFolder))),
|
||||
uint64(uintptr(unsafe.Pointer(userDataFolder))),
|
||||
0,
|
||||
uint64(environmentCompletedHandle),
|
||||
)
|
||||
return uintptr(res), nil
|
||||
}
|
||||
|
||||
func loadFromMemory() error {
|
||||
var err error
|
||||
// DLL is not available natively. Try loading embedded copy.
|
||||
memOnce.Do(func() {
|
||||
memModule, memErr = winloader.LoadFromMemory(WebView2Loader)
|
||||
if memErr != nil {
|
||||
err = fmt.Errorf("Unable to load WebView2Loader.dll from memory: %w", memErr)
|
||||
return
|
||||
}
|
||||
memCreate = memModule.Proc("CreateCoreWebView2EnvironmentWithOptions")
|
||||
memCompareBrowserVersions = memModule.Proc("CompareBrowserVersions")
|
||||
memGetAvailableCoreWebView2BrowserVersionString = memModule.Proc("GetAvailableCoreWebView2BrowserVersionString")
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
func preventEnvAndRegistryOverrides(browserFolder, userDataFolder *uint16, additionalBrowserArgs string) {
|
||||
// Setting these env variables to empty string also prevents registry overrides because webview2loader
|
||||
// checks for existence and not for empty value
|
||||
os.Setenv("WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER", "")
|
||||
|
||||
// Set these overrides to the values or empty to prevent registry and external env overrides
|
||||
os.Setenv("WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS", additionalBrowserArgs)
|
||||
os.Setenv("WEBVIEW2_RELEASE_CHANNEL_PREFERENCE", "0")
|
||||
os.Setenv("WEBVIEW2_BROWSER_EXECUTABLE_FOLDER", windows.UTF16PtrToString(browserFolder))
|
||||
os.Setenv("WEBVIEW2_USER_DATA_FOLDER", windows.UTF16PtrToString(userDataFolder))
|
||||
}
|
||||
|
||||
func goGetAvailableCoreWebView2BrowserVersionString(browserExecutableFolder string) (string, error) {
|
||||
clientPath, err := findEmbeddedClientDll(browserExecutableFolder)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return findEmbeddedBrowserVersion(clientPath)
|
||||
}
|
||||
8
vendor/github.com/wailsapp/go-webview2/webviewloader/native_module_386.go
generated
vendored
Normal file
8
vendor/github.com/wailsapp/go-webview2/webviewloader/native_module_386.go
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
//go:build windows && native_webview2loader
|
||||
|
||||
package webviewloader
|
||||
|
||||
import _ "embed"
|
||||
|
||||
//go:embed x86/WebView2Loader.dll
|
||||
var WebView2Loader []byte
|
||||
8
vendor/github.com/wailsapp/go-webview2/webviewloader/native_module_amd64.go
generated
vendored
Normal file
8
vendor/github.com/wailsapp/go-webview2/webviewloader/native_module_amd64.go
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
//go:build windows && native_webview2loader
|
||||
|
||||
package webviewloader
|
||||
|
||||
import _ "embed"
|
||||
|
||||
//go:embed x64/WebView2Loader.dll
|
||||
var WebView2Loader []byte
|
||||
8
vendor/github.com/wailsapp/go-webview2/webviewloader/native_module_arm64.go
generated
vendored
Normal file
8
vendor/github.com/wailsapp/go-webview2/webviewloader/native_module_arm64.go
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
//go:build windows && native_webview2loader
|
||||
|
||||
package webviewloader
|
||||
|
||||
import _ "embed"
|
||||
|
||||
//go:embed arm64/WebView2Loader.dll
|
||||
var WebView2Loader []byte
|
||||
143
vendor/github.com/wailsapp/go-webview2/webviewloader/syscall.go
generated
vendored
Normal file
143
vendor/github.com/wailsapp/go-webview2/webviewloader/syscall.go
generated
vendored
Normal file
@@ -0,0 +1,143 @@
|
||||
//go:build windows
|
||||
|
||||
package webviewloader
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"syscall"
|
||||
"unicode/utf16"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
var (
|
||||
modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
|
||||
procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
|
||||
procGlobalFree = modkernel32.NewProc("GlobalFree")
|
||||
|
||||
modversion = windows.NewLazySystemDLL("version.dll")
|
||||
procGetFileVersionInfoSize = modversion.NewProc("GetFileVersionInfoSizeW")
|
||||
procGetFileVersionInfo = modversion.NewProc("GetFileVersionInfoW")
|
||||
procVerQueryValue = modversion.NewProc("VerQueryValueW")
|
||||
|
||||
modole32 = windows.NewLazySystemDLL("ole32.dll")
|
||||
procCoTaskMemAlloc = modole32.NewProc("CoTaskMemAlloc")
|
||||
)
|
||||
|
||||
func getFileVersionInfo(path string) ([]byte, error) {
|
||||
lptstrFilename, err := syscall.UTF16PtrFromString(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
size, _, err := procGetFileVersionInfoSize.Call(
|
||||
uintptr(unsafe.Pointer(lptstrFilename)),
|
||||
0,
|
||||
)
|
||||
|
||||
err = maskErrorSuccess(err)
|
||||
if size == 0 && err == nil {
|
||||
err = fmt.Errorf("GetFileVersionInfoSize failed")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
data := make([]byte, size)
|
||||
ret, _, err := procGetFileVersionInfo.Call(
|
||||
uintptr(unsafe.Pointer(lptstrFilename)),
|
||||
0,
|
||||
uintptr(size),
|
||||
uintptr(unsafe.Pointer(&data[0])),
|
||||
)
|
||||
|
||||
err = maskErrorSuccess(err)
|
||||
if ret == 0 && err == nil {
|
||||
err = fmt.Errorf("GetFileVersionInfo failed")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
|
||||
func verQueryValueString(block []byte, subBlock string) (string, error) {
|
||||
// Allocate memory from native side to make sure the block doesn't get moved
|
||||
// because we get a pointer into that memory block from the native verQueryValue
|
||||
// call back.
|
||||
pBlock := globalAlloc(0, uint32(len(block)))
|
||||
defer globalFree(unsafe.Pointer(pBlock))
|
||||
|
||||
// Copy the memory region into native side memory
|
||||
copy(unsafe.Slice((*byte)(pBlock), len(block)), block)
|
||||
|
||||
lpSubBlock, err := syscall.UTF16PtrFromString(subBlock)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var lplpBuffer unsafe.Pointer
|
||||
var puLen uint
|
||||
ret, _, err := procVerQueryValue.Call(
|
||||
uintptr(pBlock),
|
||||
uintptr(unsafe.Pointer(lpSubBlock)),
|
||||
uintptr(unsafe.Pointer(&lplpBuffer)),
|
||||
uintptr(unsafe.Pointer(&puLen)),
|
||||
)
|
||||
|
||||
err = maskErrorSuccess(err)
|
||||
if ret == 0 && err == nil {
|
||||
err = fmt.Errorf("VerQueryValue failed")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if puLen <= 1 {
|
||||
return "", nil
|
||||
}
|
||||
puLen -= 1 // Remove Null-Terminator
|
||||
|
||||
wchar := unsafe.Slice((*uint16)(lplpBuffer), puLen)
|
||||
return string(utf16.Decode(wchar)), nil
|
||||
}
|
||||
|
||||
func globalAlloc(uFlags uint, dwBytes uint32) unsafe.Pointer {
|
||||
ret, _, _ := procGlobalAlloc.Call(
|
||||
uintptr(uFlags),
|
||||
uintptr(dwBytes))
|
||||
|
||||
if ret == 0 {
|
||||
panic("globalAlloc failed")
|
||||
}
|
||||
|
||||
return unsafe.Pointer(ret)
|
||||
}
|
||||
|
||||
func globalFree(data unsafe.Pointer) {
|
||||
ret, _, _ := procGlobalFree.Call(uintptr(data))
|
||||
if ret != 0 {
|
||||
panic("globalFree failed")
|
||||
}
|
||||
}
|
||||
|
||||
func maskErrorSuccess(err error) error {
|
||||
if err == windows.ERROR_SUCCESS {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func coTaskMemAlloc(size int) unsafe.Pointer {
|
||||
ret, _, _ := procCoTaskMemAlloc.Call(
|
||||
uintptr(size))
|
||||
|
||||
if ret == 0 {
|
||||
panic("coTaskMemAlloc failed")
|
||||
}
|
||||
return unsafe.Pointer(ret)
|
||||
}
|
||||
150
vendor/github.com/wailsapp/go-webview2/webviewloader/version.go
generated
vendored
Normal file
150
vendor/github.com/wailsapp/go-webview2/webviewloader/version.go
generated
vendored
Normal file
@@ -0,0 +1,150 @@
|
||||
//go:build windows && !native_webview2loader
|
||||
|
||||
package webviewloader
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// UsingGoWebview2Loader is set to true when the go webview2loader is used.
|
||||
var UsingGoWebview2Loader bool
|
||||
|
||||
// CompareBrowserVersions will compare the 2 given versions and return:
|
||||
//
|
||||
// -1 = v1 < v2
|
||||
// 0 = v1 == v2
|
||||
// 1 = v1 > v2
|
||||
func CompareBrowserVersions(v1 string, v2 string) (int, error) {
|
||||
v, err := parseVersion(v1)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("v1 invalid: %w", err)
|
||||
}
|
||||
|
||||
w, err := parseVersion(v2)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("v2 invalid: %w", err)
|
||||
}
|
||||
|
||||
return v.compare(w), nil
|
||||
}
|
||||
|
||||
// GetAvailableCoreWebView2BrowserVersionString get the browser version info including channel name
|
||||
// if it is the WebView2 Runtime.
|
||||
// Channel names are Beta, Dev, and Canary.
|
||||
func GetAvailableCoreWebView2BrowserVersionString(browserExecutableFolder string) (string, error) {
|
||||
if browserExecutableFolder != "" {
|
||||
clientPath, err := findEmbeddedClientDll(browserExecutableFolder)
|
||||
if errors.Is(err, errNoClientDLLFound) {
|
||||
// WebView2 is not found
|
||||
return "", nil
|
||||
} else if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return findEmbeddedBrowserVersion(clientPath)
|
||||
}
|
||||
|
||||
_, version, err := findInstalledClientDll(false)
|
||||
if errors.Is(err, errNoClientDLLFound) {
|
||||
return "", nil
|
||||
} else if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return version.String(), nil
|
||||
}
|
||||
|
||||
type version struct {
|
||||
major int
|
||||
minor int
|
||||
patch int
|
||||
build int
|
||||
|
||||
channel string
|
||||
}
|
||||
|
||||
func (v version) String() string {
|
||||
vv := fmt.Sprintf("%d.%d.%d.%d", v.major, v.minor, v.patch, v.build)
|
||||
if v.channel != "" {
|
||||
vv += " " + v.channel
|
||||
}
|
||||
|
||||
return vv
|
||||
}
|
||||
|
||||
func (v version) compare(o version) int {
|
||||
if c := compareInt(v.major, o.major); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := compareInt(v.minor, o.minor); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := compareInt(v.patch, o.patch); c != 0 {
|
||||
return c
|
||||
}
|
||||
return compareInt(v.build, o.build)
|
||||
}
|
||||
|
||||
func parseVersion(v string) (version, error) {
|
||||
var p version
|
||||
|
||||
// Split away channel information...
|
||||
if i := strings.Index(v, " "); i > 0 {
|
||||
p.channel = v[i+1:]
|
||||
v = v[:i]
|
||||
}
|
||||
|
||||
vv := strings.Split(v, ".")
|
||||
if len(vv) > 4 {
|
||||
return p, fmt.Errorf("too many version parts")
|
||||
}
|
||||
|
||||
var err error
|
||||
vv, p.major, err = parseInt(vv)
|
||||
if err != nil {
|
||||
return p, fmt.Errorf("bad major version: %w", err)
|
||||
}
|
||||
|
||||
vv, p.minor, err = parseInt(vv)
|
||||
if err != nil {
|
||||
return p, fmt.Errorf("bad minor version: %w", err)
|
||||
}
|
||||
|
||||
vv, p.patch, err = parseInt(vv)
|
||||
if err != nil {
|
||||
return p, fmt.Errorf("bad patch version: %w", err)
|
||||
}
|
||||
|
||||
_, p.build, err = parseInt(vv)
|
||||
if err != nil {
|
||||
return p, fmt.Errorf("bad build version: %w", err)
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func parseInt(v []string) ([]string, int, error) {
|
||||
if len(v) == 0 {
|
||||
return nil, 0, nil
|
||||
}
|
||||
|
||||
p, err := strconv.ParseInt(v[0], 10, 32)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
return v[1:], int(p), nil
|
||||
}
|
||||
|
||||
func compareInt(v1, v2 int) int {
|
||||
if v1 == v2 {
|
||||
return 0
|
||||
}
|
||||
if v1 < v2 {
|
||||
return -1
|
||||
} else {
|
||||
return +1
|
||||
}
|
||||
}
|
||||
1
vendor/github.com/wailsapp/mimetype/.gitattributes
generated
vendored
Normal file
1
vendor/github.com/wailsapp/mimetype/.gitattributes
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
testdata/* linguist-vendored
|
||||
76
vendor/github.com/wailsapp/mimetype/CODE_OF_CONDUCT.md
generated
vendored
Normal file
76
vendor/github.com/wailsapp/mimetype/CODE_OF_CONDUCT.md
generated
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||
level of experience, education, socio-economic status, nationality, personal
|
||||
appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at vasile.gabriel@email.com. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see
|
||||
https://www.contributor-covenant.org/faq
|
||||
12
vendor/github.com/wailsapp/mimetype/CONTRIBUTING.md
generated
vendored
Normal file
12
vendor/github.com/wailsapp/mimetype/CONTRIBUTING.md
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
## Contribute
|
||||
Contributions to **mimetype** are welcome. If you find an issue and you consider
|
||||
contributing, you can use the [Github issues tracker](https://github.com/wailsapp/mimetype/issues)
|
||||
in order to report it, or better yet, open a pull request.
|
||||
|
||||
Code contributions must respect these rules:
|
||||
- code must be test covered
|
||||
- code must be formatted using gofmt tool
|
||||
- exported names must be documented
|
||||
|
||||
**Important**: By submitting a pull request, you agree to allow the project
|
||||
owner to license your work under the same license as that used by the project.
|
||||
21
vendor/github.com/wailsapp/mimetype/LICENSE
generated
vendored
Normal file
21
vendor/github.com/wailsapp/mimetype/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018-2020 Gabriel Vasile
|
||||
|
||||
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.
|
||||
108
vendor/github.com/wailsapp/mimetype/README.md
generated
vendored
Normal file
108
vendor/github.com/wailsapp/mimetype/README.md
generated
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
<h1 align="center">
|
||||
mimetype
|
||||
</h1>
|
||||
|
||||
<h4 align="center">
|
||||
A package for detecting MIME types and extensions based on magic numbers
|
||||
</h4>
|
||||
<h6 align="center">
|
||||
Goroutine safe, extensible, no C bindings
|
||||
</h6>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://travis-ci.org/gabriel-vasile/mimetype">
|
||||
<img alt="Build Status" src="https://travis-ci.org/gabriel-vasile/mimetype.svg?branch=master">
|
||||
</a>
|
||||
<a href="https://pkg.go.dev/github.com/wailsapp/mimetype">
|
||||
<img src="https://pkg.go.dev/badge/github.com/wailsapp/mimetype.svg" alt="Go Reference">
|
||||
</a>
|
||||
<a href="https://goreportcard.com/report/github.com/wailsapp/mimetype">
|
||||
<img alt="Go report card" src="https://goreportcard.com/badge/github.com/wailsapp/mimetype">
|
||||
</a>
|
||||
<a href="https://coveralls.io/github/gabriel-vasile/mimetype?branch=master">
|
||||
<img alt="Go report card" src="https://coveralls.io/repos/github/gabriel-vasile/mimetype/badge.svg?branch=master">
|
||||
</a>
|
||||
<a href="LICENSE">
|
||||
<img alt="License" src="https://img.shields.io/badge/License-MIT-green.svg">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## Features
|
||||
- fast and precise MIME type and file extension detection
|
||||
- long list of [supported MIME types](supported_mimes.md)
|
||||
- posibility to [extend](https://pkg.go.dev/github.com/wailsapp/mimetype#example-package-Extend) with other file formats
|
||||
- common file formats are prioritized
|
||||
- [text vs. binary files differentiation](https://pkg.go.dev/github.com/wailsapp/mimetype#example-package-TextVsBinary)
|
||||
- safe for concurrent usage
|
||||
|
||||
## Install
|
||||
```bash
|
||||
go get github.com/wailsapp/mimetype
|
||||
```
|
||||
|
||||
## Usage
|
||||
```go
|
||||
mtype := mimetype.Detect([]byte)
|
||||
// OR
|
||||
mtype, err := mimetype.DetectReader(io.Reader)
|
||||
// OR
|
||||
mtype, err := mimetype.DetectFile("/path/to/file")
|
||||
fmt.Println(mtype.String(), mtype.Extension())
|
||||
```
|
||||
See the [runnable Go Playground examples](https://pkg.go.dev/github.com/wailsapp/mimetype#pkg-overview).
|
||||
|
||||
## Usage'
|
||||
Only use libraries like **mimetype** as a last resort. Content type detection
|
||||
using magic numbers is slow, inaccurate, and non-standard. Most of the times
|
||||
protocols have methods for specifying such metadata; e.g., `Content-Type` header
|
||||
in HTTP and SMTP.
|
||||
|
||||
## FAQ
|
||||
Q: My file is in the list of [supported MIME types](supported_mimes.md) but
|
||||
it is not correctly detected. What should I do?
|
||||
|
||||
A: Some file formats (often Microsoft Office documents) keep their signatures
|
||||
towards the end of the file. Try increasing the number of bytes used for detection
|
||||
with:
|
||||
```go
|
||||
mimetype.SetLimit(1024*1024) // Set limit to 1MB.
|
||||
// or
|
||||
mimetype.SetLimit(0) // No limit, whole file content used.
|
||||
mimetype.DetectFile("file.doc")
|
||||
```
|
||||
If increasing the limit does not help, please
|
||||
[open an issue](https://github.com/wailsapp/mimetype/issues/new?assignees=&labels=&template=mismatched-mime-type-detected.md&title=).
|
||||
|
||||
## Structure
|
||||
**mimetype** uses a hierarchical structure to keep the MIME type detection logic.
|
||||
This reduces the number of calls needed for detecting the file type. The reason
|
||||
behind this choice is that there are file formats used as containers for other
|
||||
file formats. For example, Microsoft Office files are just zip archives,
|
||||
containing specific metadata files. Once a file has been identified as a
|
||||
zip, there is no need to check if it is a text file, but it is worth checking if
|
||||
it is an Microsoft Office file.
|
||||
|
||||
To prevent loading entire files into memory, when detecting from a
|
||||
[reader](https://pkg.go.dev/github.com/wailsapp/mimetype#DetectReader)
|
||||
or from a [file](https://pkg.go.dev/github.com/wailsapp/mimetype#DetectFile)
|
||||
**mimetype** limits itself to reading only the header of the input.
|
||||
<div align="center">
|
||||
<img alt="structure" src="https://github.com/wailsapp/mimetype/blob/420a05228c6a6efbb6e6f080168a25663414ff36/mimetype.gif?raw=true" width="88%">
|
||||
</div>
|
||||
|
||||
## Performance
|
||||
Thanks to the hierarchical structure, searching for common formats first,
|
||||
and limiting itself to file headers, **mimetype** matches the performance of
|
||||
stdlib `http.DetectContentType` while outperforming the alternative package.
|
||||
|
||||
```bash
|
||||
mimetype http.DetectContentType filetype
|
||||
BenchmarkMatchTar-24 250 ns/op 400 ns/op 3778 ns/op
|
||||
BenchmarkMatchZip-24 524 ns/op 351 ns/op 4884 ns/op
|
||||
BenchmarkMatchJpeg-24 103 ns/op 228 ns/op 839 ns/op
|
||||
BenchmarkMatchGif-24 139 ns/op 202 ns/op 751 ns/op
|
||||
BenchmarkMatchPng-24 165 ns/op 221 ns/op 1176 ns/op
|
||||
```
|
||||
|
||||
## Contributing
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||
304
vendor/github.com/wailsapp/mimetype/internal/charset/charset.go
generated
vendored
Normal file
304
vendor/github.com/wailsapp/mimetype/internal/charset/charset.go
generated
vendored
Normal file
@@ -0,0 +1,304 @@
|
||||
package charset
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/xml"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"golang.org/x/net/html"
|
||||
)
|
||||
|
||||
const (
|
||||
F = 0 /* character never appears in text */
|
||||
T = 1 /* character appears in plain ASCII text */
|
||||
I = 2 /* character appears in ISO-8859 text */
|
||||
X = 3 /* character appears in non-ISO extended ASCII (Mac, IBM PC) */
|
||||
)
|
||||
|
||||
var (
|
||||
boms = []struct {
|
||||
bom []byte
|
||||
enc string
|
||||
}{
|
||||
{[]byte{0xEF, 0xBB, 0xBF}, "utf-8"},
|
||||
{[]byte{0x00, 0x00, 0xFE, 0xFF}, "utf-32be"},
|
||||
{[]byte{0xFF, 0xFE, 0x00, 0x00}, "utf-32le"},
|
||||
{[]byte{0xFE, 0xFF}, "utf-16be"},
|
||||
{[]byte{0xFF, 0xFE}, "utf-16le"},
|
||||
}
|
||||
|
||||
// https://github.com/file/file/blob/fa93fb9f7d21935f1c7644c47d2975d31f12b812/src/encoding.c#L241
|
||||
textChars = [256]byte{
|
||||
/* BEL BS HT LF VT FF CR */
|
||||
F, F, F, F, F, F, F, T, T, T, T, T, T, T, F, F, /* 0x0X */
|
||||
/* ESC */
|
||||
F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, F, /* 0x1X */
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x2X */
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x3X */
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x4X */
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x5X */
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x6X */
|
||||
T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F, /* 0x7X */
|
||||
/* NEL */
|
||||
X, X, X, X, X, T, X, X, X, X, X, X, X, X, X, X, /* 0x8X */
|
||||
X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, /* 0x9X */
|
||||
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xaX */
|
||||
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xbX */
|
||||
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xcX */
|
||||
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xdX */
|
||||
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xeX */
|
||||
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xfX */
|
||||
}
|
||||
)
|
||||
|
||||
// FromBOM returns the charset declared in the BOM of content.
|
||||
func FromBOM(content []byte) string {
|
||||
for _, b := range boms {
|
||||
if bytes.HasPrefix(content, b.bom) {
|
||||
return b.enc
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// FromPlain returns the charset of a plain text. It relies on BOM presence
|
||||
// and it falls back on checking each byte in content.
|
||||
func FromPlain(content []byte) string {
|
||||
if len(content) == 0 {
|
||||
return ""
|
||||
}
|
||||
if cset := FromBOM(content); cset != "" {
|
||||
return cset
|
||||
}
|
||||
origContent := content
|
||||
// Try to detect UTF-8.
|
||||
// First eliminate any partial rune at the end.
|
||||
for i := len(content) - 1; i >= 0 && i > len(content)-4; i-- {
|
||||
b := content[i]
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
if utf8.RuneStart(b) {
|
||||
content = content[:i]
|
||||
break
|
||||
}
|
||||
}
|
||||
hasHighBit := false
|
||||
for _, c := range content {
|
||||
if c >= 0x80 {
|
||||
hasHighBit = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if hasHighBit && utf8.Valid(content) {
|
||||
return "utf-8"
|
||||
}
|
||||
|
||||
// ASCII is a subset of UTF8. Follow W3C recommendation and replace with UTF8.
|
||||
if ascii(origContent) {
|
||||
return "utf-8"
|
||||
}
|
||||
|
||||
return latin(origContent)
|
||||
}
|
||||
|
||||
func latin(content []byte) string {
|
||||
hasControlBytes := false
|
||||
for _, b := range content {
|
||||
t := textChars[b]
|
||||
if t != T && t != I {
|
||||
return ""
|
||||
}
|
||||
if b >= 0x80 && b <= 0x9F {
|
||||
hasControlBytes = true
|
||||
}
|
||||
}
|
||||
// Code range 0x80 to 0x9F is reserved for control characters in ISO-8859-1
|
||||
// (so-called C1 Controls). Windows 1252, however, has printable punctuation
|
||||
// characters in this range.
|
||||
if hasControlBytes {
|
||||
return "windows-1252"
|
||||
}
|
||||
return "iso-8859-1"
|
||||
}
|
||||
|
||||
func ascii(content []byte) bool {
|
||||
for _, b := range content {
|
||||
if textChars[b] != T {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// FromXML returns the charset of an XML document. It relies on the XML
|
||||
// header <?xml version="1.0" encoding="UTF-8"?> and falls back on the plain
|
||||
// text content.
|
||||
func FromXML(content []byte) string {
|
||||
if cset := fromXML(content); cset != "" {
|
||||
return cset
|
||||
}
|
||||
return FromPlain(content)
|
||||
}
|
||||
func fromXML(content []byte) string {
|
||||
content = trimLWS(content)
|
||||
dec := xml.NewDecoder(bytes.NewReader(content))
|
||||
rawT, err := dec.RawToken()
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
t, ok := rawT.(xml.ProcInst)
|
||||
if !ok {
|
||||
return ""
|
||||
}
|
||||
|
||||
return strings.ToLower(xmlEncoding(string(t.Inst)))
|
||||
}
|
||||
|
||||
// FromHTML returns the charset of an HTML document. It relies on the meta tag
|
||||
// <meta charset="UTF-8"> and falls back on the plain text content.
|
||||
func FromHTML(content []byte) string {
|
||||
if cset := fromHTML(content); cset != "" {
|
||||
return cset
|
||||
}
|
||||
return FromPlain(content)
|
||||
}
|
||||
|
||||
func fromHTML(content []byte) string {
|
||||
z := html.NewTokenizer(bytes.NewReader(content))
|
||||
for {
|
||||
switch z.Next() {
|
||||
case html.ErrorToken:
|
||||
return ""
|
||||
|
||||
case html.StartTagToken, html.SelfClosingTagToken:
|
||||
tagName, hasAttr := z.TagName()
|
||||
if !bytes.Equal(tagName, []byte("meta")) {
|
||||
continue
|
||||
}
|
||||
attrList := make(map[string]bool)
|
||||
gotPragma := false
|
||||
|
||||
const (
|
||||
dontKnow = iota
|
||||
doNeedPragma
|
||||
doNotNeedPragma
|
||||
)
|
||||
needPragma := dontKnow
|
||||
|
||||
name := ""
|
||||
for hasAttr {
|
||||
var key, val []byte
|
||||
key, val, hasAttr = z.TagAttr()
|
||||
ks := string(key)
|
||||
if attrList[ks] {
|
||||
continue
|
||||
}
|
||||
attrList[ks] = true
|
||||
for i, c := range val {
|
||||
if 'A' <= c && c <= 'Z' {
|
||||
val[i] = c + 0x20
|
||||
}
|
||||
}
|
||||
|
||||
switch ks {
|
||||
case "http-equiv":
|
||||
if bytes.Equal(val, []byte("content-type")) {
|
||||
gotPragma = true
|
||||
}
|
||||
|
||||
case "content":
|
||||
name = fromMetaElement(string(val))
|
||||
if name != "" {
|
||||
needPragma = doNeedPragma
|
||||
}
|
||||
|
||||
case "charset":
|
||||
name = string(val)
|
||||
needPragma = doNotNeedPragma
|
||||
}
|
||||
}
|
||||
|
||||
if needPragma == dontKnow || needPragma == doNeedPragma && !gotPragma {
|
||||
continue
|
||||
}
|
||||
|
||||
if strings.HasPrefix(name, "utf-16") {
|
||||
name = "utf-8"
|
||||
}
|
||||
|
||||
return name
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func fromMetaElement(s string) string {
|
||||
for s != "" {
|
||||
csLoc := strings.Index(s, "charset")
|
||||
if csLoc == -1 {
|
||||
return ""
|
||||
}
|
||||
s = s[csLoc+len("charset"):]
|
||||
s = strings.TrimLeft(s, " \t\n\f\r")
|
||||
if !strings.HasPrefix(s, "=") {
|
||||
continue
|
||||
}
|
||||
s = s[1:]
|
||||
s = strings.TrimLeft(s, " \t\n\f\r")
|
||||
if s == "" {
|
||||
return ""
|
||||
}
|
||||
if q := s[0]; q == '"' || q == '\'' {
|
||||
s = s[1:]
|
||||
closeQuote := strings.IndexRune(s, rune(q))
|
||||
if closeQuote == -1 {
|
||||
return ""
|
||||
}
|
||||
return s[:closeQuote]
|
||||
}
|
||||
|
||||
end := strings.IndexAny(s, "; \t\n\f\r")
|
||||
if end == -1 {
|
||||
end = len(s)
|
||||
}
|
||||
return s[:end]
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func xmlEncoding(s string) string {
|
||||
param := "encoding="
|
||||
idx := strings.Index(s, param)
|
||||
if idx == -1 {
|
||||
return ""
|
||||
}
|
||||
v := s[idx+len(param):]
|
||||
if v == "" {
|
||||
return ""
|
||||
}
|
||||
if v[0] != '\'' && v[0] != '"' {
|
||||
return ""
|
||||
}
|
||||
idx = strings.IndexRune(v[1:], rune(v[0]))
|
||||
if idx == -1 {
|
||||
return ""
|
||||
}
|
||||
return v[1 : idx+1]
|
||||
}
|
||||
|
||||
// trimLWS trims whitespace from beginning of the input.
|
||||
// TODO: find a way to call trimLWS once per detection instead of once in each
|
||||
// detector which needs the trimmed input.
|
||||
func trimLWS(in []byte) []byte {
|
||||
firstNonWS := 0
|
||||
for ; firstNonWS < len(in) && isWS(in[firstNonWS]); firstNonWS++ {
|
||||
}
|
||||
|
||||
return in[firstNonWS:]
|
||||
}
|
||||
|
||||
func isWS(b byte) bool {
|
||||
return b == '\t' || b == '\n' || b == '\x0c' || b == '\r' || b == ' '
|
||||
}
|
||||
544
vendor/github.com/wailsapp/mimetype/internal/json/json.go
generated
vendored
Normal file
544
vendor/github.com/wailsapp/mimetype/internal/json/json.go
generated
vendored
Normal file
@@ -0,0 +1,544 @@
|
||||
// Copyright (c) 2009 The Go Authors. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Package json provides a JSON value parser state machine.
|
||||
// This package is almost entirely copied from the Go stdlib.
|
||||
// Changes made to it permit users of the package to tell
|
||||
// if some slice of bytes is a valid beginning of a json string.
|
||||
package json
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type (
|
||||
scanStatus int
|
||||
)
|
||||
|
||||
const (
|
||||
parseObjectKey = iota // parsing object key (before colon)
|
||||
parseObjectValue // parsing object value (after colon)
|
||||
parseArrayValue // parsing array value
|
||||
|
||||
scanContinue scanStatus = iota // uninteresting byte
|
||||
scanBeginLiteral // end implied by next result != scanContinue
|
||||
scanBeginObject // begin object
|
||||
scanObjectKey // just finished object key (string)
|
||||
scanObjectValue // just finished non-last object value
|
||||
scanEndObject // end object (implies scanObjectValue if possible)
|
||||
scanBeginArray // begin array
|
||||
scanArrayValue // just finished array value
|
||||
scanEndArray // end array (implies scanArrayValue if possible)
|
||||
scanSkipSpace // space byte; can skip; known to be last "continue" result
|
||||
scanEnd // top-level value ended *before* this byte; known to be first "stop" result
|
||||
scanError // hit an error, scanner.err.
|
||||
|
||||
// This limits the max nesting depth to prevent stack overflow.
|
||||
// This is permitted by https://tools.ietf.org/html/rfc7159#section-9
|
||||
maxNestingDepth = 10000
|
||||
)
|
||||
|
||||
type (
|
||||
scanner struct {
|
||||
step func(*scanner, byte) scanStatus
|
||||
parseState []int
|
||||
endTop bool
|
||||
err error
|
||||
index int
|
||||
}
|
||||
)
|
||||
|
||||
// Scan returns the number of bytes scanned and if there was any error
|
||||
// in trying to reach the end of data.
|
||||
func Scan(data []byte) (int, error) {
|
||||
s := &scanner{}
|
||||
_ = checkValid(data, s)
|
||||
return s.index, s.err
|
||||
}
|
||||
|
||||
// checkValid verifies that data is valid JSON-encoded data.
|
||||
// scan is passed in for use by checkValid to avoid an allocation.
|
||||
func checkValid(data []byte, scan *scanner) error {
|
||||
scan.reset()
|
||||
for _, c := range data {
|
||||
scan.index++
|
||||
if scan.step(scan, c) == scanError {
|
||||
return scan.err
|
||||
}
|
||||
}
|
||||
if scan.eof() == scanError {
|
||||
return scan.err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func isSpace(c byte) bool {
|
||||
return c == ' ' || c == '\t' || c == '\r' || c == '\n'
|
||||
}
|
||||
|
||||
func (s *scanner) reset() {
|
||||
s.step = stateBeginValue
|
||||
s.parseState = s.parseState[0:0]
|
||||
s.err = nil
|
||||
}
|
||||
|
||||
// eof tells the scanner that the end of input has been reached.
|
||||
// It returns a scan status just as s.step does.
|
||||
func (s *scanner) eof() scanStatus {
|
||||
if s.err != nil {
|
||||
return scanError
|
||||
}
|
||||
if s.endTop {
|
||||
return scanEnd
|
||||
}
|
||||
s.step(s, ' ')
|
||||
if s.endTop {
|
||||
return scanEnd
|
||||
}
|
||||
if s.err == nil {
|
||||
s.err = fmt.Errorf("unexpected end of JSON input")
|
||||
}
|
||||
return scanError
|
||||
}
|
||||
|
||||
// pushParseState pushes a new parse state p onto the parse stack.
|
||||
// an error state is returned if maxNestingDepth was exceeded, otherwise successState is returned.
|
||||
func (s *scanner) pushParseState(c byte, newParseState int, successState scanStatus) scanStatus {
|
||||
s.parseState = append(s.parseState, newParseState)
|
||||
if len(s.parseState) <= maxNestingDepth {
|
||||
return successState
|
||||
}
|
||||
return s.error(c, "exceeded max depth")
|
||||
}
|
||||
|
||||
// popParseState pops a parse state (already obtained) off the stack
|
||||
// and updates s.step accordingly.
|
||||
func (s *scanner) popParseState() {
|
||||
n := len(s.parseState) - 1
|
||||
s.parseState = s.parseState[0:n]
|
||||
if n == 0 {
|
||||
s.step = stateEndTop
|
||||
s.endTop = true
|
||||
} else {
|
||||
s.step = stateEndValue
|
||||
}
|
||||
}
|
||||
|
||||
// stateBeginValueOrEmpty is the state after reading `[`.
|
||||
func stateBeginValueOrEmpty(s *scanner, c byte) scanStatus {
|
||||
if c <= ' ' && isSpace(c) {
|
||||
return scanSkipSpace
|
||||
}
|
||||
if c == ']' {
|
||||
return stateEndValue(s, c)
|
||||
}
|
||||
return stateBeginValue(s, c)
|
||||
}
|
||||
|
||||
// stateBeginValue is the state at the beginning of the input.
|
||||
func stateBeginValue(s *scanner, c byte) scanStatus {
|
||||
if c <= ' ' && isSpace(c) {
|
||||
return scanSkipSpace
|
||||
}
|
||||
switch c {
|
||||
case '{':
|
||||
s.step = stateBeginStringOrEmpty
|
||||
return s.pushParseState(c, parseObjectKey, scanBeginObject)
|
||||
case '[':
|
||||
s.step = stateBeginValueOrEmpty
|
||||
return s.pushParseState(c, parseArrayValue, scanBeginArray)
|
||||
case '"':
|
||||
s.step = stateInString
|
||||
return scanBeginLiteral
|
||||
case '-':
|
||||
s.step = stateNeg
|
||||
return scanBeginLiteral
|
||||
case '0': // beginning of 0.123
|
||||
s.step = state0
|
||||
return scanBeginLiteral
|
||||
case 't': // beginning of true
|
||||
s.step = stateT
|
||||
return scanBeginLiteral
|
||||
case 'f': // beginning of false
|
||||
s.step = stateF
|
||||
return scanBeginLiteral
|
||||
case 'n': // beginning of null
|
||||
s.step = stateN
|
||||
return scanBeginLiteral
|
||||
}
|
||||
if '1' <= c && c <= '9' { // beginning of 1234.5
|
||||
s.step = state1
|
||||
return scanBeginLiteral
|
||||
}
|
||||
return s.error(c, "looking for beginning of value")
|
||||
}
|
||||
|
||||
// stateBeginStringOrEmpty is the state after reading `{`.
|
||||
func stateBeginStringOrEmpty(s *scanner, c byte) scanStatus {
|
||||
if c <= ' ' && isSpace(c) {
|
||||
return scanSkipSpace
|
||||
}
|
||||
if c == '}' {
|
||||
n := len(s.parseState)
|
||||
s.parseState[n-1] = parseObjectValue
|
||||
return stateEndValue(s, c)
|
||||
}
|
||||
return stateBeginString(s, c)
|
||||
}
|
||||
|
||||
// stateBeginString is the state after reading `{"key": value,`.
|
||||
func stateBeginString(s *scanner, c byte) scanStatus {
|
||||
if c <= ' ' && isSpace(c) {
|
||||
return scanSkipSpace
|
||||
}
|
||||
if c == '"' {
|
||||
s.step = stateInString
|
||||
return scanBeginLiteral
|
||||
}
|
||||
return s.error(c, "looking for beginning of object key string")
|
||||
}
|
||||
|
||||
// stateEndValue is the state after completing a value,
|
||||
// such as after reading `{}` or `true` or `["x"`.
|
||||
func stateEndValue(s *scanner, c byte) scanStatus {
|
||||
n := len(s.parseState)
|
||||
if n == 0 {
|
||||
// Completed top-level before the current byte.
|
||||
s.step = stateEndTop
|
||||
s.endTop = true
|
||||
return stateEndTop(s, c)
|
||||
}
|
||||
if c <= ' ' && isSpace(c) {
|
||||
s.step = stateEndValue
|
||||
return scanSkipSpace
|
||||
}
|
||||
ps := s.parseState[n-1]
|
||||
switch ps {
|
||||
case parseObjectKey:
|
||||
if c == ':' {
|
||||
s.parseState[n-1] = parseObjectValue
|
||||
s.step = stateBeginValue
|
||||
return scanObjectKey
|
||||
}
|
||||
return s.error(c, "after object key")
|
||||
case parseObjectValue:
|
||||
if c == ',' {
|
||||
s.parseState[n-1] = parseObjectKey
|
||||
s.step = stateBeginString
|
||||
return scanObjectValue
|
||||
}
|
||||
if c == '}' {
|
||||
s.popParseState()
|
||||
return scanEndObject
|
||||
}
|
||||
return s.error(c, "after object key:value pair")
|
||||
case parseArrayValue:
|
||||
if c == ',' {
|
||||
s.step = stateBeginValue
|
||||
return scanArrayValue
|
||||
}
|
||||
if c == ']' {
|
||||
s.popParseState()
|
||||
return scanEndArray
|
||||
}
|
||||
return s.error(c, "after array element")
|
||||
}
|
||||
return s.error(c, "")
|
||||
}
|
||||
|
||||
// stateEndTop is the state after finishing the top-level value,
|
||||
// such as after reading `{}` or `[1,2,3]`.
|
||||
// Only space characters should be seen now.
|
||||
func stateEndTop(s *scanner, c byte) scanStatus {
|
||||
if c != ' ' && c != '\t' && c != '\r' && c != '\n' {
|
||||
// Complain about non-space byte on next call.
|
||||
s.error(c, "after top-level value")
|
||||
}
|
||||
return scanEnd
|
||||
}
|
||||
|
||||
// stateInString is the state after reading `"`.
|
||||
func stateInString(s *scanner, c byte) scanStatus {
|
||||
if c == '"' {
|
||||
s.step = stateEndValue
|
||||
return scanContinue
|
||||
}
|
||||
if c == '\\' {
|
||||
s.step = stateInStringEsc
|
||||
return scanContinue
|
||||
}
|
||||
if c < 0x20 {
|
||||
return s.error(c, "in string literal")
|
||||
}
|
||||
return scanContinue
|
||||
}
|
||||
|
||||
// stateInStringEsc is the state after reading `"\` during a quoted string.
|
||||
func stateInStringEsc(s *scanner, c byte) scanStatus {
|
||||
switch c {
|
||||
case 'b', 'f', 'n', 'r', 't', '\\', '/', '"':
|
||||
s.step = stateInString
|
||||
return scanContinue
|
||||
case 'u':
|
||||
s.step = stateInStringEscU
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in string escape code")
|
||||
}
|
||||
|
||||
// stateInStringEscU is the state after reading `"\u` during a quoted string.
|
||||
func stateInStringEscU(s *scanner, c byte) scanStatus {
|
||||
if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
|
||||
s.step = stateInStringEscU1
|
||||
return scanContinue
|
||||
}
|
||||
// numbers
|
||||
return s.error(c, "in \\u hexadecimal character escape")
|
||||
}
|
||||
|
||||
// stateInStringEscU1 is the state after reading `"\u1` during a quoted string.
|
||||
func stateInStringEscU1(s *scanner, c byte) scanStatus {
|
||||
if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
|
||||
s.step = stateInStringEscU12
|
||||
return scanContinue
|
||||
}
|
||||
// numbers
|
||||
return s.error(c, "in \\u hexadecimal character escape")
|
||||
}
|
||||
|
||||
// stateInStringEscU12 is the state after reading `"\u12` during a quoted string.
|
||||
func stateInStringEscU12(s *scanner, c byte) scanStatus {
|
||||
if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
|
||||
s.step = stateInStringEscU123
|
||||
return scanContinue
|
||||
}
|
||||
// numbers
|
||||
return s.error(c, "in \\u hexadecimal character escape")
|
||||
}
|
||||
|
||||
// stateInStringEscU123 is the state after reading `"\u123` during a quoted string.
|
||||
func stateInStringEscU123(s *scanner, c byte) scanStatus {
|
||||
if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
|
||||
s.step = stateInString
|
||||
return scanContinue
|
||||
}
|
||||
// numbers
|
||||
return s.error(c, "in \\u hexadecimal character escape")
|
||||
}
|
||||
|
||||
// stateNeg is the state after reading `-` during a number.
|
||||
func stateNeg(s *scanner, c byte) scanStatus {
|
||||
if c == '0' {
|
||||
s.step = state0
|
||||
return scanContinue
|
||||
}
|
||||
if '1' <= c && c <= '9' {
|
||||
s.step = state1
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in numeric literal")
|
||||
}
|
||||
|
||||
// state1 is the state after reading a non-zero integer during a number,
|
||||
// such as after reading `1` or `100` but not `0`.
|
||||
func state1(s *scanner, c byte) scanStatus {
|
||||
if '0' <= c && c <= '9' {
|
||||
s.step = state1
|
||||
return scanContinue
|
||||
}
|
||||
return state0(s, c)
|
||||
}
|
||||
|
||||
// state0 is the state after reading `0` during a number.
|
||||
func state0(s *scanner, c byte) scanStatus {
|
||||
if c == '.' {
|
||||
s.step = stateDot
|
||||
return scanContinue
|
||||
}
|
||||
if c == 'e' || c == 'E' {
|
||||
s.step = stateE
|
||||
return scanContinue
|
||||
}
|
||||
return stateEndValue(s, c)
|
||||
}
|
||||
|
||||
// stateDot is the state after reading the integer and decimal point in a number,
|
||||
// such as after reading `1.`.
|
||||
func stateDot(s *scanner, c byte) scanStatus {
|
||||
if '0' <= c && c <= '9' {
|
||||
s.step = stateDot0
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "after decimal point in numeric literal")
|
||||
}
|
||||
|
||||
// stateDot0 is the state after reading the integer, decimal point, and subsequent
|
||||
// digits of a number, such as after reading `3.14`.
|
||||
func stateDot0(s *scanner, c byte) scanStatus {
|
||||
if '0' <= c && c <= '9' {
|
||||
return scanContinue
|
||||
}
|
||||
if c == 'e' || c == 'E' {
|
||||
s.step = stateE
|
||||
return scanContinue
|
||||
}
|
||||
return stateEndValue(s, c)
|
||||
}
|
||||
|
||||
// stateE is the state after reading the mantissa and e in a number,
|
||||
// such as after reading `314e` or `0.314e`.
|
||||
func stateE(s *scanner, c byte) scanStatus {
|
||||
if c == '+' || c == '-' {
|
||||
s.step = stateESign
|
||||
return scanContinue
|
||||
}
|
||||
return stateESign(s, c)
|
||||
}
|
||||
|
||||
// stateESign is the state after reading the mantissa, e, and sign in a number,
|
||||
// such as after reading `314e-` or `0.314e+`.
|
||||
func stateESign(s *scanner, c byte) scanStatus {
|
||||
if '0' <= c && c <= '9' {
|
||||
s.step = stateE0
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in exponent of numeric literal")
|
||||
}
|
||||
|
||||
// stateE0 is the state after reading the mantissa, e, optional sign,
|
||||
// and at least one digit of the exponent in a number,
|
||||
// such as after reading `314e-2` or `0.314e+1` or `3.14e0`.
|
||||
func stateE0(s *scanner, c byte) scanStatus {
|
||||
if '0' <= c && c <= '9' {
|
||||
return scanContinue
|
||||
}
|
||||
return stateEndValue(s, c)
|
||||
}
|
||||
|
||||
// stateT is the state after reading `t`.
|
||||
func stateT(s *scanner, c byte) scanStatus {
|
||||
if c == 'r' {
|
||||
s.step = stateTr
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal true (expecting 'r')")
|
||||
}
|
||||
|
||||
// stateTr is the state after reading `tr`.
|
||||
func stateTr(s *scanner, c byte) scanStatus {
|
||||
if c == 'u' {
|
||||
s.step = stateTru
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal true (expecting 'u')")
|
||||
}
|
||||
|
||||
// stateTru is the state after reading `tru`.
|
||||
func stateTru(s *scanner, c byte) scanStatus {
|
||||
if c == 'e' {
|
||||
s.step = stateEndValue
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal true (expecting 'e')")
|
||||
}
|
||||
|
||||
// stateF is the state after reading `f`.
|
||||
func stateF(s *scanner, c byte) scanStatus {
|
||||
if c == 'a' {
|
||||
s.step = stateFa
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal false (expecting 'a')")
|
||||
}
|
||||
|
||||
// stateFa is the state after reading `fa`.
|
||||
func stateFa(s *scanner, c byte) scanStatus {
|
||||
if c == 'l' {
|
||||
s.step = stateFal
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal false (expecting 'l')")
|
||||
}
|
||||
|
||||
// stateFal is the state after reading `fal`.
|
||||
func stateFal(s *scanner, c byte) scanStatus {
|
||||
if c == 's' {
|
||||
s.step = stateFals
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal false (expecting 's')")
|
||||
}
|
||||
|
||||
// stateFals is the state after reading `fals`.
|
||||
func stateFals(s *scanner, c byte) scanStatus {
|
||||
if c == 'e' {
|
||||
s.step = stateEndValue
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal false (expecting 'e')")
|
||||
}
|
||||
|
||||
// stateN is the state after reading `n`.
|
||||
func stateN(s *scanner, c byte) scanStatus {
|
||||
if c == 'u' {
|
||||
s.step = stateNu
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal null (expecting 'u')")
|
||||
}
|
||||
|
||||
// stateNu is the state after reading `nu`.
|
||||
func stateNu(s *scanner, c byte) scanStatus {
|
||||
if c == 'l' {
|
||||
s.step = stateNul
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal null (expecting 'l')")
|
||||
}
|
||||
|
||||
// stateNul is the state after reading `nul`.
|
||||
func stateNul(s *scanner, c byte) scanStatus {
|
||||
if c == 'l' {
|
||||
s.step = stateEndValue
|
||||
return scanContinue
|
||||
}
|
||||
return s.error(c, "in literal null (expecting 'l')")
|
||||
}
|
||||
|
||||
// stateError is the state after reaching a syntax error,
|
||||
// such as after reading `[1}` or `5.1.2`.
|
||||
func stateError(s *scanner, c byte) scanStatus {
|
||||
return scanError
|
||||
}
|
||||
|
||||
// error records an error and switches to the error state.
|
||||
func (s *scanner) error(c byte, context string) scanStatus {
|
||||
s.step = stateError
|
||||
s.err = fmt.Errorf("invalid character <<%c>> %s", c, context)
|
||||
return scanError
|
||||
}
|
||||
108
vendor/github.com/wailsapp/mimetype/internal/magic/archive.go
generated
vendored
Normal file
108
vendor/github.com/wailsapp/mimetype/internal/magic/archive.go
generated
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
package magic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
var (
|
||||
// SevenZ matches a 7z archive.
|
||||
SevenZ = prefix([]byte{0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C})
|
||||
// Gzip matches gzip files based on http://www.zlib.org/rfc-gzip.html#header-trailer.
|
||||
Gzip = prefix([]byte{0x1f, 0x8b})
|
||||
// Fits matches an Flexible Image Transport System file.
|
||||
Fits = prefix([]byte{
|
||||
0x53, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x20, 0x20, 0x3D, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x54,
|
||||
})
|
||||
// Xar matches an eXtensible ARchive format file.
|
||||
Xar = prefix([]byte{0x78, 0x61, 0x72, 0x21})
|
||||
// Bz2 matches a bzip2 file.
|
||||
Bz2 = prefix([]byte{0x42, 0x5A, 0x68})
|
||||
// Ar matches an ar (Unix) archive file.
|
||||
Ar = prefix([]byte{0x21, 0x3C, 0x61, 0x72, 0x63, 0x68, 0x3E})
|
||||
// Deb matches a Debian package file.
|
||||
Deb = offset([]byte{
|
||||
0x64, 0x65, 0x62, 0x69, 0x61, 0x6E, 0x2D,
|
||||
0x62, 0x69, 0x6E, 0x61, 0x72, 0x79,
|
||||
}, 8)
|
||||
// Warc matches a Web ARChive file.
|
||||
Warc = prefix([]byte("WARC/1.0"), []byte("WARC/1.1"))
|
||||
// Cab matches a Cabinet archive file.
|
||||
Cab = prefix([]byte("MSCF\x00\x00\x00\x00"))
|
||||
// Xz matches an xz compressed stream based on https://tukaani.org/xz/xz-file-format.txt.
|
||||
Xz = prefix([]byte{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00})
|
||||
// Lzip matches an Lzip compressed file.
|
||||
Lzip = prefix([]byte{0x4c, 0x5a, 0x49, 0x50})
|
||||
// RPM matches an RPM or Delta RPM package file.
|
||||
RPM = prefix([]byte{0xed, 0xab, 0xee, 0xdb}, []byte("drpm"))
|
||||
// Cpio matches a cpio archive file.
|
||||
Cpio = prefix([]byte("070707"), []byte("070701"), []byte("070702"))
|
||||
// RAR matches a RAR archive file.
|
||||
RAR = prefix([]byte("Rar!\x1A\x07\x00"), []byte("Rar!\x1A\x07\x01\x00"))
|
||||
)
|
||||
|
||||
// Zstd matches a Zstandard archive file.
|
||||
func Zstd(raw []byte, limit uint32) bool {
|
||||
return len(raw) >= 4 &&
|
||||
(0x22 <= raw[0] && raw[0] <= 0x28 || raw[0] == 0x1E) && // Different Zstandard versions.
|
||||
bytes.HasPrefix(raw[1:], []byte{0xB5, 0x2F, 0xFD})
|
||||
}
|
||||
|
||||
// CRX matches a Chrome extension file: a zip archive prepended by a package header.
|
||||
func CRX(raw []byte, limit uint32) bool {
|
||||
const minHeaderLen = 16
|
||||
if len(raw) < minHeaderLen || !bytes.HasPrefix(raw, []byte("Cr24")) {
|
||||
return false
|
||||
}
|
||||
pubkeyLen := binary.LittleEndian.Uint32(raw[8:12])
|
||||
sigLen := binary.LittleEndian.Uint32(raw[12:16])
|
||||
zipOffset := minHeaderLen + pubkeyLen + sigLen
|
||||
if uint32(len(raw)) < zipOffset {
|
||||
return false
|
||||
}
|
||||
return Zip(raw[zipOffset:], limit)
|
||||
}
|
||||
|
||||
// Tar matches a (t)ape (ar)chive file.
|
||||
//
|
||||
// Signature source: https://www.nationalarchives.gov.uk/PRONOM/Format/proFormatSearch.aspx?status=detailReport&id=385&strPageToDisplay=signatures
|
||||
func Tar(raw []byte, _ uint32) bool {
|
||||
if len(raw) < 256 {
|
||||
return false
|
||||
}
|
||||
|
||||
rules := []struct {
|
||||
min, max uint8
|
||||
i int
|
||||
}{
|
||||
{0x21, 0xEF, 0},
|
||||
{0x30, 0x37, 105},
|
||||
{0x20, 0x37, 106},
|
||||
{0x00, 0x00, 107},
|
||||
{0x30, 0x37, 113},
|
||||
{0x20, 0x37, 114},
|
||||
{0x00, 0x00, 115},
|
||||
{0x30, 0x37, 121},
|
||||
{0x20, 0x37, 122},
|
||||
{0x00, 0x00, 123},
|
||||
{0x30, 0x37, 134},
|
||||
{0x30, 0x37, 146},
|
||||
{0x30, 0x37, 153},
|
||||
{0x00, 0x37, 154},
|
||||
}
|
||||
for _, r := range rules {
|
||||
if raw[r.i] < r.min || raw[r.i] > r.max {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
for _, i := range []uint8{135, 147, 155} {
|
||||
if raw[i] != 0x00 && raw[i] != 0x20 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
76
vendor/github.com/wailsapp/mimetype/internal/magic/audio.go
generated
vendored
Normal file
76
vendor/github.com/wailsapp/mimetype/internal/magic/audio.go
generated
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
package magic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
var (
|
||||
// Flac matches a Free Lossless Audio Codec file.
|
||||
Flac = prefix([]byte("\x66\x4C\x61\x43\x00\x00\x00\x22"))
|
||||
// Midi matches a Musical Instrument Digital Interface file.
|
||||
Midi = prefix([]byte("\x4D\x54\x68\x64"))
|
||||
// Ape matches a Monkey's Audio file.
|
||||
Ape = prefix([]byte("\x4D\x41\x43\x20\x96\x0F\x00\x00\x34\x00\x00\x00\x18\x00\x00\x00\x90\xE3"))
|
||||
// MusePack matches a Musepack file.
|
||||
MusePack = prefix([]byte("MPCK"))
|
||||
// Au matches a Sun Microsystems au file.
|
||||
Au = prefix([]byte("\x2E\x73\x6E\x64"))
|
||||
// Amr matches an Adaptive Multi-Rate file.
|
||||
Amr = prefix([]byte("\x23\x21\x41\x4D\x52"))
|
||||
// Voc matches a Creative Voice file.
|
||||
Voc = prefix([]byte("Creative Voice File"))
|
||||
// M3u matches a Playlist file.
|
||||
M3u = prefix([]byte("#EXTM3U"))
|
||||
// AAC matches an Advanced Audio Coding file.
|
||||
AAC = prefix([]byte{0xFF, 0xF1}, []byte{0xFF, 0xF9})
|
||||
)
|
||||
|
||||
// Mp3 matches an mp3 file.
|
||||
func Mp3(raw []byte, limit uint32) bool {
|
||||
if len(raw) < 3 {
|
||||
return false
|
||||
}
|
||||
|
||||
if bytes.HasPrefix(raw, []byte("ID3")) {
|
||||
// MP3s with an ID3v2 tag will start with "ID3"
|
||||
// ID3v1 tags, however appear at the end of the file.
|
||||
return true
|
||||
}
|
||||
|
||||
// Match MP3 files without tags
|
||||
switch binary.BigEndian.Uint16(raw[:2]) & 0xFFFE {
|
||||
case 0xFFFA:
|
||||
// MPEG ADTS, layer III, v1
|
||||
return true
|
||||
case 0xFFF2:
|
||||
// MPEG ADTS, layer III, v2
|
||||
return true
|
||||
case 0xFFE2:
|
||||
// MPEG ADTS, layer III, v2.5
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Wav matches a Waveform Audio File Format file.
|
||||
func Wav(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 12 &&
|
||||
bytes.Equal(raw[:4], []byte("RIFF")) &&
|
||||
bytes.Equal(raw[8:12], []byte{0x57, 0x41, 0x56, 0x45})
|
||||
}
|
||||
|
||||
// Aiff matches Audio Interchange File Format file.
|
||||
func Aiff(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 12 &&
|
||||
bytes.Equal(raw[:4], []byte{0x46, 0x4F, 0x52, 0x4D}) &&
|
||||
bytes.Equal(raw[8:12], []byte{0x41, 0x49, 0x46, 0x46})
|
||||
}
|
||||
|
||||
// Qcp matches a Qualcomm Pure Voice file.
|
||||
func Qcp(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 12 &&
|
||||
bytes.Equal(raw[:4], []byte("RIFF")) &&
|
||||
bytes.Equal(raw[8:12], []byte("QLCM"))
|
||||
}
|
||||
196
vendor/github.com/wailsapp/mimetype/internal/magic/binary.go
generated
vendored
Normal file
196
vendor/github.com/wailsapp/mimetype/internal/magic/binary.go
generated
vendored
Normal file
@@ -0,0 +1,196 @@
|
||||
package magic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"debug/macho"
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
var (
|
||||
// Lnk matches Microsoft lnk binary format.
|
||||
Lnk = prefix([]byte{0x4C, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00})
|
||||
// Wasm matches a web assembly File Format file.
|
||||
Wasm = prefix([]byte{0x00, 0x61, 0x73, 0x6D})
|
||||
// Exe matches a Windows/DOS executable file.
|
||||
Exe = prefix([]byte{0x4D, 0x5A})
|
||||
// Elf matches an Executable and Linkable Format file.
|
||||
Elf = prefix([]byte{0x7F, 0x45, 0x4C, 0x46})
|
||||
// Nes matches a Nintendo Entertainment system ROM file.
|
||||
Nes = prefix([]byte{0x4E, 0x45, 0x53, 0x1A})
|
||||
// SWF matches an Adobe Flash swf file.
|
||||
SWF = prefix([]byte("CWS"), []byte("FWS"), []byte("ZWS"))
|
||||
// Torrent has bencoded text in the beginning.
|
||||
Torrent = prefix([]byte("d8:announce"))
|
||||
)
|
||||
|
||||
// Java bytecode and Mach-O binaries share the same magic number.
|
||||
// More info here https://github.com/threatstack/libmagic/blob/master/magic/Magdir/cafebabe
|
||||
func classOrMachOFat(in []byte) bool {
|
||||
// There should be at least 8 bytes for both of them because the only way to
|
||||
// quickly distinguish them is by comparing byte at position 7
|
||||
if len(in) < 8 {
|
||||
return false
|
||||
}
|
||||
|
||||
return bytes.HasPrefix(in, []byte{0xCA, 0xFE, 0xBA, 0xBE})
|
||||
}
|
||||
|
||||
// Class matches a java class file.
|
||||
func Class(raw []byte, limit uint32) bool {
|
||||
return classOrMachOFat(raw) && raw[7] > 30
|
||||
}
|
||||
|
||||
// MachO matches Mach-O binaries format.
|
||||
func MachO(raw []byte, limit uint32) bool {
|
||||
if classOrMachOFat(raw) && raw[7] < 20 {
|
||||
return true
|
||||
}
|
||||
|
||||
if len(raw) < 4 {
|
||||
return false
|
||||
}
|
||||
|
||||
be := binary.BigEndian.Uint32(raw)
|
||||
le := binary.LittleEndian.Uint32(raw)
|
||||
|
||||
return be == macho.Magic32 ||
|
||||
le == macho.Magic32 ||
|
||||
be == macho.Magic64 ||
|
||||
le == macho.Magic64
|
||||
}
|
||||
|
||||
// Dbf matches a dBase file.
|
||||
// https://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm
|
||||
func Dbf(raw []byte, limit uint32) bool {
|
||||
if len(raw) < 68 {
|
||||
return false
|
||||
}
|
||||
|
||||
// 3rd and 4th bytes contain the last update month and day of month.
|
||||
if !(0 < raw[2] && raw[2] < 13 && 0 < raw[3] && raw[3] < 32) {
|
||||
return false
|
||||
}
|
||||
|
||||
// 12, 13, 30, 31 are reserved bytes and always filled with 0x00.
|
||||
if raw[12] != 0x00 || raw[13] != 0x00 || raw[30] != 0x00 || raw[31] != 0x00 {
|
||||
return false
|
||||
}
|
||||
// Production MDX flag;
|
||||
// 0x01 if a production .MDX file exists for this table;
|
||||
// 0x00 if no .MDX file exists.
|
||||
if raw[28] > 0x01 {
|
||||
return false
|
||||
}
|
||||
|
||||
// dbf type is dictated by the first byte.
|
||||
dbfTypes := []byte{
|
||||
0x02, 0x03, 0x04, 0x05, 0x30, 0x31, 0x32, 0x42, 0x62, 0x7B, 0x82,
|
||||
0x83, 0x87, 0x8A, 0x8B, 0x8E, 0xB3, 0xCB, 0xE5, 0xF5, 0xF4, 0xFB,
|
||||
}
|
||||
for _, b := range dbfTypes {
|
||||
if raw[0] == b {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// ElfObj matches an object file.
|
||||
func ElfObj(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 17 && ((raw[16] == 0x01 && raw[17] == 0x00) ||
|
||||
(raw[16] == 0x00 && raw[17] == 0x01))
|
||||
}
|
||||
|
||||
// ElfExe matches an executable file.
|
||||
func ElfExe(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 17 && ((raw[16] == 0x02 && raw[17] == 0x00) ||
|
||||
(raw[16] == 0x00 && raw[17] == 0x02))
|
||||
}
|
||||
|
||||
// ElfLib matches a shared library file.
|
||||
func ElfLib(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 17 && ((raw[16] == 0x03 && raw[17] == 0x00) ||
|
||||
(raw[16] == 0x00 && raw[17] == 0x03))
|
||||
}
|
||||
|
||||
// ElfDump matches a core dump file.
|
||||
func ElfDump(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 17 && ((raw[16] == 0x04 && raw[17] == 0x00) ||
|
||||
(raw[16] == 0x00 && raw[17] == 0x04))
|
||||
}
|
||||
|
||||
// Dcm matches a DICOM medical format file.
|
||||
func Dcm(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 131 &&
|
||||
bytes.Equal(raw[128:132], []byte{0x44, 0x49, 0x43, 0x4D})
|
||||
}
|
||||
|
||||
// Marc matches a MARC21 (MAchine-Readable Cataloging) file.
|
||||
func Marc(raw []byte, limit uint32) bool {
|
||||
// File is at least 24 bytes ("leader" field size).
|
||||
if len(raw) < 24 {
|
||||
return false
|
||||
}
|
||||
|
||||
// Fixed bytes at offset 20.
|
||||
if !bytes.Equal(raw[20:24], []byte("4500")) {
|
||||
return false
|
||||
}
|
||||
|
||||
// First 5 bytes are ASCII digits.
|
||||
for i := 0; i < 5; i++ {
|
||||
if raw[i] < '0' || raw[i] > '9' {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Field terminator is present in first 2048 bytes.
|
||||
return bytes.Contains(raw[:min(2048, len(raw))], []byte{0x1E})
|
||||
}
|
||||
|
||||
// Glb matches a glTF model format file.
|
||||
// GLB is the binary file format representation of 3D models save in
|
||||
// the GL transmission Format (glTF).
|
||||
// see more: https://docs.fileformat.com/3d/glb/
|
||||
// https://www.iana.org/assignments/media-types/model/gltf-binary
|
||||
// GLB file format is based on little endian and its header structure
|
||||
// show below:
|
||||
//
|
||||
// <-- 12-byte header -->
|
||||
// | magic | version | length |
|
||||
// | (uint32) | (uint32) | (uint32) |
|
||||
// | \x67\x6C\x54\x46 | \x01\x00\x00\x00 | ... |
|
||||
// | g l T F | 1 | ... |
|
||||
var Glb = prefix([]byte("\x67\x6C\x54\x46\x02\x00\x00\x00"),
|
||||
[]byte("\x67\x6C\x54\x46\x01\x00\x00\x00"))
|
||||
|
||||
// TzIf matches a Time Zone Information Format (TZif) file.
|
||||
// See more: https://tools.ietf.org/id/draft-murchison-tzdist-tzif-00.html#rfc.section.3
|
||||
// Its header structure is shown below:
|
||||
// +---------------+---+
|
||||
// | magic (4) | <-+-- version (1)
|
||||
// +---------------+---+---------------------------------------+
|
||||
// | [unused - reserved for future use] (15) |
|
||||
// +---------------+---------------+---------------+-----------+
|
||||
// | isutccnt (4) | isstdcnt (4) | leapcnt (4) |
|
||||
// +---------------+---------------+---------------+
|
||||
// | timecnt (4) | typecnt (4) | charcnt (4) |
|
||||
func TzIf(raw []byte, limit uint32) bool {
|
||||
// File is at least 44 bytes (header size).
|
||||
if len(raw) < 44 {
|
||||
return false
|
||||
}
|
||||
|
||||
if !bytes.HasPrefix(raw, []byte("TZif")) {
|
||||
return false
|
||||
}
|
||||
|
||||
// Field "typecnt" MUST not be zero.
|
||||
if binary.BigEndian.Uint32(raw[36:40]) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
// Version has to be NUL (0x00), '2' (0x32) or '3' (0x33).
|
||||
return raw[4] == 0x00 || raw[4] == 0x32 || raw[4] == 0x33
|
||||
}
|
||||
13
vendor/github.com/wailsapp/mimetype/internal/magic/database.go
generated
vendored
Normal file
13
vendor/github.com/wailsapp/mimetype/internal/magic/database.go
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
package magic
|
||||
|
||||
var (
|
||||
// Sqlite matches an SQLite database file.
|
||||
Sqlite = prefix([]byte{
|
||||
0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66,
|
||||
0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00,
|
||||
})
|
||||
// MsAccessAce matches Microsoft Access dababase file.
|
||||
MsAccessAce = offset([]byte("Standard ACE DB"), 4)
|
||||
// MsAccessMdb matches legacy Microsoft Access database file (JET, 2003 and earlier).
|
||||
MsAccessMdb = offset([]byte("Standard Jet DB"), 4)
|
||||
)
|
||||
54
vendor/github.com/wailsapp/mimetype/internal/magic/document.go
generated
vendored
Normal file
54
vendor/github.com/wailsapp/mimetype/internal/magic/document.go
generated
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
package magic
|
||||
|
||||
import "bytes"
|
||||
|
||||
var (
|
||||
// Pdf matches a Portable Document Format file.
|
||||
Pdf = prefix([]byte{0x25, 0x50, 0x44, 0x46})
|
||||
// Fdf matches a Forms Data Format file.
|
||||
Fdf = prefix([]byte("%FDF"))
|
||||
// Mobi matches a Mobi file.
|
||||
Mobi = offset([]byte("BOOKMOBI"), 60)
|
||||
// Lit matches a Microsoft Lit file.
|
||||
Lit = prefix([]byte("ITOLITLS"))
|
||||
)
|
||||
|
||||
// DjVu matches a DjVu file.
|
||||
func DjVu(raw []byte, limit uint32) bool {
|
||||
if len(raw) < 12 {
|
||||
return false
|
||||
}
|
||||
if !bytes.HasPrefix(raw, []byte{0x41, 0x54, 0x26, 0x54, 0x46, 0x4F, 0x52, 0x4D}) {
|
||||
return false
|
||||
}
|
||||
return bytes.HasPrefix(raw[12:], []byte("DJVM")) ||
|
||||
bytes.HasPrefix(raw[12:], []byte("DJVU")) ||
|
||||
bytes.HasPrefix(raw[12:], []byte("DJVI")) ||
|
||||
bytes.HasPrefix(raw[12:], []byte("THUM"))
|
||||
}
|
||||
|
||||
// P7s matches an .p7s signature File (PEM, Base64).
|
||||
func P7s(raw []byte, limit uint32) bool {
|
||||
// Check for PEM Encoding.
|
||||
if bytes.HasPrefix(raw, []byte("-----BEGIN PKCS7")) {
|
||||
return true
|
||||
}
|
||||
// Check if DER Encoding is long enough.
|
||||
if len(raw) < 20 {
|
||||
return false
|
||||
}
|
||||
// Magic Bytes for the signedData ASN.1 encoding.
|
||||
startHeader := [][]byte{{0x30, 0x80}, {0x30, 0x81}, {0x30, 0x82}, {0x30, 0x83}, {0x30, 0x84}}
|
||||
signedDataMatch := []byte{0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07}
|
||||
// Check if Header is correct. There are multiple valid headers.
|
||||
for i, match := range startHeader {
|
||||
// If first bytes match, then check for ASN.1 Object Type.
|
||||
if bytes.HasPrefix(raw, match) {
|
||||
if bytes.HasPrefix(raw[i+2:], signedDataMatch) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
39
vendor/github.com/wailsapp/mimetype/internal/magic/font.go
generated
vendored
Normal file
39
vendor/github.com/wailsapp/mimetype/internal/magic/font.go
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
package magic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
)
|
||||
|
||||
var (
|
||||
// Woff matches a Web Open Font Format file.
|
||||
Woff = prefix([]byte("wOFF"))
|
||||
// Woff2 matches a Web Open Font Format version 2 file.
|
||||
Woff2 = prefix([]byte("wOF2"))
|
||||
// Otf matches an OpenType font file.
|
||||
Otf = prefix([]byte{0x4F, 0x54, 0x54, 0x4F, 0x00})
|
||||
)
|
||||
|
||||
// Ttf matches a TrueType font file.
|
||||
func Ttf(raw []byte, limit uint32) bool {
|
||||
if !bytes.HasPrefix(raw, []byte{0x00, 0x01, 0x00, 0x00}) {
|
||||
return false
|
||||
}
|
||||
return !MsAccessAce(raw, limit) && !MsAccessMdb(raw, limit)
|
||||
}
|
||||
|
||||
// Eot matches an Embedded OpenType font file.
|
||||
func Eot(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 35 &&
|
||||
bytes.Equal(raw[34:36], []byte{0x4C, 0x50}) &&
|
||||
(bytes.Equal(raw[8:11], []byte{0x02, 0x00, 0x01}) ||
|
||||
bytes.Equal(raw[8:11], []byte{0x01, 0x00, 0x00}) ||
|
||||
bytes.Equal(raw[8:11], []byte{0x02, 0x00, 0x02}))
|
||||
}
|
||||
|
||||
// Ttc matches a TrueType Collection font file.
|
||||
func Ttc(raw []byte, limit uint32) bool {
|
||||
return len(raw) > 7 &&
|
||||
bytes.HasPrefix(raw, []byte("ttcf")) &&
|
||||
(bytes.Equal(raw[4:8], []byte{0x00, 0x01, 0x00, 0x00}) ||
|
||||
bytes.Equal(raw[4:8], []byte{0x00, 0x02, 0x00, 0x00}))
|
||||
}
|
||||
57
vendor/github.com/wailsapp/mimetype/internal/magic/ftyp.go
generated
vendored
Normal file
57
vendor/github.com/wailsapp/mimetype/internal/magic/ftyp.go
generated
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
package magic
|
||||
|
||||
var (
|
||||
// AVIF matches an AV1 Image File Format still or animated.
|
||||
// Wikipedia page seems outdated listing image/avif-sequence for animations.
|
||||
// https://github.com/AOMediaCodec/av1-avif/issues/59
|
||||
AVIF = ftyp([]byte("avif"), []byte("avis"))
|
||||
// Mp4 matches an MP4 file.
|
||||
Mp4 = ftyp(
|
||||
[]byte("avc1"), []byte("dash"), []byte("iso2"), []byte("iso3"),
|
||||
[]byte("iso4"), []byte("iso5"), []byte("iso6"), []byte("isom"),
|
||||
[]byte("mmp4"), []byte("mp41"), []byte("mp42"), []byte("mp4v"),
|
||||
[]byte("mp71"), []byte("MSNV"), []byte("NDAS"), []byte("NDSC"),
|
||||
[]byte("NSDC"), []byte("NSDH"), []byte("NDSM"), []byte("NDSP"),
|
||||
[]byte("NDSS"), []byte("NDXC"), []byte("NDXH"), []byte("NDXM"),
|
||||
[]byte("NDXP"), []byte("NDXS"), []byte("F4V "), []byte("F4P "),
|
||||
)
|
||||
// ThreeGP matches a 3GPP file.
|
||||
ThreeGP = ftyp(
|
||||
[]byte("3gp1"), []byte("3gp2"), []byte("3gp3"), []byte("3gp4"),
|
||||
[]byte("3gp5"), []byte("3gp6"), []byte("3gp7"), []byte("3gs7"),
|
||||
[]byte("3ge6"), []byte("3ge7"), []byte("3gg6"),
|
||||
)
|
||||
// ThreeG2 matches a 3GPP2 file.
|
||||
ThreeG2 = ftyp(
|
||||
[]byte("3g24"), []byte("3g25"), []byte("3g26"), []byte("3g2a"),
|
||||
[]byte("3g2b"), []byte("3g2c"), []byte("KDDI"),
|
||||
)
|
||||
// AMp4 matches an audio MP4 file.
|
||||
AMp4 = ftyp(
|
||||
// audio for Adobe Flash Player 9+
|
||||
[]byte("F4A "), []byte("F4B "),
|
||||
// Apple iTunes AAC-LC (.M4A) Audio
|
||||
[]byte("M4B "), []byte("M4P "),
|
||||
// MPEG-4 (.MP4) for SonyPSP
|
||||
[]byte("MSNV"),
|
||||
// Nero Digital AAC Audio
|
||||
[]byte("NDAS"),
|
||||
)
|
||||
// QuickTime matches a QuickTime File Format file.
|
||||
QuickTime = ftyp([]byte("qt "), []byte("moov"))
|
||||
// Mqv matches a Sony / Mobile QuickTime file.
|
||||
Mqv = ftyp([]byte("mqt "))
|
||||
// M4a matches an audio M4A file.
|
||||
M4a = ftyp([]byte("M4A "))
|
||||
// M4v matches an Appl4 M4V video file.
|
||||
M4v = ftyp([]byte("M4V "), []byte("M4VH"), []byte("M4VP"))
|
||||
// Heic matches a High Efficiency Image Coding (HEIC) file.
|
||||
Heic = ftyp([]byte("heic"), []byte("heix"))
|
||||
// HeicSequence matches a High Efficiency Image Coding (HEIC) file sequence.
|
||||
HeicSequence = ftyp([]byte("hevc"), []byte("hevx"))
|
||||
// Heif matches a High Efficiency Image File Format (HEIF) file.
|
||||
Heif = ftyp([]byte("mif1"), []byte("heim"), []byte("heis"), []byte("avic"))
|
||||
// HeifSequence matches a High Efficiency Image File Format (HEIF) file sequence.
|
||||
HeifSequence = ftyp([]byte("msf1"), []byte("hevm"), []byte("hevs"), []byte("avcs"))
|
||||
// TODO: add support for remaining video formats at ftyps.com.
|
||||
)
|
||||
55
vendor/github.com/wailsapp/mimetype/internal/magic/geo.go
generated
vendored
Normal file
55
vendor/github.com/wailsapp/mimetype/internal/magic/geo.go
generated
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
package magic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
// Shp matches a shape format file.
|
||||
// https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf
|
||||
func Shp(raw []byte, limit uint32) bool {
|
||||
if len(raw) < 112 {
|
||||
return false
|
||||
}
|
||||
|
||||
if !(binary.BigEndian.Uint32(raw[0:4]) == 9994 &&
|
||||
binary.BigEndian.Uint32(raw[4:8]) == 0 &&
|
||||
binary.BigEndian.Uint32(raw[8:12]) == 0 &&
|
||||
binary.BigEndian.Uint32(raw[12:16]) == 0 &&
|
||||
binary.BigEndian.Uint32(raw[16:20]) == 0 &&
|
||||
binary.BigEndian.Uint32(raw[20:24]) == 0 &&
|
||||
binary.LittleEndian.Uint32(raw[28:32]) == 1000) {
|
||||
return false
|
||||
}
|
||||
|
||||
shapeTypes := []int{
|
||||
0, // Null shape
|
||||
1, // Point
|
||||
3, // Polyline
|
||||
5, // Polygon
|
||||
8, // MultiPoint
|
||||
11, // PointZ
|
||||
13, // PolylineZ
|
||||
15, // PolygonZ
|
||||
18, // MultiPointZ
|
||||
21, // PointM
|
||||
23, // PolylineM
|
||||
25, // PolygonM
|
||||
28, // MultiPointM
|
||||
31, // MultiPatch
|
||||
}
|
||||
|
||||
for _, st := range shapeTypes {
|
||||
if st == int(binary.LittleEndian.Uint32(raw[108:112])) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Shx matches a shape index format file.
|
||||
// https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf
|
||||
func Shx(raw []byte, limit uint32) bool {
|
||||
return bytes.HasPrefix(raw, []byte{0x00, 0x00, 0x27, 0x0A})
|
||||
}
|
||||
106
vendor/github.com/wailsapp/mimetype/internal/magic/image.go
generated
vendored
Normal file
106
vendor/github.com/wailsapp/mimetype/internal/magic/image.go
generated
vendored
Normal file
@@ -0,0 +1,106 @@
|
||||
package magic
|
||||
|
||||
import "bytes"
|
||||
|
||||
var (
|
||||
// Png matches a Portable Network Graphics file.
|
||||
// https://www.w3.org/TR/PNG/
|
||||
Png = prefix([]byte{0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A})
|
||||
// Apng matches an Animated Portable Network Graphics file.
|
||||
// https://wiki.mozilla.org/APNG_Specification
|
||||
Apng = offset([]byte("acTL"), 37)
|
||||
// Jpg matches a Joint Photographic Experts Group file.
|
||||
Jpg = prefix([]byte{0xFF, 0xD8, 0xFF})
|
||||
// Jp2 matches a JPEG 2000 Image file (ISO 15444-1).
|
||||
Jp2 = jpeg2k([]byte{0x6a, 0x70, 0x32, 0x20})
|
||||
// Jpx matches a JPEG 2000 Image file (ISO 15444-2).
|
||||
Jpx = jpeg2k([]byte{0x6a, 0x70, 0x78, 0x20})
|
||||
// Jpm matches a JPEG 2000 Image file (ISO 15444-6).
|
||||
Jpm = jpeg2k([]byte{0x6a, 0x70, 0x6D, 0x20})
|
||||
// Gif matches a Graphics Interchange Format file.
|
||||
Gif = prefix([]byte("GIF87a"), []byte("GIF89a"))
|
||||
// Bmp matches a bitmap image file.
|
||||
Bmp = prefix([]byte{0x42, 0x4D})
|
||||
// Ps matches a PostScript file.
|
||||
Ps = prefix([]byte("%!PS-Adobe-"))
|
||||
// Psd matches a Photoshop Document file.
|
||||
Psd = prefix([]byte("8BPS"))
|
||||
// Ico matches an ICO file.
|
||||
Ico = prefix([]byte{0x00, 0x00, 0x01, 0x00}, []byte{0x00, 0x00, 0x02, 0x00})
|
||||
// Icns matches an ICNS (Apple Icon Image format) file.
|
||||
Icns = prefix([]byte("icns"))
|
||||
// Tiff matches a Tagged Image File Format file.
|
||||
Tiff = prefix([]byte{0x49, 0x49, 0x2A, 0x00}, []byte{0x4D, 0x4D, 0x00, 0x2A})
|
||||
// Bpg matches a Better Portable Graphics file.
|
||||
Bpg = prefix([]byte{0x42, 0x50, 0x47, 0xFB})
|
||||
// Xcf matches GIMP image data.
|
||||
Xcf = prefix([]byte("gimp xcf"))
|
||||
// Pat matches GIMP pattern data.
|
||||
Pat = offset([]byte("GPAT"), 20)
|
||||
// Gbr matches GIMP brush data.
|
||||
Gbr = offset([]byte("GIMP"), 20)
|
||||
// Hdr matches Radiance HDR image.
|
||||
// https://web.archive.org/web/20060913152809/http://local.wasp.uwa.edu.au/~pbourke/dataformats/pic/
|
||||
Hdr = prefix([]byte("#?RADIANCE\n"))
|
||||
// Xpm matches X PixMap image data.
|
||||
Xpm = prefix([]byte{0x2F, 0x2A, 0x20, 0x58, 0x50, 0x4D, 0x20, 0x2A, 0x2F})
|
||||
)
|
||||
|
||||
func jpeg2k(sig []byte) Detector {
|
||||
return func(raw []byte, _ uint32) bool {
|
||||
if len(raw) < 24 {
|
||||
return false
|
||||
}
|
||||
|
||||
if !bytes.Equal(raw[4:8], []byte{0x6A, 0x50, 0x20, 0x20}) &&
|
||||
!bytes.Equal(raw[4:8], []byte{0x6A, 0x50, 0x32, 0x20}) {
|
||||
return false
|
||||
}
|
||||
return bytes.Equal(raw[20:24], sig)
|
||||
}
|
||||
}
|
||||
|
||||
// Webp matches a WebP file.
|
||||
func Webp(raw []byte, _ uint32) bool {
|
||||
return len(raw) > 12 &&
|
||||
bytes.Equal(raw[0:4], []byte("RIFF")) &&
|
||||
bytes.Equal(raw[8:12], []byte{0x57, 0x45, 0x42, 0x50})
|
||||
}
|
||||
|
||||
// Dwg matches a CAD drawing file.
|
||||
func Dwg(raw []byte, _ uint32) bool {
|
||||
if len(raw) < 6 || raw[0] != 0x41 || raw[1] != 0x43 {
|
||||
return false
|
||||
}
|
||||
dwgVersions := [][]byte{
|
||||
{0x31, 0x2E, 0x34, 0x30},
|
||||
{0x31, 0x2E, 0x35, 0x30},
|
||||
{0x32, 0x2E, 0x31, 0x30},
|
||||
{0x31, 0x30, 0x30, 0x32},
|
||||
{0x31, 0x30, 0x30, 0x33},
|
||||
{0x31, 0x30, 0x30, 0x34},
|
||||
{0x31, 0x30, 0x30, 0x36},
|
||||
{0x31, 0x30, 0x30, 0x39},
|
||||
{0x31, 0x30, 0x31, 0x32},
|
||||
{0x31, 0x30, 0x31, 0x34},
|
||||
{0x31, 0x30, 0x31, 0x35},
|
||||
{0x31, 0x30, 0x31, 0x38},
|
||||
{0x31, 0x30, 0x32, 0x31},
|
||||
{0x31, 0x30, 0x32, 0x34},
|
||||
{0x31, 0x30, 0x33, 0x32},
|
||||
}
|
||||
|
||||
for _, d := range dwgVersions {
|
||||
if bytes.Equal(raw[2:6], d) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Jxl matches JPEG XL image file.
|
||||
func Jxl(raw []byte, _ uint32) bool {
|
||||
return bytes.HasPrefix(raw, []byte{0xFF, 0x0A}) ||
|
||||
bytes.HasPrefix(raw, []byte("\x00\x00\x00\x0cJXL\x20\x0d\x0a\x87\x0a"))
|
||||
}
|
||||
232
vendor/github.com/wailsapp/mimetype/internal/magic/magic.go
generated
vendored
Normal file
232
vendor/github.com/wailsapp/mimetype/internal/magic/magic.go
generated
vendored
Normal file
@@ -0,0 +1,232 @@
|
||||
// Package magic holds the matching functions used to find MIME types.
|
||||
package magic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type (
|
||||
// Detector receiveѕ the raw data of a file and returns whether the data
|
||||
// meets any conditions. The limit parameter is an upper limit to the number
|
||||
// of bytes received and is used to tell if the byte slice represents the
|
||||
// whole file or is just the header of a file: len(raw) < limit or len(raw)>limit.
|
||||
Detector func(raw []byte, limit uint32) bool
|
||||
xmlSig struct {
|
||||
// the local name of the root tag
|
||||
localName []byte
|
||||
// the namespace of the XML document
|
||||
xmlns []byte
|
||||
}
|
||||
)
|
||||
|
||||
// prefix creates a Detector which returns true if any of the provided signatures
|
||||
// is the prefix of the raw input.
|
||||
func prefix(sigs ...[]byte) Detector {
|
||||
return func(raw []byte, limit uint32) bool {
|
||||
for _, s := range sigs {
|
||||
if bytes.HasPrefix(raw, s) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// offset creates a Detector which returns true if the provided signature can be
|
||||
// found at offset in the raw input.
|
||||
func offset(sig []byte, offset int) Detector {
|
||||
return func(raw []byte, limit uint32) bool {
|
||||
return len(raw) > offset && bytes.HasPrefix(raw[offset:], sig)
|
||||
}
|
||||
}
|
||||
|
||||
// ciPrefix is like prefix but the check is case insensitive.
|
||||
func ciPrefix(sigs ...[]byte) Detector {
|
||||
return func(raw []byte, limit uint32) bool {
|
||||
for _, s := range sigs {
|
||||
if ciCheck(s, raw) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
func ciCheck(sig, raw []byte) bool {
|
||||
if len(raw) < len(sig)+1 {
|
||||
return false
|
||||
}
|
||||
// perform case insensitive check
|
||||
for i, b := range sig {
|
||||
db := raw[i]
|
||||
if 'A' <= b && b <= 'Z' {
|
||||
db &= 0xDF
|
||||
}
|
||||
if b != db {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// xml creates a Detector which returns true if any of the provided XML signatures
|
||||
// matches the raw input.
|
||||
func xml(sigs ...xmlSig) Detector {
|
||||
return func(raw []byte, limit uint32) bool {
|
||||
raw = trimLWS(raw)
|
||||
if len(raw) == 0 {
|
||||
return false
|
||||
}
|
||||
for _, s := range sigs {
|
||||
if xmlCheck(s, raw) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
func xmlCheck(sig xmlSig, raw []byte) bool {
|
||||
raw = raw[:min(len(raw), 512)]
|
||||
|
||||
if len(sig.localName) == 0 {
|
||||
return bytes.Index(raw, sig.xmlns) > 0
|
||||
}
|
||||
if len(sig.xmlns) == 0 {
|
||||
return bytes.Index(raw, sig.localName) > 0
|
||||
}
|
||||
|
||||
localNameIndex := bytes.Index(raw, sig.localName)
|
||||
return localNameIndex != -1 && localNameIndex < bytes.Index(raw, sig.xmlns)
|
||||
}
|
||||
|
||||
// markup creates a Detector which returns true is any of the HTML signatures
|
||||
// matches the raw input.
|
||||
func markup(sigs ...[]byte) Detector {
|
||||
return func(raw []byte, limit uint32) bool {
|
||||
raw = trimLWS(raw)
|
||||
if len(raw) == 0 {
|
||||
return false
|
||||
}
|
||||
for _, s := range sigs {
|
||||
if markupCheck(s, raw) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
func markupCheck(sig, raw []byte) bool {
|
||||
if len(raw) < len(sig)+1 {
|
||||
return false
|
||||
}
|
||||
|
||||
// perform case insensitive check
|
||||
for i, b := range sig {
|
||||
db := raw[i]
|
||||
if 'A' <= b && b <= 'Z' {
|
||||
db &= 0xDF
|
||||
}
|
||||
if b != db {
|
||||
return false
|
||||
}
|
||||
}
|
||||
// Next byte must be space or right angle bracket.
|
||||
if db := raw[len(sig)]; db != ' ' && db != '>' {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// ftyp creates a Detector which returns true if any of the FTYP signatures
|
||||
// matches the raw input.
|
||||
func ftyp(sigs ...[]byte) Detector {
|
||||
return func(raw []byte, limit uint32) bool {
|
||||
if len(raw) < 12 {
|
||||
return false
|
||||
}
|
||||
for _, s := range sigs {
|
||||
if bytes.Equal(raw[4:12], append([]byte("ftyp"), s...)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func newXMLSig(localName, xmlns string) xmlSig {
|
||||
ret := xmlSig{xmlns: []byte(xmlns)}
|
||||
if localName != "" {
|
||||
ret.localName = []byte(fmt.Sprintf("<%s", localName))
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
// A valid shebang starts with the "#!" characters,
|
||||
// followed by any number of spaces,
|
||||
// followed by the path to the interpreter,
|
||||
// and, optionally, followed by the arguments for the interpreter.
|
||||
//
|
||||
// Ex:
|
||||
// #! /usr/bin/env php
|
||||
// /usr/bin/env is the interpreter, php is the first and only argument.
|
||||
func shebang(sigs ...[]byte) Detector {
|
||||
return func(raw []byte, limit uint32) bool {
|
||||
for _, s := range sigs {
|
||||
if shebangCheck(s, firstLine(raw)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func shebangCheck(sig, raw []byte) bool {
|
||||
if len(raw) < len(sig)+2 {
|
||||
return false
|
||||
}
|
||||
if raw[0] != '#' || raw[1] != '!' {
|
||||
return false
|
||||
}
|
||||
|
||||
return bytes.Equal(trimLWS(trimRWS(raw[2:])), sig)
|
||||
}
|
||||
|
||||
// trimLWS trims whitespace from beginning of the input.
|
||||
func trimLWS(in []byte) []byte {
|
||||
firstNonWS := 0
|
||||
for ; firstNonWS < len(in) && isWS(in[firstNonWS]); firstNonWS++ {
|
||||
}
|
||||
|
||||
return in[firstNonWS:]
|
||||
}
|
||||
|
||||
// trimRWS trims whitespace from the end of the input.
|
||||
func trimRWS(in []byte) []byte {
|
||||
lastNonWS := len(in) - 1
|
||||
for ; lastNonWS > 0 && isWS(in[lastNonWS]); lastNonWS-- {
|
||||
}
|
||||
|
||||
return in[:lastNonWS+1]
|
||||
}
|
||||
|
||||
func firstLine(in []byte) []byte {
|
||||
lineEnd := 0
|
||||
for ; lineEnd < len(in) && in[lineEnd] != '\n'; lineEnd++ {
|
||||
}
|
||||
|
||||
return in[:lineEnd]
|
||||
}
|
||||
|
||||
func isWS(b byte) bool {
|
||||
return b == '\t' || b == '\n' || b == '\x0c' || b == '\r' || b == ' '
|
||||
}
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
225
vendor/github.com/wailsapp/mimetype/internal/magic/ms_office.go
generated
vendored
Normal file
225
vendor/github.com/wailsapp/mimetype/internal/magic/ms_office.go
generated
vendored
Normal file
@@ -0,0 +1,225 @@
|
||||
package magic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
var (
|
||||
xlsxSigFiles = []string{
|
||||
"xl/worksheets/",
|
||||
"xl/drawings/",
|
||||
"xl/theme/",
|
||||
"xl/_rels/",
|
||||
"xl/styles.xml",
|
||||
"xl/workbook.xml",
|
||||
"xl/sharedStrings.xml",
|
||||
}
|
||||
docxSigFiles = []string{
|
||||
"word/media/",
|
||||
"word/_rels/document.xml.rels",
|
||||
"word/document.xml",
|
||||
"word/styles.xml",
|
||||
"word/fontTable.xml",
|
||||
"word/settings.xml",
|
||||
"word/numbering.xml",
|
||||
"word/header",
|
||||
"word/footer",
|
||||
}
|
||||
pptxSigFiles = []string{
|
||||
"ppt/slides/",
|
||||
"ppt/media/",
|
||||
"ppt/slideLayouts/",
|
||||
"ppt/theme/",
|
||||
"ppt/slideMasters/",
|
||||
"ppt/tags/",
|
||||
"ppt/notesMasters/",
|
||||
"ppt/_rels/",
|
||||
"ppt/handoutMasters/",
|
||||
"ppt/notesSlides/",
|
||||
"ppt/presentation.xml",
|
||||
"ppt/tableStyles.xml",
|
||||
"ppt/presProps.xml",
|
||||
"ppt/viewProps.xml",
|
||||
}
|
||||
)
|
||||
|
||||
// Xlsx matches a Microsoft Excel 2007 file.
|
||||
func Xlsx(raw []byte, limit uint32) bool {
|
||||
return zipContains(raw, xlsxSigFiles...)
|
||||
}
|
||||
|
||||
// Docx matches a Microsoft Word 2007 file.
|
||||
func Docx(raw []byte, limit uint32) bool {
|
||||
return zipContains(raw, docxSigFiles...)
|
||||
}
|
||||
|
||||
// Pptx matches a Microsoft PowerPoint 2007 file.
|
||||
func Pptx(raw []byte, limit uint32) bool {
|
||||
return zipContains(raw, pptxSigFiles...)
|
||||
}
|
||||
|
||||
// Ole matches an Open Linking and Embedding file.
|
||||
//
|
||||
// https://en.wikipedia.org/wiki/Object_Linking_and_Embedding
|
||||
func Ole(raw []byte, limit uint32) bool {
|
||||
return bytes.HasPrefix(raw, []byte{0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1})
|
||||
}
|
||||
|
||||
// Aaf matches an Advanced Authoring Format file.
|
||||
// See: https://pyaaf.readthedocs.io/en/latest/about.html
|
||||
// See: https://en.wikipedia.org/wiki/Advanced_Authoring_Format
|
||||
func Aaf(raw []byte, limit uint32) bool {
|
||||
if len(raw) < 31 {
|
||||
return false
|
||||
}
|
||||
return bytes.HasPrefix(raw[8:], []byte{0x41, 0x41, 0x46, 0x42, 0x0D, 0x00, 0x4F, 0x4D}) &&
|
||||
(raw[30] == 0x09 || raw[30] == 0x0C)
|
||||
}
|
||||
|
||||
// Doc matches a Microsoft Word 97-2003 file.
|
||||
// See: https://github.com/decalage2/oletools/blob/412ee36ae45e70f42123e835871bac956d958461/oletools/common/clsid.py
|
||||
func Doc(raw []byte, _ uint32) bool {
|
||||
clsids := [][]byte{
|
||||
// Microsoft Word 97-2003 Document (Word.Document.8)
|
||||
{0x06, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46},
|
||||
// Microsoft Word 6.0-7.0 Document (Word.Document.6)
|
||||
{0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46},
|
||||
// Microsoft Word Picture (Word.Picture.8)
|
||||
{0x07, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46},
|
||||
}
|
||||
|
||||
for _, clsid := range clsids {
|
||||
if matchOleClsid(raw, clsid) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Ppt matches a Microsoft PowerPoint 97-2003 file or a PowerPoint 95 presentation.
|
||||
func Ppt(raw []byte, limit uint32) bool {
|
||||
// Root CLSID test is the safest way to detect identify OLE, however, the format
|
||||
// often places the root CLSID at the end of the file.
|
||||
if matchOleClsid(raw, []byte{
|
||||
0x10, 0x8d, 0x81, 0x64, 0x9b, 0x4f, 0xcf, 0x11,
|
||||
0x86, 0xea, 0x00, 0xaa, 0x00, 0xb9, 0x29, 0xe8,
|
||||
}) || matchOleClsid(raw, []byte{
|
||||
0x70, 0xae, 0x7b, 0xea, 0x3b, 0xfb, 0xcd, 0x11,
|
||||
0xa9, 0x03, 0x00, 0xaa, 0x00, 0x51, 0x0e, 0xa3,
|
||||
}) {
|
||||
return true
|
||||
}
|
||||
|
||||
lin := len(raw)
|
||||
if lin < 520 {
|
||||
return false
|
||||
}
|
||||
pptSubHeaders := [][]byte{
|
||||
{0xA0, 0x46, 0x1D, 0xF0},
|
||||
{0x00, 0x6E, 0x1E, 0xF0},
|
||||
{0x0F, 0x00, 0xE8, 0x03},
|
||||
}
|
||||
for _, h := range pptSubHeaders {
|
||||
if bytes.HasPrefix(raw[512:], h) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
if bytes.HasPrefix(raw[512:], []byte{0xFD, 0xFF, 0xFF, 0xFF}) &&
|
||||
raw[518] == 0x00 && raw[519] == 0x00 {
|
||||
return true
|
||||
}
|
||||
|
||||
return lin > 1152 && bytes.Contains(raw[1152:min(4096, lin)],
|
||||
[]byte("P\x00o\x00w\x00e\x00r\x00P\x00o\x00i\x00n\x00t\x00 D\x00o\x00c\x00u\x00m\x00e\x00n\x00t"))
|
||||
}
|
||||
|
||||
// Xls matches a Microsoft Excel 97-2003 file.
|
||||
func Xls(raw []byte, limit uint32) bool {
|
||||
// Root CLSID test is the safest way to detect identify OLE, however, the format
|
||||
// often places the root CLSID at the end of the file.
|
||||
if matchOleClsid(raw, []byte{
|
||||
0x10, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
}) || matchOleClsid(raw, []byte{
|
||||
0x20, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
}) {
|
||||
return true
|
||||
}
|
||||
|
||||
lin := len(raw)
|
||||
if lin < 520 {
|
||||
return false
|
||||
}
|
||||
xlsSubHeaders := [][]byte{
|
||||
{0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05, 0x00},
|
||||
{0xFD, 0xFF, 0xFF, 0xFF, 0x10},
|
||||
{0xFD, 0xFF, 0xFF, 0xFF, 0x1F},
|
||||
{0xFD, 0xFF, 0xFF, 0xFF, 0x22},
|
||||
{0xFD, 0xFF, 0xFF, 0xFF, 0x23},
|
||||
{0xFD, 0xFF, 0xFF, 0xFF, 0x28},
|
||||
{0xFD, 0xFF, 0xFF, 0xFF, 0x29},
|
||||
}
|
||||
for _, h := range xlsSubHeaders {
|
||||
if bytes.HasPrefix(raw[512:], h) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return lin > 1152 && bytes.Contains(raw[1152:min(4096, lin)],
|
||||
[]byte("W\x00k\x00s\x00S\x00S\x00W\x00o\x00r\x00k\x00B\x00o\x00o\x00k"))
|
||||
}
|
||||
|
||||
// Pub matches a Microsoft Publisher file.
|
||||
func Pub(raw []byte, limit uint32) bool {
|
||||
return matchOleClsid(raw, []byte{
|
||||
0x01, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
|
||||
})
|
||||
}
|
||||
|
||||
// Msg matches a Microsoft Outlook email file.
|
||||
func Msg(raw []byte, limit uint32) bool {
|
||||
return matchOleClsid(raw, []byte{
|
||||
0x0B, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
|
||||
})
|
||||
}
|
||||
|
||||
// Msi matches a Microsoft Windows Installer file.
|
||||
// http://fileformats.archiveteam.org/wiki/Microsoft_Compound_File
|
||||
func Msi(raw []byte, limit uint32) bool {
|
||||
return matchOleClsid(raw, []byte{
|
||||
0x84, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
|
||||
})
|
||||
}
|
||||
|
||||
// Helper to match by a specific CLSID of a compound file.
|
||||
//
|
||||
// http://fileformats.archiveteam.org/wiki/Microsoft_Compound_File
|
||||
func matchOleClsid(in []byte, clsid []byte) bool {
|
||||
// Microsoft Compound files v3 have a sector length of 512, while v4 has 4096.
|
||||
// Change sector offset depending on file version.
|
||||
// https://www.loc.gov/preservation/digital/formats/fdd/fdd000392.shtml
|
||||
sectorLength := 512
|
||||
if len(in) < sectorLength {
|
||||
return false
|
||||
}
|
||||
if in[26] == 0x04 && in[27] == 0x00 {
|
||||
sectorLength = 4096
|
||||
}
|
||||
|
||||
// SecID of first sector of the directory stream.
|
||||
firstSecID := int(binary.LittleEndian.Uint32(in[48:52]))
|
||||
|
||||
// Expected offset of CLSID for root storage object.
|
||||
clsidOffset := sectorLength*(1+firstSecID) + 80
|
||||
|
||||
if len(in) <= clsidOffset+16 {
|
||||
return false
|
||||
}
|
||||
|
||||
return bytes.HasPrefix(in[clsidOffset:], clsid)
|
||||
}
|
||||
42
vendor/github.com/wailsapp/mimetype/internal/magic/ogg.go
generated
vendored
Normal file
42
vendor/github.com/wailsapp/mimetype/internal/magic/ogg.go
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
package magic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
)
|
||||
|
||||
/*
|
||||
NOTE:
|
||||
|
||||
In May 2003, two Internet RFCs were published relating to the format.
|
||||
The Ogg bitstream was defined in RFC 3533 (which is classified as
|
||||
'informative') and its Internet content type (application/ogg) in RFC
|
||||
3534 (which is, as of 2006, a proposed standard protocol). In
|
||||
September 2008, RFC 3534 was obsoleted by RFC 5334, which added
|
||||
content types video/ogg, audio/ogg and filename extensions .ogx, .ogv,
|
||||
.oga, .spx.
|
||||
|
||||
See:
|
||||
https://tools.ietf.org/html/rfc3533
|
||||
https://developer.mozilla.org/en-US/docs/Web/HTTP/Configuring_servers_for_Ogg_media#Serve_media_with_the_correct_MIME_type
|
||||
https://github.com/file/file/blob/master/magic/Magdir/vorbis
|
||||
*/
|
||||
|
||||
// Ogg matches an Ogg file.
|
||||
func Ogg(raw []byte, limit uint32) bool {
|
||||
return bytes.HasPrefix(raw, []byte("\x4F\x67\x67\x53\x00"))
|
||||
}
|
||||
|
||||
// OggAudio matches an audio ogg file.
|
||||
func OggAudio(raw []byte, limit uint32) bool {
|
||||
return len(raw) >= 37 && (bytes.HasPrefix(raw[28:], []byte("\x7fFLAC")) ||
|
||||
bytes.HasPrefix(raw[28:], []byte("\x01vorbis")) ||
|
||||
bytes.HasPrefix(raw[28:], []byte("OpusHead")) ||
|
||||
bytes.HasPrefix(raw[28:], []byte("Speex\x20\x20\x20")))
|
||||
}
|
||||
|
||||
// OggVideo matches a video ogg file.
|
||||
func OggVideo(raw []byte, limit uint32) bool {
|
||||
return len(raw) >= 37 && (bytes.HasPrefix(raw[28:], []byte("\x80theora")) ||
|
||||
bytes.HasPrefix(raw[28:], []byte("fishead\x00")) ||
|
||||
bytes.HasPrefix(raw[28:], []byte("\x01video\x00\x00\x00"))) // OGM video
|
||||
}
|
||||
376
vendor/github.com/wailsapp/mimetype/internal/magic/text.go
generated
vendored
Normal file
376
vendor/github.com/wailsapp/mimetype/internal/magic/text.go
generated
vendored
Normal file
@@ -0,0 +1,376 @@
|
||||
package magic
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/wailsapp/mimetype/internal/charset"
|
||||
"github.com/wailsapp/mimetype/internal/json"
|
||||
)
|
||||
|
||||
var (
|
||||
// HTML matches a Hypertext Markup Language file.
|
||||
HTML = markup(
|
||||
append([]byte{0xEF, 0xBB, 0xBF}, []byte("<!DOCTYPE HTML")...),
|
||||
[]byte("<!DOCTYPE HTML"),
|
||||
[]byte("<HTML"),
|
||||
[]byte("<HEAD"),
|
||||
[]byte("<SCRIPT"),
|
||||
[]byte("<IFRAME"),
|
||||
[]byte("<H1"),
|
||||
[]byte("<DIV"),
|
||||
[]byte("<FONT"),
|
||||
[]byte("<TABLE"),
|
||||
[]byte("<A"),
|
||||
[]byte("<STYLE"),
|
||||
[]byte("<TITLE"),
|
||||
[]byte("<B"),
|
||||
[]byte("<BODY"),
|
||||
[]byte("<BR"),
|
||||
[]byte("<P"),
|
||||
)
|
||||
// XML matches an Extensible Markup Language file.
|
||||
XML = markup([]byte("<?XML"))
|
||||
// Owl2 matches an Owl ontology file.
|
||||
Owl2 = xml(newXMLSig("Ontology", `xmlns="http://www.w3.org/2002/07/owl#"`))
|
||||
// Rss matches a Rich Site Summary file.
|
||||
Rss = xml(newXMLSig("rss", ""))
|
||||
// Atom matches an Atom Syndication Format file.
|
||||
Atom = xml(newXMLSig("feed", `xmlns="http://www.w3.org/2005/Atom"`))
|
||||
// Kml matches a Keyhole Markup Language file.
|
||||
Kml = xml(
|
||||
newXMLSig("kml", `xmlns="http://www.opengis.net/kml/2.2"`),
|
||||
newXMLSig("kml", `xmlns="http://earth.google.com/kml/2.0"`),
|
||||
newXMLSig("kml", `xmlns="http://earth.google.com/kml/2.1"`),
|
||||
newXMLSig("kml", `xmlns="http://earth.google.com/kml/2.2"`),
|
||||
)
|
||||
// Xliff matches a XML Localization Interchange File Format file.
|
||||
Xliff = xml(newXMLSig("xliff", `xmlns="urn:oasis:names:tc:xliff:document:1.2"`))
|
||||
// Collada matches a COLLAborative Design Activity file.
|
||||
Collada = xml(newXMLSig("COLLADA", `xmlns="http://www.collada.org/2005/11/COLLADASchema"`))
|
||||
// Gml matches a Geography Markup Language file.
|
||||
Gml = xml(
|
||||
newXMLSig("", `xmlns:gml="http://www.opengis.net/gml"`),
|
||||
newXMLSig("", `xmlns:gml="http://www.opengis.net/gml/3.2"`),
|
||||
newXMLSig("", `xmlns:gml="http://www.opengis.net/gml/3.3/exr"`),
|
||||
)
|
||||
// Gpx matches a GPS Exchange Format file.
|
||||
Gpx = xml(newXMLSig("gpx", `xmlns="http://www.topografix.com/GPX/1/1"`))
|
||||
// Tcx matches a Training Center XML file.
|
||||
Tcx = xml(newXMLSig("TrainingCenterDatabase", `xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2"`))
|
||||
// X3d matches an Extensible 3D Graphics file.
|
||||
X3d = xml(newXMLSig("X3D", `xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"`))
|
||||
// Amf matches an Additive Manufacturing XML file.
|
||||
Amf = xml(newXMLSig("amf", ""))
|
||||
// Threemf matches a 3D Manufacturing Format file.
|
||||
Threemf = xml(newXMLSig("model", `xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02"`))
|
||||
// Xfdf matches a XML Forms Data Format file.
|
||||
Xfdf = xml(newXMLSig("xfdf", `xmlns="http://ns.adobe.com/xfdf/"`))
|
||||
// VCard matches a Virtual Contact File.
|
||||
VCard = ciPrefix([]byte("BEGIN:VCARD\n"), []byte("BEGIN:VCARD\r\n"))
|
||||
// ICalendar matches a iCalendar file.
|
||||
ICalendar = ciPrefix([]byte("BEGIN:VCALENDAR\n"), []byte("BEGIN:VCALENDAR\r\n"))
|
||||
phpPageF = ciPrefix(
|
||||
[]byte("<?PHP"),
|
||||
[]byte("<?\n"),
|
||||
[]byte("<?\r"),
|
||||
[]byte("<? "),
|
||||
)
|
||||
phpScriptF = shebang(
|
||||
[]byte("/usr/local/bin/php"),
|
||||
[]byte("/usr/bin/php"),
|
||||
[]byte("/usr/bin/env php"),
|
||||
)
|
||||
// Js matches a Javascript file.
|
||||
Js = shebang(
|
||||
[]byte("/bin/node"),
|
||||
[]byte("/usr/bin/node"),
|
||||
[]byte("/bin/nodejs"),
|
||||
[]byte("/usr/bin/nodejs"),
|
||||
[]byte("/usr/bin/env node"),
|
||||
[]byte("/usr/bin/env nodejs"),
|
||||
)
|
||||
// Lua matches a Lua programming language file.
|
||||
Lua = shebang(
|
||||
[]byte("/usr/bin/lua"),
|
||||
[]byte("/usr/local/bin/lua"),
|
||||
[]byte("/usr/bin/env lua"),
|
||||
)
|
||||
// Perl matches a Perl programming language file.
|
||||
Perl = shebang(
|
||||
[]byte("/usr/bin/perl"),
|
||||
[]byte("/usr/bin/env perl"),
|
||||
)
|
||||
// Python matches a Python programming language file.
|
||||
Python = shebang(
|
||||
[]byte("/usr/bin/python"),
|
||||
[]byte("/usr/local/bin/python"),
|
||||
[]byte("/usr/bin/env python"),
|
||||
)
|
||||
// Tcl matches a Tcl programming language file.
|
||||
Tcl = shebang(
|
||||
[]byte("/usr/bin/tcl"),
|
||||
[]byte("/usr/local/bin/tcl"),
|
||||
[]byte("/usr/bin/env tcl"),
|
||||
[]byte("/usr/bin/tclsh"),
|
||||
[]byte("/usr/local/bin/tclsh"),
|
||||
[]byte("/usr/bin/env tclsh"),
|
||||
[]byte("/usr/bin/wish"),
|
||||
[]byte("/usr/local/bin/wish"),
|
||||
[]byte("/usr/bin/env wish"),
|
||||
)
|
||||
// Rtf matches a Rich Text Format file.
|
||||
Rtf = prefix([]byte("{\\rtf1"))
|
||||
)
|
||||
|
||||
// Text matches a plain text file.
|
||||
//
|
||||
// TODO: This function does not parse BOM-less UTF16 and UTF32 files. Not really
|
||||
// sure it should. Linux file utility also requires a BOM for UTF16 and UTF32.
|
||||
func Text(raw []byte, limit uint32) bool {
|
||||
// First look for BOM.
|
||||
if cset := charset.FromBOM(raw); cset != "" {
|
||||
return true
|
||||
}
|
||||
// Binary data bytes as defined here: https://mimesniff.spec.whatwg.org/#binary-data-byte
|
||||
for _, b := range raw {
|
||||
if b <= 0x08 ||
|
||||
b == 0x0B ||
|
||||
0x0E <= b && b <= 0x1A ||
|
||||
0x1C <= b && b <= 0x1F {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// Php matches a PHP: Hypertext Preprocessor file.
|
||||
func Php(raw []byte, limit uint32) bool {
|
||||
if res := phpPageF(raw, limit); res {
|
||||
return res
|
||||
}
|
||||
return phpScriptF(raw, limit)
|
||||
}
|
||||
|
||||
// JSON matches a JavaScript Object Notation file.
|
||||
func JSON(raw []byte, limit uint32) bool {
|
||||
raw = trimLWS(raw)
|
||||
// #175 A single JSON string, number or bool is not considered JSON.
|
||||
// JSON objects and arrays are reported as JSON.
|
||||
if len(raw) < 2 || (raw[0] != '[' && raw[0] != '{') {
|
||||
return false
|
||||
}
|
||||
parsed, err := json.Scan(raw)
|
||||
// If the full file content was provided, check there is no error.
|
||||
if limit == 0 || len(raw) < int(limit) {
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// If a section of the file was provided, check if all of it was parsed.
|
||||
return parsed == len(raw) && len(raw) > 0
|
||||
}
|
||||
|
||||
// GeoJSON matches a RFC 7946 GeoJSON file.
|
||||
//
|
||||
// GeoJSON detection implies searching for key:value pairs like: `"type": "Feature"`
|
||||
// in the input.
|
||||
// BUG(gabriel-vasile): The "type" key should be searched for in the root object.
|
||||
func GeoJSON(raw []byte, limit uint32) bool {
|
||||
raw = trimLWS(raw)
|
||||
if len(raw) == 0 {
|
||||
return false
|
||||
}
|
||||
// GeoJSON is always a JSON object, not a JSON array or any other JSON value.
|
||||
if raw[0] != '{' {
|
||||
return false
|
||||
}
|
||||
|
||||
s := []byte(`"type"`)
|
||||
si, sl := bytes.Index(raw, s), len(s)
|
||||
|
||||
if si == -1 {
|
||||
return false
|
||||
}
|
||||
|
||||
// If the "type" string is the suffix of the input,
|
||||
// there is no need to search for the value of the key.
|
||||
if si+sl == len(raw) {
|
||||
return false
|
||||
}
|
||||
// Skip the "type" part.
|
||||
raw = raw[si+sl:]
|
||||
// Skip any whitespace before the colon.
|
||||
raw = trimLWS(raw)
|
||||
// Check for colon.
|
||||
if len(raw) == 0 || raw[0] != ':' {
|
||||
return false
|
||||
}
|
||||
// Skip any whitespace after the colon.
|
||||
raw = trimLWS(raw[1:])
|
||||
|
||||
geoJSONTypes := [][]byte{
|
||||
[]byte(`"Feature"`),
|
||||
[]byte(`"FeatureCollection"`),
|
||||
[]byte(`"Point"`),
|
||||
[]byte(`"LineString"`),
|
||||
[]byte(`"Polygon"`),
|
||||
[]byte(`"MultiPoint"`),
|
||||
[]byte(`"MultiLineString"`),
|
||||
[]byte(`"MultiPolygon"`),
|
||||
[]byte(`"GeometryCollection"`),
|
||||
}
|
||||
for _, t := range geoJSONTypes {
|
||||
if bytes.HasPrefix(raw, t) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// NdJSON matches a Newline delimited JSON file. All complete lines from raw
|
||||
// must be valid JSON documents meaning they contain one of the valid JSON data
|
||||
// types.
|
||||
func NdJSON(raw []byte, limit uint32) bool {
|
||||
lCount, hasObjOrArr := 0, false
|
||||
sc := bufio.NewScanner(dropLastLine(raw, limit))
|
||||
for sc.Scan() {
|
||||
l := sc.Bytes()
|
||||
// Empty lines are allowed in NDJSON.
|
||||
if l = trimRWS(trimLWS(l)); len(l) == 0 {
|
||||
continue
|
||||
}
|
||||
_, err := json.Scan(l)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if l[0] == '[' || l[0] == '{' {
|
||||
hasObjOrArr = true
|
||||
}
|
||||
lCount++
|
||||
}
|
||||
|
||||
return lCount > 1 && hasObjOrArr
|
||||
}
|
||||
|
||||
// HAR matches a HAR Spec file.
|
||||
// Spec: http://www.softwareishard.com/blog/har-12-spec/
|
||||
func HAR(raw []byte, limit uint32) bool {
|
||||
s := []byte(`"log"`)
|
||||
si, sl := bytes.Index(raw, s), len(s)
|
||||
|
||||
if si == -1 {
|
||||
return false
|
||||
}
|
||||
|
||||
// If the "log" string is the suffix of the input,
|
||||
// there is no need to search for the value of the key.
|
||||
if si+sl == len(raw) {
|
||||
return false
|
||||
}
|
||||
// Skip the "log" part.
|
||||
raw = raw[si+sl:]
|
||||
// Skip any whitespace before the colon.
|
||||
raw = trimLWS(raw)
|
||||
// Check for colon.
|
||||
if len(raw) == 0 || raw[0] != ':' {
|
||||
return false
|
||||
}
|
||||
// Skip any whitespace after the colon.
|
||||
raw = trimLWS(raw[1:])
|
||||
|
||||
harJSONTypes := [][]byte{
|
||||
[]byte(`"version"`),
|
||||
[]byte(`"creator"`),
|
||||
[]byte(`"entries"`),
|
||||
}
|
||||
for _, t := range harJSONTypes {
|
||||
si := bytes.Index(raw, t)
|
||||
if si > -1 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Svg matches a SVG file.
|
||||
func Svg(raw []byte, limit uint32) bool {
|
||||
return bytes.Contains(raw, []byte("<svg"))
|
||||
}
|
||||
|
||||
// Srt matches a SubRip file.
|
||||
func Srt(in []byte, _ uint32) bool {
|
||||
s := bufio.NewScanner(bytes.NewReader(in))
|
||||
if !s.Scan() {
|
||||
return false
|
||||
}
|
||||
// First line must be 1.
|
||||
if s.Text() != "1" {
|
||||
return false
|
||||
}
|
||||
|
||||
if !s.Scan() {
|
||||
return false
|
||||
}
|
||||
secondLine := s.Text()
|
||||
// Timestamp format (e.g: 00:02:16,612 --> 00:02:19,376) limits secondLine
|
||||
// length to exactly 29 characters.
|
||||
if len(secondLine) != 29 {
|
||||
return false
|
||||
}
|
||||
// Decimal separator of fractional seconds in the timestamps must be a
|
||||
// comma, not a period.
|
||||
if strings.Contains(secondLine, ".") {
|
||||
return false
|
||||
}
|
||||
// For Go <1.17, comma is not recognised as a decimal separator by `time.Parse`.
|
||||
secondLine = strings.ReplaceAll(secondLine, ",", ".")
|
||||
// Second line must be a time range.
|
||||
ts := strings.Split(secondLine, " --> ")
|
||||
if len(ts) != 2 {
|
||||
return false
|
||||
}
|
||||
const layout = "15:04:05.000"
|
||||
t0, err := time.Parse(layout, ts[0])
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
t1, err := time.Parse(layout, ts[1])
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if t0.After(t1) {
|
||||
return false
|
||||
}
|
||||
|
||||
// A third line must exist and not be empty. This is the actual subtitle text.
|
||||
return s.Scan() && len(s.Bytes()) != 0
|
||||
}
|
||||
|
||||
// Vtt matches a Web Video Text Tracks (WebVTT) file. See
|
||||
// https://www.iana.org/assignments/media-types/text/vtt.
|
||||
func Vtt(raw []byte, limit uint32) bool {
|
||||
// Prefix match.
|
||||
prefixes := [][]byte{
|
||||
{0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x0A}, // UTF-8 BOM, "WEBVTT" and a line feed
|
||||
{0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x0D}, // UTF-8 BOM, "WEBVTT" and a carriage return
|
||||
{0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x20}, // UTF-8 BOM, "WEBVTT" and a space
|
||||
{0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x09}, // UTF-8 BOM, "WEBVTT" and a horizontal tab
|
||||
{0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x0A}, // "WEBVTT" and a line feed
|
||||
{0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x0D}, // "WEBVTT" and a carriage return
|
||||
{0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x20}, // "WEBVTT" and a space
|
||||
{0x57, 0x45, 0x42, 0x56, 0x54, 0x54, 0x09}, // "WEBVTT" and a horizontal tab
|
||||
}
|
||||
for _, p := range prefixes {
|
||||
if bytes.HasPrefix(raw, p) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// Exact match.
|
||||
return bytes.Equal(raw, []byte{0xEF, 0xBB, 0xBF, 0x57, 0x45, 0x42, 0x56, 0x54, 0x54}) || // UTF-8 BOM and "WEBVTT"
|
||||
bytes.Equal(raw, []byte{0x57, 0x45, 0x42, 0x56, 0x54, 0x54}) // "WEBVTT"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user