diff options
author | lfg <lfg@chromium.org> | 2014-10-03 17:19:51 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-04 00:20:56 +0000 |
commit | 0cac70342fdc5f7532f26b8954e4f8519c609dc1 (patch) | |
tree | 259730d7a79638bcb33e875bd322430bd080b9b7 /extensions/test | |
parent | 03b7f3e70812a1e03aeaf545a6efaeb1804f8281 (diff) | |
download | chromium_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')
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 }; |