Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: cc/trees/layer_tree_host_unittest_scroll.cc

Issue 2062963002: cc: Fix for synced property main thread updates with MFBA. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2743
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/base/synced_property.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « cc/base/synced_property.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698