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
156
157
158
159
160
161
|
// Copyright 2015 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.
#ifndef CONTENT_BROWSER_NOTIFICATIONS_PLATFORM_NOTIFICATION_CONTEXT_IMPL_H_
#define CONTENT_BROWSER_NOTIFICATIONS_PLATFORM_NOTIFICATION_CONTEXT_IMPL_H_
#include <stdint.h>
#include <set>
#include <string>
#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/files/file_path.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "content/browser/service_worker/service_worker_context_observer.h"
#include "content/common/content_export.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/platform_notification_context.h"
class GURL;
namespace base {
class SequencedTaskRunner;
}
namespace content {
class BrowserContext;
class NotificationDatabase;
struct NotificationDatabaseData;
class ServiceWorkerContextWrapper;
// Implementation of the Web Notification storage context. The public methods
// defined in this interface must only be called on the IO thread unless
// otherwise specified.
class CONTENT_EXPORT PlatformNotificationContextImpl
: NON_EXPORTED_BASE(public PlatformNotificationContext),
NON_EXPORTED_BASE(public ServiceWorkerContextObserver) {
public:
// Constructs a new platform notification context. If |path| is non-empty, the
// database will be initialized in the "Platform Notifications" subdirectory
// of |path|. Otherwise, the database will be initialized in memory. The
// constructor must only be called on the IO thread.
PlatformNotificationContextImpl(
const base::FilePath& path,
BrowserContext* browser_context,
const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context);
// To be called on the UI thread to initialize the instance.
void Initialize();
// To be called on the UI thread when the context is being shut down.
void Shutdown();
// PlatformNotificationContext implementation.
void ReadNotificationData(int64_t notification_id,
const GURL& origin,
const ReadResultCallback& callback) override;
void WriteNotificationData(const GURL& origin,
const NotificationDatabaseData& database_data,
const WriteResultCallback& callback) override;
void DeleteNotificationData(int64_t notification_id,
const GURL& origin,
const DeleteResultCallback& callback) override;
void ReadAllNotificationDataForServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
const ReadAllResultCallback& callback) override;
// ServiceWorkerContextObserver implementation.
void OnRegistrationDeleted(int64_t registration_id,
const GURL& pattern) override;
void OnStorageWiped() override;
private:
friend class PlatformNotificationContextTest;
~PlatformNotificationContextImpl() override;
void InitializeOnIO();
void ShutdownOnIO();
// Initializes the database if neccesary. Must be called on the IO thread.
// |success_closure| will be invoked on a the |task_runner_| thread when
// everything is available, or |failure_closure_| will be invoked on the
// IO thread when initialization fails.
void LazyInitialize(const base::Closure& success_closure,
const base::Closure& failure_closure);
// Opens the database. Must be called on the |task_runner_| thread. When the
// database has been opened, |success_closure| will be invoked on the task
// thread, otherwise |failure_closure_| will be invoked on the IO thread.
void OpenDatabase(const base::Closure& success_closure,
const base::Closure& failure_closure);
// Actually reads the notification data from the database. Must only be
// called on the |task_runner_| thread. |callback| will be invoked on the
// IO thread when the operation has completed.
void DoReadNotificationData(int64_t notification_id,
const GURL& origin,
const ReadResultCallback& callback);
// Actually reads all notification data from the database. Must only be
// called on the |task_runner_| thread. |callback| will be invoked on the
// IO thread when the operation has completed.
void DoReadAllNotificationDataForServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
const ReadAllResultCallback& callback);
// Actually writes the notification database to the database. Must only be
// called on the |task_runner_| thread. |callback| will be invoked on the
// IO thread when the operation has completed.
void DoWriteNotificationData(const GURL& origin,
const NotificationDatabaseData& database_data,
const WriteResultCallback& callback);
// Actually deletes the notification information from the database. Must only
// be called on the |task_runner_| thread. |callback| will be invoked on the
// IO thread when the operation has completed.
void DoDeleteNotificationData(int64_t notification_id,
const GURL& origin,
const DeleteResultCallback& callback);
// Deletes all notifications associated with |service_worker_registration_id|
// belonging to |origin|. Must be called on the |task_runner_| thread.
void DoDeleteNotificationsForServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id);
// Destroys the database regardless of its initialization status. This method
// must only be called on the |task_runner_| thread. Returns if the directory
// the database was stored in could be emptied.
bool DestroyDatabase();
// Returns the path in which the database should be initialized. May be empty.
base::FilePath GetDatabasePath() const;
// Sets the task runner to use for testing purposes.
void SetTaskRunnerForTesting(
const scoped_refptr<base::SequencedTaskRunner>& task_runner);
base::FilePath path_;
BrowserContext* browser_context_;
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
scoped_ptr<NotificationDatabase> database_;
// Indicates whether the database should be pruned when it's opened.
bool prune_database_on_open_ = false;
DISALLOW_COPY_AND_ASSIGN(PlatformNotificationContextImpl);
};
} // namespace content
#endif // CONTENT_BROWSER_NOTIFICATIONS_PLATFORM_NOTIFICATION_CONTEXT_IMPL_H_
|