1// Copyright (c) 2012 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 WEBKIT_BROWSER_APPCACHE_APPCACHE_QUOTA_CLIENT_H_
6#define WEBKIT_BROWSER_APPCACHE_APPCACHE_QUOTA_CLIENT_H_
7
8#include <deque>
9#include <map>
10#include <string>
11
12#include "base/gtest_prod_util.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "net/base/completion_callback.h"
16#include "webkit/browser/appcache/appcache_storage.h"
17#include "webkit/browser/quota/quota_client.h"
18#include "webkit/browser/quota/quota_task.h"
19#include "webkit/browser/webkit_storage_browser_export.h"
20#include "webkit/common/quota/quota_types.h"
21
22namespace appcache {
23
24class AppCacheService;
25class AppCacheStorageImpl;
26class AppCacheQuotaClientTest;
27
28// A QuotaClient implementation to integrate the appcache service
29// with the quota management system. The QuotaClient interface is
30// used on the IO thread by the quota manager. This class deletes
31// itself when both the quota manager and the appcache service have
32// been destroyed.
33class AppCacheQuotaClient : public quota::QuotaClient {
34 public:
35  typedef std::deque<base::Closure> RequestQueue;
36
37  virtual ~AppCacheQuotaClient();
38
39  // QuotaClient method overrides
40  virtual ID id() const OVERRIDE;
41  virtual void OnQuotaManagerDestroyed() OVERRIDE;
42  virtual void GetOriginUsage(const GURL& origin,
43                              quota::StorageType type,
44                              const GetUsageCallback& callback) OVERRIDE;
45  virtual void GetOriginsForType(quota::StorageType type,
46                                 const GetOriginsCallback& callback) OVERRIDE;
47  virtual void GetOriginsForHost(quota::StorageType type,
48                                 const std::string& host,
49                                 const GetOriginsCallback& callback) OVERRIDE;
50  virtual void DeleteOriginData(const GURL& origin,
51                                quota::StorageType type,
52                                const DeletionCallback& callback) OVERRIDE;
53
54 private:
55  friend class AppCacheService;  // for NotifyAppCacheIsDestroyed
56  friend class AppCacheStorageImpl;  // for NotifyAppCacheIsReady
57  friend class AppCacheQuotaClientTest;
58
59  WEBKIT_STORAGE_BROWSER_EXPORT
60      explicit AppCacheQuotaClient(AppCacheService* service);
61
62  void DidDeleteAppCachesForOrigin(int rv);
63  void GetOriginsHelper(quota::StorageType type,
64                        const std::string& opt_host,
65                        const GetOriginsCallback& callback);
66  void ProcessPendingRequests();
67  void DeletePendingRequests();
68  const AppCacheStorage::UsageMap* GetUsageMap();
69  net::CancelableCompletionCallback* GetServiceDeleteCallback();
70
71  // For use by appcache internals during initialization and shutdown.
72  WEBKIT_STORAGE_BROWSER_EXPORT void NotifyAppCacheReady();
73  WEBKIT_STORAGE_BROWSER_EXPORT void NotifyAppCacheDestroyed();
74
75  // Prior to appcache service being ready, we have to queue
76  // up reqeusts and defer acting on them until we're ready.
77  RequestQueue pending_batch_requests_;
78  RequestQueue pending_serial_requests_;
79
80  // And once it's ready, we can only handle one delete request at a time,
81  // so we queue up additional requests while one is in already in progress.
82  DeletionCallback current_delete_request_callback_;
83  scoped_ptr<net::CancelableCompletionCallback> service_delete_callback_;
84
85  AppCacheService* service_;
86  bool appcache_is_ready_;
87  bool quota_manager_is_destroyed_;
88
89  DISALLOW_COPY_AND_ASSIGN(AppCacheQuotaClient);
90};
91
92}  // namespace appcache
93
94#endif  // WEBKIT_BROWSER_APPCACHE_APPCACHE_QUOTA_CLIENT_H_
95