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

Side by Side Diff: third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp

Issue 2050123002: Remove OwnPtr from Blink. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: First attempt to land. Created 4 years, 6 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 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 #include "modules/serviceworkers/ServiceWorkerError.h" 49 #include "modules/serviceworkers/ServiceWorkerError.h"
50 #include "modules/serviceworkers/ServiceWorkerMessageEvent.h" 50 #include "modules/serviceworkers/ServiceWorkerMessageEvent.h"
51 #include "modules/serviceworkers/ServiceWorkerRegistration.h" 51 #include "modules/serviceworkers/ServiceWorkerRegistration.h"
52 #include "platform/RuntimeEnabledFeatures.h" 52 #include "platform/RuntimeEnabledFeatures.h"
53 #include "platform/weborigin/SchemeRegistry.h" 53 #include "platform/weborigin/SchemeRegistry.h"
54 #include "public/platform/WebString.h" 54 #include "public/platform/WebString.h"
55 #include "public/platform/WebURL.h" 55 #include "public/platform/WebURL.h"
56 #include "public/platform/modules/serviceworker/WebServiceWorker.h" 56 #include "public/platform/modules/serviceworker/WebServiceWorker.h"
57 #include "public/platform/modules/serviceworker/WebServiceWorkerProvider.h" 57 #include "public/platform/modules/serviceworker/WebServiceWorkerProvider.h"
58 #include "public/platform/modules/serviceworker/WebServiceWorkerRegistration.h" 58 #include "public/platform/modules/serviceworker/WebServiceWorkerRegistration.h"
59 #include "wtf/PtrUtil.h"
60 #include <memory>
59 61
60 namespace blink { 62 namespace blink {
61 63
62 class RegistrationCallback : public WebServiceWorkerProvider::WebServiceWorkerRe gistrationCallbacks { 64 class RegistrationCallback : public WebServiceWorkerProvider::WebServiceWorkerRe gistrationCallbacks {
63 public: 65 public:
64 explicit RegistrationCallback(ScriptPromiseResolver* resolver) 66 explicit RegistrationCallback(ScriptPromiseResolver* resolver)
65 : m_resolver(resolver) { } 67 : m_resolver(resolver) { }
66 ~RegistrationCallback() override { } 68 ~RegistrationCallback() override { }
67 69
68 void onSuccess(std::unique_ptr<WebServiceWorkerRegistration::Handle> handle) override 70 void onSuccess(std::unique_ptr<WebServiceWorkerRegistration::Handle> handle) override
69 { 71 {
70 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped()) 72 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped())
71 return; 73 return;
72 m_resolver->resolve(ServiceWorkerRegistration::getOrCreate(m_resolver->g etExecutionContext(), adoptPtr(handle.release()))); 74 m_resolver->resolve(ServiceWorkerRegistration::getOrCreate(m_resolver->g etExecutionContext(), wrapUnique(handle.release())));
73 } 75 }
74 76
75 void onError(const WebServiceWorkerError& error) override 77 void onError(const WebServiceWorkerError& error) override
76 { 78 {
77 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped()) 79 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped())
78 return; 80 return;
79 if (error.errorType == WebServiceWorkerError::ErrorTypeType) { 81 if (error.errorType == WebServiceWorkerError::ErrorTypeType) {
80 m_resolver->reject(V8ThrowException::createTypeError(m_resolver->get ScriptState()->isolate(), error.message)); 82 m_resolver->reject(V8ThrowException::createTypeError(m_resolver->get ScriptState()->isolate(), error.message));
81 } else { 83 } else {
82 m_resolver->reject(ServiceWorkerError::take(m_resolver.get(), error) ); 84 m_resolver->reject(ServiceWorkerError::take(m_resolver.get(), error) );
83 } 85 }
84 } 86 }
85 87
86 private: 88 private:
87 Persistent<ScriptPromiseResolver> m_resolver; 89 Persistent<ScriptPromiseResolver> m_resolver;
88 WTF_MAKE_NONCOPYABLE(RegistrationCallback); 90 WTF_MAKE_NONCOPYABLE(RegistrationCallback);
89 }; 91 };
90 92
91 class GetRegistrationCallback : public WebServiceWorkerProvider::WebServiceWorke rGetRegistrationCallbacks { 93 class GetRegistrationCallback : public WebServiceWorkerProvider::WebServiceWorke rGetRegistrationCallbacks {
92 public: 94 public:
93 explicit GetRegistrationCallback(ScriptPromiseResolver* resolver) 95 explicit GetRegistrationCallback(ScriptPromiseResolver* resolver)
94 : m_resolver(resolver) { } 96 : m_resolver(resolver) { }
95 ~GetRegistrationCallback() override { } 97 ~GetRegistrationCallback() override { }
96 98
97 void onSuccess(std::unique_ptr<WebServiceWorkerRegistration::Handle> webPass Handle) override 99 void onSuccess(std::unique_ptr<WebServiceWorkerRegistration::Handle> webPass Handle) override
98 { 100 {
99 OwnPtr<WebServiceWorkerRegistration::Handle> handle = adoptPtr(webPassHa ndle.release()); 101 std::unique_ptr<WebServiceWorkerRegistration::Handle> handle = wrapUniqu e(webPassHandle.release());
100 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped()) 102 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped())
101 return; 103 return;
102 if (!handle) { 104 if (!handle) {
103 // Resolve the promise with undefined. 105 // Resolve the promise with undefined.
104 m_resolver->resolve(); 106 m_resolver->resolve();
105 return; 107 return;
106 } 108 }
107 m_resolver->resolve(ServiceWorkerRegistration::getOrCreate(m_resolver->g etExecutionContext(), std::move(handle))); 109 m_resolver->resolve(ServiceWorkerRegistration::getOrCreate(m_resolver->g etExecutionContext(), std::move(handle)));
108 } 110 }
109 111
(...skipping 10 matching lines...) Expand all
120 }; 122 };
121 123
122 class GetRegistrationsCallback : public WebServiceWorkerProvider::WebServiceWork erGetRegistrationsCallbacks { 124 class GetRegistrationsCallback : public WebServiceWorkerProvider::WebServiceWork erGetRegistrationsCallbacks {
123 public: 125 public:
124 explicit GetRegistrationsCallback(ScriptPromiseResolver* resolver) 126 explicit GetRegistrationsCallback(ScriptPromiseResolver* resolver)
125 : m_resolver(resolver) { } 127 : m_resolver(resolver) { }
126 ~GetRegistrationsCallback() override { } 128 ~GetRegistrationsCallback() override { }
127 129
128 void onSuccess(std::unique_ptr<WebVector<WebServiceWorkerRegistration::Handl e*>> webPassRegistrations) override 130 void onSuccess(std::unique_ptr<WebVector<WebServiceWorkerRegistration::Handl e*>> webPassRegistrations) override
129 { 131 {
130 Vector<OwnPtr<WebServiceWorkerRegistration::Handle>> handles; 132 Vector<std::unique_ptr<WebServiceWorkerRegistration::Handle>> handles;
131 OwnPtr<WebVector<WebServiceWorkerRegistration::Handle*>> webRegistration s = adoptPtr(webPassRegistrations.release()); 133 std::unique_ptr<WebVector<WebServiceWorkerRegistration::Handle*>> webReg istrations = wrapUnique(webPassRegistrations.release());
132 for (auto& handle : *webRegistrations) { 134 for (auto& handle : *webRegistrations) {
133 handles.append(adoptPtr(handle)); 135 handles.append(wrapUnique(handle));
134 } 136 }
135 137
136 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped()) 138 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped())
137 return; 139 return;
138 m_resolver->resolve(ServiceWorkerRegistrationArray::take(m_resolver.get( ), &handles)); 140 m_resolver->resolve(ServiceWorkerRegistrationArray::take(m_resolver.get( ), &handles));
139 } 141 }
140 142
141 void onError(const WebServiceWorkerError& error) override 143 void onError(const WebServiceWorkerError& error) override
142 { 144 {
143 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped()) 145 if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContex t()->activeDOMObjectsAreStopped())
(...skipping 10 matching lines...) Expand all
154 public: 156 public:
155 explicit GetRegistrationForReadyCallback(ReadyProperty* ready) 157 explicit GetRegistrationForReadyCallback(ReadyProperty* ready)
156 : m_ready(ready) { } 158 : m_ready(ready) { }
157 ~GetRegistrationForReadyCallback() override { } 159 ~GetRegistrationForReadyCallback() override { }
158 160
159 void onSuccess(std::unique_ptr<WebServiceWorkerRegistration::Handle> handle) override 161 void onSuccess(std::unique_ptr<WebServiceWorkerRegistration::Handle> handle) override
160 { 162 {
161 ASSERT(m_ready->getState() == ReadyProperty::Pending); 163 ASSERT(m_ready->getState() == ReadyProperty::Pending);
162 164
163 if (m_ready->getExecutionContext() && !m_ready->getExecutionContext()->a ctiveDOMObjectsAreStopped()) 165 if (m_ready->getExecutionContext() && !m_ready->getExecutionContext()->a ctiveDOMObjectsAreStopped())
164 m_ready->resolve(ServiceWorkerRegistration::getOrCreate(m_ready->get ExecutionContext(), adoptPtr(handle.release()))); 166 m_ready->resolve(ServiceWorkerRegistration::getOrCreate(m_ready->get ExecutionContext(), wrapUnique(handle.release())));
165 } 167 }
166 168
167 private: 169 private:
168 Persistent<ReadyProperty> m_ready; 170 Persistent<ReadyProperty> m_ready;
169 WTF_MAKE_NONCOPYABLE(GetRegistrationForReadyCallback); 171 WTF_MAKE_NONCOPYABLE(GetRegistrationForReadyCallback);
170 }; 172 };
171 173
172 ServiceWorkerContainer* ServiceWorkerContainer::create(ExecutionContext* executi onContext) 174 ServiceWorkerContainer* ServiceWorkerContainer::create(ExecutionContext* executi onContext)
173 { 175 {
174 return new ServiceWorkerContainer(executionContext); 176 return new ServiceWorkerContainer(executionContext);
(...skipping 13 matching lines...) Expand all
188 } 190 }
189 191
190 DEFINE_TRACE(ServiceWorkerContainer) 192 DEFINE_TRACE(ServiceWorkerContainer)
191 { 193 {
192 visitor->trace(m_controller); 194 visitor->trace(m_controller);
193 visitor->trace(m_ready); 195 visitor->trace(m_ready);
194 EventTargetWithInlineData::trace(visitor); 196 EventTargetWithInlineData::trace(visitor);
195 ContextLifecycleObserver::trace(visitor); 197 ContextLifecycleObserver::trace(visitor);
196 } 198 }
197 199
198 void ServiceWorkerContainer::registerServiceWorkerImpl(ExecutionContext* executi onContext, const KURL& rawScriptURL, const KURL& scope, PassOwnPtr<RegistrationC allbacks> callbacks) 200 void ServiceWorkerContainer::registerServiceWorkerImpl(ExecutionContext* executi onContext, const KURL& rawScriptURL, const KURL& scope, std::unique_ptr<Registra tionCallbacks> callbacks)
199 { 201 {
200 if (!m_provider) { 202 if (!m_provider) {
201 callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTyp eState, "Failed to register a ServiceWorker: The document is in an invalid state .")); 203 callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTyp eState, "Failed to register a ServiceWorker: The document is in an invalid state ."));
202 return; 204 return;
203 } 205 }
204 206
205 RefPtr<SecurityOrigin> documentOrigin = executionContext->getSecurityOrigin( ); 207 RefPtr<SecurityOrigin> documentOrigin = executionContext->getSecurityOrigin( );
206 String errorMessage; 208 String errorMessage;
207 // Restrict to secure origins: https://w3c.github.io/webappsec/specs/powerfu lfeatures/#settings-privileged 209 // Restrict to secure origins: https://w3c.github.io/webappsec/specs/powerfu lfeatures/#settings-privileged
208 if (!executionContext->isSecureContext(errorMessage)) { 210 if (!executionContext->isSecureContext(errorMessage)) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 } 250 }
249 251
250 ContentSecurityPolicy* csp = executionContext->contentSecurityPolicy(); 252 ContentSecurityPolicy* csp = executionContext->contentSecurityPolicy();
251 if (csp) { 253 if (csp) {
252 if (!csp->allowWorkerContextFromSource(scriptURL, ResourceRequest::Redir ectStatus::NoRedirect, ContentSecurityPolicy::SendReport)) { 254 if (!csp->allowWorkerContextFromSource(scriptURL, ResourceRequest::Redir ectStatus::NoRedirect, ContentSecurityPolicy::SendReport)) {
253 callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::Erro rTypeSecurity, String("Failed to register a ServiceWorker: The provided scriptUR L ('" + scriptURL.getString() + "') violates the Content Security Policy."))); 255 callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::Erro rTypeSecurity, String("Failed to register a ServiceWorker: The provided scriptUR L ('" + scriptURL.getString() + "') violates the Content Security Policy.")));
254 return; 256 return;
255 } 257 }
256 } 258 }
257 259
258 m_provider->registerServiceWorker(patternURL, scriptURL, callbacks.leakPtr() ); 260 m_provider->registerServiceWorker(patternURL, scriptURL, callbacks.release() );
259 } 261 }
260 262
261 ScriptPromise ServiceWorkerContainer::registerServiceWorker(ScriptState* scriptS tate, const String& url, const RegistrationOptions& options) 263 ScriptPromise ServiceWorkerContainer::registerServiceWorker(ScriptState* scriptS tate, const String& url, const RegistrationOptions& options)
262 { 264 {
263 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 265 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
264 ScriptPromise promise = resolver->promise(); 266 ScriptPromise promise = resolver->promise();
265 267
266 if (!m_provider) { 268 if (!m_provider) {
267 resolver->reject(DOMException::create(InvalidStateError, "Failed to regi ster a ServiceWorker: The document is in an invalid state.")); 269 resolver->reject(DOMException::create(InvalidStateError, "Failed to regi ster a ServiceWorker: The document is in an invalid state."));
268 return promise; 270 return promise;
269 } 271 }
270 272
271 ExecutionContext* executionContext = scriptState->getExecutionContext(); 273 ExecutionContext* executionContext = scriptState->getExecutionContext();
272 // FIXME: May be null due to worker termination: http://crbug.com/413518. 274 // FIXME: May be null due to worker termination: http://crbug.com/413518.
273 if (!executionContext) 275 if (!executionContext)
274 return ScriptPromise(); 276 return ScriptPromise();
275 277
276 KURL scriptURL = enteredExecutionContext(scriptState->isolate())->completeUR L(url); 278 KURL scriptURL = enteredExecutionContext(scriptState->isolate())->completeUR L(url);
277 scriptURL.removeFragmentIdentifier(); 279 scriptURL.removeFragmentIdentifier();
278 280
279 KURL patternURL; 281 KURL patternURL;
280 if (options.scope().isNull()) 282 if (options.scope().isNull())
281 patternURL = KURL(scriptURL, "./"); 283 patternURL = KURL(scriptURL, "./");
282 else 284 else
283 patternURL = enteredExecutionContext(scriptState->isolate())->completeUR L(options.scope()); 285 patternURL = enteredExecutionContext(scriptState->isolate())->completeUR L(options.scope());
284 286
285 registerServiceWorkerImpl(executionContext, scriptURL, patternURL, adoptPtr( new RegistrationCallback(resolver))); 287 registerServiceWorkerImpl(executionContext, scriptURL, patternURL, wrapUniqu e(new RegistrationCallback(resolver)));
286 288
287 return promise; 289 return promise;
288 } 290 }
289 291
290 ScriptPromise ServiceWorkerContainer::getRegistration(ScriptState* scriptState, const String& documentURL) 292 ScriptPromise ServiceWorkerContainer::getRegistration(ScriptState* scriptState, const String& documentURL)
291 { 293 {
292 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; 294 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
293 ScriptPromise promise = resolver->promise(); 295 ScriptPromise promise = resolver->promise();
294 296
295 if (!m_provider) { 297 if (!m_provider) {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 m_provider->getRegistrationForReady(new GetRegistrationForReadyCallb ack(m_ready.get())); 380 m_provider->getRegistrationForReady(new GetRegistrationForReadyCallb ack(m_ready.get()));
379 } 381 }
380 382
381 return m_ready->promise(callerState->world()); 383 return m_ready->promise(callerState->world());
382 } 384 }
383 385
384 void ServiceWorkerContainer::setController(std::unique_ptr<WebServiceWorker::Han dle> handle, bool shouldNotifyControllerChange) 386 void ServiceWorkerContainer::setController(std::unique_ptr<WebServiceWorker::Han dle> handle, bool shouldNotifyControllerChange)
385 { 387 {
386 if (!getExecutionContext()) 388 if (!getExecutionContext())
387 return; 389 return;
388 m_controller = ServiceWorker::from(getExecutionContext(), adoptPtr(handle.re lease())); 390 m_controller = ServiceWorker::from(getExecutionContext(), wrapUnique(handle. release()));
389 if (m_controller) 391 if (m_controller)
390 UseCounter::count(getExecutionContext(), UseCounter::ServiceWorkerContro lledPage); 392 UseCounter::count(getExecutionContext(), UseCounter::ServiceWorkerContro lledPage);
391 if (shouldNotifyControllerChange) 393 if (shouldNotifyControllerChange)
392 dispatchEvent(Event::create(EventTypeNames::controllerchange)); 394 dispatchEvent(Event::create(EventTypeNames::controllerchange));
393 } 395 }
394 396
395 void ServiceWorkerContainer::dispatchMessageEvent(std::unique_ptr<WebServiceWork er::Handle> handle, const WebString& message, const WebMessagePortChannelArray& webChannels) 397 void ServiceWorkerContainer::dispatchMessageEvent(std::unique_ptr<WebServiceWork er::Handle> handle, const WebString& message, const WebMessagePortChannelArray& webChannels)
396 { 398 {
397 if (!getExecutionContext() || !getExecutionContext()->executingWindow()) 399 if (!getExecutionContext() || !getExecutionContext()->executingWindow())
398 return; 400 return;
399 401
400 MessagePortArray* ports = MessagePort::toMessagePortArray(getExecutionContex t(), webChannels); 402 MessagePortArray* ports = MessagePort::toMessagePortArray(getExecutionContex t(), webChannels);
401 RefPtr<SerializedScriptValue> value = SerializedScriptValue::create(message) ; 403 RefPtr<SerializedScriptValue> value = SerializedScriptValue::create(message) ;
402 ServiceWorker* source = ServiceWorker::from(getExecutionContext(), adoptPtr( handle.release())); 404 ServiceWorker* source = ServiceWorker::from(getExecutionContext(), wrapUniqu e(handle.release()));
403 dispatchEvent(ServiceWorkerMessageEvent::create(ports, value, source, getExe cutionContext()->getSecurityOrigin()->toString())); 405 dispatchEvent(ServiceWorkerMessageEvent::create(ports, value, source, getExe cutionContext()->getSecurityOrigin()->toString()));
404 } 406 }
405 407
406 const AtomicString& ServiceWorkerContainer::interfaceName() const 408 const AtomicString& ServiceWorkerContainer::interfaceName() const
407 { 409 {
408 return EventTargetNames::ServiceWorkerContainer; 410 return EventTargetNames::ServiceWorkerContainer;
409 } 411 }
410 412
411 ServiceWorkerContainer::ServiceWorkerContainer(ExecutionContext* executionContex t) 413 ServiceWorkerContainer::ServiceWorkerContainer(ExecutionContext* executionContex t)
412 : ContextLifecycleObserver(executionContext) 414 : ContextLifecycleObserver(executionContext)
413 , m_provider(0) 415 , m_provider(0)
414 { 416 {
415 417
416 if (!executionContext) 418 if (!executionContext)
417 return; 419 return;
418 420
419 if (ServiceWorkerContainerClient* client = ServiceWorkerContainerClient::fro m(executionContext)) { 421 if (ServiceWorkerContainerClient* client = ServiceWorkerContainerClient::fro m(executionContext)) {
420 m_provider = client->provider(); 422 m_provider = client->provider();
421 if (m_provider) 423 if (m_provider)
422 m_provider->setClient(this); 424 m_provider->setClient(this);
423 } 425 }
424 } 426 }
425 427
426 } // namespace blink 428 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698