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

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

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

Powered by Google App Engine
This is Rietveld 408576698