diff options
Diffstat (limited to 'components/script/dom/window.rs')
-rw-r--r-- | components/script/dom/window.rs | 62 |
1 files changed, 52 insertions, 10 deletions
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 8a3affefe06..05115de0c58 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -43,12 +43,13 @@ use js::rust::Runtime; use layout_interface::{ContentBoxResponse, ContentBoxesResponse, ResolvedStyleResponse, ScriptReflow}; use layout_interface::{LayoutChan, LayoutRPC, Msg, Reflow, ReflowQueryType, MarginStyleResponse}; use libc; -use msg::constellation_msg::{ConstellationChan, LoadData, PipelineId, SubpageId, WindowSizeData}; +use msg::constellation_msg::{ConstellationChan, LoadData, PipelineId, SubpageId}; +use msg::constellation_msg::{WindowSizeData, WindowSizeType}; use msg::webdriver_msg::{WebDriverJSError, WebDriverJSResult}; use net_traits::ResourceThread; use net_traits::image_cache_thread::{ImageCacheChan, ImageCacheThread}; use net_traits::storage_thread::{StorageThread, StorageType}; -use num::traits::ToPrimitive; +use num_traits::ToPrimitive; use page::Page; use profile_traits::mem; use reporter::CSSErrorReporter; @@ -74,6 +75,7 @@ use std::sync::{Arc, Mutex}; use string_cache::Atom; use style::context::ReflowGoal; use style::error_reporting::ParseErrorReporter; +use style::properties::longhands::{overflow_x}; use style::selector_impl::PseudoElement; use task_source::TaskSource; use task_source::dom_manipulation::{DOMManipulationTaskSource, DOMManipulationTask}; @@ -180,7 +182,7 @@ pub struct Window { next_subpage_id: Cell<SubpageId>, /// Pending resize event, if any. - resize_event: Cell<Option<WindowSizeData>>, + resize_event: Cell<Option<(WindowSizeData, WindowSizeType)>>, /// Pipeline id associated with this page. id: PipelineId, @@ -911,11 +913,13 @@ impl Window { //TODO Step 11 //let document = self.Document(); // Step 12 - self.perform_a_scroll(x.to_f32().unwrap_or(0.0f32), y.to_f32().unwrap_or(0.0f32), behavior, None); + self.perform_a_scroll(x.to_f32().unwrap_or(0.0f32), y.to_f32().unwrap_or(0.0f32), + LayerId::null(), behavior, None); } /// https://drafts.csswg.org/cssom-view/#perform-a-scroll - pub fn perform_a_scroll(&self, x: f32, y: f32, behavior: ScrollBehavior, element: Option<&Element>) { + pub fn perform_a_scroll(&self, x: f32, y: f32, layer_id: LayerId, + behavior: ScrollBehavior, element: Option<&Element>) { //TODO Step 1 let point = Point2D::new(x, y); let smooth = match behavior { @@ -934,7 +938,7 @@ impl Window { self.current_viewport.set(Rect::new(Point2D::new(Au::from_f32_px(x), Au::from_f32_px(y)), size)); self.compositor.send(ScriptToCompositorMsg::ScrollFragmentPoint( - self.pipeline(), LayerId::null(), point, smooth)).unwrap() + self.pipeline(), layer_id, point, smooth)).unwrap() } pub fn client_window(&self) -> (Size2D<u32>, Point2D<i32>) { @@ -1122,6 +1126,40 @@ impl Window { self.layout_rpc.node_scroll_area().client_rect } + pub fn overflow_query(&self, node: TrustedNodeAddress) -> Point2D<overflow_x::computed_value::T> { + self.reflow(ReflowGoal::ForScriptQuery, + ReflowQueryType::NodeOverflowQuery(node), + ReflowReason::Query); + self.layout_rpc.node_overflow().0.unwrap() + } + + pub fn scroll_offset_query(&self, node: TrustedNodeAddress) -> Point2D<f32> { + self.reflow(ReflowGoal::ForScriptQuery, + ReflowQueryType::NodeLayerIdQuery(node), + ReflowReason::Query); + let layer_id = self.layout_rpc.node_layer_id().layer_id; + let pipeline_id = self.id; + + let (send, recv) = ipc::channel::<Point2D<f32>>().unwrap(); + self.compositor.send(ScriptToCompositorMsg::GetScrollOffset(pipeline_id, layer_id, send)).unwrap(); + recv.recv().unwrap_or(Point2D::zero()) + } + + // https://drafts.csswg.org/cssom-view/#dom-element-scroll + pub fn scroll_node(&self, node: TrustedNodeAddress, + x_: f64, y_: f64, behavior: ScrollBehavior) { + + self.reflow(ReflowGoal::ForScriptQuery, + ReflowQueryType::NodeLayerIdQuery(node), + ReflowReason::Query); + + let layer_id = self.layout_rpc.node_layer_id().layer_id; + + // Step 12 + self.perform_a_scroll(x_.to_f32().unwrap_or(0.0f32), y_.to_f32().unwrap_or(0.0f32), + layer_id, behavior, None); + } + pub fn resolved_style_query(&self, element: TrustedNodeAddress, pseudo: Option<PseudoElement>, @@ -1161,8 +1199,10 @@ impl Window { /// Commence a new URL load which will either replace this window or scroll to a fragment. pub fn load_url(&self, url: Url) { + let doc = self.Document(); self.main_thread_script_chan().send( - MainThreadScriptMsg::Navigate(self.id, LoadData::new(url))).unwrap(); + MainThreadScriptMsg::Navigate(self.id, + LoadData::new(url, doc.get_referrer_policy(), Some(doc.url().clone())))).unwrap(); } pub fn handle_fire_timer(&self, timer_id: TimerEventId) { @@ -1243,11 +1283,11 @@ impl Window { self.pending_reflow_count.set(self.pending_reflow_count.get() + 1); } - pub fn set_resize_event(&self, event: WindowSizeData) { - self.resize_event.set(Some(event)); + pub fn set_resize_event(&self, event: WindowSizeData, event_type: WindowSizeType) { + self.resize_event.set(Some((event, event_type))); } - pub fn steal_resize_event(&self) -> Option<WindowSizeData> { + pub fn steal_resize_event(&self) -> Option<(WindowSizeData, WindowSizeType)> { let event = self.resize_event.get(); self.resize_event.set(None); event @@ -1476,6 +1516,8 @@ fn debug_reflow_events(id: PipelineId, goal: &ReflowGoal, query_type: &ReflowQue ReflowQueryType::ContentBoxesQuery(_n) => "\tContentBoxesQuery", ReflowQueryType::HitTestQuery(_n, _o) => "\tHitTestQuery", ReflowQueryType::NodeGeometryQuery(_n) => "\tNodeGeometryQuery", + ReflowQueryType::NodeLayerIdQuery(_n) => "\tNodeLayerIdQuery", + ReflowQueryType::NodeOverflowQuery(_n) => "\tNodeOverFlowQuery", ReflowQueryType::NodeScrollGeometryQuery(_n) => "\tNodeScrollGeometryQuery", ReflowQueryType::ResolvedStyleQuery(_, _, _) => "\tResolvedStyleQuery", ReflowQueryType::OffsetParentQuery(_n) => "\tOffsetParentQuery", |