/*
 * 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.
 */

[
    Conditional=WEBXR,
    EnabledBySetting=WebXREnabled,
    InterfaceName=FakeXRDevice,
    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();
};
