| Index: content/common/cc_messages.cc | 
| diff --git a/content/common/cc_messages.cc b/content/common/cc_messages.cc | 
| index 04d3af94def7b2723222d07a17c29e100eedafe6..f141d4dfe602f3d5deba605719890af6018758ad 100644 | 
| --- a/content/common/cc_messages.cc | 
| +++ b/content/common/cc_messages.cc | 
| @@ -569,7 +569,68 @@ void ParamTraits<cc::Mailbox>::Log(const param_type& p, std::string* l) { | 
| *l += base::StringPrintf("%02x", p.name[i]); | 
| } | 
|  | 
| -void ParamTraits<cc::CompositorFrame>::Write(Message* m, const param_type& p) { | 
| +namespace { | 
| +  enum CompositorFrameType { | 
| +    DELEGATED_FRAME, | 
| +    GL_FRAME, | 
| +  }; | 
| +} | 
| + | 
| +void ParamTraits<cc::CompositorFrame>::Write(Message* m, | 
| +                                             const param_type& p) { | 
| +  WriteParam(m, p.metadata); | 
| +  if (p.delegated_frame_data) { | 
| +    DCHECK(!p.gl_frame_data); | 
| +    WriteParam(m, static_cast<int>(DELEGATED_FRAME)); | 
| +    WriteParam(m, *p.delegated_frame_data); | 
| +  } else { | 
| +    DCHECK(p.gl_frame_data); | 
| +    WriteParam(m, static_cast<int>(GL_FRAME)); | 
| +    WriteParam(m, *p.gl_frame_data); | 
| +  } | 
| +} | 
| + | 
| +bool ParamTraits<cc::CompositorFrame>::Read(const Message* m, | 
| +                                            PickleIterator* iter, | 
| +                                            param_type* p) { | 
| +  if (!ReadParam(m, iter, &p->metadata)) | 
| +    return false; | 
| + | 
| +  int compositor_frame_type; | 
| +  if (!ReadParam(m, iter, &compositor_frame_type)) | 
| +    return false; | 
| + | 
| +  switch (compositor_frame_type) { | 
| +    case DELEGATED_FRAME: | 
| +      p->delegated_frame_data.reset(new cc::DelegatedFrameData()); | 
| +      if (!ReadParam(m, iter, p->delegated_frame_data.get())) | 
| +        return false; | 
| +      break; | 
| +    case GL_FRAME: | 
| +      p->gl_frame_data.reset(new cc::GLFrameData()); | 
| +      if (!ReadParam(m, iter, p->gl_frame_data.get())) | 
| +        return false; | 
| +      break; | 
| +    default: | 
| +      return false; | 
| +  } | 
| +  return true; | 
| +} | 
| + | 
| +void ParamTraits<cc::CompositorFrame>::Log(const param_type& p, | 
| +                                           std::string* l) { | 
| +  l->append("CompositorFrame("); | 
| +  LogParam(p.metadata, l); | 
| +  l->append(", "); | 
| +  if (p.delegated_frame_data) | 
| +    LogParam(*p.delegated_frame_data, l); | 
| +  else if (p.gl_frame_data) | 
| +    LogParam(*p.gl_frame_data, l); | 
| +  l->append(")"); | 
| +} | 
| + | 
| +void ParamTraits<cc::DelegatedFrameData>::Write(Message* m, | 
| +                                                const param_type& p) { | 
| WriteParam(m, p.size); | 
| WriteParam(m, p.resource_list); | 
| WriteParam(m, p.render_pass_list.size()); | 
| @@ -577,9 +638,9 @@ void ParamTraits<cc::CompositorFrame>::Write(Message* m, const param_type& p) { | 
| WriteParam(m, *p.render_pass_list[i]); | 
| } | 
|  | 
| -bool ParamTraits<cc::CompositorFrame>::Read(const Message* m, | 
| -                                            PickleIterator* iter, | 
| -                                            param_type* p) { | 
| +bool ParamTraits<cc::DelegatedFrameData>::Read(const Message* m, | 
| +                                               PickleIterator* iter, | 
| +                                               param_type* p) { | 
| const static size_t kMaxRenderPasses = 10000; | 
|  | 
| size_t num_render_passes; | 
| @@ -597,9 +658,9 @@ bool ParamTraits<cc::CompositorFrame>::Read(const Message* m, | 
| return true; | 
| } | 
|  | 
| -void ParamTraits<cc::CompositorFrame>::Log(const param_type& p, | 
| -                                           std::string* l) { | 
| -  l->append("CompositorFrame("); | 
| +void ParamTraits<cc::DelegatedFrameData>::Log(const param_type& p, | 
| +                                              std::string* l) { | 
| +  l->append("DelegatedFrameData("); | 
| LogParam(p.size, l); | 
| l->append(", "); | 
| LogParam(p.resource_list, l); | 
|  |