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.
5 #include "chrome/common/extensions/extension_messages.h"
7 #include "chrome/common/extensions/extension.h"
8 #include "chrome/common/extensions/extension_constants.h"
9 #include "chrome/common/extensions/permissions/permissions_data.h"
10 #include "content/public/common/common_param_traits.h"
11 #include "extensions/common/manifest.h"
12 #include "extensions/common/permissions/permissions_info.h"
14 using extensions::APIPermission;
15 using extensions::APIPermissionInfo;
16 using extensions::APIPermissionMap;
17 using extensions::APIPermissionSet;
18 using extensions::Extension;
19 using extensions::Manifest;
20 using extensions::PermissionSet;
21 using extensions::URLPatternSet;
23 ExtensionMsg_Loaded_Params::ExtensionMsg_Loaded_Params()
24 : location(Manifest::INVALID_LOCATION),
25 creation_flags(Extension::NO_FLAGS){}
27 ExtensionMsg_Loaded_Params::~ExtensionMsg_Loaded_Params() {}
29 ExtensionMsg_Loaded_Params::ExtensionMsg_Loaded_Params(
30 const Extension* extension)
31 : manifest(extension->manifest()->value()->DeepCopy()),
32 location(extension->location()),
33 path(extension->path()),
34 apis(extension->GetActivePermissions()->apis()),
35 explicit_hosts(extension->GetActivePermissions()->explicit_hosts()),
36 scriptable_hosts(extension->GetActivePermissions()->scriptable_hosts()),
38 creation_flags(extension->creation_flags()) {
41 scoped_refptr<Extension> ExtensionMsg_Loaded_Params::ConvertToExtension(
42 std::string* error) const {
43 scoped_refptr<Extension> extension =
44 Extension::Create(path, location, *manifest, creation_flags, error);
45 if (extension.get()) {
46 extensions::PermissionsData::SetActivePermissions(
48 new PermissionSet(apis, explicit_hosts, scriptable_hosts));
56 struct ParamTraits<Manifest::Location> {
57 typedef Manifest::Location param_type;
58 static void Write(Message* m, const param_type& p) {
59 int val = static_cast<int>(p);
62 static bool Read(const Message* m, PickleIterator* iter, param_type* p) {
64 if (!ReadParam(m, iter, &val) ||
65 val < Manifest::INVALID_LOCATION ||
66 val >= Manifest::NUM_LOCATIONS)
68 *p = static_cast<param_type>(val);
71 static void Log(const param_type& p, std::string* l) {
72 ParamTraits<int>::Log(static_cast<int>(p), l);
76 void ParamTraits<URLPattern>::Write(Message* m, const param_type& p) {
77 WriteParam(m, p.valid_schemes());
78 WriteParam(m, p.GetAsString());
81 bool ParamTraits<URLPattern>::Read(const Message* m, PickleIterator* iter,
85 if (!ReadParam(m, iter, &valid_schemes) ||
86 !ReadParam(m, iter, &spec))
89 // TODO(jstritar): We don't want the URLPattern to fail parsing when the
90 // scheme is invalid. Instead, the pattern should parse but it should not
91 // match the invalid patterns. We get around this by setting the valid
92 // schemes after parsing the pattern. Update these method calls once we can
93 // ignore scheme validation with URLPattern parse options. crbug.com/90544
94 p->SetValidSchemes(URLPattern::SCHEME_ALL);
95 URLPattern::ParseResult result = p->Parse(spec);
96 p->SetValidSchemes(valid_schemes);
97 return URLPattern::PARSE_SUCCESS == result;
100 void ParamTraits<URLPattern>::Log(const param_type& p, std::string* l) {
101 LogParam(p.GetAsString(), l);
104 void ParamTraits<URLPatternSet>::Write(Message* m, const param_type& p) {
105 WriteParam(m, p.patterns());
108 bool ParamTraits<URLPatternSet>::Read(const Message* m, PickleIterator* iter,
110 std::set<URLPattern> patterns;
111 if (!ReadParam(m, iter, &patterns))
114 for (std::set<URLPattern>::iterator i = patterns.begin();
115 i != patterns.end(); ++i)
120 void ParamTraits<URLPatternSet>::Log(const param_type& p, std::string* l) {
121 LogParam(p.patterns(), l);
124 void ParamTraits<APIPermission::ID>::Write(
125 Message* m, const param_type& p) {
126 WriteParam(m, static_cast<int>(p));
129 bool ParamTraits<APIPermission::ID>::Read(
130 const Message* m, PickleIterator* iter, param_type* p) {
132 if (!ReadParam(m, iter, &api_id))
135 *p = static_cast<APIPermission::ID>(api_id);
139 void ParamTraits<APIPermission::ID>::Log(
140 const param_type& p, std::string* l) {
141 LogParam(static_cast<int>(p), l);
144 void ParamTraits<APIPermission*>::Log(
145 const param_type& p, std::string* l) {
149 void ParamTraits<APIPermissionSet>::Write(
150 Message* m, const param_type& p) {
151 APIPermissionSet::const_iterator it = p.begin();
152 const APIPermissionSet::const_iterator end = p.end();
153 WriteParam(m, p.size());
154 for (; it != end; ++it) {
155 WriteParam(m, it->id());
160 bool ParamTraits<APIPermissionSet>::Read(
161 const Message* m, PickleIterator* iter, param_type* r) {
163 if (!ReadParam(m, iter, &size))
165 for (size_t i = 0; i < size; ++i) {
166 APIPermission::ID id;
167 if (!ReadParam(m, iter, &id))
169 const APIPermissionInfo* permission_info =
170 extensions::PermissionsInfo::GetInstance()->GetByID(id);
171 if (!permission_info)
173 scoped_ptr<APIPermission> p(permission_info->CreateAPIPermission());
174 if (!p->Read(m, iter))
176 r->insert(p.release());
181 void ParamTraits<APIPermissionSet>::Log(
182 const param_type& p, std::string* l) {
183 LogParam(p.map(), l);
186 void ParamTraits<ExtensionMsg_Loaded_Params>::Write(Message* m,
187 const param_type& p) {
188 WriteParam(m, p.location);
189 WriteParam(m, p.path);
190 WriteParam(m, *(p.manifest));
191 WriteParam(m, p.creation_flags);
192 WriteParam(m, p.apis);
193 WriteParam(m, p.explicit_hosts);
194 WriteParam(m, p.scriptable_hosts);
197 bool ParamTraits<ExtensionMsg_Loaded_Params>::Read(const Message* m,
198 PickleIterator* iter,
200 p->manifest.reset(new base::DictionaryValue());
201 return ReadParam(m, iter, &p->location) &&
202 ReadParam(m, iter, &p->path) &&
203 ReadParam(m, iter, p->manifest.get()) &&
204 ReadParam(m, iter, &p->creation_flags) &&
205 ReadParam(m, iter, &p->apis) &&
206 ReadParam(m, iter, &p->explicit_hosts) &&
207 ReadParam(m, iter, &p->scriptable_hosts);
210 void ParamTraits<ExtensionMsg_Loaded_Params>::Log(const param_type& p,