Add NodeHelpers::get_bounding_content_box().

This commit is contained in:
Tetsuharu OHZEKI 2014-04-23 02:33:37 +09:00
parent 5e27f49fe2
commit dce92dc44a
4 changed files with 23 additions and 26 deletions

View file

@ -20,7 +20,7 @@ use dom::htmlcollection::HTMLCollection;
use dom::htmlserializer::serialize; use dom::htmlserializer::serialize;
use dom::node::{ElementNodeTypeId, Node, NodeHelpers, NodeIterator, document_from_node}; use dom::node::{ElementNodeTypeId, Node, NodeHelpers, NodeIterator, document_from_node};
use dom::virtualmethods::{VirtualMethods, vtable_for}; use dom::virtualmethods::{VirtualMethods, vtable_for};
use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery}; use layout_interface::{ContentBoxesQuery};
use layout_interface::{ContentBoxesResponse, ContentChangedDocumentDamage}; use layout_interface::{ContentBoxesResponse, ContentChangedDocumentDamage};
use layout_interface::MatchSelectorsDocumentDamage; use layout_interface::MatchSelectorsDocumentDamage;
use style; use style;
@ -625,9 +625,7 @@ impl Element {
let doc = self.node.owner_doc(); let doc = self.node.owner_doc();
let win = &doc.get().window; let win = &doc.get().window;
let node: JS<Node> = NodeCast::from(abstract_self); let node: JS<Node> = NodeCast::from(abstract_self);
let (chan, port) = channel(); let rect = node.get_bounding_content_box();
let addr = node.to_trusted_node_address();
let ContentBoxResponse(rect) = win.get().page().query_layout(ContentBoxQuery(addr, chan), port);
ClientRect::new( ClientRect::new(
win, win,
rect.origin.y, rect.origin.y,

View file

@ -16,7 +16,6 @@ use dom::htmlelement::HTMLElement;
use dom::node::{Node, ElementNodeTypeId, NodeHelpers, window_from_node}; use dom::node::{Node, ElementNodeTypeId, NodeHelpers, window_from_node};
use dom::virtualmethods::VirtualMethods; use dom::virtualmethods::VirtualMethods;
use servo_util::geometry::to_px; use servo_util::geometry::to_px;
use layout_interface::{ContentBoxQuery, ContentBoxResponse};
use servo_net::image_cache_task; use servo_net::image_cache_task;
use servo_util::url::parse_url; use servo_util::url::parse_url;
use servo_util::str::DOMString; use servo_util::str::DOMString;
@ -131,11 +130,7 @@ impl HTMLImageElement {
pub fn Width(&self, abstract_self: &JS<HTMLImageElement>) -> u32 { pub fn Width(&self, abstract_self: &JS<HTMLImageElement>) -> u32 {
let node: JS<Node> = NodeCast::from(abstract_self); let node: JS<Node> = NodeCast::from(abstract_self);
let window = window_from_node(&node); let rect = node.get_bounding_content_box();
let page = window.get().page();
let (chan, port) = channel();
let addr = node.to_trusted_node_address();
let ContentBoxResponse(rect) = page.query_layout(ContentBoxQuery(addr, chan), port);
to_px(rect.size.width) as u32 to_px(rect.size.width) as u32
} }
@ -145,13 +140,8 @@ impl HTMLImageElement {
} }
pub fn Height(&self, abstract_self: &JS<HTMLImageElement>) -> u32 { pub fn Height(&self, abstract_self: &JS<HTMLImageElement>) -> u32 {
let node = &self.htmlelement.element.node; let node: JS<Node> = NodeCast::from(abstract_self);
let doc = node.owner_doc(); let rect = node.get_bounding_content_box();
let page = doc.get().window.get().page();
let (chan, port) = channel();
let this_node: JS<Node> = NodeCast::from(abstract_self);
let addr = this_node.to_trusted_node_address();
let ContentBoxResponse(rect) = page.query_layout(ContentBoxQuery(addr, chan), port);
to_px(rect.size.height) as u32 to_px(rect.size.height) as u32
} }

View file

@ -26,9 +26,10 @@ use dom::processinginstruction::ProcessingInstruction;
use dom::text::Text; use dom::text::Text;
use dom::virtualmethods::{VirtualMethods, vtable_for}; use dom::virtualmethods::{VirtualMethods, vtable_for};
use dom::window::Window; use dom::window::Window;
use geom::rect::Rect;
use html::hubbub_html_parser::build_element_from_tag; use html::hubbub_html_parser::build_element_from_tag;
use layout_interface::{LayoutChan, ReapLayoutDataMsg, UntrustedNodeAddress}; use layout_interface::{ContentBoxQuery, ContentBoxResponse, LayoutChan, ReapLayoutDataMsg, TrustedNodeAddress, UntrustedNodeAddress};
use layout_interface::TrustedNodeAddress; use servo_util::geometry::Au;
use servo_util::str::{DOMString, null_str_as_empty}; use servo_util::str::{DOMString, null_str_as_empty};
use js::jsapi::{JSContext, JSObject, JSRuntime}; use js::jsapi::{JSContext, JSObject, JSRuntime};
@ -283,6 +284,8 @@ pub trait NodeHelpers {
fn from_untrusted_node_address(runtime: *JSRuntime, candidate: UntrustedNodeAddress) -> Self; fn from_untrusted_node_address(runtime: *JSRuntime, candidate: UntrustedNodeAddress) -> Self;
fn to_trusted_node_address(&self) -> TrustedNodeAddress; fn to_trusted_node_address(&self) -> TrustedNodeAddress;
fn get_bounding_content_box(&self) -> Rect<Au>;
} }
impl NodeHelpers for JS<Node> { impl NodeHelpers for JS<Node> {
@ -565,6 +568,15 @@ impl NodeHelpers for JS<Node> {
fn to_trusted_node_address(&self) -> TrustedNodeAddress { fn to_trusted_node_address(&self) -> TrustedNodeAddress {
TrustedNodeAddress(self.get() as *Node as *libc::c_void) TrustedNodeAddress(self.get() as *Node as *libc::c_void)
} }
fn get_bounding_content_box(&self) -> Rect<Au> {
let window = window_from_node(self);
let page = window.get().page();
let (chan, port) = channel();
let addr = self.to_trusted_node_address();
let ContentBoxResponse(rect) = page.query_layout(ContentBoxQuery(addr, chan), port);
rect
}
} }
// //

View file

@ -22,7 +22,6 @@ use html::hubbub_html_parser::HtmlParserResult;
use html::hubbub_html_parser::{HtmlDiscoveredStyle, HtmlDiscoveredIFrame, HtmlDiscoveredScript}; use html::hubbub_html_parser::{HtmlDiscoveredStyle, HtmlDiscoveredIFrame, HtmlDiscoveredScript};
use html::hubbub_html_parser; use html::hubbub_html_parser;
use layout_interface::{AddStylesheetMsg, DocumentDamage}; use layout_interface::{AddStylesheetMsg, DocumentDamage};
use layout_interface::{ContentBoxQuery, ContentBoxResponse};
use layout_interface::{DocumentDamageLevel, HitTestQuery, HitTestResponse, LayoutQuery, MouseOverQuery, MouseOverResponse}; use layout_interface::{DocumentDamageLevel, HitTestQuery, HitTestResponse, LayoutQuery, MouseOverQuery, MouseOverResponse};
use layout_interface::{LayoutChan, MatchSelectorsDocumentDamage, QueryMsg}; use layout_interface::{LayoutChan, MatchSelectorsDocumentDamage, QueryMsg};
use layout_interface::{Reflow, ReflowDocumentDamage, ReflowForDisplay, ReflowGoal, ReflowMsg}; use layout_interface::{Reflow, ReflowDocumentDamage, ReflowForDisplay, ReflowGoal, ReflowMsg};
@ -958,11 +957,9 @@ impl ScriptTask {
chan.send(LoadCompleteMsg(page.id, url)); chan.send(LoadCompleteMsg(page.id, url));
} }
fn scroll_fragment_point(&self, pipeline_id: PipelineId, page: &Page, node: JS<Element>) { fn scroll_fragment_point(&self, pipeline_id: PipelineId, node: JS<Element>) {
let (chan, port) = channel();
let node: JS<Node> = NodeCast::from(&node); let node: JS<Node> = NodeCast::from(&node);
let ContentBoxResponse(rect) = let rect = node.get_bounding_content_box();
page.query_layout(ContentBoxQuery(node.to_trusted_node_address(), chan), port);
let point = Point2D(to_frac_px(rect.origin.x).to_f32().unwrap(), let point = Point2D(to_frac_px(rect.origin.x).to_f32().unwrap(),
to_frac_px(rect.origin.y).to_f32().unwrap()); to_frac_px(rect.origin.y).to_f32().unwrap());
// FIXME(#2003, pcwalton): This is pretty bogus when multiple layers are involved. // FIXME(#2003, pcwalton): This is pretty bogus when multiple layers are involved.
@ -1000,7 +997,7 @@ impl ScriptTask {
let mut fragment_node = page.fragment_node.deref().borrow_mut(); let mut fragment_node = page.fragment_node.deref().borrow_mut();
match fragment_node.take() { match fragment_node.take() {
Some(node) => self.scroll_fragment_point(pipeline_id, page, node), Some(node) => self.scroll_fragment_point(pipeline_id, node),
None => {} None => {}
} }
@ -1159,7 +1156,7 @@ impl ScriptTask {
if click_frag { if click_frag {
match page.find_fragment_node(url.fragment.unwrap()) { match page.find_fragment_node(url.fragment.unwrap()) {
Some(node) => self.scroll_fragment_point(page.id, page, node), Some(node) => self.scroll_fragment_point(page.id, node),
None => {} None => {}
} }
} else { } else {