1package content
2
3import (
4 "strings"
5
6 "github.com/bnema/dumber/internal/application/dto"
7 "github.com/bnema/dumber/internal/application/port"
8 "github.com/bnema/dumber/internal/application/usecase"
9 "github.com/rs/zerolog"
10)
11
12func logBrowsingContextDecision(logger zerolog.Logger, req dto.NewBrowsingContextRequest, decision dto.HostDecision) {
13 logger.Debug().
14 Str("engine", string(req.Engine)).
15 Str("source_host", string(req.SourceHost)).
16 Str("decision", string(decision.Kind)).
17 Str("target_disposition", string(req.TargetDisposition)).
18 Str("reason_code", string(decision.ReasonCode)).
19 Msg("browsing context host decided")
20}
21
22func logBrowsingContextFailure(
23 logger zerolog.Logger,
24 req dto.NewBrowsingContextRequest,
25 decision dto.HostDecision,
26 code dto.BrowsingContextFailureCode,
27 err error,
28) {
29 logger.Error().Err(err).
30 Str("engine", string(req.Engine)).
31 Str("source_host", string(req.SourceHost)).
32 Str("decision", string(decision.Kind)).
33 Str("target_disposition", string(req.TargetDisposition)).
34 Str("reason_code", string(code)).
35 Msg("browsing context hosting failed")
36}
37
38func buildPopupBrowsingContextRequest(req port.PopupRequest) dto.NewBrowsingContextRequest {
39 return dto.NewBrowsingContextRequest{
40 ParentWebViewID: uint64(req.ParentViewID),
41 Engine: req.Engine,
42 SourceBrowserID: req.SourceBrowserID,
43 SourceFrameID: req.SourceFrameID,
44 SourceFrameURL: req.SourceFrameURL,
45 TargetURI: req.TargetURI,
46 TargetFrameName: req.FrameName,
47 TargetDisposition: inferPopupWindowDisposition(req),
48 IsUserGesture: req.IsUserGesture,
49 NoJavaScriptAccess: req.NoJavaScriptAccess,
50 PopupFeatures: req.PopupFeatures,
51 TriggerKind: inferPopupTriggerKind(req),
52 AuthIntent: IsOAuthURL(req.TargetURI),
53 RequiresNativeOpener: false,
54 RequestContextDisposition: dto.RequestContextInheritParent,
55 }
56}
57
58func buildLinkBrowsingContextRequest(parentWebViewID port.WebViewID, uri string) dto.NewBrowsingContextRequest {
59 return dto.NewBrowsingContextRequest{
60 ParentWebViewID: uint64(parentWebViewID),
61 TargetURI: uri,
62 TargetFrameName: "_blank",
63 TargetDisposition: dto.WindowDispositionNewTab,
64 IsUserGesture: true,
65 NoJavaScriptAccess: true,
66 TriggerKind: dto.TriggerLinkNewPage,
67 AuthIntent: IsOAuthURL(uri),
68 RequestContextDisposition: dto.RequestContextInheritParent,
69 }
70}
71
72func inferPopupWindowDisposition(req port.PopupRequest) dto.WindowDisposition {
73 if req.TargetDisposition != "" {
74 return req.TargetDisposition
75 }
76 if strings.EqualFold(strings.TrimSpace(req.FrameName), "_blank") {
77 return dto.WindowDispositionNewTab
78 }
79 return dto.WindowDispositionNewPopup
80}
81
82func inferPopupTriggerKind(req port.PopupRequest) dto.TriggerKind {
83 if usecase.ReusableBrowsingContextName(req.FrameName) != "" {
84 return dto.TriggerNamedTargetNavigation
85 }
86 switch inferPopupWindowDisposition(req) {
87 case dto.WindowDispositionCurrentTab, dto.WindowDispositionNewTab:
88 return dto.TriggerLinkNewPage
89 case dto.WindowDispositionNewPopup, dto.WindowDispositionNewWindow:
90 return dto.TriggerScriptWindowOpen
91 default:
92 return dto.TriggerUnknown
93 }
94}