1import pytest
2
3from tests.support.asserts import assert_success
4
5
6"""
7Tests that WebDriver can transcend site origins.
8
9Many modern browsers impose strict cross-origin checks,
10and WebDriver should be able to transcend these.
11
12Although an implementation detail, certain browsers
13also enforce process isolation based on site origin.
14This is known to sometimes cause problems for WebDriver implementations.
15"""
16
17
18@pytest.fixture
19def frame_doc(inline):
20    return inline("<p>frame")
21
22
23@pytest.fixture
24def one_frame_doc(inline, frame_doc):
25    return inline("<iframe src='%s'></iframe>" % frame_doc)
26
27
28@pytest.fixture
29def nested_frames_doc(inline, one_frame_doc):
30    return inline("<iframe src='%s'></iframe>" % one_frame_doc)
31
32
33def get_current_url(session):
34    return session.transport.send(
35        "GET", "session/{session_id}/url".format(**vars(session)))
36
37
38def test_iframe(session, one_frame_doc):
39    top_level_doc = one_frame_doc
40    session.url = top_level_doc
41
42    frame = session.find.css("iframe", all=False)
43    session.switch_frame(frame)
44    session.find.css("p", all=False)
45
46    response = get_current_url(session)
47    assert_success(response, top_level_doc)
48
49
50def test_nested_iframe(session, nested_frames_doc):
51    session.url = nested_frames_doc
52    top_level_doc = session.url
53
54    outer_frame = session.find.css("iframe", all=False)
55    session.switch_frame(outer_frame)
56
57    inner_frame = session.find.css("iframe", all=False)
58    session.switch_frame(inner_frame)
59    session.find.css("p", all=False)
60
61    response = get_current_url(session)
62    assert_success(response, top_level_doc)
63
64
65@pytest.mark.parametrize("domain", ["", "alt"], ids=["same_origin", "cross_origin"])
66def test_origin(session, inline, iframe, domain):
67    top_level_doc = inline(iframe("<p>frame", domain=domain))
68
69    session.url = top_level_doc
70    frame = session.find.css("iframe", all=False)
71    session.switch_frame(frame)
72    session.find.css("p", all=False)
73
74    response = get_current_url(session)
75    assert_success(response, top_level_doc)
76