Index: cc/output/output_surface_unittest.cc |
diff --git a/cc/output/output_surface_unittest.cc b/cc/output/output_surface_unittest.cc |
index a23ba9383d6f848e0c66a39a3132dc9afbd84d53..6273783ff6367c1f607a2863cd851f093491867b 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,10 +25,17 @@ 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()); |
+ } |
}; |
class FakeOutputSurfaceClient : public OutputSurfaceClient { |
public: |
+ FakeOutputSurfaceClient() : did_lose_output_surface_called_(false) {} |
+ |
virtual void SetNeedsRedrawRect(gfx::Rect damage_rect) OVERRIDE {} |
virtual void OnVSyncParametersChanged(base::TimeTicks timebase, |
base::TimeDelta interval) OVERRIDE {} |
@@ -35,7 +43,16 @@ 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; |
+ } |
+ |
+ bool did_lose_output_surface_called() { |
+ return did_lose_output_surface_called_; |
+ } |
+ |
+ private: |
+ bool did_lose_output_surface_called_; |
}; |
TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) { |
@@ -49,6 +66,12 @@ TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) { |
FakeOutputSurfaceClient client; |
EXPECT_TRUE(output_surface.BindToClient(&client)); |
EXPECT_EQ(&client, output_surface.client()); |
+ |
+ // Verify DidLoseOutputSurface callback is hooked up correctly. |
+ ASSERT_FALSE(client.did_lose_output_surface_called()); |
danakj
2013/06/05 18:50:22
nit: EXPECT instead of ASSERT throughout, this doe
boliu
2013/06/05 19:06:31
All except ASSERT_TRUE(output_surface.context3d())
|
+ output_surface.context3d()->loseContextCHROMIUM( |
+ GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); |
+ ASSERT_TRUE(client.did_lose_output_surface_called()); |
} |
TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) { |
@@ -67,5 +90,53 @@ TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) { |
EXPECT_EQ(NULL, output_surface.client()); |
} |
+TEST(OutputSurfaceTest, InitializeNewContext3DSuccess) { |
+ scoped_ptr<TestWebGraphicsContext3D> first_context3d = |
+ TestWebGraphicsContext3D::Create(); |
+ TestOutputSurface output_surface( |
+ first_context3d.PassAs<WebKit::WebGraphicsContext3D>()); |
+ |
+ FakeOutputSurfaceClient client; |
+ EXPECT_TRUE(output_surface.BindToClient(&client)); |
+ EXPECT_EQ(&client, output_surface.client()); |
+ |
+ scoped_ptr<TestWebGraphicsContext3D> second_context3d = |
+ TestWebGraphicsContext3D::Create(); |
+ EXPECT_TRUE(output_surface.InitializeNewContext3D( |
+ second_context3d.PassAs<WebKit::WebGraphicsContext3D>())); |
+ ASSERT_FALSE(client.did_lose_output_surface_called()); |
+ output_surface.context3d()->loseContextCHROMIUM( |
+ GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); |
+ ASSERT_TRUE(client.did_lose_output_surface_called()); |
+} |
+ |
+TEST(OutputSurfaceTest, InitializeNewContext3DFails) { |
+ scoped_ptr<TestWebGraphicsContext3D> first_context3d = |
+ TestWebGraphicsContext3D::Create(); |
+ TestWebGraphicsContext3D* first_context3d_ptr = first_context3d.get(); |
+ TestOutputSurface output_surface( |
+ first_context3d.PassAs<WebKit::WebGraphicsContext3D>()); |
+ |
+ FakeOutputSurfaceClient client; |
+ EXPECT_TRUE(output_surface.BindToClient(&client)); |
+ EXPECT_EQ(&client, output_surface.client()); |
+ |
+ scoped_ptr<TestWebGraphicsContext3D> second_context3d = |
+ TestWebGraphicsContext3D::Create(); |
+ second_context3d->set_times_make_current_succeeds(0); |
+ |
+ 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()); |
+ ASSERT_FALSE(client.did_lose_output_surface_called()); |
+ output_surface.context3d()->loseContextCHROMIUM( |
+ GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); |
+ ASSERT_TRUE(client.did_lose_output_surface_called()); |
+} |
+ |
} // namespace |
} // namespace cc |