mirror of
https://github.com/servo/servo.git
synced 2025-07-30 18:50:36 +01:00
Introduce trait Castable
This trait is used to hold onto the downcast and upcast functions of all castable IDL interfaces. A castable IDL interface is one which either derives from or is derived by other interfaces. The deriving relation is represented by implementations of marker trait DerivedFrom<T: Castable> generated in InheritTypes. /^[ ]*use dom::bindings::codegen::InheritTypes::.*(Base|Cast|Derived)/ { /::[a-zA-Z]+(Base|Cast|Derived);/d s/([{ ])[a-zA-Z]+(Base|Cast|Derived), /\1/g s/([{ ])[a-zA-Z]+(Base|Cast|Derived), /\1/g s/, [a-zA-Z]+(Base|Cast|Derived)([},])/\2/g s/, [a-zA-Z]+(Base|Cast|Derived)([},])/\2/g /\{([a-zA-Z]+(Base|Cast|Derived))?\};$/d s/\{([a-zA-Z_]+)\};$/\1;/ } s/([a-zA-Z]+)Cast::from_ref\(\&?\**([a-zA-Z_]+)(\.r\(\))?\)/\2.upcast::<\1>()/g s/([a-zA-Z]+)Cast::from_ref\(\&?\**([a-zA-Z_]+)(\.[a-zA-Z_]+\(\))?\)/\2\3.upcast::<\1>()/g s/\(([a-zA-Z]+)Cast::from_ref\)/\(Castable::upcast::<\1>\)/g s/([a-zA-Z]+)Cast::from_root/Root::upcast::<\1>/g s/([a-zA-Z]+)Cast::from_layout_js\(\&([a-zA-Z_.]+)\)/\2.upcast::<\1>()/g s/([a-zA-Z]+)Cast::to_ref\(\&?\**([a-zA-Z_]+)(\.r\(\))?\)/\2.downcast::<\1>()/g s/([a-zA-Z]+)Cast::to_ref\(\&?\**([a-zA-Z_]+)(\.[a-zA-Z_]+\(\))?\)/\2\3.downcast::<\1>()/g s/\(([a-zA-Z]+)Cast::to_ref\)/\(Castable::downcast::<\1>\)/g s/([a-zA-Z]+)Cast::to_root/Root::downcast::<\1>/g s/([a-zA-Z]+)Cast::to_layout_js\(&?([a-zA-Z_.]+(\(\))?)\)/\2.downcast::<\1>()/g s/\.is_document\(\)/.is::<Document>()/g s/\.is_htmlanchorelement\(\)/.is::<HTMLAnchorElement>()/g s/\.is_htmlappletelement\(\)/.is::<HTMLAppletElement>()/g s/\.is_htmlareaelement\(\)/.is::<HTMLAreaElement>()/g s/\.is_htmlbodyelement\(\)/.is::<HTMLBodyElement>()/g s/\.is_htmlembedelement\(\)/.is::<HTMLEmbedElement>()/g s/\.is_htmlfieldsetelement\(\)/.is::<HTMLFieldSetElement>()/g s/\.is_htmlformelement\(\)/.is::<HTMLFormElement>()/g s/\.is_htmlframesetelement\(\)/.is::<HTMLFrameSetElement>()/g s/\.is_htmlhtmlelement\(\)/.is::<HTMLHtmlElement>()/g s/\.is_htmlimageelement\(\)/.is::<HTMLImageElement>()/g s/\.is_htmllegendelement\(\)/.is::<HTMLLegendElement>()/g s/\.is_htmloptgroupelement\(\)/.is::<HTMLOptGroupElement>()/g s/\.is_htmloptionelement\(\)/.is::<HTMLOptionElement>()/g s/\.is_htmlscriptelement\(\)/.is::<HTMLScriptElement>()/g s/\.is_htmltabledatacellelement\(\)/.is::<HTMLTableDataCellElement>()/g s/\.is_htmltableheadercellelement\(\)/.is::<HTMLTableHeaderCellElement>()/g s/\.is_htmltablerowelement\(\)/.is::<HTMLTableRowElement>()/g s/\.is_htmltablesectionelement\(\)/.is::<HTMLTableSectionElement>()/g s/\.is_htmltitleelement\(\)/.is::<HTMLTitleElement>()/g
This commit is contained in:
parent
bd363b009d
commit
13ea3ac413
82 changed files with 1124 additions and 1148 deletions
|
@ -40,20 +40,18 @@ use ipc_channel::ipc::IpcSender;
|
|||
use msg::constellation_msg::PipelineId;
|
||||
use opaque_node::OpaqueNodeMethods;
|
||||
use script::dom::attr::AttrValue;
|
||||
use script::dom::bindings::codegen::InheritTypes::{CharacterDataCast, CharacterDataTypeId};
|
||||
use script::dom::bindings::codegen::InheritTypes::{ElementCast, ElementTypeId};
|
||||
use script::dom::bindings::codegen::InheritTypes::{HTMLCanvasElementCast, HTMLElementTypeId};
|
||||
use script::dom::bindings::codegen::InheritTypes::{HTMLIFrameElementCast, HTMLImageElementCast};
|
||||
use script::dom::bindings::codegen::InheritTypes::{HTMLInputElementCast, HTMLTextAreaElementCast};
|
||||
use script::dom::bindings::codegen::InheritTypes::{NodeCast, NodeTypeId, TextCast};
|
||||
use script::dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, ElementTypeId};
|
||||
use script::dom::bindings::codegen::InheritTypes::{HTMLElementTypeId, NodeTypeId};
|
||||
use script::dom::bindings::conversions::Castable;
|
||||
use script::dom::bindings::js::LayoutJS;
|
||||
use script::dom::characterdata::LayoutCharacterDataHelpers;
|
||||
use script::dom::characterdata::{CharacterData, LayoutCharacterDataHelpers};
|
||||
use script::dom::element;
|
||||
use script::dom::element::{Element, LayoutElementHelpers, RawLayoutElementHelpers};
|
||||
use script::dom::htmlcanvaselement::LayoutHTMLCanvasElementHelpers;
|
||||
use script::dom::htmlimageelement::LayoutHTMLImageElementHelpers;
|
||||
use script::dom::htmlinputelement::LayoutHTMLInputElementHelpers;
|
||||
use script::dom::htmltextareaelement::LayoutHTMLTextAreaElementHelpers;
|
||||
use script::dom::htmlcanvaselement::{HTMLCanvasElement, LayoutHTMLCanvasElementHelpers};
|
||||
use script::dom::htmliframeelement::HTMLIFrameElement;
|
||||
use script::dom::htmlimageelement::{HTMLImageElement, LayoutHTMLImageElementHelpers};
|
||||
use script::dom::htmlinputelement::{HTMLInputElement, LayoutHTMLInputElementHelpers};
|
||||
use script::dom::htmltextareaelement::{HTMLTextAreaElement, LayoutHTMLTextAreaElementHelpers};
|
||||
use script::dom::node::{HAS_CHANGED, HAS_DIRTY_DESCENDANTS, HAS_DIRTY_SIBLINGS, IS_DIRTY};
|
||||
use script::dom::node::{LayoutNodeHelpers, Node, SharedLayoutData};
|
||||
use script::dom::text::Text;
|
||||
|
@ -360,14 +358,14 @@ impl<'le> LayoutElement<'le> {
|
|||
|
||||
pub fn as_node(&self) -> LayoutNode<'le> {
|
||||
LayoutNode {
|
||||
node: NodeCast::from_layout_js(&self.element),
|
||||
node: self.element.upcast::<Node>(),
|
||||
chain: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn as_element<'le>(node: LayoutJS<Node>) -> Option<LayoutElement<'le>> {
|
||||
ElementCast::to_layout_js(&node).map(|element| {
|
||||
node.downcast().map(|element| {
|
||||
LayoutElement {
|
||||
element: element,
|
||||
chain: PhantomData,
|
||||
|
@ -379,7 +377,7 @@ fn as_element<'le>(node: LayoutJS<Node>) -> Option<LayoutElement<'le>> {
|
|||
impl<'le> ::selectors::Element for LayoutElement<'le> {
|
||||
fn parent_element(&self) -> Option<LayoutElement<'le>> {
|
||||
unsafe {
|
||||
NodeCast::from_layout_js(&self.element).parent_node_ref().and_then(as_element)
|
||||
self.element.upcast::<Node>().parent_node_ref().and_then(as_element)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -424,7 +422,7 @@ impl<'le> ::selectors::Element for LayoutElement<'le> {
|
|||
self.as_node().children().all(|node| match node.type_id() {
|
||||
NodeTypeId::Element(..) => false,
|
||||
NodeTypeId::CharacterData(CharacterDataTypeId::Text) => unsafe {
|
||||
CharacterDataCast::to_layout_js(&node.node).unwrap().data_for_layout().is_empty()
|
||||
node.node.downcast::<CharacterData>().unwrap().data_for_layout().is_empty()
|
||||
},
|
||||
_ => true
|
||||
})
|
||||
|
@ -697,7 +695,7 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
|
|||
#[inline]
|
||||
pub fn as_element(&self) -> ThreadSafeLayoutElement<'ln> {
|
||||
unsafe {
|
||||
let element = match ElementCast::to_layout_js(self.get_jsmanaged()) {
|
||||
let element = match self.get_jsmanaged().downcast::<Element>() {
|
||||
Some(e) => e.unsafe_get(),
|
||||
None => panic!("not an element")
|
||||
};
|
||||
|
@ -788,12 +786,12 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
|
|||
|
||||
pub fn is_ignorable_whitespace(&self) -> bool {
|
||||
unsafe {
|
||||
let text: LayoutJS<Text> = match TextCast::to_layout_js(self.get_jsmanaged()) {
|
||||
let text: LayoutJS<Text> = match self.get_jsmanaged().downcast::<Text>() {
|
||||
Some(text) => text,
|
||||
None => return false
|
||||
};
|
||||
|
||||
if !is_whitespace(CharacterDataCast::from_layout_js(&text).data_for_layout()) {
|
||||
if !is_whitespace(text.upcast::<CharacterData>().data_for_layout()) {
|
||||
return false
|
||||
}
|
||||
|
||||
|
@ -816,7 +814,7 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
|
|||
pub fn get_unsigned_integer_attribute(self, attribute: UnsignedIntegerAttribute)
|
||||
-> Option<u32> {
|
||||
unsafe {
|
||||
let elem: Option<LayoutJS<Element>> = ElementCast::to_layout_js(self.get_jsmanaged());
|
||||
let elem: Option<LayoutJS<Element>> = self.get_jsmanaged().downcast::<Element>();
|
||||
match elem {
|
||||
Some(element) => {
|
||||
element.get_unsigned_integer_attribute_for_layout(attribute)
|
||||
|
@ -902,19 +900,19 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
|
|||
}
|
||||
|
||||
let this = unsafe { self.get_jsmanaged() };
|
||||
let text = TextCast::to_layout_js(this);
|
||||
let text = this.downcast::<Text>();
|
||||
if let Some(text) = text {
|
||||
let data = unsafe {
|
||||
CharacterDataCast::from_layout_js(&text).data_for_layout().to_owned()
|
||||
text.upcast::<CharacterData>().data_for_layout().to_owned()
|
||||
};
|
||||
return TextContent::Text(data);
|
||||
}
|
||||
let input = HTMLInputElementCast::to_layout_js(this);
|
||||
let input = this.downcast::<HTMLInputElement>();
|
||||
if let Some(input) = input {
|
||||
let data = unsafe { input.get_value_for_layout() };
|
||||
return TextContent::Text(data);
|
||||
}
|
||||
let area = HTMLTextAreaElementCast::to_layout_js(this);
|
||||
let area = this.downcast::<HTMLTextAreaElement>();
|
||||
if let Some(area) = area {
|
||||
let data = unsafe { area.get_value_for_layout() };
|
||||
return TextContent::Text(data);
|
||||
|
@ -928,7 +926,7 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
|
|||
let this = unsafe {
|
||||
self.get_jsmanaged()
|
||||
};
|
||||
let input = HTMLInputElementCast::to_layout_js(this);
|
||||
let input = this.downcast::<HTMLInputElement>();
|
||||
if let Some(input) = input {
|
||||
let insertion_point = unsafe {
|
||||
input.get_insertion_point_for_layout()
|
||||
|
@ -956,7 +954,7 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
|
|||
/// FIXME(pcwalton): Don't copy URLs.
|
||||
pub fn image_url(&self) -> Option<Url> {
|
||||
unsafe {
|
||||
HTMLImageElementCast::to_layout_js(self.get_jsmanaged())
|
||||
self.get_jsmanaged().downcast::<HTMLImageElement>()
|
||||
.expect("not an image!")
|
||||
.image_url()
|
||||
}
|
||||
|
@ -964,28 +962,28 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
|
|||
|
||||
pub fn canvas_renderer_id(&self) -> Option<usize> {
|
||||
unsafe {
|
||||
let canvas_element = HTMLCanvasElementCast::to_layout_js(self.get_jsmanaged());
|
||||
let canvas_element = self.get_jsmanaged().downcast::<HTMLCanvasElement>();
|
||||
canvas_element.and_then(|elem| elem.get_renderer_id())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn canvas_ipc_renderer(&self) -> Option<IpcSender<CanvasMsg>> {
|
||||
unsafe {
|
||||
let canvas_element = HTMLCanvasElementCast::to_layout_js(self.get_jsmanaged());
|
||||
let canvas_element = self.get_jsmanaged().downcast::<HTMLCanvasElement>();
|
||||
canvas_element.and_then(|elem| elem.get_ipc_renderer())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn canvas_width(&self) -> u32 {
|
||||
unsafe {
|
||||
let canvas_element = HTMLCanvasElementCast::to_layout_js(self.get_jsmanaged());
|
||||
let canvas_element = self.get_jsmanaged().downcast::<HTMLCanvasElement>();
|
||||
canvas_element.unwrap().get_canvas_width()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn canvas_height(&self) -> u32 {
|
||||
unsafe {
|
||||
let canvas_element = HTMLCanvasElementCast::to_layout_js(self.get_jsmanaged());
|
||||
let canvas_element = self.get_jsmanaged().downcast::<HTMLCanvasElement>();
|
||||
canvas_element.unwrap().get_canvas_height()
|
||||
}
|
||||
}
|
||||
|
@ -995,7 +993,7 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
|
|||
pub fn iframe_pipeline_id(&self) -> PipelineId {
|
||||
use script::dom::htmliframeelement::HTMLIFrameElementLayoutMethods;
|
||||
unsafe {
|
||||
let iframe_element = HTMLIFrameElementCast::to_layout_js(self.get_jsmanaged())
|
||||
let iframe_element = self.get_jsmanaged().downcast::<HTMLIFrameElement>()
|
||||
.expect("not an iframe element!");
|
||||
iframe_element.pipeline_id().unwrap()
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue