Bug 625289 patch 12 - Tests for transitions on elements that are reframing. r=heycam

The second set of 14 tests all fail (both with and without the patch)
because we don't start transitions when the before state is
display:none (either for style contexts coming out of the undisplayed
map or because we have no current style context because an ancestor is
display:none).

The patch makes all of the first set of 14 tests pass.  Without the
patch, most of these tests fail, except for the 4 testing e1 and the
root.

I presume the four tests that pass prior to the patch pass because the
restyle actually occurs and starts the transition (which is stored on
the element) before the style context is destroyed.
This commit is contained in:
L. David Baron 2014-08-13 15:39:02 -07:00
parent 70c4a5a6b9
commit fd2736dc52
2 changed files with 211 additions and 0 deletions

View File

@ -190,6 +190,7 @@ skip-if = (toolkit == 'gonk' && debug) || toolkit == 'android' #bug 775227 #debu
[test_style_struct_copy_constructors.html]
[test_supports_rules.html]
[test_system_font_serialization.html]
[test_transitions_and_reframes.html]
[test_transitions_and_zoom.html]
[test_transitions_cancel_near_end.html]
[test_transitions_computed_values.html]

View File

@ -0,0 +1,210 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=625289
-->
<head>
<meta charset="utf-8">
<title>Test for Bug 625289</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<style>
:root,
#e1, #e2 > div,
#b1::before, #b2 > div::before,
#a1::after, #a2 > div::after {
margin-left: 0;
}
:root.t,
#e1.t, #e2.t > div,
#b1.t::before, #b2.t > div::before,
#a1.t::after, #a2.t > div::after {
transition: margin-left linear 1s;
}
#b1::before, #b2 > div::before,
#a1::after, #a2 > div::after {
content: "x";
display: block;
}
:root.m,
#e1.m, #e2.m > div,
#b1.m::before, #b2.m > div::before,
#a1.m::after, #a2.m > div::after {
margin-left: 100px;
}
.o { overflow: hidden }
.n { display: none }
</style>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=625289">Mozilla Bug 625289</a>
<div id="container"></div>
<pre id="test">
<script>
"use strict";
function advance_clock(milliseconds) {
SpecialPowers.DOMWindowUtils.advanceTimeAndRefresh(milliseconds);
}
var container = document.getElementById("container");
function make_elements(idName, child) {
var e = document.createElement("div");
e.setAttribute("id", idName);
if (child) {
e.appendChild(document.createElement("div"));
}
container.appendChild(e);
return e;
}
function assert_margin_at_quarter(element, pseudo, passes)
{
var desc;
var useParent = false;
if (element == document.documentElement) {
desc = "root element";
} else if (element.id) {
desc = "element " + element.id;
} else {
desc = "child of element " + element.parentNode.id;
useParent = true;
}
var classes = (useParent ? element.parentNode : element).getAttribute("class");
if (classes) {
desc += " (classes: " + classes + ")";
}
if (pseudo) {
desc += " " + pseudo + " pseudo-element";
}
(passes ? is : todo_is)(getComputedStyle(element, pseudo).marginLeft, "25px",
"margin of " + desc);
}
function do_test(test)
{
var expected_props = [ "element", "test_child", "pseudo", "passes",
"dynamic_change_transition", "start_from_none" ];
for (var propidx in expected_props) {
if (! expected_props[propidx] in test) {
ok(false, "expected " + expected_props[propidx] + " on test object");
}
}
var e;
if (typeof(test.element) == "string") {
e = make_elements(test.element, test.test_child);
} else {
if (test.test_child) {
ok(false, "test_child unexpected");
}
e = test.element;
}
var target = test.test_child ? e.firstChild : e;
if (!test.dynamic_change_transition) {
e.classList.add("t");
}
if (test.start_from_none) {
e.classList.add("n");
}
advance_clock(100);
e.classList.add("m");
e.classList.add("o");
if (test.dynamic_change_transition) {
e.classList.add("t");
}
if (test.start_from_none) {
e.classList.remove("n");
}
advance_clock(0);
advance_clock(250);
assert_margin_at_quarter(target, test.pseudo, test.passes);
if (typeof(test.element) == "string") {
e.remove();
} else {
target.style.transition = "";
target.removeAttribute("class");
}
}
advance_clock(0);
var tests = [
{ element:"e1", test_child:false, pseudo:"", passes:true,
dynamic_change_transition:false, start_from_none:false },
{ element:"e2", test_child:true, pseudo:"", passes:true,
dynamic_change_transition:false, start_from_none:false },
{ element:"b1", test_child:false, pseudo:"::before", passes:true,
dynamic_change_transition:false, start_from_none:false },
{ element:"b2", test_child:true, pseudo:"::before", passes:true,
dynamic_change_transition:false, start_from_none:false },
{ element:"a1", test_child:false, pseudo:"::after", passes:true,
dynamic_change_transition:false, start_from_none:false },
{ element:"a2", test_child:true, pseudo:"::after", passes:true,
dynamic_change_transition:false, start_from_none:false },
{ element:document.documentElement, test_child:false, pseudo:"", passes:true,
dynamic_change_transition:false, start_from_none:false },
// Recheck with a dynamic change in transition
{ element:"e1", test_child:false, pseudo:"", passes:true,
dynamic_change_transition:true, start_from_none:false },
{ element:"e2", test_child:true, pseudo:"", passes:true,
dynamic_change_transition:true, start_from_none:false },
{ element:"b1", test_child:false, pseudo:"::before", passes:true,
dynamic_change_transition:true, start_from_none:false },
{ element:"b2", test_child:true, pseudo:"::before", passes:true,
dynamic_change_transition:true, start_from_none:false },
{ element:"a1", test_child:false, pseudo:"::after", passes:true,
dynamic_change_transition:true, start_from_none:false },
{ element:"a2", test_child:true, pseudo:"::after", passes:true,
dynamic_change_transition:true, start_from_none:false },
{ element:document.documentElement, test_child:false, pseudo:"", passes:true,
dynamic_change_transition:true, start_from_none:false },
// Recheck starting from display:none. Note that these tests all fail,
// although we could get *some* of them to pass by calling
// RestyleManager::TryStartingTransition from
// ElementRestyler::RestyleUndisplayedChildren.
{ element:"e1", test_child:false, pseudo:"", passes:false,
dynamic_change_transition:false, start_from_none:true },
{ element:"e2", test_child:true, pseudo:"", passes:false,
dynamic_change_transition:false, start_from_none:true },
{ element:"b1", test_child:false, pseudo:"::before", passes:false,
dynamic_change_transition:false, start_from_none:true },
{ element:"b2", test_child:true, pseudo:"::before", passes:false,
dynamic_change_transition:false, start_from_none:true },
{ element:"a1", test_child:false, pseudo:"::after", passes:false,
dynamic_change_transition:false, start_from_none:true },
{ element:"a2", test_child:true, pseudo:"::after", passes:false,
dynamic_change_transition:false, start_from_none:true },
{ element:document.documentElement, test_child:false, pseudo:"", passes:false,
dynamic_change_transition:false, start_from_none:true },
// Recheck with a dynamic change in transition and starting from display:none
{ element:"e1", test_child:false, pseudo:"", passes:false,
dynamic_change_transition:true, start_from_none:true },
{ element:"e2", test_child:true, pseudo:"", passes:false,
dynamic_change_transition:true, start_from_none:true },
{ element:"b1", test_child:false, pseudo:"::before", passes:false,
dynamic_change_transition:true, start_from_none:true },
{ element:"b2", test_child:true, pseudo:"::before", passes:false,
dynamic_change_transition:true, start_from_none:true },
{ element:"a1", test_child:false, pseudo:"::after", passes:false,
dynamic_change_transition:true, start_from_none:true },
{ element:"a2", test_child:true, pseudo:"::after", passes:false,
dynamic_change_transition:true, start_from_none:true },
{ element:document.documentElement, test_child:false, pseudo:"", passes:false,
dynamic_change_transition:true, start_from_none:true },
];
for (var testidx in tests) {
do_test(tests[testidx]);
}
SpecialPowers.DOMWindowUtils.restoreNormalRefresh();
</script>
</pre>
</body>
</html>