Bug 795520. Don't fail to return a computed CSS declaration just because the style change that will give us a presshell has not been processed yet. r=dbaron
authorBoris Zbarsky <bzbarsky@mit.edu>
Wed, 17 Oct 2012 17:01:56 -0400
changeset 110594 e711e4cdb4d5cec821d29f17c2f552cb35297303
parent 110593 91e2659887c63a431ce0d07ec326a8df0664d644
child 110595 fd12a2c69e93b58cb79f6c3d0482d3df6943397d
push id23700
push userryanvm@gmail.com
push dateThu, 18 Oct 2012 02:10:26 +0000
treeherdermozilla-central@5142bbd4da12 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdbaron
bugs795520
milestone19.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 795520. Don't fail to return a computed CSS declaration just because the style change that will give us a presshell has not been processed yet. r=dbaron Another, more risky, option would be to always return a declaration from getComputedStyle, even if we have no presshell, then just throw (after flushing, as needed) if people try to get style info for it just like we already do for declarations whose document loses a presshell. This might cause compat issues on sites that can deal with null but not exceptions, though. :(
dom/base/nsGlobalWindow.cpp
layout/style/test/Makefile.in
layout/style/test/test_bug795520.html
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -8280,17 +8280,36 @@ nsGlobalWindow::GetComputedStyle(nsIDOME
   if (!mDocShell) {
     return NS_OK;
   }
 
   nsCOMPtr<nsIPresShell> presShell;
   mDocShell->GetPresShell(getter_AddRefs(presShell));
 
   if (!presShell) {
-    return NS_OK;
+    // Try flushing frames on our parent in case there's a pending
+    // style change that will create the presshell.
+    nsGlobalWindow *parent =
+      static_cast<nsGlobalWindow *>(GetPrivateParent());
+    if (!parent) {
+      return NS_OK;
+    }
+
+    parent->FlushPendingNotifications(Flush_Frames);
+
+    // Might have killed mDocShell
+    if (!mDocShell) {
+      return NS_OK;
+    }
+
+    mDocShell->GetPresShell(getter_AddRefs(presShell));
+
+    if (!presShell) {
+      return NS_OK;
+    }
   }
 
   nsCOMPtr<dom::Element> element = do_QueryInterface(aElt);
   NS_ENSURE_TRUE(element, NS_ERROR_FAILURE);
   nsRefPtr<nsComputedDOMStyle> compStyle =
     NS_NewComputedDOMStyle(element, aPseudoElt, presShell);
 
   *aReturn = compStyle.forget().get();
--- a/layout/style/test/Makefile.in
+++ b/layout/style/test/Makefile.in
@@ -183,16 +183,17 @@ MOCHITEST_FILES =	test_acid3_test46.html
 		visited_image_loading.sjs \
 		visited_image_loading_frame.html \
 		visited_image_loading_frame_empty.html \
 		test_load_events_on_stylesheets.html \
 		test_bug721136.html \
 		test_bug732153.html \
 		test_bug732209.html \
 		bug732209-css.sjs \
+		test_bug795520.html \
 		$(NULL)
 
 ifdef MOZ_FLEXBOX
 MOCHITEST_FILES +=	\
 		file_flexbox_align_self_auto.html \
 		test_flexbox_align_self_auto.html \
 		file_flexbox_flex_grow_and_shrink.html \
 		test_flexbox_flex_grow_and_shrink.html \
new file mode 100644
--- /dev/null
+++ b/layout/style/test/test_bug795520.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=795520
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 795520</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=795520">Mozilla Bug 795520</a>
+<p id="display">
+  <iframe id="f" style="display:none"></iframe>
+</p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 795520 **/
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+  doc = $("f").contentDocument;
+  $("f").style.display = "";
+  isnot(doc.defaultView.getComputedStyle(doc.body), null,
+        "Should have computed style here");
+  SimpleTest.finish();
+});
+
+
+
+
+</script>
+</pre>
+</body>
+</html>