Bug 789392 - window.close() failed to trigger mozbrowserclose event on the parent frame if the child frame is not created with window.open. r=bz
☠☠ backed out by 5ed440d28b53 ☠ ☠
authorJustin Lebar <justin.lebar@gmail.com>
Thu, 27 Sep 2012 23:06:01 -0400
changeset 108478 95d3bf1b070b0e88cc4dc83b4cac199e071a88d6
parent 108477 dd84629231a1652fac5f484c63eb134f6c4188d5
child 108479 c92665ad2811740fd504b7c0af16c855288417a5
push id82
push usershu@rfrn.org
push dateFri, 05 Oct 2012 13:20:22 +0000
reviewersbz
bugs789392
milestone18.0a1
Bug 789392 - window.close() failed to trigger mozbrowserclose event on the parent frame if the child frame is not created with window.open. r=bz
dom/base/nsGlobalWindow.cpp
dom/browser-element/mochitest/Makefile.in
dom/browser-element/mochitest/browserElement_CloseApp.js
dom/browser-element/mochitest/file_browserElement_CloseApp.html
dom/browser-element/mochitest/test_browserElement_inproc_CloseApp.html
dom/browser-element/mochitest/test_browserElement_oop_CloseApp.html
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -6513,19 +6513,20 @@ nsGlobalWindow::Close()
   if (mBlockScriptedClosingFlag)
   {
     // A script's popup has been blocked and we don't want
     // the window to be closed directly after this event,
     // so the user can see that there was a blocked popup.
     return NS_OK;
   }
 
