| 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/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include "base/location.h" | 7 #include "base/location.h" |
| 8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
| 9 #include "base/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" |
| 10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
| (...skipping 1495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1506 | 1506 |
| 1507 TEST_F(LayerTreeHostScrollTestLayerStructureChange, ScrollDestroyLayer) { | 1507 TEST_F(LayerTreeHostScrollTestLayerStructureChange, ScrollDestroyLayer) { |
| 1508 RunTest(CompositorMode::THREADED, false); | 1508 RunTest(CompositorMode::THREADED, false); |
| 1509 } | 1509 } |
| 1510 | 1510 |
| 1511 TEST_F(LayerTreeHostScrollTestLayerStructureChange, ScrollDestroyWholeTree) { | 1511 TEST_F(LayerTreeHostScrollTestLayerStructureChange, ScrollDestroyWholeTree) { |
| 1512 scroll_destroy_whole_tree_ = true; | 1512 scroll_destroy_whole_tree_ = true; |
| 1513 RunTest(CompositorMode::THREADED, false); | 1513 RunTest(CompositorMode::THREADED, false); |
| 1514 } | 1514 } |
| 1515 | 1515 |
| 1516 class LayerTreeHostScrollTestScrollMFBA : public LayerTreeHostScrollTest { |
| 1517 public: |
| 1518 LayerTreeHostScrollTestScrollMFBA() |
| 1519 : initial_scroll_(10, 20), |
| 1520 second_scroll_(40, 5), |
| 1521 third_scroll_(20, 10), |
| 1522 scroll_amount_(2, -1), |
| 1523 num_commits_(0), |
| 1524 num_scrolls_(0) {} |
| 1525 |
| 1526 void InitializeSettings(LayerTreeSettings* settings) override { |
| 1527 settings->main_frame_before_activation_enabled = true; |
| 1528 } |
| 1529 |
| 1530 void BeginTest() override { |
| 1531 outer_viewport_container_layer_id_ = layer_tree_host() |
| 1532 ->outer_viewport_scroll_layer() |
| 1533 ->scroll_clip_layer() |
| 1534 ->id(); |
| 1535 layer_tree_host()->outer_viewport_scroll_layer()->SetScrollOffset( |
| 1536 initial_scroll_); |
| 1537 PostSetNeedsCommitToMainThread(); |
| 1538 } |
| 1539 |
| 1540 void StartCommitOnImpl() override { |
| 1541 switch (num_commits_) { |
| 1542 case 1: |
| 1543 // Ask for commit here because activation (and draw) will be blocked. |
| 1544 GetProxyImplForTest()->SetNeedsCommitOnImpl(); |
| 1545 // Block activation after second commit until third commit is ready. |
| 1546 GetProxyImplForTest()->BlockNotifyReadyToActivateForTesting(true); |
| 1547 break; |
| 1548 case 2: |
| 1549 // Unblock activation after third commit is ready. |
| 1550 GetProxyImplForTest()->BlockNotifyReadyToActivateForTesting(false); |
| 1551 break; |
| 1552 } |
| 1553 num_commits_++; |
| 1554 } |
| 1555 |
| 1556 void UpdateLayerTreeHost() override { |
| 1557 Layer* scroll_layer = layer_tree_host()->outer_viewport_scroll_layer(); |
| 1558 switch (layer_tree_host()->source_frame_number()) { |
| 1559 case 0: |
| 1560 EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->scroll_offset()); |
| 1561 break; |
| 1562 case 1: |
| 1563 EXPECT_VECTOR_EQ( |
| 1564 gfx::ScrollOffsetWithDelta(initial_scroll_, scroll_amount_), |
| 1565 scroll_layer->scroll_offset()); |
| 1566 // Pretend like Javascript updated the scroll position itself. |
| 1567 scroll_layer->SetScrollOffset(second_scroll_); |
| 1568 break; |
| 1569 case 2: |
| 1570 // Third frame does not see a scroll delta because we only did one |
| 1571 // scroll for the second and third frames. |
| 1572 EXPECT_VECTOR_EQ(second_scroll_, scroll_layer->scroll_offset()); |
| 1573 // Pretend like Javascript updated the scroll position itself. |
| 1574 scroll_layer->SetScrollOffset(third_scroll_); |
| 1575 break; |
| 1576 } |
| 1577 } |
| 1578 |
| 1579 void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
| 1580 LayerImpl* scroll_layer = impl->OuterViewportScrollLayer(); |
| 1581 switch (impl->active_tree()->source_frame_number()) { |
| 1582 case 0: |
| 1583 EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(scroll_layer)); |
| 1584 EXPECT_VECTOR_EQ(initial_scroll_, ScrollTreeForLayer(scroll_layer) |
| 1585 ->GetScrollOffsetBaseForTesting( |
| 1586 scroll_layer->id())); |
| 1587 Scroll(impl); |
| 1588 EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer)); |
| 1589 // Ask for commit after we've scrolled. |
| 1590 impl->SetNeedsCommit(); |
| 1591 break; |
| 1592 case 1: |
| 1593 EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(scroll_layer)); |
| 1594 EXPECT_VECTOR_EQ(second_scroll_, ScrollTreeForLayer(scroll_layer) |
| 1595 ->GetScrollOffsetBaseForTesting( |
| 1596 scroll_layer->id())); |
| 1597 Scroll(impl); |
| 1598 EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer)); |
| 1599 break; |
| 1600 case 2: |
| 1601 // The scroll hasn't been consumed by the main thread. |
| 1602 EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer)); |
| 1603 EXPECT_VECTOR_EQ(third_scroll_, ScrollTreeForLayer(scroll_layer) |
| 1604 ->GetScrollOffsetBaseForTesting( |
| 1605 scroll_layer->id())); |
| 1606 EndTest(); |
| 1607 break; |
| 1608 } |
| 1609 } |
| 1610 |
| 1611 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta, |
| 1612 const gfx::Vector2dF& outer_delta, |
| 1613 const gfx::Vector2dF& elastic_overscroll_delta, |
| 1614 float scale, |
| 1615 float top_controls_delta) override { |
| 1616 num_scrolls_++; |
| 1617 } |
| 1618 |
| 1619 void AfterTest() override { |
| 1620 EXPECT_EQ(3, num_commits_); |
| 1621 EXPECT_EQ(1, num_scrolls_); |
| 1622 } |
| 1623 |
| 1624 private: |
| 1625 void Scroll(LayerTreeHostImpl* impl) { |
| 1626 LayerImpl* root = impl->active_tree()->root_layer(); |
| 1627 LayerImpl* scroll_layer = impl->OuterViewportScrollLayer(); |
| 1628 |
| 1629 scroll_layer->SetScrollClipLayer(outer_viewport_container_layer_id_); |
| 1630 scroll_layer->SetBounds( |
| 1631 gfx::Size(root->bounds().width() + 100, root->bounds().height() + 100)); |
| 1632 scroll_layer->ScrollBy(scroll_amount_); |
| 1633 } |
| 1634 |
| 1635 gfx::ScrollOffset initial_scroll_; |
| 1636 gfx::ScrollOffset second_scroll_; |
| 1637 gfx::ScrollOffset third_scroll_; |
| 1638 gfx::Vector2dF scroll_amount_; |
| 1639 int num_commits_; |
| 1640 int num_scrolls_; |
| 1641 int outer_viewport_container_layer_id_; |
| 1642 }; |
| 1643 |
| 1644 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollMFBA); |
| 1645 |
| 1646 class LayerTreeHostScrollTestScrollAbortedCommitMFBA |
| 1647 : public LayerTreeHostScrollTest { |
| 1648 public: |
| 1649 LayerTreeHostScrollTestScrollAbortedCommitMFBA() |
| 1650 : initial_scroll_(50, 60), |
| 1651 impl_scroll_(-3, 2), |
| 1652 second_main_scroll_(14, -3), |
| 1653 num_will_begin_main_frames_(0), |
| 1654 num_did_begin_main_frames_(0), |
| 1655 num_will_commits_(0), |
| 1656 num_did_commits_(0), |
| 1657 num_impl_commits_(0), |
| 1658 num_aborted_commits_(0), |
| 1659 num_impl_scrolls_(0), |
| 1660 num_draws_(0) {} |
| 1661 |
| 1662 void InitializeSettings(LayerTreeSettings* settings) override { |
| 1663 settings->main_frame_before_activation_enabled = true; |
| 1664 } |
| 1665 |
| 1666 void BeginTest() override { |
| 1667 layer_tree_host()->outer_viewport_scroll_layer()->SetScrollOffset( |
| 1668 initial_scroll_); |
| 1669 PostSetNeedsCommitToMainThread(); |
| 1670 } |
| 1671 |
| 1672 void SetupTree() override { |
| 1673 LayerTreeHostScrollTest::SetupTree(); |
| 1674 |
| 1675 gfx::Size scroll_layer_bounds(200, 200); |
| 1676 layer_tree_host()->outer_viewport_scroll_layer()->SetBounds( |
| 1677 scroll_layer_bounds); |
| 1678 layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f); |
| 1679 } |
| 1680 |
| 1681 void WillBeginMainFrame() override { |
| 1682 num_will_begin_main_frames_++; |
| 1683 Layer* root_scroll_layer = layer_tree_host()->outer_viewport_scroll_layer(); |
| 1684 switch (num_will_begin_main_frames_) { |
| 1685 case 1: |
| 1686 // This will not be aborted because of the initial prop changes. |
| 1687 EXPECT_EQ(0, num_impl_scrolls_); |
| 1688 EXPECT_EQ(0, layer_tree_host()->source_frame_number()); |
| 1689 EXPECT_VECTOR_EQ(initial_scroll_, root_scroll_layer->scroll_offset()); |
| 1690 break; |
| 1691 case 2: |
| 1692 // This commit will not be aborted because of the scroll change. |
| 1693 EXPECT_EQ(1, num_impl_scrolls_); |
| 1694 EXPECT_EQ(1, layer_tree_host()->source_frame_number()); |
| 1695 EXPECT_VECTOR_EQ( |
| 1696 gfx::ScrollOffsetWithDelta(initial_scroll_, impl_scroll_), |
| 1697 root_scroll_layer->scroll_offset()); |
| 1698 root_scroll_layer->SetScrollOffset(gfx::ScrollOffsetWithDelta( |
| 1699 root_scroll_layer->scroll_offset(), second_main_scroll_)); |
| 1700 break; |
| 1701 case 3: { |
| 1702 // This commit will be aborted. |
| 1703 EXPECT_EQ(2, num_impl_scrolls_); |
| 1704 // The source frame number still increases even with the abort. |
| 1705 EXPECT_EQ(2, layer_tree_host()->source_frame_number()); |
| 1706 gfx::Vector2dF delta = |
| 1707 impl_scroll_ + impl_scroll_ + second_main_scroll_; |
| 1708 EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(initial_scroll_, delta), |
| 1709 root_scroll_layer->scroll_offset()); |
| 1710 break; |
| 1711 } |
| 1712 case 4: { |
| 1713 // This commit will also be aborted. |
| 1714 EXPECT_EQ(3, num_impl_scrolls_); |
| 1715 EXPECT_EQ(3, layer_tree_host()->source_frame_number()); |
| 1716 gfx::Vector2dF delta = |
| 1717 impl_scroll_ + impl_scroll_ + impl_scroll_ + second_main_scroll_; |
| 1718 EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(initial_scroll_, delta), |
| 1719 root_scroll_layer->scroll_offset()); |
| 1720 break; |
| 1721 } |
| 1722 } |
| 1723 } |
| 1724 |
| 1725 void DidBeginMainFrame() override { num_did_begin_main_frames_++; } |
| 1726 |
| 1727 void WillCommit() override { num_will_commits_++; } |
| 1728 |
| 1729 void DidCommit() override { num_did_commits_++; } |
| 1730 |
| 1731 void BeginCommitOnThread(LayerTreeHostImpl* impl) override { |
| 1732 switch (num_impl_commits_) { |
| 1733 case 1: |
| 1734 // Redraw so that we keep scrolling. |
| 1735 impl->SetNeedsRedraw(); |
| 1736 // Block activation until third commit is aborted. |
| 1737 impl->BlockNotifyReadyToActivateForTesting(true); |
| 1738 break; |
| 1739 } |
| 1740 num_impl_commits_++; |
| 1741 } |
| 1742 |
| 1743 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* impl, |
| 1744 CommitEarlyOutReason reason) override { |
| 1745 switch (num_aborted_commits_) { |
| 1746 case 0: |
| 1747 EXPECT_EQ(2, num_impl_commits_); |
| 1748 // Unblock activation when third commit is aborted. |
| 1749 impl->BlockNotifyReadyToActivateForTesting(false); |
| 1750 break; |
| 1751 case 1: |
| 1752 EXPECT_EQ(2, num_impl_commits_); |
| 1753 // Redraw to end the test. |
| 1754 impl->SetNeedsRedraw(); |
| 1755 break; |
| 1756 } |
| 1757 num_aborted_commits_++; |
| 1758 } |
| 1759 |
| 1760 void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
| 1761 LayerImpl* root_scroll_layer = impl->OuterViewportScrollLayer(); |
| 1762 switch (impl->active_tree()->source_frame_number()) { |
| 1763 case 0: { |
| 1764 switch (num_impl_commits_) { |
| 1765 case 1: { |
| 1766 // First draw |
| 1767 EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(root_scroll_layer)); |
| 1768 root_scroll_layer->ScrollBy(impl_scroll_); |
| 1769 EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer)); |
| 1770 EXPECT_VECTOR_EQ( |
| 1771 initial_scroll_, |
| 1772 ScrollTreeForLayer(root_scroll_layer) |
| 1773 ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); |
| 1774 impl->SetNeedsCommit(); |
| 1775 break; |
| 1776 } |
| 1777 case 2: { |
| 1778 // Second draw but no new active tree because activation is blocked. |
| 1779 EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer)); |
| 1780 root_scroll_layer->ScrollBy(impl_scroll_); |
| 1781 EXPECT_VECTOR_EQ(impl_scroll_ + impl_scroll_, |
| 1782 ScrollDelta(root_scroll_layer)); |
| 1783 EXPECT_VECTOR_EQ( |
| 1784 initial_scroll_, |
| 1785 ScrollTreeForLayer(root_scroll_layer) |
| 1786 ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); |
| 1787 // Ask for another commit (which will abort). |
| 1788 impl->SetNeedsCommit(); |
| 1789 break; |
| 1790 } |
| 1791 default: |
| 1792 NOTREACHED(); |
| 1793 } |
| 1794 break; |
| 1795 } |
| 1796 case 1: { |
| 1797 EXPECT_EQ(2, num_impl_commits_); |
| 1798 // All scroll deltas so far should be consumed. |
| 1799 EXPECT_EQ(gfx::Vector2d(), ScrollDelta(root_scroll_layer)); |
| 1800 switch (num_aborted_commits_) { |
| 1801 case 1: { |
| 1802 root_scroll_layer->ScrollBy(impl_scroll_); |
| 1803 EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer)); |
| 1804 gfx::Vector2dF prev_delta = |
| 1805 impl_scroll_ + impl_scroll_ + second_main_scroll_; |
| 1806 EXPECT_VECTOR_EQ( |
| 1807 gfx::ScrollOffsetWithDelta(initial_scroll_, prev_delta), |
| 1808 ScrollTreeForLayer(root_scroll_layer) |
| 1809 ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); |
| 1810 // Ask for another commit (which will abort). |
| 1811 impl->SetNeedsCommit(); |
| 1812 break; |
| 1813 } |
| 1814 case 2: { |
| 1815 gfx::Vector2dF delta = impl_scroll_ + impl_scroll_ + impl_scroll_ + |
| 1816 second_main_scroll_; |
| 1817 EXPECT_VECTOR_EQ( |
| 1818 gfx::ScrollOffsetWithDelta(initial_scroll_, delta), |
| 1819 ScrollTreeForLayer(root_scroll_layer) |
| 1820 ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); |
| 1821 // End test after second aborted commit (fourth commit request). |
| 1822 EndTest(); |
| 1823 break; |
| 1824 } |
| 1825 } |
| 1826 break; |
| 1827 } |
| 1828 } |
| 1829 num_draws_++; |
| 1830 } |
| 1831 |
| 1832 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta, |
| 1833 const gfx::Vector2dF& outer_delta, |
| 1834 const gfx::Vector2dF& elastic_overscroll_delta, |
| 1835 float scale, |
| 1836 float top_controls_delta) override { |
| 1837 num_impl_scrolls_++; |
| 1838 } |
| 1839 |
| 1840 void AfterTest() override { |
| 1841 EXPECT_EQ(3, num_impl_scrolls_); |
| 1842 // Verify that the embedder sees aborted commits as real commits. |
| 1843 EXPECT_EQ(4, num_will_begin_main_frames_); |
| 1844 EXPECT_EQ(4, num_did_begin_main_frames_); |
| 1845 EXPECT_EQ(4, num_will_commits_); |
| 1846 EXPECT_EQ(4, num_did_commits_); |
| 1847 // ...but the compositor thread only sees two real ones. |
| 1848 EXPECT_EQ(2, num_impl_commits_); |
| 1849 // ...and two aborted ones. |
| 1850 EXPECT_EQ(2, num_aborted_commits_); |
| 1851 // ...and four draws. |
| 1852 EXPECT_EQ(4, num_draws_); |
| 1853 } |
| 1854 |
| 1855 private: |
| 1856 gfx::ScrollOffset initial_scroll_; |
| 1857 gfx::Vector2dF impl_scroll_; |
| 1858 gfx::Vector2dF second_main_scroll_; |
| 1859 int num_will_begin_main_frames_; |
| 1860 int num_did_begin_main_frames_; |
| 1861 int num_will_commits_; |
| 1862 int num_did_commits_; |
| 1863 int num_impl_commits_; |
| 1864 int num_aborted_commits_; |
| 1865 int num_impl_scrolls_; |
| 1866 int num_draws_; |
| 1867 }; |
| 1868 |
| 1869 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollAbortedCommitMFBA); |
| 1870 |
| 1516 } // namespace | 1871 } // namespace |
| 1517 } // namespace cc | 1872 } // namespace cc |
| OLD | NEW |