OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_SERVICE_IMPL_H_ | 5 #ifndef CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_SERVICE_IMPL_H_ |
6 #define CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_SERVICE_IMPL_H_ | 6 #define CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_SERVICE_IMPL_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 #include <memory> | 9 #include <memory> |
10 #include <set> | 10 #include <set> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/callback.h" | 13 #include "base/callback.h" |
14 #include "base/compiler_specific.h" | 14 #include "base/compiler_specific.h" |
15 #include "base/gtest_prod_util.h" | 15 #include "base/gtest_prod_util.h" |
16 #include "base/macros.h" | 16 #include "base/macros.h" |
17 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
18 #include "chrome/browser/background/background_trigger.h" | 18 #include "chrome/browser/background/background_trigger.h" |
19 #include "chrome/common/features.h" | 19 #include "chrome/common/features.h" |
20 #include "components/content_settings/core/browser/content_settings_observer.h" | 20 #include "components/content_settings/core/browser/content_settings_observer.h" |
21 #include "components/content_settings/core/common/content_settings.h" | 21 #include "components/content_settings/core/common/content_settings.h" |
22 #include "components/gcm_driver/common/gcm_messages.h" | 22 #include "components/gcm_driver/common/gcm_messages.h" |
23 #include "components/gcm_driver/gcm_app_handler.h" | 23 #include "components/gcm_driver/gcm_app_handler.h" |
24 #include "components/gcm_driver/gcm_client.h" | 24 #include "components/gcm_driver/gcm_client.h" |
| 25 #include "components/gcm_driver/instance_id/instance_id.h" |
25 #include "components/keyed_service/core/keyed_service.h" | 26 #include "components/keyed_service/core/keyed_service.h" |
26 #include "content/public/browser/push_messaging_service.h" | 27 #include "content/public/browser/push_messaging_service.h" |
27 #include "content/public/common/push_event_payload.h" | 28 #include "content/public/common/push_event_payload.h" |
28 #include "content/public/common/push_messaging_status.h" | 29 #include "content/public/common/push_messaging_status.h" |
29 #include "third_party/WebKit/public/platform/modules/permissions/permission_stat
us.mojom.h" | 30 #include "third_party/WebKit/public/platform/modules/permissions/permission_stat
us.mojom.h" |
30 #include "third_party/WebKit/public/platform/modules/push_messaging/WebPushPermi
ssionStatus.h" | 31 #include "third_party/WebKit/public/platform/modules/push_messaging/WebPushPermi
ssionStatus.h" |
31 | 32 |
32 #if defined(ENABLE_NOTIFICATIONS) | 33 #if defined(ENABLE_NOTIFICATIONS) |
33 #include "chrome/browser/push_messaging/push_messaging_notification_manager.h" | 34 #include "chrome/browser/push_messaging/push_messaging_notification_manager.h" |
34 #endif | 35 #endif |
35 | 36 |
36 class Profile; | 37 class Profile; |
37 class PushMessagingAppIdentifier; | 38 class PushMessagingAppIdentifier; |
38 class PushMessagingServiceObserver; | 39 class PushMessagingServiceObserver; |
| 40 class PushMessagingServiceTest; |
39 class ScopedKeepAlive; | 41 class ScopedKeepAlive; |
40 struct PushSubscriptionOptions; | 42 struct PushSubscriptionOptions; |
41 | 43 |
42 namespace gcm { | 44 namespace gcm { |
43 class GCMDriver; | 45 class GCMDriver; |
44 class GCMProfileService; | 46 } |
| 47 namespace instance_id { |
| 48 class InstanceIDDriver; |
45 } | 49 } |
46 | 50 |
47 namespace user_prefs { | 51 namespace user_prefs { |
48 class PrefRegistrySyncable; | 52 class PrefRegistrySyncable; |
49 } | 53 } |
50 | 54 |
51 class PushMessagingServiceImpl : public content::PushMessagingService, | 55 class PushMessagingServiceImpl : public content::PushMessagingService, |
52 public gcm::GCMAppHandler, | 56 public gcm::GCMAppHandler, |
53 public content_settings::Observer, | 57 public content_settings::Observer, |
54 public KeyedService, | 58 public KeyedService, |
(...skipping 27 matching lines...) Expand all Loading... |
82 const content::PushSubscriptionOptions& options, | 86 const content::PushSubscriptionOptions& options, |
83 const content::PushMessagingService::RegisterCallback& callback) override; | 87 const content::PushMessagingService::RegisterCallback& callback) override; |
84 void SubscribeFromWorker( | 88 void SubscribeFromWorker( |
85 const GURL& requesting_origin, | 89 const GURL& requesting_origin, |
86 int64_t service_worker_registration_id, | 90 int64_t service_worker_registration_id, |
87 const content::PushSubscriptionOptions& options, | 91 const content::PushSubscriptionOptions& options, |
88 const content::PushMessagingService::RegisterCallback& callback) override; | 92 const content::PushMessagingService::RegisterCallback& callback) override; |
89 void GetEncryptionInfo( | 93 void GetEncryptionInfo( |
90 const GURL& origin, | 94 const GURL& origin, |
91 int64_t service_worker_registration_id, | 95 int64_t service_worker_registration_id, |
| 96 const std::string& sender_id, |
92 const content::PushMessagingService::EncryptionInfoCallback& callback) | 97 const content::PushMessagingService::EncryptionInfoCallback& callback) |
93 override; | 98 override; |
94 void Unsubscribe( | 99 void Unsubscribe( |
95 const GURL& requesting_origin, | 100 const GURL& requesting_origin, |
96 int64_t service_worker_registration_id, | 101 int64_t service_worker_registration_id, |
97 const std::string& sender_id, | 102 const std::string& sender_id, |
98 const content::PushMessagingService::UnregisterCallback&) override; | 103 const content::PushMessagingService::UnregisterCallback&) override; |
99 blink::WebPushPermissionStatus GetPermissionStatus( | 104 blink::WebPushPermissionStatus GetPermissionStatus( |
100 const GURL& origin, | 105 const GURL& origin, |
101 bool user_visible) override; | 106 bool user_visible) override; |
(...skipping 11 matching lines...) Expand all Loading... |
113 // BackgroundTrigger implementation. | 118 // BackgroundTrigger implementation. |
114 base::string16 GetName() override; | 119 base::string16 GetName() override; |
115 gfx::ImageSkia* GetIcon() override; | 120 gfx::ImageSkia* GetIcon() override; |
116 void OnMenuClick() override; | 121 void OnMenuClick() override; |
117 | 122 |
118 void SetMessageCallbackForTesting(const base::Closure& callback); | 123 void SetMessageCallbackForTesting(const base::Closure& callback); |
119 void SetContentSettingChangedCallbackForTesting( | 124 void SetContentSettingChangedCallbackForTesting( |
120 const base::Closure& callback); | 125 const base::Closure& callback); |
121 | 126 |
122 private: | 127 private: |
| 128 friend class PushMessagingBrowserTest; |
123 FRIEND_TEST_ALL_PREFIXES(PushMessagingServiceTest, NormalizeSenderInfo); | 129 FRIEND_TEST_ALL_PREFIXES(PushMessagingServiceTest, NormalizeSenderInfo); |
124 FRIEND_TEST_ALL_PREFIXES(PushMessagingServiceTest, PayloadEncryptionTest); | 130 FRIEND_TEST_ALL_PREFIXES(PushMessagingServiceTest, PayloadEncryptionTest); |
125 | 131 |
126 // A subscription is pending until it has succeeded or failed. | 132 // A subscription is pending until it has succeeded or failed. |
127 void IncreasePushSubscriptionCount(int add, bool is_pending); | 133 void IncreasePushSubscriptionCount(int add, bool is_pending); |
128 void DecreasePushSubscriptionCount(int subtract, bool was_pending); | 134 void DecreasePushSubscriptionCount(int subtract, bool was_pending); |
129 | 135 |
130 // OnMessage methods --------------------------------------------------------- | 136 // OnMessage methods --------------------------------------------------------- |
131 | 137 |
132 void DeliverMessageCallback(const std::string& app_id, | 138 void DeliverMessageCallback(const std::string& app_id, |
133 const GURL& requesting_origin, | 139 const GURL& requesting_origin, |
134 int64_t service_worker_registration_id, | 140 int64_t service_worker_registration_id, |
135 const gcm::IncomingMessage& message, | 141 const gcm::IncomingMessage& message, |
136 const base::Closure& message_handled_closure, | 142 const base::Closure& message_handled_closure, |
137 content::PushDeliveryStatus status); | 143 content::PushDeliveryStatus status); |
138 | 144 |
139 void DidHandleMessage(const std::string& app_id, | 145 void DidHandleMessage(const std::string& app_id, |
140 const base::Closure& completion_closure); | 146 const base::Closure& completion_closure); |
141 | 147 |
142 // Subscribe methods --------------------------------------------------------- | 148 // Subscribe methods --------------------------------------------------------- |
143 | 149 |
| 150 void DoSubscribe( |
| 151 const PushMessagingAppIdentifier& app_identifier, |
| 152 const content::PushSubscriptionOptions& options, |
| 153 const content::PushMessagingService::RegisterCallback& callback, |
| 154 blink::mojom::PermissionStatus permission_status); |
| 155 |
144 void SubscribeEnd( | 156 void SubscribeEnd( |
145 const content::PushMessagingService::RegisterCallback& callback, | 157 const content::PushMessagingService::RegisterCallback& callback, |
146 const std::string& subscription_id, | 158 const std::string& subscription_id, |
147 const std::vector<uint8_t>& p256dh, | 159 const std::vector<uint8_t>& p256dh, |
148 const std::vector<uint8_t>& auth, | 160 const std::vector<uint8_t>& auth, |
149 content::PushRegistrationStatus status); | 161 content::PushRegistrationStatus status); |
150 | 162 |
151 void SubscribeEndWithError( | 163 void SubscribeEndWithError( |
152 const content::PushMessagingService::RegisterCallback& callback, | 164 const content::PushMessagingService::RegisterCallback& callback, |
153 content::PushRegistrationStatus status); | 165 content::PushRegistrationStatus status); |
154 | 166 |
155 void DidSubscribe( | 167 void DidSubscribe( |
156 const PushMessagingAppIdentifier& app_identifier, | 168 const PushMessagingAppIdentifier& app_identifier, |
| 169 const std::string& sender_id, |
157 const content::PushMessagingService::RegisterCallback& callback, | 170 const content::PushMessagingService::RegisterCallback& callback, |
158 const std::string& subscription_id, | 171 const std::string& subscription_id, |
159 gcm::GCMClient::Result result); | 172 instance_id::InstanceID::Result result); |
160 | 173 |
161 void DidSubscribeWithEncryptionInfo( | 174 void DidSubscribeWithEncryptionInfo( |
162 const PushMessagingAppIdentifier& app_identifier, | 175 const PushMessagingAppIdentifier& app_identifier, |
163 const content::PushMessagingService::RegisterCallback& callback, | 176 const content::PushMessagingService::RegisterCallback& callback, |
164 const std::string& subscription_id, | 177 const std::string& subscription_id, |
165 const std::string& p256dh, | 178 const std::string& p256dh, |
166 const std::string& auth_secret); | 179 const std::string& auth_secret); |
167 | 180 |
168 void DidRequestPermission( | |
169 const PushMessagingAppIdentifier& app_identifier, | |
170 const content::PushSubscriptionOptions& options, | |
171 const content::PushMessagingService::RegisterCallback& callback, | |
172 blink::mojom::PermissionStatus permission_status); | |
173 | |
174 // GetEncryptionInfo method -------------------------------------------------- | 181 // GetEncryptionInfo method -------------------------------------------------- |
175 | 182 |
176 void DidGetEncryptionInfo( | 183 void DidGetEncryptionInfo( |
177 const PushMessagingService::EncryptionInfoCallback& callback, | 184 const PushMessagingService::EncryptionInfoCallback& callback, |
178 const std::string& p256dh, | 185 const std::string& p256dh, |
179 const std::string& auth_secret) const; | 186 const std::string& auth_secret) const; |
180 | 187 |
181 // Unsubscribe methods ------------------------------------------------------- | 188 // Unsubscribe methods ------------------------------------------------------- |
182 | 189 |
183 void Unsubscribe(const std::string& app_id, | 190 void Unsubscribe(const std::string& app_id, |
184 const std::string& sender_id, | 191 const std::string& sender_id, |
185 const content::PushMessagingService::UnregisterCallback&); | 192 const content::PushMessagingService::UnregisterCallback&); |
186 | 193 |
| 194 void DidDeleteID(const std::string& app_id, |
| 195 bool was_subscribed, |
| 196 const content::PushMessagingService::UnregisterCallback&, |
| 197 instance_id::InstanceID::Result result); |
| 198 |
| 199 void DidUnsubscribeInstanceID( |
| 200 const std::string& app_id, |
| 201 bool was_subscribed, |
| 202 const content::PushMessagingService::UnregisterCallback&, |
| 203 instance_id::InstanceID::Result result); |
| 204 |
187 void DidUnsubscribe(bool was_subscribed, | 205 void DidUnsubscribe(bool was_subscribed, |
188 const content::PushMessagingService::UnregisterCallback&, | 206 const content::PushMessagingService::UnregisterCallback&, |
189 gcm::GCMClient::Result result); | 207 gcm::GCMClient::Result result); |
190 | 208 |
191 // OnContentSettingChanged methods ------------------------------------------- | 209 // OnContentSettingChanged methods ------------------------------------------- |
192 | 210 |
193 void UnsubscribeBecausePermissionRevoked( | 211 void UnsubscribeBecausePermissionRevoked( |
194 const PushMessagingAppIdentifier& app_identifier, | 212 const PushMessagingAppIdentifier& app_identifier, |
195 const base::Closure& closure, | 213 const base::Closure& closure, |
196 const std::string& sender_id, | 214 const std::string& sender_id, |
197 bool success, | 215 bool success, |
198 bool not_found); | 216 bool not_found); |
199 | 217 |
200 // Helper methods ------------------------------------------------------------ | 218 // Helper methods ------------------------------------------------------------ |
201 | 219 |
202 // Normalizes the |sender_info|. In most cases the |sender_info| will be | 220 // Normalizes the |sender_info|. In most cases the |sender_info| will be |
203 // passed through to the GCM Driver as-is, but NIST P-256 application server | 221 // passed through to the GCM Driver as-is, but NIST P-256 application server |
204 // keys have to be encoded using the URL-safe variant of the base64 encoding. | 222 // keys have to be encoded using the URL-safe variant of the base64 encoding. |
205 std::string NormalizeSenderInfo(const std::string& sender_info) const; | 223 std::string NormalizeSenderInfo(const std::string& sender_info) const; |
206 | 224 |
207 // Checks if a given origin is allowed to use Push. | 225 // Checks if a given origin is allowed to use Push. |
208 bool IsPermissionSet(const GURL& origin); | 226 bool IsPermissionSet(const GURL& origin); |
209 | 227 |
| 228 // Wrapper around {GCMDriver, InstanceID}::GetEncryptionInfo. |
| 229 void GetEncryptionInfoImpl( |
| 230 const std::string& app_id, |
| 231 const std::string& sender_id, |
| 232 gcm::GCMEncryptionProvider::EncryptionInfoCallback callback); |
| 233 |
210 gcm::GCMDriver* GetGCMDriver() const; | 234 gcm::GCMDriver* GetGCMDriver() const; |
211 | 235 |
| 236 instance_id::InstanceIDDriver* GetInstanceIDDriver() const; |
| 237 |
212 // Testing methods ----------------------------------------------------------- | 238 // Testing methods ----------------------------------------------------------- |
213 | 239 |
214 // Callback to be invoked when a message has been dispatched. Enables tests to | 240 // Callback to be invoked when a message has been dispatched. Enables tests to |
215 // observe message delivery before it's dispatched to the Service Worker. | 241 // observe message delivery before it's dispatched to the Service Worker. |
216 using MessageDispatchedCallback = | 242 using MessageDispatchedCallback = |
217 base::Callback<void(const std::string& app_id, | 243 base::Callback<void(const std::string& app_id, |
218 const GURL& origin, | 244 const GURL& origin, |
219 int64_t service_worker_registration_id, | 245 int64_t service_worker_registration_id, |
220 const content::PushEventPayload& payload)>; | 246 const content::PushEventPayload& payload)>; |
221 | 247 |
(...skipping 28 matching lines...) Expand all Loading... |
250 // we can finish processing them without being interrupted. | 276 // we can finish processing them without being interrupted. |
251 std::unique_ptr<ScopedKeepAlive> in_flight_keep_alive_; | 277 std::unique_ptr<ScopedKeepAlive> in_flight_keep_alive_; |
252 #endif | 278 #endif |
253 | 279 |
254 base::WeakPtrFactory<PushMessagingServiceImpl> weak_factory_; | 280 base::WeakPtrFactory<PushMessagingServiceImpl> weak_factory_; |
255 | 281 |
256 DISALLOW_COPY_AND_ASSIGN(PushMessagingServiceImpl); | 282 DISALLOW_COPY_AND_ASSIGN(PushMessagingServiceImpl); |
257 }; | 283 }; |
258 | 284 |
259 #endif // CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_SERVICE_IMPL_H_ | 285 #endif // CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_SERVICE_IMPL_H_ |
OLD | NEW |