1 // Copyright 2019 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.chrome.browser.vr; 6 7 import static org.chromium.chrome.browser.vr.XrTestFramework.PAGE_LOAD_TIMEOUT_S; 8 import static org.chromium.chrome.browser.vr.XrTestFramework.POLL_TIMEOUT_LONG_MS; 9 import static org.chromium.chrome.browser.vr.XrTestFramework.POLL_TIMEOUT_SHORT_MS; 10 11 import android.os.Build; 12 13 import androidx.test.filters.MediumTest; 14 15 import org.junit.Before; 16 import org.junit.Rule; 17 import org.junit.Test; 18 import org.junit.rules.RuleChain; 19 import org.junit.runner.RunWith; 20 21 import org.chromium.base.test.params.ParameterAnnotations.ClassParameter; 22 import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate; 23 import org.chromium.base.test.params.ParameterSet; 24 import org.chromium.base.test.params.ParameterizedRunner; 25 import org.chromium.base.test.util.CommandLineFlags; 26 import org.chromium.base.test.util.DisableIf; 27 import org.chromium.chrome.browser.flags.ChromeSwitches; 28 import org.chromium.chrome.browser.vr.rules.XrActivityRestriction; 29 import org.chromium.chrome.browser.vr.util.VrTestRuleUtils; 30 import org.chromium.chrome.test.ChromeActivityTestRule; 31 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; 32 33 import java.util.List; 34 import java.util.concurrent.Callable; 35 36 /** 37 * End-to-end tests for various scenarios around when the permission prompt is expected. 38 */ 39 @RunWith(ParameterizedRunner.class) 40 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) 41 @CommandLineFlags. 42 Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=WebXR,LogJsConsoleMessages"}) 43 public class WebXrVrPermissionTest { 44 @ClassParameter 45 private static List<ParameterSet> sClassParams = 46 VrTestRuleUtils.generateDefaultTestRuleParameters(); 47 @Rule 48 public RuleChain mRuleChain; 49 50 private ChromeActivityTestRule mTestRule; 51 private WebXrVrPermissionTestFramework mWebXrVrPermissionTestFramework; 52 WebXrVrPermissionTest(Callable<ChromeActivityTestRule> callable)53 public WebXrVrPermissionTest(Callable<ChromeActivityTestRule> callable) throws Exception { 54 mTestRule = callable.call(); 55 mRuleChain = VrTestRuleUtils.wrapRuleInActivityRestrictionRule(mTestRule); 56 } 57 58 @Before setUp()59 public void setUp() { 60 mWebXrVrPermissionTestFramework = new WebXrVrPermissionTestFramework(mTestRule); 61 } 62 63 /** 64 * Tests that denying permission blocks the session from being created. 65 */ 66 @Test 67 @MediumTest 68 @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) testPermissionDenyFailsSessionCreation()69 public void testPermissionDenyFailsSessionCreation() { 70 mWebXrVrPermissionTestFramework.setPermissionPromptAction( 71 WebXrVrTestFramework.PERMISSION_PROMPT_ACTION_DENY); 72 mWebXrVrPermissionTestFramework.setPermissionPromptExpected(true); 73 74 mWebXrVrPermissionTestFramework.loadFileAndAwaitInitialization( 75 "test_webxr_permission", PAGE_LOAD_TIMEOUT_S); 76 77 mWebXrVrPermissionTestFramework.enterSessionWithUserGesture(); 78 mWebXrVrPermissionTestFramework.pollJavaScriptBooleanOrFail( 79 "sessionInfos[sessionTypes.IMMERSIVE].error != null", POLL_TIMEOUT_LONG_MS); 80 mWebXrVrPermissionTestFramework.runJavaScriptOrFail( 81 "verifyPermissionDeniedError(sessionTypes.IMMERSIVE)", POLL_TIMEOUT_SHORT_MS); 82 mWebXrVrPermissionTestFramework.assertNoJavaScriptErrors(); 83 } 84 85 /** 86 * Tests that attempting to enter a session that requires the same permission level/type does 87 * not reprompt. 88 */ 89 @Test 90 @MediumTest 91 @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) 92 @DisableIf. 93 Build(message = "https://crbug.com/1091800", sdk_is_less_than = Build.VERSION_CODES.M) 94 public void testVrPermissionPersistance() { 95 mWebXrVrPermissionTestFramework.loadFileAndAwaitInitialization( 96 "generic_webxr_page", PAGE_LOAD_TIMEOUT_S); mWebXrVrPermissionTestFramework.enterSessionWithUserGestureOrFail()97 mWebXrVrPermissionTestFramework.enterSessionWithUserGestureOrFail(); mWebXrVrPermissionTestFramework.endSession()98 mWebXrVrPermissionTestFramework.endSession(); 99 100 mWebXrVrPermissionTestFramework.setPermissionPromptExpected(false); 101 mWebXrVrPermissionTestFramework.enterSessionWithUserGestureOrFail()102 mWebXrVrPermissionTestFramework.enterSessionWithUserGestureOrFail(); 103 } 104 105 /** 106 * Tests that attempting to enter an inline session with no special features does not require 107 * permission. 108 */ 109 @Test 110 @MediumTest 111 @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) testPermissionNotNeededForInline()112 public void testPermissionNotNeededForInline() { 113 mWebXrVrPermissionTestFramework.setPermissionPromptExpected(false); 114 115 mWebXrVrPermissionTestFramework.loadFileAndAwaitInitialization( 116 "test_webxr_permission", PAGE_LOAD_TIMEOUT_S); 117 118 mWebXrVrPermissionTestFramework.runJavaScriptOrFail( 119 "requestMagicWindowSession()", POLL_TIMEOUT_SHORT_MS); 120 mWebXrVrPermissionTestFramework.pollJavaScriptBooleanOrFail( 121 "sessionInfos[sessionTypes.MAGIC_WINDOW].currentSession != null", 122 POLL_TIMEOUT_LONG_MS); 123 } 124 125 /** 126 * Tests that granted permissions persist after a page reload. 127 */ 128 @Test 129 @MediumTest 130 @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) 131 @DisableIf. 132 Build(message = "https://crbug.com/1091800", sdk_is_less_than = Build.VERSION_CODES.M) 133 public void testPermissionPersistsAfterReload() { 134 mWebXrVrPermissionTestFramework.loadFileAndAwaitInitialization( 135 "generic_webxr_page", PAGE_LOAD_TIMEOUT_S); 136 mWebXrVrPermissionTestFramework.enterSessionWithUserGestureOrFail()137 mWebXrVrPermissionTestFramework.enterSessionWithUserGestureOrFail(); mWebXrVrPermissionTestFramework.endSession()138 mWebXrVrPermissionTestFramework.endSession(); 139 140 mWebXrVrPermissionTestFramework.loadFileAndAwaitInitialization( 141 "generic_webxr_page", PAGE_LOAD_TIMEOUT_S); 142 143 mWebXrVrPermissionTestFramework.setPermissionPromptExpected(false); 144 mWebXrVrPermissionTestFramework.enterSessionWithUserGestureOrFail()145 mWebXrVrPermissionTestFramework.enterSessionWithUserGestureOrFail(); 146 } 147 } 148