diff options
Diffstat (limited to 'chrome/browser/extensions/extension_webnavigation_unittest.cc')
-rw-r--r-- | chrome/browser/extensions/extension_webnavigation_unittest.cc | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_webnavigation_unittest.cc b/chrome/browser/extensions/extension_webnavigation_unittest.cc new file mode 100644 index 0000000..5ac378e --- /dev/null +++ b/chrome/browser/extensions/extension_webnavigation_unittest.cc @@ -0,0 +1,105 @@ +// 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 "testing/gtest/include/gtest/gtest.h" + +#include "base/values.h" +#include "chrome/browser/browser_thread.h" +#include "chrome/browser/extensions/extension_webnavigation_api.h" +#include "chrome/browser/renderer_host/test/test_render_view_host.h" +#include "chrome/browser/tab_contents/test_tab_contents.h" +#include "chrome/common/url_constants.h" +#include "chrome/test/testing_profile.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 long long frame_id1 = 23; + const long long 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, 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, 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 long long frame_id = 42; + const GURL url("http://www.google.com/"); + + navigation_state.TrackFrame(frame_id, url, true, 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 the "unreachable web data" URL should be ignored. + navigation_state.TrackFrame( + frame_id, GURL(chrome::kUnreachableWebDataURL), 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, 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 long long frame_id1 = 23; + const long long frame_id2 = 42; + const GURL url("http://www.google.com/"); + + navigation_state.TrackFrame(frame_id1, url, true, contents()); + navigation_state.TrackFrame(frame_id2, url, 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 the "unreachable web data" URL should be ignored. + navigation_state.TrackFrame( + frame_id2, GURL(chrome::kUnreachableWebDataURL), false, 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, contents()); + EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1)); + EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2)); +} |