| // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Tests common functionality used by the Chrome Extensions webNavigation API |
| // implementation. |
| |
| #include "base/values.h" |
| #include "chrome/browser/extensions/extension_webnavigation_api.h" |
| #include "chrome/test/testing_profile.h" |
| #include "content/browser/renderer_host/test_render_view_host.h" |
| #include "content/browser/tab_contents/test_tab_contents.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| |
| class FrameNavigationStateTest : public RenderViewHostTestHarness { |
| }; |
| |
| // Test that a frame is correctly tracked, and removed once the tab contents |
| // goes away. |
| TEST_F(FrameNavigationStateTest, TrackFrame) { |
| FrameNavigationState navigation_state; |
| const int64 frame_id1 = 23; |
| const int64 frame_id2 = 42; |
| const GURL url1("http://www.google.com/"); |
| const GURL url2("http://mail.google.com/"); |
| |
| // Create a main frame. |
| EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1)); |
| navigation_state.TrackFrame(frame_id1, url1, true, false, contents()); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); |
| |
| // Add a sub frame. |
| EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); |
| navigation_state.TrackFrame(frame_id2, url2, false, false, contents()); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); |
| |
| // Check frame state. |
| EXPECT_TRUE(navigation_state.IsMainFrame(frame_id1)); |
| EXPECT_EQ(url1, navigation_state.GetUrl(frame_id1)); |
| EXPECT_FALSE(navigation_state.IsMainFrame(frame_id2)); |
| EXPECT_EQ(url2, navigation_state.GetUrl(frame_id2)); |
| |
| |
| // Removing the tab contents should also remove all state of its frames. |
| navigation_state.RemoveTabContentsState(contents()); |
| EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1)); |
| EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); |
| } |
| |
| // Test that no events can be sent for a frame after an error occurred, but |
| // before a new navigation happened in this frame. |
| TEST_F(FrameNavigationStateTest, ErrorState) { |
| FrameNavigationState navigation_state; |
| const int64 frame_id = 42; |
| const GURL url("http://www.google.com/"); |
| |
| navigation_state.TrackFrame(frame_id, url, true, false, contents()); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id)); |
| |
| // After an error occurred, no further events should be sent. |
| navigation_state.ErrorOccurredInFrame(frame_id); |
| EXPECT_FALSE(navigation_state.CanSendEvents(frame_id)); |
| |
| // Navigations to a network error page should be ignored. |
| navigation_state.TrackFrame(frame_id, GURL(), true, true, contents()); |
| EXPECT_FALSE(navigation_state.CanSendEvents(frame_id)); |
| |
| // However, when the frame navigates again, it should send events again. |
| navigation_state.TrackFrame(frame_id, url, true, false, contents()); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id)); |
| } |
| |
| // Tests that for a sub frame, no events are send after an error occurred, but |
| // before a new navigation happened in this frame. |
| TEST_F(FrameNavigationStateTest, ErrorStateFrame) { |
| FrameNavigationState navigation_state; |
| const int64 frame_id1 = 23; |
| const int64 frame_id2 = 42; |
| const GURL url("http://www.google.com/"); |
| |
| navigation_state.TrackFrame(frame_id1, url, true, false, contents()); |
| navigation_state.TrackFrame(frame_id2, url, false, false, contents()); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); |
| |
| // After an error occurred, no further events should be sent. |
| navigation_state.ErrorOccurredInFrame(frame_id2); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); |
| EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); |
| |
| // Navigations to a network error page should be ignored. |
| navigation_state.TrackFrame(frame_id2, GURL(), false, true, contents()); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); |
| EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2)); |
| |
| // However, when the frame navigates again, it should send events again. |
| navigation_state.TrackFrame(frame_id2, url, false, false, contents()); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); |
| EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); |
| } |
| |
| // Tests that no events are send for a not web-safe scheme. |
| TEST_F(FrameNavigationStateTest, WebSafeScheme) { |
| FrameNavigationState navigation_state; |
| const int64 frame_id = 23; |
| const GURL url("unsafe://www.google.com/"); |
| |
| navigation_state.TrackFrame(frame_id, url, true, false, contents()); |
| EXPECT_FALSE(navigation_state.CanSendEvents(frame_id)); |
| } |