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