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

Unified Diff: chrome/test/data/extensions/platform_apps/web_view/media_access/embedder_has_permission/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: Address comments from fsamuel@ 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/embedder_has_permission/embedder.js
diff --git a/chrome/test/data/extensions/platform_apps/web_view/media_access/embedder_has_permission/embedder.js b/chrome/test/data/extensions/platform_apps/web_view/media_access/embedder_has_permission/embedder.js
new file mode 100644
index 0000000000000000000000000000000000000000..c470df43c2ef1b2aaab61c632f97cad1ad50a6ef
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/media_access/embedder_has_permission/embedder.js
@@ -0,0 +1,260 @@
+// Copyright (c) 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 = '';
+embedder.guestURL2 = '';
+
+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);
+});
+
+embedder.tests.assertMediaEvent = function(e) {
+ chrome.test.assertEq('media', e.permission);
+ chrome.test.assertTrue(!!e.url);
+ chrome.test.assertTrue(e.url.indexOf(embedder.baseGuestURL) == 0);
+};
+
+embedder.tests.getGuestHTML = function(url) {
+ return '<webview style="width: 100px; height: 100px;"' +
+ ' src="' + url + '"></webview>';
+};
+
+// Loads a guest which requests media access. The embedder (platform app) has
+// acccess to media. The embedder grants access to media to the guest.
+//
+// Once the guest is allowed or 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.testMediaAccessPermissionAllow = function() {
+ var container = document.getElementById('webview-tag-container-test1');
+ container.innerHTML = embedder.tests.getGuestHTML(embedder.guestURL);
+ var webview = container.querySelector('webview');
+
+ 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.allow();
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ var onWebViewLoadStop = function(e) {
+ // Send post message to <webview> when it's ready to receive them.
+ webview.contentWindow.postMessage(
+ JSON.stringify(['check-media-permission', 'test1']), '*');
+ };
+ webview.addEventListener('loadstop', onWebViewLoadStop);
+
+ var onPostMessageReceived = function(e) {
+ var data = JSON.parse(e.data);
+ if (data[1] == 'test1') {
+ var testStatus = data[0];
+ chrome.test.assertEq('access-granted', testStatus);
+ chrome.test.succeed();
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived);
+};
+
+// Test that allows permission request in both listeners.
+// The second call to e.request.allow() would result in exception.
+embedder.tests.testMediaAccessPermissionAllowTwice = function() {
+ var container = document.getElementById('webview-tag-container-test2');
+ container.innerHTML = embedder.tests.getGuestHTML(embedder.guestURL);
+ var webview = container.querySelector('webview');
+
+ var exceptionCount = 0;
+ var callCount = 0;
+ var callAllowAndCheck = function(e) {
+ try {
+ e.request.allow();
+ ++callCount;
+ } catch (ex) {
+ ++exceptionCount;
+ }
+ if (callCount == 1 && exceptionCount == 1) {
+ chrome.test.succeed();
+ }
+ };
+
+ var onPermissionRequestAllow1 = function(e) {
+ embedder.tests.assertMediaEvent(e);
+ callAllowAndCheck(e);
+ };
+ var onPermissionRequestAllow2 = function(e) {
+ embedder.tests.assertMediaEvent(e);
+ callAllowAndCheck(e);
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequestAllow1);
+ webview.addEventListener('permissionrequest', onPermissionRequestAllow2);
+
+ var onWebViewLoadStop = function(e) {
+ // Send post message to <webview> when it's ready to receive them.
+ webview.contentWindow.frames.postMessage(
+ JSON.stringify(['check-media-permission', 'test2']), '*');
+ };
+ webview.addEventListener('loadstop', onWebViewLoadStop);
+
+ var onPostMessageReceived = function(e) {
+ var data = JSON.parse(e.data);
+ var testStatus = data[0];
+ if (data[1] == 'test2') {
+ chrome.test.assertEq('access-granted', testStatus);
+ chrome.test.succeed();
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived);
+};
+
+// Loads a guest which requests media access. The embedder (platform app) has
+// acccess to media. The embedder denies access to media to the guest.
+embedder.tests.testMediaAccessPermissionDeny = function() {
+ var container = document.getElementById('webview-tag-container-test3');
+ container.innerHTML = embedder.tests.getGuestHTML(embedder.guestURL);
+ var webview = container.querySelector('webview');
+
+ 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);
+ try {
+ e.request.deny();
+ } catch (ex) {
+ chrome.test.fail('Exception is not expected: ' + ex);
+ }
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ var onWebViewLoadStop = function(e) {
+ // Send post message to <webview> when it's ready to receive them.
+ webview.contentWindow.frames.postMessage(
+ JSON.stringify(['check-media-permission', 'test3']), '*');
+ };
+ webview.addEventListener('loadstop', onWebViewLoadStop);
+
+ var onPostMessageReceived = function(e) {
+ var data = JSON.parse(e.data);
+ if (data[1] == 'test3') {
+ var testStatus = data[0];
+ chrome.test.assertEq('access-denied', testStatus);
+ chrome.test.succeed();
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived);
+};
+
+// This test checks that not calling e.preventDefault() and not deciding on a
+// permission auto denies the permission.
+embedder.tests.testMediaAccessPermissionAutoDeny = function() {
+ var container = document.getElementById('webview-tag-container-test4');
+ container.innerHTML = embedder.tests.getGuestHTML(embedder.guestURL);
+ var webview = container.querySelector('webview');
+
+ 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);
+ // Does not call e.request.allow() or e.request.deny() or
+ // e.preventDefault();
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ var onWebViewLoadStop = function(e) {
+ // Send post message to <webview> when it's ready to receive them.
+ webview.contentWindow.frames.postMessage(
+ JSON.stringify(['check-media-permission', 'test4']), '*');
+ };
+ webview.addEventListener('loadstop', onWebViewLoadStop);
+
+ var onPostMessageReceived = function(e) {
+ var data = JSON.parse(e.data);
+ if (data[1] == 'test4') {
+ var testStatus = data[0];
+ chrome.test.assertEq('access-denied', testStatus);
+ chrome.test.succeed();
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived);
+};
+
+// Test that calls preventDefault() on the event and then calls deny() later.
+embedder.tests.testMediaAccessPermissionPreventDefault = function() {
+ var container = document.getElementById('webview-tag-container-test5');
+ container.innerHTML = embedder.tests.getGuestHTML(embedder.guestURL);
+ var webview = container.querySelector('webview');
+ if (!webview) chrome.test.fail('no webview');
+
+ var onPermissionRequest = function(e) {
+ chrome.test.log('Embedder notified on permissionRequest');
+ chrome.test.assertEq('media', e.permission);
+ chrome.test.assertTrue(!!e.url);
+
+ e.preventDefault();
+ // Decide a bit later.
+ window.setTimeout(function() {
+ chrome.test.log('Calling e.request.deny()');
+ e.request.deny();
+ }, 0);
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ var onWebViewLoadStop = function(e) {
+ // Send post message to <webview> when it's ready to receive them.
+ webview.contentWindow.frames.postMessage(
+ JSON.stringify(['check-media-permission', 'test5']), '*');
+ };
+ webview.addEventListener('loadstop', onWebViewLoadStop);
+
+ var onPostMessageReceived = function(e) {
+ var data = JSON.parse(e.data);
+ if (data[1] == 'test5') {
+ var testStatus = data[0];
+ chrome.test.assertEq('access-denied', testStatus);
+ chrome.test.succeed();
+ }
+ };
+ window.addEventListener('message', onPostMessageReceived);
+};
+
+onload = function() {
+ chrome.test.runTests([
+ function testMediaAccessPermissionAllow() {
+ chrome.test.getConfig(function(config) {
+ embedder.tests.testMediaAccessPermissionAllow();
+ });
+ },
+ function testMediaAccessPermissionAllowTwice() {
+ chrome.test.getConfig(function(config) {
+ embedder.tests.testMediaAccessPermissionAllowTwice();
+ });
+ },
+
+ function testMediaAccessPermissionDeny() {
+ chrome.test.getConfig(function(config) {
+ embedder.tests.testMediaAccessPermissionDeny();
+ });
+ },
+ function testMediaAccessPermissionAutoDeny() {
+ chrome.test.getConfig(function(config) {
+ embedder.tests.testMediaAccessPermissionAutoDeny();
+ });
+ },
+ function testMediaAccessPermissionPreventDefault() {
+ chrome.test.getConfig(function(config) {
+ embedder.tests.testMediaAccessPermissionPreventDefault();
+ });
+ }
+ ]);
+};

Powered by Google App Engine
This is Rietveld 408576698