Add custom elements related stuff into ElementRareData

This commit is contained in:
Fernando Jiménez Moreno 2019-03-06 16:34:16 +01:00
parent a9019da39d
commit c75da615bd
5 changed files with 54 additions and 34 deletions

View file

@ -72,8 +72,8 @@ use crate::dom::bindings::conversions::DerivedFrom;
use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::root::DomRoot;
use crate::dom::create::create_native_html_element; use crate::dom::create::create_native_html_element;
use crate::dom::customelementregistry::ConstructionStackEntry; use crate::dom::customelementregistry::{ConstructionStackEntry, CustomElementState};
use crate::dom::element::{CustomElementState, Element, ElementCreator}; use crate::dom::element::{Element, ElementCreator};
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::window::Window; use crate::dom::window::Window;
use crate::script_thread::ScriptThread; use crate::script_thread::ScriptThread;

View file

@ -5,9 +5,11 @@
use crate::dom::bindings::error::{report_pending_exception, throw_dom_exception}; use crate::dom::bindings::error::{report_pending_exception, throw_dom_exception};
use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::reflector::DomObject;
use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::root::DomRoot;
use crate::dom::customelementregistry::{is_valid_custom_element_name, upgrade_element}; use crate::dom::customelementregistry::{
is_valid_custom_element_name, upgrade_element, CustomElementState,
};
use crate::dom::document::Document; use crate::dom::document::Document;
use crate::dom::element::{CustomElementCreationMode, CustomElementState, Element, ElementCreator}; use crate::dom::element::{CustomElementCreationMode, Element, ElementCreator};
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlanchorelement::HTMLAnchorElement; use crate::dom::htmlanchorelement::HTMLAnchorElement;
use crate::dom::htmlareaelement::HTMLAreaElement; use crate::dom::htmlareaelement::HTMLAreaElement;

View file

