Some web updates.

This commit is contained in:
Storm Dragon
2026-05-24 03:47:15 -04:00
parent cb553d3031
commit edc195c46b
3 changed files with 136 additions and 3 deletions
+16 -2
View File
@@ -2276,7 +2276,10 @@ class Script(default.Script):
tokens = ["WEB: Dumping cache and context: source is focus", tokens = ["WEB: Dumping cache and context: source is focus",
cthulhu_state.locusOfFocus] cthulhu_state.locusOfFocus]
debug.printTokens(debug.LEVEL_INFO, tokens, True) debug.printTokens(debug.LEVEL_INFO, tokens, True)
self.utilities.dumpCache(document, preserveContext=False) self.utilities.dumpCache(
document,
preserveContext=not AXObject.is_dead(event.source),
)
elif AXObject.is_dead(cthulhu_state.locusOfFocus): elif AXObject.is_dead(cthulhu_state.locusOfFocus):
msg = "WEB: Dumping cache: dead focus" msg = "WEB: Dumping cache: dead focus"
debug.printMessage(debug.LEVEL_INFO, msg, True) debug.printMessage(debug.LEVEL_INFO, msg, True)
@@ -2389,7 +2392,10 @@ class Script(default.Script):
tokens = ["WEB: Dumping cache and context: source is focus", tokens = ["WEB: Dumping cache and context: source is focus",
cthulhu_state.locusOfFocus] cthulhu_state.locusOfFocus]
debug.printTokens(debug.LEVEL_INFO, tokens, True) debug.printTokens(debug.LEVEL_INFO, tokens, True)
self.utilities.dumpCache(document, preserveContext=False) self.utilities.dumpCache(
document,
preserveContext=not AXObject.is_dead(event.source),
)
elif AXObject.is_dead(cthulhu_state.locusOfFocus): elif AXObject.is_dead(cthulhu_state.locusOfFocus):
msg = "WEB: Dumping cache: dead focus" msg = "WEB: Dumping cache: dead focus"
debug.printMessage(debug.LEVEL_INFO, msg, True) debug.printMessage(debug.LEVEL_INFO, msg, True)
@@ -2594,6 +2600,14 @@ class Script(default.Script):
else: else:
msg = "WEB: Search for caret context failed" msg = "WEB: Search for caret context failed"
debug.printMessage(debug.LEVEL_INFO, msg, True) debug.printMessage(debug.LEVEL_INFO, msg, True)
if AXUtilities.is_focusable(event.source) \
and AXUtilities.is_focused(event.source) \
and self.utilities.inDocumentContent(event.source):
msg = "WEB: Falling back to focused event source as caret context"
debug.printMessage(debug.LEVEL_INFO, msg, True)
cthulhu.setLocusOfFocus(event, event.source, False)
self.utilities.setCaretContext(event.source, 0)
obj, offset = event.source, 0
if self._lastCommandWasCaretNav: if self._lastCommandWasCaretNav:
msg = "WEB: Event ignored: Last command was caret nav" msg = "WEB: Event ignored: Last command was caret nav"
+2 -1
View File
@@ -5050,7 +5050,8 @@ class Utilities(script_utilities.Utilities):
debug.printMessage(debug.LEVEL_INFO, msg, True) debug.printMessage(debug.LEVEL_INFO, msg, True)
return False return False
if not AXObject.is_dead(cthulhu_state.locusOfFocus): if not AXObject.is_dead(cthulhu_state.locusOfFocus) \
and not self.isSameObject(replicant, cthulhu_state.locusOfFocus, True, True):
tokens = ["WEB: Not event from context replicant. locusOfFocus", tokens = ["WEB: Not event from context replicant. locusOfFocus",
cthulhu_state.locusOfFocus, "is not dead."] cthulhu_state.locusOfFocus, "is not dead."]
debug.printTokens(debug.LEVEL_INFO, tokens, True) debug.printTokens(debug.LEVEL_INFO, tokens, True)
+118
View File
@@ -314,6 +314,124 @@ class WebDescriptionChangeRegressionTests(unittest.TestCase):
testScript.presentMessage.assert_called_once_with("Helpful tooltip") testScript.presentMessage.assert_called_once_with("Helpful tooltip")
class WebDynamicContentRecoveryRegressionTests(unittest.TestCase):
def _make_dynamic_script(self):
testScript = web_script.Script.__new__(web_script.Script)
testScript._loadingDocumentContent = False
testScript._lastCommandWasCaretNav = False
testScript._lastCommandWasStructNav = False
testScript._lastMouseButtonContext = (None, -1)
testScript.lastMouseRoutingTime = 0
testScript.utilities = mock.Mock()
testScript.utilities.eventIsBrowserUINoise.return_value = False
testScript.utilities.isLiveRegion.return_value = False
testScript.utilities.getTopLevelDocumentForObject.return_value = "document"
testScript.utilities.isZombie.return_value = False
testScript.utilities.handleEventFromContextReplicant.return_value = False
testScript.utilities.handleEventForRemovedChild.return_value = False
testScript.utilities.inDocumentContent.return_value = True
return testScript
def test_children_added_to_live_focus_preserves_caret_context(self):
testScript = self._make_dynamic_script()
focus = object()
event = mock.Mock(source=focus, any_data=object())
with (
mock.patch.object(web_script.cthulhu_state, "locusOfFocus", focus),
mock.patch.object(web_script.AXObject, "is_dead", return_value=False),
mock.patch.object(web_script.AXUtilities, "is_busy", return_value=False),
mock.patch.object(web_script.AXUtilities, "is_alert", return_value=False),
):
result = web_script.Script.onChildrenAdded(testScript, event)
self.assertFalse(result)
testScript.utilities.dumpCache.assert_called_once_with(
"document",
preserveContext=True,
)
def test_children_removed_from_live_focus_preserves_caret_context(self):
testScript = self._make_dynamic_script()
focus = object()
event = mock.Mock(source=focus, any_data=object())
with (
mock.patch.object(web_script.cthulhu_state, "locusOfFocus", focus),
mock.patch.object(web_script.AXObject, "is_dead", return_value=False),
):
result = web_script.Script.onChildrenRemoved(testScript, event)
self.assertFalse(result)
testScript.utilities.dumpCache.assert_called_once_with(
"document",
preserveContext=True,
)
def test_focused_event_source_becomes_context_when_search_fails(self):
testScript = self._make_dynamic_script()
source = object()
oldFocus = object()
event = mock.Mock(detail1=1, source=source)
testScript._lastCommandWasCaretNav = True
testScript.utilities.getDocumentForObject.return_value = "document"
testScript.utilities.isWebAppDescendant.return_value = False
testScript.utilities.handleEventFromContextReplicant.return_value = False
testScript.utilities.getCaretContext.return_value = (None, -1)
testScript.utilities.searchForCaretContext.return_value = (None, -1)
testScript.utilities.inFindContainer.return_value = False
with (
mock.patch.object(web_script.cthulhu_state, "locusOfFocus", oldFocus),
mock.patch.object(web_script.AXUtilities, "is_editable", return_value=False),
mock.patch.object(web_script.AXUtilities, "is_dialog_or_alert", return_value=False),
mock.patch.object(web_script.AXUtilities, "is_focusable", return_value=True),
mock.patch.object(web_script.AXUtilities, "is_focused", return_value=True),
mock.patch.object(web_script.cthulhu, "setLocusOfFocus") as setLocusOfFocus,
):
result = web_script.Script.onFocusedChanged(testScript, event)
self.assertTrue(result)
setLocusOfFocus.assert_called_once_with(event, source, False)
testScript.utilities.setCaretContext.assert_called_once_with(source, 0)
class WebContextReplicantRegressionTests(unittest.TestCase):
def test_same_object_replicant_can_recover_before_old_focus_is_dead(self):
utilities = web_script_utilities.Utilities.__new__(web_script_utilities.Utilities)
document = object()
parent = object()
oldFocus = object()
replicant = object()
event = mock.Mock()
utilities._caretContexts = {hash(parent): (oldFocus, 0)}
utilities.getCaretContextPathRoleAndName = mock.Mock(
return_value=([1, 2, 3], "button", "storm, microphone on")
)
utilities.documentFrame = mock.Mock(return_value=document)
utilities.isSameObject = mock.Mock(return_value=True)
utilities.setCaretContext = mock.Mock()
with (
mock.patch.object(web_script_utilities.cthulhu_state, "locusOfFocus", oldFocus),
mock.patch.object(web_script_utilities.AXObject, "is_dead", return_value=False),
mock.patch.object(web_script_utilities.AXObject, "get_path", return_value=[1, 2, 3]),
mock.patch.object(web_script_utilities.AXObject, "get_role", return_value="button"),
mock.patch.object(web_script_utilities.AXObject, "get_name", return_value="storm, microphone on"),
mock.patch.object(web_script_utilities.AXObject, "get_parent", return_value=parent),
mock.patch.object(web_script_utilities.cthulhu, "setLocusOfFocus") as setLocusOfFocus,
):
result = web_script_utilities.Utilities.handleEventFromContextReplicant(
utilities,
event,
replicant,
)
self.assertTrue(result)
setLocusOfFocus.assert_called_once_with(event, replicant, False)
utilities.setCaretContext.assert_called_once_with(replicant, 0, document)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()