Bug 789392 - Allow mozapp frames to window.close() themselves. r=bz
☠☠ backed out by 2e4866b959fc ☠ ☠
authorJustin Lebar <justin.lebar@gmail.com>
Tue, 02 Oct 2012 13:55:52 -0400
changeset 109027 bbf94917f0ec8337b8c3593cf158cff8e11851c9
parent 109026 8b5a786ee47b5d103a16031119098d1b99900e39
child 109028 f39621ae2b96710f72069b51e71ff50a291920b2
push id82
push usershu@rfrn.org
push dateFri, 05 Oct 2012 13:20:22 +0000
reviewersbz
bugs789392
milestone18.0a1
Bug 789392 - Allow mozapp frames to window.close() themselves. 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
testing/mochitest/android.json
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -6545,19 +6545,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
--- a/testing/mochitest/android.json
+++ b/testing/mochitest/android.json
@@ -124,16 +124,17 @@
  "docshell/test/test_bug94514.html": "TIMED_OUT",
  "docshell/test/test_bug413310.html": "",
  "docshell/test/test_bug598895.html": "",
  "docshell/test/test_bug637644.html": "",
  "docshell/test/test_bug668513.html": "RANDOM",
  "dom/browser-element/mochitest/test_browserElement_oop_SecurityChange.html": "TIMED_OUT, bug 766586",
  "dom/browser-element/mochitest/test_browserElement_inproc_AppWindowNamespace.html": "TIMED_OUT, bug 783509",
  "dom/browser-element/mochitest/test_browserElement_inproc_SecurityChange.html": "TIMED_OUT, bug 766586",
+ "dom/browser-element/mochitest/test_browserElement_inproc_CloseApp.html": "FAILS, bug 796982",
  "dom/devicestorage": "bug 781789 & bug 782275",
  "dom/imptests/editing/conformancetest/test_event.html": "",
  "dom/imptests/editing/conformancetest/test_runtest.html": "",
  "dom/imptests/editing/selecttest/test_addRange.html": "bug 775227",
  "dom/imptests/html/tests/submission/Mozilla/test_window-onerror-parse-error.html": "",
  "dom/imptests/html/tests/submission/Mozilla/test_window-onerror-runtime-error-throw.html": "",
  "dom/imptests/html/tests/submission/Mozilla/test_window-onerror-runtime-error.html": "",
  "dom/imptests/webapps/DOMCore/tests/approved/test_Range-cloneContents.html": "bug 775227",