summaryrefslogtreecommitdiffstats
path: root/extensions/test
diff options
context:
space:
mode:
authorlfg <lfg@chromium.org>2014-10-03 17:19:51 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-04 00:20:56 +0000
commit0cac70342fdc5f7532f26b8954e4f8519c609dc1 (patch)
tree259730d7a79638bcb33e875bd322430bd080b9b7 /extensions/test
parent03b7f3e70812a1e03aeaf545a6efaeb1804f8281 (diff)
downloadchromium_src-0cac70342fdc5f7532f26b8954e4f8519c609dc1.zip
chromium_src-0cac70342fdc5f7532f26b8954e4f8519c609dc1.tar.gz
chromium_src-0cac70342fdc5f7532f26b8954e4f8519c609dc1.tar.bz2
Adding more webview tests to app_shell_browsertests.
This CL adds the following tests to app_shell_browsertests: TestLoadStartLoadRedirect TestNewWindow TestNewWindowNoPreventDefault TestNewWindowNoReferrerLink TestNewWindowTwoListeners TestOnEventProperty TestRemoveWebviewOnExit BUG=352293 Review URL: https://codereview.chromium.org/624983003 Cr-Commit-Position: refs/heads/master@{#298131}
Diffstat (limited to 'extensions/test')
-rw-r--r--extensions/test/data/web_view/apitest/empty_guest.html13
-rw-r--r--extensions/test/data/web_view/apitest/guest_noreferrer.html20
-rw-r--r--extensions/test/data/web_view/apitest/guest_redirect.html10
-rw-r--r--extensions/test/data/web_view/apitest/main.js183
4 files changed, 224 insertions, 2 deletions
diff --git a/extensions/test/data/web_view/apitest/empty_guest.html b/extensions/test/data/web_view/apitest/empty_guest.html
new file mode 100644
index 0000000..d375fe4
--- /dev/null
+++ b/extensions/test/data/web_view/apitest/empty_guest.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<!--
+ * 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.
+-->
+<html>
+<head>
+ <title>A simple guest that does nothing.</title>
+</head>
+<body>
+</body>
+</html>
diff --git a/extensions/test/data/web_view/apitest/guest_noreferrer.html b/extensions/test/data/web_view/apitest/guest_noreferrer.html
new file mode 100644
index 0000000..06f2dea
--- /dev/null
+++ b/extensions/test/data/web_view/apitest/guest_noreferrer.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<!--
+ * 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.
+-->
+<html>
+<head>
+ <title>A guest that opens a new window.</title>
+ <script type="text/javascript">
+ window.onload = function() {
+ document.getElementById('link').click();
+ };
+ </script>
+</head>
+<body style="padding: 0; margin: 0;">
+<a id="link" href="data:text/html,<html><body>Noreferrer guest</body></html>"
+ rel="noreferrer" target="_blank">Link</a>
+</body>
+</html>
diff --git a/extensions/test/data/web_view/apitest/guest_redirect.html b/extensions/test/data/web_view/apitest/guest_redirect.html
new file mode 100644
index 0000000..ec3d7d7
--- /dev/null
+++ b/extensions/test/data/web_view/apitest/guest_redirect.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<!--
+ * 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.
+-->
+<html>
+<body style="padding: 0; margin: 0;">
+</body>
+</html>
diff --git a/extensions/test/data/web_view/apitest/main.js b/extensions/test/data/web_view/apitest/main.js
index 8b43293..3fe1274 100644
--- a/extensions/test/data/web_view/apitest/main.js
+++ b/extensions/test/data/web_view/apitest/main.js
@@ -5,14 +5,19 @@
var embedder = {};
// TODO(lfg) Move these functions to a common js.
-embedder.closeSocketURL = '';
-
embedder.setUp_ = function(config) {
if (!config || !config.testServer) {
return;
}
embedder.baseGuestURL = 'http://localhost:' + config.testServer.port;
embedder.closeSocketURL = embedder.baseGuestURL + '/close-socket';
+ embedder.emptyGuestURL = embedder.baseGuestURL + '/empty_guest.html';
+ embedder.noReferrerGuestURL =
+ embedder.baseGuestURL + '/guest_noreferrer.html';
+ embedder.redirectGuestURL = embedder.baseGuestURL + '/server-redirect';
+ embedder.redirectGuestURLDest =
+ embedder.baseGuestURL + '/guest_redirect.html';
+ embedder.windowOpenGuestURL = embedder.baseGuestURL + '/guest.html';
};
window.runTest = function(testName) {
@@ -964,6 +969,32 @@ function testLoadProgressEvent() {
document.body.appendChild(webview);
}
+// This test verifies that the loadstart event fires at the beginning of a load
+// and the loadredirect event fires when a redirect occurs.
+function testLoadStartLoadRedirect() {
+ var webview = document.createElement('webview');
+ var loadstartCalled = false;
+ webview.setAttribute('src', embedder.redirectGuestURL);
+ webview.addEventListener('loadstart', function(e) {
+ embedder.test.assertTrue(e.isTopLevel);
+ embedder.test.assertEq(embedder.redirectGuestURL, e.url);
+ loadstartCalled = true;
+ });
+ webview.addEventListener('loadredirect', function(e) {
+ embedder.test.assertTrue(e.isTopLevel);
+ embedder.test.assertEq(embedder.redirectGuestURL,
+ e.oldUrl.replace('127.0.0.1', 'localhost'));
+ embedder.test.assertEq(embedder.redirectGuestURLDest,
+ e.newUrl.replace('127.0.0.1', 'localhost'));
+ if (loadstartCalled) {
+ embedder.test.succeed();
+ } else {
+ embedder.test.fail();
+ }
+ });
+ document.body.appendChild(webview);
+}
+
function testNavigationToExternalProtocol() {
var webview = document.createElement('webview');
webview.addEventListener('loadstop', function(e) {
@@ -1074,6 +1105,119 @@ function testNavOnSrcAttributeChange() {
document.body.appendChild(webview);
}
+// This test verifies that new window attachment functions as expected.
+function testNewWindow() {
+ var webview = document.createElement('webview');
+ webview.addEventListener('newwindow', function(e) {
+ e.preventDefault();
+ var newwebview = document.createElement('webview');
+ newwebview.addEventListener('loadstop', function(evt) {
+ // If the new window finishes loading, the test is successful.
+ embedder.test.succeed();
+ });
+ document.body.appendChild(newwebview);
+ // Attach the new window to the new <webview>.
+ e.window.attach(newwebview);
+ });
+ webview.setAttribute('src', embedder.windowOpenGuestURL);
+ document.body.appendChild(webview);
+}
+
+// This test verifies that the attach can be called inline without
+// preventing default.
+function testNewWindowNoPreventDefault() {
+ var webview = document.createElement('webview');
+ webview.addEventListener('newwindow', function(e) {
+ var newwebview = document.createElement('webview');
+ document.body.appendChild(newwebview);
+ // Attach the new window to the new <webview>.
+ try {
+ e.window.attach(newwebview);
+ embedder.test.succeed();
+ } catch (err) {
+ embedder.test.fail();
+ }
+ });
+ webview.setAttribute('src', embedder.windowOpenGuestURL);
+ document.body.appendChild(webview);
+}
+
+function testNewWindowNoReferrerLink() {
+ var webview = document.createElement('webview');
+ webview.addEventListener('newwindow', function(e) {
+ e.preventDefault();
+ var newwebview = document.createElement('webview');
+ newwebview.addEventListener('loadstop', function(evt) {
+ // If the new window finishes loading, the test is successful.
+ embedder.test.succeed();
+ });
+ document.body.appendChild(newwebview);
+ // Attach the new window to the new <webview>.
+ e.window.attach(newwebview);
+ });
+ webview.setAttribute('src', embedder.noReferrerGuestURL);
+ document.body.appendChild(webview);
+}
+
+// This test verifies "first-call-wins" semantics. That is, the first call
+// to perform an action on the new window takes the action and all
+// subsequent calls throw an exception.
+function testNewWindowTwoListeners() {
+ var webview = document.createElement('webview');
+ var error = false;
+ webview.addEventListener('newwindow', function(e) {
+ e.preventDefault();
+ var newwebview = document.createElement('webview');
+ document.body.appendChild(newwebview);
+ try {
+ e.window.attach(newwebview);
+ } catch (err) {
+ embedder.test.fail();
+ }
+ });
+ webview.addEventListener('newwindow', function(e) {
+ e.preventDefault();
+ try {
+ e.window.discard();
+ } catch (err) {
+ embedder.test.succeed();
+ }
+ });
+ webview.setAttribute('src', embedder.windowOpenGuestURL);
+ document.body.appendChild(webview);
+}
+
+function testOnEventProperties() {
+ var sequence = ['first', 'second', 'third', 'fourth'];
+ var webview = document.createElement('webview');
+ function createHandler(id) {
+ return function(e) {
+ embedder.test.assertEq(id, sequence.shift());
+ };
+ }
+
+ webview.addEventListener('loadstart', createHandler('first'));
+ webview.addEventListener('loadstart', createHandler('second'));
+ webview.onloadstart = createHandler('third');
+ webview.addEventListener('loadstart', createHandler('fourth'));
+ webview.addEventListener('loadstop', function(evt) {
+ embedder.test.assertEq(0, sequence.length);
+
+ // Test that setting another 'onloadstart' handler replaces the previous
+ // handler.
+ sequence = ['first', 'second', 'fourth'];
+ webview.onloadstart = function() {
+ embedder.test.assertEq(0, sequence.length);
+ embedder.test.succeed();
+ };
+
+ webview.setAttribute('src', 'data:text/html,next navigation');
+ });
+
+ webview.setAttribute('src', 'data:text/html,trigger navigation');
+ document.body.appendChild(webview);
+}
+
// This test verifies that setting the partition attribute after the src has
// been set raises an exception.
function testPartitionRaisesException() {
@@ -1227,6 +1371,34 @@ function testRemoveWebviewAfterNavigation() {
}, 0);
}
+// This test verifies that a <webview> is torn down gracefully when removed from
+// the DOM on exit.
+window.removeWebviewOnExitDoCrash = null;
+function testRemoveWebviewOnExit() {
+ var triggerNavUrl = 'data:text/html,trigger navigation';
+ var webview = document.createElement('webview');
+
+ webview.addEventListener('loadstop', function(e) {
+ chrome.test.sendMessage('guest-loaded');
+ });
+
+ window.removeWebviewOnExitDoCrash = function() {
+ webview.terminate();
+ };
+
+ webview.addEventListener('exit', function(e) {
+ // We expected to be killed.
+ if (e.reason != 'killed') {
+ return;
+ }
+ webview.parentNode.removeChild(webview);
+ });
+
+ // Trigger a navigation to create a guest process.
+ webview.setAttribute('src', embedder.emptyGuestURL);
+ document.body.appendChild(webview);
+}
+
function testResizeWebviewResizesContent() {
var webview = document.createElement('webview');
webview.src = 'about:blank';
@@ -1343,11 +1515,17 @@ embedder.test.testList = {
'testLoadAbortInvalidNavigation': testLoadAbortInvalidNavigation,
'testLoadAbortNonWebSafeScheme': testLoadAbortNonWebSafeScheme,
'testLoadProgressEvent': testLoadProgressEvent,
+ 'testLoadStartLoadRedirect': testLoadStartLoadRedirect,
'testNavigateAfterResize': testNavigateAfterResize,
'testNavigationToExternalProtocol': testNavigationToExternalProtocol,
'testNavOnConsecutiveSrcAttributeChanges':
testNavOnConsecutiveSrcAttributeChanges,
'testNavOnSrcAttributeChange': testNavOnSrcAttributeChange,
+ 'testNewWindow': testNewWindow,
+ 'testNewWindowNoPreventDefault': testNewWindowNoPreventDefault,
+ 'testNewWindowNoReferrerLink': testNewWindowNoReferrerLink,
+ 'testNewWindowTwoListeners': testNewWindowTwoListeners,
+ 'testOnEventProperties': testOnEventProperties,
'testPartitionRaisesException': testPartitionRaisesException,
'testPartitionRemovalAfterNavigationFails':
testPartitionRemovalAfterNavigationFails,
@@ -1356,6 +1534,7 @@ embedder.test.testList = {
'testReloadAfterTerminate': testReloadAfterTerminate,
'testRemoveSrcAttribute': testRemoveSrcAttribute,
'testRemoveWebviewAfterNavigation': testRemoveWebviewAfterNavigation,
+ 'testRemoveWebviewOnExit': testRemoveWebviewOnExit,
'testResizeWebviewResizesContent': testResizeWebviewResizesContent,
'testTerminateAfterExit': testTerminateAfterExit
};