Index: cc/layers/layer_impl.cc |
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc |
index 55ffa7fb994122e462ab07fe5099fa0bef581e6c..eae36859f35be17e6919cc056b5c2e9123d3b9cd 100644 |
--- a/cc/layers/layer_impl.cc |
+++ b/cc/layers/layer_impl.cc |
@@ -54,6 +54,7 @@ LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, |
should_scroll_on_main_thread_(false), |
have_wheel_event_handlers_(false), |
have_scroll_event_handlers_(false), |
+ scroll_blocks_on_(ScrollBlocksOnNone), |
user_scrollable_horizontal_(true), |
user_scrollable_vertical_(true), |
stacking_order_changed_(false), |
@@ -392,7 +393,8 @@ void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() { |
InputHandler::ScrollStatus LayerImpl::TryScroll( |
const gfx::PointF& screen_space_point, |
- InputHandler::ScrollInputType type) const { |
+ InputHandler::ScrollInputType type, |
+ ScrollBlocksOn effective_block_mode) const { |
if (should_scroll_on_main_thread()) { |
TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); |
return InputHandler::ScrollOnMainThread; |
@@ -430,7 +432,14 @@ InputHandler::ScrollStatus LayerImpl::TryScroll( |
} |
} |
- if (type == InputHandler::Wheel && have_wheel_event_handlers()) { |
+ if (have_scroll_event_handlers() && |
+ effective_block_mode & ScrollBlocksOnScrollEvent) { |
+ TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed ScrollEventHandlers"); |
+ return InputHandler::ScrollOnMainThread; |
+ } |
+ |
+ if (type == InputHandler::Wheel && have_wheel_event_handlers() && |
+ effective_block_mode & ScrollBlocksOnWheelEvent) { |
TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); |
return InputHandler::ScrollOnMainThread; |
} |
@@ -487,6 +496,7 @@ void LayerImpl::PushPropertiesTo(LayerImpl* layer) { |
layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_); |
layer->SetHaveWheelEventHandlers(have_wheel_event_handlers_); |
layer->SetHaveScrollEventHandlers(have_scroll_event_handlers_); |
+ layer->SetScrollBlocksOn(scroll_blocks_on_); |
layer->SetNonFastScrollableRegion(non_fast_scrollable_region_); |
layer->SetTouchEventHandlerRegion(touch_event_handler_region_); |
layer->SetContentsOpaque(contents_opaque_); |
@@ -649,6 +659,17 @@ base::DictionaryValue* LayerImpl::LayerTreeAsJson() const { |
result->Set("TouchRegion", region.release()); |
} |
+ if (scroll_blocks_on_) { |
+ list = new base::ListValue; |
+ if (scroll_blocks_on_ & ScrollBlocksOnStartTouch) |
+ list->AppendString("StartTouch"); |
+ if (scroll_blocks_on_ & ScrollBlocksOnWheelEvent) |
+ list->AppendString("WheelEvent"); |
+ if (scroll_blocks_on_ & ScrollBlocksOnScrollEvent) |
+ list->AppendString("ScrollEvent"); |
+ result->Set("ScrollBlocksOn", list); |
+ } |
+ |
list = new base::ListValue; |
for (size_t i = 0; i < children_.size(); ++i) |
list->Append(children_[i]->LayerTreeAsJson()); |
@@ -1080,22 +1101,15 @@ void LayerImpl::PushScrollOffsetFromMainThread( |
PushScrollOffset(&scroll_offset); |
} |
+void LayerImpl::PushScrollOffsetFromMainThreadAndClobberActiveValue( |
+ const gfx::ScrollOffset& scroll_offset) { |
+ scroll_offset_->set_clobber_active_value(); |
+ PushScrollOffset(&scroll_offset); |
+} |
+ |
gfx::ScrollOffset LayerImpl::PullDeltaForMainThread() { |
RefreshFromScrollDelegate(); |
- |
- // TODO(aelias, miletus): Remove all this temporary flooring machinery when |
- // Blink fully supports fractional scrolls. |
- gfx::ScrollOffset current_offset = CurrentScrollOffset(); |
- gfx::Vector2dF current_delta = ScrollDelta(); |
- gfx::Vector2dF floored_delta(floor(current_delta.x()), |
- floor(current_delta.y())); |
- gfx::Vector2dF diff_delta = floored_delta - current_delta; |
- gfx::ScrollOffset tmp_offset = ScrollOffsetWithDelta(current_offset, |
- diff_delta); |
- scroll_offset_->SetCurrent(tmp_offset); |
- gfx::ScrollOffset delta = scroll_offset_->PullDeltaForMainThread(); |
- scroll_offset_->SetCurrent(current_offset); |
- return delta; |
+ return scroll_offset_->PullDeltaForMainThread(); |
} |
void LayerImpl::RefreshFromScrollDelegate() { |
@@ -1140,8 +1154,6 @@ void LayerImpl::PushScrollOffset(const gfx::ScrollOffset* scroll_offset) { |
} |
if (IsActive()) { |
changed |= scroll_offset_->PushPendingToActive(); |
- if (layer_animation_controller_->scroll_offset_animation_was_interrupted()) |
- SetScrollDelta(gfx::Vector2dF()); |
} |
if (changed) |
@@ -1177,6 +1189,9 @@ void LayerImpl::DidBeginTracing() {} |
void LayerImpl::ReleaseResources() {} |
+void LayerImpl::RecreateResources() { |
+} |
+ |
gfx::ScrollOffset LayerImpl::MaxScrollOffset() const { |
if (!scroll_clip_layer_ || bounds().IsEmpty()) |
return gfx::ScrollOffset(); |
@@ -1440,6 +1455,9 @@ void LayerImpl::AsValueInto(base::debug::TracedValue* state) const { |
non_fast_scrollable_region_.AsValueInto(state); |
state->EndArray(); |
} |
+ if (scroll_blocks_on_) { |
+ state->SetInteger("scroll_blocks_on", scroll_blocks_on_); |
+ } |
state->BeginArray("children"); |
for (size_t i = 0; i < children_.size(); ++i) { |