// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/vr/test/vr_browser_test.h"
#include "chrome/browser/vr/test/vr_xr_browser_test.h"
#include "chrome/browser/vr/test/xr_browser_test.h"
#include "content/public/test/browser_test_utils.h"

// Browser test equivalent of
// chrome/android/javatests/src/.../browser/vr/WebVrTransitionTest.java.
// End-to-end tests for transitioning between WebVR's magic window and
// presentation modes.

namespace vr {

// Tests that a successful requestPresent or requestSession call enters
// presentation.
void TestPresentationEntryImpl(VrXrBrowserTestBase* t, std::string filename) {
  t->LoadUrlAndAwaitInitialization(t->GetHtmlTestFile(filename));
  t->EnterPresentationOrFail(t->GetFirstTabWebContents());
}

IN_PROC_BROWSER_TEST_F(VrBrowserTestStandard,
                       REQUIRES_GPU(TestRequestPresentEntersVr)) {
  TestPresentationEntryImpl(this, "generic_webvr_page");
}
IN_PROC_BROWSER_TEST_F(XrBrowserTestStandard,
                       REQUIRES_GPU(TestRequestSessionEntersVr)) {
  TestPresentationEntryImpl(this, "generic_webxr_page");
}

// Tests that window.requestAnimationFrame continues to fire while in
// WebVR/WebXR presentation since the tab is still visible.
void TestWindowRafFiresWhilePresentingImpl(VrXrBrowserTestBase* t,
                                           std::string filename) {
  t->LoadUrlAndAwaitInitialization(t->GetHtmlTestFile(filename));
  t->ExecuteStepAndWait("stepVerifyBeforePresent()",
                        t->GetFirstTabWebContents());
  t->EnterPresentationOrFail(t->GetFirstTabWebContents());
  t->ExecuteStepAndWait("stepVerifyDuringPresent()",
                        t->GetFirstTabWebContents());
  t->ExitPresentationOrFail(t->GetFirstTabWebContents());
  t->ExecuteStepAndWait("stepVerifyAfterPresent()",
                        t->GetFirstTabWebContents());
  t->EndTest(t->GetFirstTabWebContents());
}

IN_PROC_BROWSER_TEST_F(VrBrowserTestStandard,
                       REQUIRES_GPU(TestWindowRafFiresWhilePresenting)) {
  TestWindowRafFiresWhilePresentingImpl(
      this, "test_window_raf_fires_while_presenting");
}
IN_PROC_BROWSER_TEST_F(XrBrowserTestStandard,
                       REQUIRES_GPU(TestWindowRafFiresWhilePresenting)) {
  TestWindowRafFiresWhilePresentingImpl(
      this, "webxr_test_window_raf_fires_while_presenting");
}

// Tests that WebVR/WebXR is not exposed if the flag is not on and the page does
// not have an origin trial token. Since the API isn't actually used, we can
// remove the GPU requirement.
void TestApiDisabledWithoutFlagSetImpl(VrXrBrowserTestBase* t,
                                       std::string filename) {
  t->LoadUrlAndAwaitInitialization(t->GetHtmlTestFile(filename));
  t->WaitOnJavaScriptStep(t->GetFirstTabWebContents());
  t->EndTest(t->GetFirstTabWebContents());
}

IN_PROC_BROWSER_TEST_F(VrBrowserTestWebVrDisabled,
                       TestWebVrDisabledWithoutFlagSet) {
  TestApiDisabledWithoutFlagSetImpl(this,
                                    "test_webvr_disabled_without_flag_set");
}
IN_PROC_BROWSER_TEST_F(XrBrowserTestWebXrDisabled,
                       TestWebXrDisabledWithoutFlagSet) {
  TestApiDisabledWithoutFlagSetImpl(this,
                                    "test_webxr_disabled_without_flag_set");
}

// Tests that WebVR does not return any devices if OpenVR support is disabled.
// Since WebVR isn't actually used, we can remove the GPU requirement.
IN_PROC_BROWSER_TEST_F(VrBrowserTestOpenVrDisabled,
                       TestWebVrNoDevicesWithoutOpenVr) {
  LoadUrlAndAwaitInitialization(GetHtmlTestFile("generic_webvr_page"));
  EXPECT_FALSE(VrDisplayFound(GetFirstTabWebContents()));
}

// Tests that WebXR does not return any devices if OpenVR support is disabled.
// Since WebXR isn't actually used, we can remove the GPU requirement.
IN_PROC_BROWSER_TEST_F(XrBrowserTestOpenVrDisabled,
                       TestWebXrNoDevicesWithoutOpenVr) {
  LoadUrlAndAwaitInitialization(
      GetHtmlTestFile("test_webxr_does_not_return_device"));
  WaitOnJavaScriptStep(GetFirstTabWebContents());
  EndTest(GetFirstTabWebContents());
}

// Tests that window.requestAnimationFrame continues to fire when we have a
// non-immersive WebXR session
IN_PROC_BROWSER_TEST_F(
    XrBrowserTestStandard,
    REQUIRES_GPU(TestWindowRafFiresDuringNonImmersiveSession)) {
  LoadUrlAndAwaitInitialization(
      GetHtmlTestFile("test_window_raf_fires_during_non_immersive_session"));
  WaitOnJavaScriptStep(GetFirstTabWebContents());
  EndTest(GetFirstTabWebContents());
}

// Tests that non-immersive sessions stop receiving rAFs during an immersive
// session, but resume once the immersive session ends.
IN_PROC_BROWSER_TEST_F(XrBrowserTestStandard,
                       REQUIRES_GPU(TestNonImmersiveStopsDuringImmersive)) {
  LoadUrlAndAwaitInitialization(
      GetHtmlTestFile("test_non_immersive_stops_during_immersive"));
  ExecuteStepAndWait("stepBeforeImmersive()", GetFirstTabWebContents());
  EnterPresentationOrFail(GetFirstTabWebContents());
  ExecuteStepAndWait("stepDuringImmersive()", GetFirstTabWebContents());
  ExitPresentationOrFail(GetFirstTabWebContents());
  ExecuteStepAndWait("stepAfterImmersive()", GetFirstTabWebContents());
  EndTest(GetFirstTabWebContents());
}

}  // namespace vr
