Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5078)

Unified Diff: chrome/test/data/extensions/platform_apps/web_view/media_access/deny/embedder.js

Issue 11093080: <webview>: First stab at implementing media permission request for guests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix file name in chrome_renderer.gypi Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/test/data/extensions/platform_apps/web_view/media_access/deny/embedder.js
diff --git a/chrome/test/data/extensions/platform_apps/web_view/media_access/deny/embedder.js b/chrome/test/data/extensions/platform_apps/web_view/media_access/deny/embedder.js
new file mode 100644
index 0000000000000000000000000000000000000000..19246c033139dcd4057f73d05b6b5a99cc89da3f
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/media_access/deny/embedder.js
@@ -0,0 +1,187 @@
+// 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 = {};
+embedder.baseGuestURL = '';
+embedder.guestURL = '';
+
+/** @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) {
+ chrome.test.fail('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) {
+ chrome.test.assertEq('access-denied', data[0]);
+ chrome.test.succeed();
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived);
+};
+
+/** @private */
+embedder.assertCorrectMediaEvent_ = function(e) {
+ chrome.test.assertEq('media', e.permission);
+ chrome.test.assertTrue(!!e.url);
+ chrome.test.assertTrue(e.url.indexOf(embedder.baseGuestURL) == 0);
+};
+
+// 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');
+ chrome.test.assertEq('media', e.permission);
+ chrome.test.assertTrue(!!e.url);
+ chrome.test.assertTrue(e.url.indexOf(embedder.baseGuestURL) == 0);
+
+ 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.test.fail('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) {
+ chrome.test.succeed();
+ }
+ };
+
+ 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');
+};
+
+onload = function() {
+ chrome.test.getConfig(function(config) {
+ embedder.baseGuestURL = 'http://localhost:' + config.testServer.port;
+ embedder.guestURL = embedder.baseGuestURL +
+ '/files/extensions/platform_apps/web_view/media_access' +
+ '/media_access_guest.html';
+ chrome.test.log('Guest url is: ' + embedder.guestURL);
+
+ chrome.test.runTests([
+ embedder.tests.testDeny,
+ embedder.tests.testDenyThenAllowThrows,
+ embedder.tests.testDenyWithPreventDefault,
+ embedder.tests.testNoListenersImplyDeny,
+ embedder.tests.testNoPreventDefaultImpliesDeny
+ ]);
+ });
+};

Powered by Google App Engine
This is Rietveld 408576698