aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-02-19 05:10:57 -0800
committerGitHub <noreply@github.com>2017-02-19 05:10:57 -0800
commitd2ae3d8bedf99c97877ec944d94f2aa72e67478d (patch)
tree8e4acdff088514735dd9eb3511da013af21a7478
parentdebdebe8dea69c41472002bb49dbb29cc30a85f2 (diff)
parentf362f6f93bc79de6ba32995cdd96382dc5bc311f (diff)
downloadservo-d2ae3d8bedf99c97877ec944d94f2aa72e67478d.tar.gz
servo-d2ae3d8bedf99c97877ec944d94f2aa72e67478d.zip
Auto merge of #15334 - canaltinova:inverse, r=nox
Fix the panic when transform is non-invertible <!-- Please describe your changes on the following line: --> Fixes the panic when transform is non-invertible. Counterpart of https://github.com/servo/webrender/pull/823 r? @glennw --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #13266 (github issue number if applicable). <!-- Either: --> - [x] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/15334) <!-- Reviewable:end -->
-rw-r--r--components/gfx/display_list/mod.rs9
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json10
-rw-r--r--tests/wpt/mozilla/tests/mozilla/non-invertible-transform.html26
3 files changed, 44 insertions, 1 deletions
diff --git a/components/gfx/display_list/mod.rs b/components/gfx/display_list/mod.rs
index ec3173cb847..af4b793c6b2 100644
--- a/components/gfx/display_list/mod.rs
+++ b/components/gfx/display_list/mod.rs
@@ -182,7 +182,14 @@ impl DisplayList {
*client_point
} else {
let point = *translated_point - stacking_context.bounds.origin;
- let inv_transform = stacking_context.transform.inverse().unwrap();
+ let inv_transform = match stacking_context.transform.inverse() {
+ Some(transform) => transform,
+ None => {
+ // If a transform function causes the current transformation matrix of an object
+ // to be non-invertible, the object and its content do not get displayed.
+ return;
+ }
+ };
let frac_point = inv_transform.transform_point(&Point2D::new(point.x.to_f32_px(),
point.y.to_f32_px()));
Point2D::new(Au::from_f32_px(frac_point.x), Au::from_f32_px(frac_point.y))
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index c4cc18dcf7c..62275196fbf 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -13335,6 +13335,12 @@
{}
]
],
+ "mozilla/non-invertible-transform.html": [
+ [
+ "/_mozilla/mozilla/non-invertible-transform.html",
+ {}
+ ]
+ ],
"mozilla/out-of-order-stylesheet-loads-and-imports.html": [
[
"/_mozilla/mozilla/out-of-order-stylesheet-loads-and-imports.html",
@@ -25908,6 +25914,10 @@
"fe965e58fdcb78d08384a9fde74c982e34768745",
"testharness"
],
+ "mozilla/non-invertible-transform.html": [
+ "6fa68fe08c9dd5d594e838da51617951193fee19",
+ "testharness"
+ ],
"mozilla/out-of-order-stylesheet-loads-and-imports.html": [
"462f5b6a1f47e0e40ad407ccd13b3058176d106d",
"testharness"
diff --git a/tests/wpt/mozilla/tests/mozilla/non-invertible-transform.html b/tests/wpt/mozilla/tests/mozilla/non-invertible-transform.html
new file mode 100644
index 00000000000..f03c9c01344
--- /dev/null
+++ b/tests/wpt/mozilla/tests/mozilla/non-invertible-transform.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Shouldn't panic when transform is non-invertible</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <style>
+ #test {
+ width: 100px;
+ height: 100px;
+ transform: scale(0);
+ }
+ </style>
+</head>
+<body>
+<div id="test"></div>
+<script>
+ async_test(function(t) {
+ setTimeout(t.step_func_done(function() {
+ var elements = document.elementsFromPoint(10, 10);
+ }), 500);
+ }, "Shouldn't panic when transform is non-invertible");
+</script>
+</body>
+</html>