@@ -7588,8 +7588,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
75887588 focused: false,
75897589 id: "",
75907590 secondaryId: "",
7591+ textareaId: "",
75917592 secondaryCenterX: -1,
75927593 secondaryCenterY: -1,
7594+ textareaCenterX: -1,
7595+ textareaCenterY: -1,
75937596 activeId: active && typeof active.id === "string" ? active.id : "",
75947597 activeTag: active && active.tagName ? active.tagName.toLowerCase() : "",
75957598 trackerInstalled: window.__cmuxAddressBarFocusTrackerInstalled === true,
@@ -7638,6 +7641,37 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
76387641 input.style.color = "black";
76397642 return input;
76407643 };
7644+ const ensureTextarea = (id, value) => {
7645+ const existing = document.getElementById(id);
7646+ const textarea = (existing && existing.tagName && existing.tagName.toLowerCase() === "textarea")
7647+ ? existing
7648+ : (() => {
7649+ const created = document.createElement("textarea");
7650+ created.id = id;
7651+ created.value = value;
7652+ return created;
7653+ })();
7654+ textarea.autocapitalize = "off";
7655+ textarea.autocomplete = "off";
7656+ textarea.spellcheck = false;
7657+ textarea.rows = 4;
7658+ textarea.wrap = "soft";
7659+ textarea.style.display = "block";
7660+ textarea.style.width = "100%";
7661+ textarea.style.minHeight = "96px";
7662+ textarea.style.margin = "0";
7663+ textarea.style.padding = "8px 10px";
7664+ textarea.style.border = "1px solid #5f6368";
7665+ textarea.style.borderRadius = "6px";
7666+ textarea.style.boxSizing = "border-box";
7667+ textarea.style.fontSize = "14px";
7668+ textarea.style.fontFamily = "system-ui, -apple-system, sans-serif";
7669+ textarea.style.background = "white";
7670+ textarea.style.color = "black";
7671+ textarea.style.lineHeight = "1.4";
7672+ textarea.style.resize = "none";
7673+ return textarea;
7674+ };
76417675
76427676 let container = document.getElementById("cmux-ui-test-focus-container");
76437677 if (!container || !container.tagName || container.tagName.toLowerCase() !== "div") {
@@ -7660,12 +7694,19 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
76607694
76617695 const input = ensureInput("cmux-ui-test-focus-input", "cmux-ui-focus-primary");
76627696 const secondaryInput = ensureInput("cmux-ui-test-focus-input-secondary", "cmux-ui-focus-secondary");
7697+ const textarea = ensureTextarea(
7698+ "cmux-ui-test-focus-textarea",
7699+ "cmux-ui-focus-textarea line 1\\ncmux-ui-focus-textarea line 2\\ncmux-ui-focus-textarea line 3"
7700+ );
76637701 if (input.parentElement !== container) {
76647702 container.appendChild(input);
76657703 }
76667704 if (secondaryInput.parentElement !== container) {
76677705 container.appendChild(secondaryInput);
76687706 }
7707+ if (textarea.parentElement !== container) {
7708+ container.appendChild(textarea);
7709+ }
76697710
76707711 if (!window.__cmuxArrowKeyReport || typeof window.__cmuxArrowKeyReport !== "object") {
76717712 window.__cmuxArrowKeyReport = {
@@ -7697,6 +7738,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
76977738 };
76987739 installArrowTracker(input);
76997740 installArrowTracker(secondaryInput);
7741+ installArrowTracker(textarea);
77007742
77017743 input.focus({ preventScroll: true });
77027744 if (typeof input.setSelectionRange === "function") {
@@ -7720,6 +7762,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
77207762 }
77217763
77227764 const secondaryRect = secondaryInput.getBoundingClientRect();
7765+ const textareaRect = textarea.getBoundingClientRect();
77237766 const primaryRect = input.getBoundingClientRect();
77247767 const viewportWidth = Math.max(Number(window.innerWidth) || 0, 1);
77257768 const viewportHeight = Math.max(Number(window.innerHeight) || 0, 1);
@@ -7739,16 +7782,27 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
77397782 0.98,
77407783 Math.max(0.02, (secondaryRect.top + (secondaryRect.height / 2)) / viewportHeight)
77417784 );
7785+ const textareaCenterX = Math.min(
7786+ 0.98,
7787+ Math.max(0.02, (textareaRect.left + (textareaRect.width / 2)) / viewportWidth)
7788+ );
7789+ const textareaCenterY = Math.min(
7790+ 0.98,
7791+ Math.max(0.02, (textareaRect.top + (textareaRect.height / 2)) / viewportHeight)
7792+ );
77427793 const active = document.activeElement;
77437794 const arrowState = readArrowState();
77447795 return {
77457796 focused: active === input,
77467797 id: input.id || "",
77477798 secondaryId: secondaryInput.id || "",
7799+ textareaId: textarea.id || "",
77487800 primaryCenterX,
77497801 primaryCenterY,
77507802 secondaryCenterX,
77517803 secondaryCenterY,
7804+ textareaCenterX,
7805+ textareaCenterY,
77527806 activeId: active && typeof active.id === "string" ? active.id : "",
77537807 activeTag: active && active.tagName ? active.tagName.toLowerCase() : "",
77547808 trackerInstalled: window.__cmuxAddressBarFocusTrackerInstalled === true,
@@ -7799,10 +7853,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
77997853 let focused = (payload?["focused"] as? Bool) ?? false
78007854 let inputId = (payload?["id"] as? String) ?? ""
78017855 let secondaryInputId = (payload?["secondaryId"] as? String) ?? ""
7856+ let textareaId = (payload?["textareaId"] as? String) ?? ""
78027857 let primaryCenterX = (payload?["primaryCenterX"] as? NSNumber)?.doubleValue ?? -1
78037858 let primaryCenterY = (payload?["primaryCenterY"] as? NSNumber)?.doubleValue ?? -1
78047859 let secondaryCenterX = (payload?["secondaryCenterX"] as? NSNumber)?.doubleValue ?? -1
78057860 let secondaryCenterY = (payload?["secondaryCenterY"] as? NSNumber)?.doubleValue ?? -1
7861+ let textareaCenterX = (payload?["textareaCenterX"] as? NSNumber)?.doubleValue ?? -1
7862+ let textareaCenterY = (payload?["textareaCenterY"] as? NSNumber)?.doubleValue ?? -1
78067863 let activeId = (payload?["activeId"] as? String) ?? ""
78077864 let trackerInstalled = (payload?["trackerInstalled"] as? Bool) ?? false
78087865 let trackedStateId = (payload?["trackedStateId"] as? String) ?? ""
@@ -7817,6 +7874,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
78177874 var primaryClickOffsetY = -1.0
78187875 var secondaryClickOffsetX = -1.0
78197876 var secondaryClickOffsetY = -1.0
7877+ var textareaClickOffsetX = -1.0
7878+ var textareaClickOffsetY = -1.0
78207879 let windowAvailable = panel.webView.window != nil
78217880
78227881 if let window = panel.webView.window {
@@ -7832,7 +7891,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
78327891 secondaryCenterX > 0,
78337892 secondaryCenterX < 1,
78347893 secondaryCenterY > 0,
7835- secondaryCenterY < 1 {
7894+ secondaryCenterY < 1,
7895+ textareaCenterX > 0,
7896+ textareaCenterX < 1,
7897+ textareaCenterY > 0,
7898+ textareaCenterY < 1 {
78367899 let primaryXInContent = Double(webFrame.minX) + (primaryCenterX * Double(webFrame.width))
78377900 let primaryYFromTopInWeb = primaryCenterY * Double(webFrame.height)
78387901 let primaryYInContent = Double(webFrame.maxY) - primaryYFromTopInWeb
@@ -7846,12 +7909,19 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
78467909 let secondaryYInContent = Double(webFrame.maxY) - secondaryYFromTopInWeb
78477910 secondaryClickOffsetX = secondaryXInContent
78487911 secondaryClickOffsetY = titlebarHeight + (contentHeight - secondaryYInContent)
7912+
7913+ let textareaXInContent = Double(webFrame.minX) + (textareaCenterX * Double(webFrame.width))
7914+ let textareaYFromTopInWeb = textareaCenterY * Double(webFrame.height)
7915+ let textareaYInContent = Double(webFrame.maxY) - textareaYFromTopInWeb
7916+ textareaClickOffsetX = textareaXInContent
7917+ textareaClickOffsetY = titlebarHeight + (contentHeight - textareaYInContent)
78497918 }
78507919 }
78517920
78527921 if focused,
78537922 !inputId.isEmpty,
78547923 !secondaryInputId.isEmpty,
7924+ !textareaId.isEmpty,
78557925 inputId == activeId,
78567926 trackerInstalled,
78577927 !trackedStateId.isEmpty,
@@ -7863,14 +7933,21 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
78637933 secondaryCenterX < 1,
78647934 secondaryCenterY > 0,
78657935 secondaryCenterY < 1,
7936+ textareaCenterX > 0,
7937+ textareaCenterX < 1,
7938+ textareaCenterY > 0,
7939+ textareaCenterY < 1,
78667940 primaryClickOffsetX > 0,
78677941 primaryClickOffsetY > 0,
78687942 secondaryClickOffsetX > 0,
7869- secondaryClickOffsetY > 0 {
7943+ secondaryClickOffsetY > 0,
7944+ textareaClickOffsetX > 0,
7945+ textareaClickOffsetY > 0 {
78707946 self.writeGotoSplitTestData([
78717947 "webInputFocusSeeded": "true",
78727948 "webInputFocusElementId": inputId,
78737949 "webInputFocusSecondaryElementId": secondaryInputId,
7950+ "webInputFocusTextareaElementId": textareaId,
78747951 "webInputFocusPrimaryCenterX": "\(primaryCenterX)",
78757952 "webInputFocusPrimaryCenterY": "\(primaryCenterY)",
78767953 "webInputFocusPrimaryClickOffsetX": "\(primaryClickOffsetX)",
@@ -7879,6 +7956,10 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
78797956 "webInputFocusSecondaryCenterY": "\(secondaryCenterY)",
78807957 "webInputFocusSecondaryClickOffsetX": "\(secondaryClickOffsetX)",
78817958 "webInputFocusSecondaryClickOffsetY": "\(secondaryClickOffsetY)",
7959+ "webInputFocusTextareaCenterX": "\(textareaCenterX)",
7960+ "webInputFocusTextareaCenterY": "\(textareaCenterY)",
7961+ "webInputFocusTextareaClickOffsetX": "\(textareaClickOffsetX)",
7962+ "webInputFocusTextareaClickOffsetY": "\(textareaClickOffsetY)",
78827963 "webInputFocusActiveElementId": activeId,
78837964 "webInputFocusTrackerInstalled": trackerInstalled ? "true" : "false",
78847965 "webInputFocusTrackedStateId": trackedStateId,
@@ -7912,33 +7993,40 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
79127993 "webInputFocusSeeded": "false",
79137994 "webInputFocusElementId": inputId,
79147995 "webInputFocusSecondaryElementId": secondaryInputId,
7996+ "webInputFocusTextareaElementId": textareaId,
79157997 "webInputFocusPrimaryCenterX": "\(primaryCenterX)",
79167998 "webInputFocusPrimaryCenterY": "\(primaryCenterY)",
79177999 "webInputFocusPrimaryClickOffsetX": "\(primaryClickOffsetX)",
79188000 "webInputFocusPrimaryClickOffsetY": "\(primaryClickOffsetY)",
79198001 "webInputFocusSecondaryCenterX": "\(secondaryCenterX)",
79208002 "webInputFocusSecondaryCenterY": "\(secondaryCenterY)",
79218003 "webInputFocusSecondaryClickOffsetX": "\(secondaryClickOffsetX)",
7922- "webInputFocusSecondaryClickOffsetY": "\(secondaryClickOffsetY)",
7923- "webInputFocusActiveElementId": activeId,
7924- "webInputFocusTrackerInstalled": trackerInstalled ? "true" : "false",
7925- "webInputFocusTrackedStateId": trackedStateId,
7926- "webInputFocusReadyState": readyState,
7927- "webInputFocusArrowDownCount": "\(arrowDown)",
7928- "webInputFocusArrowUpCount": "\(arrowUp)",
7929- "webInputFocusCommandShiftDownCount": "\(commandShiftDown)",
7930- "webInputFocusCommandShiftUpCount": "\(commandShiftUp)",
7931- "webInputFocusSelectionStart": selectionStart.map(String.init) ?? "",
7932- "webInputFocusSelectionEnd": selectionEnd.map(String.init) ?? "",
8004+ "webInputFocusSecondaryClickOffsetY": "\(secondaryClickOffsetY)",
8005+ "webInputFocusTextareaCenterX": "\(textareaCenterX)",
8006+ "webInputFocusTextareaCenterY": "\(textareaCenterY)",
8007+ "webInputFocusTextareaClickOffsetX": "\(textareaClickOffsetX)",
8008+ "webInputFocusTextareaClickOffsetY": "\(textareaClickOffsetY)",
8009+ "webInputFocusActiveElementId": activeId,
8010+ "webInputFocusTrackerInstalled": trackerInstalled ? "true" : "false",
8011+ "webInputFocusTrackedStateId": trackedStateId,
8012+ "webInputFocusReadyState": readyState,
8013+ "webInputFocusArrowDownCount": "\(arrowDown)",
8014+ "webInputFocusArrowUpCount": "\(arrowUp)",
8015+ "webInputFocusCommandShiftDownCount": "\(commandShiftDown)",
8016+ "webInputFocusCommandShiftUpCount": "\(commandShiftUp)",
8017+ "webInputFocusSelectionStart": selectionStart.map(String.init) ?? "",
8018+ "webInputFocusSelectionEnd": selectionEnd.map(String.init) ?? "",
79338019 "setupError":
79348020 "Timed out focusing page input for omnibar restore test " +
7935- "focused=\(focused) inputId=\(inputId) secondaryInputId=\(secondaryInputId) " +
8021+ "focused=\(focused) inputId=\(inputId) secondaryInputId=\(secondaryInputId) textareaId=\(textareaId) " +
79368022 "activeId=\(activeId) trackerInstalled=\(trackerInstalled) trackedStateId=\(trackedStateId) " +
79378023 "readyState=\(readyState) windowAvailable=\(windowAvailable) " +
79388024 "primaryCenterX=\(primaryCenterX) primaryCenterY=\(primaryCenterY) " +
79398025 "primaryClickOffsetX=\(primaryClickOffsetX) primaryClickOffsetY=\(primaryClickOffsetY) " +
79408026 "secondaryCenterX=\(secondaryCenterX) secondaryCenterY=\(secondaryCenterY) " +
7941- "secondaryClickOffsetX=\(secondaryClickOffsetX) secondaryClickOffsetY=\(secondaryClickOffsetY)"
8027+ "secondaryClickOffsetX=\(secondaryClickOffsetX) secondaryClickOffsetY=\(secondaryClickOffsetY) " +
8028+ "textareaCenterX=\(textareaCenterX) textareaCenterY=\(textareaCenterY) " +
8029+ "textareaClickOffsetX=\(textareaClickOffsetX) textareaClickOffsetY=\(textareaClickOffsetY)"
79428030 ])
79438031 }
79448032 }
0 commit comments