<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/webxr_test_constants.js"></script>

<script>
let testName = "XRInputSources primary input presses properly fires off the "
  + "right events";

let watcherDone = new Event("watcherdone");

let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;

let xrViewerSpace = null;

let testFunction = function(session, fakeDeviceController, t) {
  let eventWatcher = new EventWatcher(
    t, session, ["selectstart", "select", "selectend", "watcherdone"]);
  let eventPromise = eventWatcher.wait_for(
    ["selectstart", "select", "selectend", "watcherdone"]);

  function tryCallingFrameMethods(frame) {
    t.step(() => {
      // Frame is active but not an animation frame, so calling getPose is
      // allowed while getViewerPose is not.
      assert_throws_dom('InvalidStateError', () => frame.getViewerPose(currentReferenceSpace));
      let pose = frame.getPose(xrViewerSpace, currentReferenceSpace);
      assert_not_equals(pose, null);
      assert_true(pose instanceof XRPose);
      assert_false(pose instanceof XRViewerPose);
    });
  }

  function onSessionSelectStart(event) {
    t.step( () => {
      let input_sources = session.inputSources;
      assert_equals(event.frame.session, session);
      assert_equals(event.inputSource, input_sources[0]);
      validateSameObject(event);
      tryCallingFrameMethods(event.frame);
    });
  }

  function onSessionSelectEnd(event) {
    t.step( () => {
      let input_sources = session.inputSources;
      assert_equals(event.frame.session, session);
      assert_equals(event.inputSource, input_sources[0]);
      validateSameObject(event);
      tryCallingFrameMethods(event.frame);
    });
    session.dispatchEvent(watcherDone);
  }

  function onSessionSelect(event) {
    t.step( () => {
      let input_sources = session.inputSources;
      assert_equals(event.frame.session, session);
      assert_equals(event.inputSource, input_sources[0]);
      validateSameObject(event);
      tryCallingFrameMethods(event.frame);
    });
  }

  // Verifies that the same object is returned each time attributes are accessed
  // on an XRInputSoruceEvent, as required by the spec.
  function validateSameObject(event) {
    let frame = event.frame;
    let source = event.inputSource;
    t.step(() => {
      assert_equals(frame, event.frame,
        "XRInputSourceEvent.frame returns the same object.");
      assert_equals(source, event.inputSource,
        "XRInputSourceEvent.inputSource returns the same object.");
    });
  }

  session.addEventListener("selectstart", onSessionSelectStart, false);
  session.addEventListener("selectend", onSessionSelectEnd, false);
  session.addEventListener("select", onSessionSelect, false);

  let input_source =
    fakeDeviceController.simulateInputSourceConnection(VALID_CONTROLLER);
  let currentReferenceSpace = null;

  session.requestReferenceSpace('viewer').then(function(viewerSpace) {
    xrViewerSpace = viewerSpace;

    session.requestReferenceSpace('local').then((referenceSpace) => {
      currentReferenceSpace = referenceSpace;

      // Press the primary input button and then release it a short time later.
      requestSkipAnimationFrame(session, (time, xrFrame) => {
        input_source.startSelection();

          session.requestAnimationFrame((time, xrFrame) => {
            input_source.endSelection();

            session.requestAnimationFrame((time, xrFrame) => {
              // Need to process one more frame to allow select to propegate.
            });
          });
      });
    });
  });

  return eventPromise;
};

xr_session_promise_test(
  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');

</script>
