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/browser/frame_host/navigator_impl.h" | 5 #include "content/browser/frame_host/navigator_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/metrics/histogram_macros.h" | 10 #include "base/metrics/histogram_macros.h" |
| (...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 991 const BeginNavigationParams& begin_params) { | 991 const BeginNavigationParams& begin_params) { |
| 992 // TODO(clamy): the url sent by the renderer should be validated with | 992 // TODO(clamy): the url sent by the renderer should be validated with |
| 993 // FilterURL. | 993 // FilterURL. |
| 994 // This is a renderer-initiated navigation. | 994 // This is a renderer-initiated navigation. |
| 995 CHECK(IsBrowserSideNavigationEnabled()); | 995 CHECK(IsBrowserSideNavigationEnabled()); |
| 996 DCHECK(frame_tree_node); | 996 DCHECK(frame_tree_node); |
| 997 | 997 |
| 998 NavigationRequest* ongoing_navigation_request = | 998 NavigationRequest* ongoing_navigation_request = |
| 999 frame_tree_node->navigation_request(); | 999 frame_tree_node->navigation_request(); |
| 1000 | 1000 |
| 1001 // Client redirects during the initial history navigation of a child frame | |
| 1002 // should take precedence over the history navigation (despite being renderer- | |
| 1003 // initiated). See https://crbug.com/348447 and https://crbug.com/691168. | |
| 1004 if (ongoing_navigation_request && | |
| 1005 ongoing_navigation_request->request_params() | |
| 1006 .is_history_navigation_in_new_child) { | |
| 1007 // Preemptively clear this local pointer before deleting the request. | |
| 1008 ongoing_navigation_request = nullptr; | |
| 1009 frame_tree_node->ResetNavigationRequest(false); | |
|
jam
2017/05/16 20:13:11
btw I was tracing this code as part of https://cod
Charlie Reis
2017/05/18 21:26:46
Yep, it's still needed, but some races mean we are
| |
| 1010 } | |
| 1011 | |
| 1001 // The renderer-initiated navigation request is ignored iff a) there is an | 1012 // The renderer-initiated navigation request is ignored iff a) there is an |
| 1002 // ongoing request b) which is browser or user-initiated and c) the renderer | 1013 // ongoing request b) which is browser or user-initiated and c) the renderer |
| 1003 // request is not user-initiated. | 1014 // request is not user-initiated. |
| 1004 if (ongoing_navigation_request && | 1015 if (ongoing_navigation_request && |
| 1005 (ongoing_navigation_request->browser_initiated() || | 1016 (ongoing_navigation_request->browser_initiated() || |
| 1006 ongoing_navigation_request->begin_params().has_user_gesture) && | 1017 ongoing_navigation_request->begin_params().has_user_gesture) && |
| 1007 !begin_params.has_user_gesture) { | 1018 !begin_params.has_user_gesture) { |
| 1008 RenderFrameHost* current_frame_host = | 1019 RenderFrameHost* current_frame_host = |
| 1009 frame_tree_node->render_manager()->current_frame_host(); | 1020 frame_tree_node->render_manager()->current_frame_host(); |
| 1010 current_frame_host->Send( | 1021 current_frame_host->Send( |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1159 ReloadType reload_type, | 1170 ReloadType reload_type, |
| 1160 PreviewsState previews_state, | 1171 PreviewsState previews_state, |
| 1161 bool is_same_document_history_load, | 1172 bool is_same_document_history_load, |
| 1162 bool is_history_navigation_in_new_child, | 1173 bool is_history_navigation_in_new_child, |
| 1163 base::TimeTicks navigation_start) { | 1174 base::TimeTicks navigation_start) { |
| 1164 CHECK(IsBrowserSideNavigationEnabled()); | 1175 CHECK(IsBrowserSideNavigationEnabled()); |
| 1165 DCHECK(frame_tree_node); | 1176 DCHECK(frame_tree_node); |
| 1166 | 1177 |
| 1167 // This value must be set here because creating a NavigationRequest might | 1178 // This value must be set here because creating a NavigationRequest might |
| 1168 // change the renderer live/non-live status and change this result. | 1179 // change the renderer live/non-live status and change this result. |
| 1180 // We don't want to dispatch a beforeunload handler if | |
| 1181 // is_history_navigation_in_new_child is true. This indicates a newly created | |
| 1182 // child frame which does not have a beforunload handler. | |
| 1169 bool should_dispatch_beforeunload = | 1183 bool should_dispatch_beforeunload = |
| 1170 !is_same_document_history_load && | 1184 !is_same_document_history_load && |
| 1185 !is_history_navigation_in_new_child && | |
| 1171 frame_tree_node->current_frame_host()->ShouldDispatchBeforeUnload(); | 1186 frame_tree_node->current_frame_host()->ShouldDispatchBeforeUnload(); |
| 1172 FrameMsg_Navigate_Type::Value navigation_type = GetNavigationType( | 1187 FrameMsg_Navigate_Type::Value navigation_type = GetNavigationType( |
| 1173 frame_tree_node->current_url(), // old_url | 1188 frame_tree_node->current_url(), // old_url |
| 1174 dest_url, // new_url | 1189 dest_url, // new_url |
| 1175 reload_type, // reload_type | 1190 reload_type, // reload_type |
| 1176 entry, // entry | 1191 entry, // entry |
| 1177 frame_entry, // frame_entry | 1192 frame_entry, // frame_entry |
| 1178 is_same_document_history_load); // is_same_document_history_load | 1193 is_same_document_history_load); // is_same_document_history_load |
| 1179 std::unique_ptr<NavigationRequest> scoped_request = | 1194 std::unique_ptr<NavigationRequest> scoped_request = |
| 1180 NavigationRequest::CreateBrowserInitiated( | 1195 NavigationRequest::CreateBrowserInitiated( |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1321 if (navigation_handle) | 1336 if (navigation_handle) |
| 1322 navigation_handle->update_entry_id_for_transfer(entry->GetUniqueID()); | 1337 navigation_handle->update_entry_id_for_transfer(entry->GetUniqueID()); |
| 1323 | 1338 |
| 1324 controller_->SetPendingEntry(std::move(entry)); | 1339 controller_->SetPendingEntry(std::move(entry)); |
| 1325 if (delegate_) | 1340 if (delegate_) |
| 1326 delegate_->NotifyChangedNavigationState(content::INVALIDATE_TYPE_URL); | 1341 delegate_->NotifyChangedNavigationState(content::INVALIDATE_TYPE_URL); |
| 1327 } | 1342 } |
| 1328 } | 1343 } |
| 1329 | 1344 |
| 1330 } // namespace content | 1345 } // namespace content |
| OLD | NEW |