diff options
author | Martin Robinson <mrobinson@igalia.com> | 2017-07-24 14:36:42 +0200 |
---|---|---|
committer | Glenn Watson <github@intuitionlibrary.com> | 2017-07-26 09:58:33 +1000 |
commit | 537025800fdcbaafdf1db991977558d193b37454 (patch) | |
tree | 68387de44e04c3af834f06dada8cc3344d2bfa6a | |
parent | 316878b4898f5a3f3e23c513d8f95540f497971a (diff) | |
download | servo-537025800fdcbaafdf1db991977558d193b37454.tar.gz servo-537025800fdcbaafdf1db991977558d193b37454.zip |
Allow overflow:hidden to scroll via script
13 files changed, 20 insertions, 63 deletions
diff --git a/components/gfx/display_list/mod.rs b/components/gfx/display_list/mod.rs index 22d37d05cc3..ba34abea28d 100644 --- a/components/gfx/display_list/mod.rs +++ b/components/gfx/display_list/mod.rs @@ -34,7 +34,7 @@ use style_traits::cursor::Cursor; use text::TextRun; use text::glyph::ByteIndex; use webrender_api::{self, ClipId, ColorF, GradientStop, LocalClip, MixBlendMode, ScrollPolicy}; -use webrender_api::{TransformStyle, WebGLContextId}; +use webrender_api::{ScrollSensitivity, TransformStyle, WebGLContextId}; pub use style::dom::OpaqueNode; @@ -559,7 +559,7 @@ impl fmt::Debug for StackingContext { #[derive(Clone, Debug, HeapSizeOf, Deserialize, Serialize)] pub enum ScrollRootType { - ScrollFrame, + ScrollFrame(ScrollSensitivity), Clip, } diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index f585d32eb8e..55dc56a06f0 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -71,7 +71,7 @@ use style_traits::CSSPixel; use style_traits::cursor::Cursor; use table_cell::CollapsedBordersForCell; use webrender_api::{ClipId, ColorF, ComplexClipRegion, GradientStop, LocalClip, RepeatMode}; -use webrender_api::{LineStyle, ScrollPolicy, TransformStyle}; +use webrender_api::{LineStyle, ScrollPolicy, ScrollSensitivity, TransformStyle}; use webrender_helpers::{ToBorderRadius, ToMixBlendMode, ToRectF, ToTransformStyle}; trait ResolvePercentage { @@ -2257,7 +2257,6 @@ pub trait BlockFlowDisplayListBuilding { -> ClipId; fn setup_scroll_root_for_overflow(&mut self, state: &mut DisplayListBuildState, - preserved_state: &mut PreservedDisplayListState, border_box: &Rect<Au>); fn setup_scroll_root_for_css_clip(&mut self, state: &mut DisplayListBuildState, @@ -2483,7 +2482,7 @@ impl BlockFlowDisplayListBuilding for BlockFlow { self.transform_clip_to_coordinate_space(state, preserved_state); } - self.setup_scroll_root_for_overflow(state, preserved_state, &stacking_relative_border_box); + self.setup_scroll_root_for_overflow(state, &stacking_relative_border_box); self.setup_scroll_root_for_css_clip(state, preserved_state, &stacking_relative_border_box); self.base.clip = state.clip_stack.last().cloned().unwrap_or_else(max_rect); @@ -2498,7 +2497,6 @@ impl BlockFlowDisplayListBuilding for BlockFlow { fn setup_scroll_root_for_overflow(&mut self, state: &mut DisplayListBuildState, - preserved_state: &mut PreservedDisplayListState, border_box: &Rect<Au>) { if !self.overflow_style_may_require_scroll_root() { return; @@ -2526,27 +2524,12 @@ impl BlockFlowDisplayListBuilding for BlockFlow { return; } - let overflow_x = self.fragment.style.get_box().overflow_x; - let overflow_y = self.fragment.style.get_box().overflow_y; - - let content_size = self.base.overflow.scroll.origin + self.base.overflow.scroll.size; - let mut content_size = Size2D::new(content_size.x, content_size.y); - if overflow_x::T::hidden == overflow_x { - content_size.width = content_box.size.width; - } - - if overflow_x::T::hidden == overflow_y { - content_size.height = content_box.size.height; - } - - if overflow_x::T::hidden == overflow_y || overflow_x::T::hidden == overflow_x { - preserved_state.push_clip(state, &border_box, self.positioning()); - } - - let mut root_type = ScrollRootType::ScrollFrame; - if overflow_x::T::hidden == overflow_y && overflow_x::T::hidden == overflow_x { - root_type = ScrollRootType::Clip; - } + let sensitivity = if overflow_x::T::hidden == self.fragment.style.get_box().overflow_x && + overflow_x::T::hidden == self.fragment.style.get_box().overflow_y { + ScrollSensitivity::Script + } else { + ScrollSensitivity::ScriptAndInputEvents + }; let clip_rect = build_inner_border_box_for_border_rect(&border_box, &self.fragment.style); let mut clip = ClippingRegion::from_rect(&clip_rect); @@ -2555,6 +2538,9 @@ impl BlockFlowDisplayListBuilding for BlockFlow { clip.intersect_with_rounded_rect(&clip_rect, &radii) } + let content_size = self.base.overflow.scroll.origin + self.base.overflow.scroll.size; + let content_size = Size2D::new(content_size.x, content_size.y); + let parent_id = self.scroll_root_id(state.layout_context.id); state.add_scroll_root( ScrollRoot { @@ -2562,7 +2548,7 @@ impl BlockFlowDisplayListBuilding for BlockFlow { parent_id: parent_id, clip: clip, content_rect: Rect::new(content_box.origin, content_size), - root_type, + root_type: ScrollRootType::ScrollFrame(sensitivity), }, self.base.stacking_context_id ); diff --git a/components/layout/webrender_helpers.rs b/components/layout/webrender_helpers.rs index 889ee087b0b..d33638d08d2 100644 --- a/components/layout/webrender_helpers.rs +++ b/components/layout/webrender_helpers.rs @@ -16,8 +16,8 @@ use msg::constellation_msg::PipelineId; use style::computed_values::{image_rendering, mix_blend_mode, transform_style}; use style::values::computed::{BorderStyle, Filter}; use style::values::generics::effects::Filter as GenericFilter; -use webrender_api::{self, ComplexClipRegion, DisplayListBuilder, ExtendMode}; -use webrender_api::{LayoutTransform, ClipId}; +use webrender_api::{self, ClipId, ComplexClipRegion, DisplayListBuilder, ExtendMode}; +use webrender_api::LayoutTransform; pub trait WebRenderDisplayListConverter { fn convert_to_webrender(&self, pipeline_id: PipelineId) -> DisplayListBuilder; @@ -190,7 +190,7 @@ impl ToFilterOps for Vec<Filter> { let mut result = Vec::with_capacity(self.len()); for filter in self.iter() { match *filter { - GenericFilter::Blur(radius) => result.push(webrender_api::FilterOp::Blur(radius)), + GenericFilter::Blur(radius) => result.push(webrender_api::FilterOp::Blur(radius.to_f32_px())), GenericFilter::Brightness(amount) => result.push(webrender_api::FilterOp::Brightness(amount)), GenericFilter::Contrast(amount) => result.push(webrender_api::FilterOp::Contrast(amount)), GenericFilter::Grayscale(amount) => result.push(webrender_api::FilterOp::Grayscale(amount)), @@ -506,12 +506,13 @@ impl WebRenderDisplayItemConverter for DisplayItem { item.scroll_root.clip.get_complex_clips(), None) } - ScrollRootType::ScrollFrame => { + ScrollRootType::ScrollFrame(scroll_sensitivity) => { builder.define_scroll_frame(Some(our_id), item.scroll_root.content_rect.to_rectf(), item.scroll_root.clip.main.to_rectf(), item.scroll_root.clip.get_complex_clips(), - None) + None, + scroll_sensitivity) } }; debug_assert!(our_id == webrender_id); diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-1.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-1.htm.ini deleted file mode 100644 index 8b92d2cee28..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-1.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[attachment-local-clipping-image-1.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-2.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-2.htm.ini deleted file mode 100644 index ccfa81e106b..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-2.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[attachment-local-clipping-image-2.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-3.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-3.htm.ini deleted file mode 100644 index 650a371c595..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-3.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[attachment-local-clipping-image-3.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-4.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-4.htm.ini deleted file mode 100644 index 5d6a3d38484..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-4.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[attachment-local-clipping-image-4.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-5.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-5.htm.ini deleted file mode 100644 index 176412407e3..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-5.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[attachment-local-clipping-image-5.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-6.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-6.htm.ini deleted file mode 100644 index c58b15efad7..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-clipping-image-6.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[attachment-local-clipping-image-6.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-positioning-2.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-positioning-2.htm.ini deleted file mode 100644 index 294802ca0c9..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-positioning-2.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[attachment-local-positioning-2.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-positioning-5.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-positioning-5.htm.ini deleted file mode 100644 index 94f0d1bdfc9..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-local-positioning-5.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[attachment-local-positioning-5.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-scroll-positioning-1.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-scroll-positioning-1.htm.ini deleted file mode 100644 index c01b934ef28..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/attachment-scroll-positioning-1.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[attachment-scroll-positioning-1.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/scroll-positioned-multiple-background-images.htm.ini b/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/scroll-positioned-multiple-background-images.htm.ini deleted file mode 100644 index e4b266d8a0d..00000000000 --- a/tests/wpt/metadata-css/css-backgrounds-3_dev/html4/scroll-positioned-multiple-background-images.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[scroll-positioned-multiple-background-images.htm] - type: reftest - expected: FAIL |