Skip to content

Commit 85e6dea

Browse files
committed
同步官方dc24628cff851ffa030cbe43068a9c33ed516159版本大部分内容
1 parent 3aa5eac commit 85e6dea

File tree

6 files changed

+37
-16
lines changed

6 files changed

+37
-16
lines changed

.idea/.gitignore

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ type WebView interface {
6161
// properly, webview will re-encode it for you.
6262
Navigate(url string)
6363

64+
// SetHtml sets the webview HTML directly.
65+
// The origin of the page is `about:blank`.
66+
SetHtml(html string)
67+
6468
// Init injects JavaScript code at the initialization of the new page. Every
6569
// time the webview will open a the new page - this initialization code will
6670
// be executed. It is guaranteed that code is executed before window.onload.

internal/w32/w32.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ var (
3333
User32DefWindowProcW = user32.NewProc("DefWindowProcW")
3434
User32GetClientRect = user32.NewProc("GetClientRect")
3535
User32PostQuitMessage = user32.NewProc("PostQuitMessage")
36+
User32PostMessageW = user32.NewProc("PostMessageW")
3637
User32SetWindowTextW = user32.NewProc("SetWindowTextW")
3738
User32PostThreadMessageW = user32.NewProc("PostThreadMessageW")
3839
User32GetWindowLongPtrW = user32.NewProc("GetWindowLongPtrW")
@@ -119,7 +120,7 @@ const (
119120

120121
const (
121122
WSOverlapped = 0x00000000
122-
WSMaximizeBox = 0x00020000
123+
WSMaximizeBox = 0x00010000
123124
WSThickFrame = 0x00040000
124125
WSCaption = 0x00C00000
125126
WSSysMenu = 0x00080000

pkg/edge/chromium.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,13 @@ func (e *Chromium) Navigate(url string) {
120120
)
121121
}
122122

123+
func (e *Chromium) NavigateToString(htmlContent string) {
124+
_, _, _ = e.webview.vtbl.NavigateToString.Call(
125+
uintptr(unsafe.Pointer(e.webview)),
126+
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(htmlContent))),
127+
)
128+
}
129+
123130
func (e *Chromium) Init(script string) {
124131
_, _, _ = e.webview.vtbl.AddScriptToExecuteOnDocumentCreated.Call(
125132
uintptr(unsafe.Pointer(e.webview)),

webview.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type browser interface {
4141
Embed(hWnd uintptr) bool
4242
Resize()
4343
Navigate(url string)
44+
NavigateToString(htmlContent string)
4445
Init(script string)
4546
Eval(script string)
4647
NotifyParentWindowPositionChanged() error
@@ -338,9 +339,9 @@ func (w *webview) CreateWithOptions(opts WindowOptions) bool {
338339
)
339340
setWindowContext(w.hWnd, w)
340341

341-
_, _, _ = w32.User32ShowWindow.Call(w.hWnd, w32.SWSHOWNOACTIVATE)
342-
_, _, _ = w32.User32ShowWindow.Call(w.hWnd, w32.SWSHOWMINIMIZED)
343-
_, _, _ = w32.User32ShowWindow.Call(w.hWnd, w32.SWMINIMIZE)
342+
_, _, _ = w32.User32ShowWindow.Call(w.hWnd, w32.SWShow)
343+
_, _, _ = w32.User32UpdateWindow.Call(w.hWnd)
344+
_, _, _ = w32.User32SetFocus.Call(w.hWnd)
344345

345346
_, _, _ = w32.User32UpdateWindow.Call(w.hWnd)
346347
_, _, _ = w32.User32SetFocus.Call(w.hWnd)
@@ -392,6 +393,10 @@ func (w *webview) Start(callback func()) {
392393
}
393394
}
394395

396+
func (w *webview) SetHtml(html string) {
397+
w.browser.NavigateToString(html)
398+
}
399+
395400
func (w *webview) Terminate() {
396401
_, _, _ = w32.User32PostQuitMessage.Call(0)
397402
}

webviewloader/module.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package webviewloader
33
import (
44
_ "embed"
55
"fmt"
6+
"github.com/jchv/go-winloader"
67
"golang.org/x/sys/windows/registry"
78
"io/ioutil"
89
"os"
@@ -13,7 +14,6 @@ import (
1314
"syscall"
1415
"unsafe"
1516

16-
"github.com/jchv/go-winloader"
1717
"golang.org/x/sys/windows"
1818
)
1919

@@ -79,26 +79,30 @@ func GetInstalledVersion() (string, error) {
7979
if nativeErr == nil {
8080
nativeErr = nativeGetAvailableCoreWebView2BrowserVersionString.Find()
8181
}
82-
var err error
82+
var hr uintptr
8383
var result *uint16
8484
if nativeErr != nil {
85-
err = loadFromMemory(nativeErr)
86-
if err != nil {
85+
if err := loadFromMemory(nativeErr); err != nil {
8786
return "", fmt.Errorf("Unable to load WebView2Loader.dll from disk: %v -- or from memory: %w", nativeErr, memErr)
8887
}
89-
_, _, err = memGetAvailableCoreWebView2BrowserVersionString.Call(
88+
hr64, _, _ := memGetAvailableCoreWebView2BrowserVersionString.Call(
9089
uint64(uintptr(unsafe.Pointer(nil))),
9190
uint64(uintptr(unsafe.Pointer(&result))))
91+
hr = uintptr(hr64) // The return size of the HRESULT will be whatver native size is (i.e uintptr) and not 64-bits on 32-bit systems. In both cases it should be interpreted as 32-bits (a LONG).
9292
} else {
93-
_, _, err = nativeCompareBrowserVersions.Call(
93+
hr, _, _ = nativeGetAvailableCoreWebView2BrowserVersionString.Call(
9494
uintptr(unsafe.Pointer(nil)),
9595
uintptr(unsafe.Pointer(&result)))
9696
}
97-
if err != nil {
98-
return "", err
97+
defer windows.CoTaskMemFree(unsafe.Pointer(result)) // Safe even if result is nil
98+
if hr != uintptr(windows.S_OK) {
99+
if hr&0xFFFF == uintptr(windows.ERROR_FILE_NOT_FOUND) {
100+
// The lower 16-bits (the error code itself) of the HRESULT is ERROR_FILE_NOT_FOUND which means the system isn't installed.
101+
return "", nil // Return a blank string but no error since we successfully detected no install.
102+
}
103+
return "", fmt.Errorf("GetAvailableCoreWebView2BrowserVersionString returned HRESULT 0x%X", hr)
99104
}
100-
version := windows.UTF16PtrToString(result)
101-
windows.CoTaskMemFree(unsafe.Pointer(result))
105+
version := windows.UTF16PtrToString(result) // Safe even if result is nil
102106
return version, nil
103107
}
104108

0 commit comments

Comments
 (0)