| 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/render_frame_host_impl.h" | 5 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 // notification containing parameters identifying the navigation. | 781 // notification containing parameters identifying the navigation. |
| 782 // | 782 // |
| 783 // Subframes are identified by the page transition type. For subframes loaded | 783 // Subframes are identified by the page transition type. For subframes loaded |
| 784 // as part of a wider page load, the page_id will be the same as for the top | 784 // as part of a wider page load, the page_id will be the same as for the top |
| 785 // level frame. If the user explicitly requests a subframe navigation, we will | 785 // level frame. If the user explicitly requests a subframe navigation, we will |
| 786 // get a new page_id because we need to create a new navigation entry for that | 786 // get a new page_id because we need to create a new navigation entry for that |
| 787 // action. | 787 // action. |
| 788 void RenderFrameHostImpl::OnDidCommitProvisionalLoad(const IPC::Message& msg) { | 788 void RenderFrameHostImpl::OnDidCommitProvisionalLoad(const IPC::Message& msg) { |
| 789 // Read the parameters out of the IPC message directly to avoid making another | 789 // Read the parameters out of the IPC message directly to avoid making another |
| 790 // copy when we filter the URLs. | 790 // copy when we filter the URLs. |
| 791 ++commit_count_; | |
| 792 base::PickleIterator iter(msg); | 791 base::PickleIterator iter(msg); |
| 793 FrameHostMsg_DidCommitProvisionalLoad_Params validated_params; | 792 FrameHostMsg_DidCommitProvisionalLoad_Params validated_params; |
| 794 if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>:: | 793 if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>:: |
| 795 Read(&msg, &iter, &validated_params)) { | 794 Read(&msg, &iter, &validated_params)) |
| 796 base::debug::SetCrashKeyValue("369661-earlyreturn", | |
| 797 CommitCountString() + "/badipc"); | |
| 798 return; | 795 return; |
| 799 } | |
| 800 TRACE_EVENT1("navigation", "RenderFrameHostImpl::OnDidCommitProvisionalLoad", | 796 TRACE_EVENT1("navigation", "RenderFrameHostImpl::OnDidCommitProvisionalLoad", |
| 801 "url", validated_params.url.possibly_invalid_spec()); | 797 "url", validated_params.url.possibly_invalid_spec()); |
| 802 | 798 |
| 803 // Sanity-check the page transition for frame type. | 799 // Sanity-check the page transition for frame type. |
| 804 DCHECK_EQ(ui::PageTransitionIsMainFrame(validated_params.transition), | 800 DCHECK_EQ(ui::PageTransitionIsMainFrame(validated_params.transition), |
| 805 !GetParent()); | 801 !GetParent()); |
| 806 | 802 |
| 807 // If we're waiting for a cross-site beforeunload ack from this renderer and | 803 // If we're waiting for a cross-site beforeunload ack from this renderer and |
| 808 // we receive a Navigate message from the main frame, then the renderer was | 804 // we receive a Navigate message from the main frame, then the renderer was |
| 809 // navigating already and sent it before hearing the FrameMsg_Stop message. | 805 // navigating already and sent it before hearing the FrameMsg_Stop message. |
| 810 // We do not want to cancel the pending navigation in this case, since the | 806 // We do not want to cancel the pending navigation in this case, since the |
| 811 // old page will soon be stopped. Instead, treat this as a beforeunload ack | 807 // old page will soon be stopped. Instead, treat this as a beforeunload ack |
| 812 // to allow the pending navigation to continue. | 808 // to allow the pending navigation to continue. |
| 813 if (is_waiting_for_beforeunload_ack_ && | 809 if (is_waiting_for_beforeunload_ack_ && |
| 814 unload_ack_is_for_navigation_ && | 810 unload_ack_is_for_navigation_ && |
| 815 !GetParent()) { | 811 !GetParent()) { |
| 816 base::TimeTicks approx_renderer_start_time = send_before_unload_start_time_; | 812 base::TimeTicks approx_renderer_start_time = send_before_unload_start_time_; |
| 817 OnBeforeUnloadACK(true, approx_renderer_start_time, base::TimeTicks::Now()); | 813 OnBeforeUnloadACK(true, approx_renderer_start_time, base::TimeTicks::Now()); |
| 818 base::debug::SetCrashKeyValue("369661-earlyreturn", | |
| 819 CommitCountString() + "/beforeunloadwait"); | |
| 820 return; | 814 return; |
| 821 } | 815 } |
| 822 | 816 |
| 823 // If we're waiting for an unload ack from this renderer and we receive a | 817 // If we're waiting for an unload ack from this renderer and we receive a |
| 824 // Navigate message, then the renderer was navigating before it received the | 818 // Navigate message, then the renderer was navigating before it received the |
| 825 // unload request. It will either respond to the unload request soon or our | 819 // unload request. It will either respond to the unload request soon or our |
| 826 // timer will expire. Either way, we should ignore this message, because we | 820 // timer will expire. Either way, we should ignore this message, because we |
| 827 // have already committed to closing this renderer. | 821 // have already committed to closing this renderer. |
| 828 if (IsWaitingForUnloadACK()) { | 822 if (IsWaitingForUnloadACK()) |
| 829 base::debug::SetCrashKeyValue("369661-earlyreturn", | |
| 830 CommitCountString() + "/unloadwait"); | |
| 831 return; | 823 return; |
| 832 } | |
| 833 | 824 |
| 834 if (validated_params.report_type == | 825 if (validated_params.report_type == |
| 835 FrameMsg_UILoadMetricsReportType::REPORT_LINK) { | 826 FrameMsg_UILoadMetricsReportType::REPORT_LINK) { |
| 836 UMA_HISTOGRAM_CUSTOM_TIMES( | 827 UMA_HISTOGRAM_CUSTOM_TIMES( |
| 837 "Navigation.UI_OnCommitProvisionalLoad.Link", | 828 "Navigation.UI_OnCommitProvisionalLoad.Link", |
| 838 base::TimeTicks::Now() - validated_params.ui_timestamp, | 829 base::TimeTicks::Now() - validated_params.ui_timestamp, |
| 839 base::TimeDelta::FromMilliseconds(10), base::TimeDelta::FromMinutes(10), | 830 base::TimeDelta::FromMilliseconds(10), base::TimeDelta::FromMinutes(10), |
| 840 100); | 831 100); |
| 841 } else if (validated_params.report_type == | 832 } else if (validated_params.report_type == |
| 842 FrameMsg_UILoadMetricsReportType::REPORT_INTENT) { | 833 FrameMsg_UILoadMetricsReportType::REPORT_INTENT) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 process->FilterURL(false, &(*it)); | 865 process->FilterURL(false, &(*it)); |
| 875 } | 866 } |
| 876 process->FilterURL(true, &validated_params.searchable_form_url); | 867 process->FilterURL(true, &validated_params.searchable_form_url); |
| 877 | 868 |
| 878 // Without this check, the renderer can trick the browser into using | 869 // Without this check, the renderer can trick the browser into using |
| 879 // filenames it can't access in a future session restore. | 870 // filenames it can't access in a future session restore. |
| 880 if (!render_view_host_->CanAccessFilesOfPageState( | 871 if (!render_view_host_->CanAccessFilesOfPageState( |
| 881 validated_params.page_state)) { | 872 validated_params.page_state)) { |
| 882 bad_message::ReceivedBadMessage( | 873 bad_message::ReceivedBadMessage( |
| 883 GetProcess(), bad_message::RFH_CAN_ACCESS_FILES_OF_PAGE_STATE); | 874 GetProcess(), bad_message::RFH_CAN_ACCESS_FILES_OF_PAGE_STATE); |
| 884 base::debug::SetCrashKeyValue("369661-earlyreturn", | |
| 885 CommitCountString() + "/fileaccess"); | |
| 886 return; | 875 return; |
| 887 } | 876 } |
| 888 | 877 |
| 889 accessibility_reset_count_ = 0; | 878 accessibility_reset_count_ = 0; |
| 890 frame_tree_node()->navigator()->DidNavigate(this, validated_params); | 879 frame_tree_node()->navigator()->DidNavigate(this, validated_params); |
| 891 | 880 |
| 892 // PlzNavigate | 881 // PlzNavigate |
| 893 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 882 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 894 switches::kEnableBrowserSideNavigation)) { | 883 switches::kEnableBrowserSideNavigation)) { |
| 895 pending_commit_ = false; | 884 pending_commit_ = false; |
| (...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2078 | 2067 |
| 2079 // We may be returning to an existing NavigationEntry that had been granted | 2068 // We may be returning to an existing NavigationEntry that had been granted |
| 2080 // file access. If this is a different process, we will need to grant the | 2069 // file access. If this is a different process, we will need to grant the |
| 2081 // access again. The files listed in the page state are validated when they | 2070 // access again. The files listed in the page state are validated when they |
| 2082 // are received from the renderer to prevent abuse. | 2071 // are received from the renderer to prevent abuse. |
| 2083 if (request_params.page_state.IsValid()) { | 2072 if (request_params.page_state.IsValid()) { |
| 2084 render_view_host_->GrantFileAccessFromPageState(request_params.page_state); | 2073 render_view_host_->GrantFileAccessFromPageState(request_params.page_state); |
| 2085 } | 2074 } |
| 2086 } | 2075 } |
| 2087 | 2076 |
| 2088 std::string RenderFrameHostImpl::CommitCountString() { | |
| 2089 std::string result = base::Int64ToString(reinterpret_cast<int64_t>(this)); | |
| 2090 result += "/"; | |
| 2091 result += base::IntToString(commit_count_); | |
| 2092 return result; | |
| 2093 } | |
| 2094 | |
| 2095 } // namespace content | 2077 } // namespace content |
| OLD | NEW |