From f6e46ac1c3f3c0d066dde2915b590d8dce82ed6c Mon Sep 17 00:00:00 2001 From: stffabi Date: Sat, 12 Nov 2022 09:51:54 +0100 Subject: [PATCH] [debug] Introducing debug options for debug builds to allow opening the inspector on startup (#2080) --- .../frontend/desktop/darwin/inspector.go | 7 ++++ .../frontend/desktop/darwin/inspector_dev.go | 41 +++++++++++++++++++ v2/internal/frontend/desktop/darwin/window.go | 3 ++ v2/internal/frontend/desktop/linux/window.go | 9 +++- .../frontend/desktop/windows/frontend.go | 5 ++- .../windows/go-webview2/pkg/edge/chromium.go | 6 ++- .../go-webview2/pkg/edge/corewebview2.go | 11 +++++ v2/pkg/options/debug.go | 7 ++++ v2/pkg/options/options.go | 3 ++ website/docs/reference/options.mdx | 19 ++++++++- website/src/pages/changelog.mdx | 3 ++ 11 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 v2/internal/frontend/desktop/darwin/inspector.go create mode 100644 v2/internal/frontend/desktop/darwin/inspector_dev.go create mode 100644 v2/pkg/options/debug.go diff --git a/v2/internal/frontend/desktop/darwin/inspector.go b/v2/internal/frontend/desktop/darwin/inspector.go new file mode 100644 index 000000000..26086614a --- /dev/null +++ b/v2/internal/frontend/desktop/darwin/inspector.go @@ -0,0 +1,7 @@ +//go:build darwin && !dev + +package darwin + +func showInspector(context unsafe.Pointer) { + +} diff --git a/v2/internal/frontend/desktop/darwin/inspector_dev.go b/v2/internal/frontend/desktop/darwin/inspector_dev.go new file mode 100644 index 000000000..18850cd8e --- /dev/null +++ b/v2/internal/frontend/desktop/darwin/inspector_dev.go @@ -0,0 +1,41 @@ +//go:build darwin && dev + +package darwin + +// We are using private APIs here, make sure this is only included in a dev build and not in a production build. +// Otherwise the binary might get rejected by the AppReview-Team when pushing it to the AppStore. + +/* +#cgo CFLAGS: -x objective-c +#cgo LDFLAGS: -framework Foundation -framework Cocoa -framework WebKit +#import +#import "WailsContext.h" + +@interface _WKInspector : NSObject +- (void)show; +- (void)detach; +@end + +@interface WKWebView () +- (_WKInspector *)_inspector; +@end + +void showInspector(void *inctx) { + WailsContext *ctx = (__bridge WailsContext*) inctx; + + [ctx.webview._inspector show]; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + // Detach must be deferred a little bit and is ignored directly after a show. + [ctx.webview._inspector detach]; + }); +} +*/ +import "C" +import ( + "unsafe" +) + +func showInspector(context unsafe.Pointer) { + C.showInspector(context) +} diff --git a/v2/internal/frontend/desktop/darwin/window.go b/v2/internal/frontend/desktop/darwin/window.go index 6403c6ad3..88d0e3aa9 100644 --- a/v2/internal/frontend/desktop/darwin/window.go +++ b/v2/internal/frontend/desktop/darwin/window.go @@ -112,6 +112,9 @@ func NewWindow(frontendOptions *options.App, debugMode bool) *Window { result.SetApplicationMenu(frontendOptions.Menu) } + if debugMode && frontendOptions.Debug.OpenInspectorOnStartup { + showInspector(result.context) + } return result } diff --git a/v2/internal/frontend/desktop/linux/window.go b/v2/internal/frontend/desktop/linux/window.go index f414c0cf8..efde2d68e 100644 --- a/v2/internal/frontend/desktop/linux/window.go +++ b/v2/internal/frontend/desktop/linux/window.go @@ -232,10 +232,15 @@ GtkWidget* setupWebview(void* contentManager, GtkWindow* window, int hideWindowO return webview; } -void devtoolsEnabled(void* webview, int enabled) { +void devtoolsEnabled(void* webview, int enabled, bool showInspector) { WebKitSettings *settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(webview)); gboolean genabled = enabled == 1 ? true : false; webkit_settings_set_enable_developer_extras(settings, genabled); + + if (genabled && showInspector) { + WebKitWebInspector *inspector = webkit_web_view_get_inspector(WEBKIT_WEB_VIEW(webview)); + webkit_web_inspector_show(WEBKIT_WEB_INSPECTOR(inspector)); + } } void loadIndex(void* webview, char* url) { @@ -704,7 +709,7 @@ func NewWindow(appoptions *options.App, debug bool) *Window { C.connectButtons(unsafe.Pointer(webview)) if debug { - C.devtoolsEnabled(unsafe.Pointer(webview), C.int(1)) + C.devtoolsEnabled(unsafe.Pointer(webview), C.int(1), C.bool(appoptions.Debug.OpenInspectorOnStartup)) } else { C.DisableContextMenu(unsafe.Pointer(webview)) } diff --git a/v2/internal/frontend/desktop/windows/frontend.go b/v2/internal/frontend/desktop/windows/frontend.go index f5eb3b92d..208ab3ddb 100644 --- a/v2/internal/frontend/desktop/windows/frontend.go +++ b/v2/internal/frontend/desktop/windows/frontend.go @@ -443,7 +443,6 @@ func (f *Frontend) setupChromium() { if err != nil { log.Fatal(err) } - } err = settings.PutIsStatusBarEnabled(false) @@ -459,6 +458,10 @@ func (f *Frontend) setupChromium() { log.Fatal(err) } + if f.debug && f.frontendOptions.Debug.OpenInspectorOnStartup { + chromium.OpenDevToolsWindow() + } + // Setup focus event handler onFocus := f.mainWindow.OnSetFocus() onFocus.Bind(f.onFocus) diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go index 686b389e5..42ec06ac2 100644 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go +++ b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/chromium.go @@ -363,4 +363,8 @@ func (e *Chromium) PutZoomFactor(zoomFactor float64) { if err != nil { log.Fatal(err) } -} \ No newline at end of file +} + +func (e *Chromium) OpenDevToolsWindow() { + e.webview.OpenDevToolsWindow() +} diff --git a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go index 9cd7dc0c2..b8d819754 100644 --- a/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go +++ b/v2/internal/frontend/desktop/windows/go-webview2/pkg/edge/corewebview2.go @@ -469,3 +469,14 @@ func (i *ICoreWebView2) AddNavigationCompleted(eventHandler *ICoreWebView2Naviga } return nil } + +func (i *ICoreWebView2) OpenDevToolsWindow() error { + var err error + _, _, err = i.vtbl.OpenDevToolsWindow.Call( + uintptr(unsafe.Pointer(i)), + ) + if err != windows.ERROR_SUCCESS { + return err + } + return nil +} diff --git a/v2/pkg/options/debug.go b/v2/pkg/options/debug.go new file mode 100644 index 000000000..b1e989b9a --- /dev/null +++ b/v2/pkg/options/debug.go @@ -0,0 +1,7 @@ +package options + +// Debug options which are taken into account in debug builds. +type Debug struct { + // OpenInspectorOnStartup opens the inspector on startup of the app. + OpenInspectorOnStartup bool +} diff --git a/v2/pkg/options/options.go b/v2/pkg/options/options.go index e6ded464a..839440d4c 100644 --- a/v2/pkg/options/options.go +++ b/v2/pkg/options/options.go @@ -78,6 +78,9 @@ type App struct { // Experimental options Experimental *Experimental + + // Debug options for debug builds. These options will be ignored in a production build. + Debug Debug } type RGBA struct { diff --git a/website/docs/reference/options.mdx b/website/docs/reference/options.mdx index baeb92876..19b6fdfe7 100644 --- a/website/docs/reference/options.mdx +++ b/website/docs/reference/options.mdx @@ -102,6 +102,9 @@ func main() { Icon: icon, WindowIsTranslucent: false, }, + Debug: options.Debug{ + OpenInspectorOnStartup: false, + }, }) if err != nil { log.Fatal(err) @@ -821,4 +824,18 @@ Scaling is postponed until the last minute, when the desired final size is known Setting this to `true` will make the window background translucent. Some window managers may ignore it, or result in a black window. Name: WindowIsTranslucent
-Type: `bool` \ No newline at end of file +Type: `bool` + +### Debug + +This defines [Debug specific options](#Debug) that apply to debug builds. + +Name: Debug
+Type: `options.Debug` + +#### OpenInspectorOnStartup + +Setting this to `true` will open the WebInspector on startup of the application. + +Name: OpenInspectorOnStartup
+Type: `bool` diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 73fcce10a..725b77206 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -14,6 +14,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added +- Added `OpenInspectorOnStartup` to debug options to allow opening the WebInspector during startup of the application in debug mode. Added by @stffabi in [PR](https://github.com/wailsapp/wails/pull/2080) + ### Fixed - The `noreload` flag in wails dev wasn't applied. Fixed by @stffabi in this [PR](https://github.com/wailsapp/wails/pull/2081)