Skip to content

Commit d0d4298

Browse files
committed
Add browser textarea and omnibar arrow regressions
1 parent 94c59af commit d0d4298

2 files changed

Lines changed: 490 additions & 15 deletions

File tree

Sources/AppDelegate.swift

Lines changed: 103 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)