Commit f5f75db1 authored by nhiroki@chromium.org's avatar nhiroki@chromium.org

ServiceWorker: register() should return the existing registration object if available

Before this patch, register() always returns new registration object
even if the same registration already exists. This patch makes
register() return the existing object if it's available.

Chromium-side change: https://codereview.chromium.org/470843002/

NOTE: ServiceWorkerRegistration is still disabled and this change does
not affect the existing code/behavior.


BUG=396400
TEST=https://codereview.chromium.org/466723002/
NOTRY=true

Review URL: https://codereview.chromium.org/473743002

git-svn-id: svn://svn.chromium.org/blink/trunk@180251 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 72e96ab6
...@@ -88,7 +88,7 @@ PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::tak ...@@ -88,7 +88,7 @@ PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::tak
{ {
if (!registration) if (!registration)
return nullptr; return nullptr;
return create(resolver->scriptState()->executionContext(), adoptPtr(registration)); return getOrCreate(resolver->scriptState()->executionContext(), adoptPtr(registration));
} }
void ServiceWorkerRegistration::dispose(WebType* registration) void ServiceWorkerRegistration::dispose(WebType* registration)
...@@ -123,8 +123,20 @@ ScriptPromise ServiceWorkerRegistration::unregister(ScriptState* scriptState) ...@@ -123,8 +123,20 @@ ScriptPromise ServiceWorkerRegistration::unregister(ScriptState* scriptState)
return promise; return promise;
} }
PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::create(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> outerRegistration) PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::getOrCreate(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> outerRegistration)
{ {
if (!outerRegistration)
return nullptr;
WebServiceWorkerRegistrationProxy* proxy = outerRegistration->proxy();
if (proxy) {
ServiceWorkerRegistration* existingRegistration = *proxy;
if (existingRegistration) {
ASSERT(existingRegistration->executionContext() == executionContext);
return existingRegistration;
}
}
RefPtrWillBeRawPtr<ServiceWorkerRegistration> registration = adoptRefWillBeRefCountedGarbageCollected(new ServiceWorkerRegistration(executionContext, outerRegistration)); RefPtrWillBeRawPtr<ServiceWorkerRegistration> registration = adoptRefWillBeRefCountedGarbageCollected(new ServiceWorkerRegistration(executionContext, outerRegistration));
registration->suspendIfNeeded(); registration->suspendIfNeeded();
return registration.release(); return registration.release();
...@@ -132,6 +144,7 @@ PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::cre ...@@ -132,6 +144,7 @@ PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::cre
ServiceWorkerRegistration::ServiceWorkerRegistration(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> outerRegistration) ServiceWorkerRegistration::ServiceWorkerRegistration(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> outerRegistration)
: ActiveDOMObject(executionContext) : ActiveDOMObject(executionContext)
, WebServiceWorkerRegistrationProxy(this)
, m_outerRegistration(outerRegistration) , m_outerRegistration(outerRegistration)
, m_provider(0) , m_provider(0)
{ {
......
...@@ -60,7 +60,7 @@ public: ...@@ -60,7 +60,7 @@ public:
virtual void trace(Visitor*) OVERRIDE; virtual void trace(Visitor*) OVERRIDE;
private: private:
static PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> create(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>); static PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> getOrCreate(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>);
ServiceWorkerRegistration(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>); ServiceWorkerRegistration(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>);
OwnPtr<WebServiceWorkerRegistration> m_outerRegistration; OwnPtr<WebServiceWorkerRegistration> m_outerRegistration;
......
...@@ -318,6 +318,7 @@ ...@@ -318,6 +318,7 @@
'exported/WebScrollbarThemeGeometryNative.h', 'exported/WebScrollbarThemeGeometryNative.h',
'exported/WebSerializedOrigin.cpp', 'exported/WebSerializedOrigin.cpp',
'exported/WebServiceWorkerProxy.cpp', 'exported/WebServiceWorkerProxy.cpp',
'exported/WebServiceWorkerRegistrationProxy.cpp',
'exported/WebServiceWorkerRequest.cpp', 'exported/WebServiceWorkerRequest.cpp',
'exported/WebServiceWorkerResponse.cpp', 'exported/WebServiceWorkerResponse.cpp',
'exported/WebSocketHandshakeRequestInfo.cpp', 'exported/WebSocketHandshakeRequestInfo.cpp',
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "public/platform/WebServiceWorkerRegistrationProxy.h"
namespace blink {
WebServiceWorkerRegistrationProxy::WebServiceWorkerRegistrationProxy(ServiceWorkerRegistration* registration)
: m_private(registration)
{
}
WebServiceWorkerRegistrationProxy::operator ServiceWorkerRegistration*() const
{
return m_private;
}
} // namespace blink
...@@ -16,6 +16,8 @@ public: ...@@ -16,6 +16,8 @@ public:
virtual ~WebServiceWorkerRegistration() { } virtual ~WebServiceWorkerRegistration() { }
virtual void setProxy(WebServiceWorkerRegistrationProxy*) { } virtual void setProxy(WebServiceWorkerRegistrationProxy*) { }
virtual WebServiceWorkerRegistrationProxy* proxy() { return 0; }
virtual WebURL scope() const { return WebURL(); } virtual WebURL scope() const { return WebURL(); }
}; };
......
...@@ -5,8 +5,11 @@ ...@@ -5,8 +5,11 @@
#ifndef WebServiceWorkerRegistrationProxy_h #ifndef WebServiceWorkerRegistrationProxy_h
#define WebServiceWorkerRegistrationProxy_h #define WebServiceWorkerRegistrationProxy_h
#include "public/platform/WebCommon.h"
namespace blink { namespace blink {
class ServiceWorkerRegistration;
class WebServiceWorker; class WebServiceWorker;
// A proxy interface, passed via WebServiceWorkerRegistration.setProxy() from // A proxy interface, passed via WebServiceWorkerRegistration.setProxy() from
...@@ -14,7 +17,7 @@ class WebServiceWorker; ...@@ -14,7 +17,7 @@ class WebServiceWorker;
// embedder. // embedder.
class WebServiceWorkerRegistrationProxy { class WebServiceWorkerRegistrationProxy {
public: public:
WebServiceWorkerRegistrationProxy() { } WebServiceWorkerRegistrationProxy() : m_private(0) { }
virtual ~WebServiceWorkerRegistrationProxy() { } virtual ~WebServiceWorkerRegistrationProxy() { }
// Notifies that the registration entered the installation process. // Notifies that the registration entered the installation process.
...@@ -25,6 +28,14 @@ public: ...@@ -25,6 +28,14 @@ public:
virtual void setInstalling(WebServiceWorker*) = 0; virtual void setInstalling(WebServiceWorker*) = 0;
virtual void setWaiting(WebServiceWorker*) = 0; virtual void setWaiting(WebServiceWorker*) = 0;
virtual void setActive(WebServiceWorker*) = 0; virtual void setActive(WebServiceWorker*) = 0;
#if INSIDE_BLINK
BLINK_PLATFORM_EXPORT WebServiceWorkerRegistrationProxy(ServiceWorkerRegistration*);
BLINK_PLATFORM_EXPORT operator ServiceWorkerRegistration*() const;
#endif
protected:
ServiceWorkerRegistration* m_private;
}; };
} // namespace blink } // namespace blink
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment