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

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

Issue 1294243004: PlzNavigate: Make ServiceWorker work with PlzNavigate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments Created 5 years, 2 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 24 matching lines...) Expand all
35 #include "content/child/webmessageportchannel_impl.h" 35 #include "content/child/webmessageportchannel_impl.h"
36 #include "content/child/websocket_bridge.h" 36 #include "content/child/websocket_bridge.h"
37 #include "content/child/weburlresponse_extradata_impl.h" 37 #include "content/child/weburlresponse_extradata_impl.h"
38 #include "content/common/accessibility_messages.h" 38 #include "content/common/accessibility_messages.h"
39 #include "content/common/clipboard_messages.h" 39 #include "content/common/clipboard_messages.h"
40 #include "content/common/frame_messages.h" 40 #include "content/common/frame_messages.h"
41 #include "content/common/frame_replication_state.h" 41 #include "content/common/frame_replication_state.h"
42 #include "content/common/input_messages.h" 42 #include "content/common/input_messages.h"
43 #include "content/common/navigation_params.h" 43 #include "content/common/navigation_params.h"
44 #include "content/common/service_worker/service_worker_types.h" 44 #include "content/common/service_worker/service_worker_types.h"
45 #include "content/common/service_worker/service_worker_utils.h"
45 #include "content/common/site_isolation_policy.h" 46 #include "content/common/site_isolation_policy.h"
46 #include "content/common/swapped_out_messages.h" 47 #include "content/common/swapped_out_messages.h"
47 #include "content/common/view_messages.h" 48 #include "content/common/view_messages.h"
48 #include "content/public/common/bindings_policy.h" 49 #include "content/public/common/bindings_policy.h"
49 #include "content/public/common/content_constants.h" 50 #include "content/public/common/content_constants.h"
50 #include "content/public/common/content_switches.h" 51 #include "content/public/common/content_switches.h"
51 #include "content/public/common/context_menu_params.h" 52 #include "content/public/common/context_menu_params.h"
52 #include "content/public/common/isolated_world_ids.h" 53 #include "content/public/common/isolated_world_ids.h"
53 #include "content/public/common/page_state.h" 54 #include "content/public/common/page_state.h"
54 #include "content/public/common/resource_response.h" 55 #include "content/public/common/resource_response.h"
(...skipping 2519 matching lines...) Expand 10 before | Expand all | Expand 10 after
2574 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_STALE_OK); 2575 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_STALE_OK);
2575 break; 2576 break;
2576 case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post. 2577 case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post.
2577 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); 2578 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY);
2578 break; 2579 break;
2579 default: 2580 default:
2580 NOTREACHED(); 2581 NOTREACHED();
2581 } 2582 }
2582 } 2583 }
2583 2584
2584 // Create the serviceworker's per-document network observing object if it 2585 bool browser_side_navigation =
2585 // does not exist (When navigation happens within a page, the provider already 2586 base::CommandLine::ForCurrentProcess()->HasSwitch(
2586 // exists). 2587 switches::kEnableBrowserSideNavigation);
2587 if (!ServiceWorkerNetworkProvider::FromDocumentState( 2588
2588 DocumentState::FromDataSource(datasource))) { 2589 if (ServiceWorkerNetworkProvider::FromDocumentState(
2589 ServiceWorkerProviderType provider_type = 2590 DocumentState::FromDataSource(datasource)))
2590 SERVICE_WORKER_PROVIDER_FOR_WINDOW; 2591 return;
nasko 2015/10/02 22:09:46 nit: Empty line after the return and before the ne
Fabrice (no longer in Chrome) 2015/10/06 17:21:38 Done.
2592 if (browser_side_navigation && content_initiated)
nasko 2015/10/02 22:09:46 Can you include a comment why we are returning her
Fabrice (no longer in Chrome) 2015/10/06 17:21:38 Done.
2593 return;
2594
2595 ServiceWorkerProviderType provider_type = SERVICE_WORKER_PROVIDER_FOR_WINDOW;
2596 scoped_ptr<ServiceWorkerNetworkProvider> network_provider;
2597
2598 if (browser_side_navigation) {
2599 // PlzNavigate
2600 // Retrieve the service_worker_provider_id from the RequestNavigationParams.
2601 NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>(
2602 DocumentState::FromDataSource(datasource)->navigation_state());
2603 int service_worker_provider_id =
2604 navigation_state->request_params().service_worker_provider_id;
2605
2606 // The browser sets service_worker_provider_id to -1 for sandboxed frames.
nasko 2015/10/02 22:09:46 Let's use the symbolic name, not the constant -1.
Fabrice (no longer in Chrome) 2015/10/06 17:21:38 Done.
2607 if (service_worker_provider_id == kInvalidServiceWorkerProviderId)
2608 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME;
2609 else
2610 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId(
nasko 2015/10/02 22:09:45 More than one line body requires {}.
Fabrice (no longer in Chrome) 2015/10/06 17:21:38 Done.
2611 service_worker_provider_id));
2612
2613 // Initalize a new ServiceWorkerNetworkProvider.
2614 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>(
2615 new ServiceWorkerNetworkProvider(routing_id_, provider_type,
2616 service_worker_provider_id));
2617 } else {
2591 if ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) == 2618 if ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) ==
2592 blink::WebSandboxFlags::Origin) { 2619 blink::WebSandboxFlags::Origin) {
2593 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; 2620 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME;
2594 } 2621 }
2595 scoped_ptr<ServiceWorkerNetworkProvider> network_provider( 2622 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>(
2596 new ServiceWorkerNetworkProvider(routing_id_, provider_type)); 2623 new ServiceWorkerNetworkProvider(routing_id_, provider_type));
2597 ServiceWorkerNetworkProvider::AttachToDocumentState(
2598 DocumentState::FromDataSource(datasource),
2599 network_provider.Pass());
2600 } 2624 }
2625
2626 ServiceWorkerNetworkProvider::AttachToDocumentState(
2627 DocumentState::FromDataSource(datasource), network_provider.Pass());
2601 } 2628 }
2602 2629
2603 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, 2630 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame,
2604 double triggering_event_time) { 2631 double triggering_event_time) {
2605 DCHECK(!frame_ || frame_ == frame); 2632 DCHECK(!frame_ || frame_ == frame);
2606 WebDataSource* ds = frame->provisionalDataSource(); 2633 WebDataSource* ds = frame->provisionalDataSource();
2607 2634
2608 // In fast/loader/stop-provisional-loads.html, we abort the load before this 2635 // In fast/loader/stop-provisional-loads.html, we abort the load before this
2609 // callback is invoked. 2636 // callback is invoked.
2610 if (!ds) 2637 if (!ds)
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after
3330 3357
3331 int provider_id = kInvalidServiceWorkerProviderId; 3358 int provider_id = kInvalidServiceWorkerProviderId;
3332 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || 3359 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel ||
3333 request.frameType() == blink::WebURLRequest::FrameTypeNested) { 3360 request.frameType() == blink::WebURLRequest::FrameTypeNested) {
3334 // |provisionalDataSource| may be null in some content::ResourceFetcher 3361 // |provisionalDataSource| may be null in some content::ResourceFetcher
3335 // use cases, we don't hook those requests. 3362 // use cases, we don't hook those requests.
3336 if (frame->provisionalDataSource()) { 3363 if (frame->provisionalDataSource()) {
3337 ServiceWorkerNetworkProvider* provider = 3364 ServiceWorkerNetworkProvider* provider =
3338 ServiceWorkerNetworkProvider::FromDocumentState( 3365 ServiceWorkerNetworkProvider::FromDocumentState(
3339 DocumentState::FromDataSource(frame->provisionalDataSource())); 3366 DocumentState::FromDataSource(frame->provisionalDataSource()));
3340 provider_id = provider->provider_id(); 3367 if (provider)
3368 provider_id = provider->provider_id();
3341 } 3369 }
3342 } else if (frame->dataSource()) { 3370 } else if (frame->dataSource()) {
3343 ServiceWorkerNetworkProvider* provider = 3371 ServiceWorkerNetworkProvider* provider =
3344 ServiceWorkerNetworkProvider::FromDocumentState( 3372 ServiceWorkerNetworkProvider::FromDocumentState(
3345 DocumentState::FromDataSource(frame->dataSource())); 3373 DocumentState::FromDataSource(frame->dataSource()));
3346 provider_id = provider->provider_id(); 3374 if (provider) {
3347 // Explicitly set the SkipServiceWorker flag here if the renderer process 3375 provider_id = provider->provider_id();
3348 // hasn't received SetControllerServiceWorker message. 3376 // Explicitly set the SkipServiceWorker flag here if the renderer process
3349 if (!provider->IsControlledByServiceWorker()) 3377 // hasn't received SetControllerServiceWorker message.
3350 request.setSkipServiceWorker(true); 3378 if (!provider->IsControlledByServiceWorker())
3379 request.setSkipServiceWorker(true);
3380 }
3351 } 3381 }
3352 3382
3353 WebFrame* parent = frame->parent(); 3383 WebFrame* parent = frame->parent();
3354 int parent_routing_id = MSG_ROUTING_NONE; 3384 int parent_routing_id = MSG_ROUTING_NONE;
3355 if (!parent) { 3385 if (!parent) {
3356 parent_routing_id = -1; 3386 parent_routing_id = -1;
3357 } else if (parent->isWebLocalFrame()) { 3387 } else if (parent->isWebLocalFrame()) {
3358 parent_routing_id = FromWebFrame(parent)->GetRoutingID(); 3388 parent_routing_id = FromWebFrame(parent)->GetRoutingID();
3359 } else { 3389 } else {
3360 parent_routing_id = RenderFrameProxy::FromWebFrame(parent)->routing_id(); 3390 parent_routing_id = RenderFrameProxy::FromWebFrame(parent)->routing_id();
(...skipping 1540 matching lines...) Expand 10 before | Expand all | Expand 10 after
4901 WebDataSource* provisional_data_source = frame_->provisionalDataSource(); 4931 WebDataSource* provisional_data_source = frame_->provisionalDataSource();
4902 WebDataSource* current_data_source = frame_->dataSource(); 4932 WebDataSource* current_data_source = frame_->dataSource();
4903 WebDataSource* data_source = 4933 WebDataSource* data_source =
4904 provisional_data_source ? provisional_data_source : current_data_source; 4934 provisional_data_source ? provisional_data_source : current_data_source;
4905 4935
4906 // The current entry can only be replaced if there already is an entry in the 4936 // The current entry can only be replaced if there already is an entry in the
4907 // history list. 4937 // history list.
4908 if (data_source && render_view_->history_list_length_ > 0) { 4938 if (data_source && render_view_->history_list_length_ > 0) {
4909 should_replace_current_entry = data_source->replacesCurrentHistoryItem(); 4939 should_replace_current_entry = data_source->replacesCurrentHistoryItem();
4910 } 4940 }
4941
4942 DCHECK_EQ(FETCH_REQUEST_MODE_SAME_ORIGIN,
nasko 2015/10/02 22:09:45 Let's put a comment above all of the DCHECKs to ex
Fabrice (no longer in Chrome) 2015/10/06 17:21:38 Done.
4943 GetFetchRequestModeForWebURLRequest(*request));
4944 DCHECK_EQ(FETCH_CREDENTIALS_MODE_INCLUDE,
4945 GetFetchCredentialsModeForWebURLRequest(*request));
4946 DCHECK(GetFetchRedirectModeForWebURLRequest(*request) ==
4947 FetchRedirectMode::MANUAL_MODE);
4948 DCHECK_IMPLIES(!frame_->parent(),
4949 GetRequestContextFrameTypeForWebURLRequest(*request) ==
4950 REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL);
4951 DCHECK_IMPLIES(frame_->parent(),
4952 GetRequestContextFrameTypeForWebURLRequest(*request) ==
4953 REQUEST_CONTEXT_FRAME_TYPE_NESTED);
4954
4911 Send(new FrameHostMsg_BeginNavigation( 4955 Send(new FrameHostMsg_BeginNavigation(
4912 routing_id_, 4956 routing_id_,
4913 MakeCommonNavigationParams(request, should_replace_current_entry), 4957 MakeCommonNavigationParams(request, should_replace_current_entry),
4914 BeginNavigationParams( 4958 BeginNavigationParams(
4915 request->httpMethod().latin1(), GetWebURLRequestHeaders(*request), 4959 request->httpMethod().latin1(), GetWebURLRequestHeaders(*request),
4916 GetLoadFlagsForWebURLRequest(*request), request->hasUserGesture()), 4960 GetLoadFlagsForWebURLRequest(*request), request->hasUserGesture(),
4961 request->skipServiceWorker(),
4962 GetRequestContextTypeForWebURLRequest(*request)),
4917 GetRequestBodyForWebURLRequest(*request))); 4963 GetRequestBodyForWebURLRequest(*request)));
4918 } 4964 }
4919 4965
4920 void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params, 4966 void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params,
4921 WebFrame* frame) { 4967 WebFrame* frame) {
4922 // A loadData request with a specified base URL. 4968 // A loadData request with a specified base URL.
4923 std::string mime_type, charset, data; 4969 std::string mime_type, charset, data;
4924 if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) { 4970 if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) {
4925 const GURL base_url = params.base_url_for_data_url.is_empty() ? 4971 const GURL base_url = params.base_url_for_data_url.is_empty() ?
4926 params.url : params.base_url_for_data_url; 4972 params.url : params.base_url_for_data_url;
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
5178 mojo::ServiceProviderPtr service_provider; 5224 mojo::ServiceProviderPtr service_provider;
5179 mojo::URLRequestPtr request(mojo::URLRequest::New()); 5225 mojo::URLRequestPtr request(mojo::URLRequest::New());
5180 request->url = mojo::String::From(url); 5226 request->url = mojo::String::From(url);
5181 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider), 5227 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider),
5182 nullptr, nullptr, 5228 nullptr, nullptr,
5183 base::Bind(&OnGotContentHandlerID)); 5229 base::Bind(&OnGotContentHandlerID));
5184 return service_provider.Pass(); 5230 return service_provider.Pass();
5185 } 5231 }
5186 5232
5187 } // namespace content 5233 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698