Files
orca/native/computer-use-macos/Tests/OrcaComputerUseMacOSTests/ForegroundEffectTests.swift
Kelvin Amoaba 57c9991c98 fix(computer-use): refuse macOS background clicks that open a menu or dialog, and stop refusing plain AX presses (#42158)
* fix(computer-use): refuse macOS background actions that open a menu or dialog over the user

* fix(computer-use): let web comboboxes click in the background and stop probing a hung app

* fix(computer-use): refuse background drags that start on a menu owner

* docs(computer-use): note background drags on menu owners are refused

* fix(computer-use): classify the element under a drag's start and check AXConfirm/AXOpen secondary actions
2026-11-13 22:50:27 +00:00

38 lines
2.3 KiB
Swift

import OrcaComputerUseMacOSCore
import XCTest
final class ForegroundEffectTests: XCTestCase {
private typealias Node = ForegroundEffect.Node
func testPressingAMenuOwnerOrItsLabelShowsAMenu() {
for role in ["AXPopUpButton", "AXMenuButton", "AXComboBox"] {
XCTAssertEqual(ForegroundEffect.ofPress([Node(role: role)]), .showsMenu, role)
XCTAssertEqual(ForegroundEffect.ofPress([Node(role: "AXStaticText", labels: ["Small"]), Node(role: role)]), .showsMenu, role)
}
XCTAssertNil(ForegroundEffect.ofPress([Node(role: "AXStaticText"), Node(role: "AXGroup"), Node(role: "AXPopUpButton")]))
}
func testAWebComboboxIsATextInputNotAMenu() {
XCTAssertNil(ForegroundEffect.ofPress([Node(role: "AXComboBox", inWebContent: true)]))
XCTAssertEqual(ForegroundEffect.ofPress([Node(role: "AXPopUpButton", inWebContent: true)]), .showsMenu)
}
func testOnlyAButtonWhoseTitleEndsInAnEllipsisOpensADialog() {
XCTAssertEqual(ForegroundEffect.ofPress([Node(role: "AXButton", labels: ["Save\u{2026}", nil])]), .opensDialog)
XCTAssertEqual(ForegroundEffect.ofPress([Node(role: "AXButton", labels: [nil, "Export... "])]), .opensDialog)
XCTAssertNil(ForegroundEffect.ofPress([Node(role: "AXButton", labels: ["Save", "Saves the file\u{2026} now"])]))
XCTAssertNil(ForegroundEffect.ofPress([Node(role: "AXLink", labels: ["Read more..."])]))
XCTAssertNil(ForegroundEffect.ofPress([Node(role: "AXStaticText", labels: ["Loading..."]), Node(role: "AXGroup")]))
}
func testContextMenuClicksShowAMenuOnAnyTarget() {
let plainButton = [Node(role: "AXButton", labels: ["OK"])]
XCTAssertEqual(ForegroundEffect.ofClick(button: .right, control: false, target: plainButton), .showsMenu)
XCTAssertEqual(ForegroundEffect.ofClick(button: .left, control: true, target: plainButton), .showsMenu)
XCTAssertNil(ForegroundEffect.ofClick(button: .left, control: false, target: plainButton))
XCTAssertEqual(ForegroundEffect.ofAction("AXShowMenu", target: plainButton), .showsMenu)
XCTAssertNil(ForegroundEffect.ofAction("AXScrollToVisible", target: [Node(role: "AXPopUpButton")]))
XCTAssertEqual(ForegroundEffect.ofAction("AXConfirm", target: [Node(role: "AXButton", labels: ["Open\u{2026}"])]), .opensDialog)
}
}