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

Side by Side Diff: content/child/service_worker/service_worker_network_provider.cc

Issue 2009453002: service worker: Don't control a subframe of an insecure context (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: getSecurityOrigin Created 4 years, 7 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/child/service_worker/service_worker_network_provider.h" 5 #include "content/child/service_worker/service_worker_network_provider.h"
6 6
7 #include "base/atomic_sequence_num.h" 7 #include "base/atomic_sequence_num.h"
8 #include "content/child/child_thread_impl.h" 8 #include "content/child/child_thread_impl.h"
9 #include "content/child/service_worker/service_worker_provider_context.h" 9 #include "content/child/service_worker/service_worker_provider_context.h"
10 #include "content/common/navigation_params.h" 10 #include "content/common/navigation_params.h"
11 #include "content/common/service_worker/service_worker_messages.h" 11 #include "content/common/service_worker/service_worker_messages.h"
12 #include "content/common/service_worker/service_worker_utils.h" 12 #include "content/common/service_worker/service_worker_utils.h"
13 #include "content/public/common/browser_side_navigation_policy.h" 13 #include "content/public/common/browser_side_navigation_policy.h"
14 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
15 #include "third_party/WebKit/public/platform/WebString.h"
16 #include "third_party/WebKit/public/web/WebLocalFrame.h"
17 #include "third_party/WebKit/public/web/WebSandboxFlags.h"
14 18
15 namespace content { 19 namespace content {
16 20
17 namespace { 21 namespace {
18 22
19 const char kUserDataKey[] = "SWProviderKey"; 23 const char kUserDataKey[] = "SWProviderKey";
20 24
21 // Must be unique in the child process. 25 // Must be unique in the child process.
22 int GetNextProviderId() { 26 int GetNextProviderId() {
23 static base::StaticAtomicSequenceNumber sequence; 27 static base::StaticAtomicSequenceNumber sequence;
(...skipping 21 matching lines...) Expand all
45 base::SupportsUserData* datasource_userdata) { 49 base::SupportsUserData* datasource_userdata) {
46 return static_cast<ServiceWorkerNetworkProvider*>( 50 return static_cast<ServiceWorkerNetworkProvider*>(
47 datasource_userdata->GetUserData(&kUserDataKey)); 51 datasource_userdata->GetUserData(&kUserDataKey));
48 } 52 }
49 53
50 // static 54 // static
51 std::unique_ptr<ServiceWorkerNetworkProvider> 55 std::unique_ptr<ServiceWorkerNetworkProvider>
52 ServiceWorkerNetworkProvider::CreateForNavigation( 56 ServiceWorkerNetworkProvider::CreateForNavigation(
53 int route_id, 57 int route_id,
54 const RequestNavigationParams& request_params, 58 const RequestNavigationParams& request_params,
55 blink::WebSandboxFlags sandbox_flags, 59 blink::WebLocalFrame* frame,
56 bool content_initiated) { 60 bool content_initiated) {
57 bool browser_side_navigation = IsBrowserSideNavigationEnabled(); 61 bool browser_side_navigation = IsBrowserSideNavigationEnabled();
58 bool should_create_provider_for_window = false; 62 bool should_create_provider_for_window = false;
59 int service_worker_provider_id = kInvalidServiceWorkerProviderId; 63 int service_worker_provider_id = kInvalidServiceWorkerProviderId;
60 std::unique_ptr<ServiceWorkerNetworkProvider> network_provider; 64 std::unique_ptr<ServiceWorkerNetworkProvider> network_provider;
61 65
62 // Determine if a ServiceWorkerNetworkProvider should be created and properly 66 // Determine if a ServiceWorkerNetworkProvider should be created and properly
63 // initialized for the navigation. A default ServiceWorkerNetworkProvider 67 // initialized for the navigation. A default ServiceWorkerNetworkProvider
64 // will always be created since it is expected in a certain number of places, 68 // will always be created since it is expected in a certain number of places,
65 // however it will have an invalid id. 69 // however it will have an invalid id.
66 // PlzNavigate: |service_worker_provider_id| can be sent by the browser, if 70 // PlzNavigate: |service_worker_provider_id| can be sent by the browser, if
67 // it already created the SeviceWorkerProviderHost. 71 // it already created the SeviceWorkerProviderHost.
68 if (browser_side_navigation && !content_initiated) { 72 if (browser_side_navigation && !content_initiated) {
69 should_create_provider_for_window = 73 should_create_provider_for_window =
70 request_params.should_create_service_worker; 74 request_params.should_create_service_worker;
71 service_worker_provider_id = request_params.service_worker_provider_id; 75 service_worker_provider_id = request_params.service_worker_provider_id;
72 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( 76 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId(
73 service_worker_provider_id) || 77 service_worker_provider_id) ||
74 service_worker_provider_id == kInvalidServiceWorkerProviderId); 78 service_worker_provider_id == kInvalidServiceWorkerProviderId);
75 } else { 79 } else {
76 should_create_provider_for_window = 80 should_create_provider_for_window =
77 (sandbox_flags & blink::WebSandboxFlags::Origin) != 81 (frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) !=
78 blink::WebSandboxFlags::Origin; 82 blink::WebSandboxFlags::Origin;
83 // Check if |frame| is a subframe of an insecure context.
84 // |frame|'s document is not yet created, so start with the parent.
85 blink::WebFrame* parent = frame->parent();
86 while (parent && should_create_provider_for_window) {
falken 2016/05/24 13:16:37 This ancestor walk should probably be some utility
Marijn Kruisselbrink 2016/05/24 17:03:35 Also keep in mind that to truly match what is spec
jww 2016/05/24 18:06:03 I have a strong preference to factor this out into
falken 2016/05/25 01:33:34 I can't start with the current frame because docum
falken 2016/05/25 04:09:45 Does Chrome currently check for insecure opener wh
jww 2016/05/28 01:35:24 That's a great question. I believe the answer is "
87 blink::WebSecurityOrigin securityOrigin = parent->getSecurityOrigin();
88 if (!securityOrigin.isPotentiallyTrustworthy())
89 should_create_provider_for_window = false;
90 parent = parent->parent();
91 }
79 } 92 }
80 93
81 // Now create the ServiceWorkerNetworkProvider (with invalid id if needed). 94 // Now create the ServiceWorkerNetworkProvider (with invalid id if needed).
82 if (should_create_provider_for_window) { 95 if (should_create_provider_for_window) {
83 if (service_worker_provider_id == kInvalidServiceWorkerProviderId) { 96 if (service_worker_provider_id == kInvalidServiceWorkerProviderId) {
84 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>( 97 network_provider = std::unique_ptr<ServiceWorkerNetworkProvider>(
85 new ServiceWorkerNetworkProvider(route_id, 98 new ServiceWorkerNetworkProvider(route_id,
86 SERVICE_WORKER_PROVIDER_FOR_WINDOW)); 99 SERVICE_WORKER_PROVIDER_FOR_WINDOW));
87 } else { 100 } else {
88 CHECK(browser_side_navigation); 101 CHECK(browser_side_navigation);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 return; // May be null in some tests. 155 return; // May be null in some tests.
143 ChildThreadImpl::current()->Send( 156 ChildThreadImpl::current()->Send(
144 new ServiceWorkerHostMsg_SetVersionId(provider_id_, version_id)); 157 new ServiceWorkerHostMsg_SetVersionId(provider_id_, version_id));
145 } 158 }
146 159
147 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const { 160 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const {
148 return context() && context()->controller(); 161 return context() && context()->controller();
149 } 162 }
150 163
151 } // namespace content 164 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698