summaryrefslogtreecommitdiffstats
path: root/cc/surfaces/surface_factory_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc/surfaces/surface_factory_unittest.cc')
-rw-r--r--cc/surfaces/surface_factory_unittest.cc58
1 files changed, 58 insertions, 0 deletions
diff --git a/cc/surfaces/surface_factory_unittest.cc b/cc/surfaces/surface_factory_unittest.cc
index c7ce964..9629a4e 100644
--- a/cc/surfaces/surface_factory_unittest.cc
+++ b/cc/surfaces/surface_factory_unittest.cc
@@ -4,6 +4,8 @@
#include "base/bind.h"
#include "cc/output/compositor_frame.h"
+#include "cc/output/copy_output_request.h"
+#include "cc/output/copy_output_result.h"
#include "cc/output/delegated_frame_data.h"
#include "cc/resources/resource_provider.h"
#include "cc/surfaces/surface.h"
@@ -519,5 +521,61 @@ TEST_F(SurfaceFactoryTest, DestroyCycle) {
surface_id_ = SurfaceId();
}
+void CopyRequestTestCallback(bool* called,
+ scoped_ptr<CopyOutputResult> result) {
+ *called = true;
+}
+
+TEST_F(SurfaceFactoryTest, DuplicateCopyRequest) {
+ {
+ scoped_ptr<RenderPass> render_pass(RenderPass::Create());
+ render_pass->referenced_surfaces.push_back(surface_id_);
+ scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
+ frame_data->render_pass_list.push_back(render_pass.Pass());
+ scoped_ptr<CompositorFrame> frame(new CompositorFrame);
+ frame->delegated_frame_data = frame_data.Pass();
+ factory_.SubmitCompositorFrame(surface_id_, frame.Pass(),
+ SurfaceFactory::DrawCallback());
+ }
+ void* source1 = &source1;
+ void* source2 = &source2;
+
+ bool called1 = false;
+ scoped_ptr<CopyOutputRequest> request;
+ request = CopyOutputRequest::CreateRequest(
+ base::Bind(&CopyRequestTestCallback, &called1));
+ request->set_source(source1);
+
+ factory_.RequestCopyOfSurface(surface_id_, request.Pass());
+ EXPECT_FALSE(called1);
+
+ bool called2 = false;
+ request = CopyOutputRequest::CreateRequest(
+ base::Bind(&CopyRequestTestCallback, &called2));
+ request->set_source(source2);
+
+ factory_.RequestCopyOfSurface(surface_id_, request.Pass());
+ // Callbacks have different sources so neither should be called.
+ EXPECT_FALSE(called1);
+ EXPECT_FALSE(called2);
+
+ bool called3 = false;
+ request = CopyOutputRequest::CreateRequest(
+ base::Bind(&CopyRequestTestCallback, &called3));
+ request->set_source(source1);
+
+ factory_.RequestCopyOfSurface(surface_id_, request.Pass());
+ // Two callbacks are from source1, so the first should be called.
+ EXPECT_TRUE(called1);
+ EXPECT_FALSE(called2);
+ EXPECT_FALSE(called3);
+
+ factory_.Destroy(surface_id_);
+ surface_id_ = SurfaceId();
+ EXPECT_TRUE(called1);
+ EXPECT_TRUE(called2);
+ EXPECT_TRUE(called3);
+}
+
} // namespace
} // namespace cc