Chromium Code Reviews| 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(compositor()); |
| 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() : on_draw_count_(0) {} | |
| 37 void StartTest() override { | |
| 38 browser_view_renderer_->PostInvalidate(compositor()); | |
| 39 } | |
| 40 | |
| 41 void DidOnDraw(bool success) override { | |
| 42 on_draw_count_++; | |
| 43 switch (on_draw_count_) { | |
| 44 case 1: | |
| 45 EXPECT_TRUE(success); | |
| 46 // Change compositor here. And do another ondraw. | |
| 47 // The previous active compositor id is 0, 0, now change it to 0, 1. | |
| 48 browser_view_renderer_->SetActiveCompositorID(CompositorID(0, 1)); | |
| 49 browser_view_renderer_->PostInvalidate(compositor()); | |
| 50 break; | |
| 51 case 2: | |
| 52 // The 2nd ondraw is skipped because there is no active compositor at | |
| 53 // the moment. | |
| 54 EXPECT_FALSE(success); | |
| 55 compositor_.reset(new content::TestSynchronousCompositor(0, 1)); | |
|
boliu
2016/06/21 17:29:47
this also destroyes the old one, can we have exerc
hush (inactive)
2016/06/21 21:27:25
Done.
| |
| 56 compositor_->SetClient(browser_view_renderer_.get()); | |
| 57 | |
| 58 EXPECT_EQ(compositor(), compositor_.get()); | |
| 59 browser_view_renderer_->PostInvalidate(compositor()); | |
| 60 break; | |
| 61 case 3: | |
| 62 EXPECT_TRUE(success); | |
| 63 EXPECT_EQ(compositor(), compositor_.get()); | |
| 64 EndTest(); | |
| 65 } | |
| 66 } | |
| 67 | |
| 68 private: | |
| 69 int on_draw_count_; | |
| 70 }; | |
| 71 | |
| 72 RENDERING_TEST_F(ActiveCompositorSwitchBeforeConstructionTest); | |
| 73 | |
| 74 // Test the case where SynchronousCompositor is constructed before the RVH that | |
| 75 // owns it is switched to be active. | |
| 76 class ActiveCompositorSwitchAfterConstructionTest : public RenderingTest { | |
| 77 public: | |
| 78 ActiveCompositorSwitchAfterConstructionTest() : on_draw_count_(0) {} | |
| 79 void StartTest() override { | |
| 80 browser_view_renderer_->PostInvalidate(compositor()); | |
| 81 } | |
| 82 | |
| 83 void DidOnDraw(bool success) override { | |
| 84 on_draw_count_++; | |
| 85 switch (on_draw_count_) { | |
| 86 case 1: | |
| 87 EXPECT_TRUE(success); | |
| 88 // Create a new compositor here. And switch it to be active. And then | |
| 89 // do another ondraw. | |
| 90 compositor_.reset(new content::TestSynchronousCompositor(0, 1)); | |
|
boliu
2016/06/21 17:29:47
ditto
hush (inactive)
2016/06/21 21:27:25
Done.
| |
| 91 compositor_->SetClient(browser_view_renderer_.get()); | |
| 92 browser_view_renderer_->SetActiveCompositorID(CompositorID(0, 1)); | |
| 93 | |
| 94 EXPECT_EQ(compositor(), compositor_.get()); | |
| 95 browser_view_renderer_->PostInvalidate(compositor()); | |
| 96 break; | |
| 97 case 2: | |
| 98 EXPECT_TRUE(success); | |
| 99 EXPECT_EQ(compositor(), compositor_.get()); | |
| 100 EndTest(); | |
| 101 } | |
| 102 } | |
| 103 | |
| 104 private: | |
| 105 int on_draw_count_; | |
| 106 }; | |
| 107 | |
| 108 RENDERING_TEST_F(ActiveCompositorSwitchAfterConstructionTest); | |
| 109 | |
| 32 class ClearViewTest : public RenderingTest { | 110 class ClearViewTest : public RenderingTest { |
| 33 public: | 111 public: |
| 34 ClearViewTest() : on_draw_count_(0) {} | 112 ClearViewTest() : on_draw_count_(0) {} |
| 35 | 113 |
| 36 void StartTest() override { | 114 void StartTest() override { |
| 37 browser_view_renderer_->PostInvalidate(compositor_.get()); | 115 browser_view_renderer_->PostInvalidate(compositor()); |
| 38 browser_view_renderer_->ClearView(); | 116 browser_view_renderer_->ClearView(); |
| 39 } | 117 } |
| 40 | 118 |
| 41 void DidOnDraw(bool success) override { | 119 void DidOnDraw(bool success) override { |
| 42 on_draw_count_++; | 120 on_draw_count_++; |
| 43 if (on_draw_count_ == 1) { | 121 if (on_draw_count_ == 1) { |
| 44 // First OnDraw should be skipped due to ClearView. | 122 // First OnDraw should be skipped due to ClearView. |
| 45 EXPECT_FALSE(success); | 123 EXPECT_FALSE(success); |
| 46 browser_view_renderer_->DidUpdateContent( | 124 browser_view_renderer_->DidUpdateContent( |
| 47 compositor_.get()); // Unset ClearView. | 125 compositor()); // Unset ClearView. |
| 48 browser_view_renderer_->PostInvalidate(compositor_.get()); | 126 browser_view_renderer_->PostInvalidate(compositor()); |
| 49 } else { | 127 } else { |
| 50 // Following OnDraws should succeed. | 128 // Following OnDraws should succeed. |
| 51 EXPECT_TRUE(success); | 129 EXPECT_TRUE(success); |
| 52 } | 130 } |
| 53 } | 131 } |
| 54 | 132 |
| 55 void DidDrawOnRT() override { EndTest(); } | 133 void DidDrawOnRT() override { EndTest(); } |
| 56 | 134 |
| 57 private: | 135 private: |
| 58 int on_draw_count_; | 136 int on_draw_count_; |
| 59 }; | 137 }; |
| 60 | 138 |
| 61 RENDERING_TEST_F(ClearViewTest); | 139 RENDERING_TEST_F(ClearViewTest); |
| 62 | 140 |
| 63 class TestAnimateInAndOutOfScreen : public RenderingTest { | 141 class TestAnimateInAndOutOfScreen : public RenderingTest { |
| 64 public: | 142 public: |
| 65 TestAnimateInAndOutOfScreen() : on_draw_count_(0), draw_gl_count_on_rt_(0) {} | 143 TestAnimateInAndOutOfScreen() : on_draw_count_(0), draw_gl_count_on_rt_(0) {} |
| 66 | 144 |
| 67 void StartTest() override { | 145 void StartTest() override { |
| 68 new_constraints_ = ParentCompositorDrawConstraints( | 146 new_constraints_ = ParentCompositorDrawConstraints( |
| 69 false, gfx::Transform(), window_->surface_size().IsEmpty()); | 147 false, gfx::Transform(), window_->surface_size().IsEmpty()); |
| 70 new_constraints_.transform.Scale(2.0, 2.0); | 148 new_constraints_.transform.Scale(2.0, 2.0); |
| 71 browser_view_renderer_->PostInvalidate(compositor_.get()); | 149 browser_view_renderer_->PostInvalidate(compositor()); |
| 72 } | 150 } |
| 73 | 151 |
| 74 void WillOnDraw() override { | 152 void WillOnDraw() override { |
| 75 RenderingTest::WillOnDraw(); | 153 RenderingTest::WillOnDraw(); |
| 76 // Step 0: A single onDraw on screen. The parent draw constraints | 154 // Step 0: A single onDraw on screen. The parent draw constraints |
| 77 // of the BVR will updated to be the initial constraints. | 155 // of the BVR will updated to be the initial constraints. |
| 78 // Step 1: A single onDrraw off screen. The parent draw constraints of the | 156 // Step 1: A single onDrraw off screen. The parent draw constraints of the |
| 79 // BVR will be updated to the new constraints. | 157 // BVR will be updated to the new constraints. |
| 80 // Step 2: This onDraw is to introduce the DrawGL that animates the | 158 // 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 | 159 // 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_; | 231 ParentCompositorDrawConstraints new_constraints_; |
| 154 }; | 232 }; |
| 155 | 233 |
| 156 RENDERING_TEST_F(TestAnimateInAndOutOfScreen); | 234 RENDERING_TEST_F(TestAnimateInAndOutOfScreen); |
| 157 | 235 |
| 158 class CompositorNoFrameTest : public RenderingTest { | 236 class CompositorNoFrameTest : public RenderingTest { |
| 159 public: | 237 public: |
| 160 CompositorNoFrameTest() : on_draw_count_(0) {} | 238 CompositorNoFrameTest() : on_draw_count_(0) {} |
| 161 | 239 |
| 162 void StartTest() override { | 240 void StartTest() override { |
| 163 browser_view_renderer_->PostInvalidate(compositor_.get()); | 241 browser_view_renderer_->PostInvalidate(compositor()); |
| 164 } | 242 } |
| 165 | 243 |
| 166 void WillOnDraw() override { | 244 void WillOnDraw() override { |
| 167 if (0 == on_draw_count_) { | 245 if (0 == on_draw_count_) { |
| 168 // No frame from compositor. | 246 // No frame from compositor. |
| 169 } else if (1 == on_draw_count_) { | 247 } else if (1 == on_draw_count_) { |
| 170 compositor_->SetHardwareFrame(0u, ConstructEmptyFrame()); | 248 compositor_->SetHardwareFrame(0u, ConstructEmptyFrame()); |
| 171 } else if (2 == on_draw_count_) { | 249 } else if (2 == on_draw_count_) { |
| 172 // No frame from compositor. | 250 // No frame from compositor. |
| 173 } | 251 } |
| 174 // There may be trailing invalidates. | 252 // There may be trailing invalidates. |
| 175 } | 253 } |
| 176 | 254 |
| 177 void DidOnDraw(bool success) override { | 255 void DidOnDraw(bool success) override { |
| 178 if (0 == on_draw_count_) { | 256 if (0 == on_draw_count_) { |
| 179 // Should fail as there has been no frames from compositor. | 257 // Should fail as there has been no frames from compositor. |
| 180 EXPECT_FALSE(success); | 258 EXPECT_FALSE(success); |
| 181 browser_view_renderer_->PostInvalidate(compositor_.get()); | 259 browser_view_renderer_->PostInvalidate(compositor()); |
| 182 } else if (1 == on_draw_count_) { | 260 } else if (1 == on_draw_count_) { |
| 183 // Should succeed with frame from compositor. | 261 // Should succeed with frame from compositor. |
| 184 EXPECT_TRUE(success); | 262 EXPECT_TRUE(success); |
| 185 browser_view_renderer_->PostInvalidate(compositor_.get()); | 263 browser_view_renderer_->PostInvalidate(compositor()); |
| 186 } else if (2 == on_draw_count_) { | 264 } else if (2 == on_draw_count_) { |
| 187 // Should still succeed with last frame, even if no frame from compositor. | 265 // Should still succeed with last frame, even if no frame from compositor. |
| 188 EXPECT_TRUE(success); | 266 EXPECT_TRUE(success); |
| 189 EndTest(); | 267 EndTest(); |
| 190 } | 268 } |
| 191 on_draw_count_++; | 269 on_draw_count_++; |
| 192 } | 270 } |
| 193 | 271 |
| 194 private: | 272 private: |
| 195 int on_draw_count_; | 273 int on_draw_count_; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 238 } | 316 } |
| 239 return counts; | 317 return counts; |
| 240 } | 318 } |
| 241 | 319 |
| 242 virtual void CheckResults() = 0; | 320 virtual void CheckResults() = 0; |
| 243 | 321 |
| 244 private: | 322 private: |
| 245 bool AdvanceFrame() { | 323 bool AdvanceFrame() { |
| 246 next_frame_ = GetFrame(frame_number_++); | 324 next_frame_ = GetFrame(frame_number_++); |
| 247 if (next_frame_) { | 325 if (next_frame_) { |
| 248 browser_view_renderer_->PostInvalidate(compositor_.get()); | 326 browser_view_renderer_->PostInvalidate(compositor()); |
| 249 return true; | 327 return true; |
| 250 } | 328 } |
| 251 return false; | 329 return false; |
| 252 } | 330 } |
| 253 | 331 |
| 254 std::unique_ptr<content::SynchronousCompositor::Frame> next_frame_; | 332 std::unique_ptr<content::SynchronousCompositor::Frame> next_frame_; |
| 255 int frame_number_; | 333 int frame_number_; |
| 256 }; | 334 }; |
| 257 | 335 |
| 258 class SwitchOutputSurfaceIdTest : public ResourceRenderingTest { | 336 class SwitchOutputSurfaceIdTest : public ResourceRenderingTest { |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 399 } | 477 } |
| 400 | 478 |
| 401 private: | 479 private: |
| 402 std::unique_ptr<FakeFunctor> saved_functor_; | 480 std::unique_ptr<FakeFunctor> saved_functor_; |
| 403 OutputSurfaceResourceCountMap expected_return_count_; | 481 OutputSurfaceResourceCountMap expected_return_count_; |
| 404 }; | 482 }; |
| 405 | 483 |
| 406 RENDERING_TEST_F(RenderThreadManagerSwitchTest); | 484 RENDERING_TEST_F(RenderThreadManagerSwitchTest); |
| 407 | 485 |
| 408 } // namespace android_webview | 486 } // namespace android_webview |
| OLD | NEW |