• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Tests common functionality used by the Chrome Extensions webNavigation API
6 // implementation.
7 
8 #include "base/values.h"
9 #include "chrome/browser/extensions/extension_webnavigation_api.h"
10 #include "chrome/test/testing_profile.h"
11 #include "content/browser/renderer_host/test_render_view_host.h"
12 #include "content/browser/tab_contents/test_tab_contents.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
15 
16 class FrameNavigationStateTest : public RenderViewHostTestHarness {
17 };
18 
19 // Test that a frame is correctly tracked, and removed once the tab contents
20 // goes away.
TEST_F(FrameNavigationStateTest,TrackFrame)21 TEST_F(FrameNavigationStateTest, TrackFrame) {
22   FrameNavigationState navigation_state;
23   const int64 frame_id1 = 23;
24   const int64 frame_id2 = 42;
25   const GURL url1("http://www.google.com/");
26   const GURL url2("http://mail.google.com/");
27 
28   // Create a main frame.
29   EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
30   navigation_state.TrackFrame(frame_id1, url1, true, false, contents());
31   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
32 
33   // Add a sub frame.
34   EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
35   navigation_state.TrackFrame(frame_id2, url2, false, false, contents());
36   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
37 
38   // Check frame state.
39   EXPECT_TRUE(navigation_state.IsMainFrame(frame_id1));
40   EXPECT_EQ(url1, navigation_state.GetUrl(frame_id1));
41   EXPECT_FALSE(navigation_state.IsMainFrame(frame_id2));
42   EXPECT_EQ(url2, navigation_state.GetUrl(frame_id2));
43 
44 
45   // Removing the tab contents should also remove all state of its frames.
46   navigation_state.RemoveTabContentsState(contents());
47   EXPECT_FALSE(navigation_state.CanSendEvents(frame_id1));
48   EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
49 }
50 
51 // Test that no events can be sent for a frame after an error occurred, but
52 // before a new navigation happened in this frame.
TEST_F(FrameNavigationStateTest,ErrorState)53 TEST_F(FrameNavigationStateTest, ErrorState) {
54   FrameNavigationState navigation_state;
55   const int64 frame_id = 42;
56   const GURL url("http://www.google.com/");
57 
58   navigation_state.TrackFrame(frame_id, url, true, false, contents());
59   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id));
60 
61   // After an error occurred, no further events should be sent.
62   navigation_state.ErrorOccurredInFrame(frame_id);
63   EXPECT_FALSE(navigation_state.CanSendEvents(frame_id));
64 
65   // Navigations to a network error page should be ignored.
66   navigation_state.TrackFrame(frame_id, GURL(), true, true, contents());
67   EXPECT_FALSE(navigation_state.CanSendEvents(frame_id));
68 
69   // However, when the frame navigates again, it should send events again.
70   navigation_state.TrackFrame(frame_id, url, true, false, contents());
71   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id));
72 }
73 
74 // Tests that for a sub frame, no events are send after an error occurred, but
75 // before a new navigation happened in this frame.
TEST_F(FrameNavigationStateTest,ErrorStateFrame)76 TEST_F(FrameNavigationStateTest, ErrorStateFrame) {
77   FrameNavigationState navigation_state;
78   const int64 frame_id1 = 23;
79   const int64 frame_id2 = 42;
80   const GURL url("http://www.google.com/");
81 
82   navigation_state.TrackFrame(frame_id1, url, true, false, contents());
83   navigation_state.TrackFrame(frame_id2, url, false, false, contents());
84   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
85   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
86 
87   // After an error occurred, no further events should be sent.
88   navigation_state.ErrorOccurredInFrame(frame_id2);
89   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
90   EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
91 
92   // Navigations to a network error page should be ignored.
93   navigation_state.TrackFrame(frame_id2, GURL(), false, true, contents());
94   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
95   EXPECT_FALSE(navigation_state.CanSendEvents(frame_id2));
96 
97   // However, when the frame navigates again, it should send events again.
98   navigation_state.TrackFrame(frame_id2, url, false, false, contents());
99   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id1));
100   EXPECT_TRUE(navigation_state.CanSendEvents(frame_id2));
101 }
102 
103 // Tests that no events are send for a not web-safe scheme.
TEST_F(FrameNavigationStateTest,WebSafeScheme)104 TEST_F(FrameNavigationStateTest, WebSafeScheme) {
105   FrameNavigationState navigation_state;
106   const int64 frame_id = 23;
107   const GURL url("unsafe://www.google.com/");
108 
109   navigation_state.TrackFrame(frame_id, url, true, false, contents());
110   EXPECT_FALSE(navigation_state.CanSendEvents(frame_id));
111 }
112