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