Skip to content

Commit 0d62797

Browse files
committed
Fix run-mode behavior for web views
1 parent eb9fec3 commit 0d62797

4 files changed

Lines changed: 274 additions & 37 deletions

File tree

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ Force launch order for examples:
5252

5353
```bash
5454
zig build run -Dexample=fancy_window -Drun-mode=webview
55-
zig build run -Dexample=fancy_window -Drun-mode=browser
55+
zig build run -Dexample=fancy_window -Drun-mode=browser # browser app-window
56+
zig build run -Dexample=fancy_window -Drun-mode=web-tab # browser tab
5657
zig build run -Dexample=fancy_window -Drun-mode=webview,browser,web-url
5758
```
5859

@@ -312,7 +313,7 @@ On Linux this reports helper/runtime expectations such as:
312313
| `-Dminify-embedded-js=true` | `true` | Minifies the embedded runtime helper JS asset at build time. |
313314
| `-Dminify-written-js=true` | `false` | Minifies the written runtime helper JS output artifact. |
314315
| `-Dexample=<name>` | `all` | Selects which demo `zig build run` executes. |
315-
| `-Drun-mode=<launch-order>` | `webview,browser,web-url` | Example launch order. Supports presets (`webview`, `browser`, `web-url`) or explicit order (`webview,browser,web-url`, `browser,webview`, `web-url`). |
316+
| `-Drun-mode=<launch-order>` | `webview,browser,web-url` | Example launch order. Presets: `webview`, `browser` (app-window), `web-tab`, `web-url`. Also supports explicit order (`webview,browser,web-url`, `browser,webview`, `web-url`). |
316317
| `-Dtarget=<triple>` | host | Cross-compiles the library/examples for another target. |
317318

318319
Exported compile-time values:

