interface Event {
};

interface EventTarget {
};

interface EventHandler {
};

interface Error {
};

dictionary EventInit {
};
[SecureContext]
interface Sensor : EventTarget {
  readonly attribute SensorState state;
  readonly attribute SensorReading? reading;
  void start();
  void stop();
  attribute EventHandler onchange;
  attribute EventHandler onactivate;
  attribute EventHandler onerror;
};

dictionary SensorOptions {
  double? frequency;
};

enum SensorState {
  "idle",
  "activating",
  "activated",
  "errored"
};

[SecureContext]
interface SensorReading {
  readonly attribute DOMHighResTimeStamp timeStamp;
};

[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)]
interface SensorErrorEvent : Event {
  readonly attribute Error error;
};

dictionary SensorErrorEventInit : EventInit {
  required Error error;
};

[Constructor(optional AccelerometerOptions accelerometerOptions)]
interface Accelerometer : Sensor {
  readonly attribute AccelerometerReading? reading;
  readonly attribute boolean includesGravity;
};

dictionary AccelerometerOptions :  SensorOptions  {
  boolean includeGravity = true;
};

[Constructor(AccelerometerReadingInit AccelerometerReadingInit)]
interface AccelerometerReading : SensorReading {
    readonly attribute double x;
    readonly attribute double y;
    readonly attribute double z;
};

dictionary AccelerometerReadingInit {
    double x = 0;
    double y = 0;
    double z = 0;
};