| Index: content/browser/geolocation/geolocation_provider.cc
|
| diff --git a/content/browser/geolocation/geolocation_provider.cc b/content/browser/geolocation/geolocation_provider.cc
|
| index da592e205a92fa36a84e3c5dc3c78383d98e6786..f1d2dd59440d34a100f2d04303b64baef62ad6d7 100644
|
| --- a/content/browser/geolocation/geolocation_provider.cc
|
| +++ b/content/browser/geolocation/geolocation_provider.cc
|
| @@ -16,26 +16,6 @@
|
|
|
| using content::BrowserThread;
|
|
|
| -GeolocationProvider* GeolocationProvider::GetInstance() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - return Singleton<GeolocationProvider>::get();
|
| -}
|
| -
|
| -GeolocationProvider::GeolocationProvider()
|
| - : base::Thread("Geolocation"),
|
| - is_permission_granted_(false),
|
| - ignore_location_updates_(false),
|
| - arbitrator_(NULL) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -}
|
| -
|
| -GeolocationProvider::~GeolocationProvider() {
|
| - // All observers should have unregistered before this singleton is destructed.
|
| - DCHECK(observers_.empty());
|
| - Stop();
|
| - DCHECK(!arbitrator_);
|
| -}
|
| -
|
| void GeolocationProvider::AddObserver(GeolocationObserver* observer,
|
| const GeolocationObserverOptions& update_options) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| @@ -62,6 +42,63 @@ void GeolocationProvider::RequestCallback(
|
| OnPermissionGranted();
|
| }
|
|
|
| +void GeolocationProvider::OnPermissionGranted() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + bool was_permission_granted = is_permission_granted_;
|
| + is_permission_granted_ = true;
|
| + if (IsRunning() && !was_permission_granted)
|
| + InformProvidersPermissionGranted();
|
| +}
|
| +
|
| +bool GeolocationProvider::HasPermissionBeenGranted() const {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + return is_permission_granted_;
|
| +}
|
| +
|
| +void GeolocationProvider::OnLocationUpdate(
|
| + const content::Geoposition& position) {
|
| + DCHECK(OnGeolocationThread());
|
| + // Will be true only in testing.
|
| + if (ignore_location_updates_)
|
| + return;
|
| + BrowserThread::PostTask(BrowserThread::IO,
|
| + FROM_HERE,
|
| + base::Bind(&GeolocationProvider::NotifyClients,
|
| + base::Unretained(this), position));
|
| +}
|
| +
|
| +void GeolocationProvider::OverrideLocationForTesting(
|
| + const content::Geoposition& position) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + position_ = position;
|
| + ignore_location_updates_ = true;
|
| + NotifyClients(position);
|
| +}
|
| +
|
| +GeolocationProvider* GeolocationProvider::GetInstance() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + return Singleton<GeolocationProvider>::get();
|
| +}
|
| +
|
| +GeolocationProvider::GeolocationProvider()
|
| + : base::Thread("Geolocation"),
|
| + is_permission_granted_(false),
|
| + ignore_location_updates_(false),
|
| + arbitrator_(NULL) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +}
|
| +
|
| +GeolocationProvider::~GeolocationProvider() {
|
| + // All observers should have unregistered before this singleton is destructed.
|
| + DCHECK(observers_.empty());
|
| + Stop();
|
| + DCHECK(!arbitrator_);
|
| +}
|
| +
|
| +bool GeolocationProvider::OnGeolocationThread() const {
|
| + return MessageLoop::current() == message_loop();
|
| +}
|
| +
|
| void GeolocationProvider::OnClientsChanged() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| base::Closure task;
|
| @@ -91,6 +128,33 @@ void GeolocationProvider::OnClientsChanged() {
|
| message_loop()->PostTask(FROM_HERE, task);
|
| }
|
|
|
| +void GeolocationProvider::StopProviders() {
|
| + DCHECK(OnGeolocationThread());
|
| + DCHECK(arbitrator_);
|
| + arbitrator_->StopProviders();
|
| +}
|
| +
|
| +void GeolocationProvider::StartProviders(
|
| + const GeolocationObserverOptions& options) {
|
| + DCHECK(OnGeolocationThread());
|
| + DCHECK(arbitrator_);
|
| + arbitrator_->StartProviders(options);
|
| +}
|
| +
|
| +void GeolocationProvider::InformProvidersPermissionGranted() {
|
| + DCHECK(IsRunning());
|
| + if (!OnGeolocationThread()) {
|
| + message_loop()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&GeolocationProvider::InformProvidersPermissionGranted,
|
| + base::Unretained(this)));
|
| + return;
|
| + }
|
| + DCHECK(OnGeolocationThread());
|
| + DCHECK(arbitrator_);
|
| + arbitrator_->OnPermissionGranted();
|
| +}
|
| +
|
| void GeolocationProvider::NotifyClients(const content::Geoposition& position) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| DCHECK(position.Validate() ||
|
| @@ -117,41 +181,6 @@ void GeolocationProvider::NotifyClients(const content::Geoposition& position) {
|
| }
|
| }
|
|
|
| -void GeolocationProvider::StartProviders(
|
| - const GeolocationObserverOptions& options) {
|
| - DCHECK(OnGeolocationThread());
|
| - DCHECK(arbitrator_);
|
| - arbitrator_->StartProviders(options);
|
| -}
|
| -
|
| -void GeolocationProvider::StopProviders() {
|
| - DCHECK(OnGeolocationThread());
|
| - DCHECK(arbitrator_);
|
| - arbitrator_->StopProviders();
|
| -}
|
| -
|
| -void GeolocationProvider::OnPermissionGranted() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - bool was_permission_granted = is_permission_granted_;
|
| - is_permission_granted_ = true;
|
| - if (IsRunning() && !was_permission_granted)
|
| - InformProvidersPermissionGranted();
|
| -}
|
| -
|
| -void GeolocationProvider::InformProvidersPermissionGranted() {
|
| - DCHECK(IsRunning());
|
| - if (!OnGeolocationThread()) {
|
| - message_loop()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&GeolocationProvider::InformProvidersPermissionGranted,
|
| - base::Unretained(this)));
|
| - return;
|
| - }
|
| - DCHECK(OnGeolocationThread());
|
| - DCHECK(arbitrator_);
|
| - arbitrator_->OnPermissionGranted();
|
| -}
|
| -
|
| void GeolocationProvider::Init() {
|
| DCHECK(OnGeolocationThread());
|
| DCHECK(!arbitrator_);
|
| @@ -163,32 +192,3 @@ void GeolocationProvider::CleanUp() {
|
| delete arbitrator_;
|
| arbitrator_ = NULL;
|
| }
|
| -
|
| -void GeolocationProvider::OnLocationUpdate(
|
| - const content::Geoposition& position) {
|
| - DCHECK(OnGeolocationThread());
|
| - // Will be true only in testing.
|
| - if (ignore_location_updates_)
|
| - return;
|
| - BrowserThread::PostTask(BrowserThread::IO,
|
| - FROM_HERE,
|
| - base::Bind(&GeolocationProvider::NotifyClients,
|
| - base::Unretained(this), position));
|
| -}
|
| -
|
| -void GeolocationProvider::OverrideLocationForTesting(
|
| - const content::Geoposition& position) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - position_ = position;
|
| - ignore_location_updates_ = true;
|
| - NotifyClients(position);
|
| -}
|
| -
|
| -bool GeolocationProvider::HasPermissionBeenGranted() const {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - return is_permission_granted_;
|
| -}
|
| -
|
| -bool GeolocationProvider::OnGeolocationThread() const {
|
| - return MessageLoop::current() == message_loop();
|
| -}
|
|
|