• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 // Chromium settings and storage represent user-selected preferences and
6 // information and MUST not be extracted, overwritten or modified except
7 // through Chromium defined APIs.
8 
9 #ifndef COMPONENTS_WEBDATA_COMMON_WEB_DATABASE_SERVICE_H_
10 #define COMPONENTS_WEBDATA_COMMON_WEB_DATABASE_SERVICE_H_
11 
12 #include "base/basictypes.h"
13 #include "base/callback_forward.h"
14 #include "base/compiler_specific.h"
15 #include "base/files/file_path.h"
16 #include "base/memory/ref_counted.h"
17 #include "base/memory/ref_counted_delete_on_message_loop.h"
18 #include "base/memory/scoped_ptr.h"
19 #include "base/memory/weak_ptr.h"
20 #include "base/message_loop/message_loop_proxy.h"
21 #include "base/observer_list.h"
22 #include "components/webdata/common/web_data_service_base.h"
23 #include "components/webdata/common/web_database.h"
24 #include "components/webdata/common/webdata_export.h"
25 
26 class WebDataServiceBackend;
27 class WebDataRequestManager;
28 
29 namespace content {
30 class BrowserContext;
31 }
32 
33 namespace tracked_objects {
34 class Location;
35 }
36 
37 class WDTypedResult;
38 class WebDataServiceConsumer;
39 
40 
41 ////////////////////////////////////////////////////////////////////////////////
42 //
43 // WebDatabaseService defines the interface to a generic data repository
44 // responsible for controlling access to the web database (metadata associated
45 // with web pages).
46 //
47 ////////////////////////////////////////////////////////////////////////////////
48 
49 class WEBDATA_EXPORT WebDatabaseService
50     : public base::RefCountedDeleteOnMessageLoop<WebDatabaseService> {
51  public:
52   typedef base::Callback<scoped_ptr<WDTypedResult>(WebDatabase*)> ReadTask;
53   typedef base::Callback<WebDatabase::State(WebDatabase*)> WriteTask;
54 
55   // Types for managing DB loading callbacks.
56   typedef base::Closure DBLoadedCallback;
57   typedef base::Callback<void(sql::InitStatus)> DBLoadErrorCallback;
58 
59   // Takes the path to the WebDatabase file.
60   // WebDatabaseService lives on |ui_thread| and posts tasks to |db_thread|.
61   WebDatabaseService(const base::FilePath& path,
62                      const scoped_refptr<base::MessageLoopProxy>& ui_thread,
63                      const scoped_refptr<base::MessageLoopProxy>& db_thread);
64 
65   // Adds |table| as a WebDatabaseTable that will participate in
66   // managing the database, transferring ownership. All calls to this
67   // method must be made before |LoadDatabase| is called.
68   virtual void AddTable(scoped_ptr<WebDatabaseTable> table);
69 
70   // Initializes the web database service.
71   virtual void LoadDatabase();
72 
73   // Unloads the database and shuts down the service.
74   virtual void ShutdownDatabase();
75 
76   // Gets a pointer to the WebDatabase (owned by WebDatabaseService).
77   // TODO(caitkp): remove this method once SyncServices no longer depend on it.
78   virtual WebDatabase* GetDatabaseOnDB() const;
79 
80   // Returns a pointer to the WebDataServiceBackend.
81   scoped_refptr<WebDataServiceBackend> GetBackend() const;
82 
83   // Schedule an update/write task on the DB thread.
84   virtual void ScheduleDBTask(
85       const tracked_objects::Location& from_here,
86       const WriteTask& task);
87 
88   // Schedule a read task on the DB thread.
89   virtual WebDataServiceBase::Handle ScheduleDBTaskWithResult(
90       const tracked_objects::Location& from_here,
91       const ReadTask& task,
92       WebDataServiceConsumer* consumer);
93 
94   // Cancel an existing request for a task on the DB thread.
95   // TODO(caitkp): Think about moving the definition of the Handle type to
96   // somewhere else.
97   virtual void CancelRequest(WebDataServiceBase::Handle h);
98 
99   // Register a callback to be notified that the database has loaded. Multiple
100   // callbacks may be registered, and each will be called at most once
101   // (following a successful database load), then cleared.
102   // Note: if the database load is already complete, then the callback will NOT
103   // be stored or called.
104   void RegisterDBLoadedCallback(const DBLoadedCallback& callback);
105 
106   // Register a callback to be notified that the database has failed to load.
107   // Multiple callbacks may be registered, and each will be called at most once
108   // (following a database load failure), then cleared.
109   // Note: if the database load is already complete, then the callback will NOT
110   // be stored or called.
111   void RegisterDBErrorCallback(const DBLoadErrorCallback& callback);
112 
db_loaded()113   bool db_loaded() const { return db_loaded_; };
114 
115  private:
116   class BackendDelegate;
117   friend class BackendDelegate;
118   friend class base::RefCountedDeleteOnMessageLoop<WebDatabaseService>;
119   friend class base::DeleteHelper<WebDatabaseService>;
120 
121   typedef std::vector<DBLoadedCallback> LoadedCallbacks;
122   typedef std::vector<DBLoadErrorCallback> ErrorCallbacks;
123 
124   virtual ~WebDatabaseService();
125 
126   void OnDatabaseLoadDone(sql::InitStatus status);
127 
128   base::FilePath path_;
129 
130   // The primary owner is |WebDatabaseService| but is refcounted because
131   // PostTask on DB thread may outlive us.
132   scoped_refptr<WebDataServiceBackend> wds_backend_;
133 
134   // Callbacks to be called once the DB has loaded.
135   LoadedCallbacks loaded_callbacks_;
136 
137   // Callbacks to be called if the DB has failed to load.
138   ErrorCallbacks error_callbacks_;
139 
140   // True if the WebDatabase has loaded.
141   bool db_loaded_;
142 
143   scoped_refptr<base::MessageLoopProxy> db_thread_;
144 
145   // All vended weak pointers are invalidated in ShutdownDatabase().
146   base::WeakPtrFactory<WebDatabaseService> weak_ptr_factory_;
147 
148   DISALLOW_COPY_AND_ASSIGN(WebDatabaseService);
149 };
150 
151 #endif  // COMPONENTS_WEBDATA_COMMON_WEB_DATABASE_SERVICE_H_
152