| OLD | NEW |
| (Empty) |
| 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. | |
| 4 | |
| 5 #include "chrome/common/extensions/extension_messages.h" | |
| 6 | |
| 7 #include "chrome/common/extensions/extension_constants.h" | |
| 8 #include "content/public/common/common_param_traits.h" | |
| 9 #include "extensions/common/extension.h" | |
| 10 #include "extensions/common/manifest.h" | |
| 11 #include "extensions/common/manifest_handler.h" | |
| 12 #include "extensions/common/permissions/permissions_data.h" | |
| 13 #include "extensions/common/permissions/permissions_info.h" | |
| 14 | |
| 15 using extensions::APIPermission; | |
| 16 using extensions::APIPermissionInfo; | |
| 17 using extensions::APIPermissionSet; | |
| 18 using extensions::Extension; | |
| 19 using extensions::Manifest; | |
| 20 using extensions::ManifestHandler; | |
| 21 using extensions::ManifestPermission; | |
| 22 using extensions::ManifestPermissionSet; | |
| 23 using extensions::PermissionSet; | |
| 24 using extensions::URLPatternSet; | |
| 25 | |
| 26 ExtensionMsg_Loaded_Params::ExtensionMsg_Loaded_Params() | |
| 27 : location(Manifest::INVALID_LOCATION), | |
| 28 creation_flags(Extension::NO_FLAGS){} | |
| 29 | |
| 30 ExtensionMsg_Loaded_Params::~ExtensionMsg_Loaded_Params() {} | |
| 31 | |
| 32 ExtensionMsg_Loaded_Params::ExtensionMsg_Loaded_Params( | |
| 33 const Extension* extension) | |
| 34 : manifest(extension->manifest()->value()->DeepCopy()), | |
| 35 location(extension->location()), | |
| 36 path(extension->path()), | |
| 37 apis(extension->GetActivePermissions()->apis()), | |
| 38 manifest_permissions( | |
| 39 extension->GetActivePermissions()->manifest_permissions()), | |
| 40 explicit_hosts(extension->GetActivePermissions()->explicit_hosts()), | |
| 41 scriptable_hosts(extension->GetActivePermissions()->scriptable_hosts()), | |
| 42 id(extension->id()), | |
| 43 creation_flags(extension->creation_flags()) { | |
| 44 } | |
| 45 | |
| 46 scoped_refptr<Extension> ExtensionMsg_Loaded_Params::ConvertToExtension( | |
| 47 std::string* error) const { | |
| 48 scoped_refptr<Extension> extension = | |
| 49 Extension::Create(path, location, *manifest, creation_flags, error); | |
| 50 if (extension.get()) { | |
| 51 extensions::PermissionsData::SetActivePermissions( | |
| 52 extension.get(), | |
| 53 new PermissionSet(apis, manifest_permissions, | |
| 54 explicit_hosts, scriptable_hosts)); | |
| 55 } | |
| 56 return extension; | |
| 57 } | |
| 58 | |
| 59 namespace IPC { | |
| 60 | |
| 61 template <> | |
| 62 struct ParamTraits<Manifest::Location> { | |
| 63 typedef Manifest::Location param_type; | |
| 64 static void Write(Message* m, const param_type& p) { | |
| 65 int val = static_cast<int>(p); | |
| 66 WriteParam(m, val); | |
| 67 } | |
| 68 static bool Read(const Message* m, PickleIterator* iter, param_type* p) { | |
| 69 int val = 0; | |
| 70 if (!ReadParam(m, iter, &val) || | |
| 71 val < Manifest::INVALID_LOCATION || | |
| 72 val >= Manifest::NUM_LOCATIONS) | |
| 73 return false; | |
| 74 *p = static_cast<param_type>(val); | |
| 75 return true; | |
| 76 } | |
| 77 static void Log(const param_type& p, std::string* l) { | |
| 78 ParamTraits<int>::Log(static_cast<int>(p), l); | |
| 79 } | |
| 80 }; | |
| 81 | |
| 82 void ParamTraits<URLPattern>::Write(Message* m, const param_type& p) { | |
| 83 WriteParam(m, p.valid_schemes()); | |
| 84 WriteParam(m, p.GetAsString()); | |
| 85 } | |
| 86 | |
| 87 bool ParamTraits<URLPattern>::Read(const Message* m, PickleIterator* iter, | |
| 88 param_type* p) { | |
| 89 int valid_schemes; | |
| 90 std::string spec; | |
| 91 if (!ReadParam(m, iter, &valid_schemes) || | |
| 92 !ReadParam(m, iter, &spec)) | |
| 93 return false; | |
| 94 | |
| 95 // TODO(jstritar): We don't want the URLPattern to fail parsing when the | |
| 96 // scheme is invalid. Instead, the pattern should parse but it should not | |
| 97 // match the invalid patterns. We get around this by setting the valid | |
| 98 // schemes after parsing the pattern. Update these method calls once we can | |
| 99 // ignore scheme validation with URLPattern parse options. crbug.com/90544 | |
| 100 p->SetValidSchemes(URLPattern::SCHEME_ALL); | |
| 101 URLPattern::ParseResult result = p->Parse(spec); | |
| 102 p->SetValidSchemes(valid_schemes); | |
| 103 return URLPattern::PARSE_SUCCESS == result; | |
| 104 } | |
| 105 | |
| 106 void ParamTraits<URLPattern>::Log(const param_type& p, std::string* l) { | |
| 107 LogParam(p.GetAsString(), l); | |
| 108 } | |
| 109 | |
| 110 void ParamTraits<URLPatternSet>::Write(Message* m, const param_type& p) { | |
| 111 WriteParam(m, p.patterns()); | |
| 112 } | |
| 113 | |
| 114 bool ParamTraits<URLPatternSet>::Read(const Message* m, PickleIterator* iter, | |
| 115 param_type* p) { | |
| 116 std::set<URLPattern> patterns; | |
| 117 if (!ReadParam(m, iter, &patterns)) | |
| 118 return false; | |
| 119 | |
| 120 for (std::set<URLPattern>::iterator i = patterns.begin(); | |
| 121 i != patterns.end(); ++i) | |
| 122 p->AddPattern(*i); | |
| 123 return true; | |
| 124 } | |
| 125 | |
| 126 void ParamTraits<URLPatternSet>::Log(const param_type& p, std::string* l) { | |
| 127 LogParam(p.patterns(), l); | |
| 128 } | |
| 129 | |
| 130 void ParamTraits<APIPermission::ID>::Write( | |
| 131 Message* m, const param_type& p) { | |
| 132 WriteParam(m, static_cast<int>(p)); | |
| 133 } | |
| 134 | |
| 135 bool ParamTraits<APIPermission::ID>::Read( | |
| 136 const Message* m, PickleIterator* iter, param_type* p) { | |
| 137 int api_id = -2; | |
| 138 if (!ReadParam(m, iter, &api_id)) | |
| 139 return false; | |
| 140 | |
| 141 *p = static_cast<APIPermission::ID>(api_id); | |
| 142 return true; | |
| 143 } | |
| 144 | |
| 145 void ParamTraits<APIPermission::ID>::Log( | |
| 146 const param_type& p, std::string* l) { | |
| 147 LogParam(static_cast<int>(p), l); | |
| 148 } | |
| 149 | |
| 150 void ParamTraits<APIPermission*>::Log( | |
| 151 const param_type& p, std::string* l) { | |
| 152 p->Log(l); | |
| 153 } | |
| 154 | |
| 155 void ParamTraits<APIPermissionSet>::Write( | |
| 156 Message* m, const param_type& p) { | |
| 157 APIPermissionSet::const_iterator it = p.begin(); | |
| 158 const APIPermissionSet::const_iterator end = p.end(); | |
| 159 WriteParam(m, p.size()); | |
| 160 for (; it != end; ++it) { | |
| 161 WriteParam(m, it->id()); | |
| 162 it->Write(m); | |
| 163 } | |
| 164 } | |
| 165 | |
| 166 bool ParamTraits<APIPermissionSet>::Read( | |
| 167 const Message* m, PickleIterator* iter, param_type* r) { | |
| 168 size_t size; | |
| 169 if (!ReadParam(m, iter, &size)) | |
| 170 return false; | |
| 171 for (size_t i = 0; i < size; ++i) { | |
| 172 APIPermission::ID id; | |
| 173 if (!ReadParam(m, iter, &id)) | |
| 174 return false; | |
| 175 const APIPermissionInfo* permission_info = | |
| 176 extensions::PermissionsInfo::GetInstance()->GetByID(id); | |
| 177 if (!permission_info) | |
| 178 return false; | |
| 179 scoped_ptr<APIPermission> p(permission_info->CreateAPIPermission()); | |
| 180 if (!p->Read(m, iter)) | |
| 181 return false; | |
| 182 r->insert(p.release()); | |
| 183 } | |
| 184 return true; | |
| 185 } | |
| 186 | |
| 187 void ParamTraits<APIPermissionSet>::Log( | |
| 188 const param_type& p, std::string* l) { | |
| 189 LogParam(p.map(), l); | |
| 190 } | |
| 191 | |
| 192 void ParamTraits<ManifestPermissionSet>::Write( | |
| 193 Message* m, const param_type& p) { | |
| 194 ManifestPermissionSet::const_iterator it = p.begin(); | |
| 195 const ManifestPermissionSet::const_iterator end = p.end(); | |
| 196 WriteParam(m, p.size()); | |
| 197 for (; it != end; ++it) { | |
| 198 WriteParam(m, it->name()); | |
| 199 it->Write(m); | |
| 200 } | |
| 201 } | |
| 202 | |
| 203 bool ParamTraits<ManifestPermissionSet>::Read( | |
| 204 const Message* m, PickleIterator* iter, param_type* r) { | |
| 205 size_t size; | |
| 206 if (!ReadParam(m, iter, &size)) | |
| 207 return false; | |
| 208 for (size_t i = 0; i < size; ++i) { | |
| 209 std::string name; | |
| 210 if (!ReadParam(m, iter, &name)) | |
| 211 return false; | |
| 212 scoped_ptr<ManifestPermission> p(ManifestHandler::CreatePermission(name)); | |
| 213 if (!p) | |
| 214 return false; | |
| 215 if (!p->Read(m, iter)) | |
| 216 return false; | |
| 217 r->insert(p.release()); | |
| 218 } | |
| 219 return true; | |
| 220 } | |
| 221 | |
| 222 void ParamTraits<ManifestPermissionSet>::Log( | |
| 223 const param_type& p, std::string* l) { | |
| 224 LogParam(p.map(), l); | |
| 225 } | |
| 226 | |
| 227 void ParamTraits<ExtensionMsg_Loaded_Params>::Write(Message* m, | |
| 228 const param_type& p) { | |
| 229 WriteParam(m, p.location); | |
| 230 WriteParam(m, p.path); | |
| 231 WriteParam(m, *(p.manifest)); | |
| 232 WriteParam(m, p.creation_flags); | |
| 233 WriteParam(m, p.apis); | |
| 234 WriteParam(m, p.explicit_hosts); | |
| 235 WriteParam(m, p.scriptable_hosts); | |
| 236 } | |
| 237 | |
| 238 bool ParamTraits<ExtensionMsg_Loaded_Params>::Read(const Message* m, | |
| 239 PickleIterator* iter, | |
| 240 param_type* p) { | |
| 241 p->manifest.reset(new base::DictionaryValue()); | |
| 242 return ReadParam(m, iter, &p->location) && | |
| 243 ReadParam(m, iter, &p->path) && | |
| 244 ReadParam(m, iter, p->manifest.get()) && | |
| 245 ReadParam(m, iter, &p->creation_flags) && | |
| 246 ReadParam(m, iter, &p->apis) && | |
| 247 ReadParam(m, iter, &p->explicit_hosts) && | |
| 248 ReadParam(m, iter, &p->scriptable_hosts); | |
| 249 } | |
| 250 | |
| 251 void ParamTraits<ExtensionMsg_Loaded_Params>::Log(const param_type& p, | |
| 252 std::string* l) { | |
| 253 l->append(p.id); | |
| 254 } | |
| 255 | |
| 256 } // namespace IPC | |
| OLD | NEW |