1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/common/cc_messages.h"
9 #include "cc/output/compositor_frame.h"
10 #include "ipc/ipc_message.h"
11 #include "testing/gtest/include/gtest/gtest.h"
13 using cc::CheckerboardDrawQuad
;
14 using cc::DelegatedFrameData
;
15 using cc::DebugBorderDrawQuad
;
17 using cc::IOSurfaceDrawQuad
;
18 using cc::PictureDrawQuad
;
20 using cc::RenderPassDrawQuad
;
21 using cc::ResourceProvider
;
22 using cc::SharedQuadState
;
23 using cc::SolidColorDrawQuad
;
24 using cc::TextureDrawQuad
;
25 using cc::TileDrawQuad
;
26 using cc::TransferableResource
;
27 using cc::StreamVideoDrawQuad
;
28 using cc::VideoLayerImpl
;
29 using cc::YUVVideoDrawQuad
;
31 using WebKit::WebFilterOperation
;
32 using WebKit::WebFilterOperations
;
37 class CCMessagesTest
: public testing::Test
{
39 void Compare(const RenderPass
* a
, const RenderPass
* b
) {
40 EXPECT_EQ(a
->id
, b
->id
);
41 EXPECT_EQ(a
->output_rect
.ToString(), b
->output_rect
.ToString());
42 EXPECT_EQ(a
->damage_rect
.ToString(), b
->damage_rect
.ToString());
43 EXPECT_EQ(a
->transform_to_root_target
, b
->transform_to_root_target
);
44 EXPECT_EQ(a
->has_transparent_background
, b
->has_transparent_background
);
45 EXPECT_EQ(a
->has_occlusion_from_outside_target_surface
,
46 b
->has_occlusion_from_outside_target_surface
);
49 void Compare(const SharedQuadState
* a
, const SharedQuadState
* b
) {
50 EXPECT_EQ(a
->content_to_target_transform
, b
->content_to_target_transform
);
51 EXPECT_EQ(a
->content_bounds
, b
->content_bounds
);
52 EXPECT_EQ(a
->visible_content_rect
, b
->visible_content_rect
);
53 EXPECT_EQ(a
->clip_rect
, b
->clip_rect
);
54 EXPECT_EQ(a
->is_clipped
, b
->is_clipped
);
55 EXPECT_EQ(a
->opacity
, b
->opacity
);
58 void Compare(const DrawQuad
* a
, const DrawQuad
* b
) {
59 ASSERT_NE(DrawQuad::INVALID
, a
->material
);
60 ASSERT_EQ(a
->material
, b
->material
);
61 EXPECT_EQ(a
->rect
.ToString(), b
->rect
.ToString());
62 EXPECT_EQ(a
->opaque_rect
.ToString(), b
->opaque_rect
.ToString());
63 EXPECT_EQ(a
->visible_rect
.ToString(), b
->visible_rect
.ToString());
64 EXPECT_EQ(a
->needs_blending
, b
->needs_blending
);
66 Compare(a
->shared_quad_state
, b
->shared_quad_state
);
68 switch (a
->material
) {
69 case DrawQuad::CHECKERBOARD
:
70 Compare(CheckerboardDrawQuad::MaterialCast(a
),
71 CheckerboardDrawQuad::MaterialCast(b
));
73 case DrawQuad::DEBUG_BORDER
:
74 Compare(DebugBorderDrawQuad::MaterialCast(a
),
75 DebugBorderDrawQuad::MaterialCast(b
));
77 case DrawQuad::IO_SURFACE_CONTENT
:
78 Compare(IOSurfaceDrawQuad::MaterialCast(a
),
79 IOSurfaceDrawQuad::MaterialCast(b
));
81 case DrawQuad::PICTURE_CONTENT
:
82 Compare(PictureDrawQuad::MaterialCast(a
),
83 PictureDrawQuad::MaterialCast(b
));
85 case DrawQuad::RENDER_PASS
:
86 Compare(RenderPassDrawQuad::MaterialCast(a
),
87 RenderPassDrawQuad::MaterialCast(b
));
89 case DrawQuad::TEXTURE_CONTENT
:
90 Compare(TextureDrawQuad::MaterialCast(a
),
91 TextureDrawQuad::MaterialCast(b
));
93 case DrawQuad::TILED_CONTENT
:
94 Compare(TileDrawQuad::MaterialCast(a
),
95 TileDrawQuad::MaterialCast(b
));
97 case DrawQuad::SOLID_COLOR
:
98 Compare(SolidColorDrawQuad::MaterialCast(a
),
99 SolidColorDrawQuad::MaterialCast(b
));
101 case DrawQuad::STREAM_VIDEO_CONTENT
:
102 Compare(StreamVideoDrawQuad::MaterialCast(a
),
103 StreamVideoDrawQuad::MaterialCast(b
));
105 case DrawQuad::YUV_VIDEO_CONTENT
:
106 Compare(YUVVideoDrawQuad::MaterialCast(a
),
107 YUVVideoDrawQuad::MaterialCast(b
));
109 case DrawQuad::INVALID
:
114 void Compare(const CheckerboardDrawQuad
* a
, const CheckerboardDrawQuad
* b
) {
115 EXPECT_EQ(a
->color
, b
->color
);
118 void Compare(const DebugBorderDrawQuad
* a
, const DebugBorderDrawQuad
* b
) {
119 EXPECT_EQ(a
->color
, b
->color
);
120 EXPECT_EQ(a
->width
, b
->width
);
123 void Compare(const IOSurfaceDrawQuad
* a
, const IOSurfaceDrawQuad
* b
) {
124 EXPECT_EQ(a
->io_surface_size
.ToString(), b
->io_surface_size
.ToString());
125 EXPECT_EQ(a
->io_surface_resource_id
, b
->io_surface_resource_id
);
126 EXPECT_EQ(a
->orientation
, b
->orientation
);
129 void Compare(const RenderPassDrawQuad
* a
, const RenderPassDrawQuad
* b
) {
130 EXPECT_EQ(a
->render_pass_id
, b
->render_pass_id
);
131 EXPECT_EQ(a
->is_replica
, b
->is_replica
);
132 EXPECT_EQ(a
->mask_resource_id
, b
->mask_resource_id
);
133 EXPECT_EQ(a
->contents_changed_since_last_frame
,
134 b
->contents_changed_since_last_frame
);
135 EXPECT_EQ(a
->mask_uv_rect
.ToString(), b
->mask_uv_rect
.ToString());
136 EXPECT_EQ(a
->filters
, b
->filters
);
137 EXPECT_EQ(a
->filter
, b
->filter
);
138 EXPECT_EQ(a
->background_filters
, b
->background_filters
);
141 void Compare(const SolidColorDrawQuad
* a
, const SolidColorDrawQuad
* b
) {
142 EXPECT_EQ(a
->color
, b
->color
);
143 EXPECT_EQ(a
->force_anti_aliasing_off
, b
->force_anti_aliasing_off
);
146 void Compare(const StreamVideoDrawQuad
* a
, const StreamVideoDrawQuad
* b
) {
147 EXPECT_EQ(a
->resource_id
, b
->resource_id
);
148 EXPECT_EQ(a
->matrix
, b
->matrix
);
151 void Compare(const TextureDrawQuad
* a
, const TextureDrawQuad
* b
) {
152 EXPECT_EQ(a
->resource_id
, b
->resource_id
);
153 EXPECT_EQ(a
->premultiplied_alpha
, b
->premultiplied_alpha
);
154 EXPECT_EQ(a
->uv_top_left
, b
->uv_top_left
);
155 EXPECT_EQ(a
->uv_bottom_right
, b
->uv_bottom_right
);
156 EXPECT_EQ(a
->vertex_opacity
[0], b
->vertex_opacity
[0]);
157 EXPECT_EQ(a
->vertex_opacity
[1], b
->vertex_opacity
[1]);
158 EXPECT_EQ(a
->vertex_opacity
[2], b
->vertex_opacity
[2]);
159 EXPECT_EQ(a
->vertex_opacity
[3], b
->vertex_opacity
[3]);
160 EXPECT_EQ(a
->flipped
, b
->flipped
);
163 void Compare(const TileDrawQuad
* a
, const TileDrawQuad
* b
) {
164 EXPECT_EQ(a
->resource_id
, b
->resource_id
);
165 EXPECT_EQ(a
->tex_coord_rect
, b
->tex_coord_rect
);
166 EXPECT_EQ(a
->texture_size
, b
->texture_size
);
167 EXPECT_EQ(a
->swizzle_contents
, b
->swizzle_contents
);
170 void Compare(const YUVVideoDrawQuad
* a
, const YUVVideoDrawQuad
* b
) {
171 EXPECT_EQ(a
->tex_scale
, b
->tex_scale
);
172 EXPECT_EQ(a
->y_plane_resource_id
, b
->y_plane_resource_id
);
173 EXPECT_EQ(a
->u_plane_resource_id
, b
->u_plane_resource_id
);
174 EXPECT_EQ(a
->v_plane_resource_id
, b
->v_plane_resource_id
);
175 EXPECT_EQ(a
->a_plane_resource_id
, b
->a_plane_resource_id
);
178 void Compare(const TransferableResource
& a
, const TransferableResource
& b
) {
179 EXPECT_EQ(a
.id
, b
.id
);
180 EXPECT_EQ(a
.sync_point
, b
.sync_point
);
181 EXPECT_EQ(a
.format
, b
.format
);
182 EXPECT_EQ(a
.filter
, b
.filter
);
183 EXPECT_EQ(a
.size
.ToString(), b
.size
.ToString());
184 for (size_t i
= 0; i
< arraysize(a
.mailbox
.name
); ++i
)
185 EXPECT_EQ(a
.mailbox
.name
[i
], b
.mailbox
.name
[i
]);
189 TEST_F(CCMessagesTest
, AllQuads
) {
190 IPC::Message
msg(1, 2, IPC::Message::PRIORITY_NORMAL
);
192 Transform arbitrary_matrix
;
193 arbitrary_matrix
.Scale(3, 3);
194 arbitrary_matrix
.Translate(-5, 20);
195 arbitrary_matrix
.Rotate(15);
196 gfx::Rect
arbitrary_rect1(-5, 9, 3, 15);
197 gfx::Rect
arbitrary_rect2(40, 23, 11, 7);
198 gfx::Rect
arbitrary_rect3(7, -53, 22, 19);
199 gfx::Size
arbitrary_size1(15, 19);
200 gfx::Size
arbitrary_size2(3, 99);
201 gfx::Size
arbitrary_size3(75, 1281);
202 gfx::RectF
arbitrary_rectf1(4.2f
, -922.1f
, 15.6f
, 29.5f
);
203 gfx::SizeF
arbitrary_sizef1(15.2f
, 104.6f
);
204 gfx::PointF
arbitrary_pointf1(31.4f
, 15.9f
);
205 gfx::PointF
arbitrary_pointf2(26.5f
, -35.8f
);
206 float arbitrary_float1
= 0.7f
;
207 float arbitrary_float2
= 0.3f
;
208 float arbitrary_float3
= 0.9f
;
209 float arbitrary_float_array
[4] = {3.5f
, 6.2f
, 9.3f
, 12.3f
};
210 bool arbitrary_bool1
= true;
211 bool arbitrary_bool2
= false;
212 bool arbitrary_bool3
= true;
213 int arbitrary_int
= 5;
214 SkColor arbitrary_color
= SkColorSetARGB(25, 36, 47, 58);
215 IOSurfaceDrawQuad::Orientation arbitrary_orientation
=
216 IOSurfaceDrawQuad::UNFLIPPED
;
217 RenderPass::Id
arbitrary_id(10, 14);
218 ResourceProvider::ResourceId arbitrary_resourceid1
= 55;
219 ResourceProvider::ResourceId arbitrary_resourceid2
= 47;
220 ResourceProvider::ResourceId arbitrary_resourceid3
= 23;
221 ResourceProvider::ResourceId arbitrary_resourceid4
= 16;
223 WebFilterOperations arbitrary_filters1
;
224 arbitrary_filters1
.append(WebFilterOperation::createGrayscaleFilter(
227 WebFilterOperations arbitrary_filters2
;
228 arbitrary_filters2
.append(WebFilterOperation::createBrightnessFilter(
231 // TODO(danakj): filter is not serialized.
232 skia::RefPtr
<SkImageFilter
> arbitrary_filter
;
234 scoped_ptr
<SharedQuadState
> shared_state1_in
= SharedQuadState::Create();
235 shared_state1_in
->SetAll(arbitrary_matrix
,
241 scoped_ptr
<SharedQuadState
> shared_state1_cmp
= shared_state1_in
->Copy();
243 scoped_ptr
<CheckerboardDrawQuad
> checkerboard_in
=
244 CheckerboardDrawQuad::Create();
245 checkerboard_in
->SetAll(shared_state1_in
.get(),
251 scoped_ptr
<DrawQuad
> checkerboard_cmp
= checkerboard_in
->Copy(
252 checkerboard_in
->shared_quad_state
);
254 scoped_ptr
<DebugBorderDrawQuad
> debugborder_in
=
255 DebugBorderDrawQuad::Create();
256 debugborder_in
->SetAll(shared_state1_in
.get(),
263 scoped_ptr
<DrawQuad
> debugborder_cmp
= debugborder_in
->Copy(
264 debugborder_in
->shared_quad_state
);
266 scoped_ptr
<IOSurfaceDrawQuad
> iosurface_in
=
267 IOSurfaceDrawQuad::Create();
268 iosurface_in
->SetAll(shared_state1_in
.get(),
274 arbitrary_resourceid3
,
275 arbitrary_orientation
);
276 scoped_ptr
<DrawQuad
> iosurface_cmp
= iosurface_in
->Copy(
277 iosurface_in
->shared_quad_state
);
279 scoped_ptr
<RenderPassDrawQuad
> renderpass_in
=
280 RenderPassDrawQuad::Create();
281 renderpass_in
->SetAll(shared_state1_in
.get(),
288 arbitrary_resourceid2
,
292 arbitrary_filter
, // TODO(piman): not serialized.
294 scoped_ptr
<RenderPassDrawQuad
> renderpass_cmp
= renderpass_in
->Copy(
295 renderpass_in
->shared_quad_state
, renderpass_in
->render_pass_id
);
297 scoped_ptr
<SharedQuadState
> shared_state2_in
= SharedQuadState::Create();
298 shared_state2_in
->SetAll(arbitrary_matrix
,
304 scoped_ptr
<SharedQuadState
> shared_state2_cmp
= shared_state2_in
->Copy();
306 scoped_ptr
<SharedQuadState
> shared_state3_in
= SharedQuadState::Create();
307 shared_state3_in
->SetAll(arbitrary_matrix
,
313 scoped_ptr
<SharedQuadState
> shared_state3_cmp
= shared_state3_in
->Copy();
315 scoped_ptr
<SolidColorDrawQuad
> solidcolor_in
=
316 SolidColorDrawQuad::Create();
317 solidcolor_in
->SetAll(shared_state1_in
.get(),
324 scoped_ptr
<DrawQuad
> solidcolor_cmp
= solidcolor_in
->Copy(
325 solidcolor_in
->shared_quad_state
);
327 scoped_ptr
<StreamVideoDrawQuad
> streamvideo_in
=
328 StreamVideoDrawQuad::Create();
329 streamvideo_in
->SetAll(shared_state1_in
.get(),
334 arbitrary_resourceid2
,
336 scoped_ptr
<DrawQuad
> streamvideo_cmp
= streamvideo_in
->Copy(
337 streamvideo_in
->shared_quad_state
);
339 scoped_ptr
<TextureDrawQuad
> texture_in
= TextureDrawQuad::Create();
340 texture_in
->SetAll(shared_state1_in
.get(),
345 arbitrary_resourceid1
,
349 arbitrary_float_array
,
351 scoped_ptr
<DrawQuad
> texture_cmp
= texture_in
->Copy(
352 texture_in
->shared_quad_state
);
354 scoped_ptr
<TileDrawQuad
> tile_in
= TileDrawQuad::Create();
355 tile_in
->SetAll(shared_state1_in
.get(),
360 arbitrary_resourceid3
,
364 scoped_ptr
<DrawQuad
> tile_cmp
= tile_in
->Copy(
365 tile_in
->shared_quad_state
);
367 scoped_ptr
<YUVVideoDrawQuad
> yuvvideo_in
=
368 YUVVideoDrawQuad::Create();
369 yuvvideo_in
->SetAll(shared_state1_in
.get(),
375 arbitrary_resourceid1
,
376 arbitrary_resourceid2
,
377 arbitrary_resourceid3
,
378 arbitrary_resourceid4
);
379 scoped_ptr
<DrawQuad
> yuvvideo_cmp
= yuvvideo_in
->Copy(
380 yuvvideo_in
->shared_quad_state
);
382 scoped_ptr
<RenderPass
> pass_in
= RenderPass::Create();
383 pass_in
->SetAll(arbitrary_id
,
390 pass_in
->shared_quad_state_list
.push_back(shared_state1_in
.Pass());
391 pass_in
->quad_list
.push_back(checkerboard_in
.PassAs
<DrawQuad
>());
392 pass_in
->quad_list
.push_back(debugborder_in
.PassAs
<DrawQuad
>());
393 pass_in
->quad_list
.push_back(iosurface_in
.PassAs
<DrawQuad
>());
394 pass_in
->quad_list
.push_back(renderpass_in
.PassAs
<DrawQuad
>());
395 pass_in
->shared_quad_state_list
.push_back(shared_state2_in
.Pass());
396 pass_in
->shared_quad_state_list
.push_back(shared_state3_in
.Pass());
397 pass_in
->quad_list
.push_back(solidcolor_in
.PassAs
<DrawQuad
>());
398 pass_in
->quad_list
.push_back(streamvideo_in
.PassAs
<DrawQuad
>());
399 pass_in
->quad_list
.push_back(texture_in
.PassAs
<DrawQuad
>());
400 pass_in
->quad_list
.push_back(tile_in
.PassAs
<DrawQuad
>());
401 pass_in
->quad_list
.push_back(yuvvideo_in
.PassAs
<DrawQuad
>());
403 scoped_ptr
<RenderPass
> pass_cmp
= RenderPass::Create();
404 pass_cmp
->SetAll(arbitrary_id
,
411 pass_cmp
->shared_quad_state_list
.push_back(shared_state1_cmp
.Pass());
412 pass_cmp
->quad_list
.push_back(checkerboard_cmp
.PassAs
<DrawQuad
>());
413 pass_cmp
->quad_list
.push_back(debugborder_cmp
.PassAs
<DrawQuad
>());
414 pass_cmp
->quad_list
.push_back(iosurface_cmp
.PassAs
<DrawQuad
>());
415 pass_cmp
->quad_list
.push_back(renderpass_cmp
.PassAs
<DrawQuad
>());
416 pass_cmp
->shared_quad_state_list
.push_back(shared_state2_cmp
.Pass());
417 pass_cmp
->shared_quad_state_list
.push_back(shared_state3_cmp
.Pass());
418 pass_cmp
->quad_list
.push_back(solidcolor_cmp
.PassAs
<DrawQuad
>());
419 pass_cmp
->quad_list
.push_back(streamvideo_cmp
.PassAs
<DrawQuad
>());
420 pass_cmp
->quad_list
.push_back(texture_cmp
.PassAs
<DrawQuad
>());
421 pass_cmp
->quad_list
.push_back(tile_cmp
.PassAs
<DrawQuad
>());
422 pass_cmp
->quad_list
.push_back(yuvvideo_cmp
.PassAs
<DrawQuad
>());
424 // Make sure the in and cmp RenderPasses match.
425 Compare(pass_cmp
.get(), pass_in
.get());
426 ASSERT_EQ(3u, pass_in
->shared_quad_state_list
.size());
427 ASSERT_EQ(9u, pass_in
->quad_list
.size());
428 for (size_t i
= 0; i
< 3; ++i
) {
429 Compare(pass_cmp
->shared_quad_state_list
[i
],
430 pass_in
->shared_quad_state_list
[i
]);
432 for (size_t i
= 0; i
< pass_in
->quad_list
.size(); ++i
)
433 Compare(pass_cmp
->quad_list
[i
], pass_in
->quad_list
[i
]);
434 for (size_t i
= 1; i
< pass_in
->quad_list
.size(); ++i
) {
435 bool same_shared_quad_state_cmp
=
436 pass_cmp
->quad_list
[i
]->shared_quad_state
==
437 pass_cmp
->quad_list
[i
- 1]->shared_quad_state
;
438 bool same_shared_quad_state_in
=
439 pass_in
->quad_list
[i
]->shared_quad_state
==
440 pass_in
->quad_list
[i
- 1]->shared_quad_state
;
441 EXPECT_EQ(same_shared_quad_state_cmp
, same_shared_quad_state_in
);
444 DelegatedFrameData frame_in
;
445 frame_in
.render_pass_list
.push_back(pass_in
.Pass());
447 IPC::ParamTraits
<DelegatedFrameData
>::Write(&msg
, frame_in
);
449 DelegatedFrameData frame_out
;
450 PickleIterator
iter(msg
);
451 EXPECT_TRUE(IPC::ParamTraits
<DelegatedFrameData
>::Read(&msg
,
454 // Make sure the out and cmp RenderPasses match.
455 scoped_ptr
<RenderPass
> pass_out
= frame_out
.render_pass_list
.take(
456 frame_out
.render_pass_list
.begin());
457 Compare(pass_cmp
.get(), pass_out
.get());
458 ASSERT_EQ(3u, pass_out
->shared_quad_state_list
.size());
459 ASSERT_EQ(9u, pass_out
->quad_list
.size());
460 for (size_t i
= 0; i
< 3; ++i
) {
461 Compare(pass_cmp
->shared_quad_state_list
[i
],
462 pass_out
->shared_quad_state_list
[i
]);
464 for (size_t i
= 0; i
< pass_out
->quad_list
.size(); ++i
)
465 Compare(pass_cmp
->quad_list
[i
], pass_out
->quad_list
[i
]);
466 for (size_t i
= 1; i
< pass_out
->quad_list
.size(); ++i
) {
467 bool same_shared_quad_state_cmp
=
468 pass_cmp
->quad_list
[i
]->shared_quad_state
==
469 pass_cmp
->quad_list
[i
- 1]->shared_quad_state
;
470 bool same_shared_quad_state_out
=
471 pass_out
->quad_list
[i
]->shared_quad_state
==
472 pass_out
->quad_list
[i
- 1]->shared_quad_state
;
473 EXPECT_EQ(same_shared_quad_state_cmp
, same_shared_quad_state_out
);
477 TEST_F(CCMessagesTest
, Resources
) {
478 IPC::Message
msg(1, 2, IPC::Message::PRIORITY_NORMAL
);
479 gfx::Size
arbitrary_size(757, 1281);
480 unsigned int arbitrary_uint1
= 71234838;
481 unsigned int arbitrary_uint2
= 53589793;
483 GLbyte arbitrary_mailbox1
[64] = {
484 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
485 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
486 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
490 GLbyte arbitrary_mailbox2
[64] = {
491 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0,
492 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0,
493 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0,
497 TransferableResource arbitrary_resource1
;
498 arbitrary_resource1
.id
= 2178312;
499 arbitrary_resource1
.sync_point
= arbitrary_uint1
;
500 arbitrary_resource1
.format
= 7;
501 arbitrary_resource1
.filter
= 53;
502 arbitrary_resource1
.size
= gfx::Size(37189, 123123);
503 arbitrary_resource1
.mailbox
.SetName(arbitrary_mailbox1
);
505 TransferableResource arbitrary_resource2
;
506 arbitrary_resource2
.id
= 789132;
507 arbitrary_resource1
.sync_point
= arbitrary_uint2
;
508 arbitrary_resource2
.format
= 30;
509 arbitrary_resource1
.filter
= 47;
510 arbitrary_resource2
.size
= gfx::Size(89123, 23789);
511 arbitrary_resource2
.mailbox
.SetName(arbitrary_mailbox2
);
513 DelegatedFrameData frame_in
;
514 frame_in
.resource_list
.push_back(arbitrary_resource1
);
515 frame_in
.resource_list
.push_back(arbitrary_resource2
);
517 IPC::ParamTraits
<DelegatedFrameData
>::Write(&msg
, frame_in
);
519 DelegatedFrameData frame_out
;
520 PickleIterator
iter(msg
);
521 EXPECT_TRUE(IPC::ParamTraits
<DelegatedFrameData
>::Read(&msg
,
524 ASSERT_EQ(2u, frame_out
.resource_list
.size());
525 Compare(arbitrary_resource1
, frame_out
.resource_list
[0]);
526 Compare(arbitrary_resource2
, frame_out
.resource_list
[1]);
530 } // namespace content