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.  :(
This commit is contained in:
Boris Zbarsky 2012-10-17 17:01:56 -04:00
parent 7df123b830
commit 6a79d7f055
3 changed files with 60 additions and 1 deletions

View File

@ -8285,7 +8285,26 @@ nsGlobalWindow::GetComputedStyle(nsIDOMElement* aElt,
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);

View File

@ -188,6 +188,7 @@ MOCHITEST_FILES = test_acid3_test46.html \
test_bug732153.html \
test_bug732209.html \
bug732209-css.sjs \
test_bug795520.html \
$(NULL)
ifdef MOZ_FLEXBOX

View File

@ -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>