| // 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)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { |
| |
| @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 { |
| $dom_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; |
| var controller; |
| controller = new StreamController<Geoposition>(sync: true, |
| onListen: () { |
| assert(watchId == null); |
| watchId = $dom_watchPosition( |
| (position) { |
| controller.add(_ensurePosition(position)); |
| }, |
| (error) { |
| controller.addError(error); |
| }, |
| options); |
| }, |
| onCancel: () { |
| assert(watchId != null); |
| $dom_clearWatch(watchId); |
| }); |
| |
| return controller.stream; |
| } |
| |
| Geoposition _ensurePosition(domPosition) { |
| $if DART2JS |
| try { |
| // Firefox may throw on this. |
| if (domPosition is Geoposition) { |
| return domPosition; |
| } |
| } catch(e) {} |
| return new _GeopositionWrapper(domPosition); |
| $else |
| return domPosition; |
| $endif |
| } |
| |
| $!MEMBERS} |
| |
| $if DART2JS |
| /** |
| * 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); |
| } |
| $endif |
| |
| |