OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/values.h" | 5 #include "base/values.h" |
6 #include "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h" | 6 #include "chrome/browser/extensions/api/web_navigation/frame_navigation_state.h" |
7 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | |
7 #include "chrome/test/base/testing_profile.h" | 8 #include "chrome/test/base/testing_profile.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
9 | 10 |
10 namespace extensions { | 11 namespace extensions { |
11 | 12 |
12 content::RenderViewHost* fake_rvh = | 13 class FrameNavigationStateTest : public ChromeRenderViewHostTestHarness { |
13 reinterpret_cast<content::RenderViewHost*>(31337); | 14 protected: |
15 FrameNavigationState navigation_state_; | |
16 }; | |
jochen (gone - plz use gerrit)
2014/07/14 09:38:36
private: DISALLOW_COPY_AND_ASSIGN
dcheng
2014/07/14 20:12:56
The base class (content::RenderViewHostTestHarness
| |
14 | 17 |
15 // Test that a frame is correctly tracked, and removed once the tab contents | 18 // Test that a frame is correctly tracked, and removed once the tab contents |
16 // goes away. | 19 // goes away. |
17 TEST(FrameNavigationStateTest, TrackFrame) { | 20 TEST_F(FrameNavigationStateTest, TrackFrame) { |
18 FrameNavigationState navigation_state; | |
19 const FrameNavigationState::FrameID frame_id0(-1, fake_rvh); | |
20 const FrameNavigationState::FrameID frame_id1(23, fake_rvh); | |
21 const FrameNavigationState::FrameID frame_id2(42, fake_rvh); | |
22 const GURL url1("http://www.google.com/"); | 21 const GURL url1("http://www.google.com/"); |
23 const GURL url2("http://mail.google.com/"); | 22 const GURL url2("http://mail.google.com/"); |
24 | 23 |
25 // Create a main frame. | 24 // Create a main frame. |
26 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1)); | 25 EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh())); |
27 EXPECT_FALSE(navigation_state.IsValidFrame(frame_id1)); | 26 EXPECT_FALSE(navigation_state_.IsValidFrame(main_rfh())); |
28 navigation_state.TrackFrame(frame_id1, frame_id0, url1, true, false, false); | 27 navigation_state_.TrackFrame(main_rfh(), url1, false, false); |
29 navigation_state.SetNavigationCommitted(frame_id1); | 28 navigation_state_.SetNavigationCommitted(main_rfh()); |
30 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | 29 EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh())); |
31 EXPECT_TRUE(navigation_state.IsValidFrame(frame_id1)); | 30 EXPECT_TRUE(navigation_state_.IsValidFrame(main_rfh())); |
32 | 31 |
33 // Add a sub frame. | 32 // Add a sub frame. |
34 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); | 33 content::RenderFrameHost* sub_frame = |
35 EXPECT_FALSE(navigation_state.IsValidFrame(frame_id2)); | 34 content::RenderFrameHostTester::For(main_rfh())->AppendChild("child"); |
36 navigation_state.TrackFrame(frame_id2, frame_id1, url2, false, false, false); | 35 EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame)); |
37 navigation_state.SetNavigationCommitted(frame_id2); | 36 EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame)); |
38 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); | 37 navigation_state_.TrackFrame(sub_frame, url2, false, false); |
39 EXPECT_TRUE(navigation_state.IsValidFrame(frame_id2)); | 38 navigation_state_.SetNavigationCommitted(sub_frame); |
39 EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame)); | |
40 EXPECT_TRUE(navigation_state_.IsValidFrame(sub_frame)); | |
40 | 41 |
41 // Check frame state. | 42 // Check frame state. |
42 EXPECT_TRUE(navigation_state.IsMainFrame(frame_id1)); | 43 EXPECT_EQ(url1, navigation_state_.GetUrl(main_rfh())); |
43 EXPECT_EQ(url1, navigation_state.GetUrl(frame_id1)); | 44 EXPECT_EQ(url2, navigation_state_.GetUrl(sub_frame)); |
44 EXPECT_FALSE(navigation_state.IsMainFrame(frame_id2)); | 45 EXPECT_EQ(main_rfh(), navigation_state_.GetLastCommittedMainFrameHost()); |
45 EXPECT_EQ(url2, navigation_state.GetUrl(frame_id2)); | |
46 EXPECT_EQ(frame_id1, navigation_state.GetMainFrameID()); | |
47 | 46 |
48 // Drop the frames. | 47 // Drop the frames. |
49 navigation_state.StopTrackingFramesInRVH(fake_rvh, | 48 navigation_state_.StopTrackingFramesInRVH(rvh(), NULL); |
50 FrameNavigationState::FrameID()); | 49 EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh())); |
51 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1)); | 50 EXPECT_FALSE(navigation_state_.IsValidFrame(main_rfh())); |
52 EXPECT_FALSE(navigation_state.IsValidFrame(frame_id1)); | 51 EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame)); |
53 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); | 52 EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame)); |
54 EXPECT_FALSE(navigation_state.IsValidFrame(frame_id2)); | |
55 } | 53 } |
56 | 54 |
57 // Test that no events can be sent for a frame after an error occurred, but | 55 // Test that no events can be sent for a frame after an error occurred, but |
58 // before a new navigation happened in this frame. | 56 // before a new navigation happened in this frame. |
59 TEST(FrameNavigationStateTest, ErrorState) { | 57 TEST_F(FrameNavigationStateTest, ErrorState) { |
60 FrameNavigationState navigation_state; | |
61 const FrameNavigationState::FrameID frame_id0(-1, fake_rvh); | |
62 const FrameNavigationState::FrameID frame_id1(42, fake_rvh); | |
63 const GURL url("http://www.google.com/"); | 58 const GURL url("http://www.google.com/"); |
64 | 59 |
65 navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false); | 60 navigation_state_.TrackFrame(main_rfh(), url, false, false); |
66 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | 61 EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh())); |
67 EXPECT_FALSE(navigation_state.GetErrorOccurredInFrame(frame_id1)); | 62 EXPECT_FALSE(navigation_state_.GetErrorOccurredInFrame(main_rfh())); |
68 | 63 |
69 // After an error occurred, no further events should be sent. | 64 // After an error occurred, no further events should be sent. |
70 navigation_state.SetErrorOccurredInFrame(frame_id1); | 65 navigation_state_.SetErrorOccurredInFrame(main_rfh()); |
71 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1)); | 66 EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh())); |
72 EXPECT_TRUE(navigation_state.GetErrorOccurredInFrame(frame_id1)); | 67 EXPECT_TRUE(navigation_state_.GetErrorOccurredInFrame(main_rfh())); |
73 | 68 |
74 // Navigations to a network error page should be ignored. | 69 // Navigations to a network error page should be ignored. |
75 navigation_state.TrackFrame(frame_id1, frame_id0, GURL(), true, true, false); | 70 navigation_state_.TrackFrame(main_rfh(), GURL(), true, false); |
76 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1)); | 71 EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh())); |
77 EXPECT_TRUE(navigation_state.GetErrorOccurredInFrame(frame_id1)); | 72 EXPECT_TRUE(navigation_state_.GetErrorOccurredInFrame(main_rfh())); |
78 | 73 |
79 // However, when the frame navigates again, it should send events again. | 74 // However, when the frame navigates again, it should send events again. |
80 navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false); | 75 navigation_state_.TrackFrame(main_rfh(), url, false, false); |
81 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | 76 EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh())); |
82 EXPECT_FALSE(navigation_state.GetErrorOccurredInFrame(frame_id1)); | 77 EXPECT_FALSE(navigation_state_.GetErrorOccurredInFrame(main_rfh())); |
83 } | 78 } |
84 | 79 |
85 // Tests that for a sub frame, no events are send after an error occurred, but | 80 // Tests that for a sub frame, no events are send after an error occurred, but |
86 // before a new navigation happened in this frame. | 81 // before a new navigation happened in this frame. |
87 TEST(FrameNavigationStateTest, ErrorStateFrame) { | 82 TEST_F(FrameNavigationStateTest, ErrorStateFrame) { |
88 FrameNavigationState navigation_state; | |
89 const FrameNavigationState::FrameID frame_id0(-1, fake_rvh); | |
90 const FrameNavigationState::FrameID frame_id1(23, fake_rvh); | |
91 const FrameNavigationState::FrameID frame_id2(42, fake_rvh); | |
92 const GURL url("http://www.google.com/"); | 83 const GURL url("http://www.google.com/"); |
93 | 84 |
94 navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false); | 85 content::RenderFrameHost* sub_frame = |
95 navigation_state.TrackFrame(frame_id2, frame_id1, url, false, false, false); | 86 content::RenderFrameHostTester::For(main_rfh())->AppendChild("child"); |
96 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | 87 navigation_state_.TrackFrame(main_rfh(), url, false, false); |
97 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); | 88 navigation_state_.TrackFrame(sub_frame, url, false, false); |
89 EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh())); | |
90 EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame)); | |
98 | 91 |
99 // After an error occurred, no further events should be sent. | 92 // After an error occurred, no further events should be sent. |
100 navigation_state.SetErrorOccurredInFrame(frame_id2); | 93 navigation_state_.SetErrorOccurredInFrame(sub_frame); |
101 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | 94 EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh())); |
102 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); | 95 EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame)); |
103 | 96 |
104 // Navigations to a network error page should be ignored. | 97 // Navigations to a network error page should be ignored. |
105 navigation_state.TrackFrame(frame_id2, frame_id1, GURL(), false, true, false); | 98 navigation_state_.TrackFrame(sub_frame, GURL(), true, false); |
106 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | 99 EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh())); |
107 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); | 100 EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame)); |
108 | 101 |
109 // However, when the frame navigates again, it should send events again. | 102 // However, when the frame navigates again, it should send events again. |
110 navigation_state.TrackFrame(frame_id2, frame_id1, url, false, false, false); | 103 navigation_state_.TrackFrame(sub_frame, url, false, false); |
111 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | 104 EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh())); |
112 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); | 105 EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame)); |
113 } | 106 } |
114 | 107 |
115 // Tests that no events are send for a not web-safe scheme. | 108 // Tests that no events are send for a not web-safe scheme. |
116 TEST(FrameNavigationStateTest, WebSafeScheme) { | 109 TEST_F(FrameNavigationStateTest, WebSafeScheme) { |
117 FrameNavigationState navigation_state; | |
118 const FrameNavigationState::FrameID frame_id0(-1, fake_rvh); | |
119 const FrameNavigationState::FrameID frame_id1(23, fake_rvh); | |
120 const GURL url("unsafe://www.google.com/"); | 110 const GURL url("unsafe://www.google.com/"); |
121 | 111 |
122 navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false); | 112 navigation_state_.TrackFrame(main_rfh(), url, false, false); |
123 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1)); | 113 EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh())); |
124 } | |
125 | |
126 // Test that parent frame IDs are tracked. | |
127 TEST(FrameNavigationStateTest, ParentFrameID) { | |
128 FrameNavigationState navigation_state; | |
129 const FrameNavigationState::FrameID frame_id0(-1, fake_rvh); | |
130 const FrameNavigationState::FrameID frame_id1(23, fake_rvh); | |
131 const FrameNavigationState::FrameID frame_id2(42, fake_rvh); | |
132 const GURL url("http://www.google.com/"); | |
133 | |
134 navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false); | |
135 navigation_state.TrackFrame(frame_id2, frame_id1, url, false, false, false); | |
136 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | |
137 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); | |
138 | |
139 EXPECT_TRUE(navigation_state.GetParentFrameID(frame_id1) == frame_id0); | |
140 EXPECT_TRUE(navigation_state.GetParentFrameID(frame_id2) == frame_id1); | |
141 } | 114 } |
142 | 115 |
143 // Test for <iframe srcdoc=""> frames. | 116 // Test for <iframe srcdoc=""> frames. |
144 TEST(FrameNavigationStateTest, SrcDoc) { | 117 TEST_F(FrameNavigationStateTest, SrcDoc) { |
145 FrameNavigationState navigation_state; | |
146 const FrameNavigationState::FrameID frame_id0(-1, fake_rvh); | |
147 const FrameNavigationState::FrameID frame_id1(23, fake_rvh); | |
148 const FrameNavigationState::FrameID frame_id2(42, fake_rvh); | |
149 const GURL url("http://www.google.com/"); | 118 const GURL url("http://www.google.com/"); |
150 const GURL blank("about:blank"); | 119 const GURL blank("about:blank"); |
151 const GURL srcdoc("about:srcdoc"); | 120 const GURL srcdoc("about:srcdoc"); |
152 | 121 |
153 navigation_state.TrackFrame(frame_id1, frame_id0, url, true, false, false); | 122 content::RenderFrameHost* sub_frame = |
154 navigation_state.TrackFrame(frame_id2, frame_id1, blank, false, false, true); | 123 content::RenderFrameHostTester::For(main_rfh())->AppendChild("child"); |
155 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | 124 navigation_state_.TrackFrame(main_rfh(), url, false, false); |
156 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); | 125 navigation_state_.TrackFrame(sub_frame, blank, false, true); |
126 EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh())); | |
127 EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame)); | |
157 | 128 |
158 EXPECT_TRUE(navigation_state.GetUrl(frame_id1) == url); | 129 EXPECT_EQ(url, navigation_state_.GetUrl(main_rfh())); |
159 EXPECT_TRUE(navigation_state.GetUrl(frame_id2) == srcdoc); | 130 EXPECT_EQ(srcdoc, navigation_state_.GetUrl(sub_frame)); |
160 | 131 |
161 EXPECT_TRUE(navigation_state.IsValidUrl(srcdoc)); | 132 EXPECT_TRUE(navigation_state_.IsValidUrl(srcdoc)); |
162 } | 133 } |
163 | 134 |
164 // Test that an individual frame can be detached. | 135 // Test that an individual frame can be detached. |
165 TEST(FrameNavigationStateTest, DetachFrame) { | 136 TEST_F(FrameNavigationStateTest, DetachFrame) { |
166 FrameNavigationState navigation_state; | |
167 const FrameNavigationState::FrameID frame_id0(-1, fake_rvh); | |
168 const FrameNavigationState::FrameID frame_id1(23, fake_rvh); | |
169 const FrameNavigationState::FrameID frame_id2(42, fake_rvh); | |
170 const GURL url1("http://www.google.com/"); | 137 const GURL url1("http://www.google.com/"); |
171 const GURL url2("http://mail.google.com/"); | 138 const GURL url2("http://mail.google.com/"); |
172 | 139 |
173 // Create a main frame. | 140 // Create a main frame. |
174 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1)); | 141 EXPECT_FALSE(navigation_state_.CanSendEvents(main_rfh())); |
175 EXPECT_FALSE(navigation_state.IsValidFrame(frame_id1)); | 142 EXPECT_FALSE(navigation_state_.IsValidFrame(main_rfh())); |
176 navigation_state.TrackFrame(frame_id1, frame_id0, url1, true, false, false); | 143 navigation_state_.TrackFrame(main_rfh(), url1, false, false); |
177 navigation_state.SetNavigationCommitted(frame_id1); | 144 navigation_state_.SetNavigationCommitted(main_rfh()); |
178 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); | 145 EXPECT_TRUE(navigation_state_.CanSendEvents(main_rfh())); |
179 EXPECT_TRUE(navigation_state.IsValidFrame(frame_id1)); | 146 EXPECT_TRUE(navigation_state_.IsValidFrame(main_rfh())); |
180 | 147 |
181 // Add a sub frame. | 148 // Add a sub frame. |
182 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); | 149 content::RenderFrameHost* sub_frame = |
183 EXPECT_FALSE(navigation_state.IsValidFrame(frame_id2)); | 150 content::RenderFrameHostTester::For(main_rfh())->AppendChild("child"); |
184 navigation_state.TrackFrame(frame_id2, frame_id1, url2, false, false, false); | 151 EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame)); |
185 navigation_state.SetNavigationCommitted(frame_id2); | 152 EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame)); |
186 EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); | 153 navigation_state_.TrackFrame(sub_frame, url2, false, false); |
187 EXPECT_TRUE(navigation_state.IsValidFrame(frame_id2)); | 154 navigation_state_.SetNavigationCommitted(sub_frame); |
155 EXPECT_TRUE(navigation_state_.CanSendEvents(sub_frame)); | |
156 EXPECT_TRUE(navigation_state_.IsValidFrame(sub_frame)); | |
188 | 157 |
189 // Check frame state. | 158 // Check frame state. |
190 EXPECT_TRUE(navigation_state.IsMainFrame(frame_id1)); | 159 EXPECT_EQ(url1, navigation_state_.GetUrl(main_rfh())); |
191 EXPECT_EQ(url1, navigation_state.GetUrl(frame_id1)); | 160 EXPECT_EQ(url2, navigation_state_.GetUrl(sub_frame)); |
192 EXPECT_FALSE(navigation_state.IsMainFrame(frame_id2)); | 161 EXPECT_EQ(main_rfh(), navigation_state_.GetLastCommittedMainFrameHost()); |
193 EXPECT_EQ(url2, navigation_state.GetUrl(frame_id2)); | |
194 EXPECT_EQ(frame_id1, navigation_state.GetMainFrameID()); | |
195 | 162 |
196 // Drop one frame. | 163 // Drop one frame. |
197 navigation_state.FrameDetached(frame_id2); | 164 navigation_state_.FrameDetached(sub_frame); |
198 EXPECT_TRUE(navigation_state.IsMainFrame(frame_id1)); | 165 EXPECT_EQ(url1, navigation_state_.GetUrl(main_rfh())); |
199 EXPECT_EQ(url1, navigation_state.GetUrl(frame_id1)); | 166 EXPECT_EQ(main_rfh(), navigation_state_.GetLastCommittedMainFrameHost()); |
200 EXPECT_EQ(frame_id1, navigation_state.GetMainFrameID()); | 167 EXPECT_FALSE(navigation_state_.CanSendEvents(sub_frame)); |
201 EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); | 168 EXPECT_FALSE(navigation_state_.IsValidFrame(sub_frame)); |
202 EXPECT_FALSE(navigation_state.IsValidFrame(frame_id2)); | |
203 } | 169 } |
204 | 170 |
205 } // namespace extensions | 171 } // namespace extensions |
OLD | NEW |