import unittest from unittest import mock import gi gi.require_version("Atspi", "2.0") from gi.repository import Atspi from cthulhu import ax_object from cthulhu import cthulhu_state from cthulhu import focus_manager class ChromiumOmniboxRegressionTests(unittest.TestCase): def tearDown(self): cthulhu_state.activeWindow = None cthulhu_state.locusOfFocus = None def test_detects_chromium_popup_item_with_broken_ancestry(self): popupItem = object() with ( mock.patch.object(ax_object.AXObject, "is_dead", return_value=False), mock.patch.object(ax_object.AXObject, "get_toolkit_name", return_value="chromium"), mock.patch.object(ax_object.AXObject, "get_role", return_value=Atspi.Role.LIST_ITEM), mock.patch.object(ax_object.AXObject, "get_parent", return_value=None), mock.patch.object(ax_object.debug, "print_tokens"), ): self.assertTrue(ax_object.AXObject.has_broken_popup_ancestry(popupItem)) def test_ignores_chromium_popup_item_with_valid_ancestry(self): popupItem = object() parent = object() def get_role(obj): if obj is popupItem: return Atspi.Role.LIST_ITEM return Atspi.Role.APPLICATION with ( mock.patch.object(ax_object.AXObject, "is_dead", return_value=False), mock.patch.object(ax_object.AXObject, "get_toolkit_name", return_value="chromium"), mock.patch.object(ax_object.AXObject, "get_role", side_effect=get_role), mock.patch.object(ax_object.AXObject, "get_parent", side_effect=[parent, None]), ): self.assertFalse(ax_object.AXObject.has_broken_popup_ancestry(popupItem)) def test_preserves_active_window_when_chromium_popup_ancestry_is_broken(self): activeWindow = object() popupItem = object() cthulhu_state.activeWindow = activeWindow cthulhu_state.locusOfFocus = popupItem controller = mock.Mock() app = mock.Mock() manager = None with ( mock.patch.object(focus_manager.dbus_service, "get_remote_controller", return_value=controller), mock.patch.object(focus_manager.AXObject, "has_broken_popup_ancestry", return_value=True), ): manager = focus_manager.FocusManager(app) manager.set_active_window(None) self.assertIs(manager.get_active_window(), activeWindow) self.assertIs(cthulhu_state.activeWindow, activeWindow) if __name__ == "__main__": unittest.main()