| Index: content/browser/geolocation/geolocation_service_impl.cc
|
| diff --git a/content/browser/geolocation/geolocation_service_impl.cc b/content/browser/geolocation/geolocation_service_impl.cc
|
| index 4c855f27046541b5ede834728846617cbd5b07b2..662319f1582cfbdd6448d2b591640866c7f40ba3 100644
|
| --- a/content/browser/geolocation/geolocation_service_impl.cc
|
| +++ b/content/browser/geolocation/geolocation_service_impl.cc
|
| @@ -63,7 +63,8 @@ GeolocationServiceImpl::GeolocationServiceImpl(
|
| const base::Closure& update_callback)
|
| : context_(context),
|
| update_callback_(update_callback),
|
| - high_accuracy_(false) {
|
| + high_accuracy_(false),
|
| + has_position_to_report_(false) {
|
| DCHECK(context_);
|
| }
|
|
|
| @@ -105,6 +106,14 @@ void GeolocationServiceImpl::SetHighAccuracy(bool high_accuracy) {
|
| StartListeningForUpdates();
|
| }
|
|
|
| +void GeolocationServiceImpl::QueryNextPosition(
|
| + const PositionCallback& callback) {
|
| + position_callbacks_.push_back(callback);
|
| +
|
| + if (has_position_to_report_)
|
| + ReportCurrentPosition();
|
| +}
|
| +
|
| void GeolocationServiceImpl::SetOverride(const Geoposition& position) {
|
| position_override_ = position;
|
| if (!position_override_.Validate()) {
|
| @@ -135,21 +144,32 @@ void GeolocationServiceImpl::OnLocationUpdate(const Geoposition& position) {
|
| if (context_->paused())
|
| return;
|
|
|
| - MojoGeopositionPtr geoposition(MojoGeoposition::New());
|
| - geoposition->valid = position.Validate();
|
| - geoposition->latitude = position.latitude;
|
| - geoposition->longitude = position.longitude;
|
| - geoposition->altitude = position.altitude;
|
| - geoposition->accuracy = position.accuracy;
|
| - geoposition->altitude_accuracy = position.altitude_accuracy;
|
| - geoposition->heading = position.heading;
|
| - geoposition->speed = position.speed;
|
| - geoposition->timestamp = position.timestamp.ToDoubleT();
|
| - geoposition->error_code = MojoGeoposition::ErrorCode(position.error_code);
|
| - geoposition->error_message = position.error_message;
|
| -
|
| update_callback_.Run();
|
| - client()->OnLocationUpdate(geoposition.Pass());
|
| +
|
| + current_position_.valid = position.Validate();
|
| + current_position_.latitude = position.latitude;
|
| + current_position_.longitude = position.longitude;
|
| + current_position_.altitude = position.altitude;
|
| + current_position_.accuracy = position.accuracy;
|
| + current_position_.altitude_accuracy = position.altitude_accuracy;
|
| + current_position_.heading = position.heading;
|
| + current_position_.speed = position.speed;
|
| + current_position_.timestamp = position.timestamp.ToDoubleT();
|
| + current_position_.error_code =
|
| + MojoGeoposition::ErrorCode(position.error_code);
|
| + current_position_.error_message = position.error_message;
|
| +
|
| + has_position_to_report_ = true;
|
| +
|
| + if (!position_callbacks_.empty())
|
| + ReportCurrentPosition();
|
| +}
|
| +
|
| +void GeolocationServiceImpl::ReportCurrentPosition() {
|
| + for (const auto& callback : position_callbacks_)
|
| + callback.Run(current_position_.Clone());
|
| + position_callbacks_.clear();
|
| + has_position_to_report_ = false;
|
| }
|
|
|
| } // namespace content
|
|
|