/*
 * Copyright (C) 2020 Igalia S.L. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

[
    EnabledBySetting=WebXREnabled,
    Conditional=WEBXR,
    InterfaceName=FakeXRDevice,
    ImplementationLacksVTable,
    LegacyNoInterfaceObject,
] interface WebFakeXRDevice {
  // Sets the values to be used for subsequent
  // requestAnimationFrame() callbacks.
  undefined setViews(sequence<FakeXRViewInit> views);

  // behaves as if device was disconnected
  Promise<undefined> disconnect();

  // Sets the origin of the viewer
  undefined setViewerOrigin(FakeXRRigidTransformInit origin, optional boolean emulatedPosition = false);

  // If an origin is not specified, then the device is assumed to not be tracking, emulatedPosition should
  // be assumed for cases where the UA must always provide a pose.
  undefined clearViewerOrigin();

  // Simulates devices focusing and blurring sessions.
  undefined simulateVisibilityChange(XRVisibilityState visibilityState);

  undefined setBoundsGeometry(sequence<FakeXRBoundsPoint> boundsCoordinates);
  // Sets the native origin of the physical floor
  undefined setFloorOrigin(FakeXRRigidTransformInit floorOrigin);

  // Indicates that the device can no longer identify the location of the physical floor.
  undefined clearFloorOrigin();

  // Used to simulate a major change in tracking and that a reset pose event should be fired
  // https://immersive-web.github.io/webxr/#event-types
  undefined simulateResetPose();

  // Used to connect and send input events
  WebFakeXRInputController simulateInputSourceConnection(FakeXRInputSourceInit inputSource);

  // Set up the device so it'll notify session when the system has completed all steps for session shutdown
  undefined setSupportsShutdownNotification();

  // Simulate session shutdown triggered by system
  undefined simulateShutdown();
};
