perf(fast-browser): eliminate redundant browser protocol calls
This commit is contained in:
@@ -721,6 +721,26 @@ class BridgeRegressionTests(unittest.TestCase):
|
||||
with self.assertRaisesRegex(WorkerError, "outside"):
|
||||
worker.act({"observationId": obs["observationId"], "candidateId": "c-0", "action": "fill", "text": "Ada"})
|
||||
|
||||
def test_fill_url_postcondition_reuses_post_action_tab_state(self):
|
||||
backend = FakeBackend()
|
||||
original_fill = backend.fill
|
||||
def fill_and_navigate(node, text):
|
||||
original_fill(node, text)
|
||||
backend.url = "http://fixture.test/done"
|
||||
backend.fill = fill_and_navigate
|
||||
current_tab = backend.current_tab
|
||||
backend.current_tab = Mock(side_effect=current_tab)
|
||||
worker = BrowserWorker(backend, ["http://fixture.test"])
|
||||
observation = worker.observe()
|
||||
result = worker.act({
|
||||
"observationId": observation["observationId"], "candidateId": "c-0",
|
||||
"action": "fill", "text": "Ada",
|
||||
"postcondition": {"kind": "url", "value": "http://fixture.test/done"},
|
||||
})
|
||||
self.assertTrue(result["verified"])
|
||||
# observe, fresh pre-mutation revalidation, and one post-action read.
|
||||
self.assertEqual(backend.current_tab.call_count, 3)
|
||||
|
||||
def test_oversized_input_and_sensitive_error_are_not_echoed(self):
|
||||
worker = BrowserWorker(FakeBackend(), ["http://fixture.test"])
|
||||
out = io.BytesIO()
|
||||
@@ -738,6 +758,74 @@ class BridgeRegressionTests(unittest.TestCase):
|
||||
backend._load_harness()
|
||||
spawn.assert_not_called()
|
||||
|
||||
def test_real_backend_list_tabs_uses_one_inventory_with_helper_filtering_and_openers(self):
|
||||
helper = Mock()
|
||||
helper.cdp.return_value = {"targetInfos": [
|
||||
{"type": "page", "targetId": "page", "url": "http://fixture.test/form", "title": "Fixture",
|
||||
"openerId": "opener"},
|
||||
{"type": "page", "targetId": "internal", "url": "chrome://settings", "title": "Settings"},
|
||||
{"type": "page", "targetId": "devtools", "url": "devtools://devtools", "title": "DevTools"},
|
||||
{"type": "page", "targetId": "placeholder", "url": "about:blank#startup", "title": "Starting agent 1"},
|
||||
{"type": "service_worker", "targetId": "worker", "url": "http://fixture.test/sw", "title": "Worker"},
|
||||
{"type": "page", "targetId": "plain", "url": "https://other.test/", "title": "Other", "openerId": ""},
|
||||
{"type": "page", "targetId": "malformed-opener", "url": "http://fixture.test/other", "title": "Other",
|
||||
"openerId": 42},
|
||||
]}
|
||||
backend = RealBrowserBackend.__new__(RealBrowserBackend)
|
||||
backend._helpers = helper
|
||||
|
||||
tabs = backend.list_tabs()
|
||||
|
||||
self.assertEqual([tab["targetId"] for tab in tabs], ["page", "plain", "malformed-opener"])
|
||||
self.assertEqual(tabs[0]["openerTargetId"], "opener")
|
||||
self.assertIsNone(tabs[1]["openerTargetId"])
|
||||
self.assertIsNone(tabs[2]["openerTargetId"])
|
||||
helper.cdp.assert_called_once_with("Target.getTargets")
|
||||
helper.list_tabs.assert_not_called()
|
||||
|
||||
def test_real_backend_list_tabs_propagates_inventory_errors_without_fallback(self):
|
||||
helper = Mock()
|
||||
helper.cdp.side_effect = RuntimeError("inventory unavailable")
|
||||
backend = RealBrowserBackend.__new__(RealBrowserBackend)
|
||||
backend._helpers = helper
|
||||
|
||||
with self.assertRaisesRegex(RuntimeError, "inventory unavailable"):
|
||||
backend.list_tabs()
|
||||
helper.cdp.assert_called_once_with("Target.getTargets")
|
||||
helper.list_tabs.assert_not_called()
|
||||
|
||||
def test_real_backend_switch_tab_does_not_reenable_harness_domains(self):
|
||||
helper = Mock()
|
||||
helper.switch_tab.return_value = "session-1"
|
||||
backend = RealBrowserBackend.__new__(RealBrowserBackend)
|
||||
backend._helpers = helper
|
||||
|
||||
backend.switch_tab("target-1")
|
||||
|
||||
self.assertEqual(backend._session_id, "session-1")
|
||||
self.assertEqual(backend._attached_target, "target-1")
|
||||
helper.switch_tab.assert_called_once_with("target-1", activate=False)
|
||||
helper.cdp.assert_not_called()
|
||||
|
||||
def test_real_backend_caches_select_all_modifier_for_backend_lifetime(self):
|
||||
helper = Mock()
|
||||
calls = []
|
||||
def cdp(method, **_kwargs):
|
||||
calls.append(method)
|
||||
return {"userAgent": "Macintosh"} if method == "Browser.getVersion" else {}
|
||||
helper.cdp.side_effect = cdp
|
||||
backend = RealBrowserBackend.__new__(RealBrowserBackend)
|
||||
backend._helpers = helper
|
||||
backend._call = Mock(return_value=True)
|
||||
|
||||
backend.fill(1, "first")
|
||||
backend.fill(1, "second")
|
||||
|
||||
self.assertEqual(calls.count("Browser.getVersion"), 1)
|
||||
keydowns = [call for call in helper.cdp.call_args_list
|
||||
if call.args[0] == "Input.dispatchKeyEvent" and call.kwargs["type"] == "rawKeyDown"]
|
||||
self.assertEqual([call.kwargs["modifiers"] for call in keydowns], [4, 4])
|
||||
|
||||
def test_real_backend_unrestricted_policy_still_requires_one_web_tab(self):
|
||||
helper = Mock()
|
||||
helper.list_tabs.return_value = [
|
||||
|
||||
Reference in New Issue
Block a user