blob: ec38df3beded08754ab9bbcbf9aa5725666f7a1f [file] [log] [blame]
import pytest
from ... import create_console_api_message, recursive_compare
# The basic use case of unsubscribing from all contexts for a single event
# is covered by tests for each event in the dedicated folders.
@pytest.mark.asyncio
async def test_unsubscribe_from_one_context(
bidi_session, top_context, new_tab, wait_for_event
):
# Subscribe for log events to multiple contexts
await bidi_session.session.subscribe(
events=["log.entryAdded"], contexts=[top_context["context"], new_tab["context"]]
)
# Unsubscribe from log events in one of the contexts
await bidi_session.session.unsubscribe(
events=["log.entryAdded"], contexts=[top_context["context"]]
)
# Track all received log.entryAdded events in the events array
events = []
async def on_event(_, data):
events.append(data)
remove_listener = bidi_session.add_event_listener("log.entryAdded", on_event)
# Trigger console event in the unsubscribed context
await create_console_api_message(bidi_session, top_context, "text1")
assert len(events) == 0
# Trigger another console event in the still observed context
on_entry_added = wait_for_event("log.entryAdded")
expected_text = await create_console_api_message(bidi_session, new_tab, "text2")
await on_entry_added
assert len(events) == 1
recursive_compare(
{
"text": expected_text,
},
events[0],
)
remove_listener()
await bidi_session.session.unsubscribe(
events=["log.entryAdded"], contexts=[new_tab["context"]]
)
@pytest.mark.asyncio
async def test_unsubscribe_from_top_context_with_iframes(
bidi_session,
top_context,
test_page_same_origin_frame,
):
await bidi_session.browsing_context.navigate(
context=top_context["context"], url=test_page_same_origin_frame, wait="complete"
)
contexts = await bidi_session.browsing_context.get_tree(root=top_context["context"])
assert len(contexts[0]["children"]) == 1
frame = contexts[0]["children"][0]
# Subscribe and unsubscribe to the top context
await bidi_session.session.subscribe(
events=["log.entryAdded"], contexts=[top_context["context"]]
)
await bidi_session.session.unsubscribe(
events=["log.entryAdded"], contexts=[top_context["context"]]
)
# Track all received log.entryAdded events in the events array
events = []
async def on_event(_, data):
events.append(data)
remove_listener = bidi_session.add_event_listener("log.entryAdded", on_event)
# Trigger the event in the frame
await create_console_api_message(bidi_session, frame, "text1")
assert len(events) == 0
remove_listener()
@pytest.mark.asyncio
async def test_unsubscribe_from_child_context(
bidi_session,
top_context,
test_page_same_origin_frame,
):
await bidi_session.browsing_context.navigate(
context=top_context["context"], url=test_page_same_origin_frame, wait="complete"
)
contexts = await bidi_session.browsing_context.get_tree(root=top_context["context"])
assert len(contexts[0]["children"]) == 1
frame = contexts[0]["children"][0]
# Subscribe to top context
await bidi_session.session.subscribe(
events=["log.entryAdded"], contexts=[top_context["context"]]
)
# Unsubscribe from the frame context
await bidi_session.session.unsubscribe(
events=["log.entryAdded"], contexts=[frame["context"]]
)
# Track all received log.entryAdded events in the events array
events = []
async def on_event(_, data):
events.append(data)
remove_listener = bidi_session.add_event_listener("log.entryAdded", on_event)
# Trigger the event in the frame
await create_console_api_message(bidi_session, frame, "text1")
# Trigger the event in the top context
await create_console_api_message(bidi_session, top_context, "text2")
# Make sure we didn't receive any of the triggered events
assert len(events) == 0
remove_listener()
@pytest.mark.asyncio
async def test_unsubscribe_from_one_context_after_navigation(
bidi_session, top_context, test_alt_origin
):
await bidi_session.session.subscribe(
events=["log.entryAdded"], contexts=[top_context["context"]]
)
await bidi_session.browsing_context.navigate(
context=top_context["context"], url=test_alt_origin, wait="complete"
)
await bidi_session.session.unsubscribe(
events=["log.entryAdded"], contexts=[top_context["context"]]
)
# Track all received log.entryAdded events in the events array
events = []
async def on_event(_, data):
events.append(data)
remove_listener = bidi_session.add_event_listener("log.entryAdded", on_event)
# Trigger the event
await create_console_api_message(bidi_session, top_context, "text1")
# Make sure we successfully unsubscribed
assert len(events) == 0
remove_listener()