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 "content/browser/frame_host/navigation_controller_impl.h" | 5 #include "content/browser/frame_host/navigation_controller_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 3577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3588 // If the renderer claims it performed an in-page navigation from | 3588 // If the renderer claims it performed an in-page navigation from |
3589 // about:blank, trust the renderer. | 3589 // about:blank, trust the renderer. |
3590 // This can happen when an iframe is created and populated via | 3590 // This can happen when an iframe is created and populated via |
3591 // document.write(), then tries to perform a fragment navigation. | 3591 // document.write(), then tries to perform a fragment navigation. |
3592 // TODO(japhet): We should only trust the renderer if the about:blank | 3592 // TODO(japhet): We should only trust the renderer if the about:blank |
3593 // was the first document in the given frame, but we don't have enough | 3593 // was the first document in the given frame, but we don't have enough |
3594 // information to identify that case currently. | 3594 // information to identify that case currently. |
3595 const GURL blank_url(url::kAboutBlankURL); | 3595 const GURL blank_url(url::kAboutBlankURL); |
3596 main_test_rfh()->NavigateAndCommitRendererInitiated(0, true, blank_url); | 3596 main_test_rfh()->NavigateAndCommitRendererInitiated(0, true, blank_url); |
3597 EXPECT_TRUE(controller.IsURLInPageNavigation(url, true, | 3597 EXPECT_TRUE(controller.IsURLInPageNavigation(url, true, |
3598 main_test_rfh())); | 3598 main_test_rfh(), false)); |
3599 | 3599 |
3600 // Navigate to URL with no refs. | 3600 // Navigate to URL with no refs. |
3601 main_test_rfh()->NavigateAndCommitRendererInitiated(0, false, url); | 3601 main_test_rfh()->NavigateAndCommitRendererInitiated(0, false, url); |
3602 | 3602 |
3603 // Reloading the page is not an in-page navigation. | 3603 // Reloading the page is not an in-page navigation. |
3604 EXPECT_FALSE(controller.IsURLInPageNavigation(url, false, main_test_rfh())); | 3604 EXPECT_FALSE(controller.IsURLInPageNavigation(url, false, main_test_rfh(), |
| 3605 false)); |
3605 const GURL other_url("http://www.google.com/add.html"); | 3606 const GURL other_url("http://www.google.com/add.html"); |
3606 EXPECT_FALSE(controller.IsURLInPageNavigation(other_url, false, | 3607 EXPECT_FALSE(controller.IsURLInPageNavigation(other_url, false, |
3607 main_test_rfh())); | 3608 main_test_rfh(), false)); |
3608 const GURL url_with_ref("http://www.google.com/home.html#my_ref"); | 3609 const GURL url_with_ref("http://www.google.com/home.html#my_ref"); |
3609 EXPECT_TRUE(controller.IsURLInPageNavigation(url_with_ref, true, | 3610 EXPECT_TRUE(controller.IsURLInPageNavigation(url_with_ref, true, |
3610 main_test_rfh())); | 3611 main_test_rfh(), false)); |
3611 | 3612 |
3612 // Navigate to URL with refs. | 3613 // Navigate to URL with refs. |
3613 main_test_rfh()->NavigateAndCommitRendererInitiated(1, true, url_with_ref); | 3614 main_test_rfh()->NavigateAndCommitRendererInitiated(1, true, url_with_ref); |
3614 | 3615 |
3615 // Reloading the page is not an in-page navigation. | 3616 // Reloading the page is not an in-page navigation. |
3616 EXPECT_FALSE(controller.IsURLInPageNavigation(url_with_ref, false, | 3617 EXPECT_FALSE(controller.IsURLInPageNavigation(url_with_ref, false, |
3617 main_test_rfh())); | 3618 main_test_rfh(), false)); |
3618 EXPECT_FALSE(controller.IsURLInPageNavigation(url, false, | 3619 EXPECT_FALSE(controller.IsURLInPageNavigation(url, false, |
3619 main_test_rfh())); | 3620 main_test_rfh(), false)); |
3620 EXPECT_FALSE(controller.IsURLInPageNavigation(other_url, false, | 3621 EXPECT_FALSE(controller.IsURLInPageNavigation(other_url, false, |
3621 main_test_rfh())); | 3622 main_test_rfh(), false)); |
3622 const GURL other_url_with_ref("http://www.google.com/home.html#my_other_ref"); | 3623 const GURL other_url_with_ref("http://www.google.com/home.html#my_other_ref"); |
3623 EXPECT_TRUE(controller.IsURLInPageNavigation(other_url_with_ref, true, | 3624 EXPECT_TRUE(controller.IsURLInPageNavigation(other_url_with_ref, true, |
3624 main_test_rfh())); | 3625 main_test_rfh(), false)); |
3625 | 3626 |
3626 // Going to the same url again will be considered in-page | 3627 // Going to the same url again will be considered in-page |
3627 // if the renderer says it is even if the navigation type isn't IN_PAGE. | 3628 // if the renderer says it is even if the navigation type isn't IN_PAGE. |
3628 EXPECT_TRUE(controller.IsURLInPageNavigation(url_with_ref, true, | 3629 EXPECT_TRUE(controller.IsURLInPageNavigation(url_with_ref, true, |
3629 main_test_rfh())); | 3630 main_test_rfh(), false)); |
3630 | 3631 |
3631 // Going back to the non ref url will be considered in-page if the navigation | 3632 // Going back to the non ref url will be considered in-page if the navigation |
3632 // type is IN_PAGE. | 3633 // type is IN_PAGE. |
3633 EXPECT_TRUE(controller.IsURLInPageNavigation(url, true, | 3634 EXPECT_TRUE(controller.IsURLInPageNavigation(url, true, |
3634 main_test_rfh())); | 3635 main_test_rfh(), false)); |
3635 | 3636 |
3636 // If the renderer says this is a same-origin in-page navigation, believe it. | 3637 // If the renderer says this is a same-origin in-page navigation, believe it. |
3637 // This is the pushState/replaceState case. | 3638 // This is the pushState/replaceState case. |
3638 EXPECT_TRUE(controller.IsURLInPageNavigation(other_url, true, | 3639 EXPECT_TRUE(controller.IsURLInPageNavigation(other_url, true, |
3639 main_test_rfh())); | 3640 main_test_rfh(), false)); |
3640 | 3641 |
3641 // Don't believe the renderer if it claims a cross-origin navigation is | 3642 // Don't believe the renderer if it claims a cross-origin navigation is |
3642 // in-page. | 3643 // in-page. |
3643 const GURL different_origin_url("http://www.example.com"); | 3644 const GURL different_origin_url("http://www.example.com"); |
3644 MockRenderProcessHost* rph = main_test_rfh()->GetProcess(); | 3645 MockRenderProcessHost* rph = main_test_rfh()->GetProcess(); |
3645 EXPECT_EQ(0, rph->bad_msg_count()); | 3646 EXPECT_EQ(0, rph->bad_msg_count()); |
3646 EXPECT_FALSE(controller.IsURLInPageNavigation(different_origin_url, true, | 3647 EXPECT_FALSE(controller.IsURLInPageNavigation(different_origin_url, true, |
3647 main_test_rfh())); | 3648 main_test_rfh(), false)); |
3648 EXPECT_EQ(1, rph->bad_msg_count()); | 3649 EXPECT_EQ(1, rph->bad_msg_count()); |
3649 } | 3650 } |
3650 | 3651 |
3651 // Tests that IsInPageNavigation behaves properly with the | 3652 // Tests that IsInPageNavigation behaves properly with the |
3652 // allow_universal_access_from_file_urls flag. | 3653 // allow_universal_access_from_file_urls flag. |
3653 TEST_F(NavigationControllerTest, IsInPageNavigationWithUniversalFileAccess) { | 3654 TEST_F(NavigationControllerTest, IsInPageNavigationWithUniversalFileAccess) { |
3654 NavigationControllerImpl& controller = controller_impl(); | 3655 NavigationControllerImpl& controller = controller_impl(); |
3655 | 3656 |
3656 // Test allow_universal_access_from_file_urls flag. | 3657 // Test allow_universal_access_from_file_urls flag. |
3657 const GURL different_origin_url("http://www.example.com"); | 3658 const GURL different_origin_url("http://www.example.com"); |
3658 MockRenderProcessHost* rph = main_test_rfh()->GetProcess(); | 3659 MockRenderProcessHost* rph = main_test_rfh()->GetProcess(); |
3659 WebPreferences prefs = test_rvh()->GetWebkitPreferences(); | 3660 WebPreferences prefs = test_rvh()->GetWebkitPreferences(); |
3660 prefs.allow_universal_access_from_file_urls = true; | 3661 prefs.allow_universal_access_from_file_urls = true; |
3661 test_rvh()->UpdateWebkitPreferences(prefs); | 3662 test_rvh()->UpdateWebkitPreferences(prefs); |
3662 prefs = test_rvh()->GetWebkitPreferences(); | 3663 prefs = test_rvh()->GetWebkitPreferences(); |
3663 EXPECT_TRUE(prefs.allow_universal_access_from_file_urls); | 3664 EXPECT_TRUE(prefs.allow_universal_access_from_file_urls); |
3664 | 3665 |
3665 // Allow in page navigation to be cross-origin if existing URL is file scheme. | 3666 // Allow in page navigation to be cross-origin if existing URL is file scheme. |
3666 const GURL file_url("file:///foo/index.html"); | 3667 const GURL file_url("file:///foo/index.html"); |
3667 const url::Origin file_origin(file_url); | 3668 const url::Origin file_origin(file_url); |
3668 main_test_rfh()->NavigateAndCommitRendererInitiated(0, true, file_url); | 3669 main_test_rfh()->NavigateAndCommitRendererInitiated(0, true, file_url); |
3669 EXPECT_TRUE(file_origin.IsSameOriginWith( | 3670 EXPECT_TRUE(file_origin.IsSameOriginWith( |
3670 main_test_rfh()->frame_tree_node()->current_origin())); | 3671 main_test_rfh()->frame_tree_node()->current_origin())); |
3671 EXPECT_EQ(0, rph->bad_msg_count()); | 3672 EXPECT_EQ(0, rph->bad_msg_count()); |
3672 EXPECT_TRUE(controller.IsURLInPageNavigation(different_origin_url, true, | 3673 EXPECT_TRUE(controller.IsURLInPageNavigation(different_origin_url, true, |
3673 main_test_rfh())); | 3674 main_test_rfh(), false)); |
3674 EXPECT_EQ(0, rph->bad_msg_count()); | 3675 EXPECT_EQ(0, rph->bad_msg_count()); |
3675 | 3676 |
3676 // Doing a replaceState to a cross-origin URL is thus allowed. | 3677 // Doing a replaceState to a cross-origin URL is thus allowed. |
3677 FrameHostMsg_DidCommitProvisionalLoad_Params params; | 3678 FrameHostMsg_DidCommitProvisionalLoad_Params params; |
3678 params.page_id = 1; | 3679 params.page_id = 1; |
3679 params.nav_entry_id = 1; | 3680 params.nav_entry_id = 1; |
3680 params.did_create_new_entry = false; | 3681 params.did_create_new_entry = false; |
3681 params.url = different_origin_url; | 3682 params.url = different_origin_url; |
3682 params.origin = file_origin; | 3683 params.origin = file_origin; |
3683 params.transition = ui::PAGE_TRANSITION_LINK; | 3684 params.transition = ui::PAGE_TRANSITION_LINK; |
3684 params.gesture = NavigationGestureUser; | 3685 params.gesture = NavigationGestureUser; |
3685 params.page_state = PageState::CreateFromURL(different_origin_url); | 3686 params.page_state = PageState::CreateFromURL(different_origin_url); |
3686 params.was_within_same_page = true; | 3687 params.was_within_same_page = true; |
3687 params.is_post = false; | 3688 params.is_post = false; |
3688 params.post_id = -1; | 3689 params.post_id = -1; |
3689 main_test_rfh()->SendRendererInitiatedNavigationRequest(different_origin_url, | 3690 main_test_rfh()->SendRendererInitiatedNavigationRequest(different_origin_url, |
3690 false); | 3691 false); |
3691 main_test_rfh()->PrepareForCommit(); | 3692 main_test_rfh()->PrepareForCommit(); |
3692 contents()->GetMainFrame()->SendNavigateWithParams(¶ms); | 3693 contents()->GetMainFrame()->SendNavigateWithParams(¶ms); |
3693 | 3694 |
3694 // At this point, we should still consider the current origin to be file://, | 3695 // At this point, we should still consider the current origin to be file://, |
3695 // so that a file URL would still be in-page. See https://crbug.com/553418. | 3696 // so that a file URL would still be in-page. See https://crbug.com/553418. |
3696 EXPECT_TRUE(file_origin.IsSameOriginWith( | 3697 EXPECT_TRUE(file_origin.IsSameOriginWith( |
3697 main_test_rfh()->frame_tree_node()->current_origin())); | 3698 main_test_rfh()->frame_tree_node()->current_origin())); |
3698 EXPECT_TRUE( | 3699 EXPECT_TRUE( |
3699 controller.IsURLInPageNavigation(file_url, true, main_test_rfh())); | 3700 controller.IsURLInPageNavigation(file_url, true, main_test_rfh(), false)); |
3700 EXPECT_EQ(0, rph->bad_msg_count()); | 3701 EXPECT_EQ(0, rph->bad_msg_count()); |
3701 | 3702 |
3702 // Don't honor allow_universal_access_from_file_urls if actual URL is | 3703 // Don't honor allow_universal_access_from_file_urls if actual URL is |
3703 // not file scheme. | 3704 // not file scheme. |
3704 const GURL url("http://www.google.com/home.html"); | 3705 const GURL url("http://www.google.com/home.html"); |
3705 main_test_rfh()->NavigateAndCommitRendererInitiated(2, true, url); | 3706 main_test_rfh()->NavigateAndCommitRendererInitiated(2, true, url); |
3706 EXPECT_FALSE(controller.IsURLInPageNavigation(different_origin_url, true, | 3707 EXPECT_FALSE(controller.IsURLInPageNavigation(different_origin_url, true, |
3707 main_test_rfh())); | 3708 main_test_rfh(), false)); |
3708 EXPECT_EQ(1, rph->bad_msg_count()); | 3709 EXPECT_EQ(1, rph->bad_msg_count()); |
3709 } | 3710 } |
3710 | 3711 |
3711 // Some pages can have subframes with the same base URL (minus the reference) as | 3712 // Some pages can have subframes with the same base URL (minus the reference) as |
3712 // the main page. Even though this is hard, it can happen, and we don't want | 3713 // the main page. Even though this is hard, it can happen, and we don't want |
3713 // these subframe navigations to affect the toplevel document. They should | 3714 // these subframe navigations to affect the toplevel document. They should |
3714 // instead be ignored. http://crbug.com/5585 | 3715 // instead be ignored. http://crbug.com/5585 |
3715 TEST_F(NavigationControllerTest, SameSubframe) { | 3716 TEST_F(NavigationControllerTest, SameSubframe) { |
3716 NavigationControllerImpl& controller = controller_impl(); | 3717 NavigationControllerImpl& controller = controller_impl(); |
3717 // Navigate the main frame. | 3718 // Navigate the main frame. |
(...skipping 1405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5123 EXPECT_EQ(default_ssl_status.connection_status, | 5124 EXPECT_EQ(default_ssl_status.connection_status, |
5124 details.ssl_status.connection_status); | 5125 details.ssl_status.connection_status); |
5125 EXPECT_EQ(default_ssl_status.content_status, | 5126 EXPECT_EQ(default_ssl_status.content_status, |
5126 details.ssl_status.content_status); | 5127 details.ssl_status.content_status); |
5127 EXPECT_EQ(0u, details.ssl_status.signed_certificate_timestamp_ids.size()); | 5128 EXPECT_EQ(0u, details.ssl_status.signed_certificate_timestamp_ids.size()); |
5128 | 5129 |
5129 EXPECT_EQ(1, main_test_rfh()->GetProcess()->bad_msg_count()); | 5130 EXPECT_EQ(1, main_test_rfh()->GetProcess()->bad_msg_count()); |
5130 } | 5131 } |
5131 | 5132 |
5132 } // namespace content | 5133 } // namespace content |
OLD | NEW |