1 // Copyright 2013 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.
7 embedder.baseGuestURL = '';
8 embedder.guestURL = '';
10 embedder.passTest = function() {
11 chrome.test.sendMessage('PASSED');
14 embedder.failTest = function(opt_msg) {
16 window.console.log(opt_msg);
18 chrome.test.sendMessage('FAILED');
21 embedder.assertTrue = function(condition, msg) {
23 window.console.log('embedder assertion failure: ' + msg);
29 embedder.setUpGuest_ = function() {
30 document.querySelector('#webview-tag-container').innerHTML =
31 '<webview style="width: 100px; height: 100px;"' +
32 ' src="' + embedder.guestURL + '"' +
34 var webview = document.querySelector('webview');
35 embedder.assertTrue(webview, 'No <webview> element created');
40 embedder.setUpLoadStop_ = function(webview, testName) {
41 var onWebViewLoadStop = function(e) {
42 // Send post message to <webview> when it's ready to receive them.
43 webview.contentWindow.postMessage(
44 JSON.stringify(['check-media-permission', '' + testName]), '*');
46 webview.addEventListener('loadstop', onWebViewLoadStop);
50 embedder.registerAndWaitForPostMessage_ = function(webview, testName) {
51 var onPostMessageReceived = function(e) {
52 var data = JSON.parse(e.data);
53 if (data[1] == '' + testName) {
54 embedder.assertTrue('access-denied' == data[0],
55 'expected access-denied, found' + data[0]);
59 window.addEventListener('message', onPostMessageReceived);
63 embedder.assertCorrectMediaEvent_ = function(e) {
64 embedder.assertTrue('media' == e.permission, 'permission: ' + e.permission);
65 embedder.assertTrue(!!e.url, 'e.url must be defined');
66 embedder.assertTrue(e.url.indexOf(embedder.baseGuestURL) == 0,
67 'wrong e.url, ' + e.url);
70 // Each test loads a guest which requests media access.
71 // All tests listed in this file expect the guest's request to be denied.
73 // Once the guest is denied media access, the guest notifies the embedder about
74 // the fact via post message.
75 // The embedder has to initiate a post message so that the guest can get a
76 // reference to embedder to send the reply back.
78 embedder.tests.testDeny = function testDeny() {
79 var webview = embedder.setUpGuest_();
81 var onPermissionRequest = function(e) {
82 chrome.test.log('Embedder notified on permissionRequest');
83 embedder.assertCorrectMediaEvent_(e);
86 // Calling allow/deny after this should raise exception.
87 ['allow', 'deny'].forEach(function(funcName) {
88 var exceptionCaught = false;
90 e.request[funcName]();
92 exceptionCaught = true;
94 if (!exceptionCaught) {
95 chrome.failTest('Expected exception on multiple e.allow()');
99 webview.addEventListener('permissionrequest', onPermissionRequest);
101 embedder.setUpLoadStop_(webview, 'test1');
102 embedder.registerAndWaitForPostMessage_(webview, 'test1');
105 embedder.tests.testDenyThenAllowThrows = function testDenyThenAllowThrows() {
106 var webview = embedder.setUpGuest_();
108 var exceptionCount = 0;
110 var denyCalled = false;
111 var callDenyAndCheck = function(e) {
123 if (callCount == 1 && exceptionCount == 1) {
128 var onPermissionRequest1 = function(e) {
129 embedder.assertCorrectMediaEvent_(e);
132 var onPermissionRequest2 = function(e) {
133 embedder.assertCorrectMediaEvent_(e);
136 webview.addEventListener('permissionrequest', onPermissionRequest1);
137 webview.addEventListener('permissionrequest', onPermissionRequest2);
139 embedder.setUpLoadStop_(webview, 'test2');
140 embedder.registerAndWaitForPostMessage_(webview, 'test2');
143 embedder.tests.testDenyWithPreventDefault =
144 function testDenyWithPreventDefault() {
145 var webview = embedder.setUpGuest_();
147 var onPermissionRequest = function(e) {
148 embedder.assertCorrectMediaEvent_(e);
150 // Deny asynchronously.
151 window.setTimeout(function() { e.request.deny(); });
153 webview.addEventListener('permissionrequest', onPermissionRequest);
155 embedder.setUpLoadStop_(webview, 'test3');
156 embedder.registerAndWaitForPostMessage_(webview, 'test3');
159 embedder.tests.testNoListenersImplyDeny = function testNoListenersImplyDeny() {
160 var webview = embedder.setUpGuest_();
161 embedder.setUpLoadStop_(webview, 'test4');
162 embedder.registerAndWaitForPostMessage_(webview, 'test4');
165 embedder.tests.testNoPreventDefaultImpliesDeny =
166 function testNoPreventDefaultImpliesDeny() {
167 var webview = embedder.setUpGuest_();
169 var onPermissionRequest = function(e) {
170 embedder.assertCorrectMediaEvent_(e);
171 window.setTimeout(function() {
172 // Allowing asynchronously. Since we didn't call preventDefault(), the
173 // request will be denied before we get here.
176 } catch (exception) {
181 webview.addEventListener('permissionrequest', onPermissionRequest);
183 embedder.setUpLoadStop_(webview, 'test5');
184 embedder.registerAndWaitForPostMessage_(webview, 'test5');
187 embedder.testNamesToTestMap = {
188 'testDeny': embedder.tests.testDeny,
189 'testDenyThenAllowThrows': embedder.tests.testDenyThenAllowThrows,
190 'testDenyWithPreventDefault': embedder.tests.testDenyWithPreventDefault,
191 'testNoListenersImplyDeny': embedder.tests.testNoListenersImplyDeny,
192 'testNoPreventDefaultImpliesDeny':
193 embedder.tests.testNoPreventDefaultImpliesDeny
196 window['startDenyTest'] = function(testName) {
197 var testFunction = embedder.testNamesToTestMap[testName];
199 embedder.failTest('No such test: ' + testName);
206 onload = function() {
207 chrome.test.getConfig(function(config) {
208 embedder.baseGuestURL = 'http://localhost:' + config.testServer.port;
209 embedder.guestURL = embedder.baseGuestURL +
210 '/extensions/platform_apps/web_view/media_access' +
211 '/media_access_guest.html';
212 chrome.test.log('Guest url is: ' + embedder.guestURL);
213 chrome.test.sendMessage('loaded');