| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/bind.h" | 6 #include "base/bind.h" |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| 11 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
| 14 #include "content/browser/frame_host/navigation_controller_impl.h" | 14 #include "content/browser/frame_host/navigation_controller_impl.h" |
| 15 #include "content/browser/frame_host/navigation_entry_impl.h" | 15 #include "content/browser/frame_host/navigation_entry_impl.h" |
| 16 #include "content/browser/frame_host/navigation_entry_screenshot_manager.h" | 16 #include "content/browser/frame_host/navigation_entry_screenshot_manager.h" |
| 17 #include "content/browser/frame_host/navigator.h" |
| 17 #include "content/browser/site_instance_impl.h" | 18 #include "content/browser/site_instance_impl.h" |
| 18 #include "content/browser/web_contents/web_contents_impl.h" | 19 #include "content/browser/web_contents/web_contents_impl.h" |
| 19 #include "content/common/view_messages.h" | 20 #include "content/common/view_messages.h" |
| 20 #include "content/public/browser/navigation_details.h" | 21 #include "content/public/browser/navigation_details.h" |
| 21 #include "content/public/browser/notification_registrar.h" | 22 #include "content/public/browser/notification_registrar.h" |
| 22 #include "content/public/browser/notification_types.h" | 23 #include "content/public/browser/notification_types.h" |
| 23 #include "content/public/browser/render_view_host.h" | 24 #include "content/public/browser/render_view_host.h" |
| 24 #include "content/public/browser/web_contents_delegate.h" | 25 #include "content/public/browser/web_contents_delegate.h" |
| 25 #include "content/public/browser/web_contents_observer.h" | 26 #include "content/public/browser/web_contents_observer.h" |
| 26 #include "content/public/common/page_state.h" | 27 #include "content/public/common/page_state.h" |
| (...skipping 2614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2641 ASSERT_EQ(controller.GetEntryCount(), 2); | 2642 ASSERT_EQ(controller.GetEntryCount(), 2); |
| 2642 EXPECT_EQ(controller.GetEntryAtIndex(0)->GetURL(), url0); | 2643 EXPECT_EQ(controller.GetEntryAtIndex(0)->GetURL(), url0); |
| 2643 EXPECT_EQ(controller.GetEntryAtIndex(1)->GetURL(), transient_url); | 2644 EXPECT_EQ(controller.GetEntryAtIndex(1)->GetURL(), transient_url); |
| 2644 } | 2645 } |
| 2645 | 2646 |
| 2646 // Ensure that renderer initiated pending entries get replaced, so that we | 2647 // Ensure that renderer initiated pending entries get replaced, so that we |
| 2647 // don't show a stale virtual URL when a navigation commits. | 2648 // don't show a stale virtual URL when a navigation commits. |
| 2648 // See http://crbug.com/266922. | 2649 // See http://crbug.com/266922. |
| 2649 TEST_F(NavigationControllerTest, RendererInitiatedPendingEntries) { | 2650 TEST_F(NavigationControllerTest, RendererInitiatedPendingEntries) { |
| 2650 NavigationControllerImpl& controller = controller_impl(); | 2651 NavigationControllerImpl& controller = controller_impl(); |
| 2652 Navigator* navigator = |
| 2653 contents()->GetFrameTree()->root()->navigator(); |
| 2651 | 2654 |
| 2652 const GURL url1("nonexistent:12121"); | 2655 const GURL url1("nonexistent:12121"); |
| 2653 const GURL url1_fixed("http://nonexistent:12121/"); | 2656 const GURL url1_fixed("http://nonexistent:12121/"); |
| 2654 const GURL url2("http://foo"); | 2657 const GURL url2("http://foo"); |
| 2655 | 2658 |
| 2656 // We create pending entries for renderer-initiated navigations so that we | 2659 // We create pending entries for renderer-initiated navigations so that we |
| 2657 // can show them in new tabs when it is safe. | 2660 // can show them in new tabs when it is safe. |
| 2658 contents()->DidStartProvisionalLoadForFrame( | 2661 navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url1); |
| 2659 test_rvh(), 1, -1, true, url1); | |
| 2660 | 2662 |
| 2661 // Simulate what happens if a BrowserURLHandler rewrites the URL, causing | 2663 // Simulate what happens if a BrowserURLHandler rewrites the URL, causing |
| 2662 // the virtual URL to differ from the URL. | 2664 // the virtual URL to differ from the URL. |
| 2663 controller.GetPendingEntry()->SetURL(url1_fixed); | 2665 controller.GetPendingEntry()->SetURL(url1_fixed); |
| 2664 controller.GetPendingEntry()->SetVirtualURL(url1); | 2666 controller.GetPendingEntry()->SetVirtualURL(url1); |
| 2665 | 2667 |
| 2666 EXPECT_EQ(url1_fixed, controller.GetPendingEntry()->GetURL()); | 2668 EXPECT_EQ(url1_fixed, controller.GetPendingEntry()->GetURL()); |
| 2667 EXPECT_EQ(url1, controller.GetPendingEntry()->GetVirtualURL()); | 2669 EXPECT_EQ(url1, controller.GetPendingEntry()->GetVirtualURL()); |
| 2668 EXPECT_TRUE( | 2670 EXPECT_TRUE( |
| 2669 NavigationEntryImpl::FromNavigationEntry(controller.GetPendingEntry())-> | 2671 NavigationEntryImpl::FromNavigationEntry(controller.GetPendingEntry())-> |
| 2670 is_renderer_initiated()); | 2672 is_renderer_initiated()); |
| 2671 | 2673 |
| 2672 // If the user clicks another link, we should replace the pending entry. | 2674 // If the user clicks another link, we should replace the pending entry. |
| 2673 contents()->DidStartProvisionalLoadForFrame( | 2675 navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url2); |
| 2674 test_rvh(), 1, -1, true, url2); | |
| 2675 EXPECT_EQ(url2, controller.GetPendingEntry()->GetURL()); | 2676 EXPECT_EQ(url2, controller.GetPendingEntry()->GetURL()); |
| 2676 EXPECT_EQ(url2, controller.GetPendingEntry()->GetVirtualURL()); | 2677 EXPECT_EQ(url2, controller.GetPendingEntry()->GetVirtualURL()); |
| 2677 | 2678 |
| 2678 // Once it commits, the URL and virtual URL should reflect the actual page. | 2679 // Once it commits, the URL and virtual URL should reflect the actual page. |
| 2679 test_rvh()->SendNavigate(0, url2); | 2680 test_rvh()->SendNavigate(0, url2); |
| 2680 EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetURL()); | 2681 EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetURL()); |
| 2681 EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetVirtualURL()); | 2682 EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetVirtualURL()); |
| 2682 | 2683 |
| 2683 // We should not replace the pending entry for an error URL. | 2684 // We should not replace the pending entry for an error URL. |
| 2684 contents()->DidStartProvisionalLoadForFrame( | 2685 navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url1); |
| 2685 test_rvh(), 1, -1, true, url1); | |
| 2686 EXPECT_EQ(url1, controller.GetPendingEntry()->GetURL()); | 2686 EXPECT_EQ(url1, controller.GetPendingEntry()->GetURL()); |
| 2687 contents()->DidStartProvisionalLoadForFrame( | 2687 navigator->DidStartProvisionalLoad( |
| 2688 test_rvh(), 1, -1, true, GURL(kUnreachableWebDataURL)); | 2688 main_test_rfh(), 1, -1, true, GURL(kUnreachableWebDataURL)); |
| 2689 EXPECT_EQ(url1, controller.GetPendingEntry()->GetURL()); | 2689 EXPECT_EQ(url1, controller.GetPendingEntry()->GetURL()); |
| 2690 | 2690 |
| 2691 // We should remember if the pending entry will replace the current one. | 2691 // We should remember if the pending entry will replace the current one. |
| 2692 // http://crbug.com/308444. | 2692 // http://crbug.com/308444. |
| 2693 contents()->DidStartProvisionalLoadForFrame( | 2693 navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url1); |
| 2694 test_rvh(), 1, -1, true, url1); | |
| 2695 NavigationEntryImpl::FromNavigationEntry(controller.GetPendingEntry())-> | 2694 NavigationEntryImpl::FromNavigationEntry(controller.GetPendingEntry())-> |
| 2696 set_should_replace_entry(true); | 2695 set_should_replace_entry(true); |
| 2697 contents()->DidStartProvisionalLoadForFrame( | 2696 navigator->DidStartProvisionalLoad(main_test_rfh(), 1, -1, true, url2); |
| 2698 test_rvh(), 1, -1, true, url2); | |
| 2699 EXPECT_TRUE( | 2697 EXPECT_TRUE( |
| 2700 NavigationEntryImpl::FromNavigationEntry(controller.GetPendingEntry())-> | 2698 NavigationEntryImpl::FromNavigationEntry(controller.GetPendingEntry())-> |
| 2701 should_replace_entry()); | 2699 should_replace_entry()); |
| 2700 // TODO(nasko): Until OnNavigate is moved to RenderFrameHost, we need |
| 2701 // to go through the RenderViewHost. The TestRenderViewHost routes navigations |
| 2702 // to the main frame. |
| 2702 test_rvh()->SendNavigate(0, url2); | 2703 test_rvh()->SendNavigate(0, url2); |
| 2703 EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetURL()); | 2704 EXPECT_EQ(url2, controller.GetLastCommittedEntry()->GetURL()); |
| 2704 } | 2705 } |
| 2705 | 2706 |
| 2706 // Tests that the URLs for renderer-initiated navigations are not displayed to | 2707 // Tests that the URLs for renderer-initiated navigations are not displayed to |
| 2707 // the user until the navigation commits, to prevent URL spoof attacks. | 2708 // the user until the navigation commits, to prevent URL spoof attacks. |
| 2708 // See http://crbug.com/99016. | 2709 // See http://crbug.com/99016. |
| 2709 TEST_F(NavigationControllerTest, DontShowRendererURLUntilCommit) { | 2710 TEST_F(NavigationControllerTest, DontShowRendererURLUntilCommit) { |
| 2710 NavigationControllerImpl& controller = controller_impl(); | 2711 NavigationControllerImpl& controller = controller_impl(); |
| 2711 TestNotificationTracker notifications; | 2712 TestNotificationTracker notifications; |
| (...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3835 EXPECT_EQ(1, controller.GetEntryCount()); | 3836 EXPECT_EQ(1, controller.GetEntryCount()); |
| 3836 EXPECT_EQ(0, controller.GetCurrentEntryIndex()); | 3837 EXPECT_EQ(0, controller.GetCurrentEntryIndex()); |
| 3837 EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); | 3838 EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); |
| 3838 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); | 3839 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); |
| 3839 EXPECT_FALSE(controller.CanGoBack()); | 3840 EXPECT_FALSE(controller.CanGoBack()); |
| 3840 EXPECT_FALSE(controller.CanGoForward()); | 3841 EXPECT_FALSE(controller.CanGoForward()); |
| 3841 EXPECT_EQ(url4, controller.GetVisibleEntry()->GetURL()); | 3842 EXPECT_EQ(url4, controller.GetVisibleEntry()->GetURL()); |
| 3842 } | 3843 } |
| 3843 | 3844 |
| 3844 } // namespace content | 3845 } // namespace content |
| OLD | NEW |