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

Unified Diff: chrome/test/data/extensions/platform_apps/web_view/media_access/allow/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 header guard name. 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/allow/embedder.js
diff --git a/chrome/test/data/extensions/platform_apps/web_view/media_access/allow/embedder.js b/chrome/test/data/extensions/platform_apps/web_view/media_access/allow/embedder.js
new file mode 100644
index 0000000000000000000000000000000000000000..4b59f779412f605df84baef87f41d4ebe2ca7209
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/media_access/allow/embedder.js
@@ -0,0 +1,245 @@
+// 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.testStatus = '';
+
+// Sends a message to WebViewTest denoting it is done and test
+// has failed.
+embedder.failTest = function(msg) {
+ embedder.testStatus = 'FAILED';
+ chrome.test.log('test failure, reason: ' + msg);
+ chrome.test.sendMessage('DoneMediaTest');
+};
+
+// Sends a message to WebViewTest denoting it is done and test
+// has succeeded, iff the test has not already failed.
+embedder.maybePassTest = function() {
+ if (embedder.testStatus != 'FAILED') {
+ embedder.testStatus = 'PASSED';
+ }
+ chrome.test.sendMessage('DoneMediaTest');
+};
+
+// Called by browser_tests to query test state.
+function getTestStatus() {
+ chrome.test.log('getTestStatus called: status = ' + embedder.testStatus);
+ return embedder.testStatus;
+};
+
+/** @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) {
+ embedder.failTest('No <webview> element created');
+ return null;
+ }
+ return webview;
+};
+
+/** @private */
+embedder.setUpLoadStop_ = function(webview, testName) {
+ var onWebViewLoadStop = function(e) {
+ // Send post message to <webview> when it's ready to receive them.
+ // This will make the guest start issueing media request. We do not
+ // worry about the Javascript outcome. MockWebContestsDelegate in
+ // WebViewTest will take care of that.
+ webview.contentWindow.postMessage(
+ JSON.stringify(['check-media-permission', '' + testName]), '*');
+ };
+ webview.addEventListener('loadstop', onWebViewLoadStop);
+};
+
+/** @private */
+embedder.assertCorrectMediaEvent_ = function(e) {
+ if (e.permission != 'media') {
+ embedder.failTest('wrong permission: ' + e.permission);
+ return false;
+ }
+ if (!e.url) {
+ embedder.failTest('No url property in event');
+ return false;
+ }
+ if (e.url.indexOf(embedder.baseGuestURL)) {
+ embedder.failTest('Wrong url: ' + e.rul +
+ ', expected url to start with ' + embedder.baseGuestURL);
+ return false;
+ }
+ return true;
+};
+
+// Each test loads a guest which requests media access.
+// All tests listed in this file expect the guest's request to be allowed.
+//
+// Once the guest is allowed media access, the MockWebContestsDelegate catches
+// the fact and the test succeeds.
+//
+// Note that this is a manually run test, not using chrome.test.runTests.
+// This is because we want to wait for MockWebContestsDelegate to catch media
+// access request and not actually issue the media request.
+
+embedder.tests.testAllow = function() {
+ var webview = embedder.setUpGuest_();
+ if (!webview) {
+ return;
+ }
+
+ var onPermissionRequest = function(e) {
+ if (!embedder.assertCorrectMediaEvent_(e)) {
+ return;
+ }
+ e.request.allow();
+ embedder.maybePassTest();
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ embedder.setUpLoadStop_(webview, 'test1');
+};
+
+embedder.tests.testAllowAndThenDeny = function() {
+ var webview = embedder.setUpGuest_();
+ if (!webview) {
+ return;
+ }
+
+ var calledAllow = false;
+ var callCount = 0;
+ var exceptionCount = 0;
+ var checkAndCall = function(e) {
+ if (!embedder.assertCorrectMediaEvent_(e)) {
+ return;
+ }
+
+ if (!calledAllow) {
+ e.request.allow();
+ calledAllow = true;
+ ++callCount
+ } else {
+ try {
+ e.request.deny();
+ } catch (exception) {
+ ++exceptionCount;
+ }
+ }
+
+ if (callCount == 1 && exceptionCount == 1) {
+ embedder.maybePassTest();
+ }
+ };
+
+ var onPermissionRequest1 = function(e) {
+ checkAndCall(e);
+ };
+ var onPermissionRequest2 = function(e) {
+ checkAndCall(e);
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest1);
+ webview.addEventListener('permissionrequest', onPermissionRequest2);
+
+ embedder.setUpLoadStop_(webview, 'test1');
+};
+
+embedder.tests.testAllowTwice = function() {
+ var webview = embedder.setUpGuest_();
+ if (!webview) {
+ return;
+ }
+
+ var calledAllow = false;
+ var callbackCount = 0;
+ var exceptionCount = 0;
+ var checkAndCall = function(e) {
+ if (!embedder.assertCorrectMediaEvent_(e)) {
+ return;
+ }
+
+ ++callbackCount;
+ try {
+ e.request.allow();
+ } catch (exception) {
+ ++exceptionCount;
+ }
+
+ if (callbackCount == 2) {
+ if (exceptionCount == 1) {
+ embedder.maybePassTest();
+ } else {
+ embedder.failTest('Expected exceptionCount 1, but got ' +
+ exceptionCount);
+ }
+ }
+ };
+
+ var onPermissionRequest1 = function(e) {
+ checkAndCall(e);
+ };
+ var onPermissionRequest2 = function(e) {
+ checkAndCall(e);
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest1);
+ webview.addEventListener('permissionrequest', onPermissionRequest2);
+
+ embedder.setUpLoadStop_(webview, 'test1');
+};
+
+embedder.tests.testAllowAsync = function() {
+ var webview = embedder.setUpGuest_();
+ if (!webview) {
+ return;
+ }
+
+ var onPermissionRequest = function(e) {
+ if (!embedder.assertCorrectMediaEvent_(e)) {
+ return;
+ }
+
+ e.preventDefault();
+ // Decide asynchronously.
+ window.setTimeout(function() {
+ e.request.allow();
+ embedder.maybePassTest();
+ }, 0);
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ embedder.setUpLoadStop_(webview, 'test1');
+};
+
+embedder.tests.list = {
+ 'testAllow': embedder.tests.testAllow,
+ 'testAllowAndThenDeny': embedder.tests.testAllowAndThenDeny,
+ 'testAllowTwice': embedder.tests.testAllowTwice,
+ 'testAllowAsync': embedder.tests.testAllowAsync
+};
+
+// Entry point for test, called by WebViewTest.
+function startAllowTest(testName) {
+ 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);
+
+ var testFunction = embedder.tests.list[testName];
+ if (!testFunction) {
+ embedder.failTest('No such test: ' + testName);
+ return;
+ }
+ embedder.testStatus = '';
+ testFunction();
+ });
+}
+
+onload = function() {
+ chrome.test.sendMessage('Launched');
+};

Powered by Google App Engine
This is Rietveld 408576698