Chromium Code Reviews| 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/renderer/render_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 1735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1746 std::unique_ptr<NavigationParams> navigation_params) { | 1746 std::unique_ptr<NavigationParams> navigation_params) { |
| 1747 pending_navigation_params_ = std::move(navigation_params); | 1747 pending_navigation_params_ = std::move(navigation_params); |
| 1748 } | 1748 } |
| 1749 | 1749 |
| 1750 void RenderFrameImpl::OnBeforeUnload(bool is_reload) { | 1750 void RenderFrameImpl::OnBeforeUnload(bool is_reload) { |
| 1751 TRACE_EVENT1("navigation,rail", "RenderFrameImpl::OnBeforeUnload", | 1751 TRACE_EVENT1("navigation,rail", "RenderFrameImpl::OnBeforeUnload", |
| 1752 "id", routing_id_); | 1752 "id", routing_id_); |
| 1753 // Save the routing_id, as the RenderFrameImpl can be deleted in | 1753 // Save the routing_id, as the RenderFrameImpl can be deleted in |
| 1754 // dispatchBeforeUnloadEvent. See https://crbug.com/666714 for details. | 1754 // dispatchBeforeUnloadEvent. See https://crbug.com/666714 for details. |
| 1755 int routing_id = routing_id_; | 1755 int routing_id = routing_id_; |
| 1756 base::WeakPtr<RenderFrameImpl> weak_this = weak_factory_.GetWeakPtr(); | |
| 1756 | 1757 |
| 1757 base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); | 1758 base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); |
| 1758 | 1759 |
| 1759 // TODO(clamy): Ensure BeforeUnload is dispatched to all subframes, even when | 1760 // TODO(clamy): Ensure BeforeUnload is dispatched to all subframes, even when |
| 1760 // --site-per-process is enabled. |dispatchBeforeUnloadEvent| will only | 1761 // --site-per-process is enabled. |dispatchBeforeUnloadEvent| will only |
| 1761 // execute the BeforeUnload event in this frame and local child frames. It | 1762 // execute the BeforeUnload event in this frame and local child frames. It |
| 1762 // should also be dispatched to out-of-process child frames. | 1763 // should also be dispatched to out-of-process child frames. |
| 1763 bool proceed = frame_->DispatchBeforeUnloadEvent(is_reload); | 1764 bool proceed = frame_->DispatchBeforeUnloadEvent(is_reload); |
| 1765 if (IsBrowserSideNavigationEnabled() && proceed && weak_this) { | |
| 1766 ran_before_unload_ = true; | |
| 1767 // If there's already a pending navigation its didcommitprovisionalload or | |
| 1768 // didstoploading IPCs (exact one which fires is racy) would interfere with | |
| 1769 // the new navigation. By forcing the old navigation to be cancelled first, | |
| 1770 // then we are assured that the IPC pipe is flushed of IPCs related to a | |
| 1771 // previous navigation. | |
| 1772 frame_->StopLoading(); | |
|
jam
2017/07/08 01:32:49
this prevents stray FrameHostMsg_DidCommitProvisio
clamy
2017/07/10 13:02:05
That seems wrong to me. If we're trying to load a
| |
| 1773 } | |
| 1764 | 1774 |
| 1765 base::TimeTicks before_unload_end_time = base::TimeTicks::Now(); | 1775 base::TimeTicks before_unload_end_time = base::TimeTicks::Now(); |
| 1766 RenderThread::Get()->Send(new FrameHostMsg_BeforeUnload_ACK( | 1776 RenderThread::Get()->Send(new FrameHostMsg_BeforeUnload_ACK( |
| 1767 routing_id, proceed, before_unload_start_time, before_unload_end_time)); | 1777 routing_id, proceed, before_unload_start_time, before_unload_end_time)); |
| 1768 } | 1778 } |
| 1769 | 1779 |
| 1770 void RenderFrameImpl::OnSwapOut( | 1780 void RenderFrameImpl::OnSwapOut( |
| 1771 int proxy_routing_id, | 1781 int proxy_routing_id, |
| 1772 bool is_loading, | 1782 bool is_loading, |
| 1773 const FrameReplicationState& replicated_frame_state) { | 1783 const FrameReplicationState& replicated_frame_state) { |
| (...skipping 3292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5066 history_subframe_unique_names_.clear(); | 5076 history_subframe_unique_names_.clear(); |
| 5067 | 5077 |
| 5068 blink::WebIconURL::Type icon_types_mask = | 5078 blink::WebIconURL::Type icon_types_mask = |
| 5069 static_cast<blink::WebIconURL::Type>( | 5079 static_cast<blink::WebIconURL::Type>( |
| 5070 blink::WebIconURL::kTypeFavicon | | 5080 blink::WebIconURL::kTypeFavicon | |
| 5071 blink::WebIconURL::kTypeTouchPrecomposed | | 5081 blink::WebIconURL::kTypeTouchPrecomposed | |
| 5072 blink::WebIconURL::kTypeTouch); | 5082 blink::WebIconURL::kTypeTouch); |
| 5073 SendUpdateFaviconURL(icon_types_mask); | 5083 SendUpdateFaviconURL(icon_types_mask); |
| 5074 | 5084 |
| 5075 render_view_->FrameDidStopLoading(frame_); | 5085 render_view_->FrameDidStopLoading(frame_); |
| 5086 | |
| 5087 if (IsBrowserSideNavigationEnabled() && ran_before_unload_) { | |
| 5088 // Avoid a previous navigation's didstop IPC from resetting the | |
| 5089 // NavigationHandle of the next navigation. | |
| 5090 return; | |
|
jam
2017/07/08 01:32:49
this prevents the other case of stray FrameHostMsg
| |
| 5091 } | |
| 5092 | |
| 5076 Send(new FrameHostMsg_DidStopLoading(routing_id_)); | 5093 Send(new FrameHostMsg_DidStopLoading(routing_id_)); |
| 5077 } | 5094 } |
| 5078 | 5095 |
| 5079 void RenderFrameImpl::DidChangeLoadProgress(double load_progress) { | 5096 void RenderFrameImpl::DidChangeLoadProgress(double load_progress) { |
| 5080 Send(new FrameHostMsg_DidChangeLoadProgress(routing_id_, load_progress)); | 5097 Send(new FrameHostMsg_DidChangeLoadProgress(routing_id_, load_progress)); |
| 5081 } | 5098 } |
| 5082 | 5099 |
| 5083 void RenderFrameImpl::HandleWebAccessibilityEvent( | 5100 void RenderFrameImpl::HandleWebAccessibilityEvent( |
| 5084 const blink::WebAXObject& obj, blink::WebAXEvent event) { | 5101 const blink::WebAXObject& obj, blink::WebAXEvent event) { |
| 5085 if (render_accessibility_) | 5102 if (render_accessibility_) |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5156 mojo::ScopedMessagePipeHandle(commit_data.url_loader_factory), 0u)); | 5173 mojo::ScopedMessagePipeHandle(commit_data.url_loader_factory), 0u)); |
| 5157 } | 5174 } |
| 5158 | 5175 |
| 5159 // If the request was initiated in the context of a user gesture then make | 5176 // If the request was initiated in the context of a user gesture then make |
| 5160 // sure that the navigation also executes in the context of a user gesture. | 5177 // sure that the navigation also executes in the context of a user gesture. |
| 5161 std::unique_ptr<blink::WebScopedUserGesture> gesture( | 5178 std::unique_ptr<blink::WebScopedUserGesture> gesture( |
| 5162 request_params.has_user_gesture ? new blink::WebScopedUserGesture(frame_) | 5179 request_params.has_user_gesture ? new blink::WebScopedUserGesture(frame_) |
| 5163 : nullptr); | 5180 : nullptr); |
| 5164 | 5181 |
| 5165 browser_side_navigation_pending_ = false; | 5182 browser_side_navigation_pending_ = false; |
| 5183 ran_before_unload_ = false; | |
| 5166 | 5184 |
| 5167 NavigateInternal(common_params, StartNavigationParams(), request_params, | 5185 NavigateInternal(common_params, StartNavigationParams(), request_params, |
| 5168 std::move(stream_override)); | 5186 std::move(stream_override)); |
| 5169 | 5187 |
| 5170 // Don't add code after this since NavigateInternal may have destroyed this | 5188 // Don't add code after this since NavigateInternal may have destroyed this |
| 5171 // RenderFrameImpl. | 5189 // RenderFrameImpl. |
| 5172 } | 5190 } |
| 5173 | 5191 |
| 5174 // PlzNavigate | 5192 // PlzNavigate |
| 5175 void RenderFrameImpl::OnFailedNavigation( | 5193 void RenderFrameImpl::OnFailedNavigation( |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 5187 | 5205 |
| 5188 // If this frame is navigating cross-process, it may naively assume that this | 5206 // If this frame is navigating cross-process, it may naively assume that this |
| 5189 // is the first navigation in the frame, but this may not actually be the | 5207 // is the first navigation in the frame, but this may not actually be the |
| 5190 // case. Inform the frame's state machine if this frame has already committed | 5208 // case. Inform the frame's state machine if this frame has already committed |
| 5191 // other loads. | 5209 // other loads. |
| 5192 if (request_params.has_committed_real_load) | 5210 if (request_params.has_committed_real_load) |
| 5193 frame_->SetCommittedFirstRealLoad(); | 5211 frame_->SetCommittedFirstRealLoad(); |
| 5194 | 5212 |
| 5195 pending_navigation_params_.reset(new NavigationParams( | 5213 pending_navigation_params_.reset(new NavigationParams( |
| 5196 common_params, StartNavigationParams(), request_params)); | 5214 common_params, StartNavigationParams(), request_params)); |
| 5215 ran_before_unload_ = false; | |
| 5197 | 5216 |
| 5198 // Send the provisional load failure. | 5217 // Send the provisional load failure. |
| 5199 blink::WebURLError error = | 5218 blink::WebURLError error = |
| 5200 CreateWebURLError(common_params.url, has_stale_copy_in_cache, error_code); | 5219 CreateWebURLError(common_params.url, has_stale_copy_in_cache, error_code); |
| 5201 WebURLRequest failed_request = | 5220 WebURLRequest failed_request = |
| 5202 CreateURLRequestForNavigation(common_params, request_params, | 5221 CreateURLRequestForNavigation(common_params, request_params, |
| 5203 std::unique_ptr<StreamOverrideParameters>(), | 5222 std::unique_ptr<StreamOverrideParameters>(), |
| 5204 frame_->IsViewSourceModeEnabled(), | 5223 frame_->IsViewSourceModeEnabled(), |
| 5205 false); // is_same_document_navigation | 5224 false); // is_same_document_navigation |
| 5206 | 5225 |
| (...skipping 1696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6903 replaces_current_history_item(info.replaces_current_history_item), | 6922 replaces_current_history_item(info.replaces_current_history_item), |
| 6904 history_navigation_in_new_child_frame( | 6923 history_navigation_in_new_child_frame( |
| 6905 info.is_history_navigation_in_new_child_frame), | 6924 info.is_history_navigation_in_new_child_frame), |
| 6906 client_redirect(info.is_client_redirect), | 6925 client_redirect(info.is_client_redirect), |
| 6907 triggering_event_info(info.triggering_event_info), | 6926 triggering_event_info(info.triggering_event_info), |
| 6908 cache_disabled(info.is_cache_disabled), | 6927 cache_disabled(info.is_cache_disabled), |
| 6909 form(info.form), | 6928 form(info.form), |
| 6910 source_location(info.source_location) {} | 6929 source_location(info.source_location) {} |
| 6911 | 6930 |
| 6912 } // namespace content | 6931 } // namespace content |
| OLD | NEW |