- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / test / data / extensions / platform_apps / web_view / media_access / allow / 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 // Sends a message to WebViewTest denoting it is done and test
11 // has failed.
12 embedder.failTest = function(msg) {
13   window.console.log('test failure, reason: ' + msg);
14   chrome.test.sendMessage('DoneMediaTest.FAILED');
15 };
16
17 // Sends a message to WebViewTest denoting it is done and test
18 // has succeeded.
19 embedder.maybePassTest = function() {
20   window.console.log('test passed');
21   chrome.test.sendMessage('DoneMediaTest.PASSED');
22 };
23
24 /** @private */
25 embedder.setUpGuest_ = function() {
26   document.querySelector('#webview-tag-container').innerHTML =
27       '<webview style="width: 100px; height: 100px;"' +
28       ' src="' + embedder.guestURL + '"' +
29       '></webview>';
30   var webview = document.querySelector('webview');
31   if (!webview) {
32     embedder.failTest('No <webview> element created');
33     return null;
34   }
35   return webview;
36 };
37
38 /** @private */
39 embedder.setUpLoadStop_ = function(webview, testName) {
40   var onWebViewLoadStop = function(e) {
41     // Send post message to <webview> when it's ready to receive them.
42     // This will make the guest start issueing media request. We do not
43     // worry about the Javascript outcome. MockWebContestsDelegate in
44     // WebViewTest will take care of that.
45     webview.contentWindow.postMessage(
46         JSON.stringify(['check-media-permission', '' + testName]), '*');
47   };
48   webview.addEventListener('loadstop', onWebViewLoadStop);
49 };
50
51 /** @private */
52 embedder.assertCorrectMediaEvent_ = function(e) {
53   if (e.permission != 'media') {
54     embedder.failTest('wrong permission: ' + e.permission);
55     return false;
56   }
57   if (!e.url) {
58     embedder.failTest('No url property in event');
59     return false;
60   }
61   if (e.url.indexOf(embedder.baseGuestURL)) {
62     embedder.failTest('Wrong url: ' + e.rul +
63         ', expected url to start with ' + embedder.baseGuestURL);
64     return false;
65   }
66   return true;
67 };
68
69 // Each test loads a guest which requests media access.
70 // All tests listed in this file expect the guest's request to be allowed.
71 //
72 // Once the guest is allowed media access, the MockWebContestsDelegate catches
73 // the fact and the test succeeds.
74 //
75 // Note that this is a manually run test, not using chrome.test.runTests.
76 // This is because we want to wait for MockWebContestsDelegate to catch media
77 // access request and not actually issue the media request.
78
79 embedder.tests.testAllow = function() {
80   var webview = embedder.setUpGuest_();
81   if (!webview) {
82     return;
83   }
84
85   var onPermissionRequest = function(e) {
86     if (!embedder.assertCorrectMediaEvent_(e)) {
87       return;
88     }
89     e.request.allow();
90     embedder.maybePassTest();
91   };
92   webview.addEventListener('permissionrequest', onPermissionRequest);
93
94   embedder.setUpLoadStop_(webview, 'test1');
95 };
96
97 embedder.tests.testAllowAndThenDeny = function() {
98   var webview = embedder.setUpGuest_();
99   if (!webview) {
100     return;
101   }
102
103   var calledAllow = false;
104   var callCount = 0;
105   var exceptionCount = 0;
106   var checkAndCall = function(e) {
107     if (!embedder.assertCorrectMediaEvent_(e)) {
108       return;
109     }
110
111     if (!calledAllow) {
112       e.request.allow();
113       calledAllow = true;
114       ++callCount
115     } else {
116       try {
117         e.request.deny();
118       } catch (exception) {
119         ++exceptionCount;
120       }
121     }
122
123     if (callCount == 1 && exceptionCount == 1) {
124       embedder.maybePassTest();
125     }
126   };
127
128   var onPermissionRequest1 = function(e) {
129     checkAndCall(e);
130   };
131   var onPermissionRequest2 = function(e) {
132     checkAndCall(e);
133   };
134   webview.addEventListener('permissionrequest', onPermissionRequest1);
135   webview.addEventListener('permissionrequest', onPermissionRequest2);
136
137   embedder.setUpLoadStop_(webview, 'test1');
138 };
139
140 embedder.tests.testAllowTwice = function() {
141   var webview = embedder.setUpGuest_();
142   if (!webview) {
143     return;
144   }
145
146   var calledAllow = false;
147   var callbackCount = 0;
148   var exceptionCount = 0;
149   var checkAndCall = function(e) {
150     if (!embedder.assertCorrectMediaEvent_(e)) {
151       return;
152     }
153
154     ++callbackCount;
155     try {
156       e.request.allow();
157     } catch (exception) {
158       ++exceptionCount;
159     }
160
161     if (callbackCount == 2) {
162       if (exceptionCount == 1) {
163         embedder.maybePassTest();
164       } else {
165         embedder.failTest('Expected exceptionCount 1, but got ' +
166             exceptionCount);
167       }
168     }
169   };
170
171   var onPermissionRequest1 = function(e) {
172     checkAndCall(e);
173   };
174   var onPermissionRequest2 = function(e) {
175     checkAndCall(e);
176   };
177   webview.addEventListener('permissionrequest', onPermissionRequest1);
178   webview.addEventListener('permissionrequest', onPermissionRequest2);
179
180   embedder.setUpLoadStop_(webview, 'test1');
181 };
182
183 embedder.tests.testAllowAsync = function() {
184   var webview = embedder.setUpGuest_();
185   if (!webview) {
186     return;
187   }
188
189   var onPermissionRequest = function(e) {
190     if (!embedder.assertCorrectMediaEvent_(e)) {
191       return;
192     }
193
194     e.preventDefault();
195     // Decide asynchronously.
196     window.setTimeout(function() {
197       e.request.allow();
198       embedder.maybePassTest();
199     }, 0);
200   };
201   webview.addEventListener('permissionrequest', onPermissionRequest);
202
203   embedder.setUpLoadStop_(webview, 'test1');
204 };
205
206 embedder.tests.list = {
207   'testAllow': embedder.tests.testAllow,
208   'testAllowAndThenDeny': embedder.tests.testAllowAndThenDeny,
209   'testAllowTwice': embedder.tests.testAllowTwice,
210   'testAllowAsync': embedder.tests.testAllowAsync
211 };
212
213 // Entry point for test, called by WebViewTest.
214 function startAllowTest(testName) {
215   chrome.test.getConfig(function(config) {
216     embedder.baseGuestURL = 'http://localhost:' + config.testServer.port;
217     embedder.guestURL = embedder.baseGuestURL +
218         '/extensions/platform_apps/web_view/media_access' +
219         '/media_access_guest.html';
220     chrome.test.log('Guest url is: ' + embedder.guestURL);
221
222     var testFunction = embedder.tests.list[testName];
223     if (!testFunction) {
224       embedder.failTest('No such test: ' + testName);
225       return;
226     }
227     testFunction();
228   });
229 }
230
231 onload = function() {
232   chrome.test.sendMessage('Launched');
233 };