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 <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 Loading... | |
| 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 2528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2583 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); | 2584 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); |
| 2584 break; | 2585 break; |
| 2585 default: | 2586 default: |
| 2586 NOTREACHED(); | 2587 NOTREACHED(); |
| 2587 } | 2588 } |
| 2588 } | 2589 } |
| 2589 | 2590 |
| 2590 // Create the serviceworker's per-document network observing object if it | 2591 // Create the serviceworker's per-document network observing object if it |
| 2591 // does not exist (When navigation happens within a page, the provider already | 2592 // does not exist (When navigation happens within a page, the provider already |
| 2592 // exists). | 2593 // exists). |
| 2593 if (!ServiceWorkerNetworkProvider::FromDocumentState( | 2594 if (ServiceWorkerNetworkProvider::FromDocumentState( |
| 2594 DocumentState::FromDataSource(datasource))) { | 2595 DocumentState::FromDataSource(datasource))) |
| 2595 ServiceWorkerProviderType provider_type = | 2596 return; |
| 2596 SERVICE_WORKER_PROVIDER_FOR_WINDOW; | 2597 |
| 2597 if ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) == | 2598 bool browser_side_navigation = |
| 2598 blink::WebSandboxFlags::Origin) { | 2599 base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 2599 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; | 2600 switches::kEnableBrowserSideNavigation); |
| 2601 scoped_ptr<ServiceWorkerNetworkProvider> network_provider; | |
| 2602 | |
| 2603 // Determine if a ServiceWorkerNetworkProvider should be created and properly | |
| 2604 // initialized for the navigation. A default ServiceWorkerNetworkProvider | |
| 2605 // will always be created since it is expected in a certain number of places, | |
| 2606 // however it will have an invalid id. | |
| 2607 // PlzNavigate: |service_worker_provider_id| can be sent by the browser, if | |
| 2608 // it already created the SeviceWorkerProviderHost. | |
| 2609 bool should_create_provider_for_window = false; | |
| 2610 int service_worker_provider_id = kInvalidServiceWorkerProviderId; | |
| 2611 if (browser_side_navigation && !content_initiated) { | |
| 2612 NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>( | |
| 2613 DocumentState::FromDataSource(datasource)->navigation_state()); | |
| 2614 should_create_provider_for_window = | |
| 2615 navigation_state->request_params().should_create_service_worker; | |
| 2616 service_worker_provider_id = | |
| 2617 navigation_state->request_params().service_worker_provider_id; | |
| 2618 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( | |
| 2619 service_worker_provider_id) || | |
| 2620 service_worker_provider_id == kInvalidServiceWorkerProviderId); | |
| 2621 } else { | |
| 2622 should_create_provider_for_window = | |
| 2623 (frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) != | |
| 2624 blink::WebSandboxFlags::Origin; | |
| 2625 } | |
| 2626 | |
| 2627 // Now create the ServiceWorkerNetworkProvider (with invalid id if needed). | |
| 2628 if (should_create_provider_for_window) { | |
| 2629 if (service_worker_provider_id == kInvalidServiceWorkerProviderId) { | |
| 2630 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( | |
| 2631 new ServiceWorkerNetworkProvider(routing_id_, | |
| 2632 SERVICE_WORKER_PROVIDER_FOR_WINDOW)); | |
| 2633 } else { | |
| 2634 CHECK(browser_side_navigation); | |
| 2635 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( | |
| 2636 service_worker_provider_id)); | |
| 2637 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( | |
| 2638 new ServiceWorkerNetworkProvider(routing_id_, | |
| 2639 SERVICE_WORKER_PROVIDER_FOR_WINDOW, | |
| 2640 service_worker_provider_id)); | |
| 2600 } | 2641 } |
| 2601 scoped_ptr<ServiceWorkerNetworkProvider> network_provider( | 2642 } else { |
| 2602 new ServiceWorkerNetworkProvider(routing_id_, provider_type)); | 2643 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
| 2603 ServiceWorkerNetworkProvider::AttachToDocumentState( | 2644 new ServiceWorkerNetworkProvider()); |
| 2604 DocumentState::FromDataSource(datasource), | |
| 2605 network_provider.Pass()); | |
| 2606 } | 2645 } |
|
kinuko
2015/10/23 02:37:45
Could this part be maybe factored out as a utility
clamy
2015/10/27 14:46:13
Done. This is now a static method in ServiceWorker
| |
| 2646 | |
| 2647 ServiceWorkerNetworkProvider::AttachToDocumentState( | |
| 2648 DocumentState::FromDataSource(datasource), network_provider.Pass()); | |
| 2607 } | 2649 } |
| 2608 | 2650 |
| 2609 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, | 2651 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, |
| 2610 double triggering_event_time) { | 2652 double triggering_event_time) { |
| 2611 DCHECK(!frame_ || frame_ == frame); | 2653 DCHECK(!frame_ || frame_ == frame); |
| 2612 WebDataSource* ds = frame->provisionalDataSource(); | 2654 WebDataSource* ds = frame->provisionalDataSource(); |
| 2613 | 2655 |
| 2614 // In fast/loader/stop-provisional-loads.html, we abort the load before this | 2656 // In fast/loader/stop-provisional-loads.html, we abort the load before this |
| 2615 // callback is invoked. | 2657 // callback is invoked. |
| 2616 if (!ds) | 2658 if (!ds) |
| (...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3345 | 3387 |
| 3346 int provider_id = kInvalidServiceWorkerProviderId; | 3388 int provider_id = kInvalidServiceWorkerProviderId; |
| 3347 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || | 3389 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || |
| 3348 request.frameType() == blink::WebURLRequest::FrameTypeNested) { | 3390 request.frameType() == blink::WebURLRequest::FrameTypeNested) { |
| 3349 // |provisionalDataSource| may be null in some content::ResourceFetcher | 3391 // |provisionalDataSource| may be null in some content::ResourceFetcher |
| 3350 // use cases, we don't hook those requests. | 3392 // use cases, we don't hook those requests. |
| 3351 if (frame->provisionalDataSource()) { | 3393 if (frame->provisionalDataSource()) { |
| 3352 ServiceWorkerNetworkProvider* provider = | 3394 ServiceWorkerNetworkProvider* provider = |
| 3353 ServiceWorkerNetworkProvider::FromDocumentState( | 3395 ServiceWorkerNetworkProvider::FromDocumentState( |
| 3354 DocumentState::FromDataSource(frame->provisionalDataSource())); | 3396 DocumentState::FromDataSource(frame->provisionalDataSource())); |
| 3397 DCHECK(provider); | |
| 3355 provider_id = provider->provider_id(); | 3398 provider_id = provider->provider_id(); |
| 3356 } | 3399 } |
| 3357 } else if (frame->dataSource()) { | 3400 } else if (frame->dataSource()) { |
| 3358 ServiceWorkerNetworkProvider* provider = | 3401 ServiceWorkerNetworkProvider* provider = |
| 3359 ServiceWorkerNetworkProvider::FromDocumentState( | 3402 ServiceWorkerNetworkProvider::FromDocumentState( |
| 3360 DocumentState::FromDataSource(frame->dataSource())); | 3403 DocumentState::FromDataSource(frame->dataSource())); |
| 3404 DCHECK(provider); | |
| 3361 provider_id = provider->provider_id(); | 3405 provider_id = provider->provider_id(); |
| 3362 // Explicitly set the SkipServiceWorker flag here if the renderer process | 3406 // Explicitly set the SkipServiceWorker flag here if the renderer process |
| 3363 // hasn't received SetControllerServiceWorker message. | 3407 // hasn't received SetControllerServiceWorker message. |
| 3364 if (!provider->IsControlledByServiceWorker()) | 3408 if (!provider->IsControlledByServiceWorker()) |
| 3365 request.setSkipServiceWorker(true); | 3409 request.setSkipServiceWorker(true); |
| 3366 } | 3410 } |
| 3367 | 3411 |
| 3368 WebFrame* parent = frame->parent(); | 3412 WebFrame* parent = frame->parent(); |
| 3369 int parent_routing_id = parent ? GetRoutingIdForFrameOrProxy(parent) : -1; | 3413 int parent_routing_id = parent ? GetRoutingIdForFrameOrProxy(parent) : -1; |
| 3370 | 3414 |
| (...skipping 1837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5208 mojo::ServiceProviderPtr service_provider; | 5252 mojo::ServiceProviderPtr service_provider; |
| 5209 mojo::URLRequestPtr request(mojo::URLRequest::New()); | 5253 mojo::URLRequestPtr request(mojo::URLRequest::New()); |
| 5210 request->url = mojo::String::From(url); | 5254 request->url = mojo::String::From(url); |
| 5211 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider), | 5255 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider), |
| 5212 nullptr, nullptr, | 5256 nullptr, nullptr, |
| 5213 base::Bind(&OnGotContentHandlerID)); | 5257 base::Bind(&OnGotContentHandlerID)); |
| 5214 return service_provider.Pass(); | 5258 return service_provider.Pass(); |
| 5215 } | 5259 } |
| 5216 | 5260 |
| 5217 } // namespace content | 5261 } // namespace content |
| OLD | NEW |