| // Copyright 2015 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| var last_position = 0; |
| var last_error = 0; |
| var watch_id = 0; |
| var position_initialized = false; |
| var position_updated = false; |
| |
| const callbackStatuses = new ResultQueue(); |
| const geopositionUpdates = new ResultQueue(); |
| |
| function resetState() { |
| last_position = 0; |
| last_error = 0; |
| watch_id = 0; |
| position_initialized = false; |
| position_updated = false; |
| } |
| function geoSuccessCallback(position) { |
| last_position = position; |
| } |
| function geoErrorCallback(error) { |
| last_error = error; |
| } |
| function geoSuccessCallbackWithResponse(position) { |
| last_position = position; |
| |
| callbackStatuses.push('request-callback-success'); |
| if (!position_initialized) { // First time callback invoked. |
| position_initialized = true; |
| return; |
| } |
| |
| if (!position_updated) { // Second time callback invoked. |
| position_updated = true; |
| geopositionUpdates.push('geoposition-updated'); |
| } |
| } |
| function geoErrorCallbackWithResponse(error) { |
| last_error = error; |
| callbackStatuses.push('request-callback-error'); |
| } |
| function geoStart() { |
| resetState(); |
| watch_id = navigator.geolocation.watchPosition( |
| geoSuccessCallback, geoErrorCallback, |
| {maximumAge:600000, timeout:100000, enableHighAccuracy:true}); |
| return watch_id; |
| } |
| function geoStartWithAsyncResponse() { |
| resetState(); |
| navigator.geolocation.watchPosition( |
| geoSuccessCallbackWithResponse, geoErrorCallbackWithResponse, |
| {maximumAge:600000, timeout:100000, enableHighAccuracy:true}); |
| return callbackStatuses.pop(); |
| } |
| function geoStartWithSyncResponse() { |
| resetState(); |
| navigator.geolocation.watchPosition( |
| geoSuccessCallback, geoErrorCallback, |
| {maximumAge:600000, timeout:100000, enableHighAccuracy:true}); |
| return 'requested'; |
| } |
| function geoGetLastPositionLatitude() { |
| return "" + last_position.coords.latitude; |
| } |
| function geoGetLastPositionLongitude() { |
| return "" + last_position.coords.longitude; |
| } |
| function geoGetLastError() { |
| return "" + (last_error ? last_error.code : 0); |
| } |
| function geoAccessNavigatorGeolocation() { |
| return "" + typeof(navigator.geolocation); |
| } |
| function requestPermissionAndRespond() { |
| navigator.geolocation.getCurrentPosition((()=>{})); |
| return sendResultToTest('requested'); |
| } |