103 lines
3.0 KiB
Plaintext
103 lines
3.0 KiB
Plaintext
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
part of $LIBRARYNAME;
|
|
|
|
@DocsEditable()
|
|
$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
|
|
|
|
@DomName('Geolocation.getCurrentPosition')
|
|
Future<Geoposition> getCurrentPosition({bool enableHighAccuracy,
|
|
Duration timeout, Duration maximumAge}) {
|
|
var options = {};
|
|
if (enableHighAccuracy != null) {
|
|
options['enableHighAccuracy'] = enableHighAccuracy;
|
|
}
|
|
if (timeout != null) {
|
|
options['timeout'] = timeout.inMilliseconds;
|
|
}
|
|
if (maximumAge != null) {
|
|
options['maximumAge'] = maximumAge.inMilliseconds;
|
|
}
|
|
var completer = new Completer<Geoposition>();
|
|
try {
|
|
_getCurrentPosition(
|
|
(position) {
|
|
completer.complete(_ensurePosition(position));
|
|
},
|
|
(error) {
|
|
completer.completeError(error);
|
|
},
|
|
options);
|
|
} catch (e, stacktrace) {
|
|
completer.completeError(e, stacktrace);
|
|
}
|
|
return completer.future;
|
|
}
|
|
|
|
@DomName('Geolocation.watchPosition')
|
|
Stream<Geoposition> watchPosition({bool enableHighAccuracy,
|
|
Duration timeout, Duration maximumAge}) {
|
|
|
|
var options = {};
|
|
if (enableHighAccuracy != null) {
|
|
options['enableHighAccuracy'] = enableHighAccuracy;
|
|
}
|
|
if (timeout != null) {
|
|
options['timeout'] = timeout.inMilliseconds;
|
|
}
|
|
if (maximumAge != null) {
|
|
options['maximumAge'] = maximumAge.inMilliseconds;
|
|
}
|
|
|
|
int watchId;
|
|
// TODO(jacobr): it seems like a bug that we have to specifiy the static
|
|
// type here for controller.stream to have the right type.
|
|
// dartbug.com/26278
|
|
StreamController<Geoposition> controller;
|
|
controller = new StreamController<Geoposition>(sync: true,
|
|
onListen: () {
|
|
assert(watchId == null);
|
|
watchId = _watchPosition(
|
|
(position) {
|
|
controller.add(_ensurePosition(position));
|
|
},
|
|
(error) {
|
|
controller.addError(error);
|
|
},
|
|
options);
|
|
},
|
|
onCancel: () {
|
|
assert(watchId != null);
|
|
_clearWatch(watchId);
|
|
});
|
|
|
|
return controller.stream;
|
|
}
|
|
|
|
Geoposition _ensurePosition(domPosition) {
|
|
try {
|
|
// Firefox may throw on this.
|
|
if (domPosition is Geoposition) {
|
|
return domPosition;
|
|
}
|
|
} catch(e) {}
|
|
return new _GeopositionWrapper(domPosition);
|
|
}
|
|
|
|
$!MEMBERS}
|
|
|
|
/**
|
|
* Wrapper for Firefox- it returns an object which we cannot map correctly.
|
|
* Basically Firefox was returning a [xpconnect wrapped nsIDOMGeoPosition] but
|
|
* which has further oddities.
|
|
*/
|
|
class _GeopositionWrapper implements Geoposition {
|
|
var _ptr;
|
|
_GeopositionWrapper(this._ptr);
|
|
|
|
Coordinates get coords => JS('Coordinates', '#.coords', _ptr);
|
|
int get timestamp => JS('int', '#.timestamp', _ptr);
|
|
}
|