Index: chrome/browser/push_messaging/push_messaging_service_impl.cc |
diff --git a/chrome/browser/services/gcm/push_messaging_service_impl.cc b/chrome/browser/push_messaging/push_messaging_service_impl.cc |
similarity index 88% |
rename from chrome/browser/services/gcm/push_messaging_service_impl.cc |
rename to chrome/browser/push_messaging/push_messaging_service_impl.cc |
index b0cc76d2dfc9e7047f48987da0260ccbc6276968..59a8216f08e4f1ac758222bba373c6b270bdaf45 100644 |
--- a/chrome/browser/services/gcm/push_messaging_service_impl.cc |
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.cc |
@@ -2,7 +2,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/services/gcm/push_messaging_service_impl.h" |
+#include "chrome/browser/push_messaging/push_messaging_service_impl.h" |
#include <bitset> |
#include <vector> |
@@ -18,12 +18,13 @@ |
#include "chrome/browser/notifications/notification_ui_manager.h" |
#include "chrome/browser/notifications/platform_notification_service_impl.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/push_messaging/push_messaging_application_id.h" |
+#include "chrome/browser/push_messaging/push_messaging_constants.h" |
+#include "chrome/browser/push_messaging/push_messaging_permission_context.h" |
+#include "chrome/browser/push_messaging/push_messaging_permission_context_factory.h" |
+#include "chrome/browser/push_messaging/push_messaging_service_factory.h" |
#include "chrome/browser/services/gcm/gcm_profile_service.h" |
#include "chrome/browser/services/gcm/gcm_profile_service_factory.h" |
-#include "chrome/browser/services/gcm/push_messaging_application_id.h" |
-#include "chrome/browser/services/gcm/push_messaging_constants.h" |
-#include "chrome/browser/services/gcm/push_messaging_permission_context.h" |
-#include "chrome/browser/services/gcm/push_messaging_permission_context_factory.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/pref_names.h" |
#include "chrome/grit/generated_resources.h" |
@@ -53,8 +54,6 @@ |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#endif |
-namespace gcm { |
- |
namespace { |
const int kMaxRegistrations = 1000000; |
@@ -112,21 +111,13 @@ void PushMessagingServiceImpl::InitializeForProfile(Profile* profile) { |
if (count <= 0) |
return; |
- // Create the GCMProfileService, and hence instantiate this class. |
- GCMProfileService* gcm_service = |
- GCMProfileServiceFactory::GetForProfile(profile); |
PushMessagingServiceImpl* push_service = |
- static_cast<PushMessagingServiceImpl*>( |
- gcm_service->push_messaging_service()); |
- |
+ PushMessagingServiceFactory::GetForProfile(profile); |
push_service->IncreasePushRegistrationCount(count, false /* is_pending */); |
} |
-PushMessagingServiceImpl::PushMessagingServiceImpl( |
- GCMProfileService* gcm_profile_service, |
- Profile* profile) |
- : gcm_profile_service_(gcm_profile_service), |
- profile_(profile), |
+PushMessagingServiceImpl::PushMessagingServiceImpl(Profile* profile) |
+ : profile_(profile), |
push_registration_count_(0), |
pending_push_registration_count_(0), |
weak_factory_(this) { |
@@ -138,8 +129,6 @@ PushMessagingServiceImpl::PushMessagingServiceImpl( |
} |
PushMessagingServiceImpl::~PushMessagingServiceImpl() { |
- // TODO(johnme): If it's possible for this to be destroyed before GCMDriver, |
- // then we should call RemoveAppHandler. |
profile_->GetHostContentSettingsMap()->RemoveObserver(this); |
} |
@@ -147,8 +136,7 @@ void PushMessagingServiceImpl::IncreasePushRegistrationCount(int add, |
bool is_pending) { |
DCHECK(add > 0); |
if (push_registration_count_ + pending_push_registration_count_ == 0) { |
- gcm_profile_service_->driver()->AddAppHandler( |
- kPushMessagingApplicationIdPrefix, this); |
+ GetGCMDriver()->AddAppHandler(kPushMessagingApplicationIdPrefix, this); |
} |
if (is_pending) { |
pending_push_registration_count_ += add; |
@@ -172,8 +160,7 @@ void PushMessagingServiceImpl::DecreasePushRegistrationCount(int subtract, |
push_registration_count_); |
} |
if (push_registration_count_ + pending_push_registration_count_ == 0) { |
- gcm_profile_service_->driver()->RemoveAppHandler( |
- kPushMessagingApplicationIdPrefix); |
+ GetGCMDriver()->RemoveAppHandler(kPushMessagingApplicationIdPrefix); |
} |
} |
@@ -182,14 +169,16 @@ bool PushMessagingServiceImpl::CanHandle(const std::string& app_id) const { |
} |
void PushMessagingServiceImpl::ShutdownHandler() { |
- // TODO(johnme): Do any necessary cleanup. |
+ // Shutdown() should come before and it removes us from the list of app |
+ // handlers of gcm::GCMDriver so this shouldn't ever been called. |
+ NOTREACHED(); |
} |
// OnMessage methods ----------------------------------------------------------- |
void PushMessagingServiceImpl::OnMessage( |
const std::string& app_id, |
- const GCMClient::IncomingMessage& message) { |
+ const gcm::GCMClient::IncomingMessage& message) { |
PushMessagingApplicationId application_id = |
PushMessagingApplicationId::Get(profile_, app_id); |
// Drop message and unregister if app id was unknown (maybe recently deleted). |
@@ -226,7 +215,7 @@ void PushMessagingServiceImpl::OnMessage( |
// https://crbug.com/449184 |
if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnablePushMessagePayload)) { |
- GCMClient::MessageData::const_iterator it = message.data.find("data"); |
+ gcm::GCMClient::MessageData::const_iterator it = message.data.find("data"); |
if (it != message.data.end()) |
data = it->second; |
} |
@@ -246,7 +235,7 @@ void PushMessagingServiceImpl::DeliverMessageCallback( |
const std::string& app_id_guid, |
const GURL& requesting_origin, |
int64 service_worker_registration_id, |
- const GCMClient::IncomingMessage& message, |
+ const gcm::GCMClient::IncomingMessage& message, |
content::PushDeliveryStatus status) { |
// TODO(mvanouwerkerk): Show a warning in the developer console of the |
// Service Worker corresponding to app_id (and/or on an internals page). |
@@ -424,7 +413,7 @@ void PushMessagingServiceImpl::DidGetNotificationsShown( |
} |
} |
-// Other GCMAppHandler methods ------------------------------------------------- |
+// Other gcm::GCMAppHandler methods ------------------------------------------- |
void PushMessagingServiceImpl::OnMessagesDeleted(const std::string& app_id) { |
// TODO(mvanouwerkerk): Fire push error event on the Service Worker |
@@ -433,7 +422,7 @@ void PushMessagingServiceImpl::OnMessagesDeleted(const std::string& app_id) { |
void PushMessagingServiceImpl::OnSendError( |
const std::string& app_id, |
- const GCMClient::SendErrorDetails& send_error_details) { |
+ const gcm::GCMClient::SendErrorDetails& send_error_details) { |
NOTREACHED() << "The Push API shouldn't have sent messages upstream"; |
} |
@@ -459,11 +448,6 @@ void PushMessagingServiceImpl::RegisterFromDocument( |
int render_frame_id, |
bool user_visible_only, |
const content::PushMessagingService::RegisterCallback& callback) { |
- if (!gcm_profile_service_->driver()) { |
- NOTREACHED() << "There is no GCMDriver. Has GCMProfileService shut down?"; |
- return; |
- } |
- |
PushMessagingApplicationId application_id = |
PushMessagingApplicationId::Generate(requesting_origin, |
service_worker_registration_id); |
@@ -494,8 +478,8 @@ void PushMessagingServiceImpl::RegisterFromDocument( |
const PermissionRequestID id( |
renderer_id, web_contents->GetRoutingID(), bridge_id, GURL()); |
- gcm::PushMessagingPermissionContext* permission_context = |
- gcm::PushMessagingPermissionContextFactory::GetForProfile(profile_); |
+ PushMessagingPermissionContext* permission_context = |
+ PushMessagingPermissionContextFactory::GetForProfile(profile_); |
if (permission_context == NULL || !user_visible_only) { |
RegisterEnd(callback, |
@@ -521,11 +505,6 @@ void PushMessagingServiceImpl::RegisterFromWorker( |
int64 service_worker_registration_id, |
const std::string& sender_id, |
const content::PushMessagingService::RegisterCallback& register_callback) { |
- if (!gcm_profile_service_->driver()) { |
- NOTREACHED() << "There is no GCMDriver. Has GCMProfileService shut down?"; |
- return; |
- } |
- |
PushMessagingApplicationId application_id = |
PushMessagingApplicationId::Generate(requesting_origin, |
service_worker_registration_id); |
@@ -550,7 +529,7 @@ void PushMessagingServiceImpl::RegisterFromWorker( |
IncreasePushRegistrationCount(1, true /* is_pending */); |
std::vector<std::string> sender_ids(1, sender_id); |
- gcm_profile_service_->driver()->Register( |
+ GetGCMDriver()->Register( |
application_id.app_id_guid(), sender_ids, |
base::Bind(&PushMessagingServiceImpl::DidRegister, |
weak_factory_.GetWeakPtr(), |
@@ -577,24 +556,24 @@ void PushMessagingServiceImpl::DidRegister( |
const PushMessagingApplicationId& application_id, |
const content::PushMessagingService::RegisterCallback& callback, |
const std::string& registration_id, |
- GCMClient::Result result) { |
+ gcm::GCMClient::Result result) { |
content::PushRegistrationStatus status = |
content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; |
switch (result) { |
- case GCMClient::SUCCESS: |
+ case gcm::GCMClient::SUCCESS: |
status = content::PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE; |
application_id.PersistToDisk(profile_); |
IncreasePushRegistrationCount(1, false /* is_pending */); |
break; |
- case GCMClient::INVALID_PARAMETER: |
- case GCMClient::GCM_DISABLED: |
- case GCMClient::ASYNC_OPERATION_PENDING: |
- case GCMClient::SERVER_ERROR: |
- case GCMClient::UNKNOWN_ERROR: |
+ case gcm::GCMClient::INVALID_PARAMETER: |
+ case gcm::GCMClient::GCM_DISABLED: |
+ case gcm::GCMClient::ASYNC_OPERATION_PENDING: |
+ case gcm::GCMClient::SERVER_ERROR: |
+ case gcm::GCMClient::UNKNOWN_ERROR: |
status = content::PUSH_REGISTRATION_STATUS_SERVICE_ERROR; |
break; |
- case GCMClient::NETWORK_ERROR: |
- case GCMClient::TTL_EXCEEDED: |
+ case gcm::GCMClient::NETWORK_ERROR: |
+ case gcm::GCMClient::TTL_EXCEEDED: |
status = content::PUSH_REGISTRATION_STATUS_NETWORK_ERROR; |
break; |
} |
@@ -614,13 +593,9 @@ void PushMessagingServiceImpl::DidRequestPermission( |
return; |
} |
- // The GCMDriver could be NULL if GCMProfileService has been shut down. |
- if (!gcm_profile_service_->driver()) |
- return; |
- |
IncreasePushRegistrationCount(1, true /* is_pending */); |
std::vector<std::string> sender_ids(1, sender_id); |
- gcm_profile_service_->driver()->Register( |
+ GetGCMDriver()->Register( |
application_id.app_id_guid(), |
sender_ids, |
base::Bind(&PushMessagingServiceImpl::DidRegister, |
@@ -636,8 +611,6 @@ void PushMessagingServiceImpl::Unregister( |
const std::string& sender_id, |
bool retry_on_failure, |
const content::PushMessagingService::UnregisterCallback& callback) { |
- DCHECK(gcm_profile_service_->driver()); |
- |
PushMessagingApplicationId application_id = PushMessagingApplicationId::Get( |
profile_, requesting_origin, service_worker_registration_id); |
if (!application_id.IsValid()) { |
@@ -657,8 +630,6 @@ void PushMessagingServiceImpl::Unregister( |
const std::string& sender_id, |
bool retry_on_failure, |
const content::PushMessagingService::UnregisterCallback& callback) { |
- DCHECK(gcm_profile_service_->driver()); |
- |
if (retry_on_failure) { |
// Delete the mapping for this app id, to guarantee that no messages get |
// delivered in future (even if unregistration fails). |
@@ -676,10 +647,10 @@ void PushMessagingServiceImpl::Unregister( |
app_id_guid, retry_on_failure, callback); |
#if defined(OS_ANDROID) |
// On Android the backend is different, and requires the original sender_id. |
- gcm_profile_service_->driver()->UnregisterWithSenderId(app_id_guid, sender_id, |
- unregister_callback); |
+ GetGCMDriver()->UnregisterWithSenderId(app_id_guid, sender_id, |
+ unregister_callback); |
#else |
- gcm_profile_service_->driver()->Unregister(app_id_guid, unregister_callback); |
+ GetGCMDriver()->Unregister(app_id_guid, unregister_callback); |
#endif |
} |
@@ -687,8 +658,8 @@ void PushMessagingServiceImpl::DidUnregister( |
const std::string& app_id_guid, |
bool retry_on_failure, |
const content::PushMessagingService::UnregisterCallback& callback, |
- GCMClient::Result result) { |
- if (result == GCMClient::SUCCESS) { |
+ gcm::GCMClient::Result result) { |
+ if (result == gcm::GCMClient::SUCCESS) { |
PushMessagingApplicationId application_id = |
PushMessagingApplicationId::Get(profile_, app_id_guid); |
if (!application_id.IsValid()) { |
@@ -706,18 +677,18 @@ void PushMessagingServiceImpl::DidUnregister( |
// Internal calls pass a null callback. |
if (!callback.is_null()) { |
switch (result) { |
- case GCMClient::SUCCESS: |
+ case gcm::GCMClient::SUCCESS: |
callback.Run(content::PUSH_UNREGISTRATION_STATUS_SUCCESS_UNREGISTERED); |
break; |
- case GCMClient::INVALID_PARAMETER: |
- case GCMClient::GCM_DISABLED: |
- case GCMClient::ASYNC_OPERATION_PENDING: |
- case GCMClient::SERVER_ERROR: |
- case GCMClient::UNKNOWN_ERROR: |
+ case gcm::GCMClient::INVALID_PARAMETER: |
+ case gcm::GCMClient::GCM_DISABLED: |
+ case gcm::GCMClient::ASYNC_OPERATION_PENDING: |
+ case gcm::GCMClient::SERVER_ERROR: |
+ case gcm::GCMClient::UNKNOWN_ERROR: |
callback.Run(content::PUSH_UNREGISTRATION_STATUS_SERVICE_ERROR); |
break; |
- case GCMClient::NETWORK_ERROR: |
- case GCMClient::TTL_EXCEEDED: |
+ case gcm::GCMClient::NETWORK_ERROR: |
+ case gcm::GCMClient::TTL_EXCEEDED: |
callback.Run( |
retry_on_failure |
? content:: |
@@ -772,20 +743,27 @@ void PushMessagingServiceImpl::UnregisterBecausePermissionRevoked( |
profile_, id.origin(), id.service_worker_registration_id()); |
} |
+// KeyedService methods ------------------------------------------------------- |
+ |
+void PushMessagingServiceImpl::Shutdown() { |
+ GetGCMDriver()->RemoveAppHandler(kPushMessagingApplicationIdPrefix); |
+} |
+ |
// Helper methods -------------------------------------------------------------- |
bool PushMessagingServiceImpl::HasPermission(const GURL& origin) { |
- gcm::PushMessagingPermissionContext* permission_context = |
- gcm::PushMessagingPermissionContextFactory::GetForProfile(profile_); |
+ PushMessagingPermissionContext* permission_context = |
+ PushMessagingPermissionContextFactory::GetForProfile(profile_); |
DCHECK(permission_context); |
return permission_context->GetPermissionStatus(origin, origin) == |
CONTENT_SETTING_ALLOW; |
} |
-void PushMessagingServiceImpl::SetProfileForTesting(Profile* profile) { |
- profile_ = profile; |
- profile_->GetHostContentSettingsMap()->AddObserver(this); |
+gcm::GCMDriver* PushMessagingServiceImpl::GetGCMDriver() const { |
+ gcm::GCMProfileService* gcm_profile_service = |
+ gcm::GCMProfileServiceFactory::GetForProfile(profile_); |
+ CHECK(gcm_profile_service); |
+ CHECK(gcm_profile_service->driver()); |
+ return gcm_profile_service->driver(); |
} |
- |
-} // namespace gcm |