diff options
author | Josh Matthews <josh@joshmatthews.net> | 2013-08-06 16:08:38 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2013-08-06 19:03:09 -0400 |
commit | 65a33f60e592dc3043379d95f8c3314e5bee74fa (patch) | |
tree | 7e6527fc3754b5b57e1c4b1fd4bc71759689e272 /src/components/script/dom/element.rs | |
parent | 08ed6d318e0ae79e3994b00a6e09cf3f2f69bd21 (diff) | |
download | servo-65a33f60e592dc3043379d95f8c3314e5bee74fa.tar.gz servo-65a33f60e592dc3043379d95f8c3314e5bee74fa.zip |
Generate bindings for HTMLDivElement, and pass abstract type to methods that need access to the opaque wrappers.
Diffstat (limited to 'src/components/script/dom/element.rs')
-rw-r--r-- | src/components/script/dom/element.rs | 183 |
1 files changed, 88 insertions, 95 deletions
diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 8ff300fe1b7..3459d2dd06f 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -5,7 +5,7 @@ //! Element nodes. use dom::bindings::codegen::{HTMLHeadElementBinding, HTMLHtmlElementBinding}; -use dom::bindings::codegen::{HTMLAnchorElementBinding}; +use dom::bindings::codegen::{HTMLAnchorElementBinding, HTMLDivElementBinding}; use dom::bindings::utils::{DOMString, null_string, ErrorResult}; use dom::bindings::utils::{CacheableWrapper, BindingObject, WrapperCache}; use dom::clientrect::ClientRect; @@ -134,6 +134,15 @@ impl HTMLHtmlElement { } } +impl HTMLDivElement { + pub fn Align(&self) -> DOMString { + null_string + } + + pub fn SetAlign(&mut self, _align: &DOMString, _rv: &mut ErrorResult) { + } +} + pub macro_rules! generate_cacheable_wrapper( ($name: ident, $wrap: path) => ( impl CacheableWrapper for $name { @@ -165,6 +174,8 @@ generate_cacheable_wrapper!(HTMLHtmlElement, HTMLHtmlElementBinding::Wrap) generate_binding_object!(HTMLHtmlElement) generate_cacheable_wrapper!(HTMLAnchorElement, HTMLAnchorElementBinding::Wrap) generate_binding_object!(HTMLAnchorElement) +generate_cacheable_wrapper!(HTMLDivElement, HTMLDivElementBinding::Wrap) +generate_binding_object!(HTMLDivElement) // // Fancier elements @@ -233,95 +244,6 @@ impl<'self> Element { } } - pub fn getClientRects(&self) -> Option<@mut ClientRectList> { - let (rects, cx, scope) = match self.parent.owner_doc { - Some(doc) => { - match doc.with_base(|doc| doc.window) { - Some(win) => { - let node = self.parent.abstract.get(); - assert!(node.is_element()); - let page = win.page; - let (port, chan) = comm::stream(); - // TODO(tkuehn): currently just queries top-level page layout. Needs to query - // subframe layout if this element is in a subframe. Probably need an ID field. - match unsafe {(*page).query_layout(ContentBoxesQuery(node, chan), port)} { - Ok(ContentBoxesResponse(rects)) => { - let cx = unsafe {(*page).js_info.get_ref().js_compartment.cx.ptr}; - let cache = win.get_wrappercache(); - let scope = cache.get_wrapper(); - let rects = do rects.map |r| { - ClientRect::new( - r.origin.y.to_f32(), - (r.origin.y + r.size.height).to_f32(), - r.origin.x.to_f32(), - (r.origin.x + r.size.width).to_f32(), - cx, - scope) - }; - Some((rects, cx, scope)) - }, - Err(()) => { - debug!("layout query error"); - None - } - } - } - None => { - debug!("no window"); - None - } - } - } - None => { - debug!("no document"); - None - } - }.get(); - - Some(ClientRectList::new(rects, cx, scope)) - } - - pub fn getBoundingClientRect(&self) -> Option<@mut ClientRect> { - match self.parent.owner_doc { - Some(doc) => { - match doc.with_base(|doc| doc.window) { - Some(win) => { - let page = win.page; - let node = self.parent.abstract.get(); - assert!(node.is_element()); - let (port, chan) = comm::stream(); - match unsafe{(*page).query_layout(ContentBoxQuery(node, chan), port)} { - Ok(ContentBoxResponse(rect)) => { - let cx = unsafe {(*page).js_info.get_ref().js_compartment.cx.ptr}; - let cache = win.get_wrappercache(); - let scope = cache.get_wrapper(); - Some(ClientRect::new( - rect.origin.y.to_f32(), - (rect.origin.y + rect.size.height).to_f32(), - rect.origin.x.to_f32(), - (rect.origin.x + rect.size.width).to_f32(), - cx, - scope)) - }, - Err(()) => { - debug!("error querying layout"); - None - } - } - } - None => { - debug!("no window"); - None - } - } - } - None => { - debug!("no document"); - None - } - } - } - fn get_scope_and_cx(&self) -> (*JSObject, *JSContext) { let doc = self.parent.owner_doc.get(); let win = doc.with_base(|doc| doc.window.get()); @@ -405,13 +327,84 @@ impl Element { pub fn MozRequestPointerLock(&self) { } - pub fn GetClientRects(&self) -> @mut ClientRectList { - let (scope, cx) = self.get_scope_and_cx(); - ClientRectList::new(~[], cx, scope) + pub fn GetClientRects(&self, abstract_self: AbstractNode<ScriptView>) -> @mut ClientRectList { + let (rects, cx, scope) = match self.parent.owner_doc { + Some(doc) => { + match doc.with_base(|doc| doc.window) { + Some(win) => { + let node = abstract_self; + assert!(node.is_element()); + let page = win.page; + let (port, chan) = comm::stream(); + // TODO(tkuehn): currently just queries top-level page layout. Needs to query + // subframe layout if this element is in a subframe. Probably need an ID field. + match unsafe {(*page).query_layout(ContentBoxesQuery(node, chan), port)} { + Ok(ContentBoxesResponse(rects)) => { + let cx = unsafe {(*page).js_info.get_ref().js_compartment.cx.ptr}; + let cache = win.get_wrappercache(); + let scope = cache.get_wrapper(); + let rects = do rects.map |r| { + ClientRect::new( + r.origin.y.to_f32(), + (r.origin.y + r.size.height).to_f32(), + r.origin.x.to_f32(), + (r.origin.x + r.size.width).to_f32(), + cx, + scope) + }; + Some((rects, cx, scope)) + }, + Err(()) => { + debug!("layout query error"); + None + } + } + } + None => { + debug!("no window"); + None + } + } + } + None => { + debug!("no document"); + None + } + }.get(); + + ClientRectList::new(rects, cx, scope) } - pub fn GetBoundingClientRect(&self) -> @mut ClientRect { - fail!("stub") + pub fn GetBoundingClientRect(&self, abstract_self: AbstractNode<ScriptView>) -> @mut ClientRect { + match self.parent.owner_doc { + Some(doc) => { + match doc.with_base(|doc| doc.window) { + Some(win) => { + let page = win.page; + let node = abstract_self; + assert!(node.is_element()); + let (port, chan) = comm::stream(); + match unsafe{(*page).query_layout(ContentBoxQuery(node, chan), port)} { + Ok(ContentBoxResponse(rect)) => { + let cx = unsafe {(*page).js_info.get_ref().js_compartment.cx.ptr}; + let cache = win.get_wrappercache(); + let scope = cache.get_wrapper(); + ClientRect::new( + rect.origin.y.to_f32(), + (rect.origin.y + rect.size.height).to_f32(), + rect.origin.x.to_f32(), + (rect.origin.x + rect.size.width).to_f32(), + cx, + scope) + }, + Err(()) => fail!("error querying layout") + } + } + None => fail!("no window") + } + } + None => fail!("no document") + } } pub fn ScrollIntoView(&self, _top: bool) { |