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