summaryrefslogtreecommitdiffstats
path: root/third_party/WebKit/LayoutTests/fast/css-generated-content/pseudo-animation.html
blob: 30624c97a13ba99b9dd949bb61ad5b137f79ad40 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<!DOCTYPE html>

<script src="../../resources/js-test.js"></script>

<style>
@-webkit-keyframes example {
  from {
    width: 50px;
    height: 50px;
    top: 50px;
  }
  to {
    width: 10px;
    height: 10px;
    top: 200px;
  }
}

@keyframes example {
  from {
    width: 50px;
    height: 50px;
    top: 50px;
  }
  to {
    width: 10px;
    height: 10px;
    top: 200px;
  }
}

#after:after,
#before:before {
    content: "";
    display: block;
    height: 50px;
    width: 50px;
    position: relative;
}

#after.animate:after,
#before.animate:before {
    top: 200px;
    width: 10px;
    height: 10px;
    -webkit-animation: example 2s;
    -moz-animation: example 2s;
    animation: example 2s;
}

#before,
#after {
    display: inline-block;
    border: 1px solid black;
    background: red;
}

#before.animate,
#after.animate {
    background: green;
}
</style>

<div id="before"></div>
<div id="after"></div>

<script>
description('Animations on :before and :after pseudo elements should run');

if (window.testRunner)
    testRunner.dumpAsText();

function getPseudoComputedTop(id)
{
    return Math.round(parseFloat(getComputedStyle(document.getElementById(id), ':' + id).top));
}

// FIXME: This test should be modified so subpixel doesn't cause off by one
// below and it no longer needs shouldBeCloseTo.

function testAnimation(id)
{
    var div = document.getElementById(id);
    div.className = 'animate';
    window.div = div;
    shouldBe('div.offsetWidth', '52');
    if (window.internals) {
        internals.pauseAnimations(1);
        shouldBeCloseTo('div.offsetWidth', 20, 1);
        computedTop = getPseudoComputedTop(id);
        shouldBeCloseTo('computedTop', 170, 1);
        internals.pauseAnimations(2);
        shouldBeCloseTo('div.offsetWidth', 12, 1);
        computedTop = getPseudoComputedTop(id);
        shouldBeCloseTo('computedTop', 200, 1);
    } else {
        // This will be flaky, but it's a reasonable approximation for testing
        // in a browser instead of DRT.
        setTimeout(function() {
            window.div = div;
            shouldBeCloseTo('div.offsetWidth', 20, 1);
            computedTop = getPseudoComputedTop(id);
            shouldBeCloseTo('computedTop', 170, 1);
        }, 1000);
        setTimeout(function() {
            window.div = div;
            shouldBeCloseTo('div.offsetWidth', 12, 1);
            computedTop = getPseudoComputedTop(id);
            shouldBeCloseTo('computedTop', 200, 1);
        }, 2000);
    }
}

onload = function() {
    testAnimation('before');
    testAnimation('after');
    if (window.internals)
        isSuccessfullyParsed();
    else
        setTimeout(isSuccessfullyParsed, 2000);
};
</script>