Index: android_webview/javatests/src/org/chromium/android_webview/test/MediaAccessPermissionRequestTest.java |
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/MediaAccessPermissionRequestTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/MediaAccessPermissionRequestTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b4a132bca6e68b3a9a6d528a961562db6f94ce21 |
--- /dev/null |
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/MediaAccessPermissionRequestTest.java |
@@ -0,0 +1,157 @@ |
+// Copyright 2014 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. |
+ |
+package org.chromium.android_webview.test; |
+ |
+import android.test.suitebuilder.annotation.SmallTest; |
+ |
+import org.chromium.android_webview.AwContents; |
+import org.chromium.android_webview.permission.AwPermissionRequest; |
+import org.chromium.android_webview.test.util.CommonResources; |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.content.browser.test.util.CallbackHelper; |
+import org.chromium.net.test.util.TestWebServer; |
+ |
+import java.util.concurrent.Callable; |
+ |
+/** |
+ * Test MediaAccessPermissionRequest. |
+ */ |
+public class MediaAccessPermissionRequestTest extends AwTestBase { |
+ private static class OnPermissionRequestHelper extends CallbackHelper { |
+ private boolean mCanceled; |
+ |
+ public void notifyCanceled() { |
+ mCanceled = true; |
+ notifyCalled(); |
+ } |
+ |
+ public boolean canceled() { |
+ return mCanceled; |
+ } |
+ } |
+ |
+ private final String mData = "<html> <script> " + |
+ "var constraints = {audio: true, video: true};" + |
+ "var video = document.querySelector('video');" + |
+ "function successCallback(stream) {" + |
+ "window.document.title = 'grant';" + |
+ "if (window.URL) {" + |
+ "video.src = window.URL.createObjectURL(stream);" + |
+ "} else {" + |
+ "video.src = stream;" + |
+ "}" + |
+ "}" + |
+ "function errorCallback(error){" + |
+ "window.document.title = 'deny';" + |
+ "console.log('navigator.getUserMedia error: ', error);" + |
+ "}" + |
+ "navigator.webkitGetUserMedia(constraints, successCallback, errorCallback)" + |
+ " </script><body>" + |
+ "<video autoplay></video>" + |
+ "</body></html>"; |
+ |
+ private TestWebServer mTestWebServer; |
+ private String mWebRTCPage; |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ mTestWebServer = new TestWebServer(false); |
+ mWebRTCPage = mTestWebServer.setResponse("/WebRTC", mData, |
+ CommonResources.getTextHtmlHeaders(true)); |
+ } |
+ |
+ @Override |
+ protected void tearDown() throws Exception { |
+ mTestWebServer.shutdown(); |
+ mTestWebServer = null; |
+ super.tearDown(); |
+ } |
+ |
+ @Feature({"AndroidWebView"}) |
+ @SmallTest |
+ public void testGrantAccess() throws Throwable { |
+ final OnPermissionRequestHelper helper = new OnPermissionRequestHelper(); |
+ TestAwContentsClient contentsClient = |
+ new TestAwContentsClient() { |
+ @Override |
+ public void onPermissionRequest(AwPermissionRequest awPermissionRequest) { |
+ awPermissionRequest.grant(); |
+ helper.notifyCalled(); |
+ } |
+ }; |
+ final AwTestContainerView testContainerView = |
+ createAwTestContainerViewOnMainSync(contentsClient); |
+ final AwContents awContents = testContainerView.getAwContents(); |
+ enableJavaScriptOnUiThread(awContents); |
+ int callCount = helper.getCallCount(); |
+ loadUrlAsync(awContents, mWebRTCPage, null); |
+ helper.waitForCallback(callCount); |
+ pollTitleAs("grant", awContents); |
+ } |
+ |
+ @Feature({"AndroidWebView"}) |
+ @SmallTest |
+ public void testDenyAccess() throws Throwable { |
+ final OnPermissionRequestHelper helper = new OnPermissionRequestHelper(); |
+ TestAwContentsClient contentsClient = |
+ new TestAwContentsClient() { |
+ @Override |
+ public void onPermissionRequest(AwPermissionRequest awPermissionRequest) { |
+ awPermissionRequest.deny(); |
+ helper.notifyCalled(); |
+ } |
+ }; |
+ final AwTestContainerView testContainerView = |
+ createAwTestContainerViewOnMainSync(contentsClient); |
+ final AwContents awContents = testContainerView.getAwContents(); |
+ enableJavaScriptOnUiThread(awContents); |
+ int callCount = helper.getCallCount(); |
+ loadUrlAsync(awContents, mWebRTCPage, null); |
+ helper.waitForCallback(callCount); |
+ pollTitleAs("deny", awContents); |
+ } |
+ |
+ private void pollTitleAs(final String title, final AwContents awContents) |
+ throws Exception { |
+ poll(new Callable<Boolean>() { |
+ @Override |
+ public Boolean call() throws Exception { |
+ return title.equals(getTitleOnUiThread(awContents)); |
+ } |
+ }); |
+ } |
+ |
+ @Feature({"AndroidWebView"}) |
+ @SmallTest |
+ public void testCancelPermission() throws Throwable { |
+ final OnPermissionRequestHelper helper = new OnPermissionRequestHelper(); |
+ TestAwContentsClient contentsClient = |
+ new TestAwContentsClient() { |
+ @Override |
+ public void onPermissionRequest(AwPermissionRequest awPermissionRequest) { |
+ // Don't respond and wait for the request canceled. |
+ helper.notifyCalled(); |
+ } |
+ @Override |
+ public void onPermissionRequestCanceled( |
+ AwPermissionRequest awPermissionRequest) { |
+ helper.notifyCanceled(); |
+ } |
+ }; |
+ final AwTestContainerView testContainerView = |
+ createAwTestContainerViewOnMainSync(contentsClient); |
+ final AwContents awContents = testContainerView.getAwContents(); |
+ enableJavaScriptOnUiThread(awContents); |
+ int callCount = helper.getCallCount(); |
+ loadUrlAsync(awContents, mWebRTCPage, null); |
+ helper.waitForCallback(callCount); |
+ callCount = helper.getCallCount(); |
+ // Load the same page again, the previous request should be canceled. |
+ loadUrlAsync(awContents, mWebRTCPage, null); |
+ helper.waitForCallback(callCount); |
+ assert (helper.canceled()); |
+ } |
+} |