detached a8fd940

chore: address coderabbit cleanup suggestions

commit
a8fd940def0b1c98dfa39cb169222817a4e0c486
author
brice · · 2026-04-28 04:36 UTC
parent
0048f2e
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
5 files · +46 -43
M README.md +1 -1
@@ -85,7 +85,7 @@ To use it on Arch:
8585 sudo pacman -S cef
8686 ```
8787
88-Dumber uses `/usr/lib/cef` by default when available. Override via:
88+Dumber discovers CEF in the following order: `CEF_DIR` environment variable, `/usr/lib/cef`, or `~/.local/share/cef`. Override via:
8989
9090 ```toml
9191 [engine.cef]
@@ -85,7 +85,7 @@ To use it on Arch:
85 sudo pacman -S cef85 sudo pacman -S cef
86 ```86 ```
87 87
88-Dumber uses `/usr/lib/cef` by default when available. Override via:88+Dumber discovers CEF in the following order: `CEF_DIR` environment variable, `/usr/lib/cef`, or `~/.local/share/cef`. Override via:
89 89
90 ```toml90 ```toml
91 [engine.cef]91 [engine.cef]
M internal/domain/url/startup.go +5 -2
@@ -1,5 +1,7 @@
11 package url
22
3+import "strings"
4+
35 const defaultBrowserStartupURL = "dumb://history"
46
57 // DefaultBrowserStartupURL is the user-facing destination used when the browser
@@ -12,8 +14,9 @@ func DefaultBrowserStartupURL() string {
1214 // ResolveBrowserStartupURL returns the explicit URL when provided, otherwise
1315 // the global user-facing browser startup URL.
1416 func ResolveBrowserStartupURL(rawURL string) string {
15- if rawURL != "" {
16- return rawURL
17+ trimmed := strings.TrimSpace(rawURL)
18+ if trimmed != "" {
19+ return trimmed
1720 }
1821 return defaultBrowserStartupURL
1922 }
@@ -1,5 +1,7 @@
1 package url1 package url
2 2
3+import "strings"
4+
3 const defaultBrowserStartupURL = "dumb://history"5 const defaultBrowserStartupURL = "dumb://history"
4 6
5 // DefaultBrowserStartupURL is the user-facing destination used when the browser7 // DefaultBrowserStartupURL is the user-facing destination used when the browser
@@ -12,8 +14,9 @@ func DefaultBrowserStartupURL() string {
12 // ResolveBrowserStartupURL returns the explicit URL when provided, otherwise14 // ResolveBrowserStartupURL returns the explicit URL when provided, otherwise
13 // the global user-facing browser startup URL.15 // the global user-facing browser startup URL.
14 func ResolveBrowserStartupURL(rawURL string) string {16 func ResolveBrowserStartupURL(rawURL string) string {
15- if rawURL != "" {17+ trimmed := strings.TrimSpace(rawURL)
16- return rawURL18+ if trimmed != "" {
19+ return trimmed
17 }20 }
18 return defaultBrowserStartupURL21 return defaultBrowserStartupURL
19 }22 }
M internal/domain/url/startup_test.go +7 -0
@@ -16,6 +16,13 @@ func TestResolveBrowserStartupURL_DefaultsToHistory(t *testing.T) {
1616 }
1717 }
1818
19+func TestResolveBrowserStartupURL_WhitespaceOnlyDefaultsToHistory(t *testing.T) {
20+ got := ResolveBrowserStartupURL(" ")
21+ if got != "dumb://history" {
22+ t.Fatalf("expected default browser startup URL for whitespace-only input, got %q", got)
23+ }
24+}
25+
1926 func TestDefaultBrowserStartupURL(t *testing.T) {
2027 got := DefaultBrowserStartupURL()
2128 if got != "dumb://history" {
@@ -16,6 +16,13 @@ func TestResolveBrowserStartupURL_DefaultsToHistory(t *testing.T) {
16 }16 }
17 }17 }
18 18
19+func TestResolveBrowserStartupURL_WhitespaceOnlyDefaultsToHistory(t *testing.T) {
20+ got := ResolveBrowserStartupURL(" ")
21+ if got != "dumb://history" {
22+ t.Fatalf("expected default browser startup URL for whitespace-only input, got %q", got)
23+ }
24+}
25+
19 func TestDefaultBrowserStartupURL(t *testing.T) {26 func TestDefaultBrowserStartupURL(t *testing.T) {
20 got := DefaultBrowserStartupURL()27 got := DefaultBrowserStartupURL()
21 if got != "dumb://history" {28 if got != "dumb://history" {
M internal/infrastructure/cef/engine_init.go +1 -4
@@ -82,7 +82,6 @@ func NewEngine(
8282 return wireEngine(
8383 ctx,
8484 eng,
85- cfg,
8685 windowlessFrameRate,
8786 audioFactory,
8887 logger,
@@ -162,7 +161,7 @@ func initializeCEF(eng *Engine, settings purecef.Settings, logger *zerolog.Logge
162161
163162 // wireEngine creates GL loader, factory, pool, and scheme handler after CEF init.
164163 func wireEngine(
165- ctx context.Context, eng *Engine, _ RuntimeConfig,
164+ ctx context.Context, eng *Engine,
166165 windowlessFrameRate int32, audioFactory port.AudioOutputFactory, logger *zerolog.Logger,
167166 currentConfigPayload func() ([]byte, error), defaultConfigPayload func() ([]byte, error),
168167 ) (*Engine, error) {
@@ -199,7 +198,6 @@ func wireEngine(
199198 return eng, nil
200199 }
201200
202-
203201 func newEngineSchemeHandler(
204202 ctx context.Context,
205203 eng *Engine,
@@ -281,7 +279,6 @@ func registerEngineSchemeFactory(
281279 Msg("cef: registered internal https handler factory")
282280 }
283281
284-
285282 // getPrimaryMonitor returns the primary GDK monitor, or nil if unavailable.
286283 func getPrimaryMonitor() *gdk.Monitor {
287284 display := gdk.DisplayGetDefault()
@@ -82,7 +82,6 @@ func NewEngine(
82 return wireEngine(82 return wireEngine(
83 ctx,83 ctx,
84 eng,84 eng,
85- cfg,
86 windowlessFrameRate,85 windowlessFrameRate,
87 audioFactory,86 audioFactory,
88 logger,87 logger,
@@ -162,7 +161,7 @@ func initializeCEF(eng *Engine, settings purecef.Settings, logger *zerolog.Logge
162 161
163 // wireEngine creates GL loader, factory, pool, and scheme handler after CEF init.162 // wireEngine creates GL loader, factory, pool, and scheme handler after CEF init.
164 func wireEngine(163 func wireEngine(
165- ctx context.Context, eng *Engine, _ RuntimeConfig,164+ ctx context.Context, eng *Engine,
166 windowlessFrameRate int32, audioFactory port.AudioOutputFactory, logger *zerolog.Logger,165 windowlessFrameRate int32, audioFactory port.AudioOutputFactory, logger *zerolog.Logger,
167 currentConfigPayload func() ([]byte, error), defaultConfigPayload func() ([]byte, error),166 currentConfigPayload func() ([]byte, error), defaultConfigPayload func() ([]byte, error),
168 ) (*Engine, error) {167 ) (*Engine, error) {
@@ -199,7 +198,6 @@ func wireEngine(
199 return eng, nil198 return eng, nil
200 }199 }
201 200
202-
203 func newEngineSchemeHandler(201 func newEngineSchemeHandler(
204 ctx context.Context,202 ctx context.Context,
205 eng *Engine,203 eng *Engine,
@@ -281,7 +279,6 @@ func registerEngineSchemeFactory(
281 Msg("cef: registered internal https handler factory")279 Msg("cef: registered internal https handler factory")
282 }280 }
283 281
284-
285 // getPrimaryMonitor returns the primary GDK monitor, or nil if unavailable.282 // getPrimaryMonitor returns the primary GDK monitor, or nil if unavailable.
286 func getPrimaryMonitor() *gdk.Monitor {283 func getPrimaryMonitor() *gdk.Monitor {
287 display := gdk.DisplayGetDefault()284 display := gdk.DisplayGetDefault()
M internal/infrastructure/cef/scheme_handler_test.go +32 -36
@@ -49,6 +49,20 @@ func (panicFaviconService) EnsureDiskCache(context.Context, string) {
4949 }
5050 func (panicFaviconService) Close() {}
5151
52+// noopConfigPayload returns a builder that always returns an empty JSON object.
53+func noopConfigPayload() func() ([]byte, error) {
54+ return func() ([]byte, error) { return []byte(`{}`), nil }
55+}
56+
57+// newTestDumbSchemeHandler creates a dumbSchemeHandler with noop config payloads.
58+// It calls t.Helper() and fails the test if construction errors.
59+func newTestDumbSchemeHandler(t *testing.T) *dumbSchemeHandler {
60+ t.Helper()
61+ h, err := newDumbSchemeHandler(context.Background(), nil, noopConfigPayload(), noopConfigPayload())
62+ require.NoError(t, err)
63+ return h
64+}
65+
5266 func TestResolveConfigPayload_UsesInjectedBuilder(t *testing.T) {
5367 data, err := resolveConfigPayload(func() ([]byte, error) {
5468 return []byte(`{"engine_type":"cef"}`), nil
@@ -86,8 +100,7 @@ func TestNewDumbSchemeHandler_NilDefaultConfigPayloadFails(t *testing.T) {
86100 }
87101
88102 func TestRejectForbiddenAPIOrigin_AllowsInternalOrigin(t *testing.T) {
89- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
90- require.NoError(t, err)
103+ h := newTestDumbSchemeHandler(t)
91104
92105 request := cefmocks.NewMockRequest(t)
93106 request.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()
@@ -100,8 +113,7 @@ func TestRejectForbiddenAPIOrigin_RejectsExternalOrigin(t *testing.T) {
100113 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
101114 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
102115
103- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
104- require.NoError(t, err)
116+ h := newTestDumbSchemeHandler(t)
105117
106118 request := cefmocks.NewMockRequest(t)
107119 request.EXPECT().GetHeaderByName("Origin").Return("https://evil.example").Once()
@@ -124,8 +136,7 @@ func TestRejectUntrustedConfigRequesterRequiresTrustedOriginOrReferrer(t *testin
124136 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
125137 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
126138
127- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
128- require.NoError(t, err)
139+ h := newTestDumbSchemeHandler(t)
129140
130141 trustedOrigin := cefmocks.NewMockRequest(t)
131142 trustedOrigin.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()
@@ -214,8 +225,7 @@ func TestHandleConfigAPIOptionsUsesPrivateNoCORSHeaders(t *testing.T) {
214225 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
215226 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
216227
217- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
218- require.NoError(t, err)
228+ h := newTestDumbSchemeHandler(t)
219229
220230 request := cefmocks.NewMockRequest(t)
221231 request.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()
@@ -254,8 +264,7 @@ func TestIsTrustedSystemviewURL(t *testing.T) {
254264 }
255265
256266 func TestRejectUntrustedFaviconRequesterAllowsTrustedOriginWithoutReferrer(t *testing.T) {
257- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
258- require.NoError(t, err)
267+ h := newTestDumbSchemeHandler(t)
259268
260269 request := cefmocks.NewMockRequest(t)
261270 request.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()
@@ -268,8 +277,7 @@ func TestRejectUntrustedFaviconRequesterRejectsUntrustedOriginEvenWithTrustedRef
268277 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
269278 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
270279
271- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
272- require.NoError(t, err)
280+ h := newTestDumbSchemeHandler(t)
273281
274282 request := cefmocks.NewMockRequest(t)
275283 request.EXPECT().GetHeaderByName("Origin").Return("https://evil.example").Once()
@@ -282,8 +290,7 @@ func TestRejectUntrustedFaviconRequesterRequiresTrustedReferrerWhenOriginAbsent(
282290 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
283291 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
284292
285- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
286- require.NoError(t, err)
293+ h := newTestDumbSchemeHandler(t)
287294
288295 trusted := cefmocks.NewMockRequest(t)
289296 trusted.EXPECT().GetHeaderByName("Origin").Return("").Once()
@@ -302,8 +309,7 @@ func TestHandleFaviconAPIDefersFaviconDiskChecksUntilResourceOpen(t *testing.T)
302309 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
303310 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
304311
305- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
306- require.NoError(t, err)
312+ h := newTestDumbSchemeHandler(t)
307313 h.setFaviconService(panicFaviconService{})
308314
309315 request := cefmocks.NewMockRequest(t)
@@ -342,8 +348,7 @@ func TestSchemeHandler_APIClipboardSetPathWritesClipboardPayload(t *testing.T) {
342348 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
343349 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
344350
345- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
346- require.NoError(t, err)
351+ h := newTestDumbSchemeHandler(t)
347352
348353 const bridgeNonce = "bridge-nonce"
349354 browser := cefmocks.NewMockBrowser(t)
@@ -379,8 +384,7 @@ func TestSchemeHandler_APIFocusSyncRejectsRequestsWithoutTrustedBridgeHeader(t *
379384 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
380385 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
381386
382- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
383- require.NoError(t, err)
387+ h := newTestDumbSchemeHandler(t)
384388
385389 request := cefmocks.NewMockRequest(t)
386390 request.EXPECT().GetHeaderByName(dumberBridgeActionHeaderName).Return("").Once()
@@ -404,8 +408,7 @@ func TestSchemeHandler_APIFocusSyncInvokesEditableFocusCallback(t *testing.T) {
404408 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
405409 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
406410
407- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
408- require.NoError(t, err)
411+ h := newTestDumbSchemeHandler(t)
409412
410413 const bridgeNonce = "bridge-nonce"
411414 browser := cefmocks.NewMockBrowser(t)
@@ -440,8 +443,7 @@ func TestSchemeHandler_Create_ConceptualAPIRequestBypassesRedirect(t *testing.T)
440443 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
441444 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
442445
443- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
444- require.NoError(t, err)
446+ h := newTestDumbSchemeHandler(t)
445447
446448 const bridgeNonce = "bridge-nonce"
447449 browser := cefmocks.NewMockBrowser(t)
@@ -479,8 +481,7 @@ func TestSchemeHandler_APIClipboardSetRejectsInvalidBridgeNonce(t *testing.T) {
479481 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
480482 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
481483
482- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
483- require.NoError(t, err)
484+ h := newTestDumbSchemeHandler(t)
484485
485486 browser := cefmocks.NewMockBrowser(t)
486487 h.bridgeNonceValidator = func(_ purecef.Browser, _ string) bool { return false }
@@ -507,8 +508,7 @@ func TestSchemeHandler_APIPopupOpenInvokesPopupCallback(t *testing.T) {
507508 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
508509 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
509510
510- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
511- require.NoError(t, err)
511+ h := newTestDumbSchemeHandler(t)
512512
513513 const bridgeNonce = "bridge-nonce"
514514 browser := cefmocks.NewMockBrowser(t)
@@ -551,8 +551,7 @@ func TestSchemeHandler_APIPopupNavigateInvokesPopupCallback(t *testing.T) {
551551 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
552552 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
553553
554- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
555- require.NoError(t, err)
554+ h := newTestDumbSchemeHandler(t)
556555
557556 const bridgeNonce = "bridge-nonce"
558557 browser := cefmocks.NewMockBrowser(t)
@@ -592,8 +591,7 @@ func TestSchemeHandler_APIPopupCloseInvokesPopupCallback(t *testing.T) {
592591 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
593592 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
594593
595- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
596- require.NoError(t, err)
594+ h := newTestDumbSchemeHandler(t)
597595
598596 const bridgeNonce = "bridge-nonce"
599597 browser := cefmocks.NewMockBrowser(t)
@@ -690,8 +688,7 @@ func TestSchemeHandler_APIPopupBridgeRejectsInvalidPayloads(t *testing.T) {
690688
691689 for _, test := range tests {
692690 t.Run(test.name, func(t *testing.T) {
693- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
694- require.NoError(t, err)
691+ h := newTestDumbSchemeHandler(t)
695692
696693 const bridgeNonce = "bridge-nonce"
697694 browser := cefmocks.NewMockBrowser(t)
@@ -729,8 +726,7 @@ func TestSchemeHandler_APIOptionsReturnsCORSPreflightHeaders(t *testing.T) {
729726 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
730727 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
731728
732- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })
733- require.NoError(t, err)
729+ h := newTestDumbSchemeHandler(t)
734730
735731 request := cefmocks.NewMockRequest(t)
736732 response := cefmocks.NewMockResponse(t)
@@ -49,6 +49,20 @@ func (panicFaviconService) EnsureDiskCache(context.Context, string) {
49 }49 }
50 func (panicFaviconService) Close() {}50 func (panicFaviconService) Close() {}
51 51
52+// noopConfigPayload returns a builder that always returns an empty JSON object.
53+func noopConfigPayload() func() ([]byte, error) {
54+ return func() ([]byte, error) { return []byte(`{}`), nil }
55+}
56+
57+// newTestDumbSchemeHandler creates a dumbSchemeHandler with noop config payloads.
58+// It calls t.Helper() and fails the test if construction errors.
59+func newTestDumbSchemeHandler(t *testing.T) *dumbSchemeHandler {
60+ t.Helper()
61+ h, err := newDumbSchemeHandler(context.Background(), nil, noopConfigPayload(), noopConfigPayload())
62+ require.NoError(t, err)
63+ return h
64+}
65+
52 func TestResolveConfigPayload_UsesInjectedBuilder(t *testing.T) {66 func TestResolveConfigPayload_UsesInjectedBuilder(t *testing.T) {
53 data, err := resolveConfigPayload(func() ([]byte, error) {67 data, err := resolveConfigPayload(func() ([]byte, error) {
54 return []byte(`{"engine_type":"cef"}`), nil68 return []byte(`{"engine_type":"cef"}`), nil
@@ -86,8 +100,7 @@ func TestNewDumbSchemeHandler_NilDefaultConfigPayloadFails(t *testing.T) {
86 }100 }
87 101
88 func TestRejectForbiddenAPIOrigin_AllowsInternalOrigin(t *testing.T) {102 func TestRejectForbiddenAPIOrigin_AllowsInternalOrigin(t *testing.T) {
89- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })103+ h := newTestDumbSchemeHandler(t)
90- require.NoError(t, err)
91 104
92 request := cefmocks.NewMockRequest(t)105 request := cefmocks.NewMockRequest(t)
93 request.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()106 request.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()
@@ -100,8 +113,7 @@ func TestRejectForbiddenAPIOrigin_RejectsExternalOrigin(t *testing.T) {
100 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }113 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
101 defer func() { cefNewResourceHandler = oldNewResourceHandler }()114 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
102 115
103- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })116+ h := newTestDumbSchemeHandler(t)
104- require.NoError(t, err)
105 117
106 request := cefmocks.NewMockRequest(t)118 request := cefmocks.NewMockRequest(t)
107 request.EXPECT().GetHeaderByName("Origin").Return("https://evil.example").Once()119 request.EXPECT().GetHeaderByName("Origin").Return("https://evil.example").Once()
@@ -124,8 +136,7 @@ func TestRejectUntrustedConfigRequesterRequiresTrustedOriginOrReferrer(t *testin
124 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }136 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
125 defer func() { cefNewResourceHandler = oldNewResourceHandler }()137 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
126 138
127- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })139+ h := newTestDumbSchemeHandler(t)
128- require.NoError(t, err)
129 140
130 trustedOrigin := cefmocks.NewMockRequest(t)141 trustedOrigin := cefmocks.NewMockRequest(t)
131 trustedOrigin.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()142 trustedOrigin.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()
@@ -214,8 +225,7 @@ func TestHandleConfigAPIOptionsUsesPrivateNoCORSHeaders(t *testing.T) {
214 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }225 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
215 defer func() { cefNewResourceHandler = oldNewResourceHandler }()226 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
216 227
217- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })228+ h := newTestDumbSchemeHandler(t)
218- require.NoError(t, err)
219 229
220 request := cefmocks.NewMockRequest(t)230 request := cefmocks.NewMockRequest(t)
221 request.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()231 request.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()
@@ -254,8 +264,7 @@ func TestIsTrustedSystemviewURL(t *testing.T) {
254 }264 }
255 265
256 func TestRejectUntrustedFaviconRequesterAllowsTrustedOriginWithoutReferrer(t *testing.T) {266 func TestRejectUntrustedFaviconRequesterAllowsTrustedOriginWithoutReferrer(t *testing.T) {
257- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })267+ h := newTestDumbSchemeHandler(t)
258- require.NoError(t, err)
259 268
260 request := cefmocks.NewMockRequest(t)269 request := cefmocks.NewMockRequest(t)
261 request.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()270 request.EXPECT().GetHeaderByName("Origin").Return(actualInternalOrigin).Once()
@@ -268,8 +277,7 @@ func TestRejectUntrustedFaviconRequesterRejectsUntrustedOriginEvenWithTrustedRef
268 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }277 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
269 defer func() { cefNewResourceHandler = oldNewResourceHandler }()278 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
270 279
271- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })280+ h := newTestDumbSchemeHandler(t)
272- require.NoError(t, err)
273 281
274 request := cefmocks.NewMockRequest(t)282 request := cefmocks.NewMockRequest(t)
275 request.EXPECT().GetHeaderByName("Origin").Return("https://evil.example").Once()283 request.EXPECT().GetHeaderByName("Origin").Return("https://evil.example").Once()
@@ -282,8 +290,7 @@ func TestRejectUntrustedFaviconRequesterRequiresTrustedReferrerWhenOriginAbsent(
282 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }290 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
283 defer func() { cefNewResourceHandler = oldNewResourceHandler }()291 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
284 292
285- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })293+ h := newTestDumbSchemeHandler(t)
286- require.NoError(t, err)
287 294
288 trusted := cefmocks.NewMockRequest(t)295 trusted := cefmocks.NewMockRequest(t)
289 trusted.EXPECT().GetHeaderByName("Origin").Return("").Once()296 trusted.EXPECT().GetHeaderByName("Origin").Return("").Once()
@@ -302,8 +309,7 @@ func TestHandleFaviconAPIDefersFaviconDiskChecksUntilResourceOpen(t *testing.T)
302 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }309 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
303 defer func() { cefNewResourceHandler = oldNewResourceHandler }()310 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
304 311
305- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })312+ h := newTestDumbSchemeHandler(t)
306- require.NoError(t, err)
307 h.setFaviconService(panicFaviconService{})313 h.setFaviconService(panicFaviconService{})
308 314
309 request := cefmocks.NewMockRequest(t)315 request := cefmocks.NewMockRequest(t)
@@ -342,8 +348,7 @@ func TestSchemeHandler_APIClipboardSetPathWritesClipboardPayload(t *testing.T) {
342 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }348 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
343 defer func() { cefNewResourceHandler = oldNewResourceHandler }()349 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
344 350
345- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })351+ h := newTestDumbSchemeHandler(t)
346- require.NoError(t, err)
347 352
348 const bridgeNonce = "bridge-nonce"353 const bridgeNonce = "bridge-nonce"
349 browser := cefmocks.NewMockBrowser(t)354 browser := cefmocks.NewMockBrowser(t)
@@ -379,8 +384,7 @@ func TestSchemeHandler_APIFocusSyncRejectsRequestsWithoutTrustedBridgeHeader(t *
379 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }384 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
380 defer func() { cefNewResourceHandler = oldNewResourceHandler }()385 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
381 386
382- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })387+ h := newTestDumbSchemeHandler(t)
383- require.NoError(t, err)
384 388
385 request := cefmocks.NewMockRequest(t)389 request := cefmocks.NewMockRequest(t)
386 request.EXPECT().GetHeaderByName(dumberBridgeActionHeaderName).Return("").Once()390 request.EXPECT().GetHeaderByName(dumberBridgeActionHeaderName).Return("").Once()
@@ -404,8 +408,7 @@ func TestSchemeHandler_APIFocusSyncInvokesEditableFocusCallback(t *testing.T) {
404 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }408 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
405 defer func() { cefNewResourceHandler = oldNewResourceHandler }()409 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
406 410
407- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })411+ h := newTestDumbSchemeHandler(t)
408- require.NoError(t, err)
409 412
410 const bridgeNonce = "bridge-nonce"413 const bridgeNonce = "bridge-nonce"
411 browser := cefmocks.NewMockBrowser(t)414 browser := cefmocks.NewMockBrowser(t)
@@ -440,8 +443,7 @@ func TestSchemeHandler_Create_ConceptualAPIRequestBypassesRedirect(t *testing.T)
440 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }443 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
441 defer func() { cefNewResourceHandler = oldNewResourceHandler }()444 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
442 445
443- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })446+ h := newTestDumbSchemeHandler(t)
444- require.NoError(t, err)
445 447
446 const bridgeNonce = "bridge-nonce"448 const bridgeNonce = "bridge-nonce"
447 browser := cefmocks.NewMockBrowser(t)449 browser := cefmocks.NewMockBrowser(t)
@@ -479,8 +481,7 @@ func TestSchemeHandler_APIClipboardSetRejectsInvalidBridgeNonce(t *testing.T) {
479 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }481 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
480 defer func() { cefNewResourceHandler = oldNewResourceHandler }()482 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
481 483
482- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })484+ h := newTestDumbSchemeHandler(t)
483- require.NoError(t, err)
484 485
485 browser := cefmocks.NewMockBrowser(t)486 browser := cefmocks.NewMockBrowser(t)
486 h.bridgeNonceValidator = func(_ purecef.Browser, _ string) bool { return false }487 h.bridgeNonceValidator = func(_ purecef.Browser, _ string) bool { return false }
@@ -507,8 +508,7 @@ func TestSchemeHandler_APIPopupOpenInvokesPopupCallback(t *testing.T) {
507 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }508 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
508 defer func() { cefNewResourceHandler = oldNewResourceHandler }()509 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
509 510
510- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })511+ h := newTestDumbSchemeHandler(t)
511- require.NoError(t, err)
512 512
513 const bridgeNonce = "bridge-nonce"513 const bridgeNonce = "bridge-nonce"
514 browser := cefmocks.NewMockBrowser(t)514 browser := cefmocks.NewMockBrowser(t)
@@ -551,8 +551,7 @@ func TestSchemeHandler_APIPopupNavigateInvokesPopupCallback(t *testing.T) {
551 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }551 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
552 defer func() { cefNewResourceHandler = oldNewResourceHandler }()552 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
553 553
554- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })554+ h := newTestDumbSchemeHandler(t)
555- require.NoError(t, err)
556 555
557 const bridgeNonce = "bridge-nonce"556 const bridgeNonce = "bridge-nonce"
558 browser := cefmocks.NewMockBrowser(t)557 browser := cefmocks.NewMockBrowser(t)
@@ -592,8 +591,7 @@ func TestSchemeHandler_APIPopupCloseInvokesPopupCallback(t *testing.T) {
592 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }591 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
593 defer func() { cefNewResourceHandler = oldNewResourceHandler }()592 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
594 593
595- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })594+ h := newTestDumbSchemeHandler(t)
596- require.NoError(t, err)
597 595
598 const bridgeNonce = "bridge-nonce"596 const bridgeNonce = "bridge-nonce"
599 browser := cefmocks.NewMockBrowser(t)597 browser := cefmocks.NewMockBrowser(t)
@@ -690,8 +688,7 @@ func TestSchemeHandler_APIPopupBridgeRejectsInvalidPayloads(t *testing.T) {
690 688
691 for _, test := range tests {689 for _, test := range tests {
692 t.Run(test.name, func(t *testing.T) {690 t.Run(test.name, func(t *testing.T) {
693- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })691+ h := newTestDumbSchemeHandler(t)
694- require.NoError(t, err)
695 692
696 const bridgeNonce = "bridge-nonce"693 const bridgeNonce = "bridge-nonce"
697 browser := cefmocks.NewMockBrowser(t)694 browser := cefmocks.NewMockBrowser(t)
@@ -729,8 +726,7 @@ func TestSchemeHandler_APIOptionsReturnsCORSPreflightHeaders(t *testing.T) {
729 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }726 cefNewResourceHandler = func(impl purecef.ResourceHandler) purecef.ResourceHandler { return impl }
730 defer func() { cefNewResourceHandler = oldNewResourceHandler }()727 defer func() { cefNewResourceHandler = oldNewResourceHandler }()
731 728
732- h, err := newDumbSchemeHandler(context.Background(), nil, func() ([]byte, error) { return []byte(`{}`), nil }, func() ([]byte, error) { return []byte(`{}`), nil })729+ h := newTestDumbSchemeHandler(t)
733- require.NoError(t, err)
734 730
735 request := cefmocks.NewMockRequest(t)731 request := cefmocks.NewMockRequest(t)
736 response := cefmocks.NewMockResponse(t)732 response := cefmocks.NewMockResponse(t)

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close