@ -23,7 +23,7 @@ use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::DOMString; use crate::dom::bindings::str::DOMString;
use crate::dom::document::Document; use crate::dom::document::Document;
use crate::dom::domexception::{DOMErrorName, DOMException}; use crate::dom::domexception::{DOMErrorName, DOMException};
use crate::dom::element::{CustomElementState, Element}; use crate::dom::element::Element;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{document_from_node, window_from_node, Node, ShadowIncluding}; use crate::dom::node::{document_from_node, window_from_node, Node, ShadowIncluding};
@ -47,6 +47,21 @@ use std::ops::Deref;
use std::ptr; use std::ptr;
use std::rc::Rc; use std::rc::Rc;
/// <https://dom.spec.whatwg.org/#concept-element-custom-element-state>
#[derive(Clone, Copy, Eq, JSTraceable, MallocSizeOf, PartialEq)]
pub enum CustomElementState {
Undefined,
Failed,
Uncustomized,
Custom,
}
impl Default for CustomElementState {
fn default() -> CustomElementState {
CustomElementState::Uncustomized
}
}
/// <https://html.spec.whatwg.org/multipage/#customelementregistry> /// <https://html.spec.whatwg.org/multipage/#customelementregistry>
#[dom_struct] #[dom_struct]
pub struct CustomElementRegistry { pub struct CustomElementRegistry {

View file

@ -33,7 +33,7 @@ use crate::dom::bindings::xmlname::{
use crate::dom::characterdata::CharacterData; use crate::dom::characterdata::CharacterData;
use crate::dom::create::create_element; use crate::dom::create::create_element;
use crate::dom::customelementregistry::{ use crate::dom::customelementregistry::{
CallbackReaction, CustomElementDefinition, CustomElementReaction, CallbackReaction, CustomElementDefinition, CustomElementReaction, CustomElementState,
}; };
use crate::dom::document::{Document, LayoutDocumentHelpers}; use crate::dom::document::{Document, LayoutDocumentHelpers};
use crate::dom::documentfragment::DocumentFragment; use crate::dom::documentfragment::DocumentFragment;
@ -166,13 +166,6 @@ pub struct Element {
/// when it has exclusive access to the element. /// when it has exclusive access to the element.
#[ignore_malloc_size_of = "bitflags defined in rust-selectors"] #[ignore_malloc_size_of = "bitflags defined in rust-selectors"]
selector_flags: Cell<ElementSelectorFlags>, selector_flags: Cell<ElementSelectorFlags>,
/// <https://html.spec.whatwg.org/multipage/#custom-element-reaction-queue>
custom_element_reaction_queue: DomRefCell<Vec<CustomElementReaction>>,
/// <https://dom.spec.whatwg.org/#concept-element-custom-element-definition>
#[ignore_malloc_size_of = "Rc"]
custom_element_definition: DomRefCell<Option<Rc<CustomElementDefinition>>>,
/// <https://dom.spec.whatwg.org/#concept-element-custom-element-state>
custom_element_state: Cell<CustomElementState>,
rare_data: Box<ElementRareData>, rare_data: Box<ElementRareData>,
} }
@ -203,15 +196,6 @@ pub enum CustomElementCreationMode {
Asynchronous, Asynchronous,
} }
/// <https://dom.spec.whatwg.org/#concept-element-custom-element-state>
#[derive(Clone, Copy, Eq, JSTraceable, MallocSizeOf, PartialEq)]
pub enum CustomElementState {
Undefined,
Failed,
Uncustomized,
Custom,
}
impl ElementCreator { impl ElementCreator {
pub fn is_parser_created(&self) -> bool { pub fn is_parser_created(&self) -> bool {
match *self { match *self {
@ -305,9 +289,6 @@ impl Element {
class_list: Default::default(), class_list: Default::default(),
state: Cell::new(state), state: Cell::new(state),
selector_flags: Cell::new(ElementSelectorFlags::empty()), selector_flags: Cell::new(ElementSelectorFlags::empty()),
custom_element_reaction_queue: Default::default(),
custom_element_definition: Default::default(),
custom_element_state: Cell::new(CustomElementState::Uncustomized),
rare_data: Default::default(), rare_data: Default::default(),
} }
} }
@ -349,45 +330,55 @@ impl Element {
} }
pub fn set_custom_element_state(&self, state: CustomElementState) { pub fn set_custom_element_state(&self, state: CustomElementState) {
self.custom_element_state.set(state); self.rare_data.custom_element_state.set(state);
} }
pub fn get_custom_element_state(&self) -> CustomElementState { pub fn get_custom_element_state(&self) -> CustomElementState {
self.custom_element_state.get() self.rare_data.custom_element_state.get()
} }
pub fn set_custom_element_definition(&self, definition: Rc<CustomElementDefinition>) { pub fn set_custom_element_definition(&self, definition: Rc<CustomElementDefinition>) {
*self.custom_element_definition.borrow_mut() = Some(definition); *self.rare_data.custom_element_definition.borrow_mut() = Some(definition);
} }
pub fn get_custom_element_definition(&self) -> Option<Rc<CustomElementDefinition>> { pub fn get_custom_element_definition(&self) -> Option<Rc<CustomElementDefinition>> {
(*self.custom_element_definition.borrow()).clone() (*self.rare_data.custom_element_definition.borrow()).clone()
} }
pub fn push_callback_reaction(&self, function: Rc<Function>, args: Box<[Heap<JSVal>]>) { pub fn push_callback_reaction(&self, function: Rc<Function>, args: Box<[Heap<JSVal>]>) {
self.custom_element_reaction_queue self.rare_data
.custom_element_reaction_queue
.borrow_mut() .borrow_mut()
.push(CustomElementReaction::Callback(function, args)); .push(CustomElementReaction::Callback(function, args));
} }
pub fn push_upgrade_reaction(&self, definition: Rc<CustomElementDefinition>) { pub fn push_upgrade_reaction(&self, definition: Rc<CustomElementDefinition>) {
self.custom_element_reaction_queue self.rare_data
.custom_element_reaction_queue
.borrow_mut() .borrow_mut()
.push(CustomElementReaction::Upgrade(definition)); .push(CustomElementReaction::Upgrade(definition));
} }
pub fn clear_reaction_queue(&self) { pub fn clear_reaction_queue(&self) {
self.custom_element_reaction_queue.borrow_mut().clear(); self.rare_data
.custom_element_reaction_queue
.borrow_mut()
.clear();
} }
pub fn invoke_reactions(&self) { pub fn invoke_reactions(&self) {
// TODO: This is not spec compliant, as this will allow some reactions to be processed // TODO: This is not spec compliant, as this will allow some reactions to be processed
// after clear_reaction_queue has been called. // after clear_reaction_queue has been called.
rooted_vec!(let mut reactions); rooted_vec!(let mut reactions);
while !self.custom_element_reaction_queue.borrow().is_empty() { while !self
.rare_data
.custom_element_reaction_queue
.borrow()
.is_empty()
{
mem::swap( mem::swap(
&mut *reactions, &mut *reactions,
&mut *self.custom_element_reaction_queue.borrow_mut(), &mut *self.rare_data.custom_element_reaction_queue.borrow_mut(),
); );
for reaction in reactions.iter() { for reaction in reactions.iter() {
reaction.invoke(self); reaction.invoke(self);

View file

@ -4,8 +4,13 @@
use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::root::MutNullableDom; use crate::dom::bindings::root::MutNullableDom;
use crate::dom::customelementregistry::{
CustomElementDefinition, CustomElementReaction, CustomElementState,
};
use crate::dom::mutationobserver::RegisteredObserver; use crate::dom::mutationobserver::RegisteredObserver;
use crate::dom::shadowroot::ShadowRoot; use crate::dom::shadowroot::ShadowRoot;
use std::cell::Cell;
use std::rc::Rc;
#[derive(Default, JSTraceable, MallocSizeOf)] #[derive(Default, JSTraceable, MallocSizeOf)]
#[must_root] #[must_root]
@ -25,4 +30,11 @@ pub struct ElementRareData {
/// XXX This is currently not exposed to web content. Only for /// XXX This is currently not exposed to web content. Only for
/// internal use. /// internal use.
pub shadow_root: MutNullableDom<ShadowRoot>, pub shadow_root: MutNullableDom<ShadowRoot>,
/// <https://html.spec.whatwg.org/multipage/#custom-element-reaction-queue>
pub custom_element_reaction_queue: DomRefCell<Vec<CustomElementReaction>>,
/// <https://dom.spec.whatwg.org/#concept-element-custom-element-definition>
#[ignore_malloc_size_of = "Rc"]
pub custom_element_definition: DomRefCell<Option<Rc<CustomElementDefinition>>>,
/// <https://dom.spec.whatwg.org/#concept-element-custom-element-state>
pub custom_element_state: Cell<CustomElementState>,
} }