Chromium Code Reviews| 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/geofencing/geofencing_manager.h" | 5 #include "content/browser/geofencing/geofencing_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "content/browser/geofencing/geofencing_service.h" | 10 #include "content/browser/geofencing/geofencing_service.h" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 76 | 76 |
| 77 void GeofencingManager::Shutdown() { | 77 void GeofencingManager::Shutdown() { |
| 78 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 78 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 79 BrowserThread::PostTask(BrowserThread::IO, | 79 BrowserThread::PostTask(BrowserThread::IO, |
| 80 FROM_HERE, | 80 FROM_HERE, |
| 81 base::Bind(&GeofencingManager::ShutdownOnIO, this)); | 81 base::Bind(&GeofencingManager::ShutdownOnIO, this)); |
| 82 } | 82 } |
| 83 | 83 |
| 84 void GeofencingManager::InitOnIO() { | 84 void GeofencingManager::InitOnIO() { |
| 85 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 85 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 86 service_ = GeofencingServiceImpl::GetInstance(); | 86 service_worker_context_->AddObserver(this); |
| 87 if (!service_) | |
| 88 service_ = GeofencingServiceImpl::GetInstance(); | |
| 87 } | 89 } |
| 88 | 90 |
| 89 void GeofencingManager::ShutdownOnIO() { | 91 void GeofencingManager::ShutdownOnIO() { |
| 90 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 92 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 93 service_worker_context_->RemoveObserver(this); | |
| 91 // Clean up all registrations with the |GeofencingService|. | 94 // Clean up all registrations with the |GeofencingService|. |
| 92 // TODO(mek): This will need to change to support geofence registrations that | 95 // TODO(mek): This will need to change to support geofence registrations that |
| 93 // outlive the browser, although removing the references to this | 96 // outlive the browser, although removing the references to this |
| 94 // |GeofencingManager| from the |GeofencingService| will still be needed. | 97 // |GeofencingManager| from the |GeofencingService| will still be needed. |
| 95 for (const auto& registration : registrations_by_id_) | 98 for (const auto& registration : registrations_by_id_) |
| 96 service_->UnregisterRegion(registration.first); | 99 service_->UnregisterRegion(registration.first); |
| 97 } | 100 } |
| 98 | 101 |
| 99 void GeofencingManager::RegisterRegion( | 102 void GeofencingManager::RegisterRegion( |
| 100 int64 service_worker_registration_id, | 103 int64 service_worker_registration_id, |
| 101 const std::string& region_id, | 104 const std::string& region_id, |
| 102 const blink::WebCircularGeofencingRegion& region, | 105 const blink::WebCircularGeofencingRegion& region, |
| 103 const StatusCallback& callback) { | 106 const StatusCallback& callback) { |
| 104 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 107 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 105 | 108 |
| 106 // TODO(mek): Validate region_id and region. | 109 // TODO(mek): Validate region_id and region. |
| 107 | 110 |
| 108 // Look up service worker. In unit tests |service_worker_context_| might not | 111 // Look up service worker. |
| 109 // be set. | 112 ServiceWorkerRegistration* service_worker_registration = |
| 110 GURL service_worker_origin; | 113 service_worker_context_->context()->GetLiveRegistration( |
| 111 if (service_worker_context_.get()) { | 114 service_worker_registration_id); |
| 112 ServiceWorkerRegistration* service_worker_registration = | 115 if (!service_worker_registration) { |
| 113 service_worker_context_->context()->GetLiveRegistration( | 116 callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_NO_SERVICE_WORKER); |
| 114 service_worker_registration_id); | 117 return; |
| 115 if (!service_worker_registration) { | 118 } |
| 116 callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_NO_SERVICE_WORKER); | |
| 117 return; | |
| 118 } | |
| 119 | 119 |
| 120 service_worker_origin = service_worker_registration->pattern().GetOrigin(); | 120 GURL service_worker_origin = |
| 121 } | 121 service_worker_registration->pattern().GetOrigin(); |
| 122 | 122 |
| 123 if (!service_->IsServiceAvailable()) { | 123 if (!service_->IsServiceAvailable()) { |
| 124 callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE); | 124 callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE); |
| 125 return; | 125 return; |
| 126 } | 126 } |
| 127 | 127 |
| 128 if (FindRegistration(service_worker_registration_id, region_id)) { | 128 if (FindRegistration(service_worker_registration_id, region_id)) { |
| 129 // Already registered, return an error. | 129 // Already registered, return an error. |
| 130 // TODO(mek): Use a more specific error code. | 130 // TODO(mek): Use a more specific error code. |
| 131 callback.Run(GEOFENCING_STATUS_ERROR); | 131 callback.Run(GEOFENCING_STATUS_ERROR); |
| 132 return; | 132 return; |
| 133 } | 133 } |
| 134 | 134 |
| 135 AddRegistration(service_worker_registration_id, service_worker_origin, | 135 AddRegistration(service_worker_registration_id, service_worker_origin, |
| 136 region_id, region, callback, | 136 region_id, region, callback, |
| 137 service_->RegisterRegion(region, this)); | 137 service_->RegisterRegion(region, this)); |
| 138 } | 138 } |
| 139 | 139 |
| 140 void GeofencingManager::UnregisterRegion(int64 service_worker_registration_id, | 140 void GeofencingManager::UnregisterRegion(int64 service_worker_registration_id, |
| 141 const std::string& region_id, | 141 const std::string& region_id, |
| 142 const StatusCallback& callback) { | 142 const StatusCallback& callback) { |
| 143 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 143 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 144 | 144 |
| 145 // TODO(mek): Validate region_id. | 145 // TODO(mek): Validate region_id. |
| 146 | 146 |
| 147 // Look up service worker. In unit tests |service_worker_context_| might not | 147 // Look up service worker. |
| 148 // be set. | 148 ServiceWorkerRegistration* service_worker_registration = |
| 149 if (service_worker_context_.get()) { | 149 service_worker_context_->context()->GetLiveRegistration( |
| 150 ServiceWorkerRegistration* service_worker_registration = | 150 service_worker_registration_id); |
| 151 service_worker_context_->context()->GetLiveRegistration( | 151 if (!service_worker_registration) { |
| 152 service_worker_registration_id); | 152 callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_NO_SERVICE_WORKER); |
| 153 if (!service_worker_registration) { | 153 return; |
| 154 callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_NO_SERVICE_WORKER); | |
| 155 return; | |
| 156 } | |
| 157 } | 154 } |
| 158 | 155 |
| 159 if (!service_->IsServiceAvailable()) { | 156 if (!service_->IsServiceAvailable()) { |
| 160 callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE); | 157 callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE); |
| 161 return; | 158 return; |
| 162 } | 159 } |
| 163 | 160 |
| 164 Registration* registration = | 161 Registration* registration = |
| 165 FindRegistration(service_worker_registration_id, region_id); | 162 FindRegistration(service_worker_registration_id, region_id); |
| 166 if (!registration) { | 163 if (!registration) { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 179 ClearRegistration(registration); | 176 ClearRegistration(registration); |
| 180 callback.Run(GEOFENCING_STATUS_OK); | 177 callback.Run(GEOFENCING_STATUS_OK); |
| 181 } | 178 } |
| 182 | 179 |
| 183 GeofencingStatus GeofencingManager::GetRegisteredRegions( | 180 GeofencingStatus GeofencingManager::GetRegisteredRegions( |
| 184 int64 service_worker_registration_id, | 181 int64 service_worker_registration_id, |
| 185 std::map<std::string, blink::WebCircularGeofencingRegion>* result) { | 182 std::map<std::string, blink::WebCircularGeofencingRegion>* result) { |
| 186 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 183 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 187 CHECK(result); | 184 CHECK(result); |
| 188 | 185 |
| 189 // Look up service worker. In unit tests |service_worker_context_| might not | 186 // Look up service worker. |
| 190 // be set. | 187 ServiceWorkerRegistration* service_worker_registration = |
| 191 if (service_worker_context_.get()) { | 188 service_worker_context_->context()->GetLiveRegistration( |
| 192 ServiceWorkerRegistration* service_worker_registration = | 189 service_worker_registration_id); |
| 193 service_worker_context_->context()->GetLiveRegistration( | 190 if (!service_worker_registration) { |
| 194 service_worker_registration_id); | 191 return GEOFENCING_STATUS_OPERATION_FAILED_NO_SERVICE_WORKER; |
| 195 if (!service_worker_registration) { | |
| 196 return GEOFENCING_STATUS_OPERATION_FAILED_NO_SERVICE_WORKER; | |
| 197 } | |
| 198 } | 192 } |
| 199 | 193 |
| 200 if (!service_->IsServiceAvailable()) { | 194 if (!service_->IsServiceAvailable()) { |
| 201 return GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE; | 195 return GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE; |
| 202 } | 196 } |
| 203 | 197 |
| 204 // Populate result, filtering out inactive registrations. | 198 // Populate result, filtering out inactive registrations. |
| 205 result->clear(); | 199 result->clear(); |
| 206 ServiceWorkerRegistrationsMap::iterator registrations = | 200 ServiceWorkerRegistrationsMap::iterator registrations = |
| 207 registrations_.find(service_worker_registration_id); | 201 registrations_.find(service_worker_registration_id); |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 238 } | 232 } |
| 239 } | 233 } |
| 240 | 234 |
| 241 void GeofencingManager::SetMockPosition(double latitude, double longitude) { | 235 void GeofencingManager::SetMockPosition(double latitude, double longitude) { |
| 242 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 236 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 243 if (!mock_service_) | 237 if (!mock_service_) |
| 244 return; | 238 return; |
| 245 mock_service_->SetMockPosition(latitude, longitude); | 239 mock_service_->SetMockPosition(latitude, longitude); |
| 246 } | 240 } |
| 247 | 241 |
| 242 void GeofencingManager::OnRegistrationDeleted( | |
| 243 int64 service_worker_registration_id, | |
| 244 const GURL& pattern) { | |
| 245 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 246 CleanUpForServiceWorker(service_worker_registration_id); | |
| 247 } | |
| 248 | |
| 248 void GeofencingManager::RegistrationFinished(int64 geofencing_registration_id, | 249 void GeofencingManager::RegistrationFinished(int64 geofencing_registration_id, |
| 249 GeofencingStatus status) { | 250 GeofencingStatus status) { |
| 250 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 251 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 251 Registration* registration = FindRegistrationById(geofencing_registration_id); | 252 Registration* registration = FindRegistrationById(geofencing_registration_id); |
| 252 DCHECK(registration); | 253 DCHECK(registration); |
| 253 DCHECK(!registration->is_active()); | 254 DCHECK(!registration->is_active()); |
| 254 registration->registration_callback.Run(status); | 255 registration->registration_callback.Run(status); |
| 255 registration->registration_callback.Reset(); | 256 registration->registration_callback.Reset(); |
| 256 | 257 |
| 257 // If the registration wasn't succesful, remove it from our storage. | 258 // If the registration wasn't succesful, remove it from our storage. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 321 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 322 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 322 registrations_by_id_.erase(registration->geofencing_registration_id); | 323 registrations_by_id_.erase(registration->geofencing_registration_id); |
| 323 ServiceWorkerRegistrationsMap::iterator registrations_iterator = | 324 ServiceWorkerRegistrationsMap::iterator registrations_iterator = |
| 324 registrations_.find(registration->service_worker_registration_id); | 325 registrations_.find(registration->service_worker_registration_id); |
| 325 DCHECK(registrations_iterator != registrations_.end()); | 326 DCHECK(registrations_iterator != registrations_.end()); |
| 326 registrations_iterator->second.erase(registration->region_id); | 327 registrations_iterator->second.erase(registration->region_id); |
| 327 if (registrations_iterator->second.empty()) | 328 if (registrations_iterator->second.empty()) |
| 328 registrations_.erase(registrations_iterator); | 329 registrations_.erase(registrations_iterator); |
| 329 } | 330 } |
| 330 | 331 |
| 332 void GeofencingManager::CleanUpForServiceWorker( | |
| 333 int64 service_worker_registration_id) { | |
|
michaeln
2015/01/09 22:58:41
id here can be 'invalid', not sure if you want to
Marijn Kruisselbrink
2015/01/09 23:13:15
I'm not sure if that's worth the extra code. It wo
| |
| 334 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 335 ServiceWorkerRegistrationsMap::iterator registrations_iterator = | |
| 336 registrations_.find(service_worker_registration_id); | |
| 337 if (registrations_iterator == registrations_.end()) | |
| 338 return; | |
| 339 | |
| 340 for (const auto& registration : registrations_iterator->second) { | |
| 341 int geofencing_registration_id = | |
| 342 registration.second.geofencing_registration_id; | |
| 343 service_->UnregisterRegion(geofencing_registration_id); | |
| 344 registrations_by_id_.erase(geofencing_registration_id); | |
| 345 } | |
| 346 registrations_.erase(service_worker_registration_id); | |
| 347 } | |
| 348 | |
| 331 void GeofencingManager::DispatchGeofencingEvent( | 349 void GeofencingManager::DispatchGeofencingEvent( |
| 332 blink::WebGeofencingEventType event_type, | 350 blink::WebGeofencingEventType event_type, |
| 333 int64 geofencing_registration_id) { | 351 int64 geofencing_registration_id) { |
| 334 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 352 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 335 Registration* registration = FindRegistrationById(geofencing_registration_id); | 353 Registration* registration = FindRegistrationById(geofencing_registration_id); |
| 336 if (!registration || | 354 if (!registration || |
| 337 registration->service_worker_registration_id == | 355 registration->service_worker_registration_id == |
| 338 kInvalidServiceWorkerRegistrationId) { | 356 kInvalidServiceWorkerRegistrationId) { |
| 339 // TODO(mek): Log/track these failures. | 357 // TODO(mek): Log/track these failures. |
| 340 return; | 358 return; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 390 } | 408 } |
| 391 | 409 |
| 392 void GeofencingManager::DeliverGeofencingEventEnd( | 410 void GeofencingManager::DeliverGeofencingEventEnd( |
| 393 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, | 411 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, |
| 394 ServiceWorkerStatusCode service_worker_status) { | 412 ServiceWorkerStatusCode service_worker_status) { |
| 395 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 413 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 396 // TODO(mek): log/check result. | 414 // TODO(mek): log/check result. |
| 397 } | 415 } |
| 398 | 416 |
| 399 } // namespace content | 417 } // namespace content |
| OLD | NEW |