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/manifest.h"
10 #include "chrome/common/extensions/permissions/permissions_info.h"
11 #include "content/public/common/common_param_traits.h"
13 using extensions::APIPermission
;
14 using extensions::APIPermissionInfo
;
15 using extensions::APIPermissionMap
;
16 using extensions::APIPermissionSet
;
17 using extensions::Extension
;
18 using extensions::PermissionSet
;
19 using extensions::SocketPermissionData
;
21 ExtensionMsg_Loaded_Params::ExtensionMsg_Loaded_Params()
22 : location(Extension::INVALID
),
23 creation_flags(Extension::NO_FLAGS
){}
25 ExtensionMsg_Loaded_Params::~ExtensionMsg_Loaded_Params() {}
27 ExtensionMsg_Loaded_Params::ExtensionMsg_Loaded_Params(
28 const Extension
* extension
)
29 : manifest(extension
->manifest()->value()->DeepCopy()),
30 location(extension
->location()),
31 path(extension
->path()),
32 apis(extension
->GetActivePermissions()->apis()),
33 explicit_hosts(extension
->GetActivePermissions()->explicit_hosts()),
34 scriptable_hosts(extension
->GetActivePermissions()->scriptable_hosts()),
36 creation_flags(extension
->creation_flags()) {
39 scoped_refptr
<Extension
>
40 ExtensionMsg_Loaded_Params::ConvertToExtension() const {
43 scoped_refptr
<Extension
> extension(
44 Extension::Create(path
, location
, *manifest
, creation_flags
,
46 if (!extension
.get()) {
47 DLOG(ERROR
) << "Error deserializing extension: " << error
;
51 extension
->SetActivePermissions(
52 new PermissionSet(apis
, explicit_hosts
, scriptable_hosts
));
60 struct ParamTraits
<Extension::Location
> {
61 typedef Extension::Location param_type
;
62 static void Write(Message
* m
, const param_type
& p
) {
63 int val
= static_cast<int>(p
);
66 static bool Read(const Message
* m
, PickleIterator
* iter
, param_type
* p
) {
68 if (!ReadParam(m
, iter
, &val
) ||
69 val
< Extension::INVALID
||
70 val
>= Extension::NUM_LOCATIONS
)
72 *p
= static_cast<param_type
>(val
);
75 static void Log(const param_type
& p
, std::string
* l
) {
76 ParamTraits
<int>::Log(static_cast<int>(p
), l
);
80 void ParamTraits
<URLPattern
>::Write(Message
* m
, const param_type
& p
) {
81 WriteParam(m
, p
.valid_schemes());
82 WriteParam(m
, p
.GetAsString());
85 bool ParamTraits
<URLPattern
>::Read(const Message
* m
, PickleIterator
* iter
,
89 if (!ReadParam(m
, iter
, &valid_schemes
) ||
90 !ReadParam(m
, iter
, &spec
))
93 // TODO(jstritar): We don't want the URLPattern to fail parsing when the
94 // scheme is invalid. Instead, the pattern should parse but it should not
95 // match the invalid patterns. We get around this by setting the valid
96 // schemes after parsing the pattern. Update these method calls once we can
97 // ignore scheme validation with URLPattern parse options. crbug.com/90544
98 p
->SetValidSchemes(URLPattern::SCHEME_ALL
);
99 URLPattern::ParseResult result
= p
->Parse(spec
);
100 p
->SetValidSchemes(valid_schemes
);
101 return URLPattern::PARSE_SUCCESS
== result
;
104 void ParamTraits
<URLPattern
>::Log(const param_type
& p
, std::string
* l
) {
105 LogParam(p
.GetAsString(), l
);
108 void ParamTraits
<URLPatternSet
>::Write(Message
* m
, const param_type
& p
) {
109 WriteParam(m
, p
.patterns());
112 bool ParamTraits
<URLPatternSet
>::Read(const Message
* m
, PickleIterator
* iter
,
114 std::set
<URLPattern
> patterns
;
115 if (!ReadParam(m
, iter
, &patterns
))
118 for (std::set
<URLPattern
>::iterator i
= patterns
.begin();
119 i
!= patterns
.end(); ++i
)
124 void ParamTraits
<URLPatternSet
>::Log(const param_type
& p
, std::string
* l
) {
125 LogParam(p
.patterns(), l
);
128 void ParamTraits
<APIPermission::ID
>::Write(
129 Message
* m
, const param_type
& p
) {
130 WriteParam(m
, static_cast<int>(p
));
133 bool ParamTraits
<APIPermission::ID
>::Read(
134 const Message
* m
, PickleIterator
* iter
, param_type
* p
) {
136 if (!ReadParam(m
, iter
, &api_id
))
139 *p
= static_cast<APIPermission::ID
>(api_id
);
143 void ParamTraits
<APIPermission::ID
>::Log(
144 const param_type
& p
, std::string
* l
) {
145 LogParam(static_cast<int>(p
), l
);
148 void ParamTraits
<APIPermission
*>::Log(
149 const param_type
& p
, std::string
* l
) {
153 void ParamTraits
<APIPermissionSet
>::Write(
154 Message
* m
, const param_type
& p
) {
155 APIPermissionSet::const_iterator it
= p
.begin();
156 const APIPermissionSet::const_iterator end
= p
.end();
157 WriteParam(m
, p
.size());
158 for (; it
!= end
; ++it
) {
159 WriteParam(m
, it
->id());
164 bool ParamTraits
<APIPermissionSet
>::Read(
165 const Message
* m
, PickleIterator
* iter
, param_type
* r
) {
167 if (!ReadParam(m
, iter
, &size
))
169 for (size_t i
= 0; i
< size
; ++i
) {
170 APIPermission::ID id
;
171 if (!ReadParam(m
, iter
, &id
))
173 const APIPermissionInfo
* permission_info
=
174 extensions::PermissionsInfo::GetInstance()->GetByID(id
);
175 if (!permission_info
)
177 scoped_ptr
<APIPermission
> p(permission_info
->CreateAPIPermission());
178 if (!p
->Read(m
, iter
))
180 r
->insert(p
.release());
185 void ParamTraits
<APIPermissionSet
>::Log(
186 const param_type
& p
, std::string
* l
) {
187 LogParam(p
.map(), l
);
190 void ParamTraits
<SocketPermissionData
>::Write(
191 Message
* m
, const param_type
& p
) {
192 WriteParam(m
, p
.GetAsString());
195 bool ParamTraits
<SocketPermissionData
>::Read(
196 const Message
* m
, PickleIterator
* iter
, param_type
* r
) {
198 if (!ReadParam(m
, iter
, &spec
))
201 return r
->Parse(spec
);
204 void ParamTraits
<SocketPermissionData
>::Log(
205 const param_type
& p
, std::string
* l
) {
206 LogParam(std::string("<SocketPermissionData>"), l
);
209 void ParamTraits
<ExtensionMsg_Loaded_Params
>::Write(Message
* m
,
210 const param_type
& p
) {
211 WriteParam(m
, p
.location
);
212 WriteParam(m
, p
.path
);
213 WriteParam(m
, *(p
.manifest
));
214 WriteParam(m
, p
.creation_flags
);
215 WriteParam(m
, p
.apis
);
216 WriteParam(m
, p
.explicit_hosts
);
217 WriteParam(m
, p
.scriptable_hosts
);
220 bool ParamTraits
<ExtensionMsg_Loaded_Params
>::Read(const Message
* m
,
221 PickleIterator
* iter
,
223 p
->manifest
.reset(new DictionaryValue());
224 return ReadParam(m
, iter
, &p
->location
) &&
225 ReadParam(m
, iter
, &p
->path
) &&
226 ReadParam(m
, iter
, p
->manifest
.get()) &&
227 ReadParam(m
, iter
, &p
->creation_flags
) &&
228 ReadParam(m
, iter
, &p
->apis
) &&
229 ReadParam(m
, iter
, &p
->explicit_hosts
) &&
230 ReadParam(m
, iter
, &p
->scriptable_hosts
);
233 void ParamTraits
<ExtensionMsg_Loaded_Params
>::Log(const param_type
& p
,