Bug 799299 - focus contention with two visible html content areas, r=masayuki
authorOlli Pettay <Olli.Pettay@helsinki.fi>
Fri, 12 Oct 2012 01:43:42 +0300
changeset 110079 43218e560c4aa90d3aee35663daa5f7fa303784f
parent 110059 e491269db27e060eb2a8d1e67378823c15b06602
child 110080 c200ffe949125c514998467d63754ab6187800c1
push id93
push usernmatsakis@mozilla.com
push dateWed, 31 Oct 2012 21:26:57 +0000
reviewersmasayuki
bugs799299
milestone19.0a1
Bug 799299 - focus contention with two visible html content areas, r=masayuki
content/events/src/nsEventStateManager.cpp
dom/tests/mochitest/chrome/Makefile.in
dom/tests/mochitest/chrome/file_bug799299.xul
dom/tests/mochitest/chrome/test_bug799299.xul
--- a/content/events/src/nsEventStateManager.cpp
+++ b/content/events/src/nsEventStateManager.cpp
@@ -3252,21 +3252,27 @@ nsEventStateManager::PostHandleEvent(nsP
         // When the event was cancelled, there is currently a chrome document
         // focused and a mousedown just occurred on a content document, ensure
         // that the window that was clicked is focused.
         EnsureDocument(mPresContext);
         nsIFocusManager* fm = nsFocusManager::GetFocusManager();
         if (mDocument && fm) {
           nsCOMPtr<nsIDOMWindow> currentWindow;
           fm->GetFocusedWindow(getter_AddRefs(currentWindow));
-          if (currentWindow && currentWindow != mDocument->GetWindow() &&
+          if (currentWindow && mDocument->GetWindow() &&
+              currentWindow != mDocument->GetWindow() &&
               !nsContentUtils::IsChromeDoc(mDocument)) {
+            nsCOMPtr<nsIDOMWindow> currentTop;
+            nsCOMPtr<nsIDOMWindow> newTop;
+            currentWindow->GetScriptableTop(getter_AddRefs(currentTop));
+            mDocument->GetWindow()->GetScriptableTop(getter_AddRefs(newTop));
             nsCOMPtr<nsPIDOMWindow> win = do_QueryInterface(currentWindow);
             nsCOMPtr<nsIDocument> currentDoc = do_QueryInterface(win->GetExtantDocument());
-            if (nsContentUtils::IsChromeDoc(currentDoc)) {
+            if (nsContentUtils::IsChromeDoc(currentDoc) ||
+                (currentTop && newTop && currentTop != newTop)) {
               fm->SetFocusedWindow(mDocument->GetWindow());
             }
           }
         }
       }
       SetActiveManager(this, activeContent);
     }
     break;
--- a/dom/tests/mochitest/chrome/Makefile.in
+++ b/dom/tests/mochitest/chrome/Makefile.in
@@ -43,16 +43,18 @@ MOCHITEST_CHROME_FILES = \
 		test_clonewrapper.xul \
 		test_moving_nodeList.xul \
 		test_callback_wrapping.xul \
 		window_callback_wrapping.xul \
 		test_sandbox_postMessage.html \
 		test_sandbox_bindings.xul \
 		test_selectAtPoint.html \
 		selectAtPoint.html \
+		test_bug799299.xul \
+		file_bug799299.xul \
 		$(NULL)
 
 ifeq (WINNT,$(OS_ARCH))
 MOCHITEST_CHROME_FILES += \
 		test_sizemode_attribute.xul \
 		sizemode_attribute.xul \
 		$(NULL)
 endif
new file mode 100644
--- /dev/null
+++ b/dom/tests/mochitest/chrome/file_bug799299.xul
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
+<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=799299
+-->
+<window title="Mozilla Bug 799299"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
+
+  <!-- test results are displayed in the html:body -->
+  <body xmlns="http://www.w3.org/1999/xhtml">
+  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=799299"
+     target="_blank">Mozilla Bug 799299</a>
+  </body>
+
+  <!-- test code goes here -->
+  <script type="application/javascript">
+  <![CDATA[
+  /** Test for Bug 799299 **/
+
+  function sendClick(win) {
+    var wu = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+                .getInterface(Components.interfaces.nsIDOMWindowUtils);
+    wu.sendMouseEventToWindow("mousedown", 10, 10, 0, 0, 0);
+    wu.sendMouseEventToWindow("mouseup", 10, 10, 0, 0, 0);
+  }
+
+  function runTests() {
+    var b1 = document.getElementById("b1");
+    var b2 = document.getElementById("b2");
+    b1.contentWindow.focus();
+    opener.wrappedJSObject.is(document.activeElement, b1);
+
+    var didCallDummy = false;
+    b2.contentWindow.addEventListener("mousedown", function(e) { didCallDummy = true; });
+    sendClick(b2.contentWindow);
+    opener.wrappedJSObject.ok(didCallDummy);
+    opener.wrappedJSObject.is(document.activeElement, b2);
+
+    b1.contentWindow.focus();
+    opener.wrappedJSObject.is(document.activeElement, b1);
+
+    var didCallListener = false;
+    b2.contentWindow.addEventListener("mousedown", function(e) { didCallListener = true; e.preventDefault(); });
+    sendClick(b2.contentWindow);
+    opener.wrappedJSObject.ok(didCallListener);
+    opener.wrappedJSObject.is(document.activeElement, b2);
+
+    window.close();
+    opener.wrappedJSObject.SimpleTest.finish();
+  }
+
+  SimpleTest.waitForFocus(runTests);
+  ]]>
+  </script>
+  <hbox flex="1">
+    <browser id="b1" type="content" src="about:blank" flex="1" style="border: 1px solid black;"/>
+    <browser id="b2" type="content" src="about:blank" flex="1" style="border: 1px solid black;"/>
+  </hbox>
+</window>
new file mode 100644
--- /dev/null
+++ b/dom/tests/mochitest/chrome/test_bug799299.xul
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
+<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=799299
+-->
+<window title="Mozilla Bug 799299" onload="runTests()"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
+
+  <!-- test results are displayed in the html:body -->
+  <body xmlns="http://www.w3.org/1999/xhtml">
+  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=799299"
+     target="_blank">Mozilla Bug 799299</a>
+  </body>
+
+  <!-- test code goes here -->
+  <script type="application/javascript">
+  <![CDATA[
+  /** Test for Bug 799299 **/
+
+  function runTests() {
+    window.open("file_bug799299.xul", "_blank", "chrome,width=600,height=550");
+  }
+
+  SimpleTest.waitForExplicitFinish();
+
+  ]]>
+  </script>
+</window>