1package cef
2
3import (
4 "context"
5 "testing"
6
7 "github.com/stretchr/testify/require"
8)
9
10func testTrustedPageFetchBridgeJS() string {
11 return buildTrustedPageFetchBridgeJS("test-bridge-nonce")
12}
13
14func TestClipboardSelectionFetchBridgeJS_CapturesInputAndTextareaSelections(t *testing.T) {
15 script := testTrustedPageFetchBridgeJS()
16
17 require.Contains(t, script, "document.activeElement")
18 require.Contains(t, script, "selectionStart")
19 require.Contains(t, script, "selectionEnd")
20 require.Contains(t, script, "window.getSelection()")
21 require.Contains(t, script, "type !== 'password'")
22}
23
24func TestClipboardSelectionFetchBridgeJS_PostsTrustedFocusSyncRequests(t *testing.T) {
25 script := testTrustedPageFetchBridgeJS()
26
27 require.Contains(t, script, "dumb:///api/focus-sync")
28 require.Contains(t, script, "X-Dumber-Bridge-Action")
29 require.Contains(t, script, "X-Dumber-Bridge-Nonce")
30 require.Contains(t, script, "focus-sync")
31 require.Contains(t, script, "focusin")
32 require.Contains(t, script, "event.isTrusted === false")
33 require.Contains(t, script, "event && event.target")
34 require.Contains(t, script, "document.activeElement")
35 require.Contains(t, script, "isEditable(document.activeElement)")
36 require.Contains(t, script, "sendFocusSync()")
37}
38
39func TestClipboardSelectionFetchBridgeJS_HandlesTrustedClipboardEvents(t *testing.T) {
40 script := testTrustedPageFetchBridgeJS()
41
42 require.Contains(t, script, "dumb:///api/clipboard-set")
43 require.Contains(t, script, "X-Dumber-Body")
44 require.Contains(t, script, "X-Dumber-Bridge-Nonce")
45 require.Contains(t, script, "document.addEventListener('copy', function(event)")
46 require.Contains(t, script, "document.addEventListener('cut', function(event)")
47 require.Contains(t, script, "event.isTrusted === false")
48}
49
50func TestClipboardSelectionFetchBridgeJS_PatchesAsyncClipboardAPIs(t *testing.T) {
51 script := testTrustedPageFetchBridgeJS()
52
53 require.Contains(t, script, "navigator && navigator.clipboard")
54 require.Contains(t, script, "clipboardProto.writeText")
55 require.Contains(t, script, "clipboardObj.writeText")
56 require.Contains(t, script, "clipboardProto.write")
57 require.Contains(t, script, "clipboardObj.write")
58 require.Contains(t, script, "sendToClipboard(normalized)")
59 require.Contains(t, script, "mirrorClipboardItems(items)")
60 require.NotContains(t, script, "__DUMBER_BRIDGE_NONCE__")
61 require.NotContains(t, script, "__dumberClipboardBridge")
62 require.NotContains(t, script, "setBridgeNonce")
63 require.Contains(t, script, "test-bridge-nonce")
64}
65
66func TestTrustedPageFetchBridgeJS_DoesNotShimWindowOpen(t *testing.T) {
67 script := testTrustedPageFetchBridgeJS()
68
69 require.NotContains(t, script, "window.__dumberPopupBridgePatched")
70 require.NotContains(t, script, "window.open = function(url, target, features)")
71 require.NotContains(t, script, "dumb:///api/popup-open")
72 require.NotContains(t, script, "dumb:///api/popup-navigate")
73 require.NotContains(t, script, "dumb:///api/popup-close")
74 require.NotContains(t, script, "createSyntheticPopupProxy")
75 require.Contains(t, script, "test-bridge-nonce")
76 require.NotContains(t, script, "__DUMBER_BRIDGE_NONCE__")
77}
78
79func TestPopupOpenerBridgeScript_InstallsSyntheticOpenerCallbacks(t *testing.T) {
80 parent := &WebView{ctx: context.Background()}
81 parent.updateURI("https://example.com/app")
82 popup := &WebView{ctx: context.Background(), popupOpenerBridgeParent: parent, popupOpenerBridgeParentURI: "https://example.com/app"}
83
84 script := popup.popupOpenerBridgeScript("bridge-nonce")
85
86 require.Contains(t, script, "window.__dumberPopupOpenerBridgeInstalled")
87 require.Contains(t, script, "popup-opener-navigate")
88 require.Contains(t, script, "popup-opener-post-message")
89 require.Contains(t, script, "Object.defineProperty(window, 'opener'")
90 require.Contains(t, script, "https://example.com/app")
91 require.Contains(t, script, "bridge-nonce")
92}