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

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: logging-- 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 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
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