- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / test / data / extensions / platform_apps / web_view / media_access / deny / embedder.js
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.
4
5 var embedder = {};
6 embedder.tests = {};
7 embedder.baseGuestURL = '';
8 embedder.guestURL = '';
9
10 embedder.passTest = function() {
11   chrome.test.sendMessage('PASSED');
12 };
13
14 embedder.failTest = function(opt_msg) {
15   if (opt_msg) {
16     window.console.log(opt_msg);
17   }
18   chrome.test.sendMessage('FAILED');
19 };
20
21 embedder.assertTrue = function(condition, msg) {
22   if (!condition) {
23     window.console.log('embedder assertion failure: ' + msg);
24     embedder.failTest();
25   }
26 };
27
28 /** @private */
29 embedder.setUpGuest_ = function() {
30   document.querySelector('#webview-tag-container').innerHTML =
31       '<webview style="width: 100px; height: 100px;"' +
32       ' src="' + embedder.guestURL + '"' +
33       '></webview>';
34   var webview = document.querySelector('webview');
35   embedder.assertTrue(webview, 'No <webview> element created');
36   return webview;
37 };
38
39 /** @private */
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]), '*');
45   };
46   webview.addEventListener('loadstop', onWebViewLoadStop);
47 };
48
49 /** @private */
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]);
56       embedder.passTest();
57     }
58   };
59   window.addEventListener('message', onPostMessageReceived);
60 };
61
62 /** @private */
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);
68 };
69
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.
72 //
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.
77
78 embedder.tests.testDeny = function testDeny() {
79   var webview = embedder.setUpGuest_();
80
81   var onPermissionRequest = function(e) {
82     chrome.test.log('Embedder notified on permissionRequest');
83     embedder.assertCorrectMediaEvent_(e);
84
85     e.request.deny();
86     // Calling allow/deny after this should raise exception.
87     ['allow', 'deny'].forEach(function(funcName) {
88       var exceptionCaught = false;
89       try {
90         e.request[funcName]();
91       } catch (exception) {
92         exceptionCaught = true;
93       }
94       if (!exceptionCaught) {
95         chrome.failTest('Expected exception on multiple e.allow()');
96       }
97     });
98   };
99   webview.addEventListener('permissionrequest', onPermissionRequest);
100
101   embedder.setUpLoadStop_(webview, 'test1');
102   embedder.registerAndWaitForPostMessage_(webview, 'test1');
103 };
104
105 embedder.tests.testDenyThenAllowThrows = function testDenyThenAllowThrows() {
106   var webview = embedder.setUpGuest_();
107
108   var exceptionCount = 0;
109   var callCount = 0;
110   var denyCalled = false;
111   var callDenyAndCheck = function(e) {
112     try {
113       if (!denyCalled) {
114         e.request.deny();
115         denyCalled = true;
116       } else {
117         e.request.allow();
118       }
119       ++callCount;
120     } catch (ex) {
121       ++exceptionCount;
122     }
123     if (callCount == 1 && exceptionCount == 1) {
124       embedder.passTest();
125     }
126   };
127
128   var onPermissionRequest1 = function(e) {
129     embedder.assertCorrectMediaEvent_(e);
130     callDenyAndCheck(e);
131   };
132   var onPermissionRequest2 = function(e) {
133     embedder.assertCorrectMediaEvent_(e);
134     callDenyAndCheck(e);
135   };
136   webview.addEventListener('permissionrequest', onPermissionRequest1);
137   webview.addEventListener('permissionrequest', onPermissionRequest2);
138
139   embedder.setUpLoadStop_(webview, 'test2');
140   embedder.registerAndWaitForPostMessage_(webview, 'test2');
141 };
142
143 embedder.tests.testDenyWithPreventDefault =
144     function testDenyWithPreventDefault() {
145   var webview = embedder.setUpGuest_();
146
147   var onPermissionRequest = function(e) {
148     embedder.assertCorrectMediaEvent_(e);
149     e.preventDefault();
150     // Deny asynchronously.
151     window.setTimeout(function() { e.request.deny(); });
152   };
153   webview.addEventListener('permissionrequest', onPermissionRequest);
154
155   embedder.setUpLoadStop_(webview, 'test3');
156   embedder.registerAndWaitForPostMessage_(webview, 'test3');
157 };
158
159 embedder.tests.testNoListenersImplyDeny = function testNoListenersImplyDeny() {
160   var webview = embedder.setUpGuest_();
161   embedder.setUpLoadStop_(webview, 'test4');
162   embedder.registerAndWaitForPostMessage_(webview, 'test4');
163 };
164
165 embedder.tests.testNoPreventDefaultImpliesDeny =
166     function testNoPreventDefaultImpliesDeny() {
167   var webview = embedder.setUpGuest_();
168
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.
174       try {
175         e.request.allow();
176       } catch (exception) {
177         // Ignore.
178       }
179     });
180   };
181   webview.addEventListener('permissionrequest', onPermissionRequest);
182
183   embedder.setUpLoadStop_(webview, 'test5');
184   embedder.registerAndWaitForPostMessage_(webview, 'test5');
185 };
186
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
194 };
195
196 window['startDenyTest'] = function(testName) {
197   var testFunction = embedder.testNamesToTestMap[testName];
198   if (!testFunction) {
199     embedder.failTest('No such test: ' + testName);
200     return;
201   }
202   testFunction();
203 };
204
205
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');
214   });
215 };