summaryrefslogtreecommitdiffstats
path: root/extensions/test
diff options
context:
space:
mode:
authorlfg <lfg@chromium.org>2014-10-07 08:09:53 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-07 15:10:13 +0000
commit12dec866ef80260531951251b31a4b4886bf8be3 (patch)
tree2c0c796d8463b3d1bace27fa99606ac498dddf65 /extensions/test
parent9be182e92137c8f23c7e3e5f8d58aaa66c8f0ea4 (diff)
downloadchromium_src-12dec866ef80260531951251b31a4b4886bf8be3.zip
chromium_src-12dec866ef80260531951251b31a4b4886bf8be3.tar.gz
chromium_src-12dec866ef80260531951251b31a4b4886bf8be3.tar.bz2
Cleanup webview app_shell_browsertests and add webview media permission tests in app_shell_browsertests.
* Splits web_view_apitest into .h/.cc so it can be reused by other tests. * Adds webview media permission tests in app_shell_browsertests: - TestAllow - TestAllowAndThenDeny - TestAllowAsync - TestAllowTwice - TestCheck - TestDeny - TestDenyThenAllowThrows - TestDenyWithPreventDefault - TestNoListenersImplyDeny - TestNoPreventDefaultImpliesDeny BUG=352293 Review URL: https://codereview.chromium.org/626093002 Cr-Commit-Position: refs/heads/master@{#298481}
Diffstat (limited to 'extensions/test')
-rw-r--r--extensions/test/data/web_view/media_access/allow/embedder.html11
-rw-r--r--extensions/test/data/web_view/media_access/allow/embedder.js231
-rw-r--r--extensions/test/data/web_view/media_access/allow/manifest.json14
-rw-r--r--extensions/test/data/web_view/media_access/allow/media_access_guest.html50
-rw-r--r--extensions/test/data/web_view/media_access/allow/test.js7
-rw-r--r--extensions/test/data/web_view/media_access/check/embedder.html11
-rw-r--r--extensions/test/data/web_view/media_access/check/embedder.js91
-rw-r--r--extensions/test/data/web_view/media_access/check/manifest.json13
-rw-r--r--extensions/test/data/web_view/media_access/check/media_check_guest.html47
-rw-r--r--extensions/test/data/web_view/media_access/check/test.js7
-rw-r--r--extensions/test/data/web_view/media_access/deny/embedder.html11
-rw-r--r--extensions/test/data/web_view/media_access/deny/embedder.js214
-rw-r--r--extensions/test/data/web_view/media_access/deny/manifest.json13
-rw-r--r--extensions/test/data/web_view/media_access/deny/media_access_guest.html50
-rw-r--r--extensions/test/data/web_view/media_access/deny/test.js7
15 files changed, 777 insertions, 0 deletions
diff --git a/extensions/test/data/web_view/media_access/allow/embedder.html b/extensions/test/data/web_view/media_access/allow/embedder.html
new file mode 100644
index 0000000..d350e46
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/allow/embedder.html
@@ -0,0 +1,11 @@
+<!--
+ * Copyright 2013 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.
+-->
+<html>
+<body>
+ <div id="webview-tag-container"></div>
+ <script src="embedder.js"></script>
+</body>
+</html>
diff --git a/extensions/test/data/web_view/media_access/allow/embedder.js b/extensions/test/data/web_view/media_access/allow/embedder.js
new file mode 100644
index 0000000..fa7cbc16
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/allow/embedder.js
@@ -0,0 +1,231 @@
+// Copyright 2013 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.
+
+var embedder = {};
+embedder.tests = {};
+// These variables will be filled in chrome.test.getConfig() below.
+embedder.baseGuestURL = '';
+embedder.guestURL = '';
+
+// Sends a message to WebViewTest denoting it is done and test
+// has failed.
+embedder.failTest = function(msg) {
+ window.console.warn('test failure, reason: ' + msg);
+ chrome.test.sendMessage('TEST_FAILED');
+};
+
+// Sends a message to WebViewTest denoting it is done and test
+// has succeeded.
+embedder.maybePassTest = function() {
+ chrome.test.sendMessage('TEST_PASSED');
+};
+
+/** @private */
+embedder.setUpGuest_ = function() {
+ document.querySelector('#webview-tag-container').innerHTML =
+ '<webview style="width: 100px; height: 100px;"' +
+ ' src="' + embedder.guestURL + '"' +
+ '></webview>';
+ var webview = document.querySelector('webview');
+ if (!webview) {
+ embedder.failTest('No <webview> element created');
+ return null;
+ }
+ return webview;
+};
+
+/** @private */
+embedder.setUpLoadStop_ = function(webview, testName) {
+ var onWebViewLoadStop = function(e) {
+ // Send post message to <webview> when it's ready to receive them.
+ // This will make the guest start issueing media request. We do not
+ // worry about the Javascript outcome. MockWebContestsDelegate in
+ // WebViewTest will take care of that.
+ webview.contentWindow.postMessage(
+ JSON.stringify(['check-media-permission', '' + testName]), '*');
+ };
+ webview.addEventListener('loadstop', onWebViewLoadStop);
+};
+
+/** @private */
+embedder.assertCorrectMediaEvent_ = function(e) {
+ if (e.permission != 'media') {
+ embedder.failTest('wrong permission: ' + e.permission);
+ return false;
+ }
+ if (!e.url) {
+ embedder.failTest('No url property in event');
+ return false;
+ }
+ if (e.url.indexOf(embedder.baseGuestURL)) {
+ embedder.failTest('Wrong url: ' + e.rul +
+ ', expected url to start with ' + embedder.baseGuestURL);
+ return false;
+ }
+ return true;
+};
+
+// Each test loads a guest which requests media access.
+// All tests listed in this file expect the guest's request to be allowed.
+//
+// Once the guest is allowed media access, the MockWebContestsDelegate catches
+// the fact and the test succeeds.
+//
+// Note that this is a manually run test, not using chrome.test.runTests.
+// This is because we want to wait for MockWebContestsDelegate to catch media
+// access request and not actually issue the media request.
+
+embedder.tests.testAllow = function() {
+ var webview = embedder.setUpGuest_();
+ if (!webview) {
+ return;
+ }
+
+ var onPermissionRequest = function(e) {
+ if (!embedder.assertCorrectMediaEvent_(e)) {
+ return;
+ }
+ e.request.allow();
+ embedder.maybePassTest();
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ embedder.setUpLoadStop_(webview, 'test1');
+};
+
+embedder.tests.testAllowAndThenDeny = function() {
+ var webview = embedder.setUpGuest_();
+ if (!webview) {
+ return;
+ }
+
+ var calledAllow = false;
+ var callCount = 0;
+ var exceptionCount = 0;
+ var checkAndCall = function(e) {
+ if (!embedder.assertCorrectMediaEvent_(e)) {
+ return;
+ }
+
+ if (!calledAllow) {
+ e.request.allow();
+ calledAllow = true;
+ ++callCount
+ } else {
+ try {
+ e.request.deny();
+ } catch (exception) {
+ ++exceptionCount;
+ }
+ }
+
+ if (callCount == 1 && exceptionCount == 1) {
+ embedder.maybePassTest();
+ }
+ };
+
+ var onPermissionRequest1 = function(e) {
+ checkAndCall(e);
+ };
+ var onPermissionRequest2 = function(e) {
+ checkAndCall(e);
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest1);
+ webview.addEventListener('permissionrequest', onPermissionRequest2);
+
+ embedder.setUpLoadStop_(webview, 'test1');
+};
+
+embedder.tests.testAllowAsync = function() {
+ var webview = embedder.setUpGuest_();
+ if (!webview) {
+ return;
+ }
+
+ var onPermissionRequest = function(e) {
+ if (!embedder.assertCorrectMediaEvent_(e)) {
+ return;
+ }
+
+ e.preventDefault();
+ // Decide asynchronously.
+ window.setTimeout(function() {
+ e.request.allow();
+ embedder.maybePassTest();
+ }, 0);
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ embedder.setUpLoadStop_(webview, 'test1');
+};
+
+embedder.tests.testAllowTwice = function() {
+ var webview = embedder.setUpGuest_();
+ if (!webview) {
+ return;
+ }
+
+ var calledAllow = false;
+ var callbackCount = 0;
+ var exceptionCount = 0;
+ var checkAndCall = function(e) {
+ if (!embedder.assertCorrectMediaEvent_(e)) {
+ return;
+ }
+
+ ++callbackCount;
+ try {
+ e.request.allow();
+ } catch (exception) {
+ ++exceptionCount;
+ }
+
+ if (callbackCount == 2) {
+ if (exceptionCount == 1) {
+ embedder.maybePassTest();
+ } else {
+ embedder.failTest('Expected exceptionCount 1, but got ' +
+ exceptionCount);
+ }
+ }
+ };
+
+ var onPermissionRequest1 = function(e) {
+ checkAndCall(e);
+ };
+ var onPermissionRequest2 = function(e) {
+ checkAndCall(e);
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest1);
+ webview.addEventListener('permissionrequest', onPermissionRequest2);
+
+ embedder.setUpLoadStop_(webview, 'test1');
+};
+
+embedder.tests.list = {
+ 'testAllow': embedder.tests.testAllow,
+ 'testAllowAndThenDeny': embedder.tests.testAllowAndThenDeny,
+ 'testAllowAsync': embedder.tests.testAllowAsync,
+ 'testAllowTwice': embedder.tests.testAllowTwice
+};
+
+// Entry point for test, called by WebViewTest.
+function runTest(testName) {
+ chrome.test.getConfig(function(config) {
+ embedder.baseGuestURL = 'http://localhost:' + config.testServer.port;
+ embedder.guestURL = embedder.baseGuestURL + '/media_access_guest.html';
+ chrome.test.log('Guest url is: ' + embedder.guestURL);
+
+ var testFunction = embedder.tests.list[testName];
+ if (!testFunction) {
+ embedder.failTest('No such test: ' + testName);
+ return;
+ }
+ testFunction();
+ });
+}
+
+onload = function() {
+ chrome.test.sendMessage('LAUNCHED');
+};
diff --git a/extensions/test/data/web_view/media_access/allow/manifest.json b/extensions/test/data/web_view/media_access/allow/manifest.json
new file mode 100644
index 0000000..bc36ca5
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/allow/manifest.json
@@ -0,0 +1,14 @@
+{
+ "name": "Platform App Test: <webview> media",
+ "description": "Loads a guest which requests media access permission",
+ "version": "2",
+ "manifest_version": 2,
+ "permissions": [
+ "webview"
+ ],
+ "app": {
+ "background": {
+ "scripts": ["test.js"]
+ }
+ }
+}
diff --git a/extensions/test/data/web_view/media_access/allow/media_access_guest.html b/extensions/test/data/web_view/media_access/allow/media_access_guest.html
new file mode 100644
index 0000000..8328a99
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/allow/media_access_guest.html
@@ -0,0 +1,50 @@
+<!--
+ * Copyright 2013 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.
+-->
+<html>
+ <head>
+ <script type="text/javascript">
+ // A guest that requests media access.
+ // Notifies the embedder about the result of the request (success/fail)
+ // via post message. Note that the embedder has to initiate a postMessage
+ // first so that guest has a reference to the embedder's window.
+
+ // The window reference of the embedder to send post message reply.
+ var embedderWindowChannel = null;
+
+ var notifyEmbedder = function(msg) {
+ embedderWindowChannel.postMessage(msg, '*');
+ };
+
+ var onUserMediaSuccess = function(stream, testCase) {
+ notifyEmbedder(JSON.stringify(['access-granted', testCase]));
+ };
+ var onUserMediaFailure = function(err, testCase) {
+ notifyEmbedder(JSON.stringify(['access-denied', testCase]));
+ };
+ var startTest = function(testCase) {
+ navigator.webkitGetUserMedia(
+ {audio: true},
+ function(stream) { onUserMediaSuccess(stream, testCase); },
+ function(err) { onUserMediaFailure(err, testCase); });
+ };
+ var onPostMessageReceived = function(e) {
+ var data = JSON.parse(e.data);
+ var testName = data[0];
+ var testCase = data[1];
+ if (testName == 'check-media-permission') {
+ embedderWindowChannel = e.source;
+
+ // Start the test once we have |embedderWindowChannel|.
+ startTest(testCase);
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived, false);
+ </script>
+ </head>
+ <body>
+ <div>This is a guest that requests audio media.</div>
+ </body>
+</html>
diff --git a/extensions/test/data/web_view/media_access/allow/test.js b/extensions/test/data/web_view/media_access/allow/test.js
new file mode 100644
index 0000000..1886432
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/allow/test.js
@@ -0,0 +1,7 @@
+// Copyright 2013 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.
+
+chrome.app.runtime.onLaunched.addListener(function() {
+ chrome.app.window.create('embedder.html', {}, function () {});
+});
diff --git a/extensions/test/data/web_view/media_access/check/embedder.html b/extensions/test/data/web_view/media_access/check/embedder.html
new file mode 100644
index 0000000..6e449ff
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/check/embedder.html
@@ -0,0 +1,11 @@
+<!--
+ * 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.
+-->
+<html>
+<body>
+ <div id="webview-tag-container"></div>
+ <script src="embedder.js"></script>
+</body>
+</html>
diff --git a/extensions/test/data/web_view/media_access/check/embedder.js b/extensions/test/data/web_view/media_access/check/embedder.js
new file mode 100644
index 0000000..1854978
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/check/embedder.js
@@ -0,0 +1,91 @@
+// 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.
+
+var embedder = {};
+embedder.tests = {};
+// These variables will be filled in chrome.test.getConfig() below.
+embedder.baseGuestURL = '';
+embedder.guestURL = '';
+
+// Sends a message to WebViewTest denoting it is done and test
+// has failed.
+embedder.failTest = function(msg) {
+ window.console.log('test failure, reason: ' + msg);
+ chrome.test.sendMessage('TEST_FAILED');
+};
+
+// Sends a message to WebViewTest denoting it is done and test
+// has succeeded.
+embedder.maybePassTest = function() {
+ chrome.test.sendMessage('TEST_PASSED');
+};
+
+/** @private */
+embedder.setUpGuest_ = function() {
+ document.querySelector('#webview-tag-container').innerHTML =
+ '<webview style="width: 100px; height: 100px;"' +
+ ' src="' + embedder.guestURL + '"' +
+ '></webview>';
+ var webview = document.querySelector('webview');
+ if (!webview) {
+ embedder.failTest('No <webview> element created');
+ return null;
+ }
+ return webview;
+};
+
+/** @private */
+embedder.setUpLoadStop_ = function(webview) {
+ var onWebViewLoadStop = function(e) {
+ window.console.log('onWebViewLoadStop');
+
+ // Send post message to <webview> when it's ready to receive them.
+ // This will make the guest start issueing media request. We do not
+ // worry about the Javascript outcome. MockWebContestsDelegate in
+ // WebViewTest will take care of that.
+ webview.contentWindow.postMessage(
+ JSON.stringify(['get-sources-permission']), '*');
+ };
+ webview.addEventListener('loadstop', onWebViewLoadStop);
+};
+
+// The test loads a guest which requests media sources, which will in turn check
+// for media access permission.
+//
+// Note that this is a manually run test, not using chrome.test.runTests.
+// This is because we want to wait for MockWebContestsDelegate to catch the
+// media access check and not actually do a check.
+
+// Entry point for test, called by WebViewTest.
+function runTest(testName) {
+ chrome.test.getConfig(function(config) {
+ embedder.baseGuestURL = 'http://localhost:' + config.testServer.port;
+ embedder.guestURL = embedder.baseGuestURL + '/media_check_guest.html';
+ chrome.test.log('Guest url is: ' + embedder.guestURL);
+
+ var webview = embedder.setUpGuest_();
+ if (!webview) {
+ return;
+ }
+
+ embedder.setUpLoadStop_(webview);
+
+ webview.addEventListener('consolemessage', function(e) {
+ window.console.log(e.message);
+ });
+
+ window.addEventListener('message', function(e) {
+ var data = JSON.parse(e.data);
+ if (data[0] == 'got-sources') {
+ embedder.maybePassTest();
+ } else {
+ window.console.log('Unexpected message: ' + e.message);
+ }
+ });
+ });
+}
+
+onload = function() {
+ chrome.test.sendMessage('LAUNCHED');
+};
diff --git a/extensions/test/data/web_view/media_access/check/manifest.json b/extensions/test/data/web_view/media_access/check/manifest.json
new file mode 100644
index 0000000..d7488e9
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/check/manifest.json
@@ -0,0 +1,13 @@
+{
+ "name": "Platform App Test: <webview> media",
+ "description": "Loads a guest which requests media sources, this triggers checking existing permission",
+ "version": "1",
+ "permissions": [
+ "webview"
+ ],
+ "app": {
+ "background": {
+ "scripts": ["test.js"]
+ }
+ }
+}
diff --git a/extensions/test/data/web_view/media_access/check/media_check_guest.html b/extensions/test/data/web_view/media_access/check/media_check_guest.html
new file mode 100644
index 0000000..07164c0d
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/check/media_check_guest.html
@@ -0,0 +1,47 @@
+<!--
+ * 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.
+-->
+<html>
+ <head>
+ <script type="text/javascript">
+ // A guest that requests media sources, which in turn checks for media
+ // access permission.
+ // Notifies the embedder when done via post message. Note that the
+ // embedder has to initiate a postMessage first so that guest has a
+ // reference to the embedder's window.
+
+ // The window reference of the embedder to send post message reply.
+ var embedderWindowChannel = null;
+
+ var notifyEmbedder = function(msg) {
+ embedderWindowChannel.postMessage(msg, '*');
+ };
+
+ var onSourceInfo = function(sources) {
+ notifyEmbedder(JSON.stringify(['got-sources']));
+ };
+ var startTest = function() {
+ MediaStreamTrack.getSources(onSourceInfo);
+ };
+ var onPostMessageReceived = function(e) {
+ var data = JSON.parse(e.data);
+ var testName = data[0];
+ if (testName == 'get-sources-permission') {
+ embedderWindowChannel = e.source;
+
+ // Start the test once we have |embedderWindowChannel|.
+ startTest();
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived, false);
+ </script>
+ </head>
+ <body>
+ <div>
+ This is a guest requests media sources, which will check for media
+ access permission.
+ </div>
+ </body>
+</html>
diff --git a/extensions/test/data/web_view/media_access/check/test.js b/extensions/test/data/web_view/media_access/check/test.js
new file mode 100644
index 0000000..8b3e751
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/check/test.js
@@ -0,0 +1,7 @@
+// 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.
+
+chrome.app.runtime.onLaunched.addListener(function() {
+ chrome.app.window.create('embedder.html', {}, function () {});
+});
diff --git a/extensions/test/data/web_view/media_access/deny/embedder.html b/extensions/test/data/web_view/media_access/deny/embedder.html
new file mode 100644
index 0000000..d350e46
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/deny/embedder.html
@@ -0,0 +1,11 @@
+<!--
+ * Copyright 2013 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.
+-->
+<html>
+<body>
+ <div id="webview-tag-container"></div>
+ <script src="embedder.js"></script>
+</body>
+</html>
diff --git a/extensions/test/data/web_view/media_access/deny/embedder.js b/extensions/test/data/web_view/media_access/deny/embedder.js
new file mode 100644
index 0000000..2595e73
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/deny/embedder.js
@@ -0,0 +1,214 @@
+// Copyright 2013 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.
+
+var embedder = {};
+embedder.tests = {};
+// These variables will be filled in chrome.test.getConfig() below.
+embedder.baseGuestURL = '';
+embedder.guestURL = '';
+
+embedder.passTest = function() {
+ chrome.test.sendMessage('TEST_PASSED');
+};
+
+embedder.failTest = function(opt_msg) {
+ if (opt_msg) {
+ window.console.warn(opt_msg);
+ }
+ chrome.test.sendMessage('TEST_FAILED');
+};
+
+embedder.assertTrue = function(condition, msg) {
+ if (!condition) {
+ window.console.log('embedder assertion failure: ' + msg);
+ embedder.failTest();
+ }
+};
+
+/** @private */
+embedder.setUpGuest_ = function() {
+ document.querySelector('#webview-tag-container').innerHTML =
+ '<webview style="width: 100px; height: 100px;"' +
+ ' src="' + embedder.guestURL + '"' +
+ '></webview>';
+ var webview = document.querySelector('webview');
+ embedder.assertTrue(webview, 'No <webview> element created');
+ return webview;
+};
+
+/** @private */
+embedder.setUpLoadStop_ = function(webview, testName) {
+ var onWebViewLoadStop = function(e) {
+ // Send post message to <webview> when it's ready to receive them.
+ webview.contentWindow.postMessage(
+ JSON.stringify(['check-media-permission', '' + testName]), '*');
+ };
+ webview.addEventListener('loadstop', onWebViewLoadStop);
+};
+
+/** @private */
+embedder.registerAndWaitForPostMessage_ = function(webview, testName) {
+ var onPostMessageReceived = function(e) {
+ var data = JSON.parse(e.data);
+ if (data[1] == '' + testName) {
+ embedder.assertTrue('access-denied' == data[0],
+ 'expected access-denied, found' + data[0]);
+ embedder.passTest();
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived);
+};
+
+/** @private */
+embedder.assertCorrectMediaEvent_ = function(e) {
+ embedder.assertTrue('media' == e.permission, 'permission: ' + e.permission);
+ embedder.assertTrue(!!e.url, 'e.url must be defined');
+ embedder.assertTrue(e.url.indexOf(embedder.baseGuestURL) == 0,
+ 'wrong e.url, ' + e.url);
+};
+
+// Each test loads a guest which requests media access.
+// All tests listed in this file expect the guest's request to be denied.
+//
+// Once the guest is denied media access, the guest notifies the embedder about
+// the fact via post message.
+// The embedder has to initiate a post message so that the guest can get a
+// reference to embedder to send the reply back.
+
+embedder.tests.testDeny = function testDeny() {
+ var webview = embedder.setUpGuest_();
+
+ var onPermissionRequest = function(e) {
+ chrome.test.log('Embedder notified on permissionRequest');
+ embedder.assertCorrectMediaEvent_(e);
+
+ e.request.deny();
+ // Calling allow/deny after this should raise exception.
+ ['allow', 'deny'].forEach(function(funcName) {
+ var exceptionCaught = false;
+ try {
+ e.request[funcName]();
+ } catch (exception) {
+ exceptionCaught = true;
+ }
+ if (!exceptionCaught) {
+ chrome.failTest('Expected exception on multiple e.allow()');
+ }
+ });
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ embedder.setUpLoadStop_(webview, 'test1');
+ embedder.registerAndWaitForPostMessage_(webview, 'test1');
+};
+
+embedder.tests.testDenyThenAllowThrows = function testDenyThenAllowThrows() {
+ var webview = embedder.setUpGuest_();
+
+ var exceptionCount = 0;
+ var callCount = 0;
+ var denyCalled = false;
+ var callDenyAndCheck = function(e) {
+ try {
+ if (!denyCalled) {
+ e.request.deny();
+ denyCalled = true;
+ } else {
+ e.request.allow();
+ }
+ ++callCount;
+ } catch (ex) {
+ ++exceptionCount;
+ }
+ if (callCount == 1 && exceptionCount == 1) {
+ embedder.passTest();
+ }
+ };
+
+ var onPermissionRequest1 = function(e) {
+ embedder.assertCorrectMediaEvent_(e);
+ callDenyAndCheck(e);
+ };
+ var onPermissionRequest2 = function(e) {
+ embedder.assertCorrectMediaEvent_(e);
+ callDenyAndCheck(e);
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest1);
+ webview.addEventListener('permissionrequest', onPermissionRequest2);
+
+ embedder.setUpLoadStop_(webview, 'test2');
+ embedder.registerAndWaitForPostMessage_(webview, 'test2');
+};
+
+embedder.tests.testDenyWithPreventDefault =
+ function testDenyWithPreventDefault() {
+ var webview = embedder.setUpGuest_();
+
+ var onPermissionRequest = function(e) {
+ embedder.assertCorrectMediaEvent_(e);
+ e.preventDefault();
+ // Deny asynchronously.
+ window.setTimeout(function() { e.request.deny(); });
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ embedder.setUpLoadStop_(webview, 'test3');
+ embedder.registerAndWaitForPostMessage_(webview, 'test3');
+};
+
+embedder.tests.testNoListenersImplyDeny = function testNoListenersImplyDeny() {
+ var webview = embedder.setUpGuest_();
+ embedder.setUpLoadStop_(webview, 'test4');
+ embedder.registerAndWaitForPostMessage_(webview, 'test4');
+};
+
+embedder.tests.testNoPreventDefaultImpliesDeny =
+ function testNoPreventDefaultImpliesDeny() {
+ var webview = embedder.setUpGuest_();
+
+ var onPermissionRequest = function(e) {
+ embedder.assertCorrectMediaEvent_(e);
+ window.setTimeout(function() {
+ // Allowing asynchronously. Since we didn't call preventDefault(), the
+ // request will be denied before we get here.
+ try {
+ e.request.allow();
+ } catch (exception) {
+ // Ignore.
+ }
+ });
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ embedder.setUpLoadStop_(webview, 'test5');
+ embedder.registerAndWaitForPostMessage_(webview, 'test5');
+};
+
+embedder.testNamesToTestMap = {
+ 'testDeny': embedder.tests.testDeny,
+ 'testDenyThenAllowThrows': embedder.tests.testDenyThenAllowThrows,
+ 'testDenyWithPreventDefault': embedder.tests.testDenyWithPreventDefault,
+ 'testNoListenersImplyDeny': embedder.tests.testNoListenersImplyDeny,
+ 'testNoPreventDefaultImpliesDeny':
+ embedder.tests.testNoPreventDefaultImpliesDeny
+};
+
+function runTest(testName) {
+ var testFunction = embedder.testNamesToTestMap[testName];
+ if (!testFunction) {
+ embedder.failTest('No such test: ' + testName);
+ return;
+ }
+ testFunction();
+};
+
+
+onload = function() {
+ chrome.test.getConfig(function(config) {
+ embedder.baseGuestURL = 'http://localhost:' + config.testServer.port;
+ embedder.guestURL = embedder.baseGuestURL + '/media_access_guest.html';
+ chrome.test.log('Guest url is: ' + embedder.guestURL);
+ chrome.test.sendMessage('LAUNCHED');
+ });
+};
diff --git a/extensions/test/data/web_view/media_access/deny/manifest.json b/extensions/test/data/web_view/media_access/deny/manifest.json
new file mode 100644
index 0000000..ea2ad29
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/deny/manifest.json
@@ -0,0 +1,13 @@
+{
+ "name": "Platform App Test: <webview> media",
+ "description": "Loads a guest which requests media access permission",
+ "version": "1",
+ "permissions": [
+ "webview"
+ ],
+ "app": {
+ "background": {
+ "scripts": ["test.js"]
+ }
+ }
+}
diff --git a/extensions/test/data/web_view/media_access/deny/media_access_guest.html b/extensions/test/data/web_view/media_access/deny/media_access_guest.html
new file mode 100644
index 0000000..8328a99
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/deny/media_access_guest.html
@@ -0,0 +1,50 @@
+<!--
+ * Copyright 2013 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.
+-->
+<html>
+ <head>
+ <script type="text/javascript">
+ // A guest that requests media access.
+ // Notifies the embedder about the result of the request (success/fail)
+ // via post message. Note that the embedder has to initiate a postMessage
+ // first so that guest has a reference to the embedder's window.
+
+ // The window reference of the embedder to send post message reply.
+ var embedderWindowChannel = null;
+
+ var notifyEmbedder = function(msg) {
+ embedderWindowChannel.postMessage(msg, '*');
+ };
+
+ var onUserMediaSuccess = function(stream, testCase) {
+ notifyEmbedder(JSON.stringify(['access-granted', testCase]));
+ };
+ var onUserMediaFailure = function(err, testCase) {
+ notifyEmbedder(JSON.stringify(['access-denied', testCase]));
+ };
+ var startTest = function(testCase) {
+ navigator.webkitGetUserMedia(
+ {audio: true},
+ function(stream) { onUserMediaSuccess(stream, testCase); },
+ function(err) { onUserMediaFailure(err, testCase); });
+ };
+ var onPostMessageReceived = function(e) {
+ var data = JSON.parse(e.data);
+ var testName = data[0];
+ var testCase = data[1];
+ if (testName == 'check-media-permission') {
+ embedderWindowChannel = e.source;
+
+ // Start the test once we have |embedderWindowChannel|.
+ startTest(testCase);
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived, false);
+ </script>
+ </head>
+ <body>
+ <div>This is a guest that requests audio media.</div>
+ </body>
+</html>
diff --git a/extensions/test/data/web_view/media_access/deny/test.js b/extensions/test/data/web_view/media_access/deny/test.js
new file mode 100644
index 0000000..1886432
--- /dev/null
+++ b/extensions/test/data/web_view/media_access/deny/test.js
@@ -0,0 +1,7 @@
+// Copyright 2013 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.
+
+chrome.app.runtime.onLaunched.addListener(function() {
+ chrome.app.window.create('embedder.html', {}, function () {});
+});