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..72bf0a4a26b13303b9502a21ad484e846a747e97 100644 |
--- a/cc/output/output_surface_unittest.cc |
+++ b/cc/output/output_surface_unittest.cc |
@@ -4,7 +4,9 @@ |
#include "cc/output/output_surface.h" |
#include "cc/output/output_surface_client.h" |
+#include "cc/output/software_output_device.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 +26,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 +53,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 +88,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 +113,58 @@ TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) { |
EXPECT_EQ(NULL, output_surface.client()); |
} |
+class InitializeNewContext3D : public ::testing::Test { |
+ public: |
+ InitializeNewContext3D() |
+ : context3d_(TestWebGraphicsContext3D::Create()), |
+ output_surface_( |
+ scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice)) {} |
+ |
+ protected: |
+ void BindOutputSurface() { |
+ EXPECT_TRUE(output_surface_.BindToClient(&client_)); |
+ EXPECT_EQ(&client_, output_surface_.client()); |
+ } |
+ |
+ void InitializeNewContextExpectFail() { |
+ EXPECT_FALSE(output_surface_.InitializeNewContext3D( |
+ context3d_.PassAs<WebKit::WebGraphicsContext3D>())); |
+ EXPECT_EQ(&client_, output_surface_.client()); |
+ |
+ EXPECT_FALSE(output_surface_.context3d()); |
+ EXPECT_TRUE(output_surface_.software_device()); |
+ } |
+ |
+ scoped_ptr<TestWebGraphicsContext3D> context3d_; |
+ TestOutputSurface output_surface_; |
+ FakeOutputSurfaceClient client_; |
+}; |
+ |
+TEST_F(InitializeNewContext3D, Success) { |
+ BindOutputSurface(); |
+ EXPECT_FALSE(client_.deferred_initialize_called()); |
+ |
+ EXPECT_TRUE(output_surface_.InitializeNewContext3D( |
+ 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(); |
+ context3d_->set_times_make_current_succeeds(0); |
+ InitializeNewContextExpectFail(); |
+} |
+ |
+TEST_F(InitializeNewContext3D, ClientDeferredInitializeFails) { |
+ BindOutputSurface(); |
+ client_.set_deferred_initialize_result(false); |
+ InitializeNewContextExpectFail(); |
+} |
+ |
} // namespace |
} // namespace cc |