mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Auto merge of #17501 - jyc:Text-children_changed, r=emilio
Have CharacterData call children_changed on its parent when data is set. **Can't run WPT on my computer, so pushing here to run tests 😢** Have CharacterData.SetData call children_changed on its parent when data is set (if it is a Text node) so that HTMLStyleElement parents can re-parse. Add variant ChildrenMutation::Text for it to use as the mutation. This fixes an issue where an empty <style> element's data is set but the style is not updated. An HTMLStyleElement parent re-parses in its children_changed implementation. <!-- Please describe your changes on the following line: --> --- <!-- 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 are part of a series to fix #17182 (github issue number if applicable). <!-- Either: --> - [ ] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- 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/17501) <!-- Reviewable:end -->
This commit is contained in:
commit
559c0d1d90
8 changed files with 24 additions and 301 deletions
|
@ -6,6 +6,7 @@
|
|||
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterDataMethods;
|
||||
use dom::bindings::codegen::Bindings::NodeBinding::NodeBinding::NodeMethods;
|
||||
use dom::bindings::codegen::Bindings::ProcessingInstructionBinding::ProcessingInstructionMethods;
|
||||
use dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, NodeTypeId};
|
||||
use dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||
|
@ -16,9 +17,10 @@ use dom::bindings::str::DOMString;
|
|||
use dom::comment::Comment;
|
||||
use dom::document::Document;
|
||||
use dom::element::Element;
|
||||
use dom::node::{Node, NodeDamage};
|
||||
use dom::node::{ChildrenMutation, Node, NodeDamage};
|
||||
use dom::processinginstruction::ProcessingInstruction;
|
||||
use dom::text::Text;
|
||||
use dom::virtualmethods::vtable_for;
|
||||
use dom_struct::dom_struct;
|
||||
use servo_config::opts;
|
||||
use std::cell::Ref;
|
||||
|
@ -85,6 +87,16 @@ impl CharacterDataMethods for CharacterData {
|
|||
self.content_changed();
|
||||
let node = self.upcast::<Node>();
|
||||
node.ranges().replace_code_units(node, 0, old_length, new_length);
|
||||
|
||||
// If this is a Text node, we might need to re-parse (say, if our parent
|
||||
// is a <style> element.) We don't need to if this is a Comment or
|
||||
// ProcessingInstruction.
|
||||
if let Some(_) = self.downcast::<Text>() {
|
||||
if let Some(parent_node) = node.GetParentNode() {
|
||||
let mutation = ChildrenMutation::ChangeText;
|
||||
vtable_for(&parent_node).children_changed(&mutation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-characterdata-length
|
||||
|
|
|
@ -2490,6 +2490,11 @@ pub enum ChildrenMutation<'a> {
|
|||
next: Option<&'a Node>,
|
||||
},
|
||||
ReplaceAll { removed: &'a [&'a Node], added: &'a [&'a Node] },
|
||||
/// Mutation for when a Text node's data is modified.
|
||||
/// This doesn't change the structure of the list, which is what the other
|
||||
/// variants' fields are stored for at the moment, so this can just have no
|
||||
/// fields.
|
||||
ChangeText,
|
||||
}
|
||||
|
||||
impl<'a> ChildrenMutation<'a> {
|
||||
|
@ -2541,6 +2546,9 @@ impl<'a> ChildrenMutation<'a> {
|
|||
}
|
||||
|
||||
/// Get the child that follows the added or removed children.
|
||||
/// Currently only used when this mutation might force us to
|
||||
/// restyle later children (see HAS_SLOW_SELECTOR_LATER_SIBLINGS and
|
||||
/// Element's implementation of VirtualMethods::children_changed).
|
||||
pub fn next_child(&self) -> Option<&Node> {
|
||||
match *self {
|
||||
ChildrenMutation::Append { .. } => None,
|
||||
|
@ -2548,6 +2556,7 @@ impl<'a> ChildrenMutation<'a> {
|
|||
ChildrenMutation::Prepend { next, .. } => Some(next),
|
||||
ChildrenMutation::Replace { next, .. } => next,
|
||||
ChildrenMutation::ReplaceAll { .. } => None,
|
||||
ChildrenMutation::ChangeText => None,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2585,6 +2594,7 @@ impl<'a> ChildrenMutation<'a> {
|
|||
|
||||
ChildrenMutation::Replace { prev: None, next: None, .. } => unreachable!(),
|
||||
ChildrenMutation::ReplaceAll { .. } => None,
|
||||
ChildrenMutation::ChangeText => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -279,6 +279,7 @@ impl ChildrenList {
|
|||
self.last_index.set(middle as u32);
|
||||
}
|
||||
},
|
||||
ChildrenMutation::ChangeText => {},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue