OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 return layer_impl != NULL; | 584 return layer_impl != NULL; |
585 } | 585 } |
586 | 586 |
587 static LayerImpl* NextLayerInScrollOrder(LayerImpl* layer) { | 587 static LayerImpl* NextLayerInScrollOrder(LayerImpl* layer) { |
588 if (layer->scroll_parent()) | 588 if (layer->scroll_parent()) |
589 return layer->scroll_parent(); | 589 return layer->scroll_parent(); |
590 | 590 |
591 return layer->parent(); | 591 return layer->parent(); |
592 } | 592 } |
593 | 593 |
594 static ScrollBlocksOn EffectiveScrollBlocksOn(LayerImpl* layer) { | |
595 ScrollBlocksOn blocks = SCROLL_BLOCKS_ON_NONE; | |
596 for (; layer; layer = NextLayerInScrollOrder(layer)) { | |
597 blocks |= layer->scroll_blocks_on(); | |
598 } | |
599 return blocks; | |
600 } | |
601 | |
602 bool LayerTreeHostImpl::DoTouchEventsBlockScrollAt( | 594 bool LayerTreeHostImpl::DoTouchEventsBlockScrollAt( |
603 const gfx::Point& viewport_point) { | 595 const gfx::Point& viewport_point) { |
604 gfx::PointF device_viewport_point = gfx::ScalePoint( | 596 gfx::PointF device_viewport_point = gfx::ScalePoint( |
605 gfx::PointF(viewport_point), active_tree_->device_scale_factor()); | 597 gfx::PointF(viewport_point), active_tree_->device_scale_factor()); |
606 | 598 |
607 // First check if scrolling at this point is required to block on any | |
608 // touch event handlers. Note that we must start at the innermost layer | |
609 // (as opposed to only the layer found to contain a touch handler region | |
610 // below) to ensure all relevant scroll-blocks-on values are applied. | |
611 LayerImpl* layer_impl = | |
612 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point); | |
613 ScrollBlocksOn blocking = EffectiveScrollBlocksOn(layer_impl); | |
614 if (!(blocking & SCROLL_BLOCKS_ON_START_TOUCH)) | |
615 return false; | |
616 | |
617 // Now determine if there are actually any handlers at that point. | 599 // Now determine if there are actually any handlers at that point. |
618 // TODO(rbyers): Consider also honoring touch-action (crbug.com/347272). | 600 // TODO(rbyers): Consider also honoring touch-action (crbug.com/347272). |
619 layer_impl = active_tree_->FindLayerThatIsHitByPointInTouchHandlerRegion( | 601 LayerImpl* layer_impl = |
620 device_viewport_point); | 602 active_tree_->FindLayerThatIsHitByPointInTouchHandlerRegion( |
| 603 device_viewport_point); |
621 return layer_impl != NULL; | 604 return layer_impl != NULL; |
622 } | 605 } |
623 | 606 |
624 scoped_ptr<SwapPromiseMonitor> | 607 scoped_ptr<SwapPromiseMonitor> |
625 LayerTreeHostImpl::CreateLatencyInfoSwapPromiseMonitor( | 608 LayerTreeHostImpl::CreateLatencyInfoSwapPromiseMonitor( |
626 ui::LatencyInfo* latency) { | 609 ui::LatencyInfo* latency) { |
627 return make_scoped_ptr( | 610 return make_scoped_ptr( |
628 new LatencyInfoSwapPromiseMonitor(latency, NULL, this)); | 611 new LatencyInfoSwapPromiseMonitor(latency, NULL, this)); |
629 } | 612 } |
630 | 613 |
(...skipping 1852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2483 InputHandler::ScrollInputType type, | 2466 InputHandler::ScrollInputType type, |
2484 LayerImpl* layer_impl, | 2467 LayerImpl* layer_impl, |
2485 bool* scroll_on_main_thread, | 2468 bool* scroll_on_main_thread, |
2486 bool* optional_has_ancestor_scroll_handler, | 2469 bool* optional_has_ancestor_scroll_handler, |
2487 uint32_t* main_thread_scrolling_reasons) const { | 2470 uint32_t* main_thread_scrolling_reasons) const { |
2488 DCHECK(scroll_on_main_thread); | 2471 DCHECK(scroll_on_main_thread); |
2489 DCHECK(main_thread_scrolling_reasons); | 2472 DCHECK(main_thread_scrolling_reasons); |
2490 *main_thread_scrolling_reasons = | 2473 *main_thread_scrolling_reasons = |
2491 MainThreadScrollingReason::kNotScrollingOnMain; | 2474 MainThreadScrollingReason::kNotScrollingOnMain; |
2492 | 2475 |
2493 ScrollBlocksOn block_mode = EffectiveScrollBlocksOn(layer_impl); | |
2494 | |
2495 // Walk up the hierarchy and look for a scrollable layer. | 2476 // Walk up the hierarchy and look for a scrollable layer. |
2496 LayerImpl* potentially_scrolling_layer_impl = NULL; | 2477 LayerImpl* potentially_scrolling_layer_impl = NULL; |
2497 for (; layer_impl; layer_impl = NextLayerInScrollOrder(layer_impl)) { | 2478 for (; layer_impl; layer_impl = NextLayerInScrollOrder(layer_impl)) { |
2498 // The content layer can also block attempts to scroll outside the main | 2479 // The content layer can also block attempts to scroll outside the main |
2499 // thread. | 2480 // thread. |
2500 ScrollStatus status = | 2481 ScrollStatus status = layer_impl->TryScroll(device_viewport_point, type); |
2501 layer_impl->TryScroll(device_viewport_point, type, block_mode); | |
2502 if (status.thread == SCROLL_ON_MAIN_THREAD) { | 2482 if (status.thread == SCROLL_ON_MAIN_THREAD) { |
2503 if (layer_impl->should_scroll_on_main_thread()) { | 2483 if (layer_impl->should_scroll_on_main_thread()) { |
2504 DCHECK_LE(status.main_thread_scrolling_reasons, | 2484 DCHECK_LE(status.main_thread_scrolling_reasons, |
2505 MainThreadScrollingReason::kMaxNonTransientScrollingReasons); | 2485 MainThreadScrollingReason::kMaxNonTransientScrollingReasons); |
2506 } else { | 2486 } else { |
2507 DCHECK_GT(status.main_thread_scrolling_reasons, | 2487 DCHECK_GT(status.main_thread_scrolling_reasons, |
2508 MainThreadScrollingReason::kMaxNonTransientScrollingReasons); | 2488 MainThreadScrollingReason::kMaxNonTransientScrollingReasons); |
2509 } | 2489 } |
2510 | 2490 |
2511 *scroll_on_main_thread = true; | 2491 *scroll_on_main_thread = true; |
2512 *main_thread_scrolling_reasons = status.main_thread_scrolling_reasons; | 2492 *main_thread_scrolling_reasons = status.main_thread_scrolling_reasons; |
2513 return NULL; | 2493 return NULL; |
2514 } | 2494 } |
2515 | 2495 |
2516 LayerImpl* scroll_layer_impl = FindScrollLayerForContentLayer(layer_impl); | 2496 LayerImpl* scroll_layer_impl = FindScrollLayerForContentLayer(layer_impl); |
2517 if (!scroll_layer_impl) | 2497 if (!scroll_layer_impl) |
2518 continue; | 2498 continue; |
2519 | 2499 |
2520 status = | 2500 status = scroll_layer_impl->TryScroll(device_viewport_point, type); |
2521 scroll_layer_impl->TryScroll(device_viewport_point, type, block_mode); | |
2522 | 2501 |
2523 // If any layer wants to divert the scroll event to the main thread, abort. | 2502 // If any layer wants to divert the scroll event to the main thread, abort. |
2524 if (status.thread == SCROLL_ON_MAIN_THREAD) { | 2503 if (status.thread == SCROLL_ON_MAIN_THREAD) { |
2525 if (layer_impl->should_scroll_on_main_thread()) { | 2504 if (layer_impl->should_scroll_on_main_thread()) { |
2526 DCHECK_LE(status.main_thread_scrolling_reasons, | 2505 DCHECK_LE(status.main_thread_scrolling_reasons, |
2527 MainThreadScrollingReason::kMaxNonTransientScrollingReasons); | 2506 MainThreadScrollingReason::kMaxNonTransientScrollingReasons); |
2528 } else { | 2507 } else { |
2529 DCHECK_GT(status.main_thread_scrolling_reasons, | 2508 DCHECK_GT(status.main_thread_scrolling_reasons, |
2530 MainThreadScrollingReason::kMaxNonTransientScrollingReasons); | 2509 MainThreadScrollingReason::kMaxNonTransientScrollingReasons); |
2531 } | 2510 } |
(...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3920 return task_runner_provider_->HasImplThread(); | 3899 return task_runner_provider_->HasImplThread(); |
3921 } | 3900 } |
3922 | 3901 |
3923 bool LayerTreeHostImpl::CommitToActiveTree() const { | 3902 bool LayerTreeHostImpl::CommitToActiveTree() const { |
3924 // In single threaded mode we skip the pending tree and commit directly to the | 3903 // In single threaded mode we skip the pending tree and commit directly to the |
3925 // active tree. | 3904 // active tree. |
3926 return !task_runner_provider_->HasImplThread(); | 3905 return !task_runner_provider_->HasImplThread(); |
3927 } | 3906 } |
3928 | 3907 |
3929 } // namespace cc | 3908 } // namespace cc |
OLD | NEW |