build.zig

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,9 @@ pub fn build(b: *Build) void {
139139
const minify_embedded_js = b.option(bool, "minify-embedded-js", "Minify embedded JS helpers with pure Zig asset processing (default: true)") orelse true;
140140
const minify_written_js = b.option(bool, "minify-written-js", "Minify written JS helper assets with pure Zig asset processing (default: false)") orelse false;
141141
const selected_example = b.option(ExampleChoice, "example", "Example to run with `zig build run` (default: all)") orelse .all;
142-
const run_mode = b.option([]const u8, "run-mode", "Runtime launch order for examples. Accepts presets (`webview`, `browser`, `web-url`) or ordered tokens (`webview,browser,web-url`, `browser,webview`, etc). Default: webview,browser,web-url") orelse "webview,browser,web-url";
142+
const run_mode = b.option([]const u8, "run-mode", "Runtime launch order for examples. Presets: `webview`, `browser` (app-window), `web-tab`, `web-url`. Or ordered tokens (`webview,browser,web-url`, `browser,webview`, etc). Default: webview,browser,web-url") orelse "webview,browser,web-url";
143143
if (!isValidRunMode(run_mode)) {
144-
@panic("invalid -Drun-mode value: use `webview`, `browser`, `web-url`, or an ordered comma-separated combination of these tokens");
144+
@panic("invalid -Drun-mode value: use `webview`, `browser`, `web-tab`, `web-url`, or an ordered comma-separated combination");
145145
}
146146

147147
const runtime_helpers_assets = prepareRuntimeHelpersAssets(b, optimize, minify_embedded_js, minify_written_js);
@@ -553,14 +553,14 @@ fn prepareRuntimeHelpersAssets(
553553
}
554554

555555
fn isValidRunMode(mode: []const u8) bool {
556-
if (std.mem.eql(u8, mode, "webview") or std.mem.eql(u8, mode, "browser") or std.mem.eql(u8, mode, "web-url")) {
556+
if (std.mem.eql(u8, mode, "webview") or std.mem.eql(u8, mode, "browser") or std.mem.eql(u8, mode, "web-tab") or std.mem.eql(u8, mode, "web-url")) {
557557
return true;
558558
}
559559
if (std.mem.eql(u8, mode, "url") or std.mem.eql(u8, mode, "web")) return true;
560560

561561
var token_count: usize = 0;
562562
var seen_webview = false;
563-
var seen_browser = false;
563+
var seen_browser_surface = false;
564564
var seen_web_url = false;
565565

566566
var it = std.mem.tokenizeAny(u8, mode, ",> ");
@@ -575,9 +575,9 @@ fn isValidRunMode(mode: []const u8) bool {
575575
seen_webview = true;
576576
continue;
577577
}
578-
if (std.mem.eql(u8, token, "browser")) {
579-
if (seen_browser) return false;
580-
seen_browser = true;
578+
if (std.mem.eql(u8, token, "browser") or std.mem.eql(u8, token, "web-tab")) {
579+
if (seen_browser_surface) return false;
580+
seen_browser_surface = true;
581581
continue;
582582
}
583583
if (std.mem.eql(u8, token, "web-url") or std.mem.eql(u8, token, "url") or std.mem.eql(u8, token, "web")) {

examples/shared/demo_runner.zig

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,17 @@ pub const rpc_methods = struct {
5959
fn parseSurfaceToken(token: []const u8) ?webui.LaunchSurface {
6060
if (std.mem.eql(u8, token, "webview")) return .native_webview;
6161
if (std.mem.eql(u8, token, "browser")) return .browser_window;
62+
if (std.mem.eql(u8, token, "web-tab")) return .browser_window;
6263
if (std.mem.eql(u8, token, "web-url")) return .web_url;
6364
if (std.mem.eql(u8, token, "url")) return .web_url;
6465
if (std.mem.eql(u8, token, "web")) return .web_url;
6566
return null;
6667
}
6768

68-
fn launchPolicyFromRunMode() webui.LaunchPolicy {
69-
const mode = webui.BuildFlags.run_mode;
70-
69+
fn launchPolicyFromRunModeValue(mode: []const u8) webui.LaunchPolicy {
7170
if (std.mem.eql(u8, mode, "webview")) return webui.LaunchPolicy.webviewFirst();
7271
if (std.mem.eql(u8, mode, "browser")) return webui.LaunchPolicy.browserFirst();
72+
if (std.mem.eql(u8, mode, "web-tab")) return webui.LaunchPolicy.browserFirst();
7373
if (std.mem.eql(u8, mode, "web-url") or std.mem.eql(u8, mode, "url") or std.mem.eql(u8, mode, "web")) {
7474
return webui.LaunchPolicy.webUrlOnly();
7575
}
@@ -114,6 +114,30 @@ fn launchPolicyFromRunMode() webui.LaunchPolicy {
114114
return policy;
115115
}
116116

117+
fn launchPolicyFromRunMode() webui.LaunchPolicy {
118+
return launchPolicyFromRunModeValue(webui.BuildFlags.run_mode);
119+
}
120+
121+
const BrowserLaunchPreference = enum {
122+
auto,
123+
app_window,
124+
web_tab,
125+
};
126+
127+
fn browserLaunchPreferenceFromRunMode(mode: []const u8) BrowserLaunchPreference {
128+
if (std.mem.eql(u8, mode, "browser")) return .app_window;
129+
if (std.mem.eql(u8, mode, "web-tab")) return .web_tab;
130+
131+
var it = std.mem.tokenizeAny(u8, mode, ",> ");
132+
while (it.next()) |raw_token| {
133+
const token = std.mem.trim(u8, raw_token, " \t\r\n");
134+
if (token.len == 0) continue;
135+
if (std.mem.eql(u8, token, "browser")) return .app_window;
136+
if (std.mem.eql(u8, token, "web-tab")) return .web_tab;
137+
}
138+
return .auto;
139+
}
140+
117141
fn surfaceName(surface: webui.LaunchSurface) []const u8 {
118142
return switch (surface) {
119143
.native_webview => "native webview",
@@ -243,21 +267,44 @@ fn tagFor(comptime kind: ExampleKind) []const u8 {
243267
}
244268

245269
fn appOptionsFor(comptime kind: ExampleKind) webui.AppOptions {
246-
const launch_policy = launchPolicyFromRunMode();
270+
const run_mode = webui.BuildFlags.run_mode;
271+
const launch_policy = launchPolicyFromRunModeValue(run_mode);
272+
const launch_pref = browserLaunchPreferenceFromRunMode(run_mode);
247273
const native_first = launch_policy.first == .native_webview;
274+
var require_app_window = native_first;
275+
var allow_system_fallback = !native_first;
276+
switch (launch_pref) {
277+
.app_window => {
278+
require_app_window = true;
279+
allow_system_fallback = false;
280+
},
281+
.web_tab => {
282+
require_app_window = false;
283+
allow_system_fallback = true;
284+
},
285+
.auto => {},
286+
}
287+
248288
return .{
249289
.launch_policy = launch_policy,
250290
.enable_tls = webui.BuildFlags.enable_tls,
251291
.enable_webui_log = true,
252292
.public_network = kind == .public_network,
253293
.browser_launch = .{
254-
.require_app_mode_window = native_first,
255-
.allow_system_fallback = !native_first,
294+
.require_app_mode_window = require_app_window,
295+
.allow_system_fallback = allow_system_fallback,
256296
},
257297
.window_fallback_emulation = !native_first,
258298
};
259299
}
260300

301+
test "run-mode browser launch preference parser supports web-tab" {
302+
try std.testing.expectEqual(BrowserLaunchPreference.app_window, browserLaunchPreferenceFromRunMode("browser"));
303+
try std.testing.expectEqual(BrowserLaunchPreference.web_tab, browserLaunchPreferenceFromRunMode("web-tab"));
304+
try std.testing.expectEqual(BrowserLaunchPreference.web_tab, browserLaunchPreferenceFromRunMode("webview,web-tab,web-url"));
305+
try std.testing.expectEqual(BrowserLaunchPreference.auto, browserLaunchPreferenceFromRunMode("web-url"));
306+
}
307+
261308
fn styleFor(comptime kind: ExampleKind) webui.WindowStyle {
262309
return switch (kind) {
263310
.frameless => .{

0 commit comments

Comments
 (0)