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 2516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2571 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); | 2572 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); |
2572 break; | 2573 break; |
2573 default: | 2574 default: |
2574 NOTREACHED(); | 2575 NOTREACHED(); |
2575 } | 2576 } |
2576 } | 2577 } |
2577 | 2578 |
2578 // Create the serviceworker's per-document network observing object if it | 2579 // Create the serviceworker's per-document network observing object if it |
2579 // does not exist (When navigation happens within a page, the provider already | 2580 // does not exist (When navigation happens within a page, the provider already |
2580 // exists). | 2581 // exists). |
2581 if (!ServiceWorkerNetworkProvider::FromDocumentState( | 2582 if (ServiceWorkerNetworkProvider::FromDocumentState( |
2582 DocumentState::FromDataSource(datasource))) { | 2583 DocumentState::FromDataSource(datasource))) |
2583 ServiceWorkerProviderType provider_type = | 2584 return; |
2584 SERVICE_WORKER_PROVIDER_FOR_WINDOW; | 2585 |
2585 if ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) == | 2586 bool browser_side_navigation = |
2586 blink::WebSandboxFlags::Origin) { | 2587 base::CommandLine::ForCurrentProcess()->HasSwitch( |
2587 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; | 2588 switches::kEnableBrowserSideNavigation); |
| 2589 scoped_ptr<ServiceWorkerNetworkProvider> network_provider; |
| 2590 |
| 2591 // Determine if a ServiceWorkerNetworkProvider should be created and properly |
| 2592 // initialized for the navigation. A default ServiceWorkerNetworkProvider |
| 2593 // will always be created since it is expected in a certain number of places, |
| 2594 // however it will have an invalid id. |
| 2595 // PlzNavigate: |service_worker_provider_id| can be sent by the browser, if |
| 2596 // it already created the SeviceWorkerProviderHost. |
| 2597 bool should_create_provider_for_window = false; |
| 2598 int service_worker_provider_id = kInvalidServiceWorkerProviderId; |
| 2599 if (browser_side_navigation && !content_initiated) { |
| 2600 NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>( |
| 2601 DocumentState::FromDataSource(datasource)->navigation_state()); |
| 2602 should_create_provider_for_window = |
| 2603 navigation_state->request_params().should_create_service_worker; |
| 2604 service_worker_provider_id = |
| 2605 navigation_state->request_params().service_worker_provider_id; |
| 2606 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( |
| 2607 service_worker_provider_id) || |
| 2608 service_worker_provider_id == kInvalidServiceWorkerProviderId); |
| 2609 } else { |
| 2610 should_create_provider_for_window = |
| 2611 (frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) != |
| 2612 blink::WebSandboxFlags::Origin; |
| 2613 } |
| 2614 |
| 2615 // Now create the ServiceWorkerNetworkProvider (with invalid id if needed). |
| 2616 if (should_create_provider_for_window) { |
| 2617 if (service_worker_provider_id == kInvalidServiceWorkerProviderId) { |
| 2618 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
| 2619 new ServiceWorkerNetworkProvider(routing_id_, |
| 2620 SERVICE_WORKER_PROVIDER_FOR_WINDOW)); |
| 2621 } else { |
| 2622 CHECK(browser_side_navigation); |
| 2623 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( |
| 2624 service_worker_provider_id)); |
| 2625 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
| 2626 new ServiceWorkerNetworkProvider(routing_id_, |
| 2627 SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
| 2628 service_worker_provider_id)); |
2588 } | 2629 } |
2589 scoped_ptr<ServiceWorkerNetworkProvider> network_provider( | 2630 } else { |
2590 new ServiceWorkerNetworkProvider(routing_id_, provider_type)); | 2631 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
2591 ServiceWorkerNetworkProvider::AttachToDocumentState( | 2632 new ServiceWorkerNetworkProvider()); |
2592 DocumentState::FromDataSource(datasource), | |
2593 network_provider.Pass()); | |
2594 } | 2633 } |
| 2634 |
| 2635 ServiceWorkerNetworkProvider::AttachToDocumentState( |
| 2636 DocumentState::FromDataSource(datasource), network_provider.Pass()); |
2595 } | 2637 } |
2596 | 2638 |
2597 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, | 2639 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, |
2598 double triggering_event_time) { | 2640 double triggering_event_time) { |
2599 DCHECK(!frame_ || frame_ == frame); | 2641 DCHECK(!frame_ || frame_ == frame); |
2600 WebDataSource* ds = frame->provisionalDataSource(); | 2642 WebDataSource* ds = frame->provisionalDataSource(); |
2601 | 2643 |
2602 // In fast/loader/stop-provisional-loads.html, we abort the load before this | 2644 // In fast/loader/stop-provisional-loads.html, we abort the load before this |
2603 // callback is invoked. | 2645 // callback is invoked. |
2604 if (!ds) | 2646 if (!ds) |
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3333 | 3375 |
3334 int provider_id = kInvalidServiceWorkerProviderId; | 3376 int provider_id = kInvalidServiceWorkerProviderId; |
3335 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || | 3377 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || |
3336 request.frameType() == blink::WebURLRequest::FrameTypeNested) { | 3378 request.frameType() == blink::WebURLRequest::FrameTypeNested) { |
3337 // |provisionalDataSource| may be null in some content::ResourceFetcher | 3379 // |provisionalDataSource| may be null in some content::ResourceFetcher |
3338 // use cases, we don't hook those requests. | 3380 // use cases, we don't hook those requests. |
3339 if (frame->provisionalDataSource()) { | 3381 if (frame->provisionalDataSource()) { |
3340 ServiceWorkerNetworkProvider* provider = | 3382 ServiceWorkerNetworkProvider* provider = |
3341 ServiceWorkerNetworkProvider::FromDocumentState( | 3383 ServiceWorkerNetworkProvider::FromDocumentState( |
3342 DocumentState::FromDataSource(frame->provisionalDataSource())); | 3384 DocumentState::FromDataSource(frame->provisionalDataSource())); |
| 3385 DCHECK(provider); |
3343 provider_id = provider->provider_id(); | 3386 provider_id = provider->provider_id(); |
3344 } | 3387 } |
3345 } else if (frame->dataSource()) { | 3388 } else if (frame->dataSource()) { |
3346 ServiceWorkerNetworkProvider* provider = | 3389 ServiceWorkerNetworkProvider* provider = |
3347 ServiceWorkerNetworkProvider::FromDocumentState( | 3390 ServiceWorkerNetworkProvider::FromDocumentState( |
3348 DocumentState::FromDataSource(frame->dataSource())); | 3391 DocumentState::FromDataSource(frame->dataSource())); |
| 3392 DCHECK(provider); |
3349 provider_id = provider->provider_id(); | 3393 provider_id = provider->provider_id(); |
3350 // Explicitly set the SkipServiceWorker flag here if the renderer process | 3394 // Explicitly set the SkipServiceWorker flag here if the renderer process |
3351 // hasn't received SetControllerServiceWorker message. | 3395 // hasn't received SetControllerServiceWorker message. |
3352 if (!provider->IsControlledByServiceWorker()) | 3396 if (!provider->IsControlledByServiceWorker()) |
3353 request.setSkipServiceWorker(true); | 3397 request.setSkipServiceWorker(true); |
3354 } | 3398 } |
3355 | 3399 |
3356 WebFrame* parent = frame->parent(); | 3400 WebFrame* parent = frame->parent(); |
3357 int parent_routing_id = parent ? GetRoutingIdForFrameOrProxy(parent) : -1; | 3401 int parent_routing_id = parent ? GetRoutingIdForFrameOrProxy(parent) : -1; |
3358 | 3402 |
(...skipping 1838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5197 mojo::ServiceProviderPtr service_provider; | 5241 mojo::ServiceProviderPtr service_provider; |
5198 mojo::URLRequestPtr request(mojo::URLRequest::New()); | 5242 mojo::URLRequestPtr request(mojo::URLRequest::New()); |
5199 request->url = mojo::String::From(url); | 5243 request->url = mojo::String::From(url); |
5200 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider), | 5244 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider), |
5201 nullptr, nullptr, | 5245 nullptr, nullptr, |
5202 base::Bind(&OnGotContentHandlerID)); | 5246 base::Bind(&OnGotContentHandlerID)); |
5203 return service_provider.Pass(); | 5247 return service_provider.Pass(); |
5204 } | 5248 } |
5205 | 5249 |
5206 } // namespace content | 5250 } // namespace content |
OLD | NEW |