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