| 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 |