| Index: ipc/ipc_message_utils.cc | 
| diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc | 
| index 8053318110d78f2eda9b81f9721a9070c59f6c29..db36c0fe7a62622fd0b7e4489c2bfdfd26f4a2f7 100644 | 
| --- a/ipc/ipc_message_utils.cc | 
| +++ b/ipc/ipc_message_utils.cc | 
| @@ -10,6 +10,7 @@ | 
| #include "base/files/file_path.h" | 
| #include "base/json/json_writer.h" | 
| #include "base/memory/ptr_util.h" | 
| +#include "base/memory/shared_memory_handle.h" | 
| #include "base/strings/nullable_string16.h" | 
| #include "base/strings/string_number_conversions.h" | 
| #include "base/strings/utf_string_conversions.h" | 
| @@ -27,10 +28,6 @@ | 
| #include "ipc/ipc_platform_file_attachment_posix.h" | 
| #endif | 
|  | 
| -#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) | 
| -#include "base/memory/shared_memory_handle.h" | 
| -#endif  // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN) | 
| - | 
| #if defined(OS_MACOSX) && !defined(OS_IOS) | 
| #include "ipc/mach_port_mac.h" | 
| #endif | 
| @@ -647,7 +644,6 @@ bool ParamTraits<base::FileDescriptor>::Read(const base::Pickle* m, | 
| if (!ReadParam(m, iter, &valid)) | 
| return false; | 
|  | 
| -  // TODO(morrita): Seems like this should return false. | 
| if (!valid) | 
| return true; | 
|  | 
| @@ -781,6 +777,69 @@ void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, | 
| l->append(" needs brokering: "); | 
| LogParam(p.NeedsBrokering(), l); | 
| } | 
| +#elif defined(OS_POSIX) | 
| +void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer, | 
| +                                                    const param_type& p) { | 
| +  GetParamSize(sizer, p.IsValid()); | 
| +  if (p.IsValid()) | 
| +    sizer->AddAttachment(); | 
| +} | 
| + | 
| +void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m, | 
| +                                                  const param_type& p) { | 
| +  const bool valid = p.IsValid(); | 
| +  WriteParam(m, valid); | 
| + | 
| +  if (!valid) | 
| +    return; | 
| + | 
| +  if (p.OwnershipPassesToIPC()) { | 
| +    if (!m->WriteAttachment(new internal::PlatformFileAttachment( | 
| +            base::ScopedFD(p.GetHandle())))) | 
| +      NOTREACHED(); | 
| +  } else { | 
| +    if (!m->WriteAttachment( | 
| +            new internal::PlatformFileAttachment(p.GetHandle()))) | 
| +      NOTREACHED(); | 
| +  } | 
| +} | 
| + | 
| +bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m, | 
| +                                                 base::PickleIterator* iter, | 
| +                                                 param_type* r) { | 
| +  *r = base::SharedMemoryHandle(); | 
| + | 
| +  bool valid; | 
| +  if (!ReadParam(m, iter, &valid)) | 
| +    return false; | 
| + | 
| +  if (!valid) | 
| +    return true; | 
| + | 
| +  scoped_refptr<base::Pickle::Attachment> attachment; | 
| +  if (!m->ReadAttachment(iter, &attachment)) | 
| +    return false; | 
| + | 
| +  if (static_cast<MessageAttachment*>(attachment.get())->GetType() != | 
| +      MessageAttachment::Type::PLATFORM_FILE) { | 
| +    return false; | 
| +  } | 
| + | 
| +  *r = base::SharedMemoryHandle(base::FileDescriptor( | 
| +      static_cast<internal::PlatformFileAttachment*>(attachment.get()) | 
| +          ->TakePlatformFile(), | 
| +      true)); | 
| +  return true; | 
| +} | 
| + | 
| +void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, | 
| +                                                std::string* l) { | 
| +  if (p.OwnershipPassesToIPC()) { | 
| +    l->append(base::StringPrintf("FD(%d auto-close)", p.GetHandle())); | 
| +  } else { | 
| +    l->append(base::StringPrintf("FD(%d)", p.GetHandle())); | 
| +  } | 
| +} | 
| #endif  // defined(OS_MACOSX) && !defined(OS_IOS) | 
|  | 
| void ParamTraits<base::FilePath>::GetSize(base::PickleSizer* sizer, | 
|  |