// 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; $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS { Future getCurrentPosition({bool$NULLABLE enableHighAccuracy, Duration$NULLABLE timeout, Duration$NULLABLE 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(); try { _getCurrentPosition( (position) { completer.complete(_ensurePosition(position)); }, (error) { completer.completeError(error); }, options); } catch (e, stacktrace) { completer.completeError(e, stacktrace); } return completer.future; } Stream watchPosition({bool$NULLABLE enableHighAccuracy, Duration$NULLABLE timeout, Duration$NULLABLE maximumAge}) { var options = {}; if (enableHighAccuracy != null) { options['enableHighAccuracy'] = enableHighAccuracy; } if (timeout != null) { options['timeout'] = timeout.inMilliseconds; } if (maximumAge != null) { options['maximumAge'] = maximumAge.inMilliseconds; } int$NULLABLE watchId; StreamController controller = new StreamController(sync: true, onCancel: () { assert(watchId != null); _clearWatch(watchId$NULLASSERT); } ); controller.onListen = () { assert(watchId == null); watchId = _watchPosition( (position) { controller.add(_ensurePosition(position)); }, (error) { controller.addError(error); }, options); }; 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); }