diff --git a/cmuxUITests/BrowserPaneNavigationKeybindUITests.swift b/cmuxUITests/BrowserPaneNavigationKeybindUITests.swift index 5f76cb57..261a136d 100644 --- a/cmuxUITests/BrowserPaneNavigationKeybindUITests.swift +++ b/cmuxUITests/BrowserPaneNavigationKeybindUITests.swift @@ -554,6 +554,50 @@ final class BrowserPaneNavigationKeybindUITests: XCTestCase { ) } + func testCmdShiftEnterKeepsBrowserOmnibarHittableWhenWebViewFocused() { + let app = XCUIApplication() + app.launchEnvironment["CMUX_SOCKET_PATH"] = socketPath + app.launchEnvironment["CMUX_UI_TEST_GOTO_SPLIT_SETUP"] = "1" + app.launchEnvironment["CMUX_UI_TEST_GOTO_SPLIT_PATH"] = dataPath + launchAndEnsureForeground(app) + + XCTAssertTrue( + waitForData(keys: ["browserPanelId", "webViewFocused"], timeout: 10.0), + "Expected goto_split setup data to be written" + ) + + guard let setup = loadData() else { + XCTFail("Missing goto_split setup data") + return + } + + XCTAssertEqual(setup["webViewFocused"], "true", "Expected WKWebView to be first responder for this test") + + let omnibar = app.textFields["BrowserOmnibarTextField"].firstMatch + let pill = app.descendants(matching: .any).matching(identifier: "BrowserOmnibarPill").firstMatch + XCTAssertTrue(omnibar.waitForExistence(timeout: 6.0), "Expected browser omnibar text field before zoom") + XCTAssertTrue(pill.waitForExistence(timeout: 6.0), "Expected browser omnibar pill before zoom") + + app.typeKey(XCUIKeyboardKey.return.rawValue, modifierFlags: [.command, .shift]) + + XCTAssertTrue(omnibar.waitForExistence(timeout: 6.0), "Expected browser omnibar text field after Cmd+Shift+Enter") + XCTAssertTrue(pill.waitForExistence(timeout: 6.0), "Expected browser omnibar pill after Cmd+Shift+Enter") + XCTAssertTrue( + waitForElementToBecomeHittable(pill, timeout: 6.0), + "Expected browser omnibar to stay hittable after Cmd+Shift+Enter" + ) + + pill.click() + app.typeKey("a", modifierFlags: [.command]) + app.typeKey(XCUIKeyboardKey.delete.rawValue, modifierFlags: []) + app.typeText("issue1144") + + XCTAssertTrue( + waitForOmnibarToContain(omnibar, value: "issue1144", timeout: 4.0), + "Expected browser omnibar to stay editable after Cmd+Shift+Enter. value=\(String(describing: omnibar.value))" + ) + } + func testCmdDSplitsRightWhenOmnibarFocused() { let app = XCUIApplication() app.launchEnvironment["CMUX_SOCKET_PATH"] = socketPath @@ -806,6 +850,17 @@ final class BrowserPaneNavigationKeybindUITests: XCTestCase { return value.contains(expectedSubstring) } + private func waitForElementToBecomeHittable(_ element: XCUIElement, timeout: TimeInterval) -> Bool { + let deadline = Date().addingTimeInterval(timeout) + while Date() < deadline { + if element.exists && element.isHittable { + return true + } + RunLoop.current.run(until: Date().addingTimeInterval(0.05)) + } + return element.exists && element.isHittable + } + private var autofocusRacePageURL: String { "data:text/html,%3Cinput%20id%3D%22q%22%3E%3Cscript%3EsetTimeout%28function%28%29%7Bdocument.getElementById%28%22q%22%29.focus%28%29%3Blocation.hash%3D%22focused%22%3B%7D%2C700%29%3B%3C%2Fscript%3E" }