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
3// found in the LICENSE file.
4
5#ifndef ServiceWorkerRegistration_h
6#define ServiceWorkerRegistration_h
7
8#include "core/dom/ActiveDOMObject.h"
9#include "core/events/EventTarget.h"
10#include "modules/serviceworkers/ServiceWorker.h"
11#include "public/platform/WebServiceWorkerRegistration.h"
12#include "public/platform/WebServiceWorkerRegistrationProxy.h"
13#include "wtf/OwnPtr.h"
14#include "wtf/PassOwnPtr.h"
15#include "wtf/PassRefPtr.h"
16#include "wtf/RefCounted.h"
17
18namespace blink {
19
20class ScriptPromise;
21class ScriptPromiseResolver;
22class ScriptState;
23class WebServiceWorkerProvider;
24
25class ServiceWorkerRegistration FINAL
26    : public RefCountedGarbageCollectedWillBeGarbageCollectedFinalized<ServiceWorkerRegistration>
27    , public ActiveDOMObject
28    , public EventTargetWithInlineData
29    , public WebServiceWorkerRegistrationProxy {
30    DEFINE_WRAPPERTYPEINFO();
31    DEFINE_EVENT_TARGET_REFCOUNTING_WILL_BE_REMOVED(RefCountedGarbageCollected<ServiceWorkerRegistration>);
32    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(ServiceWorkerRegistration);
33public:
34    // EventTarget overrides.
35    virtual const AtomicString& interfaceName() const OVERRIDE;
36    virtual ExecutionContext* executionContext() const OVERRIDE { return ActiveDOMObject::executionContext(); }
37
38    // WebServiceWorkerRegistrationProxy overrides.
39    virtual void dispatchUpdateFoundEvent() OVERRIDE;
40    virtual void setInstalling(WebServiceWorker*) OVERRIDE;
41    virtual void setWaiting(WebServiceWorker*) OVERRIDE;
42    virtual void setActive(WebServiceWorker*) OVERRIDE;
43
44    // For CallbackPromiseAdapter.
45    typedef WebServiceWorkerRegistration WebType;
46    static ServiceWorkerRegistration* from(ExecutionContext*, WebType* registration);
47    static ServiceWorkerRegistration* take(ScriptPromiseResolver*, WebType* registration);
48    static void dispose(WebType* registration);
49
50    PassRefPtrWillBeRawPtr<ServiceWorker> installing() { return m_installing.get(); }
51    PassRefPtrWillBeRawPtr<ServiceWorker> waiting() { return m_waiting.get(); }
52    PassRefPtrWillBeRawPtr<ServiceWorker> active() { return m_active.get(); }
53
54    String scope() const;
55
56    ScriptPromise unregister(ScriptState*);
57
58    DEFINE_ATTRIBUTE_EVENT_LISTENER(updatefound);
59
60    virtual void trace(Visitor*) OVERRIDE;
61
62private:
63    static ServiceWorkerRegistration* getOrCreate(ExecutionContext*, WebServiceWorkerRegistration*);
64    ServiceWorkerRegistration(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>);
65
66    // ActiveDOMObject overrides.
67    virtual bool hasPendingActivity() const OVERRIDE;
68    virtual void stop() OVERRIDE;
69
70    OwnPtr<WebServiceWorkerRegistration> m_outerRegistration;
71    WebServiceWorkerProvider* m_provider;
72    RefPtrWillBeMember<ServiceWorker> m_installing;
73    RefPtrWillBeMember<ServiceWorker> m_waiting;
74    RefPtrWillBeMember<ServiceWorker> m_active;
75
76    bool m_stopped;
77};
78
79} // namespace blink
80
81#endif // ServiceWorkerRegistration_h
82