aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/document.rs
diff options
context:
space:
mode:
authorBobby Holley <bobbyholley@gmail.com>2015-11-04 18:31:17 -0800
committerBobby Holley <bobbyholley@gmail.com>2015-11-04 19:09:58 -0800
commit7dba4447f196bbd75676402dac7858b0f7741cd2 (patch)
tree0d91f8d35b0dcc11396e968b6bfd1e458a4fd6d8 /components/script/dom/document.rs
parentd89816bb5fa90421a4dea49ff6387f635ce7b389 (diff)
downloadservo-7dba4447f196bbd75676402dac7858b0f7741cd2.tar.gz
servo-7dba4447f196bbd75676402dac7858b0f7741cd2.zip
Store pristine element state rather than a set of changes.
This is the strategy we'll need to take for attributes, and so this change puts us in a position to handle attributes and state the same way. This does mean that we stop taking care to track the situations where our state has reverted to the original state, with no net change. I think that's probably of negligible value though.
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r--components/script/dom/document.rs31
1 files changed, 11 insertions, 20 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 90e5697dd33..161a5639ceb 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -175,8 +175,8 @@ pub struct Document {
/// This field is set to the document itself for inert documents.
/// https://html.spec.whatwg.org/multipage/#appropriate-template-contents-owner-document
appropriate_template_contents_owner_document: MutNullableHeap<JS<Document>>,
- /// The collection of ElementStates that have been changed since the last restyle.
- element_state_changes: DOMRefCell<HashMap<JS<Element>, ElementState>>,
+ /// For each element that has had a state change since the last restyle, track the original state.
+ modified_elements: DOMRefCell<HashMap<JS<Element>, ElementState>>,
/// http://w3c.github.io/touch-events/#dfn-active-touch-point
active_touch_points: DOMRefCell<Vec<JS<Touch>>>,
}
@@ -308,7 +308,7 @@ impl Document {
pub fn needs_reflow(&self) -> bool {
self.GetDocumentElement().is_some() &&
- (self.upcast::<Node>().get_has_dirty_descendants() || !self.element_state_changes.borrow().is_empty())
+ (self.upcast::<Node>().get_has_dirty_descendants() || !self.modified_elements.borrow().is_empty())
}
/// Returns the first `base` element in the DOM that has an `href` attribute.
@@ -1230,7 +1230,7 @@ pub enum DocumentSource {
#[allow(unsafe_code)]
pub trait LayoutDocumentHelpers {
unsafe fn is_html_document_for_layout(&self) -> bool;
- unsafe fn drain_element_state_changes(&self) -> Vec<(LayoutJS<Element>, ElementState)>;
+ unsafe fn drain_modified_elements(&self) -> Vec<(LayoutJS<Element>, ElementState)>;
}
#[allow(unsafe_code)]
@@ -1242,9 +1242,9 @@ impl LayoutDocumentHelpers for LayoutJS<Document> {
#[inline]
#[allow(unrooted_must_root)]
- unsafe fn drain_element_state_changes(&self) -> Vec<(LayoutJS<Element>, ElementState)> {
- let mut changes = (*self.unsafe_get()).element_state_changes.borrow_mut_for_layout();
- let drain = changes.drain();
+ unsafe fn drain_modified_elements(&self) -> Vec<(LayoutJS<Element>, ElementState)> {
+ let mut elements = (*self.unsafe_get()).modified_elements.borrow_mut_for_layout();
+ let drain = elements.drain();
let layout_drain = drain.map(|(k, v)| (k.to_layout(), v));
Vec::from_iter(layout_drain)
}
@@ -1313,7 +1313,7 @@ impl Document {
reflow_timeout: Cell::new(None),
base_element: Default::default(),
appropriate_template_contents_owner_document: Default::default(),
- element_state_changes: DOMRefCell::new(HashMap::new()),
+ modified_elements: DOMRefCell::new(HashMap::new()),
active_touch_points: DOMRefCell::new(Vec::new()),
}
}
@@ -1380,18 +1380,9 @@ impl Document {
self.idmap.borrow().get(&id).map(|ref elements| Root::from_ref(&*(*elements)[0]))
}
- pub fn record_element_state_change(&self, el: &Element, which: ElementState) {
- let mut map = self.element_state_changes.borrow_mut();
- let empty;
- {
- let states = map.entry(JS::from_ref(el))
- .or_insert(ElementState::empty());
- states.toggle(which);
- empty = states.is_empty();
- }
- if empty {
- map.remove(&JS::from_ref(el));
- }
+ pub fn element_state_will_change(&self, el: &Element) {
+ let mut map = self.modified_elements.borrow_mut();
+ map.entry(JS::from_ref(el)).or_insert(el.get_state());
}
}