Index: cc/output/output_surface_unittest.cc |
diff --git a/cc/output/output_surface_unittest.cc b/cc/output/output_surface_unittest.cc |
index 1d365d99f4d3578f705b78bfa501bc378f9140ee..e3d2e99adc1cd75b75e79414d2c27a5bd7a14965 100644 |
--- a/cc/output/output_surface_unittest.cc |
+++ b/cc/output/output_surface_unittest.cc |
@@ -5,6 +5,7 @@ |
#include "cc/output/output_surface.h" |
#include "cc/output/output_surface_client.h" |
#include "cc/test/test_web_graphics_context_3d.h" |
+#include "gpu/GLES2/gl2extchromium.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace cc { |
@@ -24,13 +25,25 @@ class TestOutputSurface : public OutputSurface { |
: OutputSurface(context3d.Pass(), software_device.Pass()) {} |
OutputSurfaceClient* client() { return client_; } |
+ |
+ bool InitializeNewContext3D( |
+ scoped_ptr<WebKit::WebGraphicsContext3D> new_context3d) { |
+ return InitializeAndSetContext3D(new_context3d.Pass(), |
+ scoped_refptr<ContextProvider>()); |
+ } |
}; |
class FakeOutputSurfaceClient : public OutputSurfaceClient { |
public: |
+ FakeOutputSurfaceClient() |
+ : deferred_initialize_result_(true), |
+ deferred_initialize_called_(false), |
+ did_lose_output_surface_called_(false) {} |
+ |
virtual bool DeferredInitialize( |
scoped_refptr<ContextProvider> offscreen_context_provider) OVERRIDE { |
- return true; |
+ deferred_initialize_called_ = true; |
+ return deferred_initialize_result_; |
} |
virtual void SetNeedsRedrawRect(gfx::Rect damage_rect) OVERRIDE {} |
virtual void OnVSyncParametersChanged(base::TimeTicks timebase, |
@@ -39,9 +52,28 @@ class FakeOutputSurfaceClient : public OutputSurfaceClient { |
virtual void OnSendFrameToParentCompositorAck(const CompositorFrameAck& ack) |
OVERRIDE {} |
virtual void OnSwapBuffersComplete() OVERRIDE {} |
- virtual void DidLoseOutputSurface() OVERRIDE {} |
+ virtual void DidLoseOutputSurface() OVERRIDE { |
+ did_lose_output_surface_called_ = true; |
+ } |
virtual void SetExternalDrawConstraints(const gfx::Transform& transform, |
gfx::Rect viewport) OVERRIDE {} |
+ |
+ void set_deferred_initialize_result(bool result) { |
+ deferred_initialize_result_ = result; |
+ } |
+ |
+ bool deferred_initialize_called() { |
+ return deferred_initialize_called_; |
+ } |
+ |
+ bool did_lose_output_surface_called() { |
+ return did_lose_output_surface_called_; |
+ } |
+ |
+ private: |
+ bool deferred_initialize_result_; |
+ bool deferred_initialize_called_; |
+ bool did_lose_output_surface_called_; |
}; |
TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) { |
@@ -55,6 +87,13 @@ TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) { |
FakeOutputSurfaceClient client; |
EXPECT_TRUE(output_surface.BindToClient(&client)); |
EXPECT_EQ(&client, output_surface.client()); |
+ EXPECT_FALSE(client.deferred_initialize_called()); |
+ |
+ // Verify DidLoseOutputSurface callback is hooked up correctly. |
+ EXPECT_FALSE(client.did_lose_output_surface_called()); |
+ output_surface.context3d()->loseContextCHROMIUM( |
+ GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); |
+ EXPECT_TRUE(client.did_lose_output_surface_called()); |
} |
TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) { |
@@ -73,5 +112,66 @@ TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) { |
EXPECT_EQ(NULL, output_surface.client()); |
} |
+class InitializeNewContext3D : public ::testing::Test { |
+ public: |
+ InitializeNewContext3D() |
+ : second_context3d_(TestWebGraphicsContext3D::Create()), |
+ output_surface_(TestWebGraphicsContext3D::Create() |
+ .PassAs<WebKit::WebGraphicsContext3D>()) {} |
+ |
+ protected: |
+ void BindOutputSurface() { |
+ first_context3d_ptr_ = |
+ static_cast<TestWebGraphicsContext3D*>(output_surface_.context3d()); |
+ EXPECT_TRUE(output_surface_.BindToClient(&client_)); |
+ EXPECT_EQ(&client_, output_surface_.client()); |
+ } |
+ |
+ void InitializeNewContextExpectFail() { |
+ EXPECT_FALSE(output_surface_.InitializeNewContext3D( |
+ second_context3d_.PassAs<WebKit::WebGraphicsContext3D>())); |
+ EXPECT_EQ(&client_, output_surface_.client()); |
+ |
+ // First context3d still in place. |
+ ASSERT_TRUE(output_surface_.context3d()); |
+ EXPECT_EQ(first_context3d_ptr_, output_surface_.context3d()); |
+ EXPECT_FALSE(client_.did_lose_output_surface_called()); |
+ output_surface_.context3d()->loseContextCHROMIUM( |
+ GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); |
+ EXPECT_TRUE(client_.did_lose_output_surface_called()); |
+ } |
+ |
+ TestWebGraphicsContext3D* first_context3d_ptr_; |
+ scoped_ptr<TestWebGraphicsContext3D> second_context3d_; |
+ TestOutputSurface output_surface_; |
+ FakeOutputSurfaceClient client_; |
+}; |
+ |
+TEST_F(InitializeNewContext3D, Success) { |
+ BindOutputSurface(); |
+ EXPECT_FALSE(client_.deferred_initialize_called()); |
+ |
+ EXPECT_TRUE(output_surface_.InitializeNewContext3D( |
+ second_context3d_.PassAs<WebKit::WebGraphicsContext3D>())); |
+ EXPECT_TRUE(client_.deferred_initialize_called()); |
+ |
+ EXPECT_FALSE(client_.did_lose_output_surface_called()); |
+ output_surface_.context3d()->loseContextCHROMIUM( |
+ GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); |
+ EXPECT_TRUE(client_.did_lose_output_surface_called()); |
+} |
+ |
+TEST_F(InitializeNewContext3D, Context3dMakeCurrentFails) { |
+ BindOutputSurface(); |
+ second_context3d_->set_times_make_current_succeeds(0); |
+ InitializeNewContextExpectFail(); |
+} |
+ |
+TEST_F(InitializeNewContext3D, ClientDeferredInitializeFails) { |
+ BindOutputSurface(); |
+ client_.set_deferred_initialize_result(false); |
+ InitializeNewContextExpectFail(); |
+} |
+ |
} // namespace |
} // namespace cc |