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

Unified Diff: chrome/test/data/extensions/platform_apps/web_view/geolocation/embedder_has_permission/embedder.js

Issue 13712002: Fix Guest geolocation API, we were using |bridge_id| and |request_id| interchangeably which is wron… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync. Created 7 years, 8 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/geolocation/embedder_has_permission/embedder.js
diff --git a/chrome/test/data/extensions/platform_apps/web_view/geolocation/embedder_has_permission/embedder.js b/chrome/test/data/extensions/platform_apps/web_view/geolocation/embedder_has_permission/embedder.js
index 8fc9e6ba0d742d15d5a329a0abc98230222cccf0..12cd2e6d9bcd60e61396a12d111ab3c3a2fc8c56 100644
--- a/chrome/test/data/extensions/platform_apps/web_view/geolocation/embedder_has_permission/embedder.js
+++ b/chrome/test/data/extensions/platform_apps/web_view/geolocation/embedder_has_permission/embedder.js
@@ -3,15 +3,37 @@
// found in the LICENSE file.
var embedder = {};
-embedder.tests = {};
+embedder.test = {};
embedder.baseGuestURL = '';
embedder.guestURL = '';
-embedder.setUp = function(config) {
+// window.* exported functions begin (called by WebViewTest).
+window.hasTestPassed = function() {
+ return embedder.testStatus == TEST_STATUS.PASSED;
+};
+
+window.runGeolocationTest = function(testName) {
+ if (!embedder.test.testList[testName]) {
+ console.log('Incorrect testName: ' + testName);
+ embedder.test.fail();
+ return;
+ }
+
+ // Run the test.
+ embedder.test.testList[testName]();
+};
+// window.* exported functions end.
+
+
+/** @private */
+embedder.setUp_ = function(config) {
embedder.baseGuestURL = 'http://localhost:' + config.testServer.port;
embedder.guestURL = embedder.baseGuestURL +
'/files/extensions/platform_apps/web_view/geolocation' +
'/geolocation_access_guest.html';
+ embedder.iframeURL = embedder.baseGuestURL +
+ '/files/extensions/platform_apps/web_view/geolocation' +
+ '/geolocation_access_iframe.html';
chrome.test.log('Guest url is: ' + embedder.guestURL);
};
@@ -23,21 +45,67 @@ embedder.setUpGuest_ = function() {
'></webview>';
var webview = document.querySelector('webview');
if (!webview) {
- chrome.test.fail('No <webview> element created');
+ console.log('No <webview> element created');
+ embedder.test.fail();
}
return webview;
};
+var TEST_STATUS = {
+ WAITING: 0,
+ FAILED: 1,
+ PASSED: 2
+};
+embedder.testStatus = TEST_STATUS.WAITING;
+
+embedder.test = {};
+embedder.test.fail = function() {
+ embedder.testStatus = TEST_STATUS.FAILED;
+ chrome.test.sendMessage('DoneGeolocationTest');
+};
+embedder.test.succeed = function() {
+ if (embedder.testStatus != TEST_STATUS.FAILED) {
+ embedder.testStatus = TEST_STATUS.PASSED;
+ chrome.test.sendMessage('DoneGeolocationTest');
+ }
+};
+
+embedder.test.assertEq = function(a, b) {
+ if (a != b) {
+ console.log('assertion failed: ' + a + ' != ' + b);
+ embedder.test.fail();
+ }
+};
+embedder.test.assertTrue = function(condition) {
+ if (!condition) {
+ console.log('assertion failed: true != ' + condition);
+ embedder.test.fail();
+ }
+};
+embedder.test.assertFalse = function(condition) {
+ if (condition) {
+ console.log('assertion failed: false != ' + condition);
+ embedder.test.fail();
+ }
+};
+
/** @private */
-embedder.setUpLoadStop_ = function(webview, testName) {
- var onWebViewLoadStop = function(e) {
+embedder.setUpLoadCommit_ = function(webview, testName, opt_iframeURL) {
+ var onWebViewLoadCommit = function(e) {
+ if (!e.isTopLevel) {
+ return;
+ }
// Send post message to <webview> when it's ready to receive them.
- webview.contentWindow.postMessage(
- JSON.stringify(['check-geolocation-permission', '' + testName]), '*');
+ var msgArray = ['check-geolocation-permission', '' + testName];
+ if (opt_iframeURL) {
+ msgArray.push(opt_iframeURL);
+ }
+ webview.contentWindow.postMessage(JSON.stringify(msgArray), '*');
};
- webview.addEventListener('loadstop', onWebViewLoadStop);
+ webview.addEventListener('loadcommit', onWebViewLoadCommit);
};
+
/** @private */
embedder.registerAndWaitForPostMessage_ = function(
webview, expectedData) {
@@ -45,8 +113,11 @@ embedder.registerAndWaitForPostMessage_ = function(
var onPostMessageReceived = function(e) {
var data = JSON.parse(e.data);
if (data[0] == '' + testName) {
- chrome.test.assertEq(expectedData, data);
- chrome.test.succeed();
+ embedder.test.assertEq(expectedData.length, data.length);
+ for (var i = 0; i < expectedData.length; ++i) {
+ embedder.test.assertEq(expectedData[i], data[i]);
+ }
+ embedder.test.succeed();
}
};
window.addEventListener('message', onPostMessageReceived);
@@ -54,13 +125,13 @@ embedder.registerAndWaitForPostMessage_ = function(
/** @private */
embedder.assertCorrectEvent_ = function(e) {
- chrome.test.assertEq('geolocation', e.permission);
- chrome.test.assertTrue(!!e.url);
- chrome.test.assertTrue(e.url.indexOf(embedder.baseGuestURL) == 0);
+ embedder.test.assertEq('geolocation', e.permission);
+ embedder.test.assertTrue(!!e.url);
+ embedder.test.assertTrue(e.url.indexOf(embedder.baseGuestURL) == 0);
// Check that unexpected properties (from other permissionrequest) do not show
// up in the event object.
- chrome.test.assertFalse('userGesture' in e);
+ embedder.test.assertFalse('userGesture' in e);
};
// Tests begin.
@@ -69,10 +140,18 @@ embedder.assertCorrectEvent_ = function(e) {
// 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.
+//
+// We have to run each test (from embedder.test.testList) in a separate platform
+// app. Running multiple tests mocking geolocation in a single platform app is
+// not reliable due to the nature of ui_test_utils::OverrideGeolocation().
+// Therefore we run this tests manually (a.k.a non-RunPlatformAppTest) so we do
+// not have to copy the platform app n times for running n JavaScript tests.
+// TODO(lazyboy): Look into implementing something similar to
+// RunExtensionSubtest() for platform apps.
// Loads a guest which requests geolocation. The embedder (platform app) has
// acccess to geolocation and allows geolocation for the guest.
-embedder.tests.testAllow = function testAllow() {
+function testAllow() {
var webview = embedder.setUpGuest_();
var onPermissionRequest = function(e) {
@@ -82,15 +161,15 @@ embedder.tests.testAllow = function testAllow() {
};
webview.addEventListener('permissionrequest', onPermissionRequest);
- embedder.setUpLoadStop_(webview, 'test1');
+ embedder.setUpLoadCommit_(webview, 'test1');
// WebViewTest sets (mock) lat, lng to 10, 20.
embedder.registerAndWaitForPostMessage_(
webview, ['test1', 'access-granted', 10, 20]);
-};
+}
// Loads a guest which requests geolocation. The embedder (platform app) has
// acccess to geolocation, but denies geolocation for the guest.
-embedder.tests.testDeny = function testDeny() {
+function testDeny() {
var webview = embedder.setUpGuest_();
var onPermissionRequest = function(e) {
@@ -100,17 +179,37 @@ embedder.tests.testDeny = function testDeny() {
};
webview.addEventListener('permissionrequest', onPermissionRequest);
- embedder.setUpLoadStop_(webview, 'test2');
+ embedder.setUpLoadCommit_(webview, 'test2');
embedder.registerAndWaitForPostMessage_(
webview, ['test2', 'access-denied']);
+}
+
+// The guest opens an <iframe>. The <iframe> also requests geolocation.
+// This results in geolocation requests go to a BrowserPluginGuest with
+// different bridge_id-s.
+function testMultipleBridgeIdAllow() {
+ var webview = embedder.setUpGuest_();
+
+ var onPermissionRequest = function(e) {
+ embedder.assertCorrectEvent_(e);
+ e.request.allow();
+ };
+ webview.addEventListener('permissionrequest', onPermissionRequest);
+
+ embedder.setUpLoadCommit_(webview, 'test3', embedder.iframeURL);
+ embedder.registerAndWaitForPostMessage_(
+ webview, ['test3', 'access-granted', 10, 20]);
+}
+
+embedder.test.testList = {
+ 'testAllow': testAllow,
+ 'testDeny': testDeny,
+ 'testMultipleBridgeIdAllow': testMultipleBridgeIdAllow
};
onload = function() {
chrome.test.getConfig(function(config) {
- embedder.setUp(config);
- chrome.test.runTests([
- embedder.tests.testAllow,
- embedder.tests.testDeny
- ]);
+ embedder.setUp_(config);
+ chrome.test.sendMessage('Launched');
});
};

Powered by Google App Engine
This is Rietveld 408576698