Skip to content

Commit

Permalink
Fix panic when perspective property is zero.
Browse files Browse the repository at this point in the history
  • Loading branch information
gw3583 committed Jan 28, 2016
1 parent 34954a9 commit 183c3f5
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 2 deletions.
21 changes: 19 additions & 2 deletions components/layout/display_list_builder.rs
Expand Up @@ -63,6 +63,23 @@ use util::range::Range;
/// The logical width of an insertion point: at the moment, a one-pixel-wide line.
const INSERTION_POINT_LOGICAL_WIDTH: Au = Au(1 * AU_PER_PX);

// TODO(gw): The transforms spec says that perspective length must
// be positive. However, there is some confusion between the spec
// and browser implementations as to handling the case of 0 for the
// perspective value. Until the spec bug is resolved, at least ensure
// that a provided perspective value of <= 0.0 doesn't cause panics
// and behaves as it does in other browsers.
// See https://lists.w3.org/Archives/Public/www-style/2016Jan/0020.html for more details.
#[inline]
fn create_perspective_matrix(d: Au) -> Matrix4 {
let d = d.to_f32_px();
if d <= 0.0 {
Matrix4::identity()
} else {
Matrix4::create_perspective(d)
}
}

pub trait FragmentDisplayListBuilding {
/// Adds the display items necessary to paint the background of this fragment to the display
/// list if necessary.
Expand Down Expand Up @@ -1241,7 +1258,7 @@ impl FragmentDisplayListBuilding for Fragment {
Matrix4::create_rotation(ax, ay, az, theta)
}
transform::ComputedOperation::Perspective(d) => {
Matrix4::create_perspective(d.to_f32_px())
create_perspective_matrix(d)
}
transform::ComputedOperation::Scale(sx, sy, sz) => {
Matrix4::create_scale(sx, sy, sz)
Expand Down Expand Up @@ -1282,7 +1299,7 @@ impl FragmentDisplayListBuilding for Fragment {
-perspective_origin.y,
0.0);

let perspective_matrix = Matrix4::create_perspective(d.to_f32_px());
let perspective_matrix = create_perspective_matrix(d);

pre_transform.mul(&perspective_matrix).mul(&post_transform)
}
Expand Down
24 changes: 24 additions & 0 deletions tests/wpt/mozilla/meta/MANIFEST.json
Expand Up @@ -3536,6 +3536,18 @@
"url": "/_mozilla/css/percentage_width_inline_block_a.html"
}
],
"css/perspective_zero.html": [
{
"path": "css/perspective_zero.html",
"references": [
[
"/_mozilla/css/perspective_zero_ref.html",
"=="
]
],
"url": "/_mozilla/css/perspective_zero.html"
}
],
"css/pixel_snapping_border_a.html": [
{
"dpi": "2",
Expand Down Expand Up @@ -9616,6 +9628,18 @@
"url": "/_mozilla/css/percentage_width_inline_block_a.html"
}
],
"css/perspective_zero.html": [
{
"path": "css/perspective_zero.html",
"references": [
[
"/_mozilla/css/perspective_zero_ref.html",
"=="
]
],
"url": "/_mozilla/css/perspective_zero.html"
}
],
"css/pixel_snapping_border_a.html": [
{
"dpi": "2",
Expand Down
31 changes: 31 additions & 0 deletions tests/wpt/mozilla/tests/css/perspective_zero.html
@@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<link rel='match' href='perspective_zero_ref.html'>
<style type="text/css">
html, body {
margin: 0;
}

#outer {
perspective: 0px;
transform-style: preserve-3d;
}

#inner {
position: absolute;
top: 100px;
left: 100px;
width: 100px;
height: 100px;
background-color: green;
transform: translate3d(0, 0, 0);
}
</style>
</head>
<body>
<div id="outer">
<div id="inner"></div>
</div>
</body>
</html>
30 changes: 30 additions & 0 deletions tests/wpt/mozilla/tests/css/perspective_zero_ref.html
@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html, body {
margin: 0;
}

#outer {
perspective: 10px;
transform-style: preserve-3d;
}

#inner {
position: absolute;
top: 100px;
left: 100px;
width: 100px;
height: 100px;
background-color: green;
transform: translate3d(0, 0, 0);
}
</style>
</head>
<body>
<div id="outer">
<div id="inner"></div>
</div>
</body>
</html>

0 comments on commit 183c3f5

Please sign in to comment.