910e62b5创建于 1月15日历史提交
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module device.mojom;

import "mojo/public/mojom/base/time.mojom";

// Sentinel values to mark invalid data. (WebKit carries companion is_valid
// bools for this purpose; we may eventually follow that approach, but
// sentinels worked OK in the Gears code this is based on.)
const double kBadLatitudeLongitude = 200;
// Lowest point on land is at approximately -400 meters.
const double kBadAltitude = -10000;
const double kBadAccuracy = -1;  // Accuracy must be non-negative.
const double kBadHeading = -1;   // Heading must be non-negative.
const double kBadSpeed = -1;

// Error messages for GeopositionError.
// TODO(crbug.com/351865287): These can be removed once `error_message` is
// removed from `GeopositionError`.
const string kGeoPermissionDeniedErrorMessage =
    "User denied geolocation permission";
const string kGeoPositionUnavailableErrorMessage =
    "Position update is unavailable";

// A Geoposition represents a position fix. It was originally derived from:
// http://gears.googlecode.com/svn/trunk/gears/geolocation/geolocation.h
struct Geoposition {
  // These properties correspond to those of the JavaScript Position object
  // although their types may differ.
  // Latitude in decimal degrees north (WGS84 coordinate frame).
  double latitude = kBadLatitudeLongitude;
  // Longitude in decimal degrees west (WGS84 coordinate frame).
  double longitude = kBadLatitudeLongitude;
  // Altitude in meters (above WGS84 datum).
  double altitude = kBadAltitude;
  // Accuracy of horizontal position in meters.
  double accuracy = kBadAccuracy;
  // Accuracy of altitude in meters.
  double altitude_accuracy = kBadAccuracy;
  // Heading in decimal degrees clockwise from true north.
  double heading = kBadHeading;
  // Horizontal component of device velocity in meters per second.
  double speed = kBadSpeed;
  // Time of position measurement in seconds since the Windows FILETIME epoch
  // (1601-01-01 00:00:00 UTC). This is taken from the host computer's system
  // clock (i.e. from Time::Now(), not the source device's clock).
  mojo_base.mojom.Time timestamp;
  // Indicates whether the location is precise or approximate. The default
  // value is true because all created position are considered precise
  // before the feature of `kApproximateGeolocationPermission`.
  bool is_precise = true;
};

// Error codes shared between W3C geolocation specification and platform
// specific implementations. W3C codes can be returned to JavaScript without the
// need for a conversion.
enum GeopositionErrorCode {
  // W3C geolocation specification defined error codes.
  kPermissionDenied = 1,
  kPositionUnavailable = 2,
  // macOS-specific error codes.
  // When `LocationProviderManager` received `kWifiDisabled` from
  // `CoreLocationProvider`, that means Wi-Fi is disabled but user's machine
  // still has avalailable network (everything other than Wi-Fi). It will then
  // initiate fallback mechanism and start `NetworkLocationProvider`.
  kWifiDisabled = 3
};

// A GeopositionError communicates the reason why the Geolocation service could
// not return a position estimate.
struct GeopositionError {
  // Error code, see enum above.
  GeopositionErrorCode error_code;
  // Human-readable error message.
  string error_message;
  // Technical detail of the error.
  string error_technical;
};

// The result from querying the Geolocation service for the next position
// estimate. A GeopositionResult contains either a position estimate or an
// error, but not both.
union GeopositionResult {
  Geoposition position;
  GeopositionError error;
};