X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fcontent%2Fbrowser%2Fservice_worker%2Fservice_worker_registration.h;h=51872d21447396ddf03a71fa57ff9c3882ff4ecc;hb=4a1a0bdd01eef90b0826a0e761d3379d3715c10f;hp=df23dc3d61a55b913fa5ccd18ebc31219fe6581d;hpb=b1be5ca53587d23e7aeb77b26861fdc0a181ffd8;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/content/browser/service_worker/service_worker_registration.h b/src/content/browser/service_worker/service_worker_registration.h index df23dc3..51872d2 100644 --- a/src/content/browser/service_worker/service_worker_registration.h +++ b/src/content/browser/service_worker/service_worker_registration.h @@ -12,6 +12,7 @@ #include "base/memory/scoped_ptr.h" #include "content/browser/service_worker/service_worker_version.h" #include "content/common/content_export.h" +#include "content/common/service_worker/service_worker_types.h" #include "url/gurl.h" namespace content { @@ -19,22 +20,27 @@ namespace content { class ServiceWorkerRegistrationInfo; class ServiceWorkerVersion; -// This class manages all persistence of service workers: -// - Registrations -// - Mapping of caches to registrations / versions -// -// This is the place where we manage simultaneous -// requests for the same registrations and caches, making sure that -// two pages that are registering the same pattern at the same time -// have their registrations coalesced rather than overwriting each -// other. -// -// This class also manages the state of the upgrade process, which -// includes managing which ServiceWorkerVersion is "active" vs "in -// waiting". +// This class represents a service worker registration. The +// scope and script url are constant for the life of the persistent +// registration. It's refcounted to facillitate multiple controllees +// being associated with the same registration. The class roughly +// corresponds to navigator.serviceWorker.registgration. class CONTENT_EXPORT ServiceWorkerRegistration - : NON_EXPORTED_BASE(public base::RefCounted) { + : NON_EXPORTED_BASE(public base::RefCounted), + public ServiceWorkerVersion::Listener { public: + typedef base::Callback StatusCallback; + + class Listener { + public: + virtual void OnVersionAttributesChanged( + ServiceWorkerRegistration* registration, + ChangedVersionAttributesMask changed_mask, + const ServiceWorkerRegistrationInfo& info) = 0; + virtual void OnRegistrationFailed( + ServiceWorkerRegistration* registration) = 0; + }; + ServiceWorkerRegistration(const GURL& pattern, const GURL& script_url, int64 registration_id, @@ -44,51 +50,104 @@ class CONTENT_EXPORT ServiceWorkerRegistration const GURL& script_url() const { return script_url_; } const GURL& pattern() const { return pattern_; } + bool is_deleted() const { return is_deleted_; } + void set_is_deleted(bool deleted) { is_deleted_ = deleted; } + + bool is_uninstalling() const { return is_uninstalling_; } + ServiceWorkerVersion* active_version() const { - DCHECK(!is_shutdown_); return active_version_.get(); } ServiceWorkerVersion* waiting_version() const { - DCHECK(!is_shutdown_); return waiting_version_.get(); } - void set_active_version(ServiceWorkerVersion* version) { - DCHECK(!is_shutdown_); - active_version_ = version; + ServiceWorkerVersion* installing_version() const { + return installing_version_.get(); } - void set_waiting_version(ServiceWorkerVersion* version) { - DCHECK(!is_shutdown_); - waiting_version_ = version; - } + void AddListener(Listener* listener); + void RemoveListener(Listener* listener); + void NotifyRegistrationFailed(); ServiceWorkerRegistrationInfo GetInfo(); - // Returns the active version, if it is not null; otherwise, returns the - // waiting version. - ServiceWorkerVersion* GetNewestVersion(); - - // The final synchronous switchover after all events have been - // fired, and the old "active version" is being shut down. - void ActivateWaitingVersion(); + // Sets the corresposding version attribute and resets the position + // (if any) left vacant (ie. by a waiting version being promoted). + // Also notifies listeners via OnVersionAttributesChanged. + void SetActiveVersion(ServiceWorkerVersion* version); + void SetWaitingVersion(ServiceWorkerVersion* version); + void SetInstallingVersion(ServiceWorkerVersion* version); + + // If version is the installing, waiting, active version of this + // registation, the method will reset that field to NULL, and notify + // listeners via OnVersionAttributesChanged. + void UnsetVersion(ServiceWorkerVersion* version); + + // Triggers the [[Activate]] algorithm when the currently active version + // has no controllees. If there are no controllees at the time the method + // is called, activation is initiated immediately. + void ActivateWaitingVersionWhenReady(); + + // Triggers the [[ClearRegistration]] algorithm when the currently + // active version has no controllees. Deletes this registration + // from storage immediately. + void ClearWhenReady(); + + // Restores this registration in storage and cancels the pending + // [[ClearRegistration]] algorithm. If the algorithm was already triggered, + // does nothing. + void AbortPendingClear(); + + // The time of the most recent update check. + base::Time last_update_check() const { return last_update_check_; } + void set_last_update_check(base::Time last) { last_update_check_ = last; } private: - ~ServiceWorkerRegistration(); friend class base::RefCounted; + virtual ~ServiceWorkerRegistration(); + + void SetVersionInternal( + ServiceWorkerVersion* version, + scoped_refptr* data_member, + int change_flag); + void UnsetVersionInternal( + ServiceWorkerVersion* version, + ChangedVersionAttributesMask* mask); + + // ServiceWorkerVersion::Listener override. + virtual void OnNoControllees(ServiceWorkerVersion* version) OVERRIDE; + + // This method corresponds to the [[Activate]] algorithm. + void ActivateWaitingVersion(); + void OnActivateEventFinished( + ServiceWorkerVersion* activating_version, + ServiceWorkerStatusCode status); + void OnDeleteFinished(ServiceWorkerStatusCode status); + + // This method corresponds to the [[ClearRegistration]] algorithm. + void Clear(); + void OnStoreFinished(scoped_refptr version, + ServiceWorkerStatusCode status); + const GURL pattern_; const GURL script_url_; const int64 registration_id_; - + bool is_deleted_; + bool is_uninstalling_; + bool should_activate_when_ready_; + base::Time last_update_check_; scoped_refptr active_version_; scoped_refptr waiting_version_; - - bool is_shutdown_; + scoped_refptr installing_version_; + ObserverList listeners_; base::WeakPtr context_; DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRegistration); }; + } // namespace content + #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REGISTRATION_H_