-  // Don't allow scripts from content to close windows
-  // that were not opened by script
-  if (!mHadOriginalOpener && !nsContentUtils::IsCallerTrustedForWrite()) {
+  // Don't allow scripts from content to close non-app windows that were not
+  // opened by script.
+  if (!mDocShell->GetIsApp() &&
+      !mHadOriginalOpener && !nsContentUtils::IsCallerTrustedForWrite()) {
     bool allowClose =
       Preferences::GetBool("dom.allow_scripts_to_close_windows", true);
     if (!allowClose) {
       // We're blocking the close operation
       // report localized error msg in JS console
       nsContentUtils::ReportToConsole(
           nsIScriptError::warningFlag,
           "DOM Window", mDoc,  // Better name for the category?
--- a/dom/browser-element/mochitest/Makefile.in
+++ b/dom/browser-element/mochitest/Makefile.in
@@ -88,16 +88,19 @@ MOCHITEST_FILES = \
 		test_browserElement_inproc_PromptCheck.html \
 		browserElement_PromptConfirm.js \
 		test_browserElement_inproc_PromptConfirm.html \
 		browserElement_Close.js \
 		test_browserElement_inproc_Close.html \
 		browserElement_CloseFromOpener.js \
 		test_browserElement_inproc_CloseFromOpener.html \
 		file_browserElement_CloseFromOpener.html \
+		browserElement_CloseApp.js \
+		test_browserElement_inproc_CloseApp.html \
+		file_browserElement_CloseApp.html \
 		browserElement_OpenWindow.js \
 		test_browserElement_inproc_OpenWindow.html \
 		file_browserElement_Open1.html \
 		file_browserElement_Open2.html \
 		browserElement_OpenWindowInFrame.js \
 		test_browserElement_inproc_OpenWindowInFrame.html \
 		file_browserElement_OpenWindowInFrame.html \
 		browserElement_OpenWindowRejected.js \
@@ -173,16 +176,17 @@ MOCHITEST_FILES += \
 		test_browserElement_oop_AlertInFrame.html \
 		test_browserElement_oop_TargetTop.html \
 		test_browserElement_oop_ForwardName.html \
 		test_browserElement_oop_TargetBlank.html \
 		test_browserElement_oop_PromptCheck.html \
 		test_browserElement_oop_PromptConfirm.html \
 		test_browserElement_oop_Close.html \
 		test_browserElement_oop_CloseFromOpener.html \
+		test_browserElement_oop_CloseApp.html \
 		test_browserElement_oop_OpenWindow.html \
 		test_browserElement_oop_OpenWindowInFrame.html \
 		test_browserElement_oop_OpenWindowRejected.html \
 		test_browserElement_oop_OpenWindowDifferentOrigin.html \
 		test_browserElement_oop_OpenNamed.html \
 		test_browserElement_oop_SecurityChange.html \
 		test_browserElement_oop_BackForward.html \
 		test_browserElement_oop_Reload.html \
new file mode 100644
--- /dev/null
+++ b/dom/browser-element/mochitest/browserElement_CloseApp.js
@@ -0,0 +1,66 @@
+/* Any copyright is dedicated to the public domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Bug 789392 - Test that apps frames can trigger mozbrowserclose by calling
+// window.close(), but browser frames cannot.
+"use strict";
+
+SimpleTest.waitForExplicitFinish();
+
+function runTest() {
+  browserElementTestHelpers.setEnabledPref(true);
+  browserElementTestHelpers.addPermission();
+
+  // Our app frame and browser frame load the same content.  That content calls
+  // window.close() and then alert().  We should get a mozbrowserclose event on
+  // the app frame before the mozbrowsershowmodalprompt, but not on the browser
+  // frame.
+
+  var appFrame = document.createElement('iframe');
+  appFrame.mozbrowser = true;
+  appFrame.setAttribute('mozapp', 'http://example.org/manifest.webapp');
+
+  var browserFrame = document.createElement('iframe');
+  browserFrame.mozbrowser = true;
+
+  var gotAppFrameClose = false;
+  appFrame.addEventListener('mozbrowserclose', function() {
+    ok(true, "Got close from app frame.");
+    gotAppFrameClose = true;
+  });
+
+  var gotAppFrameAlert = false;
+  appFrame.addEventListener('mozbrowsershowmodalprompt', function() {
+    ok(gotAppFrameClose, "Should have gotten app frame close by now.");
+    ok(!gotAppFrameAlert, "Just one alert from the app frame.");
+    gotAppFrameAlert = true;
+    if (gotBrowserFrameAlert && gotAppFrameAlert) {
+      SimpleTest.finish();
+    }
+  });
+
+  browserFrame.addEventListener('mozbrowserclose', function() {
+    ok(false, "Got close from browser frame.");
+  });
+
+  var gotBrowserFrameAlert = false;
+  browserFrame.addEventListener('mozbrowsershowmodalprompt', function() {
+    ok(!gotBrowserFrameAlert, "Just one browser frame alert.");
+    gotBrowserFrameAlert = true;
+    if (gotBrowserFrameAlert && gotAppFrameAlert) {
+      SimpleTest.finish();
+    }
+  });
+
+  document.body.appendChild(appFrame);
+  document.body.appendChild(browserFrame);
+
+  appFrame.src = 'http://example.org/tests/dom/browser-element/mochitest/file_browserElement_CloseApp.html';
+  browserFrame.src = 'http://example.org/tests/dom/browser-element/mochitest/file_browserElement_CloseApp.html';
+}
+
+// The test harness sets dom.allow_scripts_to_close_windows to true (as of
+// writing, anyway).  But that means that browser tabs can close themselves,
+// which is what we want to test /can't/ happen!   For the purposes of this
+// test (and normal browser operation), this pref should be false.
+SpecialPowers.pushPrefEnv({'set': [['dom.allow_scripts_to_close_windows', false]]}, runTest);
new file mode 100644
--- /dev/null
+++ b/dom/browser-element/mochitest/file_browserElement_CloseApp.html
@@ -0,0 +1,12 @@
+<html>
+<body>
+
+file_browserElement_CloseApp.html
+
+<script>
+window.close();
+alert('called close');
+</script>
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/dom/browser-element/mochitest/test_browserElement_inproc_CloseApp.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test for Bug 789392</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="browserElementTestHelpers.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<script type="application/javascript;version=1.7" src="browserElement_CloseApp.js">
+</script>
+</body>
+</html>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/browser-element/mochitest/test_browserElement_oop_CloseApp.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test for Bug 789392</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="browserElementTestHelpers.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<script type="application/javascript;version=1.7" src="browserElement_CloseApp.js">
+</script>
+</body>
+</html>
\ No newline at end of file