15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_messages.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/common_param_traits.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handler.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "extensions/common/permissions/permissions_info.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermission;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermissionInfo;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermissionSet;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest;
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::ManifestHandler;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::ManifestPermission;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using extensions::ManifestPermissionSet;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::PermissionSet;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::URLPatternSet;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionMsg_Loaded_Params::ExtensionMsg_Loaded_Params()
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : location(Manifest::INVALID_LOCATION),
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      creation_flags(Extension::NO_FLAGS){}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionMsg_Loaded_Params::~ExtensionMsg_Loaded_Params() {}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionMsg_Loaded_Params::ExtensionMsg_Loaded_Params(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : manifest(extension->manifest()->value()->DeepCopy()),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location(extension->location()),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      path(extension->path()),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      apis(extension->GetActivePermissions()->apis()),
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      manifest_permissions(
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          extension->GetActivePermissions()->manifest_permissions()),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      explicit_hosts(extension->GetActivePermissions()->explicit_hosts()),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scriptable_hosts(extension->GetActivePermissions()->scriptable_hosts()),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id(extension->id()),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      creation_flags(extension->creation_flags()) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_refptr<Extension> ExtensionMsg_Loaded_Params::ConvertToExtension(
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string* error) const {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> extension =
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Extension::Create(path, location, *manifest, creation_flags, error);
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (extension.get()) {
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    extensions::PermissionsData::SetActivePermissions(
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        extension.get(),
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        new PermissionSet(apis, manifest_permissions,
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                          explicit_hosts, scriptable_hosts));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extension;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ParamTraits<Manifest::Location> {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef Manifest::Location param_type;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Write(Message* m, const param_type& p) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val = static_cast<int>(p);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteParam(m, val);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool Read(const Message* m, PickleIterator* iter, param_type* p) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ReadParam(m, iter, &val) ||
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        val < Manifest::INVALID_LOCATION ||
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        val >= Manifest::NUM_LOCATIONS)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *p = static_cast<param_type>(val);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Log(const param_type& p, std::string* l) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ParamTraits<int>::Log(static_cast<int>(p), l);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<URLPattern>::Write(Message* m, const param_type& p) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.valid_schemes());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.GetAsString());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<URLPattern>::Read(const Message* m, PickleIterator* iter,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   param_type* p) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int valid_schemes;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string spec;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadParam(m, iter, &valid_schemes) ||
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !ReadParam(m, iter, &spec))
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jstritar): We don't want the URLPattern to fail parsing when the
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scheme is invalid. Instead, the pattern should parse but it should not
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // match the invalid patterns. We get around this by setting the valid
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // schemes after parsing the pattern. Update these method calls once we can
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ignore scheme validation with URLPattern parse options. crbug.com/90544
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->SetValidSchemes(URLPattern::SCHEME_ALL);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPattern::ParseResult result = p->Parse(spec);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->SetValidSchemes(valid_schemes);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return URLPattern::PARSE_SUCCESS == result;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<URLPattern>::Log(const param_type& p, std::string* l) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LogParam(p.GetAsString(), l);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<URLPatternSet>::Write(Message* m, const param_type& p) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.patterns());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<URLPatternSet>::Read(const Message* m, PickleIterator* iter,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        param_type* p) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<URLPattern> patterns;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadParam(m, iter, &patterns))
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<URLPattern>::iterator i = patterns.begin();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != patterns.end(); ++i)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->AddPattern(*i);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<URLPatternSet>::Log(const param_type& p, std::string* l) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LogParam(p.patterns(), l);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<APIPermission::ID>::Write(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Message* m, const param_type& p) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, static_cast<int>(p));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<APIPermission::ID>::Read(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* p) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int api_id = -2;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadParam(m, iter, &api_id))
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *p = static_cast<APIPermission::ID>(api_id);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<APIPermission::ID>::Log(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const param_type& p, std::string* l) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LogParam(static_cast<int>(p), l);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<APIPermission*>::Log(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const param_type& p, std::string* l) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->Log(l);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<APIPermissionSet>::Write(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Message* m, const param_type& p) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet::const_iterator it = p.begin();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const APIPermissionSet::const_iterator end = p.end();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.size());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; it != end; ++it) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteParam(m, it->id());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    it->Write(m);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<APIPermissionSet>::Read(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* r) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadParam(m, iter, &size))
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < size; ++i) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    APIPermission::ID id;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ReadParam(m, iter, &id))
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const APIPermissionInfo* permission_info =
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::PermissionsInfo::GetInstance()->GetByID(id);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!permission_info)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<APIPermission> p(permission_info->CreateAPIPermission());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!p->Read(m, iter))
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->insert(p.release());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<APIPermissionSet>::Log(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const param_type& p, std::string* l) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LogParam(p.map(), l);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ParamTraits<ManifestPermissionSet>::Write(
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Message* m, const param_type& p) {
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ManifestPermissionSet::const_iterator it = p.begin();
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const ManifestPermissionSet::const_iterator end = p.end();
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WriteParam(m, p.size());
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (; it != end; ++it) {
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    WriteParam(m, it->name());
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    it->Write(m);
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ParamTraits<ManifestPermissionSet>::Read(
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const Message* m, PickleIterator* iter, param_type* r) {
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t size;
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!ReadParam(m, iter, &size))
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < size; ++i) {
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string name;
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!ReadParam(m, iter, &name))
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return false;
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<ManifestPermission> p(ManifestHandler::CreatePermission(name));
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!p)
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return false;
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!p->Read(m, iter))
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return false;
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    r->insert(p.release());
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ParamTraits<ManifestPermissionSet>::Log(
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const param_type& p, std::string* l) {
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LogParam(p.map(), l);
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<ExtensionMsg_Loaded_Params>::Write(Message* m,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    const param_type& p) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.location);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.path);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, *(p.manifest));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.creation_flags);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.apis);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.explicit_hosts);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteParam(m, p.scriptable_hosts);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParamTraits<ExtensionMsg_Loaded_Params>::Read(const Message* m,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   PickleIterator* iter,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   param_type* p) {
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  p->manifest.reset(new base::DictionaryValue());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ReadParam(m, iter, &p->location) &&
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ReadParam(m, iter, &p->path) &&
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ReadParam(m, iter, p->manifest.get()) &&
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ReadParam(m, iter, &p->creation_flags) &&
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ReadParam(m, iter, &p->apis) &&
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ReadParam(m, iter, &p->explicit_hosts) &&
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ReadParam(m, iter, &p->scriptable_hosts);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ParamTraits<ExtensionMsg_Loaded_Params>::Log(const param_type& p,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  std::string* l) {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  l->append(p.id);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
257