Index: chrome/test/data/extensions/platform_apps/web_view/newwindow/embedder.js |
diff --git a/chrome/test/data/extensions/platform_apps/web_view/newwindow/embedder.js b/chrome/test/data/extensions/platform_apps/web_view/newwindow/embedder.js |
index bded587295d7389ff7126b0adfc952c8f4a3dfbd..af310b63d7691de87185b5aad880c4d95910817b 100644 |
--- a/chrome/test/data/extensions/platform_apps/web_view/newwindow/embedder.js |
+++ b/chrome/test/data/extensions/platform_apps/web_view/newwindow/embedder.js |
@@ -200,21 +200,21 @@ function testNewWindowNameTakesPrecedence() { |
webViewName, guestName, partitionName, expectedName); |
} |
-function testWebViewNameTakesPrecedence() { |
+function testNewWindowWebViewNameTakesPrecedence() { |
var webViewName = 'foo'; |
var guestName = ''; |
var partitionName = 'persist:foobar'; |
var expectedName = webViewName; |
- testNewWindowName('testWebViewNameTakesPrecedence', |
+ testNewWindowName('testNewWindowWebViewNameTakesPrecedence', |
webViewName, guestName, partitionName, expectedName); |
} |
-function testNoName() { |
+function testNewWindowNoName() { |
var webViewName = ''; |
var guestName = ''; |
var partitionName = ''; |
var expectedName = ''; |
- testNewWindowName('testNoName', |
+ testNewWindowName('testNewWindowNoName', |
webViewName, guestName, partitionName, expectedName); |
} |
@@ -235,6 +235,34 @@ function testNewWindowRedirect() { |
webViewName, guestName, partitionName, expectedName); |
} |
+// Tests that we fail gracefully if we try to attach() a <webview> on a |
+// newwindow event after the opener has been destroyed. |
+function testNewWindowAttachAfterOpenerDestroyed() { |
+ var testName = 'testNewWindowAttachAfterOpenerDestroyed'; |
+ var webview = embedder.setUpGuest_('foobar'); |
+ |
+ var onNewWindow = function(e) { |
+ embedder.assertCorrectEvent_(e, ''); |
+ |
+ // Remove the opener. |
+ webview.parentNode.removeChild(webview); |
+ // Pass in a timeout so we ensure the newwindow disposal codepath |
+ // works properly. |
+ window.setTimeout(function() { |
+ // At this point the opener <webview> is gone. |
+ // Trying to discard() will fail silently. |
+ e.window.attach(document.createElement('webview')); |
+ window.setTimeout(function() { embedder.test.succeed(); }, 0); |
+ }, 0); |
+ |
+ e.preventDefault(); |
+ }; |
+ webview.addEventListener('newwindow', onNewWindow); |
+ |
+ // Load a new window with the given name. |
+ embedder.setUpNewWindowRequest_(webview, 'guest.html', '', testName); |
+} |
+ |
function testNewWindowClose() { |
var testName = 'testNewWindowClose'; |
var webview = embedder.setUpGuest_('foobar'); |
@@ -291,7 +319,35 @@ function testNewWindowDeferredAttachment() { |
// Load a new window with the given name. |
embedder.setUpNewWindowRequest_(webview, 'guest.html', '', testName); |
-}; |
+} |
+ |
+// Tests that we fail gracefully if we try to discard() a <webview> on a |
+// newwindow event after the opener has been destroyed. |
+function testNewWindowDiscardAfterOpenerDestroyed() { |
+ var testName = 'testNewWindowDiscardAfterOpenerDestroyed'; |
+ var webview = embedder.setUpGuest_('foobar'); |
+ |
+ var onNewWindow = function(e) { |
+ embedder.assertCorrectEvent_(e, ''); |
+ |
+ // Remove the opener. |
+ webview.parentNode.removeChild(webview); |
+ // Pass in a timeout so we ensure the newwindow disposal codepath |
+ // works properly. |
+ window.setTimeout(function() { |
+ // At this point the opener <webview> is gone. |
+ // Trying to discard() will fail silently. |
+ e.window.discard(); |
+ window.setTimeout(function() { embedder.test.succeed(); }, 0); |
+ }, 0); |
+ |
+ e.preventDefault(); |
+ }; |
+ webview.addEventListener('newwindow', onNewWindow); |
+ |
+ // Load a new window with the given name. |
+ embedder.setUpNewWindowRequest_(webview, 'guest.html', '', testName); |
+} |
function testNewWindowExecuteScript() { |
var testName = 'testNewWindowExecuteScript'; |
@@ -333,6 +389,30 @@ function testNewWindowOpenInNewTab() { |
webview.src = embedder.guestWithLinkURL; |
} |
+// Tests that if opener <webview> is gone with unattached guest, we |
+// don't see any error. |
+// This test also makes sure we destroy the unattached guests properly. |
+function testNewWindowOpenerDestroyedWhileUnattached() { |
+ var testName = 'testNewWindowOpenerDestroyedBeforeAttach'; |
+ var webview = embedder.setUpGuest_('foobar'); |
+ |
+ var onNewWindow = function(e) { |
+ embedder.assertCorrectEvent_(e, ''); |
+ |
+ // Remove the opener. |
+ webview.parentNode.removeChild(webview); |
+ // Pass in a timeout so we ensure the newwindow disposal codepath |
+ // works properly. |
+ window.setTimeout(function() { embedder.test.succeed(); }, 0); |
+ |
+ e.preventDefault(); |
+ }; |
+ webview.addEventListener('newwindow', onNewWindow); |
+ |
+ // Load a new window with the given name. |
+ embedder.setUpNewWindowRequest_(webview, 'guest.html', '', testName); |
+} |
+ |
function testNewWindowWebRequest() { |
var testName = 'testNewWindowWebRequest'; |
var webview = embedder.setUpGuest_('foobar'); |
@@ -491,18 +571,25 @@ function testNewWindowWebRequestRemoveElement() { |
} |
embedder.test.testList = { |
- 'testNewWindowNameTakesPrecedence': testNewWindowNameTakesPrecedence, |
- 'testWebViewNameTakesPrecedence': testWebViewNameTakesPrecedence, |
- 'testNoName': testNoName, |
- 'testNewWindowRedirect': testNewWindowRedirect, |
+ 'testNewWindowAttachAfterOpenerDestroyed': |
+ testNewWindowAttachAfterOpenerDestroyed, |
'testNewWindowClose': testNewWindowClose, |
+ 'testNewWindowDeclarativeWebRequest': testNewWindowDeclarativeWebRequest, |
'testNewWindowDeferredAttachment': testNewWindowDeferredAttachment, |
+ 'testNewWindowDiscardAfterOpenerDestroyed': |
+ testNewWindowDiscardAfterOpenerDestroyed, |
'testNewWindowExecuteScript': testNewWindowExecuteScript, |
+ 'testNewWindowNameTakesPrecedence': testNewWindowNameTakesPrecedence, |
+ 'testNewWindowNoName': testNewWindowNoName, |
'testNewWindowOpenInNewTab': testNewWindowOpenInNewTab, |
- 'testNewWindowDeclarativeWebRequest': testNewWindowDeclarativeWebRequest, |
+ 'testNewWindowOpenerDestroyedWhileUnattached': |
+ testNewWindowOpenerDestroyedWhileUnattached, |
+ 'testNewWindowRedirect': testNewWindowRedirect, |
'testNewWindowWebRequest': testNewWindowWebRequest, |
'testNewWindowWebRequestCloseWindow': testNewWindowWebRequestCloseWindow, |
- 'testNewWindowWebRequestRemoveElement': testNewWindowWebRequestRemoveElement |
+ 'testNewWindowWebRequestRemoveElement': testNewWindowWebRequestRemoveElement, |
+ 'testNewWindowWebViewNameTakesPrecedence': |
+ testNewWindowWebViewNameTakesPrecedence |
}; |
onload = function() { |