| Index: content/browser/geofencing/geofencing_manager.cc
|
| diff --git a/content/browser/geofencing/geofencing_manager.cc b/content/browser/geofencing/geofencing_manager.cc
|
| deleted file mode 100644
|
| index e420d5fafd663373f0ec1b52afa88f6f343bb73e..0000000000000000000000000000000000000000
|
| --- a/content/browser/geofencing/geofencing_manager.cc
|
| +++ /dev/null
|
| @@ -1,442 +0,0 @@
|
| -// Copyright 2014 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.
|
| -
|
| -#include "content/browser/geofencing/geofencing_manager.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/callback.h"
|
| -#include "content/browser/geofencing/geofencing_service.h"
|
| -#include "content/browser/geofencing/mock_geofencing_service.h"
|
| -#include "content/browser/service_worker/service_worker_context_wrapper.h"
|
| -#include "content/common/geofencing_messages.h"
|
| -#include "content/common/service_worker/service_worker_messages.h"
|
| -#include "content/public/browser/browser_context.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/storage_partition.h"
|
| -#include "third_party/WebKit/public/platform/WebCircularGeofencingRegion.h"
|
| -#include "third_party/WebKit/public/platform/WebGeofencingEventType.h"
|
| -#include "url/gurl.h"
|
| -
|
| -namespace content {
|
| -
|
| -struct GeofencingManager::Registration {
|
| - Registration(int64_t service_worker_registration_id,
|
| - const GURL& service_worker_origin,
|
| - const std::string& region_id,
|
| - const blink::WebCircularGeofencingRegion& region,
|
| - const StatusCallback& callback,
|
| - int64_t geofencing_registration_id);
|
| - int64_t service_worker_registration_id;
|
| - GURL service_worker_origin;
|
| - std::string region_id;
|
| - blink::WebCircularGeofencingRegion region;
|
| -
|
| - // Registration ID as returned by the |GeofencingService|.
|
| - int64_t geofencing_registration_id;
|
| -
|
| - // Callback to call when registration is completed. This field is reset when
|
| - // registration is complete.
|
| - StatusCallback registration_callback;
|
| -
|
| - // Returns true if registration has been completed, and thus should be
|
| - // included in calls to GetRegisteredRegions.
|
| - bool is_active() const { return registration_callback.is_null(); }
|
| -};
|
| -
|
| -GeofencingManager::Registration::Registration(
|
| - int64_t service_worker_registration_id,
|
| - const GURL& service_worker_origin,
|
| - const std::string& region_id,
|
| - const blink::WebCircularGeofencingRegion& region,
|
| - const GeofencingManager::StatusCallback& callback,
|
| - int64_t geofencing_registration_id)
|
| - : service_worker_registration_id(service_worker_registration_id),
|
| - service_worker_origin(service_worker_origin),
|
| - region_id(region_id),
|
| - region(region),
|
| - geofencing_registration_id(geofencing_registration_id),
|
| - registration_callback(callback) {}
|
| -
|
| -GeofencingManager::GeofencingManager(
|
| - const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context)
|
| - : service_(nullptr), service_worker_context_(service_worker_context) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -}
|
| -
|
| -GeofencingManager::~GeofencingManager() {
|
| -}
|
| -
|
| -void GeofencingManager::Init() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - BrowserThread::PostTask(BrowserThread::IO,
|
| - FROM_HERE,
|
| - base::Bind(&GeofencingManager::InitOnIO, this));
|
| -}
|
| -
|
| -void GeofencingManager::Shutdown() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - BrowserThread::PostTask(BrowserThread::IO,
|
| - FROM_HERE,
|
| - base::Bind(&GeofencingManager::ShutdownOnIO, this));
|
| -}
|
| -
|
| -void GeofencingManager::InitOnIO() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - service_worker_context_->AddObserver(this);
|
| - if (!service_)
|
| - service_ = GeofencingServiceImpl::GetInstance();
|
| -}
|
| -
|
| -void GeofencingManager::ShutdownOnIO() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - service_worker_context_->RemoveObserver(this);
|
| - // Clean up all registrations with the |GeofencingService|.
|
| - // TODO(mek): This will need to change to support geofence registrations that
|
| - // outlive the browser, although removing the references to this
|
| - // |GeofencingManager| from the |GeofencingService| will still be needed.
|
| - for (const auto& registration : registrations_by_id_)
|
| - service_->UnregisterRegion(registration.first);
|
| -}
|
| -
|
| -void GeofencingManager::RegisterRegion(
|
| - int64_t service_worker_registration_id,
|
| - const std::string& region_id,
|
| - const blink::WebCircularGeofencingRegion& region,
|
| - const StatusCallback& callback) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| -
|
| - // TODO(mek): Validate region_id and region.
|
| -
|
| - // Look up service worker.
|
| - ServiceWorkerRegistration* service_worker_registration =
|
| - service_worker_context_->GetLiveRegistration(
|
| - service_worker_registration_id);
|
| - if (!service_worker_registration) {
|
| - callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_NO_SERVICE_WORKER);
|
| - return;
|
| - }
|
| -
|
| - GURL service_worker_origin =
|
| - service_worker_registration->pattern().GetOrigin();
|
| -
|
| - if (!service_->IsServiceAvailable()) {
|
| - callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE);
|
| - return;
|
| - }
|
| -
|
| - if (FindRegistration(service_worker_registration_id, region_id)) {
|
| - // Already registered, return an error.
|
| - // TODO(mek): Use a more specific error code.
|
| - callback.Run(GEOFENCING_STATUS_ERROR);
|
| - return;
|
| - }
|
| -
|
| - AddRegistration(service_worker_registration_id, service_worker_origin,
|
| - region_id, region, callback,
|
| - service_->RegisterRegion(region, this));
|
| -}
|
| -
|
| -void GeofencingManager::UnregisterRegion(int64_t service_worker_registration_id,
|
| - const std::string& region_id,
|
| - const StatusCallback& callback) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| -
|
| - // TODO(mek): Validate region_id.
|
| -
|
| - // Look up service worker.
|
| - ServiceWorkerRegistration* service_worker_registration =
|
| - service_worker_context_->GetLiveRegistration(
|
| - service_worker_registration_id);
|
| - if (!service_worker_registration) {
|
| - callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_NO_SERVICE_WORKER);
|
| - return;
|
| - }
|
| -
|
| - if (!service_->IsServiceAvailable()) {
|
| - callback.Run(GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE);
|
| - return;
|
| - }
|
| -
|
| - Registration* registration =
|
| - FindRegistration(service_worker_registration_id, region_id);
|
| - if (!registration) {
|
| - // Not registered, return an error.
|
| - callback.Run(GEOFENCING_STATUS_UNREGISTRATION_FAILED_NOT_REGISTERED);
|
| - return;
|
| - }
|
| -
|
| - if (!registration->is_active()) {
|
| - // Started registration, but not completed yet, error.
|
| - callback.Run(GEOFENCING_STATUS_UNREGISTRATION_FAILED_NOT_REGISTERED);
|
| - return;
|
| - }
|
| -
|
| - service_->UnregisterRegion(registration->geofencing_registration_id);
|
| - ClearRegistration(registration);
|
| - callback.Run(GEOFENCING_STATUS_OK);
|
| -}
|
| -
|
| -GeofencingStatus GeofencingManager::GetRegisteredRegions(
|
| - int64_t service_worker_registration_id,
|
| - std::map<std::string, blink::WebCircularGeofencingRegion>* result) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - CHECK(result);
|
| -
|
| - // Look up service worker.
|
| - ServiceWorkerRegistration* service_worker_registration =
|
| - service_worker_context_->GetLiveRegistration(
|
| - service_worker_registration_id);
|
| - if (!service_worker_registration) {
|
| - return GEOFENCING_STATUS_OPERATION_FAILED_NO_SERVICE_WORKER;
|
| - }
|
| -
|
| - if (!service_->IsServiceAvailable()) {
|
| - return GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE;
|
| - }
|
| -
|
| - // Populate result, filtering out inactive registrations.
|
| - result->clear();
|
| - ServiceWorkerRegistrationsMap::iterator registrations =
|
| - registrations_.find(service_worker_registration_id);
|
| - if (registrations == registrations_.end())
|
| - return GEOFENCING_STATUS_OK;
|
| - for (const auto& registration : registrations->second) {
|
| - if (registration.second.is_active())
|
| - (*result)[registration.first] = registration.second.region;
|
| - }
|
| - return GEOFENCING_STATUS_OK;
|
| -}
|
| -
|
| -void GeofencingManager::SetMockProvider(GeofencingMockState mock_state) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| -
|
| - // TODO(mek): It would be nice if enabling the mock geofencing service
|
| - // wouldn't completely delete all existing registrations but instead just
|
| - // somehow keep them around but inactive.
|
| - // For now mocking is only used in layout tests, so just clearing all
|
| - // registrations works good enough.
|
| - for (const auto& registration : registrations_by_id_)
|
| - service_->UnregisterRegion(registration.first);
|
| - registrations_by_id_.clear();
|
| - registrations_.clear();
|
| -
|
| - // Then set or reset the mock service for the service worker.
|
| - if (mock_state == GeofencingMockState::NONE) {
|
| - service_ = GeofencingServiceImpl::GetInstance();
|
| - mock_service_.reset();
|
| - } else {
|
| - mock_service_.reset(new MockGeofencingService(
|
| - mock_state != GeofencingMockState::SERVICE_UNAVAILABLE));
|
| - service_ = mock_service_.get();
|
| - }
|
| -}
|
| -
|
| -void GeofencingManager::SetMockPosition(double latitude, double longitude) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - if (!mock_service_)
|
| - return;
|
| - mock_service_->SetMockPosition(latitude, longitude);
|
| -}
|
| -
|
| -void GeofencingManager::OnRegistrationDeleted(
|
| - int64_t service_worker_registration_id,
|
| - const GURL& pattern) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - CleanUpForServiceWorker(service_worker_registration_id);
|
| -}
|
| -
|
| -void GeofencingManager::RegistrationFinished(int64_t geofencing_registration_id,
|
| - GeofencingStatus status) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - Registration* registration = FindRegistrationById(geofencing_registration_id);
|
| - DCHECK(registration);
|
| - DCHECK(!registration->is_active());
|
| - registration->registration_callback.Run(status);
|
| - registration->registration_callback.Reset();
|
| -
|
| - // If the registration wasn't succesful, remove it from our storage.
|
| - if (status != GEOFENCING_STATUS_OK)
|
| - ClearRegistration(registration);
|
| -}
|
| -
|
| -void GeofencingManager::RegionEntered(int64_t geofencing_registration_id) {
|
| - DispatchGeofencingEvent(blink::WebGeofencingEventTypeEnter,
|
| - geofencing_registration_id);
|
| -}
|
| -
|
| -void GeofencingManager::RegionExited(int64_t geofencing_registration_id) {
|
| - DispatchGeofencingEvent(blink::WebGeofencingEventTypeLeave,
|
| - geofencing_registration_id);
|
| -}
|
| -
|
| -GeofencingManager::Registration* GeofencingManager::FindRegistration(
|
| - int64_t service_worker_registration_id,
|
| - const std::string& region_id) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - ServiceWorkerRegistrationsMap::iterator registrations_iterator =
|
| - registrations_.find(service_worker_registration_id);
|
| - if (registrations_iterator == registrations_.end())
|
| - return nullptr;
|
| - RegionIdRegistrationMap::iterator registration =
|
| - registrations_iterator->second.find(region_id);
|
| - if (registration == registrations_iterator->second.end())
|
| - return nullptr;
|
| - return ®istration->second;
|
| -}
|
| -
|
| -GeofencingManager::Registration* GeofencingManager::FindRegistrationById(
|
| - int64_t geofencing_registration_id) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - RegistrationIdRegistrationMap::iterator registration_iterator =
|
| - registrations_by_id_.find(geofencing_registration_id);
|
| - if (registration_iterator == registrations_by_id_.end())
|
| - return nullptr;
|
| - return ®istration_iterator->second->second;
|
| -}
|
| -
|
| -GeofencingManager::Registration& GeofencingManager::AddRegistration(
|
| - int64_t service_worker_registration_id,
|
| - const GURL& service_worker_origin,
|
| - const std::string& region_id,
|
| - const blink::WebCircularGeofencingRegion& region,
|
| - const StatusCallback& callback,
|
| - int64_t geofencing_registration_id) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - DCHECK(!FindRegistration(service_worker_registration_id, region_id));
|
| - RegionIdRegistrationMap::iterator registration =
|
| - registrations_[service_worker_registration_id]
|
| - .insert(std::make_pair(region_id,
|
| - Registration(service_worker_registration_id,
|
| - service_worker_origin,
|
| - region_id,
|
| - region,
|
| - callback,
|
| - geofencing_registration_id)))
|
| - .first;
|
| - registrations_by_id_[geofencing_registration_id] = registration;
|
| - return registration->second;
|
| -}
|
| -
|
| -void GeofencingManager::ClearRegistration(Registration* registration) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - registrations_by_id_.erase(registration->geofencing_registration_id);
|
| - ServiceWorkerRegistrationsMap::iterator registrations_iterator =
|
| - registrations_.find(registration->service_worker_registration_id);
|
| - DCHECK(registrations_iterator != registrations_.end());
|
| - registrations_iterator->second.erase(registration->region_id);
|
| - if (registrations_iterator->second.empty())
|
| - registrations_.erase(registrations_iterator);
|
| -}
|
| -
|
| -void GeofencingManager::CleanUpForServiceWorker(
|
| - int64_t service_worker_registration_id) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - ServiceWorkerRegistrationsMap::iterator registrations_iterator =
|
| - registrations_.find(service_worker_registration_id);
|
| - if (registrations_iterator == registrations_.end())
|
| - return;
|
| -
|
| - for (const auto& registration : registrations_iterator->second) {
|
| - int geofencing_registration_id =
|
| - registration.second.geofencing_registration_id;
|
| - service_->UnregisterRegion(geofencing_registration_id);
|
| - registrations_by_id_.erase(geofencing_registration_id);
|
| - }
|
| - registrations_.erase(service_worker_registration_id);
|
| -}
|
| -
|
| -void GeofencingManager::DispatchGeofencingEvent(
|
| - blink::WebGeofencingEventType event_type,
|
| - int64_t geofencing_registration_id) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - Registration* registration = FindRegistrationById(geofencing_registration_id);
|
| - if (!registration ||
|
| - registration->service_worker_registration_id ==
|
| - kInvalidServiceWorkerRegistrationId) {
|
| - // TODO(mek): Log/track these failures.
|
| - return;
|
| - }
|
| -
|
| - service_worker_context_->FindReadyRegistrationForId(
|
| - registration->service_worker_registration_id,
|
| - registration->service_worker_origin,
|
| - base::Bind(&GeofencingManager::DeliverGeofencingEvent,
|
| - this,
|
| - event_type,
|
| - geofencing_registration_id));
|
| -}
|
| -
|
| -void GeofencingManager::DeliverGeofencingEvent(
|
| - blink::WebGeofencingEventType event_type,
|
| - int64_t geofencing_registration_id,
|
| - ServiceWorkerStatusCode service_worker_status,
|
| - const scoped_refptr<ServiceWorkerRegistration>&
|
| - service_worker_registration) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - Registration* registration = FindRegistrationById(geofencing_registration_id);
|
| - if (!registration) {
|
| - // Geofence got unregistered in the meantime, no longer need to deliver
|
| - // event.
|
| - return;
|
| - }
|
| -
|
| - if (service_worker_status != SERVICE_WORKER_OK) {
|
| - // TODO(mek): SW no longer exists, somehow handle this.
|
| - return;
|
| - }
|
| -
|
| - ServiceWorkerVersion* active_version =
|
| - service_worker_registration->active_version();
|
| - DCHECK(active_version);
|
| -
|
| - // Hold on to the service worker registration in the callback to keep it alive
|
| - // until the callback dies. Otherwise the registration could be released when
|
| - // this method returns - before the event is delivered to the service worker.
|
| - active_version->RunAfterStartWorker(
|
| - ServiceWorkerMetrics::EventType::GEOFENCING,
|
| - base::Bind(&GeofencingManager::DeliverEventToRunningWorker, this,
|
| - service_worker_registration, event_type,
|
| - registration->region_id, registration->region,
|
| - make_scoped_refptr(active_version)),
|
| - base::Bind(&GeofencingManager::OnEventError, this));
|
| -}
|
| -
|
| -void GeofencingManager::DeliverEventToRunningWorker(
|
| - const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration,
|
| - blink::WebGeofencingEventType event_type,
|
| - const std::string& region_id,
|
| - const blink::WebCircularGeofencingRegion& region,
|
| - const scoped_refptr<ServiceWorkerVersion>& worker) {
|
| - int request_id =
|
| - worker->StartRequest(ServiceWorkerMetrics::EventType::GEOFENCING,
|
| - base::Bind(&GeofencingManager::OnEventError, this));
|
| -
|
| - worker->DispatchEvent<ServiceWorkerHostMsg_GeofencingEventFinished>(
|
| - request_id, ServiceWorkerMsg_GeofencingEvent(request_id, event_type,
|
| - region_id, region),
|
| - base::Bind(&GeofencingManager::OnEventResponse, this, worker,
|
| - service_worker_registration));
|
| -}
|
| -
|
| -void GeofencingManager::OnEventResponse(
|
| - const scoped_refptr<ServiceWorkerVersion>& worker,
|
| - const scoped_refptr<ServiceWorkerRegistration>& registration,
|
| - int request_id,
|
| - blink::WebServiceWorkerEventResult result) {
|
| - bool finish_result = worker->FinishRequest(
|
| - request_id, result == blink::WebServiceWorkerEventResultCompleted);
|
| - DCHECK(finish_result)
|
| - << "No messages should be passed to handler if request had "
|
| - "already finished";
|
| - // TODO(mek): log/check result.
|
| -}
|
| -
|
| -void GeofencingManager::OnEventError(
|
| - ServiceWorkerStatusCode service_worker_status) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - // TODO(mek): log/check errors.
|
| -}
|
| -
|
| -} // namespace content
|
|
|