Chromium Code Reviews| 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 |