| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <map> | 5 #include <map> |
| 6 #include <queue> | 6 #include <queue> |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "android_webview/browser/browser_view_renderer.h" | 9 #include "android_webview/browser/browser_view_renderer.h" |
| 10 #include "android_webview/browser/child_frame.h" | 10 #include "android_webview/browser/child_frame.h" |
| 11 #include "android_webview/browser/compositor_frame_consumer.h" | 11 #include "android_webview/browser/compositor_frame_consumer.h" |
| 12 #include "android_webview/browser/render_thread_manager.h" | 12 #include "android_webview/browser/render_thread_manager.h" |
| 13 #include "android_webview/browser/test/rendering_test.h" | 13 #include "android_webview/browser/test/rendering_test.h" |
| 14 #include "base/location.h" | 14 #include "base/location.h" |
| 15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 16 #include "base/threading/thread_task_runner_handle.h" | 16 #include "base/threading/thread_task_runner_handle.h" |
| 17 #include "cc/output/compositor_frame.h" | 17 #include "cc/output/compositor_frame.h" |
| 18 #include "content/public/test/test_synchronous_compositor_android.h" | 18 #include "content/public/test/test_synchronous_compositor_android.h" |
| 19 | 19 |
| 20 namespace android_webview { | 20 namespace android_webview { |
| 21 | 21 |
| 22 class SmokeTest : public RenderingTest { | 22 class SmokeTest : public RenderingTest { |
| 23 void StartTest() override { | 23 void StartTest() override { |
| 24 browser_view_renderer_->PostInvalidate(compositor_.get()); | 24 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 25 } | 25 } |
| 26 | 26 |
| 27 void DidDrawOnRT() override { EndTest(); } | 27 void DidDrawOnRT() override { EndTest(); } |
| 28 }; | 28 }; |
| 29 | 29 |
| 30 RENDERING_TEST_F(SmokeTest); | 30 RENDERING_TEST_F(SmokeTest); |
| 31 | 31 |
| 32 // Test the case where SynchronousCompositor is constructed after the RVH that |
| 33 // owns it is switched to be active. |
| 34 class ActiveCompositorSwitchBeforeConstructionTest : public RenderingTest { |
| 35 public: |
| 36 ActiveCompositorSwitchBeforeConstructionTest() |
| 37 : on_draw_count_(0), new_compositor_(nullptr) {} |
| 38 void StartTest() override { |
| 39 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 40 } |
| 41 |
| 42 void DidOnDraw(bool success) override { |
| 43 on_draw_count_++; |
| 44 switch (on_draw_count_) { |
| 45 case 1: |
| 46 EXPECT_TRUE(success); |
| 47 // Change compositor here. And do another ondraw. |
| 48 // The previous active compositor id is 0, 0, now change it to 0, 1. |
| 49 browser_view_renderer_->SetActiveCompositorID(CompositorID(0, 1)); |
| 50 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 51 break; |
| 52 case 2: |
| 53 // The 2nd ondraw is skipped because there is no active compositor at |
| 54 // the moment. |
| 55 EXPECT_FALSE(success); |
| 56 new_compositor_.reset(new content::TestSynchronousCompositor(0, 1)); |
| 57 new_compositor_->SetClient(browser_view_renderer_.get()); |
| 58 EXPECT_EQ(ActiveCompositor(), new_compositor_.get()); |
| 59 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 60 break; |
| 61 case 3: |
| 62 EXPECT_TRUE(success); |
| 63 compositor_ = std::move(new_compositor_); |
| 64 |
| 65 EXPECT_EQ(ActiveCompositor(), compositor_.get()); |
| 66 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 67 break; |
| 68 case 4: |
| 69 EXPECT_TRUE(success); |
| 70 EndTest(); |
| 71 } |
| 72 } |
| 73 |
| 74 private: |
| 75 int on_draw_count_; |
| 76 std::unique_ptr<content::TestSynchronousCompositor> new_compositor_; |
| 77 }; |
| 78 |
| 79 RENDERING_TEST_F(ActiveCompositorSwitchBeforeConstructionTest); |
| 80 |
| 81 // Test the case where SynchronousCompositor is constructed before the RVH that |
| 82 // owns it is switched to be active. |
| 83 class ActiveCompositorSwitchAfterConstructionTest : public RenderingTest { |
| 84 public: |
| 85 ActiveCompositorSwitchAfterConstructionTest() |
| 86 : on_draw_count_(0), new_compositor_(nullptr) {} |
| 87 void StartTest() override { |
| 88 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 89 } |
| 90 |
| 91 void DidOnDraw(bool success) override { |
| 92 on_draw_count_++; |
| 93 switch (on_draw_count_) { |
| 94 case 1: |
| 95 EXPECT_TRUE(success); |
| 96 // Create a new compositor here. And switch it to be active. And then |
| 97 // do another ondraw. |
| 98 new_compositor_.reset(new content::TestSynchronousCompositor(0, 1)); |
| 99 new_compositor_->SetClient(browser_view_renderer_.get()); |
| 100 browser_view_renderer_->SetActiveCompositorID(CompositorID(0, 1)); |
| 101 |
| 102 EXPECT_EQ(ActiveCompositor(), new_compositor_.get()); |
| 103 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 104 break; |
| 105 case 2: |
| 106 EXPECT_TRUE(success); |
| 107 compositor_ = std::move(new_compositor_); |
| 108 |
| 109 EXPECT_EQ(ActiveCompositor(), compositor_.get()); |
| 110 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 111 break; |
| 112 case 3: |
| 113 EXPECT_TRUE(success); |
| 114 EndTest(); |
| 115 } |
| 116 } |
| 117 |
| 118 private: |
| 119 int on_draw_count_; |
| 120 std::unique_ptr<content::TestSynchronousCompositor> new_compositor_; |
| 121 }; |
| 122 |
| 123 RENDERING_TEST_F(ActiveCompositorSwitchAfterConstructionTest); |
| 124 |
| 32 class ClearViewTest : public RenderingTest { | 125 class ClearViewTest : public RenderingTest { |
| 33 public: | 126 public: |
| 34 ClearViewTest() : on_draw_count_(0) {} | 127 ClearViewTest() : on_draw_count_(0) {} |
| 35 | 128 |
| 36 void StartTest() override { | 129 void StartTest() override { |
| 37 browser_view_renderer_->PostInvalidate(compositor_.get()); | 130 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 38 browser_view_renderer_->ClearView(); | 131 browser_view_renderer_->ClearView(); |
| 39 } | 132 } |
| 40 | 133 |
| 41 void DidOnDraw(bool success) override { | 134 void DidOnDraw(bool success) override { |
| 42 on_draw_count_++; | 135 on_draw_count_++; |
| 43 if (on_draw_count_ == 1) { | 136 if (on_draw_count_ == 1) { |
| 44 // First OnDraw should be skipped due to ClearView. | 137 // First OnDraw should be skipped due to ClearView. |
| 45 EXPECT_FALSE(success); | 138 EXPECT_FALSE(success); |
| 46 browser_view_renderer_->DidUpdateContent( | 139 browser_view_renderer_->DidUpdateContent( |
| 47 compositor_.get()); // Unset ClearView. | 140 ActiveCompositor()); // Unset ClearView. |
| 48 browser_view_renderer_->PostInvalidate(compositor_.get()); | 141 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 49 } else { | 142 } else { |
| 50 // Following OnDraws should succeed. | 143 // Following OnDraws should succeed. |
| 51 EXPECT_TRUE(success); | 144 EXPECT_TRUE(success); |
| 52 } | 145 } |
| 53 } | 146 } |
| 54 | 147 |
| 55 void DidDrawOnRT() override { EndTest(); } | 148 void DidDrawOnRT() override { EndTest(); } |
| 56 | 149 |
| 57 private: | 150 private: |
| 58 int on_draw_count_; | 151 int on_draw_count_; |
| 59 }; | 152 }; |
| 60 | 153 |
| 61 RENDERING_TEST_F(ClearViewTest); | 154 RENDERING_TEST_F(ClearViewTest); |
| 62 | 155 |
| 63 class TestAnimateInAndOutOfScreen : public RenderingTest { | 156 class TestAnimateInAndOutOfScreen : public RenderingTest { |
| 64 public: | 157 public: |
| 65 TestAnimateInAndOutOfScreen() : on_draw_count_(0), draw_gl_count_on_rt_(0) {} | 158 TestAnimateInAndOutOfScreen() : on_draw_count_(0), draw_gl_count_on_rt_(0) {} |
| 66 | 159 |
| 67 void StartTest() override { | 160 void StartTest() override { |
| 68 new_constraints_ = ParentCompositorDrawConstraints( | 161 new_constraints_ = ParentCompositorDrawConstraints( |
| 69 false, gfx::Transform(), window_->surface_size().IsEmpty()); | 162 false, gfx::Transform(), window_->surface_size().IsEmpty()); |
| 70 new_constraints_.transform.Scale(2.0, 2.0); | 163 new_constraints_.transform.Scale(2.0, 2.0); |
| 71 browser_view_renderer_->PostInvalidate(compositor_.get()); | 164 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 72 } | 165 } |
| 73 | 166 |
| 74 void WillOnDraw() override { | 167 void WillOnDraw() override { |
| 75 RenderingTest::WillOnDraw(); | 168 RenderingTest::WillOnDraw(); |
| 76 // Step 0: A single onDraw on screen. The parent draw constraints | 169 // Step 0: A single onDraw on screen. The parent draw constraints |
| 77 // of the BVR will updated to be the initial constraints. | 170 // of the BVR will updated to be the initial constraints. |
| 78 // Step 1: A single onDrraw off screen. The parent draw constraints of the | 171 // Step 1: A single onDrraw off screen. The parent draw constraints of the |
| 79 // BVR will be updated to the new constraints. | 172 // BVR will be updated to the new constraints. |
| 80 // Step 2: This onDraw is to introduce the DrawGL that animates the | 173 // Step 2: This onDraw is to introduce the DrawGL that animates the |
| 81 // webview onto the screen on render thread. End the test when the parent | 174 // webview onto the screen on render thread. End the test when the parent |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 ParentCompositorDrawConstraints new_constraints_; | 246 ParentCompositorDrawConstraints new_constraints_; |
| 154 }; | 247 }; |
| 155 | 248 |
| 156 RENDERING_TEST_F(TestAnimateInAndOutOfScreen); | 249 RENDERING_TEST_F(TestAnimateInAndOutOfScreen); |
| 157 | 250 |
| 158 class CompositorNoFrameTest : public RenderingTest { | 251 class CompositorNoFrameTest : public RenderingTest { |
| 159 public: | 252 public: |
| 160 CompositorNoFrameTest() : on_draw_count_(0) {} | 253 CompositorNoFrameTest() : on_draw_count_(0) {} |
| 161 | 254 |
| 162 void StartTest() override { | 255 void StartTest() override { |
| 163 browser_view_renderer_->PostInvalidate(compositor_.get()); | 256 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 164 } | 257 } |
| 165 | 258 |
| 166 void WillOnDraw() override { | 259 void WillOnDraw() override { |
| 167 if (0 == on_draw_count_) { | 260 if (0 == on_draw_count_) { |
| 168 // No frame from compositor. | 261 // No frame from compositor. |
| 169 } else if (1 == on_draw_count_) { | 262 } else if (1 == on_draw_count_) { |
| 170 compositor_->SetHardwareFrame(0u, ConstructEmptyFrame()); | 263 compositor_->SetHardwareFrame(0u, ConstructEmptyFrame()); |
| 171 } else if (2 == on_draw_count_) { | 264 } else if (2 == on_draw_count_) { |
| 172 // No frame from compositor. | 265 // No frame from compositor. |
| 173 } | 266 } |
| 174 // There may be trailing invalidates. | 267 // There may be trailing invalidates. |
| 175 } | 268 } |
| 176 | 269 |
| 177 void DidOnDraw(bool success) override { | 270 void DidOnDraw(bool success) override { |
| 178 if (0 == on_draw_count_) { | 271 if (0 == on_draw_count_) { |
| 179 // Should fail as there has been no frames from compositor. | 272 // Should fail as there has been no frames from compositor. |
| 180 EXPECT_FALSE(success); | 273 EXPECT_FALSE(success); |
| 181 browser_view_renderer_->PostInvalidate(compositor_.get()); | 274 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 182 } else if (1 == on_draw_count_) { | 275 } else if (1 == on_draw_count_) { |
| 183 // Should succeed with frame from compositor. | 276 // Should succeed with frame from compositor. |
| 184 EXPECT_TRUE(success); | 277 EXPECT_TRUE(success); |
| 185 browser_view_renderer_->PostInvalidate(compositor_.get()); | 278 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 186 } else if (2 == on_draw_count_) { | 279 } else if (2 == on_draw_count_) { |
| 187 // Should still succeed with last frame, even if no frame from compositor. | 280 // Should still succeed with last frame, even if no frame from compositor. |
| 188 EXPECT_TRUE(success); | 281 EXPECT_TRUE(success); |
| 189 EndTest(); | 282 EndTest(); |
| 190 } | 283 } |
| 191 on_draw_count_++; | 284 on_draw_count_++; |
| 192 } | 285 } |
| 193 | 286 |
| 194 private: | 287 private: |
| 195 int on_draw_count_; | 288 int on_draw_count_; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 } | 331 } |
| 239 return counts; | 332 return counts; |
| 240 } | 333 } |
| 241 | 334 |
| 242 virtual void CheckResults() = 0; | 335 virtual void CheckResults() = 0; |
| 243 | 336 |
| 244 private: | 337 private: |
| 245 bool AdvanceFrame() { | 338 bool AdvanceFrame() { |
| 246 next_frame_ = GetFrame(frame_number_++); | 339 next_frame_ = GetFrame(frame_number_++); |
| 247 if (next_frame_) { | 340 if (next_frame_) { |
| 248 browser_view_renderer_->PostInvalidate(compositor_.get()); | 341 browser_view_renderer_->PostInvalidate(ActiveCompositor()); |
| 249 return true; | 342 return true; |
| 250 } | 343 } |
| 251 return false; | 344 return false; |
| 252 } | 345 } |
| 253 | 346 |
| 254 std::unique_ptr<content::SynchronousCompositor::Frame> next_frame_; | 347 std::unique_ptr<content::SynchronousCompositor::Frame> next_frame_; |
| 255 int frame_number_; | 348 int frame_number_; |
| 256 }; | 349 }; |
| 257 | 350 |
| 258 class SwitchOutputSurfaceIdTest : public ResourceRenderingTest { | 351 class SwitchOutputSurfaceIdTest : public ResourceRenderingTest { |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 } | 492 } |
| 400 | 493 |
| 401 private: | 494 private: |
| 402 std::unique_ptr<FakeFunctor> saved_functor_; | 495 std::unique_ptr<FakeFunctor> saved_functor_; |
| 403 OutputSurfaceResourceCountMap expected_return_count_; | 496 OutputSurfaceResourceCountMap expected_return_count_; |
| 404 }; | 497 }; |
| 405 | 498 |
| 406 RENDERING_TEST_F(RenderThreadManagerSwitchTest); | 499 RENDERING_TEST_F(RenderThreadManagerSwitchTest); |
| 407 | 500 |
| 408 } // namespace android_webview | 501 } // namespace android_webview |
| OLD | NEW |