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

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

Issue 2035543003: cc: Fix for synced property main thread updates with MFBA. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits 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 1497 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 1:
1545 // Ask for commit here because activation (and draw) will be blocked.
1546 GetProxyImplForTest()->SetNeedsCommitOnImpl();
1547 // Block activation after second commit until third commit is ready.
1548 GetProxyImplForTest()->BlockNotifyReadyToActivateForTesting(true);
1549 break;
1550 case 2:
1551 // Unblock activation after third commit is ready.
1552 GetProxyImplForTest()->BlockNotifyReadyToActivateForTesting(false);
1553 break;
1554 }
1555 num_commits_++;
1556 }
1557
1558 void UpdateLayerTreeHost() override {
1559 Layer* scroll_layer = layer_tree_host()->outer_viewport_scroll_layer();
1560 switch (layer_tree_host()->source_frame_number()) {
1561 case 0:
1562 EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->scroll_offset());
1563 break;
1564 case 1:
1565 EXPECT_VECTOR_EQ(
1566 gfx::ScrollOffsetWithDelta(initial_scroll_, scroll_amount_),
1567 scroll_layer->scroll_offset());
1568 // Pretend like Javascript updated the scroll position itself.
1569 scroll_layer->SetScrollOffset(second_scroll_);
1570 break;
1571 case 2:
1572 // Third frame does not see a scroll delta because we only did one
1573 // scroll for the second and third frames.
1574 EXPECT_VECTOR_EQ(second_scroll_, scroll_layer->scroll_offset());
1575 // Pretend like Javascript updated the scroll position itself.
1576 scroll_layer->SetScrollOffset(third_scroll_);
1577 break;
1578 }
1579 }
1580
1581 void DrawLayersOnThread(LayerTreeHostImpl* impl) override {
1582 LayerImpl* scroll_layer = impl->OuterViewportScrollLayer();
1583 switch (impl->active_tree()->source_frame_number()) {
1584 case 0:
1585 EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(scroll_layer));
1586 EXPECT_VECTOR_EQ(initial_scroll_, ScrollTreeForLayer(scroll_layer)
1587 ->GetScrollOffsetBaseForTesting(
1588 scroll_layer->id()));
1589 Scroll(impl);
1590 EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer));
1591 // Ask for commit after we've scrolled.
1592 impl->SetNeedsCommit();
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 1:
1736 // Redraw so that we keep scrolling.
1737 impl->SetNeedsRedraw();
1738 // Block activation until third commit is aborted.
1739 impl->BlockNotifyReadyToActivateForTesting(true);
1740 break;
1741 }
1742 num_impl_commits_++;
1743 }
1744
1745 void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* impl,
1746 CommitEarlyOutReason reason) override {
1747 switch (num_aborted_commits_) {
1748 case 0:
1749 EXPECT_EQ(2, num_impl_commits_);
1750 // Unblock activation when third commit is aborted.
1751 impl->BlockNotifyReadyToActivateForTesting(false);
1752 break;
1753 case 1:
1754 EXPECT_EQ(2, num_impl_commits_);
1755 // Redraw to end the test.
1756 impl->SetNeedsRedraw();
1757 break;
1758 }
1759 num_aborted_commits_++;
1760 }
1761
1762 void DrawLayersOnThread(LayerTreeHostImpl* impl) override {
1763 LayerImpl* root_scroll_layer = impl->OuterViewportScrollLayer();
1764 switch (impl->active_tree()->source_frame_number()) {
1765 case 0: {
1766 switch (num_impl_commits_) {
1767 case 1: {
1768 // First draw
1769 EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(root_scroll_layer));
1770 root_scroll_layer->ScrollBy(impl_scroll_);
1771 EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer));
1772 EXPECT_VECTOR_EQ(
1773 initial_scroll_,
1774 ScrollTreeForLayer(root_scroll_layer)
1775 ->GetScrollOffsetBaseForTesting(root_scroll_layer->id()));
1776 impl->SetNeedsCommit();
1777 break;
1778 }
1779 case 2: {
1780 // Second draw but no new active tree because activation is blocked.
1781 EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer));
1782 root_scroll_layer->ScrollBy(impl_scroll_);
1783 EXPECT_VECTOR_EQ(impl_scroll_ + impl_scroll_,
1784 ScrollDelta(root_scroll_layer));
1785 EXPECT_VECTOR_EQ(
1786 initial_scroll_,
1787 ScrollTreeForLayer(root_scroll_layer)
1788 ->GetScrollOffsetBaseForTesting(root_scroll_layer->id()));
1789 // Ask for another commit (which will abort).
1790 impl->SetNeedsCommit();
1791 break;
1792 }
1793 default:
1794 NOTREACHED();
1795 }
1796 break;
1797 }
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 switch (num_aborted_commits_) {
1803 case 1: {
1804 root_scroll_layer->ScrollBy(impl_scroll_);
1805 EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer));
1806 gfx::Vector2dF prev_delta =
1807 impl_scroll_ + impl_scroll_ + second_main_scroll_;
1808 EXPECT_VECTOR_EQ(
1809 gfx::ScrollOffsetWithDelta(initial_scroll_, prev_delta),
1810 ScrollTreeForLayer(root_scroll_layer)
1811 ->GetScrollOffsetBaseForTesting(root_scroll_layer->id()));
1812 // Ask for another commit (which will abort).
1813 impl->SetNeedsCommit();
1814 break;
1815 }
1816 case 2: {
1817 gfx::Vector2dF delta = impl_scroll_ + impl_scroll_ + impl_scroll_ +
1818 second_main_scroll_;
1819 EXPECT_VECTOR_EQ(
1820 gfx::ScrollOffsetWithDelta(initial_scroll_, delta),
1821 ScrollTreeForLayer(root_scroll_layer)
1822 ->GetScrollOffsetBaseForTesting(root_scroll_layer->id()));
1823 // End test after second aborted commit (fourth commit request).
1824 EndTest();
1825 break;
1826 }
1827 }
1828 break;
1829 }
1830 }
1831 num_draws_++;
1832 }
1833
1834 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
1835 const gfx::Vector2dF& outer_delta,
1836 const gfx::Vector2dF& elastic_overscroll_delta,
1837 float scale,
1838 float top_controls_delta) override {
1839 num_impl_scrolls_++;
1840 }
1841
1842 void AfterTest() override {
1843 EXPECT_EQ(3, num_impl_scrolls_);
1844 // Verify that the embedder sees aborted commits as real commits.
1845 EXPECT_EQ(4, num_will_begin_main_frames_);
1846 EXPECT_EQ(4, num_did_begin_main_frames_);
1847 EXPECT_EQ(4, num_will_commits_);
1848 EXPECT_EQ(4, num_did_commits_);
1849 // ...but the compositor thread only sees two real ones.
1850 EXPECT_EQ(2, num_impl_commits_);
1851 // ...and two aborted ones.
1852 EXPECT_EQ(2, num_aborted_commits_);
1853 // ...and four draws.
1854 EXPECT_EQ(4, num_draws_);
1855 }
1856
1857 private:
1858 gfx::ScrollOffset initial_scroll_;
1859 gfx::Vector2dF impl_scroll_;
1860 gfx::Vector2dF second_main_scroll_;
1861 int num_will_begin_main_frames_;
1862 int num_did_begin_main_frames_;
1863 int num_will_commits_;
1864 int num_did_commits_;
1865 int num_impl_commits_;
1866 int num_aborted_commits_;
1867 int num_impl_scrolls_;
1868 int num_draws_;
1869 };
1870
1871 MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollAbortedCommitMFBA);
1872
1518 } // namespace 1873 } // namespace
1519 } // namespace cc 1874 } // 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