controls.ts RawHistoryFolder
1/**
2 * Browser Controls Module
3 *
4 * Provides global keyboard and mouse controls that work on all domains.
5 * Only includes essential controls that can work cross-origin:
6 * - Navigation (back/forward)
7 * - Mouse navigation buttons
8 *
9 * Zoom controls are handled natively by the GTK backend
10 */
11
12export interface ControlsConfig {
13 // Future configuration options can be added here
14 _placeholder?: never; // Prevent empty interface warning
15}
16
17let controlsInitialized = false;
18
19export function initializeControls(_config?: ControlsConfig): void {
20 if (controlsInitialized) {
21 console.log('🔄 Browser controls already initialized, skipping');
22 return;
23 }
24
25 console.log('🚀 Initializing browser controls on:', window.location.href);
26
27 // Keyboard event handler for global controls
28 function handleKeyboardEvent(event: KeyboardEvent): void {
29 const { altKey, key } = event;
30 // Note: ctrlKey, metaKey reserved for future use
31
32 try {
33 // Navigation: Alt + Left Arrow (Back)
34 if (altKey && key === 'ArrowLeft') {
35 event.preventDefault();
36 event.stopPropagation();
37
38 if (window.history.length > 1) {
39 console.log('⬅️ Navigating back');
40 window.history.back();
41 }
42 return;
43 }
44
45 // Navigation: Alt + Right Arrow (Forward)
46 if (altKey && key === 'ArrowRight') {
47 event.preventDefault();
48 event.stopPropagation();
49
50 console.log('➡️ Navigating forward');
51 window.history.forward();
52 return;
53 }
54
55 } catch (error) {
56 console.error('❌ Error in keyboard handler:', error);
57 }
58 }
59
60 // Mouse event handler for navigation buttons
61 function handleMouseEvent(event: MouseEvent): void {
62 try {
63 // Mouse button 3 (back button)
64 if (event.button === 3) {
65 event.preventDefault();
66 event.stopPropagation();
67
68 if (window.history.length > 1) {
69 console.log('⬅️ Mouse back button pressed');
70 window.history.back();
71 }
72 return;
73 }
74
75 // Mouse button 4 (forward button)
76 if (event.button === 4) {
77 event.preventDefault();
78 event.stopPropagation();
79
80 console.log('➡️ Mouse forward button pressed');
81 window.history.forward();
82 return;
83 }
84
85 } catch (error) {
86 console.error('❌ Error in mouse handler:', error);
87 }
88 }
89
90 // Add event listeners with high priority (capture phase)
91 try {
92 document.addEventListener('keydown', handleKeyboardEvent, true);
93 document.addEventListener('mousedown', handleMouseEvent, true);
94
95 controlsInitialized = true;
96 console.log('✅ Browser controls initialized');
97
98 // Cleanup function for when page is unloaded
99 window.addEventListener('beforeunload', () => {
100 document.removeEventListener('keydown', handleKeyboardEvent, true);
101 document.removeEventListener('mousedown', handleMouseEvent, true);
102 controlsInitialized = false;
103 console.log('🧹 Browser controls cleaned up');
104 });
105
106 } catch (error) {
107 console.error('❌ Failed to initialize browser controls:', error);
108 }
109}