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