Bug 803677 - Fix offsetTop/offsetParent for element with display:table-cell that have anonymous table parents. r=bzbarsky

This commit is contained in:
Benedict Singer 2012-12-11 08:48:04 -05:00
Родитель d8f0757e5e
Коммит 44ee89fc83
3 изменённых файлов: 63 добавлений и 2 удалений

Просмотреть файл

@ -379,8 +379,18 @@ static bool
IsOffsetParent(nsIFrame* aFrame)
{
nsIAtom* frameType = aFrame->GetType();
return (IS_TABLE_CELL(frameType) ||
frameType == nsGkAtoms::tableFrame);
if (IS_TABLE_CELL(frameType) || frameType == nsGkAtoms::tableFrame) {
// Per the IDL for Element, only td, th, and table are acceptable offsetParents
// apart from body or positioned elements; we need to check the content type as
// well as the frame type so we ignore anonymous tables created by an element
// with display: table-cell with no actual table
nsIContent* content = aFrame->GetContent();
return content->IsHTML(nsGkAtoms::table) || content->IsHTML(nsGkAtoms::td)
|| content->IsHTML(nsGkAtoms::th);
}
return false;
}
Element*

Просмотреть файл

@ -270,6 +270,7 @@ MOCHITEST_FILES = \
test_bug786564.html \
test_bug797113.html \
test_bug787134.html \
test_bug803677.html \
test_iframe_sandbox_inheritance.html \
file_iframe_sandbox_a_if1.html \
file_iframe_sandbox_a_if2.html \

Просмотреть файл

@ -0,0 +1,50 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=803677
-->
<head>
<meta charset="utf-8">
<title>Test for Bug 803677</title>
<script type="application/javascript" src="/MochiKit/packed.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script src="reflect.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<style>
.base { border:1px solid gray; }
.bad-table { display:table-cell; border:1px solid red; }
</style>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=803677">Mozilla Bug 803677</a>
<p id="display"></p>
<div id="content">
<p class="base">1</p>
<p class="base">2</p>
<p class="base">3</p>
<p class="base bad-table">4</p>
<p class="base">7</p>
<p class="base">8</p>
<p class="base">9</p>
</div>
<pre id="test">
<script type="application/javascript">
var p = document.querySelectorAll(".base");
var parent = document.querySelector("body");
var prevOffset = 0;
for (var i = 0; i < p.length; i++) {
var t = 0, e = p[i];
is(e.offsetParent, parent, "Offset parent of all paragraphs should be the body.");
while (e) {
t += e.offsetTop;
e = e.offsetParent;
}
p[i].innerHTML = t;
ok(t > prevOffset, "Offset should increase down the page");
prevOffset = t;
}
</script>
</pre>
</body>
</html>