Home | History | Annotate | Download | only in extensions
      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.
     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.
     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.
     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.
    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