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

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

Powered by Google App Engine
This is Rietveld 408576698