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