aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2016-03-14 19:14:21 -0700
committerPatrick Walton <pcwalton@mimiga.net>2016-03-15 21:32:16 -0700
commitd59dee0c6541c4ad7cc93d94fb0ee7a31a9779d0 (patch)
treead5373dc11cf1ed220e9a56791d8dc8d3b819a1e
parentaea8d8959dcb157a8cc381f1403246ce8ca1ca00 (diff)
downloadservo-d59dee0c6541c4ad7cc93d94fb0ee7a31a9779d0.tar.gz
servo-d59dee0c6541c4ad7cc93d94fb0ee7a31a9779d0.zip
style: Compute damage for text nodes.
They have styles just like elements do. Allows a dynamic change of `display: none` to `display: inline` to work. Closes #9868.
-rw-r--r--components/style/matching.rs11
-rw-r--r--tests/wpt/metadata-css/css21_dev/html4/run-in-display-none-between-003.htm.ini3
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json24
-rw-r--r--tests/wpt/mozilla/tests/css/text_damage_a.html14
-rw-r--r--tests/wpt/mozilla/tests/css/text_damage_ref.html6
5 files changed, 52 insertions, 6 deletions
diff --git a/components/style/matching.rs b/components/style/matching.rs
index 211f04acbab..1c158505e97 100644
--- a/components/style/matching.rs
+++ b/components/style/matching.rs
@@ -655,6 +655,7 @@ pub trait MatchMethods : TNode {
}
};
+ let damage;
if self.is_text_node() {
// Text nodes get a copy of the parent style. This ensures
// that during fragment construction any non-inherited
@@ -663,9 +664,11 @@ pub trait MatchMethods : TNode {
let mut data_ref = self.mutate_data().unwrap();
let mut data = &mut *data_ref;
let cloned_parent_style = parent_style.unwrap().clone();
+ damage = Self::ConcreteRestyleDamage::compute(data.style.as_ref(),
+ &*cloned_parent_style);
data.style = Some(cloned_parent_style);
} else {
- let damage = {
+ damage = {
let mut data_ref = self.mutate_data().unwrap();
let mut data = &mut *data_ref;
let (mut damage, final_style) = self.cascade_node_pseudo_element(
@@ -706,13 +709,15 @@ pub trait MatchMethods : TNode {
// This method needs to borrow the data as mutable, so make sure data_ref goes out of
// scope first.
- self.set_restyle_damage(damage);
-
self.set_can_be_fragmented(parent.map_or(false, |p| {
p.can_be_fragmented() ||
parent_style.as_ref().unwrap().is_multicol()
}));
}
+
+ // This method needs to borrow the data as mutable, so make sure data_ref goes out of
+ // scope first.
+ self.set_restyle_damage(damage);
}
}
diff --git a/tests/wpt/metadata-css/css21_dev/html4/run-in-display-none-between-003.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/run-in-display-none-between-003.htm.ini
deleted file mode 100644
index ec1d723ee59..00000000000
--- a/tests/wpt/metadata-css/css21_dev/html4/run-in-display-none-between-003.htm.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[run-in-display-none-between-003.htm]
- type: reftest
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index 7ea42099e65..b214e9e3e77 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -4560,6 +4560,18 @@
"url": "/_mozilla/css/text_align_start_end.html"
}
],
+ "css/text_damage_a.html": [
+ {
+ "path": "css/text_damage_a.html",
+ "references": [
+ [
+ "/_mozilla/css/text_damage_ref.html",
+ "=="
+ ]
+ ],
+ "url": "/_mozilla/css/text_damage_a.html"
+ }
+ ],
"css/text_decoration_cached.html": [
{
"path": "css/text_decoration_cached.html",
@@ -10760,6 +10772,18 @@
"url": "/_mozilla/css/text_align_start_end.html"
}
],
+ "css/text_damage_a.html": [
+ {
+ "path": "css/text_damage_a.html",
+ "references": [
+ [
+ "/_mozilla/css/text_damage_ref.html",
+ "=="
+ ]
+ ],
+ "url": "/_mozilla/css/text_damage_a.html"
+ }
+ ],
"css/text_decoration_cached.html": [
{
"path": "css/text_decoration_cached.html",
diff --git a/tests/wpt/mozilla/tests/css/text_damage_a.html b/tests/wpt/mozilla/tests/css/text_damage_a.html
new file mode 100644
index 00000000000..428e804c119
--- /dev/null
+++ b/tests/wpt/mozilla/tests/css/text_damage_a.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title></title>
+<link rel="match" href="text_damage_ref.html">
+<span class="lock" style="display: none">foo</span><span>bar</span>
+<script>
+window.onload = function() {
+ document.querySelector(".lock").style.display = "inline";
+ document.documentElement.classList.remove("reftest-wait");
+};
+</script>
+
+
diff --git a/tests/wpt/mozilla/tests/css/text_damage_ref.html b/tests/wpt/mozilla/tests/css/text_damage_ref.html
new file mode 100644
index 00000000000..3cf8ef2b20c
--- /dev/null
+++ b/tests/wpt/mozilla/tests/css/text_damage_ref.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title></title>
+<span class="lock" style="display: inline">foo</span><span>bar</span>
+