| 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 <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 2442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2453 return render_view_->history_controller()->GetItemForNewChildFrame(this); | 2453 return render_view_->history_controller()->GetItemForNewChildFrame(this); |
| 2454 } | 2454 } |
| 2455 | 2455 |
| 2456 void RenderFrameImpl::willSendSubmitEvent(blink::WebLocalFrame* frame, | 2456 void RenderFrameImpl::willSendSubmitEvent(blink::WebLocalFrame* frame, |
| 2457 const blink::WebFormElement& form) { | 2457 const blink::WebFormElement& form) { |
| 2458 DCHECK(!frame_ || frame_ == frame); | 2458 DCHECK(!frame_ || frame_ == frame); |
| 2459 | 2459 |
| 2460 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WillSendSubmitEvent(form)); | 2460 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WillSendSubmitEvent(form)); |
| 2461 } | 2461 } |
| 2462 | 2462 |
| 2463 void RenderFrameImpl::willSubmitForm(blink::WebLocalFrame* frame, | 2463 void RenderFrameImpl::willSubmitForm(blink::WebDataSource* datasource, |
| 2464 const blink::WebFormElement& form) { | 2464 const blink::WebFormElement& form) { |
| 2465 DCHECK(!frame_ || frame_ == frame); | 2465 DocumentState* document_state = DocumentState::FromDataSource(datasource); |
| 2466 DocumentState* document_state = | |
| 2467 DocumentState::FromDataSource(frame->provisionalDataSource()); | |
| 2468 NavigationStateImpl* navigation_state = | 2466 NavigationStateImpl* navigation_state = |
| 2469 static_cast<NavigationStateImpl*>(document_state->navigation_state()); | 2467 static_cast<NavigationStateImpl*>(document_state->navigation_state()); |
| 2470 InternalDocumentStateData* internal_data = | 2468 InternalDocumentStateData* internal_data = |
| 2471 InternalDocumentStateData::FromDocumentState(document_state); | 2469 InternalDocumentStateData::FromDocumentState(document_state); |
| 2472 | 2470 |
| 2473 if (ui::PageTransitionCoreTypeIs(navigation_state->GetTransitionType(), | 2471 if (ui::PageTransitionCoreTypeIs(navigation_state->GetTransitionType(), |
| 2474 ui::PAGE_TRANSITION_LINK)) { | 2472 ui::PAGE_TRANSITION_LINK)) { |
| 2475 navigation_state->set_transition_type(ui::PAGE_TRANSITION_FORM_SUBMIT); | 2473 navigation_state->set_transition_type(ui::PAGE_TRANSITION_FORM_SUBMIT); |
| 2476 } | 2474 } |
| 2477 | 2475 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2593 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; | 2591 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; |
| 2594 } | 2592 } |
| 2595 scoped_ptr<ServiceWorkerNetworkProvider> network_provider( | 2593 scoped_ptr<ServiceWorkerNetworkProvider> network_provider( |
| 2596 new ServiceWorkerNetworkProvider(routing_id_, provider_type)); | 2594 new ServiceWorkerNetworkProvider(routing_id_, provider_type)); |
| 2597 ServiceWorkerNetworkProvider::AttachToDocumentState( | 2595 ServiceWorkerNetworkProvider::AttachToDocumentState( |
| 2598 DocumentState::FromDataSource(datasource), | 2596 DocumentState::FromDataSource(datasource), |
| 2599 network_provider.Pass()); | 2597 network_provider.Pass()); |
| 2600 } | 2598 } |
| 2601 } | 2599 } |
| 2602 | 2600 |
| 2603 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, | 2601 void RenderFrameImpl::didStartProvisionalLoad(blink::WebDataSource* datasource, |
| 2604 double triggering_event_time) { | 2602 double triggering_event_time) { |
| 2605 DCHECK(!frame_ || frame_ == frame); | 2603 DCHECK(datasource); |
| 2606 WebDataSource* ds = frame->provisionalDataSource(); | |
| 2607 | 2604 |
| 2608 // In fast/loader/stop-provisional-loads.html, we abort the load before this | 2605 TRACE_EVENT2("navigation", "RenderFrameImpl::didStartProvisionalLoad", "id", |
| 2609 // callback is invoked. | 2606 routing_id_, "url", datasource->request().url().string().utf8()); |
| 2610 if (!ds) | 2607 DocumentState* document_state = DocumentState::FromDataSource(datasource); |
| 2611 return; | |
| 2612 | |
| 2613 TRACE_EVENT2("navigation", "RenderFrameImpl::didStartProvisionalLoad", | |
| 2614 "id", routing_id_, "url", ds->request().url().string().utf8()); | |
| 2615 DocumentState* document_state = DocumentState::FromDataSource(ds); | |
| 2616 | 2608 |
| 2617 // We should only navigate to swappedout:// when is_swapped_out_ is true. | 2609 // We should only navigate to swappedout:// when is_swapped_out_ is true. |
| 2618 CHECK_IMPLIES(ds->request().url() == GURL(kSwappedOutURL), is_swapped_out_) | 2610 CHECK_IMPLIES(datasource->request().url() == GURL(kSwappedOutURL), |
| 2611 is_swapped_out_) |
| 2619 << "Heard swappedout:// when not swapped out."; | 2612 << "Heard swappedout:// when not swapped out."; |
| 2620 | 2613 |
| 2621 // Update the request time if WebKit has better knowledge of it. | 2614 // Update the request time if WebKit has better knowledge of it. |
| 2622 if (document_state->request_time().is_null() && | 2615 if (document_state->request_time().is_null() && |
| 2623 triggering_event_time != 0.0) { | 2616 triggering_event_time != 0.0) { |
| 2624 document_state->set_request_time(Time::FromDoubleT(triggering_event_time)); | 2617 document_state->set_request_time(Time::FromDoubleT(triggering_event_time)); |
| 2625 } | 2618 } |
| 2626 | 2619 |
| 2627 // Start time is only set after request time. | 2620 // Start time is only set after request time. |
| 2628 document_state->set_start_load_time(Time::Now()); | 2621 document_state->set_start_load_time(Time::Now()); |
| 2629 | 2622 |
| 2630 bool is_top_most = !frame->parent(); | 2623 bool is_top_most = !frame_->parent(); |
| 2631 if (is_top_most) { | 2624 if (is_top_most) { |
| 2632 render_view_->set_navigation_gesture( | 2625 render_view_->set_navigation_gesture( |
| 2633 WebUserGestureIndicator::isProcessingUserGesture() ? | 2626 WebUserGestureIndicator::isProcessingUserGesture() ? |
| 2634 NavigationGestureUser : NavigationGestureAuto); | 2627 NavigationGestureUser : NavigationGestureAuto); |
| 2635 } else if (ds->replacesCurrentHistoryItem()) { | 2628 } else if (datasource->replacesCurrentHistoryItem()) { |
| 2636 // Subframe navigations that don't add session history items must be | 2629 // Subframe navigations that don't add session history items must be |
| 2637 // marked with AUTO_SUBFRAME. See also didFailProvisionalLoad for how we | 2630 // marked with AUTO_SUBFRAME. See also didFailProvisionalLoad for how we |
| 2638 // handle loading of error pages. | 2631 // handle loading of error pages. |
| 2639 static_cast<NavigationStateImpl*>(document_state->navigation_state()) | 2632 static_cast<NavigationStateImpl*>(document_state->navigation_state()) |
| 2640 ->set_transition_type(ui::PAGE_TRANSITION_AUTO_SUBFRAME); | 2633 ->set_transition_type(ui::PAGE_TRANSITION_AUTO_SUBFRAME); |
| 2641 } | 2634 } |
| 2642 | 2635 |
| 2643 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), | 2636 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), |
| 2644 DidStartProvisionalLoad(frame)); | 2637 DidStartProvisionalLoad(datasource)); |
| 2645 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidStartProvisionalLoad()); | 2638 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
| 2639 DidStartProvisionalLoad(datasource)); |
| 2646 | 2640 |
| 2647 Send(new FrameHostMsg_DidStartProvisionalLoadForFrame( | 2641 Send(new FrameHostMsg_DidStartProvisionalLoadForFrame( |
| 2648 routing_id_, ds->request().url())); | 2642 routing_id_, datasource->request().url())); |
| 2649 } | 2643 } |
| 2650 | 2644 |
| 2651 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( | 2645 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( |
| 2652 blink::WebLocalFrame* frame) { | 2646 blink::WebLocalFrame* frame) { |
| 2653 DCHECK(!frame_ || frame_ == frame); | 2647 DCHECK(!frame_ || frame_ == frame); |
| 2654 render_view_->history_controller()->RemoveChildrenForRedirect(this); | 2648 render_view_->history_controller()->RemoveChildrenForRedirect(this); |
| 2655 } | 2649 } |
| 2656 | 2650 |
| 2657 void RenderFrameImpl::didFailProvisionalLoad( | 2651 void RenderFrameImpl::didFailProvisionalLoad( |
| 2658 blink::WebLocalFrame* frame, | 2652 blink::WebDataSource* datasource, |
| 2659 const blink::WebURLError& error, | 2653 const blink::WebURLError& error, |
| 2660 blink::WebHistoryCommitType commit_type) { | 2654 blink::WebHistoryCommitType commit_type) { |
| 2661 TRACE_EVENT1("navigation", "RenderFrameImpl::didFailProvisionalLoad", | 2655 TRACE_EVENT1("navigation", "RenderFrameImpl::didFailProvisionalLoad", |
| 2662 "id", routing_id_); | 2656 "id", routing_id_); |
| 2663 DCHECK(!frame_ || frame_ == frame); | 2657 DCHECK(datasource); |
| 2664 WebDataSource* ds = frame->provisionalDataSource(); | |
| 2665 DCHECK(ds); | |
| 2666 | 2658 |
| 2667 const WebURLRequest& failed_request = ds->request(); | 2659 const WebURLRequest& failed_request = datasource->request(); |
| 2668 | 2660 |
| 2669 // Notify the browser that we failed a provisional load with an error. | 2661 // Notify the browser that we failed a provisional load with an error. |
| 2670 // | 2662 // |
| 2671 // Note: It is important this notification occur before DidStopLoading so the | 2663 // Note: It is important this notification occur before DidStopLoading so the |
| 2672 // SSL manager can react to the provisional load failure before being | 2664 // SSL manager can react to the provisional load failure before being |
| 2673 // notified the load stopped. | 2665 // notified the load stopped. |
| 2674 // | 2666 // |
| 2675 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), | 2667 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), |
| 2676 DidFailProvisionalLoad(frame, error)); | 2668 DidFailProvisionalLoad(frame_, error)); |
| 2677 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | 2669 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
| 2678 DidFailProvisionalLoad(error)); | 2670 DidFailProvisionalLoad(error)); |
| 2679 | 2671 |
| 2680 SendFailedProvisionalLoad(failed_request, error, frame); | 2672 SendFailedProvisionalLoad(failed_request, error, frame_); |
| 2681 | 2673 |
| 2682 if (!ShouldDisplayErrorPageForFailedLoad(error.reason, error.unreachableURL)) | 2674 if (!ShouldDisplayErrorPageForFailedLoad(error.reason, error.unreachableURL)) |
| 2683 return; | 2675 return; |
| 2684 | 2676 |
| 2685 // Make sure we never show errors in view source mode. | 2677 // Make sure we never show errors in view source mode. |
| 2686 frame->enableViewSourceMode(false); | 2678 frame_->enableViewSourceMode(false); |
| 2687 | 2679 |
| 2688 DocumentState* document_state = DocumentState::FromDataSource(ds); | 2680 DocumentState* document_state = DocumentState::FromDataSource(datasource); |
| 2689 NavigationStateImpl* navigation_state = | 2681 NavigationStateImpl* navigation_state = |
| 2690 static_cast<NavigationStateImpl*>(document_state->navigation_state()); | 2682 static_cast<NavigationStateImpl*>(document_state->navigation_state()); |
| 2691 | 2683 |
| 2692 // If this is a failed back/forward/reload navigation, then we need to do a | 2684 // If this is a failed back/forward/reload navigation, then we need to do a |
| 2693 // 'replace' load. This is necessary to avoid messing up session history. | 2685 // 'replace' load. This is necessary to avoid messing up session history. |
| 2694 // Otherwise, we do a normal load, which simulates a 'go' navigation as far | 2686 // Otherwise, we do a normal load, which simulates a 'go' navigation as far |
| 2695 // as session history is concerned. | 2687 // as session history is concerned. |
| 2696 bool replace = commit_type != blink::WebStandardCommit; | 2688 bool replace = commit_type != blink::WebStandardCommit; |
| 2697 | 2689 |
| 2698 // If we failed on a browser initiated request, then make sure that our error | 2690 // If we failed on a browser initiated request, then make sure that our error |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2985 frame->dataSource()->request().inputPerfMetricReportPolicy()); | 2977 frame->dataSource()->request().inputPerfMetricReportPolicy()); |
| 2986 base::TimeTicks ui_timestamp = base::TimeTicks() + | 2978 base::TimeTicks ui_timestamp = base::TimeTicks() + |
| 2987 base::TimeDelta::FromSecondsD( | 2979 base::TimeDelta::FromSecondsD( |
| 2988 frame->dataSource()->request().uiStartTime()); | 2980 frame->dataSource()->request().uiStartTime()); |
| 2989 | 2981 |
| 2990 Send(new FrameHostMsg_DocumentOnLoadCompleted( | 2982 Send(new FrameHostMsg_DocumentOnLoadCompleted( |
| 2991 routing_id_, report_type, ui_timestamp)); | 2983 routing_id_, report_type, ui_timestamp)); |
| 2992 } | 2984 } |
| 2993 } | 2985 } |
| 2994 | 2986 |
| 2995 void RenderFrameImpl::didFailLoad(blink::WebLocalFrame* frame, | 2987 void RenderFrameImpl::didFailLoad(blink::WebDataSource* datasource, |
| 2996 const blink::WebURLError& error, | 2988 const blink::WebURLError& error, |
| 2997 blink::WebHistoryCommitType commit_type) { | 2989 blink::WebHistoryCommitType commit_type) { |
| 2998 TRACE_EVENT1("navigation", "RenderFrameImpl::didFailLoad", | 2990 TRACE_EVENT1("navigation", "RenderFrameImpl::didFailLoad", |
| 2999 "id", routing_id_); | 2991 "id", routing_id_); |
| 3000 DCHECK(!frame_ || frame_ == frame); | |
| 3001 // TODO(nasko): Move implementation here. No state needed. | 2992 // TODO(nasko): Move implementation here. No state needed. |
| 3002 WebDataSource* ds = frame->dataSource(); | 2993 DCHECK(datasource); |
| 3003 DCHECK(ds); | |
| 3004 | 2994 |
| 3005 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), | 2995 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), |
| 3006 DidFailLoad(frame, error)); | 2996 DidFailLoad(frame_, error)); |
| 3007 | 2997 |
| 3008 const WebURLRequest& failed_request = ds->request(); | 2998 const WebURLRequest& failed_request = datasource->request(); |
| 3009 base::string16 error_description; | 2999 base::string16 error_description; |
| 3010 GetContentClient()->renderer()->GetNavigationErrorStrings( | 3000 GetContentClient()->renderer()->GetNavigationErrorStrings( |
| 3011 render_view_.get(), | 3001 render_view_.get(), frame_, failed_request, error, NULL, |
| 3012 frame, | |
| 3013 failed_request, | |
| 3014 error, | |
| 3015 NULL, | |
| 3016 &error_description); | 3002 &error_description); |
| 3017 Send(new FrameHostMsg_DidFailLoadWithError(routing_id_, | 3003 Send(new FrameHostMsg_DidFailLoadWithError(routing_id_, |
| 3018 failed_request.url(), | 3004 failed_request.url(), |
| 3019 error.reason, | 3005 error.reason, |
| 3020 error_description, | 3006 error_description, |
| 3021 error.wasIgnoredByHandler)); | 3007 error.wasIgnoredByHandler)); |
| 3022 } | 3008 } |
| 3023 | 3009 |
| 3024 void RenderFrameImpl::didFinishLoad(blink::WebLocalFrame* frame) { | 3010 void RenderFrameImpl::didFinishLoad(blink::WebLocalFrame* frame) { |
| 3025 TRACE_EVENT1("navigation", "RenderFrameImpl::didFinishLoad", | 3011 TRACE_EVENT1("navigation", "RenderFrameImpl::didFinishLoad", |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3214 #endif | 3200 #endif |
| 3215 | 3201 |
| 3216 Send(new FrameHostMsg_ContextMenu(routing_id_, params)); | 3202 Send(new FrameHostMsg_ContextMenu(routing_id_, params)); |
| 3217 } | 3203 } |
| 3218 | 3204 |
| 3219 void RenderFrameImpl::clearContextMenu() { | 3205 void RenderFrameImpl::clearContextMenu() { |
| 3220 context_menu_node_.reset(); | 3206 context_menu_node_.reset(); |
| 3221 } | 3207 } |
| 3222 | 3208 |
| 3223 void RenderFrameImpl::willSendRequest( | 3209 void RenderFrameImpl::willSendRequest( |
| 3224 blink::WebLocalFrame* frame, | 3210 blink::WebDataSource* datasource, |
| 3225 unsigned identifier, | 3211 unsigned identifier, |
| 3226 blink::WebURLRequest& request, | 3212 blink::WebURLRequest& request, |
| 3227 const blink::WebURLResponse& redirect_response) { | 3213 const blink::WebURLResponse& redirect_response) { |
| 3228 DCHECK(!frame_ || frame_ == frame); | 3214 DCHECK(datasource); |
| 3229 // The request my be empty during tests. | 3215 // The request my be empty during tests. |
| 3230 if (request.url().isEmpty()) | 3216 if (request.url().isEmpty()) |
| 3231 return; | 3217 return; |
| 3232 | 3218 |
| 3233 // Set the first party for cookies url if it has not been set yet (new | 3219 // Set the first party for cookies url if it has not been set yet (new |
| 3234 // requests). For redirects, it is updated by WebURLLoaderImpl. | 3220 // requests). For redirects, it is updated by WebURLLoaderImpl. |
| 3235 if (request.firstPartyForCookies().isEmpty()) { | 3221 if (request.firstPartyForCookies().isEmpty()) { |
| 3236 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel) { | 3222 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel) { |
| 3237 request.setFirstPartyForCookies(request.url()); | 3223 request.setFirstPartyForCookies(request.url()); |
| 3238 } else { | 3224 } else { |
| 3239 // TODO(nasko): When the top-level frame is remote, there is no document. | 3225 // TODO(nasko): When the top-level frame is remote, there is no document. |
| 3240 // This is broken and should be fixed to propagate the first party. | 3226 // This is broken and should be fixed to propagate the first party. |
| 3241 WebFrame* top = frame->top(); | 3227 WebFrame* top = frame_->top(); |
| 3242 if (top->isWebLocalFrame()) { | 3228 if (top->isWebLocalFrame()) { |
| 3243 request.setFirstPartyForCookies( | 3229 request.setFirstPartyForCookies( |
| 3244 frame->top()->document().firstPartyForCookies()); | 3230 frame_->top()->document().firstPartyForCookies()); |
| 3245 } | 3231 } |
| 3246 } | 3232 } |
| 3247 } | 3233 } |
| 3248 | 3234 |
| 3249 WebDataSource* provisional_data_source = frame->provisionalDataSource(); | 3235 DocumentState* document_state = DocumentState::FromDataSource(datasource); |
| 3250 WebDataSource* data_source = | |
| 3251 provisional_data_source ? provisional_data_source : frame->dataSource(); | |
| 3252 | |
| 3253 DocumentState* document_state = DocumentState::FromDataSource(data_source); | |
| 3254 DCHECK(document_state); | 3236 DCHECK(document_state); |
| 3255 InternalDocumentStateData* internal_data = | 3237 InternalDocumentStateData* internal_data = |
| 3256 InternalDocumentStateData::FromDocumentState(document_state); | 3238 InternalDocumentStateData::FromDocumentState(document_state); |
| 3257 NavigationStateImpl* navigation_state = | 3239 NavigationStateImpl* navigation_state = |
| 3258 static_cast<NavigationStateImpl*>(document_state->navigation_state()); | 3240 static_cast<NavigationStateImpl*>(document_state->navigation_state()); |
| 3259 ui::PageTransition transition_type = navigation_state->GetTransitionType(); | 3241 ui::PageTransition transition_type = navigation_state->GetTransitionType(); |
| 3260 if (provisional_data_source && provisional_data_source->isClientRedirect()) { | 3242 if (request.frameType() != blink::WebURLRequest::FrameTypeNone && |
| 3243 datasource->isClientRedirect()) { |
| 3261 transition_type = ui::PageTransitionFromInt( | 3244 transition_type = ui::PageTransitionFromInt( |
| 3262 transition_type | ui::PAGE_TRANSITION_CLIENT_REDIRECT); | 3245 transition_type | ui::PAGE_TRANSITION_CLIENT_REDIRECT); |
| 3263 } | 3246 } |
| 3264 | 3247 |
| 3265 GURL request_url(request.url()); | 3248 GURL request_url(request.url()); |
| 3266 GURL new_url; | 3249 GURL new_url; |
| 3267 if (GetContentClient()->renderer()->WillSendRequest( | 3250 if (GetContentClient()->renderer()->WillSendRequest( |
| 3268 frame, | 3251 frame_, transition_type, request_url, request.firstPartyForCookies(), |
| 3269 transition_type, | |
| 3270 request_url, | |
| 3271 request.firstPartyForCookies(), | |
| 3272 &new_url)) { | 3252 &new_url)) { |
| 3273 request.setURL(WebURL(new_url)); | 3253 request.setURL(WebURL(new_url)); |
| 3274 } | 3254 } |
| 3275 | 3255 |
| 3276 if (internal_data->is_cache_policy_override_set()) | 3256 if (internal_data->is_cache_policy_override_set()) |
| 3277 request.setCachePolicy(internal_data->cache_policy_override()); | 3257 request.setCachePolicy(internal_data->cache_policy_override()); |
| 3278 | 3258 |
| 3279 // The request's extra data may indicate that we should set a custom user | 3259 // The request's extra data may indicate that we should set a custom user |
| 3280 // agent. This needs to be done here, after WebKit is through with setting the | 3260 // agent. This needs to be done here, after WebKit is through with setting the |
| 3281 // user agent on its own. Similarly, it may indicate that we should set an | 3261 // user agent on its own. Similarly, it may indicate that we should set an |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3318 | 3298 |
| 3319 // Add an empty HTTP origin header for non GET methods if none is currently | 3299 // Add an empty HTTP origin header for non GET methods if none is currently |
| 3320 // present. | 3300 // present. |
| 3321 request.addHTTPOriginIfNeeded(WebString()); | 3301 request.addHTTPOriginIfNeeded(WebString()); |
| 3322 | 3302 |
| 3323 // Attach |should_replace_current_entry| state to requests so that, should | 3303 // Attach |should_replace_current_entry| state to requests so that, should |
| 3324 // this navigation later require a request transfer, all state is preserved | 3304 // this navigation later require a request transfer, all state is preserved |
| 3325 // when it is re-created in the new process. | 3305 // when it is re-created in the new process. |
| 3326 bool should_replace_current_entry = false; | 3306 bool should_replace_current_entry = false; |
| 3327 if (navigation_state->IsContentInitiated()) { | 3307 if (navigation_state->IsContentInitiated()) { |
| 3328 should_replace_current_entry = data_source->replacesCurrentHistoryItem(); | 3308 should_replace_current_entry = datasource->replacesCurrentHistoryItem(); |
| 3329 } else { | 3309 } else { |
| 3330 // If the navigation is browser-initiated, the NavigationState contains the | 3310 // If the navigation is browser-initiated, the NavigationState contains the |
| 3331 // correct value instead of the WebDataSource. | 3311 // correct value instead of the WebDataSource. |
| 3332 // | 3312 // |
| 3333 // TODO(davidben): Avoid this awkward duplication of state. See comment on | 3313 // TODO(davidben): Avoid this awkward duplication of state. See comment on |
| 3334 // NavigationState::should_replace_current_entry(). | 3314 // NavigationState::should_replace_current_entry(). |
| 3335 should_replace_current_entry = | 3315 should_replace_current_entry = |
| 3336 navigation_state->common_params().should_replace_current_entry; | 3316 navigation_state->common_params().should_replace_current_entry; |
| 3337 } | 3317 } |
| 3338 | 3318 |
| 3339 int provider_id = kInvalidServiceWorkerProviderId; | 3319 ServiceWorkerNetworkProvider* provider = |
| 3340 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || | 3320 ServiceWorkerNetworkProvider::FromDocumentState(document_state); |
| 3341 request.frameType() == blink::WebURLRequest::FrameTypeNested) { | 3321 int provider_id = provider->provider_id(); |
| 3342 // |provisionalDataSource| may be null in some content::ResourceFetcher | 3322 if (request.frameType() != blink::WebURLRequest::FrameTypeTopLevel && |
| 3343 // use cases, we don't hook those requests. | 3323 request.frameType() != blink::WebURLRequest::FrameTypeNested && |
| 3344 if (frame->provisionalDataSource()) { | 3324 !provider->IsControlledByServiceWorker()) { |
| 3345 ServiceWorkerNetworkProvider* provider = | 3325 request.setSkipServiceWorker(true); |
| 3346 ServiceWorkerNetworkProvider::FromDocumentState( | |
| 3347 DocumentState::FromDataSource(frame->provisionalDataSource())); | |
| 3348 provider_id = provider->provider_id(); | |
| 3349 } | |
| 3350 } else if (frame->dataSource()) { | |
| 3351 ServiceWorkerNetworkProvider* provider = | |
| 3352 ServiceWorkerNetworkProvider::FromDocumentState( | |
| 3353 DocumentState::FromDataSource(frame->dataSource())); | |
| 3354 provider_id = provider->provider_id(); | |
| 3355 // Explicitly set the SkipServiceWorker flag here if the renderer process | |
| 3356 // hasn't received SetControllerServiceWorker message. | |
| 3357 if (!provider->IsControlledByServiceWorker()) | |
| 3358 request.setSkipServiceWorker(true); | |
| 3359 } | 3326 } |
| 3360 | 3327 |
| 3361 WebFrame* parent = frame->parent(); | 3328 WebFrame* parent = frame_->parent(); |
| 3362 int parent_routing_id = MSG_ROUTING_NONE; | 3329 int parent_routing_id = MSG_ROUTING_NONE; |
| 3363 if (!parent) { | 3330 if (!parent) { |
| 3364 parent_routing_id = -1; | 3331 parent_routing_id = -1; |
| 3365 } else if (parent->isWebLocalFrame()) { | 3332 } else if (parent->isWebLocalFrame()) { |
| 3366 parent_routing_id = FromWebFrame(parent)->GetRoutingID(); | 3333 parent_routing_id = FromWebFrame(parent)->GetRoutingID(); |
| 3367 } else { | 3334 } else { |
| 3368 parent_routing_id = RenderFrameProxy::FromWebFrame(parent)->routing_id(); | 3335 parent_routing_id = RenderFrameProxy::FromWebFrame(parent)->routing_id(); |
| 3369 } | 3336 } |
| 3370 | 3337 |
| 3371 RequestExtraData* extra_data = new RequestExtraData(); | 3338 RequestExtraData* extra_data = new RequestExtraData(); |
| 3372 extra_data->set_visibility_state(render_view_->visibilityState()); | 3339 extra_data->set_visibility_state(render_view_->visibilityState()); |
| 3373 extra_data->set_custom_user_agent(custom_user_agent); | 3340 extra_data->set_custom_user_agent(custom_user_agent); |
| 3374 extra_data->set_requested_with(requested_with); | 3341 extra_data->set_requested_with(requested_with); |
| 3375 extra_data->set_render_frame_id(routing_id_); | 3342 extra_data->set_render_frame_id(routing_id_); |
| 3376 extra_data->set_is_main_frame(!parent); | 3343 extra_data->set_is_main_frame(!parent); |
| 3377 extra_data->set_frame_origin( | 3344 extra_data->set_frame_origin( |
| 3378 GURL(frame->document().securityOrigin().toString())); | 3345 GURL(frame_->document().securityOrigin().toString())); |
| 3379 extra_data->set_parent_is_main_frame(parent && !parent->parent()); | 3346 extra_data->set_parent_is_main_frame(parent && !parent->parent()); |
| 3380 extra_data->set_parent_render_frame_id(parent_routing_id); | 3347 extra_data->set_parent_render_frame_id(parent_routing_id); |
| 3381 extra_data->set_allow_download( | 3348 extra_data->set_allow_download( |
| 3382 navigation_state->common_params().allow_download); | 3349 navigation_state->common_params().allow_download); |
| 3383 extra_data->set_transition_type(transition_type); | 3350 extra_data->set_transition_type(transition_type); |
| 3384 extra_data->set_should_replace_current_entry(should_replace_current_entry); | 3351 extra_data->set_should_replace_current_entry(should_replace_current_entry); |
| 3385 extra_data->set_transferred_request_child_id( | 3352 extra_data->set_transferred_request_child_id( |
| 3386 navigation_state->start_params().transferred_request_child_id); | 3353 navigation_state->start_params().transferred_request_child_id); |
| 3387 extra_data->set_transferred_request_request_id( | 3354 extra_data->set_transferred_request_request_id( |
| 3388 navigation_state->start_params().transferred_request_request_id); | 3355 navigation_state->start_params().transferred_request_request_id); |
| 3389 extra_data->set_service_worker_provider_id(provider_id); | 3356 extra_data->set_service_worker_provider_id(provider_id); |
| 3390 extra_data->set_stream_override(stream_override.Pass()); | 3357 extra_data->set_stream_override(stream_override.Pass()); |
| 3391 request.setExtraData(extra_data); | 3358 request.setExtraData(extra_data); |
| 3392 | 3359 |
| 3393 // TODO(creis): Update prefetching to work with out-of-process iframes. | 3360 // TODO(creis): Update prefetching to work with out-of-process iframes. |
| 3394 WebFrame* top_frame = frame->top(); | 3361 WebFrame* top_frame = frame_->top(); |
| 3395 if (top_frame && top_frame->isWebLocalFrame()) { | 3362 if (top_frame && top_frame->isWebLocalFrame()) { |
| 3396 DocumentState* top_document_state = | 3363 DocumentState* top_document_state = |
| 3397 DocumentState::FromDataSource(top_frame->dataSource()); | 3364 DocumentState::FromDataSource(top_frame->dataSource()); |
| 3398 if (top_document_state) { | 3365 if (top_document_state) { |
| 3399 // TODO(gavinp): separate out prefetching and prerender field trials | 3366 // TODO(gavinp): separate out prefetching and prerender field trials |
| 3400 // if the rel=prerender rel type is sticking around. | 3367 // if the rel=prerender rel type is sticking around. |
| 3401 if (request.requestContext() == WebURLRequest::RequestContextPrefetch) | 3368 if (request.requestContext() == WebURLRequest::RequestContextPrefetch) |
| 3402 top_document_state->set_was_prefetcher(true); | 3369 top_document_state->set_was_prefetcher(true); |
| 3403 } | 3370 } |
| 3404 } | 3371 } |
| (...skipping 1494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4899 switches::kEnableBrowserSideNavigation)); | 4866 switches::kEnableBrowserSideNavigation)); |
| 4900 DCHECK(request); | 4867 DCHECK(request); |
| 4901 // TODO(clamy): Execute the beforeunload event. | 4868 // TODO(clamy): Execute the beforeunload event. |
| 4902 | 4869 |
| 4903 // Note: At this stage, the goal is to apply all the modifications the | 4870 // Note: At this stage, the goal is to apply all the modifications the |
| 4904 // renderer wants to make to the request, and then send it to the browser, so | 4871 // renderer wants to make to the request, and then send it to the browser, so |
| 4905 // that the actual network request can be started. Ideally, all such | 4872 // that the actual network request can be started. Ideally, all such |
| 4906 // modifications should take place in willSendRequest, and in the | 4873 // modifications should take place in willSendRequest, and in the |
| 4907 // implementation of willSendRequest for the various InspectorAgents | 4874 // implementation of willSendRequest for the various InspectorAgents |
| 4908 // (devtools). | 4875 // (devtools). |
| 4909 // | |
| 4910 // TODO(clamy): Apply devtools override. | |
| 4911 // TODO(clamy): Make sure that navigation requests are not modified somewhere | |
| 4912 // else in blink. | |
| 4913 willSendRequest(frame_, 0, *request, blink::WebURLResponse()); | |
| 4914 | 4876 |
| 4915 // TODO(clamy): Same-document navigations should not be sent back to the | 4877 // TODO(clamy): Same-document navigations should not be sent back to the |
| 4916 // browser. | 4878 // browser. |
| 4917 // TODO(clamy): Data urls should not be sent back to the browser either. | 4879 // TODO(clamy): Data urls should not be sent back to the browser either. |
| 4918 bool should_replace_current_entry = false; | 4880 bool should_replace_current_entry = false; |
| 4919 WebDataSource* provisional_data_source = frame_->provisionalDataSource(); | 4881 WebDataSource* provisional_data_source = frame_->provisionalDataSource(); |
| 4920 WebDataSource* current_data_source = frame_->dataSource(); | 4882 WebDataSource* current_data_source = frame_->dataSource(); |
| 4921 WebDataSource* data_source = | 4883 WebDataSource* data_source = |
| 4922 provisional_data_source ? provisional_data_source : current_data_source; | 4884 provisional_data_source ? provisional_data_source : current_data_source; |
| 4885 // |
| 4886 // TODO(clamy): Apply devtools override. |
| 4887 // TODO(clamy): Make sure that navigation requests are not modified somewhere |
| 4888 // else in blink. |
| 4889 willSendRequest(data_source, 0, *request, blink::WebURLResponse()); |
| 4923 | 4890 |
| 4924 // The current entry can only be replaced if there already is an entry in the | 4891 // The current entry can only be replaced if there already is an entry in the |
| 4925 // history list. | 4892 // history list. |
| 4926 if (data_source && render_view_->history_list_length_ > 0) { | 4893 if (data_source && render_view_->history_list_length_ > 0) { |
| 4927 should_replace_current_entry = data_source->replacesCurrentHistoryItem(); | 4894 should_replace_current_entry = data_source->replacesCurrentHistoryItem(); |
| 4928 } | 4895 } |
| 4929 | 4896 |
| 4930 // These values are assumed on the browser side for navigations. These checks | 4897 // These values are assumed on the browser side for navigations. These checks |
| 4931 // ensure the renderer has the correct values. | 4898 // ensure the renderer has the correct values. |
| 4932 DCHECK_EQ(FETCH_REQUEST_MODE_SAME_ORIGIN, | 4899 DCHECK_EQ(FETCH_REQUEST_MODE_SAME_ORIGIN, |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5214 mojo::ServiceProviderPtr service_provider(21); | 5181 mojo::ServiceProviderPtr service_provider(21); |
| 5215 mojo::URLRequestPtr request(mojo::URLRequest::New()); | 5182 mojo::URLRequestPtr request(mojo::URLRequest::New()); |
| 5216 request->url = mojo::String::From(url); | 5183 request->url = mojo::String::From(url); |
| 5217 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider), | 5184 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider), |
| 5218 nullptr, nullptr, | 5185 nullptr, nullptr, |
| 5219 base::Bind(&OnGotContentHandlerID)); | 5186 base::Bind(&OnGotContentHandlerID)); |
| 5220 return service_provider.Pass(); | 5187 return service_provider.Pass(); |
| 5221 } | 5188 } |
| 5222 | 5189 |
| 5223 } // namespace content | 5190 } // namespace content |
| OLD | NEW |