begin_frame_source_webview_unittest.cc 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "android_webview/browser/gfx/begin_frame_source_webview.h"
  5. #include "components/viz/test/begin_frame_source_test.h"
  6. namespace android_webview {
  7. namespace {
  8. class TestBeginFrameSource : public viz::ExternalBeginFrameSource,
  9. public viz::ExternalBeginFrameSourceClient {
  10. public:
  11. TestBeginFrameSource() : ExternalBeginFrameSource(this) {}
  12. ~TestBeginFrameSource() override = default;
  13. void OnNeedsBeginFrames(bool needs_begin_frames) override {
  14. needs_begin_frames_ = needs_begin_frames;
  15. }
  16. bool needs_begin_frames() const { return needs_begin_frames_; }
  17. private:
  18. bool needs_begin_frames_ = false;
  19. };
  20. } // namespace
  21. class BeginFrameSourceWebViewTest : public ::testing::Test {
  22. public:
  23. BeginFrameSourceWebViewTest() {
  24. root_begin_frame_source_.ObserveBeginFrameSource(&test_begin_frame_source_);
  25. }
  26. viz::BeginFrameArgs BeginFrameArgsForTesting(uint64_t sequence) {
  27. return viz::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 1,
  28. sequence);
  29. }
  30. protected:
  31. BeginFrameSourceWebView begin_frame_source_;
  32. RootBeginFrameSourceWebView root_begin_frame_source_;
  33. // Test classes used to issue and observe begin frames.
  34. testing::NiceMock<viz::MockBeginFrameObserver> observer_;
  35. TestBeginFrameSource test_begin_frame_source_;
  36. };
  37. TEST_F(BeginFrameSourceWebViewTest, RootBeginFrame) {
  38. EXPECT_FALSE(test_begin_frame_source_.needs_begin_frames());
  39. // Send BeginFrame without observer.
  40. auto args1 = BeginFrameArgsForTesting(1);
  41. test_begin_frame_source_.OnBeginFrame(args1);
  42. root_begin_frame_source_.AddObserver(&observer_);
  43. EXPECT_TRUE(test_begin_frame_source_.needs_begin_frames());
  44. // Send BeginFrame with observer, verify it gets it.
  45. auto args2 = BeginFrameArgsForTesting(2);
  46. EXPECT_BEGIN_FRAME_ARGS_USED(observer_, args2);
  47. test_begin_frame_source_.OnBeginFrame(args2);
  48. root_begin_frame_source_.RemoveObserver(&observer_);
  49. EXPECT_FALSE(test_begin_frame_source_.needs_begin_frames());
  50. }
  51. TEST_F(BeginFrameSourceWebViewTest, RootPausedWithObservers) {
  52. // External BFS is not paused => observer will be unpaused on Add.
  53. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, false);
  54. root_begin_frame_source_.AddObserver(&observer_);
  55. // External BFS is paused => observer will be paused.
  56. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, true);
  57. test_begin_frame_source_.OnSetBeginFrameSourcePaused(true);
  58. // External BFS is unpaused => observer will be unpaused.
  59. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, false);
  60. test_begin_frame_source_.OnSetBeginFrameSourcePaused(false);
  61. root_begin_frame_source_.RemoveObserver(&observer_);
  62. }
  63. TEST_F(BeginFrameSourceWebViewTest, RootPausedWithoutObservers) {
  64. test_begin_frame_source_.OnSetBeginFrameSourcePaused(true);
  65. // External BFS is paused => observer will be paused on Add.
  66. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, true);
  67. root_begin_frame_source_.AddObserver(&observer_);
  68. // External BFS is unpaused => observer will be unpaused.
  69. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, false);
  70. test_begin_frame_source_.OnSetBeginFrameSourcePaused(false);
  71. root_begin_frame_source_.RemoveObserver(&observer_);
  72. // External BFS is unpaused => observer will be unpaused on Add.
  73. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, false);
  74. root_begin_frame_source_.AddObserver(&observer_);
  75. root_begin_frame_source_.RemoveObserver(&observer_);
  76. }
  77. TEST_F(BeginFrameSourceWebViewTest, ChildBeginFrame) {
  78. begin_frame_source_.SetParentSource(&root_begin_frame_source_);
  79. EXPECT_FALSE(test_begin_frame_source_.needs_begin_frames());
  80. // Send BeginFrame without observer.
  81. auto args1 = BeginFrameArgsForTesting(1);
  82. test_begin_frame_source_.OnBeginFrame(args1);
  83. begin_frame_source_.AddObserver(&observer_);
  84. EXPECT_TRUE(test_begin_frame_source_.needs_begin_frames());
  85. // Send BeginFrame with observer, verify it gets it.
  86. auto args2 = BeginFrameArgsForTesting(2);
  87. EXPECT_BEGIN_FRAME_ARGS_USED(observer_, args2);
  88. test_begin_frame_source_.OnBeginFrame(args2);
  89. begin_frame_source_.RemoveObserver(&observer_);
  90. EXPECT_FALSE(test_begin_frame_source_.needs_begin_frames());
  91. }
  92. TEST_F(BeginFrameSourceWebViewTest, ChildPausedWithObservers) {
  93. begin_frame_source_.SetParentSource(&root_begin_frame_source_);
  94. // External BFS is not paused => observer will be not paused on Add.
  95. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, false);
  96. begin_frame_source_.AddObserver(&observer_);
  97. // External BFS paused => observer will be paused.
  98. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, true);
  99. test_begin_frame_source_.OnSetBeginFrameSourcePaused(true);
  100. // External BFS unpaused => observer will be unpaused.
  101. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, false);
  102. test_begin_frame_source_.OnSetBeginFrameSourcePaused(false);
  103. begin_frame_source_.RemoveObserver(&observer_);
  104. }
  105. TEST_F(BeginFrameSourceWebViewTest, ChildPausedWithoutObservers) {
  106. begin_frame_source_.SetParentSource(&root_begin_frame_source_);
  107. test_begin_frame_source_.OnSetBeginFrameSourcePaused(true);
  108. // External BFS is paused => observer will be paused on Add.
  109. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, true);
  110. begin_frame_source_.AddObserver(&observer_);
  111. // External BFS unpaused => observer will be unpaused.
  112. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, false);
  113. test_begin_frame_source_.OnSetBeginFrameSourcePaused(false);
  114. begin_frame_source_.RemoveObserver(&observer_);
  115. // External BFS is unpaused => observer will be unpaused on Add.
  116. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, false);
  117. begin_frame_source_.AddObserver(&observer_);
  118. begin_frame_source_.RemoveObserver(&observer_);
  119. }
  120. TEST_F(BeginFrameSourceWebViewTest, ChildPausedNoParent) {
  121. // BFS doesn't have parent so it is paused => observer will be paused on Add.
  122. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, true);
  123. begin_frame_source_.AddObserver(&observer_);
  124. // As there is no parent we are always paused, so we don't expect the call.
  125. EXPECT_CALL(observer_, OnBeginFrameSourcePausedChanged(testing::_)).Times(0);
  126. test_begin_frame_source_.OnSetBeginFrameSourcePaused(true);
  127. // As there is no parent we are always paused, so we don't expect the call.
  128. EXPECT_CALL(observer_, OnBeginFrameSourcePausedChanged(testing::_)).Times(0);
  129. test_begin_frame_source_.OnSetBeginFrameSourcePaused(false);
  130. begin_frame_source_.RemoveObserver(&observer_);
  131. }
  132. TEST_F(BeginFrameSourceWebViewTest, ChildPauseChangeOnSetParent) {
  133. // BFS doesn't have parent so it is paused => observer will be paused on Add.
  134. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, true);
  135. begin_frame_source_.AddObserver(&observer_);
  136. // We set parent and it's unpaused => observer will be unpaused.
  137. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, false);
  138. begin_frame_source_.SetParentSource(&root_begin_frame_source_);
  139. // We remove parent so BFS becomes paused => observer will be paused.
  140. EXPECT_BEGIN_FRAME_SOURCE_PAUSED(observer_, true);
  141. begin_frame_source_.SetParentSource(nullptr);
  142. test_begin_frame_source_.OnSetBeginFrameSourcePaused(true);
  143. // We set parent and it's paused => observer will be paused.
  144. // As it's already paused we don't expect the call.
  145. EXPECT_CALL(observer_, OnBeginFrameSourcePausedChanged(testing::_)).Times(0);
  146. begin_frame_source_.SetParentSource(&root_begin_frame_source_);
  147. begin_frame_source_.RemoveObserver(&observer_);
  148. }
  149. TEST_F(BeginFrameSourceWebViewTest, Reentrancy) {
  150. begin_frame_source_.SetParentSource(&root_begin_frame_source_);
  151. begin_frame_source_.AddObserver(&observer_);
  152. // Re-Add observer inside OnBeginFrame so it will trigger missed BeginFrame
  153. EXPECT_CALL(observer_, OnBeginFrame(testing::_))
  154. .WillRepeatedly(testing::Invoke([&](const viz::BeginFrameArgs& args) {
  155. if (args.type == viz::BeginFrameArgs::MISSED)
  156. return;
  157. begin_frame_source_.RemoveObserver(&observer_);
  158. begin_frame_source_.AddObserver(&observer_);
  159. }));
  160. test_begin_frame_source_.OnBeginFrame(BeginFrameArgsForTesting(1));
  161. begin_frame_source_.RemoveObserver(&observer_);
  162. }
  163. } // namespace android_webview