Initial work on making Steam overlay accessible.
This commit is contained in:
@@ -182,6 +182,42 @@ class EventManagerCompositorContextRegressionTests(unittest.TestCase):
|
||||
self.assertFalse(self.manager._ignore(firstEvent))
|
||||
self.assertTrue(self.manager._ignore(secondEvent))
|
||||
|
||||
def test_steam_quick_access_name_changed_survives_without_active_script(self) -> None:
|
||||
app = object()
|
||||
event = FakeEvent("object:property-change:accessible-name", source="quick-access")
|
||||
cthulhu_state.activeScript = None
|
||||
|
||||
with (
|
||||
mock.patch.object(event_manager.debug, "printMessage"),
|
||||
mock.patch.object(event_manager.debug, "printTokens"),
|
||||
mock.patch.object(event_manager.debug, "print_log"),
|
||||
mock.patch.object(event_manager.AXObject, "get_application", return_value=app),
|
||||
mock.patch.object(event_manager.AXObject, "get_name", return_value="steamwebhelper"),
|
||||
):
|
||||
self.manager._isSteamOverlayNavigationEvent = mock.Mock(return_value=True)
|
||||
|
||||
self.assertFalse(self.manager._ignore(event))
|
||||
|
||||
def test_steam_overlay_navigation_requires_quick_access_context(self) -> None:
|
||||
app = object()
|
||||
event = FakeEvent("object:property-change:accessible-name", source="not-quick-access")
|
||||
|
||||
self.manager._isSteamApp = mock.Mock(return_value=True)
|
||||
self.manager._activeX11WindowIsSteamSelectionContext = mock.Mock(return_value=True)
|
||||
self.manager._eventHasSteamQuickAccessContext = mock.Mock(return_value=False)
|
||||
|
||||
self.assertFalse(self.manager._isSteamOverlayNavigationEvent(event, app))
|
||||
|
||||
def test_steam_overlay_navigation_rejects_children_changed_churn(self) -> None:
|
||||
app = object()
|
||||
event = FakeEvent("object:children-changed:add", source="quick-access", any_data=object())
|
||||
|
||||
self.manager._isSteamApp = mock.Mock(return_value=True)
|
||||
self.manager._activeX11WindowIsSteamSelectionContext = mock.Mock(return_value=True)
|
||||
self.manager._eventHasSteamQuickAccessContext = mock.Mock(return_value=True)
|
||||
|
||||
self.assertFalse(self.manager._isSteamOverlayNavigationEvent(event, app))
|
||||
|
||||
def test_steam_focus_lost_burst_is_ignored_but_focus_gain_is_preserved(self) -> None:
|
||||
app = object()
|
||||
cthulhu_state.activeScript = mock.Mock(app=app)
|
||||
|
||||
@@ -61,6 +61,409 @@ class SteamSelectionChangedTests(unittest.TestCase):
|
||||
self.assertEqual(chromiumCalls, [(testScript, event)])
|
||||
|
||||
|
||||
class SteamOverlaySelectionPresentationTests(unittest.TestCase):
|
||||
def test_selected_changed_presents_quick_access_item_over_steam_game(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
source = object()
|
||||
lastEvent = mock.Mock(event_string="Down", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:state-changed:selected",
|
||||
source=source,
|
||||
detail1=1,
|
||||
any_data=None,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.inDocumentContent.return_value = True
|
||||
testScript.utilities.displayedText.return_value = ""
|
||||
testScript.presentMessage = mock.Mock()
|
||||
testScript._lastSteamOverlaySelection = ("", 0.0)
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnSelectedChanged(self, selectedEvent):
|
||||
chromiumCalls.append((self, selectedEvent))
|
||||
return False
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=True),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(steam_script.AXObject, "get_name", return_value="Quick Settings"),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=True),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_menu_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onSelectedChanged",
|
||||
new=chromiumOnSelectedChanged,
|
||||
),
|
||||
):
|
||||
self.assertTrue(testScript.onSelectedChanged(event))
|
||||
|
||||
testScript.presentMessage.assert_called_once_with(
|
||||
"Quick Settings",
|
||||
force=True,
|
||||
interrupt=True,
|
||||
)
|
||||
self.assertEqual(chromiumCalls, [])
|
||||
|
||||
def test_selected_changed_presents_inferred_quick_access_friends_tab_label(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
source = object()
|
||||
lastEvent = mock.Mock(event_string="Down", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:state-changed:selected",
|
||||
source=source,
|
||||
detail1=1,
|
||||
any_data=None,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.inDocumentContent.return_value = True
|
||||
testScript.utilities.displayedText.return_value = ""
|
||||
testScript.presentMessage = mock.Mock()
|
||||
testScript._lastSteamOverlaySelection = ("", 0.0)
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnSelectedChanged(self, selectedEvent):
|
||||
chromiumCalls.append((self, selectedEvent))
|
||||
return False
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=True),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(steam_script.AXObject, "get_name", return_value=""),
|
||||
mock.patch.object(
|
||||
steam_script.AXObject,
|
||||
"get_attribute",
|
||||
side_effect=lambda obj, name: "quickaccess_tab_3" if name == "id" else "",
|
||||
),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=True),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_menu_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onSelectedChanged",
|
||||
new=chromiumOnSelectedChanged,
|
||||
),
|
||||
):
|
||||
self.assertTrue(testScript.onSelectedChanged(event))
|
||||
|
||||
testScript.presentMessage.assert_called_once_with(
|
||||
"Friends",
|
||||
force=True,
|
||||
interrupt=True,
|
||||
)
|
||||
self.assertEqual(chromiumCalls, [])
|
||||
self.assertEqual(testScript._steamActiveQuickAccessTab, "Friends")
|
||||
|
||||
def test_selected_changed_defers_unknown_unnamed_quick_access_tab(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
source = object()
|
||||
lastEvent = mock.Mock(event_string="Down", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:state-changed:selected",
|
||||
source=source,
|
||||
detail1=1,
|
||||
any_data=None,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.inDocumentContent.return_value = True
|
||||
testScript.utilities.displayedText.return_value = ""
|
||||
testScript.presentMessage = mock.Mock()
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnSelectedChanged(self, selectedEvent):
|
||||
chromiumCalls.append((self, selectedEvent))
|
||||
return "handled"
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=True),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(steam_script.AXObject, "get_name", return_value=""),
|
||||
mock.patch.object(
|
||||
steam_script.AXObject,
|
||||
"get_attribute",
|
||||
side_effect=lambda obj, name: "quickaccess_tab_unknown" if name == "id" else "",
|
||||
),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=True),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_menu_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onSelectedChanged",
|
||||
new=chromiumOnSelectedChanged,
|
||||
),
|
||||
):
|
||||
self.assertEqual(testScript.onSelectedChanged(event), "handled")
|
||||
|
||||
testScript.presentMessage.assert_not_called()
|
||||
self.assertEqual(chromiumCalls, [(testScript, event)])
|
||||
|
||||
def test_selected_changed_defers_when_foreground_is_not_steam_game(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
source = object()
|
||||
lastEvent = mock.Mock(event_string="Down", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:state-changed:selected",
|
||||
source=source,
|
||||
detail1=1,
|
||||
any_data=None,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.inDocumentContent.return_value = True
|
||||
testScript.utilities.displayedText.return_value = ""
|
||||
testScript.presentMessage = mock.Mock()
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnSelectedChanged(self, selectedEvent):
|
||||
chromiumCalls.append((self, selectedEvent))
|
||||
return "handled"
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=False,
|
||||
),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onSelectedChanged",
|
||||
new=chromiumOnSelectedChanged,
|
||||
),
|
||||
):
|
||||
self.assertEqual(testScript.onSelectedChanged(event), "handled")
|
||||
|
||||
testScript.presentMessage.assert_not_called()
|
||||
self.assertEqual(chromiumCalls, [(testScript, event)])
|
||||
|
||||
def test_selection_changed_uses_selected_child_from_quick_access_container(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
source = object()
|
||||
child = object()
|
||||
lastEvent = mock.Mock(event_string=" ", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:selection-changed",
|
||||
source=source,
|
||||
detail1=0,
|
||||
any_data=0,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.inDocumentContent.return_value = True
|
||||
testScript.utilities.displayedText.return_value = ""
|
||||
testScript.presentMessage = mock.Mock()
|
||||
testScript._lastSteamOverlaySelection = ("", 0.0)
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=True),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(steam_script.AXSelection, "get_selected_children", return_value=[child]),
|
||||
mock.patch.object(steam_script.AXObject, "get_name", side_effect=lambda obj: "Friends" if obj is child else ""),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", side_effect=lambda obj: obj is child),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_menu_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
):
|
||||
self.assertTrue(testScript.onSelectionChanged(event))
|
||||
|
||||
testScript.presentMessage.assert_called_once_with(
|
||||
"Friends",
|
||||
force=True,
|
||||
interrupt=True,
|
||||
)
|
||||
|
||||
def test_selected_changed_presents_steam_big_picture_tab_when_steam_is_foreground(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
source = object()
|
||||
document = object()
|
||||
lastEvent = mock.Mock(event_string="Right", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:state-changed:selected",
|
||||
source=source,
|
||||
detail1=1,
|
||||
any_data=0,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.inDocumentContent.return_value = True
|
||||
testScript.utilities.displayedText.return_value = "ACTIVITY"
|
||||
testScript.utilities.getTopLevelDocumentForObject.return_value = document
|
||||
testScript.utilities.documentFrameURI.return_value = "https://steamloopback.host/index.html"
|
||||
testScript.presentMessage = mock.Mock()
|
||||
testScript._lastSteamOverlaySelection = ("", 0.0)
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnSelectedChanged(self, selectedEvent):
|
||||
chromiumCalls.append((self, selectedEvent))
|
||||
return False
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=False),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(steam_script.AXObject, "get_name", return_value="ACTIVITY"),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=True),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_menu_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onSelectedChanged",
|
||||
new=chromiumOnSelectedChanged,
|
||||
),
|
||||
):
|
||||
self.assertTrue(testScript.onSelectedChanged(event))
|
||||
|
||||
testScript.presentMessage.assert_called_once_with(
|
||||
"ACTIVITY",
|
||||
force=True,
|
||||
interrupt=True,
|
||||
)
|
||||
self.assertEqual(chromiumCalls, [])
|
||||
|
||||
def test_selected_changed_defers_steam_tab_outside_steam_big_picture_document(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
source = object()
|
||||
document = object()
|
||||
lastEvent = mock.Mock(event_string="Right", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:state-changed:selected",
|
||||
source=source,
|
||||
detail1=1,
|
||||
any_data=0,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.inDocumentContent.return_value = True
|
||||
testScript.utilities.displayedText.return_value = "ACTIVITY"
|
||||
testScript.utilities.getTopLevelDocumentForObject.return_value = document
|
||||
testScript.utilities.documentFrameURI.return_value = "https://store.steampowered.com/"
|
||||
testScript.presentMessage = mock.Mock()
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnSelectedChanged(self, selectedEvent):
|
||||
chromiumCalls.append((self, selectedEvent))
|
||||
return "handled"
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=False),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(steam_script.AXObject, "get_name", return_value="ACTIVITY"),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=True),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_menu_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onSelectedChanged",
|
||||
new=chromiumOnSelectedChanged,
|
||||
),
|
||||
):
|
||||
self.assertEqual(testScript.onSelectedChanged(event), "handled")
|
||||
|
||||
testScript.presentMessage.assert_not_called()
|
||||
self.assertEqual(chromiumCalls, [(testScript, event)])
|
||||
|
||||
def test_x11_steam_game_class_detects_steam_app_identifier(self):
|
||||
classGroup = mock.Mock()
|
||||
classGroup.get_name.return_value = "steam_app_1281930"
|
||||
classGroup.get_res_class.return_value = "steam_app_1281930"
|
||||
window = mock.Mock()
|
||||
window.get_class_group_name.return_value = ""
|
||||
window.get_class_instance_name.return_value = ""
|
||||
window.get_class_group.return_value = classGroup
|
||||
|
||||
self.assertTrue(steam_script.Script._x11WindowHasSteamGameClass(window))
|
||||
|
||||
def test_x11_steam_game_class_rejects_plain_chromium_window(self):
|
||||
classGroup = mock.Mock()
|
||||
classGroup.get_name.return_value = "chromium"
|
||||
classGroup.get_res_class.return_value = "Chromium"
|
||||
window = mock.Mock()
|
||||
window.get_class_group_name.return_value = "Chromium"
|
||||
window.get_class_instance_name.return_value = "chromium"
|
||||
window.get_class_group.return_value = classGroup
|
||||
|
||||
self.assertFalse(steam_script.Script._x11WindowHasSteamGameClass(window))
|
||||
|
||||
def test_x11_steam_big_picture_window_is_selection_context(self):
|
||||
classGroup = mock.Mock()
|
||||
classGroup.get_name.return_value = "steam"
|
||||
classGroup.get_res_class.return_value = "steam"
|
||||
window = mock.Mock()
|
||||
window.get_name.return_value = "Steam Big Picture Mode"
|
||||
window.get_class_group_name.return_value = "steam"
|
||||
window.get_class_instance_name.return_value = "steamwebhelper"
|
||||
window.get_class_group.return_value = classGroup
|
||||
|
||||
self.assertTrue(steam_script.Script._x11WindowIsSteamBigPicture(window))
|
||||
|
||||
def test_x11_plain_steam_window_is_not_big_picture_selection_context(self):
|
||||
classGroup = mock.Mock()
|
||||
classGroup.get_name.return_value = "steam"
|
||||
classGroup.get_res_class.return_value = "steam"
|
||||
window = mock.Mock()
|
||||
window.get_name.return_value = "Steam"
|
||||
window.get_class_group_name.return_value = "steam"
|
||||
window.get_class_instance_name.return_value = "steamwebhelper"
|
||||
window.get_class_group.return_value = classGroup
|
||||
|
||||
self.assertFalse(steam_script.Script._x11WindowIsSteamBigPicture(window))
|
||||
|
||||
|
||||
class SteamReturnActivationTests(unittest.TestCase):
|
||||
def test_return_activates_focused_steam_button(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
@@ -94,8 +497,283 @@ class SteamReturnActivationTests(unittest.TestCase):
|
||||
|
||||
performAction.assert_called_once_with(button)
|
||||
|
||||
def test_return_activates_last_spoken_friends_panel_button(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
button = object()
|
||||
keyboardEvent = mock.Mock(event_string="Return", modifiers=0)
|
||||
keyboardEvent.is_pressed_key.return_value = True
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.inDocumentContent.return_value = True
|
||||
testScript._steamActiveQuickAccessTab = "Friends"
|
||||
testScript._steamFriendsPanelActivationTarget = (
|
||||
button,
|
||||
"Username Playing Terraria",
|
||||
100.0,
|
||||
)
|
||||
testScript._steamFriendsPanelActivationTargetMaxAge = 10.0
|
||||
|
||||
def has_action(obj, action_name):
|
||||
return obj is button and action_name == "press"
|
||||
|
||||
with (
|
||||
mock.patch.object(steam_script.time, "monotonic", return_value=105.0),
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=True),
|
||||
mock.patch.object(testScript, "_getClickableActivationTarget", return_value=None),
|
||||
mock.patch.object(steam_script.AXObject, "is_dead", return_value=False),
|
||||
mock.patch.object(steam_script.AXObject, "find_ancestor_inclusive", return_value=None),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab_list", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=True),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_table_row", return_value=False),
|
||||
mock.patch.object(steam_script.AXObject, "has_action", side_effect=has_action),
|
||||
mock.patch.object(steam_script.Script, "_performClickableAction", return_value=True) as performAction,
|
||||
):
|
||||
self.assertTrue(testScript.shouldConsumeKeyboardEvent(keyboardEvent, None))
|
||||
|
||||
performAction.assert_called_once_with(button)
|
||||
|
||||
def test_return_defers_stale_friends_panel_activation_target(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
button = object()
|
||||
keyboardEvent = mock.Mock(event_string="Return", modifiers=0)
|
||||
keyboardEvent.is_pressed_key.return_value = True
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript._steamActiveQuickAccessTab = "Friends"
|
||||
testScript._steamFriendsPanelActivationTarget = (
|
||||
button,
|
||||
"Username Playing Terraria",
|
||||
100.0,
|
||||
)
|
||||
testScript._steamFriendsPanelActivationTargetMaxAge = 10.0
|
||||
|
||||
with (
|
||||
mock.patch.object(steam_script.time, "monotonic", return_value=111.0),
|
||||
mock.patch.object(steam_script.debug, "printMessage"),
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(testScript, "_getClickableActivationTarget", return_value=None),
|
||||
):
|
||||
self.assertFalse(testScript.shouldConsumeKeyboardEvent(keyboardEvent, None))
|
||||
|
||||
self.assertEqual(testScript._steamFriendsPanelActivationTarget, (None, "", 0.0))
|
||||
|
||||
|
||||
class SteamVirtualizedListMutationTests(unittest.TestCase):
|
||||
def test_name_changed_presents_friends_panel_item_after_friends_tab_activation(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
row = object()
|
||||
lastEvent = mock.Mock(event_string="Down", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:property-change:accessible-name",
|
||||
source=row,
|
||||
any_data="Username Playing Terraria",
|
||||
detail1=0,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.displayedText.side_effect = (
|
||||
lambda obj: "Username Playing Terraria" if obj is row else ""
|
||||
)
|
||||
testScript.presentMessage = mock.Mock()
|
||||
testScript._lastSteamOverlaySelection = ("", 0.0)
|
||||
testScript._steamActiveQuickAccessTab = "Friends"
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnNameChanged(self, nameEvent):
|
||||
chromiumCalls.append((self, nameEvent))
|
||||
return False
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=True),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab_list", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=True),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_table_row", return_value=False),
|
||||
mock.patch.object(steam_script.AXObject, "find_ancestor_inclusive", return_value=None),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onNameChanged",
|
||||
new=chromiumOnNameChanged,
|
||||
),
|
||||
):
|
||||
self.assertTrue(testScript.onNameChanged(event))
|
||||
|
||||
testScript.presentMessage.assert_called_once_with(
|
||||
"Username Playing Terraria",
|
||||
force=True,
|
||||
interrupt=True,
|
||||
)
|
||||
self.assertEqual(
|
||||
testScript._steamFriendsPanelActivationTarget[:2],
|
||||
(row, "Username Playing Terraria"),
|
||||
)
|
||||
self.assertEqual(chromiumCalls, [])
|
||||
|
||||
def test_children_added_defers_friends_panel_load_artifact(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
source = object()
|
||||
row = object()
|
||||
lastEvent = mock.Mock(event_string="Down", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:children-changed:add",
|
||||
source=source,
|
||||
any_data=row,
|
||||
detail1=0,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.isSteamVirtualizedList.return_value = False
|
||||
testScript.presentMessage = mock.Mock()
|
||||
testScript._steamActiveQuickAccessTab = "Friends"
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnChildrenAdded(self, addedEvent):
|
||||
chromiumCalls.append((self, addedEvent))
|
||||
return False
|
||||
|
||||
with (
|
||||
mock.patch.object(steam_script.Script, "_isSteamNotification", return_value=False),
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onChildrenAdded",
|
||||
new=chromiumOnChildrenAdded,
|
||||
),
|
||||
):
|
||||
testScript.onChildrenAdded(event)
|
||||
|
||||
testScript.presentMessage.assert_not_called()
|
||||
self.assertEqual(chromiumCalls, [(testScript, event)])
|
||||
|
||||
def test_name_changed_ignores_add_friend_panel_button(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
button = object()
|
||||
lastEvent = mock.Mock(event_string="Down", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:property-change:accessible-name",
|
||||
source=button,
|
||||
any_data="Add Friend",
|
||||
detail1=0,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.displayedText.return_value = "Add Friend"
|
||||
testScript.presentMessage = mock.Mock()
|
||||
testScript._steamActiveQuickAccessTab = "Friends"
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnNameChanged(self, nameEvent):
|
||||
chromiumCalls.append((self, nameEvent))
|
||||
return "handled"
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=True),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab_list", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=True),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_table_row", return_value=False),
|
||||
mock.patch.object(steam_script.AXObject, "find_ancestor_inclusive", return_value=None),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onNameChanged",
|
||||
new=chromiumOnNameChanged,
|
||||
),
|
||||
):
|
||||
self.assertEqual(testScript.onNameChanged(event), "handled")
|
||||
|
||||
testScript.presentMessage.assert_not_called()
|
||||
self.assertEqual(chromiumCalls, [(testScript, event)])
|
||||
|
||||
def test_name_changed_ignores_friends_panel_chat_history_button(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
button = object()
|
||||
lastEvent = mock.Mock(event_string="Down", modifiers=0)
|
||||
event = mock.Mock(
|
||||
type="object:property-change:accessible-name",
|
||||
source=button,
|
||||
any_data="LOADING OLDER MESSAGES... Username is typing a message...",
|
||||
detail1=0,
|
||||
)
|
||||
|
||||
testScript.utilities = mock.Mock()
|
||||
testScript.utilities.displayedText.return_value = (
|
||||
"LOADING OLDER MESSAGES... Username is typing a message..."
|
||||
)
|
||||
testScript.presentMessage = mock.Mock()
|
||||
testScript._steamActiveQuickAccessTab = "Friends"
|
||||
|
||||
chromiumCalls = []
|
||||
|
||||
def chromiumOnNameChanged(self, nameEvent):
|
||||
chromiumCalls.append((self, nameEvent))
|
||||
return "handled"
|
||||
|
||||
with (
|
||||
mock.patch.object(
|
||||
steam_script.Script,
|
||||
"_activeX11WindowIsSteamSelectionContext",
|
||||
return_value=True,
|
||||
),
|
||||
mock.patch.object(steam_script.Script, "_hasSteamQuickAccessMarker", return_value=True),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastNonModifierKeyEvent", lastEvent),
|
||||
mock.patch.object(steam_script.cthulhu_state, "lastInputEvent", None),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_page_tab_list", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_list_item", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_button", return_value=True),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_push_button", return_value=False),
|
||||
mock.patch.object(steam_script.AXUtilities, "is_table_row", return_value=False),
|
||||
mock.patch.object(steam_script.AXObject, "find_ancestor_inclusive", return_value=None),
|
||||
mock.patch.object(
|
||||
steam_script.Chromium.Script,
|
||||
"onNameChanged",
|
||||
new=chromiumOnNameChanged,
|
||||
),
|
||||
):
|
||||
self.assertEqual(testScript.onNameChanged(event), "handled")
|
||||
|
||||
testScript.presentMessage.assert_not_called()
|
||||
self.assertEqual(chromiumCalls, [(testScript, event)])
|
||||
|
||||
def test_caret_moved_ignores_transient_loading_spinner(self):
|
||||
testScript = steam_script.Script.__new__(steam_script.Script)
|
||||
source = object()
|
||||
|
||||
Reference in New Issue
Block a user