| 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 #include "content/browser/notifications/notification_event_dispatcher_impl.h" | 5 #include "content/browser/notifications/notification_event_dispatcher_impl.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "content/browser/notifications/platform_notification_context_impl.h" | 8 #include "content/browser/notifications/platform_notification_context_impl.h" |
| 9 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 9 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 10 #include "content/browser/service_worker/service_worker_registration.h" | 10 #include "content/browser/service_worker/service_worker_registration.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 | 60 |
| 61 BrowserThread::PostTask(BrowserThread::UI, | 61 BrowserThread::PostTask(BrowserThread::UI, |
| 62 FROM_HERE, | 62 FROM_HERE, |
| 63 base::Bind(dispatch_complete_callback, status)); | 63 base::Bind(dispatch_complete_callback, status)); |
| 64 } | 64 } |
| 65 | 65 |
| 66 // Dispatches the notificationclick on |service_worker_registration| if the | 66 // Dispatches the notificationclick on |service_worker_registration| if the |
| 67 // registration was available. Must be called on the IO thread. | 67 // registration was available. Must be called on the IO thread. |
| 68 void DispatchNotificationClickEventOnRegistration( | 68 void DispatchNotificationClickEventOnRegistration( |
| 69 const NotificationDatabaseData& notification_database_data, | 69 const NotificationDatabaseData& notification_database_data, |
| 70 int action_index, |
| 70 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, | 71 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, |
| 71 ServiceWorkerStatusCode service_worker_status, | 72 ServiceWorkerStatusCode service_worker_status, |
| 72 const scoped_refptr<ServiceWorkerRegistration>& | 73 const scoped_refptr<ServiceWorkerRegistration>& |
| 73 service_worker_registration) { | 74 service_worker_registration) { |
| 74 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 75 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 75 if (service_worker_status == SERVICE_WORKER_OK) { | 76 if (service_worker_status == SERVICE_WORKER_OK) { |
| 76 base::Callback<void(ServiceWorkerStatusCode)> dispatch_event_callback = | 77 base::Callback<void(ServiceWorkerStatusCode)> dispatch_event_callback = |
| 77 base::Bind(&NotificationClickEventFinished, | 78 base::Bind(&NotificationClickEventFinished, |
| 78 dispatch_complete_callback, | 79 dispatch_complete_callback, |
| 79 service_worker_registration); | 80 service_worker_registration); |
| 80 | 81 |
| 81 service_worker_registration->active_version()-> | 82 service_worker_registration->active_version()-> |
| 82 DispatchNotificationClickEvent( | 83 DispatchNotificationClickEvent( |
| 83 dispatch_event_callback, | 84 dispatch_event_callback, |
| 84 notification_database_data.notification_id, | 85 notification_database_data.notification_id, |
| 85 notification_database_data.notification_data); | 86 notification_database_data.notification_data, |
| 87 action_index); |
| 86 return; | 88 return; |
| 87 } | 89 } |
| 88 | 90 |
| 89 PersistentNotificationStatus status = PERSISTENT_NOTIFICATION_STATUS_SUCCESS; | 91 PersistentNotificationStatus status = PERSISTENT_NOTIFICATION_STATUS_SUCCESS; |
| 90 switch (service_worker_status) { | 92 switch (service_worker_status) { |
| 91 case SERVICE_WORKER_ERROR_NOT_FOUND: | 93 case SERVICE_WORKER_ERROR_NOT_FOUND: |
| 92 status = PERSISTENT_NOTIFICATION_STATUS_NO_SERVICE_WORKER; | 94 status = PERSISTENT_NOTIFICATION_STATUS_NO_SERVICE_WORKER; |
| 93 break; | 95 break; |
| 94 case SERVICE_WORKER_ERROR_FAILED: | 96 case SERVICE_WORKER_ERROR_FAILED: |
| 95 case SERVICE_WORKER_ERROR_ABORT: | 97 case SERVICE_WORKER_ERROR_ABORT: |
| (...skipping 21 matching lines...) Expand all Loading... |
| 117 | 119 |
| 118 BrowserThread::PostTask(BrowserThread::UI, | 120 BrowserThread::PostTask(BrowserThread::UI, |
| 119 FROM_HERE, | 121 FROM_HERE, |
| 120 base::Bind(dispatch_complete_callback, status)); | 122 base::Bind(dispatch_complete_callback, status)); |
| 121 } | 123 } |
| 122 | 124 |
| 123 // Finds the ServiceWorkerRegistration associated with the |origin| and | 125 // Finds the ServiceWorkerRegistration associated with the |origin| and |
| 124 // |service_worker_registration_id|. Must be called on the IO thread. | 126 // |service_worker_registration_id|. Must be called on the IO thread. |
| 125 void FindServiceWorkerRegistration( | 127 void FindServiceWorkerRegistration( |
| 126 const GURL& origin, | 128 const GURL& origin, |
| 129 int action_index, |
| 127 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, | 130 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, |
| 128 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, | 131 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, |
| 129 bool success, | 132 bool success, |
| 130 const NotificationDatabaseData& notification_database_data) { | 133 const NotificationDatabaseData& notification_database_data) { |
| 131 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 134 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 132 if (!success) { | 135 if (!success) { |
| 133 BrowserThread::PostTask( | 136 BrowserThread::PostTask( |
| 134 BrowserThread::UI, | 137 BrowserThread::UI, |
| 135 FROM_HERE, | 138 FROM_HERE, |
| 136 base::Bind(dispatch_complete_callback, | 139 base::Bind(dispatch_complete_callback, |
| 137 PERSISTENT_NOTIFICATION_STATUS_DATABASE_ERROR)); | 140 PERSISTENT_NOTIFICATION_STATUS_DATABASE_ERROR)); |
| 138 return; | 141 return; |
| 139 } | 142 } |
| 140 | 143 |
| 141 service_worker_context->FindRegistrationForId( | 144 service_worker_context->FindRegistrationForId( |
| 142 notification_database_data.service_worker_registration_id, | 145 notification_database_data.service_worker_registration_id, |
| 143 origin, | 146 origin, |
| 144 base::Bind(&DispatchNotificationClickEventOnRegistration, | 147 base::Bind(&DispatchNotificationClickEventOnRegistration, |
| 145 notification_database_data, | 148 notification_database_data, action_index, |
| 146 dispatch_complete_callback)); | 149 dispatch_complete_callback)); |
| 147 } | 150 } |
| 148 | 151 |
| 149 // Reads the data associated with the |persistent_notification_id| belonging to | 152 // Reads the data associated with the |persistent_notification_id| belonging to |
| 150 // |origin| from the notification context. | 153 // |origin| from the notification context. |
| 151 void ReadNotificationDatabaseData( | 154 void ReadNotificationDatabaseData( |
| 152 int64_t persistent_notification_id, | 155 int64_t persistent_notification_id, |
| 153 const GURL& origin, | 156 const GURL& origin, |
| 157 int action_index, |
| 154 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, | 158 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, |
| 155 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, | 159 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, |
| 156 scoped_refptr<PlatformNotificationContextImpl> notification_context) { | 160 scoped_refptr<PlatformNotificationContextImpl> notification_context) { |
| 157 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 161 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 158 notification_context->ReadNotificationData( | 162 notification_context->ReadNotificationData( |
| 159 persistent_notification_id, | 163 persistent_notification_id, |
| 160 origin, | 164 origin, |
| 161 base::Bind(&FindServiceWorkerRegistration, | 165 base::Bind(&FindServiceWorkerRegistration, |
| 162 origin, dispatch_complete_callback, service_worker_context)); | 166 origin, action_index, dispatch_complete_callback, |
| 167 service_worker_context)); |
| 163 } | 168 } |
| 164 | 169 |
| 165 } // namespace | 170 } // namespace |
| 166 | 171 |
| 167 // static | 172 // static |
| 168 NotificationEventDispatcher* NotificationEventDispatcher::GetInstance() { | 173 NotificationEventDispatcher* NotificationEventDispatcher::GetInstance() { |
| 169 return NotificationEventDispatcherImpl::GetInstance(); | 174 return NotificationEventDispatcherImpl::GetInstance(); |
| 170 } | 175 } |
| 171 | 176 |
| 172 NotificationEventDispatcherImpl* | 177 NotificationEventDispatcherImpl* |
| 173 NotificationEventDispatcherImpl::GetInstance() { | 178 NotificationEventDispatcherImpl::GetInstance() { |
| 174 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 179 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 175 return Singleton<NotificationEventDispatcherImpl>::get(); | 180 return Singleton<NotificationEventDispatcherImpl>::get(); |
| 176 } | 181 } |
| 177 | 182 |
| 178 NotificationEventDispatcherImpl::NotificationEventDispatcherImpl() {} | 183 NotificationEventDispatcherImpl::NotificationEventDispatcherImpl() {} |
| 179 | 184 |
| 180 NotificationEventDispatcherImpl::~NotificationEventDispatcherImpl() {} | 185 NotificationEventDispatcherImpl::~NotificationEventDispatcherImpl() {} |
| 181 | 186 |
| 182 void NotificationEventDispatcherImpl::DispatchNotificationClickEvent( | 187 void NotificationEventDispatcherImpl::DispatchNotificationClickEvent( |
| 183 BrowserContext* browser_context, | 188 BrowserContext* browser_context, |
| 184 int64_t persistent_notification_id, | 189 int64_t persistent_notification_id, |
| 185 const GURL& origin, | 190 const GURL& origin, |
| 191 int action_index, |
| 186 const NotificationClickDispatchCompleteCallback& | 192 const NotificationClickDispatchCompleteCallback& |
| 187 dispatch_complete_callback) { | 193 dispatch_complete_callback) { |
| 188 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 194 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 189 DCHECK_GT(persistent_notification_id, 0); | 195 DCHECK_GT(persistent_notification_id, 0); |
| 190 DCHECK(origin.is_valid()); | 196 DCHECK(origin.is_valid()); |
| 191 | 197 |
| 192 StoragePartition* partition = | 198 StoragePartition* partition = |
| 193 BrowserContext::GetStoragePartitionForSite(browser_context, origin); | 199 BrowserContext::GetStoragePartitionForSite(browser_context, origin); |
| 194 | 200 |
| 195 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context = | 201 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context = |
| 196 static_cast<ServiceWorkerContextWrapper*>( | 202 static_cast<ServiceWorkerContextWrapper*>( |
| 197 partition->GetServiceWorkerContext()); | 203 partition->GetServiceWorkerContext()); |
| 198 scoped_refptr<PlatformNotificationContextImpl> notification_context = | 204 scoped_refptr<PlatformNotificationContextImpl> notification_context = |
| 199 static_cast<PlatformNotificationContextImpl*>( | 205 static_cast<PlatformNotificationContextImpl*>( |
| 200 partition->GetPlatformNotificationContext()); | 206 partition->GetPlatformNotificationContext()); |
| 201 | 207 |
| 202 BrowserThread::PostTask( | 208 BrowserThread::PostTask( |
| 203 BrowserThread::IO, | 209 BrowserThread::IO, |
| 204 FROM_HERE, | 210 FROM_HERE, |
| 205 base::Bind(&ReadNotificationDatabaseData, | 211 base::Bind(&ReadNotificationDatabaseData, |
| 206 persistent_notification_id, | 212 persistent_notification_id, |
| 207 origin, | 213 origin, |
| 214 action_index, |
| 208 dispatch_complete_callback, | 215 dispatch_complete_callback, |
| 209 service_worker_context, | 216 service_worker_context, |
| 210 notification_context)); | 217 notification_context)); |
| 211 } | 218 } |
| 212 | 219 |
| 213 } // namespace content | 220 } // namespace content |
| OLD | NEW |