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