content_injector_test.go RawHistoryFolder

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}

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