diff options
author | lfg <lfg@chromium.org> | 2014-10-07 08:09:53 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-07 15:10:13 +0000 |
commit | 12dec866ef80260531951251b31a4b4886bf8be3 (patch) | |
tree | 2c0c796d8463b3d1bace27fa99606ac498dddf65 /extensions/test | |
parent | 9be182e92137c8f23c7e3e5f8d58aaa66c8f0ea4 (diff) | |
download | chromium_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')
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 () {}); +}); |