OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/layers/layer_impl.h" | 5 #include "cc/layers/layer_impl.h" |
6 | 6 |
7 #include "base/json/json_reader.h" | 7 #include "base/json/json_reader.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
10 #include "base/trace_event/trace_event_argument.h" | 10 #include "base/trace_event/trace_event_argument.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 mask_layer_id_(-1), | 47 mask_layer_id_(-1), |
48 replica_layer_id_(-1), | 48 replica_layer_id_(-1), |
49 layer_id_(id), | 49 layer_id_(id), |
50 layer_tree_impl_(tree_impl), | 50 layer_tree_impl_(tree_impl), |
51 scroll_offset_(scroll_offset), | 51 scroll_offset_(scroll_offset), |
52 scroll_offset_delegate_(nullptr), | 52 scroll_offset_delegate_(nullptr), |
53 scroll_clip_layer_(nullptr), | 53 scroll_clip_layer_(nullptr), |
54 should_scroll_on_main_thread_(false), | 54 should_scroll_on_main_thread_(false), |
55 have_wheel_event_handlers_(false), | 55 have_wheel_event_handlers_(false), |
56 have_scroll_event_handlers_(false), | 56 have_scroll_event_handlers_(false), |
| 57 scroll_blocks_on_(ScrollBlocksOnNone), |
57 user_scrollable_horizontal_(true), | 58 user_scrollable_horizontal_(true), |
58 user_scrollable_vertical_(true), | 59 user_scrollable_vertical_(true), |
59 stacking_order_changed_(false), | 60 stacking_order_changed_(false), |
60 double_sided_(true), | 61 double_sided_(true), |
61 should_flatten_transform_(true), | 62 should_flatten_transform_(true), |
62 layer_property_changed_(false), | 63 layer_property_changed_(false), |
63 masks_to_bounds_(false), | 64 masks_to_bounds_(false), |
64 contents_opaque_(false), | 65 contents_opaque_(false), |
65 is_root_for_isolated_group_(false), | 66 is_root_for_isolated_group_(false), |
66 use_parent_backface_visibility_(false), | 67 use_parent_backface_visibility_(false), |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 : user_scrollable_vertical_; | 386 : user_scrollable_vertical_; |
386 } | 387 } |
387 | 388 |
388 void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() { | 389 void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() { |
389 DCHECK(layer_tree_impl()->IsActiveTree()); | 390 DCHECK(layer_tree_impl()->IsActiveTree()); |
390 scroll_offset_->AbortCommit(); | 391 scroll_offset_->AbortCommit(); |
391 } | 392 } |
392 | 393 |
393 InputHandler::ScrollStatus LayerImpl::TryScroll( | 394 InputHandler::ScrollStatus LayerImpl::TryScroll( |
394 const gfx::PointF& screen_space_point, | 395 const gfx::PointF& screen_space_point, |
395 InputHandler::ScrollInputType type) const { | 396 InputHandler::ScrollInputType type, |
| 397 ScrollBlocksOn effective_block_mode) const { |
396 if (should_scroll_on_main_thread()) { | 398 if (should_scroll_on_main_thread()) { |
397 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); | 399 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); |
398 return InputHandler::ScrollOnMainThread; | 400 return InputHandler::ScrollOnMainThread; |
399 } | 401 } |
400 | 402 |
401 if (!screen_space_transform().IsInvertible()) { | 403 if (!screen_space_transform().IsInvertible()) { |
402 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); | 404 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); |
403 return InputHandler::ScrollIgnored; | 405 return InputHandler::ScrollIgnored; |
404 } | 406 } |
405 | 407 |
(...skipping 17 matching lines...) Expand all Loading... |
423 1.f / contents_scale_y()); | 425 1.f / contents_scale_y()); |
424 if (!clipped && | 426 if (!clipped && |
425 non_fast_scrollable_region().Contains( | 427 non_fast_scrollable_region().Contains( |
426 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { | 428 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { |
427 TRACE_EVENT0("cc", | 429 TRACE_EVENT0("cc", |
428 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); | 430 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); |
429 return InputHandler::ScrollOnMainThread; | 431 return InputHandler::ScrollOnMainThread; |
430 } | 432 } |
431 } | 433 } |
432 | 434 |
433 if (type == InputHandler::Wheel && have_wheel_event_handlers()) { | 435 if (have_scroll_event_handlers() && |
| 436 effective_block_mode & ScrollBlocksOnScrollEvent) { |
| 437 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed ScrollEventHandlers"); |
| 438 return InputHandler::ScrollOnMainThread; |
| 439 } |
| 440 |
| 441 if (type == InputHandler::Wheel && have_wheel_event_handlers() && |
| 442 effective_block_mode & ScrollBlocksOnWheelEvent) { |
434 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); | 443 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); |
435 return InputHandler::ScrollOnMainThread; | 444 return InputHandler::ScrollOnMainThread; |
436 } | 445 } |
437 | 446 |
438 if (!scrollable()) { | 447 if (!scrollable()) { |
439 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); | 448 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); |
440 return InputHandler::ScrollIgnored; | 449 return InputHandler::ScrollIgnored; |
441 } | 450 } |
442 | 451 |
443 gfx::ScrollOffset max_scroll_offset = MaxScrollOffset(); | 452 gfx::ScrollOffset max_scroll_offset = MaxScrollOffset(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 draw_checkerboard_for_missing_tiles_); | 489 draw_checkerboard_for_missing_tiles_); |
481 layer->SetDrawsContent(DrawsContent()); | 490 layer->SetDrawsContent(DrawsContent()); |
482 layer->SetHideLayerAndSubtree(hide_layer_and_subtree_); | 491 layer->SetHideLayerAndSubtree(hide_layer_and_subtree_); |
483 layer->SetHasRenderSurface(!!render_surface()); | 492 layer->SetHasRenderSurface(!!render_surface()); |
484 layer->SetFilters(filters()); | 493 layer->SetFilters(filters()); |
485 layer->SetBackgroundFilters(background_filters()); | 494 layer->SetBackgroundFilters(background_filters()); |
486 layer->SetMasksToBounds(masks_to_bounds_); | 495 layer->SetMasksToBounds(masks_to_bounds_); |
487 layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_); | 496 layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_); |
488 layer->SetHaveWheelEventHandlers(have_wheel_event_handlers_); | 497 layer->SetHaveWheelEventHandlers(have_wheel_event_handlers_); |
489 layer->SetHaveScrollEventHandlers(have_scroll_event_handlers_); | 498 layer->SetHaveScrollEventHandlers(have_scroll_event_handlers_); |
| 499 layer->SetScrollBlocksOn(scroll_blocks_on_); |
490 layer->SetNonFastScrollableRegion(non_fast_scrollable_region_); | 500 layer->SetNonFastScrollableRegion(non_fast_scrollable_region_); |
491 layer->SetTouchEventHandlerRegion(touch_event_handler_region_); | 501 layer->SetTouchEventHandlerRegion(touch_event_handler_region_); |
492 layer->SetContentsOpaque(contents_opaque_); | 502 layer->SetContentsOpaque(contents_opaque_); |
493 layer->SetOpacity(opacity_); | 503 layer->SetOpacity(opacity_); |
494 layer->SetBlendMode(blend_mode_); | 504 layer->SetBlendMode(blend_mode_); |
495 layer->SetIsRootForIsolatedGroup(is_root_for_isolated_group_); | 505 layer->SetIsRootForIsolatedGroup(is_root_for_isolated_group_); |
496 layer->SetPosition(position_); | 506 layer->SetPosition(position_); |
497 layer->SetIsContainerForFixedPositionLayers( | 507 layer->SetIsContainerForFixedPositionLayers( |
498 is_container_for_fixed_position_layers_); | 508 is_container_for_fixed_position_layers_); |
499 layer->SetPositionConstraint(position_constraint_); | 509 layer->SetPositionConstraint(position_constraint_); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 | 652 |
643 if (have_wheel_event_handlers_) | 653 if (have_wheel_event_handlers_) |
644 result->SetBoolean("WheelHandler", have_wheel_event_handlers_); | 654 result->SetBoolean("WheelHandler", have_wheel_event_handlers_); |
645 if (have_scroll_event_handlers_) | 655 if (have_scroll_event_handlers_) |
646 result->SetBoolean("ScrollHandler", have_scroll_event_handlers_); | 656 result->SetBoolean("ScrollHandler", have_scroll_event_handlers_); |
647 if (!touch_event_handler_region_.IsEmpty()) { | 657 if (!touch_event_handler_region_.IsEmpty()) { |
648 scoped_ptr<base::Value> region = touch_event_handler_region_.AsValue(); | 658 scoped_ptr<base::Value> region = touch_event_handler_region_.AsValue(); |
649 result->Set("TouchRegion", region.release()); | 659 result->Set("TouchRegion", region.release()); |
650 } | 660 } |
651 | 661 |
| 662 if (scroll_blocks_on_) { |
| 663 list = new base::ListValue; |
| 664 if (scroll_blocks_on_ & ScrollBlocksOnStartTouch) |
| 665 list->AppendString("StartTouch"); |
| 666 if (scroll_blocks_on_ & ScrollBlocksOnWheelEvent) |
| 667 list->AppendString("WheelEvent"); |
| 668 if (scroll_blocks_on_ & ScrollBlocksOnScrollEvent) |
| 669 list->AppendString("ScrollEvent"); |
| 670 result->Set("ScrollBlocksOn", list); |
| 671 } |
| 672 |
652 list = new base::ListValue; | 673 list = new base::ListValue; |
653 for (size_t i = 0; i < children_.size(); ++i) | 674 for (size_t i = 0; i < children_.size(); ++i) |
654 list->Append(children_[i]->LayerTreeAsJson()); | 675 list->Append(children_[i]->LayerTreeAsJson()); |
655 result->Set("Children", list); | 676 result->Set("Children", list); |
656 | 677 |
657 return result; | 678 return result; |
658 } | 679 } |
659 | 680 |
660 void LayerImpl::SetStackingOrderChanged(bool stacking_order_changed) { | 681 void LayerImpl::SetStackingOrderChanged(bool stacking_order_changed) { |
661 if (stacking_order_changed) { | 682 if (stacking_order_changed) { |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1073 DCHECK(IsActive()); | 1094 DCHECK(IsActive()); |
1074 if (scroll_offset_->SetCurrent(scroll_offset)) | 1095 if (scroll_offset_->SetCurrent(scroll_offset)) |
1075 DidUpdateScrollOffset(); | 1096 DidUpdateScrollOffset(); |
1076 } | 1097 } |
1077 | 1098 |
1078 void LayerImpl::PushScrollOffsetFromMainThread( | 1099 void LayerImpl::PushScrollOffsetFromMainThread( |
1079 const gfx::ScrollOffset& scroll_offset) { | 1100 const gfx::ScrollOffset& scroll_offset) { |
1080 PushScrollOffset(&scroll_offset); | 1101 PushScrollOffset(&scroll_offset); |
1081 } | 1102 } |
1082 | 1103 |
| 1104 void LayerImpl::PushScrollOffsetFromMainThreadAndClobberActiveValue( |
| 1105 const gfx::ScrollOffset& scroll_offset) { |
| 1106 scroll_offset_->set_clobber_active_value(); |
| 1107 PushScrollOffset(&scroll_offset); |
| 1108 } |
| 1109 |
1083 gfx::ScrollOffset LayerImpl::PullDeltaForMainThread() { | 1110 gfx::ScrollOffset LayerImpl::PullDeltaForMainThread() { |
1084 RefreshFromScrollDelegate(); | 1111 RefreshFromScrollDelegate(); |
1085 | 1112 return scroll_offset_->PullDeltaForMainThread(); |
1086 // TODO(aelias, miletus): Remove all this temporary flooring machinery when | |
1087 // Blink fully supports fractional scrolls. | |
1088 gfx::ScrollOffset current_offset = CurrentScrollOffset(); | |
1089 gfx::Vector2dF current_delta = ScrollDelta(); | |
1090 gfx::Vector2dF floored_delta(floor(current_delta.x()), | |
1091 floor(current_delta.y())); | |
1092 gfx::Vector2dF diff_delta = floored_delta - current_delta; | |
1093 gfx::ScrollOffset tmp_offset = ScrollOffsetWithDelta(current_offset, | |
1094 diff_delta); | |
1095 scroll_offset_->SetCurrent(tmp_offset); | |
1096 gfx::ScrollOffset delta = scroll_offset_->PullDeltaForMainThread(); | |
1097 scroll_offset_->SetCurrent(current_offset); | |
1098 return delta; | |
1099 } | 1113 } |
1100 | 1114 |
1101 void LayerImpl::RefreshFromScrollDelegate() { | 1115 void LayerImpl::RefreshFromScrollDelegate() { |
1102 if (scroll_offset_delegate_) { | 1116 if (scroll_offset_delegate_) { |
1103 SetCurrentScrollOffset( | 1117 SetCurrentScrollOffset( |
1104 gfx::ScrollOffset(scroll_offset_delegate_->GetCurrentScrollOffset())); | 1118 gfx::ScrollOffset(scroll_offset_delegate_->GetCurrentScrollOffset())); |
1105 } | 1119 } |
1106 } | 1120 } |
1107 | 1121 |
1108 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const { | 1122 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const { |
(...skipping 24 matching lines...) Expand all Loading... |
1133 | 1147 |
1134 void LayerImpl::PushScrollOffset(const gfx::ScrollOffset* scroll_offset) { | 1148 void LayerImpl::PushScrollOffset(const gfx::ScrollOffset* scroll_offset) { |
1135 DCHECK(scroll_offset || IsActive()); | 1149 DCHECK(scroll_offset || IsActive()); |
1136 bool changed = false; | 1150 bool changed = false; |
1137 if (scroll_offset) { | 1151 if (scroll_offset) { |
1138 DCHECK(!IsActive() || !layer_tree_impl_->FindPendingTreeLayerById(id())); | 1152 DCHECK(!IsActive() || !layer_tree_impl_->FindPendingTreeLayerById(id())); |
1139 changed |= scroll_offset_->PushFromMainThread(*scroll_offset); | 1153 changed |= scroll_offset_->PushFromMainThread(*scroll_offset); |
1140 } | 1154 } |
1141 if (IsActive()) { | 1155 if (IsActive()) { |
1142 changed |= scroll_offset_->PushPendingToActive(); | 1156 changed |= scroll_offset_->PushPendingToActive(); |
1143 if (layer_animation_controller_->scroll_offset_animation_was_interrupted()) | |
1144 SetScrollDelta(gfx::Vector2dF()); | |
1145 } | 1157 } |
1146 | 1158 |
1147 if (changed) | 1159 if (changed) |
1148 DidUpdateScrollOffset(); | 1160 DidUpdateScrollOffset(); |
1149 } | 1161 } |
1150 | 1162 |
1151 void LayerImpl::DidUpdateScrollOffset() { | 1163 void LayerImpl::DidUpdateScrollOffset() { |
1152 if (scroll_offset_delegate_) { | 1164 if (scroll_offset_delegate_) { |
1153 scroll_offset_delegate_->SetCurrentScrollOffset(CurrentScrollOffset()); | 1165 scroll_offset_delegate_->SetCurrentScrollOffset(CurrentScrollOffset()); |
1154 scroll_offset_delegate_->Update(); | 1166 scroll_offset_delegate_->Update(); |
(...skipping 15 matching lines...) Expand all Loading... |
1170 SimpleEnclosedRegion LayerImpl::VisibleContentOpaqueRegion() const { | 1182 SimpleEnclosedRegion LayerImpl::VisibleContentOpaqueRegion() const { |
1171 if (contents_opaque()) | 1183 if (contents_opaque()) |
1172 return SimpleEnclosedRegion(visible_content_rect()); | 1184 return SimpleEnclosedRegion(visible_content_rect()); |
1173 return SimpleEnclosedRegion(); | 1185 return SimpleEnclosedRegion(); |
1174 } | 1186 } |
1175 | 1187 |
1176 void LayerImpl::DidBeginTracing() {} | 1188 void LayerImpl::DidBeginTracing() {} |
1177 | 1189 |
1178 void LayerImpl::ReleaseResources() {} | 1190 void LayerImpl::ReleaseResources() {} |
1179 | 1191 |
| 1192 void LayerImpl::RecreateResources() { |
| 1193 } |
| 1194 |
1180 gfx::ScrollOffset LayerImpl::MaxScrollOffset() const { | 1195 gfx::ScrollOffset LayerImpl::MaxScrollOffset() const { |
1181 if (!scroll_clip_layer_ || bounds().IsEmpty()) | 1196 if (!scroll_clip_layer_ || bounds().IsEmpty()) |
1182 return gfx::ScrollOffset(); | 1197 return gfx::ScrollOffset(); |
1183 | 1198 |
1184 LayerImpl const* page_scale_layer = layer_tree_impl()->page_scale_layer(); | 1199 LayerImpl const* page_scale_layer = layer_tree_impl()->page_scale_layer(); |
1185 DCHECK(this != page_scale_layer); | 1200 DCHECK(this != page_scale_layer); |
1186 DCHECK(this != layer_tree_impl()->InnerViewportScrollLayer() || | 1201 DCHECK(this != layer_tree_impl()->InnerViewportScrollLayer() || |
1187 IsContainerForFixedPositionLayers()); | 1202 IsContainerForFixedPositionLayers()); |
1188 | 1203 |
1189 float scale_factor = 1.f; | 1204 float scale_factor = 1.f; |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1433 Region scroll_region(scroll_rect); | 1448 Region scroll_region(scroll_rect); |
1434 state->BeginArray("scroll_event_handler_region"); | 1449 state->BeginArray("scroll_event_handler_region"); |
1435 scroll_region.AsValueInto(state); | 1450 scroll_region.AsValueInto(state); |
1436 state->EndArray(); | 1451 state->EndArray(); |
1437 } | 1452 } |
1438 if (!non_fast_scrollable_region_.IsEmpty()) { | 1453 if (!non_fast_scrollable_region_.IsEmpty()) { |
1439 state->BeginArray("non_fast_scrollable_region"); | 1454 state->BeginArray("non_fast_scrollable_region"); |
1440 non_fast_scrollable_region_.AsValueInto(state); | 1455 non_fast_scrollable_region_.AsValueInto(state); |
1441 state->EndArray(); | 1456 state->EndArray(); |
1442 } | 1457 } |
| 1458 if (scroll_blocks_on_) { |
| 1459 state->SetInteger("scroll_blocks_on", scroll_blocks_on_); |
| 1460 } |
1443 | 1461 |
1444 state->BeginArray("children"); | 1462 state->BeginArray("children"); |
1445 for (size_t i = 0; i < children_.size(); ++i) { | 1463 for (size_t i = 0; i < children_.size(); ++i) { |
1446 state->BeginDictionary(); | 1464 state->BeginDictionary(); |
1447 children_[i]->AsValueInto(state); | 1465 children_[i]->AsValueInto(state); |
1448 state->EndDictionary(); | 1466 state->EndDictionary(); |
1449 } | 1467 } |
1450 state->EndArray(); | 1468 state->EndArray(); |
1451 if (mask_layer_) { | 1469 if (mask_layer_) { |
1452 state->BeginDictionary("mask_layer"); | 1470 state->BeginDictionary("mask_layer"); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1538 SetNeedsPushProperties(); | 1556 SetNeedsPushProperties(); |
1539 layer_tree_impl()->set_needs_update_draw_properties(); | 1557 layer_tree_impl()->set_needs_update_draw_properties(); |
1540 if (should_have_render_surface) { | 1558 if (should_have_render_surface) { |
1541 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this)); | 1559 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this)); |
1542 return; | 1560 return; |
1543 } | 1561 } |
1544 render_surface_.reset(); | 1562 render_surface_.reset(); |
1545 } | 1563 } |
1546 | 1564 |
1547 } // namespace cc | 1565 } // namespace cc |
OLD | NEW |