detached 7ba658b

refactor(M3): remove webkit type assertions from main.go

Add SetHandlerContext and InternalFilterManager to port.Engine interface,
implement both on webkit.Engine, and replace the two type assertions in
cmd/dumber/main.go so the webkit import can be dropped entirely.
commit
7ba658b60757d97582dd7292afbe10ecdc6d17fc
author
brice · · 2026-03-17 10:19 UTC
parent
5163049
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
3 files · +17 -12
M cmd/dumber/main.go +2 -11
@@ -24,7 +24,6 @@ import (
2424 "github.com/bnema/dumber/internal/infrastructure/idle"
2525 "github.com/bnema/dumber/internal/infrastructure/persistence/sqlite"
2626 "github.com/bnema/dumber/internal/infrastructure/updater"
27- "github.com/bnema/dumber/internal/infrastructure/webkit"
2827 "github.com/bnema/dumber/internal/infrastructure/xdg"
2928 "github.com/bnema/dumber/internal/logging"
3029 "github.com/bnema/dumber/internal/ui"
@@ -111,11 +110,7 @@ func runGUI() int {
111110 logging.Trace().UpdateLogger(log)
112111 logCoreDumpLimits(ctx)
113112
114- if wkEngine, ok := engine.(*webkit.Engine); ok {
115- if mr := wkEngine.InternalMessageRouter(); mr != nil {
116- mr.SetBaseContext(ctx)
117- }
118- }
113+ engine.SetHandlerContext(ctx)
119114
120115 useCases := createUseCases(repos, cfg)
121116 if needsEagerDB {
@@ -513,11 +508,7 @@ func buildUIDependencies(
513508 currentSessionID entity.SessionID,
514509 startupCrashReports []string,
515510 ) *ui.Dependencies {
516- // Type-assert to *webkit.Engine to access FilterManager (not yet on port.Engine).
517- var filterManager port.FilterManager
518- if wkEngine, ok := engine.(*webkit.Engine); ok {
519- filterManager = wkEngine.InternalFilterManager()
520- }
511+ filterManager := engine.InternalFilterManager()
521512
522513 return &ui.Dependencies{
523514 Ctx: ctx,
@@ -24,7 +24,6 @@ import (
24 "github.com/bnema/dumber/internal/infrastructure/idle"24 "github.com/bnema/dumber/internal/infrastructure/idle"
25 "github.com/bnema/dumber/internal/infrastructure/persistence/sqlite"25 "github.com/bnema/dumber/internal/infrastructure/persistence/sqlite"
26 "github.com/bnema/dumber/internal/infrastructure/updater"26 "github.com/bnema/dumber/internal/infrastructure/updater"
27- "github.com/bnema/dumber/internal/infrastructure/webkit"
28 "github.com/bnema/dumber/internal/infrastructure/xdg"27 "github.com/bnema/dumber/internal/infrastructure/xdg"
29 "github.com/bnema/dumber/internal/logging"28 "github.com/bnema/dumber/internal/logging"
30 "github.com/bnema/dumber/internal/ui"29 "github.com/bnema/dumber/internal/ui"
@@ -111,11 +110,7 @@ func runGUI() int {
111 logging.Trace().UpdateLogger(log)110 logging.Trace().UpdateLogger(log)
112 logCoreDumpLimits(ctx)111 logCoreDumpLimits(ctx)
113 112
114- if wkEngine, ok := engine.(*webkit.Engine); ok {113+ engine.SetHandlerContext(ctx)
115- if mr := wkEngine.InternalMessageRouter(); mr != nil {
116- mr.SetBaseContext(ctx)
117- }
118- }
119 114
120 useCases := createUseCases(repos, cfg)115 useCases := createUseCases(repos, cfg)
121 if needsEagerDB {116 if needsEagerDB {
@@ -513,11 +508,7 @@ func buildUIDependencies(
513 currentSessionID entity.SessionID,508 currentSessionID entity.SessionID,
514 startupCrashReports []string,509 startupCrashReports []string,
515 ) *ui.Dependencies {510 ) *ui.Dependencies {
516- // Type-assert to *webkit.Engine to access FilterManager (not yet on port.Engine).511+ filterManager := engine.InternalFilterManager()
517- var filterManager port.FilterManager
518- if wkEngine, ok := engine.(*webkit.Engine); ok {
519- filterManager = wkEngine.InternalFilterManager()
520- }
521 512
522 return &ui.Dependencies{513 return &ui.Dependencies{
523 Ctx: ctx,514 Ctx: ctx,
M internal/application/port/engine.go +7 -0
@@ -140,6 +140,13 @@ type Engine interface {
140140
141141 // UpdateSettings applies runtime config changes to engine internals.
142142 UpdateSettings(ctx context.Context, update EngineSettingsUpdate) error
143+
144+ // SetHandlerContext sets the base context for message handler dispatch.
145+ SetHandlerContext(ctx context.Context)
146+
147+ // InternalFilterManager returns the FilterManager for content filter lifecycle.
148+ // Returns nil if content filtering is not supported.
149+ InternalFilterManager() FilterManager
143150 }
144151
145152 // EngineSettingsUpdate carries a runtime config change to the engine.
@@ -140,6 +140,13 @@ type Engine interface {
140 140
141 // UpdateSettings applies runtime config changes to engine internals.141 // UpdateSettings applies runtime config changes to engine internals.
142 UpdateSettings(ctx context.Context, update EngineSettingsUpdate) error142 UpdateSettings(ctx context.Context, update EngineSettingsUpdate) error
143+
144+ // SetHandlerContext sets the base context for message handler dispatch.
145+ SetHandlerContext(ctx context.Context)
146+
147+ // InternalFilterManager returns the FilterManager for content filter lifecycle.
148+ // Returns nil if content filtering is not supported.
149+ InternalFilterManager() FilterManager
143 }150 }
144 151
145 // EngineSettingsUpdate carries a runtime config change to the engine.152 // EngineSettingsUpdate carries a runtime config change to the engine.
M internal/infrastructure/webkit/engine.go +8 -1
@@ -97,7 +97,14 @@ func (e *Engine) InternalInjector() *ContentInjector { return e.injector
9797 func (e *Engine) InternalMessageRouter() *MessageRouter { return e.messageRouter }
9898 func (e *Engine) InternalPool() *WebViewPool { return e.pool }
9999 func (e *Engine) InternalFactory() *WebViewFactory { return e.factory }
100-func (e *Engine) InternalFilterManager() *filtering.Manager { return e.filterManager }
100+func (e *Engine) InternalFilterManager() port.FilterManager { return e.filterManager }
101+
102+// SetHandlerContext sets the base context for message handler dispatch.
103+func (e *Engine) SetHandlerContext(ctx context.Context) {
104+ if e.messageRouter != nil {
105+ e.messageRouter.SetBaseContext(ctx)
106+ }
107+}
101108
102109 // RegisterHandlers registers all WebUI message bridge handlers.
103110 func (e *Engine) RegisterHandlers(ctx context.Context, deps port.HandlerDependencies) error {
@@ -97,7 +97,14 @@ func (e *Engine) InternalInjector() *ContentInjector { return e.injector
97 func (e *Engine) InternalMessageRouter() *MessageRouter { return e.messageRouter }97 func (e *Engine) InternalMessageRouter() *MessageRouter { return e.messageRouter }
98 func (e *Engine) InternalPool() *WebViewPool { return e.pool }98 func (e *Engine) InternalPool() *WebViewPool { return e.pool }
99 func (e *Engine) InternalFactory() *WebViewFactory { return e.factory }99 func (e *Engine) InternalFactory() *WebViewFactory { return e.factory }
100-func (e *Engine) InternalFilterManager() *filtering.Manager { return e.filterManager }100+func (e *Engine) InternalFilterManager() port.FilterManager { return e.filterManager }
101+
102+// SetHandlerContext sets the base context for message handler dispatch.
103+func (e *Engine) SetHandlerContext(ctx context.Context) {
104+ if e.messageRouter != nil {
105+ e.messageRouter.SetBaseContext(ctx)
106+ }
107+}
101 108
102 // RegisterHandlers registers all WebUI message bridge handlers.109 // RegisterHandlers registers all WebUI message bridge handlers.
103 func (e *Engine) RegisterHandlers(ctx context.Context, deps port.HandlerDependencies) error {110 func (e *Engine) RegisterHandlers(ctx context.Context, deps port.HandlerDependencies) error {

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