Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(458)

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 1225593003: OOPIF: Fix willSendRequest in A-B-A nested case. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Also fix cross-process location.replace Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 3081 matching lines...) Expand 10 before | Expand all | Expand 10 after
3092 // TODO(nasko): When the top-level frame is remote, there is no document. 3092 // TODO(nasko): When the top-level frame is remote, there is no document.
3093 // This is broken and should be fixed to propagate the first party. 3093 // This is broken and should be fixed to propagate the first party.
3094 WebFrame* top = frame->top(); 3094 WebFrame* top = frame->top();
3095 if (top->isWebLocalFrame()) { 3095 if (top->isWebLocalFrame()) {
3096 request.setFirstPartyForCookies( 3096 request.setFirstPartyForCookies(
3097 frame->top()->document().firstPartyForCookies()); 3097 frame->top()->document().firstPartyForCookies());
3098 } 3098 }
3099 } 3099 }
3100 } 3100 }
3101 3101
3102 WebFrame* top_frame = frame->top(); 3102 WebDataSource* provisional_data_source = frame->provisionalDataSource();
3103 // TODO(nasko): Hack around asking about top-frame data source. This means
3104 // for out-of-process iframes we are treating the current frame as the
3105 // top-level frame, which is wrong.
3106 if (!top_frame || top_frame->isWebRemoteFrame())
3107 top_frame = frame;
3108 WebDataSource* provisional_data_source = top_frame->provisionalDataSource();
3109 WebDataSource* top_data_source = top_frame->dataSource();
3110 WebDataSource* data_source = 3103 WebDataSource* data_source =
3111 provisional_data_source ? provisional_data_source : top_data_source; 3104 provisional_data_source ? provisional_data_source : frame->dataSource();
3112 3105
3113 DocumentState* document_state = DocumentState::FromDataSource(data_source); 3106 DocumentState* document_state = DocumentState::FromDataSource(data_source);
3114 DCHECK(document_state); 3107 DCHECK(document_state);
3115 InternalDocumentStateData* internal_data = 3108 InternalDocumentStateData* internal_data =
3116 InternalDocumentStateData::FromDocumentState(document_state); 3109 InternalDocumentStateData::FromDocumentState(document_state);
3117 NavigationStateImpl* navigation_state = 3110 NavigationStateImpl* navigation_state =
3118 static_cast<NavigationStateImpl*>(document_state->navigation_state()); 3111 static_cast<NavigationStateImpl*>(document_state->navigation_state());
3119 ui::PageTransition transition_type = navigation_state->GetTransitionType(); 3112 ui::PageTransition transition_type = navigation_state->GetTransitionType();
3120 WebDataSource* frame_ds = frame->provisionalDataSource(); 3113 if (provisional_data_source && provisional_data_source->isClientRedirect()) {
Charlie Reis 2015/07/09 17:40:11 Noticed this was redundant now.
3121 if (frame_ds && frame_ds->isClientRedirect()) {
3122 transition_type = ui::PageTransitionFromInt( 3114 transition_type = ui::PageTransitionFromInt(
3123 transition_type | ui::PAGE_TRANSITION_CLIENT_REDIRECT); 3115 transition_type | ui::PAGE_TRANSITION_CLIENT_REDIRECT);
3124 } 3116 }
3125 3117
3126 GURL request_url(request.url()); 3118 GURL request_url(request.url());
3127 GURL new_url; 3119 GURL new_url;
3128 if (GetContentClient()->renderer()->WillSendRequest( 3120 if (GetContentClient()->renderer()->WillSendRequest(
3129 frame, 3121 frame,
3130 transition_type, 3122 transition_type,
3131 request_url, 3123 request_url,
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3179 3171
3180 // Add an empty HTTP origin header for non GET methods if none is currently 3172 // Add an empty HTTP origin header for non GET methods if none is currently
3181 // present. 3173 // present.
3182 request.addHTTPOriginIfNeeded(WebString()); 3174 request.addHTTPOriginIfNeeded(WebString());
3183 3175
3184 // Attach |should_replace_current_entry| state to requests so that, should 3176 // Attach |should_replace_current_entry| state to requests so that, should
3185 // this navigation later require a request transfer, all state is preserved 3177 // this navigation later require a request transfer, all state is preserved
3186 // when it is re-created in the new process. 3178 // when it is re-created in the new process.
3187 bool should_replace_current_entry = false; 3179 bool should_replace_current_entry = false;
3188 if (navigation_state->IsContentInitiated()) { 3180 if (navigation_state->IsContentInitiated()) {
3189 should_replace_current_entry = data_source->replacesCurrentHistoryItem(); 3181 should_replace_current_entry = data_source->replacesCurrentHistoryItem();
Charlie Reis 2015/07/09 17:40:11 This adds to my confidence in this change, because
3190 } else { 3182 } else {
3191 // If the navigation is browser-initiated, the NavigationState contains the 3183 // If the navigation is browser-initiated, the NavigationState contains the
3192 // correct value instead of the WebDataSource. 3184 // correct value instead of the WebDataSource.
3193 // 3185 //
3194 // TODO(davidben): Avoid this awkward duplication of state. See comment on 3186 // TODO(davidben): Avoid this awkward duplication of state. See comment on
3195 // NavigationState::should_replace_current_entry(). 3187 // NavigationState::should_replace_current_entry().
3196 should_replace_current_entry = 3188 should_replace_current_entry =
3197 navigation_state->start_params().should_replace_current_entry; 3189 navigation_state->start_params().should_replace_current_entry;
3198 } 3190 }
3199 3191
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3233 extra_data->set_is_main_frame(!parent); 3225 extra_data->set_is_main_frame(!parent);
3234 extra_data->set_frame_origin( 3226 extra_data->set_frame_origin(
3235 GURL(frame->document().securityOrigin().toString())); 3227 GURL(frame->document().securityOrigin().toString()));
3236 extra_data->set_parent_is_main_frame(parent && !parent->parent()); 3228 extra_data->set_parent_is_main_frame(parent && !parent->parent());
3237 extra_data->set_parent_render_frame_id(parent_routing_id); 3229 extra_data->set_parent_render_frame_id(parent_routing_id);
3238 extra_data->set_allow_download( 3230 extra_data->set_allow_download(
3239 navigation_state->common_params().allow_download); 3231 navigation_state->common_params().allow_download);
3240 extra_data->set_transition_type(transition_type); 3232 extra_data->set_transition_type(transition_type);
3241 extra_data->set_should_replace_current_entry(should_replace_current_entry); 3233 extra_data->set_should_replace_current_entry(should_replace_current_entry);
3242 extra_data->set_transferred_request_child_id( 3234 extra_data->set_transferred_request_child_id(
3243 navigation_state->start_params().transferred_request_child_id); 3235 navigation_state->start_params().transferred_request_child_id);
Charlie Reis 2015/07/09 17:40:11 (This was what motivated this CL in the first plac
3244 extra_data->set_transferred_request_request_id( 3236 extra_data->set_transferred_request_request_id(
3245 navigation_state->start_params().transferred_request_request_id); 3237 navigation_state->start_params().transferred_request_request_id);
3246 extra_data->set_service_worker_provider_id(provider_id); 3238 extra_data->set_service_worker_provider_id(provider_id);
3247 extra_data->set_stream_override(stream_override.Pass()); 3239 extra_data->set_stream_override(stream_override.Pass());
3248 request.setExtraData(extra_data); 3240 request.setExtraData(extra_data);
3249 3241
3250 DocumentState* top_document_state = 3242 // TODO(creis): Update prefetching to work with out-of-process iframes.
3251 DocumentState::FromDataSource(top_data_source); 3243 WebFrame* top_frame = frame->top();
3252 if (top_document_state) { 3244 if (top_frame && top_frame->isWebLocalFrame()) {
3253 // TODO(gavinp): separate out prefetching and prerender field trials 3245 DocumentState* top_document_state =
3254 // if the rel=prerender rel type is sticking around. 3246 DocumentState::FromDataSource(top_frame->dataSource());
3255 if (request.requestContext() == WebURLRequest::RequestContextPrefetch) 3247 if (top_document_state) {
3256 top_document_state->set_was_prefetcher(true); 3248 // TODO(gavinp): separate out prefetching and prerender field trials
3249 // if the rel=prerender rel type is sticking around.
3250 if (request.requestContext() == WebURLRequest::RequestContextPrefetch)
3251 top_document_state->set_was_prefetcher(true);
3252 }
3257 } 3253 }
3258 3254
3259 // This is an instance where we embed a copy of the routing id 3255 // This is an instance where we embed a copy of the routing id
3260 // into the data portion of the message. This can cause problems if we 3256 // into the data portion of the message. This can cause problems if we
3261 // don't register this id on the browser side, since the download manager 3257 // don't register this id on the browser side, since the download manager
3262 // expects to find a RenderViewHost based off the id. 3258 // expects to find a RenderViewHost based off the id.
3263 request.setRequestorID(render_view_->GetRoutingID()); 3259 request.setRequestorID(render_view_->GetRoutingID());
3264 request.setHasUserGesture(WebUserGestureIndicator::isProcessingUserGesture()); 3260 request.setHasUserGesture(WebUserGestureIndicator::isProcessingUserGesture());
3265 3261
3266 if (!navigation_state->start_params().extra_headers.empty()) { 3262 if (!navigation_state->start_params().extra_headers.empty()) {
(...skipping 1146 matching lines...) Expand 10 before | Expand all | Expand 10 after
4413 if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) { 4409 if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) {
4414 // We cannot reload if we do not have any history state. This happens, for 4410 // We cannot reload if we do not have any history state. This happens, for
4415 // example, when recovering from a crash. 4411 // example, when recovering from a crash.
4416 is_reload = false; 4412 is_reload = false;
4417 cache_policy = WebURLRequest::ReloadIgnoringCacheData; 4413 cache_policy = WebURLRequest::ReloadIgnoringCacheData;
4418 } 4414 }
4419 4415
4420 pending_navigation_params_.reset( 4416 pending_navigation_params_.reset(
4421 new NavigationParams(common_params, start_params, request_params)); 4417 new NavigationParams(common_params, start_params, request_params));
4422 4418
4423 // Create parameters for a standard navigation. 4419 // Create parameters for a standard navigation, indicating whether it should
4424 blink::WebFrameLoadType load_type = blink::WebFrameLoadType::Standard; 4420 // replace the current NavigationEntry.
4421 blink::WebFrameLoadType load_type =
4422 start_params.should_replace_current_entry ?
4423 blink::WebFrameLoadType::RedirectWithLockedBackForwardList :
Charlie Reis 2015/07/09 17:40:11 This is the fix for https://crbug.com/317872, and
4424 blink::WebFrameLoadType::Standard;
4425 bool should_load_request = false; 4425 bool should_load_request = false;
4426 WebHistoryItem item_for_history_navigation; 4426 WebHistoryItem item_for_history_navigation;
4427 WebURLRequest request = CreateURLRequestForNavigation( 4427 WebURLRequest request = CreateURLRequestForNavigation(
4428 common_params, stream_params.Pass(), frame_->isViewSourceModeEnabled()); 4428 common_params, stream_params.Pass(), frame_->isViewSourceModeEnabled());
4429 4429
4430 // PlzNavigate: Make sure that Blink's loader will not try to use browser side 4430 // PlzNavigate: Make sure that Blink's loader will not try to use browser side
4431 // navigation for this request (since it already went to the browser). 4431 // navigation for this request (since it already went to the browser).
4432 if (browser_side_navigation) 4432 if (browser_side_navigation)
4433 request.setCheckForBrowserSideNavigation(false); 4433 request.setCheckForBrowserSideNavigation(false);
4434 4434
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
5012 void RenderFrameImpl::RegisterMojoServices() { 5012 void RenderFrameImpl::RegisterMojoServices() {
5013 // Only main frame have ImageDownloader service. 5013 // Only main frame have ImageDownloader service.
5014 if (!frame_->parent()) { 5014 if (!frame_->parent()) {
5015 GetServiceRegistry()->AddService<image_downloader::ImageDownloader>( 5015 GetServiceRegistry()->AddService<image_downloader::ImageDownloader>(
5016 base::Bind(&ImageDownloaderImpl::CreateMojoService, 5016 base::Bind(&ImageDownloaderImpl::CreateMojoService,
5017 base::Unretained(this))); 5017 base::Unretained(this)));
5018 } 5018 }
5019 } 5019 }
5020 5020
5021 } // namespace content 5021 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698