OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/common/permissions/permissions_data.h" | 5 #include "extensions/common/permissions/permissions_data.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "content/public/common/url_constants.h" | 8 #include "content/public/common/url_constants.h" |
9 #include "extensions/common/constants.h" | 9 #include "extensions/common/constants.h" |
10 #include "extensions/common/error_utils.h" | 10 #include "extensions/common/error_utils.h" |
11 #include "extensions/common/extension.h" | 11 #include "extensions/common/extension.h" |
12 #include "extensions/common/extensions_client.h" | 12 #include "extensions/common/extensions_client.h" |
13 #include "extensions/common/manifest.h" | 13 #include "extensions/common/manifest.h" |
14 #include "extensions/common/manifest_constants.h" | 14 #include "extensions/common/manifest_constants.h" |
15 #include "extensions/common/manifest_handlers/permissions_parser.h" | 15 #include "extensions/common/manifest_handlers/permissions_parser.h" |
16 #include "extensions/common/permissions/permission_message_provider.h" | 16 #include "extensions/common/permissions/permission_message_provider.h" |
17 #include "extensions/common/switches.h" | 17 #include "extensions/common/switches.h" |
18 #include "extensions/common/url_pattern_set.h" | 18 #include "extensions/common/url_pattern_set.h" |
19 #include "url/gurl.h" | 19 #include "url/gurl.h" |
20 #include "url/url_constants.h" | 20 #include "url/url_constants.h" |
21 | 21 |
22 namespace extensions { | 22 namespace extensions { |
23 | 23 |
24 namespace { | 24 namespace { |
25 | 25 |
26 PermissionsData::PolicyDelegate* g_policy_delegate = NULL; | 26 PermissionsData::PolicyDelegate* g_policy_delegate = NULL; |
27 | 27 |
| 28 class AutoLockOnValidThread { |
| 29 public: |
| 30 AutoLockOnValidThread(base::Lock& lock, base::ThreadChecker* thread_checker) |
| 31 : auto_lock_(lock) { |
| 32 DCHECK(!thread_checker || thread_checker->CalledOnValidThread()); |
| 33 } |
| 34 |
| 35 private: |
| 36 base::AutoLock auto_lock_; |
| 37 |
| 38 DISALLOW_COPY_AND_ASSIGN(AutoLockOnValidThread); |
| 39 }; |
| 40 |
28 } // namespace | 41 } // namespace |
29 | 42 |
30 PermissionsData::PermissionsData(const Extension* extension) | 43 PermissionsData::PermissionsData(const Extension* extension) |
31 : extension_id_(extension->id()), manifest_type_(extension->GetType()) { | 44 : extension_id_(extension->id()), manifest_type_(extension->GetType()) { |
32 base::AutoLock auto_lock(runtime_lock_); | 45 const PermissionSet* required_permissions = |
33 scoped_refptr<const PermissionSet> required_permissions = | |
34 PermissionsParser::GetRequiredPermissions(extension); | 46 PermissionsParser::GetRequiredPermissions(extension); |
35 active_permissions_unsafe_ = | 47 active_permissions_unsafe_.reset( |
36 new PermissionSet(required_permissions->apis(), | 48 new PermissionSet(required_permissions->apis(), |
37 required_permissions->manifest_permissions(), | 49 required_permissions->manifest_permissions(), |
38 required_permissions->explicit_hosts(), | 50 required_permissions->explicit_hosts(), |
39 required_permissions->scriptable_hosts()); | 51 required_permissions->scriptable_hosts())); |
40 withheld_permissions_unsafe_ = new PermissionSet(); | 52 withheld_permissions_unsafe_.reset(new PermissionSet()); |
41 } | 53 } |
42 | 54 |
43 PermissionsData::~PermissionsData() { | 55 PermissionsData::~PermissionsData() { |
44 } | 56 } |
45 | 57 |
46 // static | 58 // static |
47 void PermissionsData::SetPolicyDelegate(PolicyDelegate* delegate) { | 59 void PermissionsData::SetPolicyDelegate(PolicyDelegate* delegate) { |
48 g_policy_delegate = delegate; | 60 g_policy_delegate = delegate; |
49 } | 61 } |
50 | 62 |
(...skipping 17 matching lines...) Expand all Loading... |
68 // shows up in chrome:extensions (so the user can grant withheld permissions), | 80 // shows up in chrome:extensions (so the user can grant withheld permissions), |
69 // is not part of chrome or corporate policy, not on the scripting whitelist, | 81 // is not part of chrome or corporate policy, not on the scripting whitelist, |
70 // and requires enough permissions that we should withhold them. | 82 // and requires enough permissions that we should withhold them. |
71 return extension->ShouldDisplayInExtensionSettings() && | 83 return extension->ShouldDisplayInExtensionSettings() && |
72 !Manifest::IsPolicyLocation(extension->location()) && | 84 !Manifest::IsPolicyLocation(extension->location()) && |
73 !Manifest::IsComponentLocation(extension->location()) && | 85 !Manifest::IsComponentLocation(extension->location()) && |
74 !CanExecuteScriptEverywhere(extension) && | 86 !CanExecuteScriptEverywhere(extension) && |
75 permissions->ShouldWarnAllHosts(); | 87 permissions->ShouldWarnAllHosts(); |
76 } | 88 } |
77 | 89 |
| 90 // static |
78 bool PermissionsData::ShouldSkipPermissionWarnings( | 91 bool PermissionsData::ShouldSkipPermissionWarnings( |
79 const std::string& extension_id) { | 92 const std::string& extension_id) { |
80 // See http://b/4946060 for more details. | 93 // See http://b/4946060 for more details. |
81 return extension_id == extension_misc::kProdHangoutsExtensionId; | 94 return extension_id == extension_misc::kProdHangoutsExtensionId; |
82 } | 95 } |
83 | 96 |
84 // static | 97 // static |
85 bool PermissionsData::IsRestrictedUrl(const GURL& document_url, | 98 bool PermissionsData::IsRestrictedUrl(const GURL& document_url, |
86 const Extension* extension, | 99 const Extension* extension, |
87 std::string* error) { | 100 std::string* error) { |
(...skipping 26 matching lines...) Expand all Loading... |
114 if (extension && document_url.SchemeIs(kExtensionScheme) && | 127 if (extension && document_url.SchemeIs(kExtensionScheme) && |
115 document_url.host() != extension->id() && !allow_on_chrome_urls) { | 128 document_url.host() != extension->id() && !allow_on_chrome_urls) { |
116 if (error) | 129 if (error) |
117 *error = manifest_errors::kCannotAccessExtensionUrl; | 130 *error = manifest_errors::kCannotAccessExtensionUrl; |
118 return true; | 131 return true; |
119 } | 132 } |
120 | 133 |
121 return false; | 134 return false; |
122 } | 135 } |
123 | 136 |
| 137 void PermissionsData::BindToCurrentThread() const { |
| 138 DCHECK(!thread_checker_); |
| 139 thread_checker_.reset(new base::ThreadChecker()); |
| 140 } |
| 141 |
124 void PermissionsData::SetPermissions( | 142 void PermissionsData::SetPermissions( |
125 const scoped_refptr<const PermissionSet>& active, | 143 scoped_ptr<const PermissionSet> active, |
126 const scoped_refptr<const PermissionSet>& withheld) const { | 144 scoped_ptr<const PermissionSet> withheld) const { |
127 base::AutoLock auto_lock(runtime_lock_); | 145 AutoLockOnValidThread lock(runtime_lock_, thread_checker_.get()); |
128 active_permissions_unsafe_ = active; | 146 active_permissions_unsafe_ = active.Pass(); |
129 withheld_permissions_unsafe_ = withheld; | 147 withheld_permissions_unsafe_ = withheld.Pass(); |
| 148 } |
| 149 |
| 150 void PermissionsData::SetActivePermissions( |
| 151 scoped_ptr<const PermissionSet> active) const { |
| 152 AutoLockOnValidThread lock(runtime_lock_, thread_checker_.get()); |
| 153 active_permissions_unsafe_ = active.Pass(); |
130 } | 154 } |
131 | 155 |
132 void PermissionsData::UpdateTabSpecificPermissions( | 156 void PermissionsData::UpdateTabSpecificPermissions( |
133 int tab_id, | 157 int tab_id, |
134 scoped_refptr<const PermissionSet> permissions) const { | 158 const PermissionSet& permissions) const { |
135 base::AutoLock auto_lock(runtime_lock_); | 159 AutoLockOnValidThread lock(runtime_lock_, thread_checker_.get()); |
136 CHECK_GE(tab_id, 0); | 160 CHECK_GE(tab_id, 0); |
137 TabPermissionsMap::iterator iter = tab_specific_permissions_.find(tab_id); | 161 TabPermissionsMap::const_iterator iter = |
138 if (iter == tab_specific_permissions_.end()) | 162 tab_specific_permissions_.find(tab_id); |
139 tab_specific_permissions_[tab_id] = permissions; | 163 scoped_ptr<const PermissionSet> new_permissions = PermissionSet::CreateUnion( |
140 else | 164 iter == tab_specific_permissions_.end() |
141 iter->second = PermissionSet::CreateUnion(*(iter->second), *permissions); | 165 ? static_cast<const PermissionSet&>(PermissionSet()) |
| 166 : *iter->second, |
| 167 permissions); |
| 168 tab_specific_permissions_.set(tab_id, new_permissions.Pass()); |
142 } | 169 } |
143 | 170 |
144 void PermissionsData::ClearTabSpecificPermissions(int tab_id) const { | 171 void PermissionsData::ClearTabSpecificPermissions(int tab_id) const { |
145 base::AutoLock auto_lock(runtime_lock_); | 172 AutoLockOnValidThread lock(runtime_lock_, thread_checker_.get()); |
146 CHECK_GE(tab_id, 0); | 173 CHECK_GE(tab_id, 0); |
147 tab_specific_permissions_.erase(tab_id); | 174 tab_specific_permissions_.erase(tab_id); |
148 } | 175 } |
149 | 176 |
150 bool PermissionsData::HasAPIPermission(APIPermission::ID permission) const { | 177 bool PermissionsData::HasAPIPermission(APIPermission::ID permission) const { |
151 return active_permissions()->HasAPIPermission(permission); | 178 base::AutoLock auto_lock(runtime_lock_); |
| 179 return active_permissions_unsafe_->HasAPIPermission(permission); |
152 } | 180 } |
153 | 181 |
154 bool PermissionsData::HasAPIPermission( | 182 bool PermissionsData::HasAPIPermission( |
155 const std::string& permission_name) const { | 183 const std::string& permission_name) const { |
156 return active_permissions()->HasAPIPermission(permission_name); | 184 base::AutoLock auto_lock(runtime_lock_); |
| 185 return active_permissions_unsafe_->HasAPIPermission(permission_name); |
157 } | 186 } |
158 | 187 |
159 bool PermissionsData::HasAPIPermissionForTab( | 188 bool PermissionsData::HasAPIPermissionForTab( |
160 int tab_id, | 189 int tab_id, |
161 APIPermission::ID permission) const { | 190 APIPermission::ID permission) const { |
162 if (HasAPIPermission(permission)) | 191 base::AutoLock auto_lock(runtime_lock_); |
| 192 if (active_permissions_unsafe_->HasAPIPermission(permission)) |
163 return true; | 193 return true; |
164 | 194 |
165 scoped_refptr<const PermissionSet> tab_permissions = | 195 const PermissionSet* tab_permissions = GetTabSpecificPermissions(tab_id); |
166 GetTabSpecificPermissions(tab_id); | 196 return tab_permissions && tab_permissions->HasAPIPermission(permission); |
167 | |
168 // Place autolock below the HasAPIPermission() and | |
169 // GetTabSpecificPermissions(), since each already acquires the lock. | |
170 base::AutoLock auto_lock(runtime_lock_); | |
171 return tab_permissions.get() && tab_permissions->HasAPIPermission(permission); | |
172 } | 197 } |
173 | 198 |
174 bool PermissionsData::CheckAPIPermissionWithParam( | 199 bool PermissionsData::CheckAPIPermissionWithParam( |
175 APIPermission::ID permission, | 200 APIPermission::ID permission, |
176 const APIPermission::CheckParam* param) const { | 201 const APIPermission::CheckParam* param) const { |
177 return active_permissions()->CheckAPIPermissionWithParam(permission, param); | 202 base::AutoLock auto_lock(runtime_lock_); |
| 203 return active_permissions_unsafe_->CheckAPIPermissionWithParam(permission, |
| 204 param); |
178 } | 205 } |
179 | 206 |
180 URLPatternSet PermissionsData::GetEffectiveHostPermissions() const { | 207 URLPatternSet PermissionsData::GetEffectiveHostPermissions() const { |
181 base::AutoLock auto_lock(runtime_lock_); | 208 base::AutoLock auto_lock(runtime_lock_); |
182 URLPatternSet effective_hosts = active_permissions_unsafe_->effective_hosts(); | 209 URLPatternSet effective_hosts = active_permissions_unsafe_->effective_hosts(); |
183 for (const auto& val : tab_specific_permissions_) | 210 for (const auto& val : tab_specific_permissions_) |
184 effective_hosts.AddPatterns(val.second->effective_hosts()); | 211 effective_hosts.AddPatterns(val.second->effective_hosts()); |
185 return effective_hosts; | 212 return effective_hosts; |
186 } | 213 } |
187 | 214 |
188 bool PermissionsData::HasHostPermission(const GURL& url) const { | 215 bool PermissionsData::HasHostPermission(const GURL& url) const { |
189 return active_permissions()->HasExplicitAccessToOrigin(url); | 216 base::AutoLock auto_lock(runtime_lock_); |
| 217 return active_permissions_unsafe_->HasExplicitAccessToOrigin(url); |
190 } | 218 } |
191 | 219 |
192 bool PermissionsData::HasEffectiveAccessToAllHosts() const { | 220 bool PermissionsData::HasEffectiveAccessToAllHosts() const { |
193 return active_permissions()->HasEffectiveAccessToAllHosts(); | 221 base::AutoLock auto_lock(runtime_lock_); |
| 222 return active_permissions_unsafe_->HasEffectiveAccessToAllHosts(); |
194 } | 223 } |
195 | 224 |
196 PermissionMessages PermissionsData::GetPermissionMessages() const { | 225 PermissionMessages PermissionsData::GetPermissionMessages() const { |
| 226 base::AutoLock auto_lock(runtime_lock_); |
197 return PermissionMessageProvider::Get()->GetPermissionMessages( | 227 return PermissionMessageProvider::Get()->GetPermissionMessages( |
198 PermissionMessageProvider::Get()->GetAllPermissionIDs( | 228 PermissionMessageProvider::Get()->GetAllPermissionIDs( |
199 active_permissions().get(), manifest_type_)); | 229 active_permissions_unsafe_.get(), manifest_type_)); |
200 } | 230 } |
201 | 231 |
202 bool PermissionsData::HasWithheldImpliedAllHosts() const { | 232 bool PermissionsData::HasWithheldImpliedAllHosts() const { |
| 233 base::AutoLock auto_lock(runtime_lock_); |
203 // Since we currently only withhold all_hosts, it's sufficient to check | 234 // Since we currently only withhold all_hosts, it's sufficient to check |
204 // that either set is not empty. | 235 // that either set is not empty. |
205 return !withheld_permissions()->explicit_hosts().is_empty() || | 236 return !withheld_permissions_unsafe_->explicit_hosts().is_empty() || |
206 !withheld_permissions()->scriptable_hosts().is_empty(); | 237 !withheld_permissions_unsafe_->scriptable_hosts().is_empty(); |
207 } | 238 } |
208 | 239 |
209 bool PermissionsData::CanAccessPage(const Extension* extension, | 240 bool PermissionsData::CanAccessPage(const Extension* extension, |
210 const GURL& document_url, | 241 const GURL& document_url, |
211 int tab_id, | 242 int tab_id, |
212 int process_id, | 243 int process_id, |
213 std::string* error) const { | 244 std::string* error) const { |
214 AccessType result = CanRunOnPage(extension, | 245 base::AutoLock auto_lock(runtime_lock_); |
215 document_url, | 246 AccessType result = |
216 tab_id, | 247 CanRunOnPage(extension, document_url, tab_id, process_id, |
217 process_id, | 248 active_permissions_unsafe_->explicit_hosts(), |
218 active_permissions()->explicit_hosts(), | 249 withheld_permissions_unsafe_->explicit_hosts(), error); |
219 withheld_permissions()->explicit_hosts(), | |
220 error); | |
221 // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. | 250 // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. |
222 return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD; | 251 return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD; |
223 } | 252 } |
224 | 253 |
225 PermissionsData::AccessType PermissionsData::GetPageAccess( | 254 PermissionsData::AccessType PermissionsData::GetPageAccess( |
226 const Extension* extension, | 255 const Extension* extension, |
227 const GURL& document_url, | 256 const GURL& document_url, |
228 int tab_id, | 257 int tab_id, |
229 int process_id, | 258 int process_id, |
230 std::string* error) const { | 259 std::string* error) const { |
231 return CanRunOnPage(extension, | 260 base::AutoLock auto_lock(runtime_lock_); |
232 document_url, | 261 return CanRunOnPage(extension, document_url, tab_id, process_id, |
233 tab_id, | 262 active_permissions_unsafe_->explicit_hosts(), |
234 process_id, | 263 withheld_permissions_unsafe_->explicit_hosts(), error); |
235 active_permissions()->explicit_hosts(), | |
236 withheld_permissions()->explicit_hosts(), | |
237 error); | |
238 } | 264 } |
239 | 265 |
240 bool PermissionsData::CanRunContentScriptOnPage(const Extension* extension, | 266 bool PermissionsData::CanRunContentScriptOnPage(const Extension* extension, |
241 const GURL& document_url, | 267 const GURL& document_url, |
242 int tab_id, | 268 int tab_id, |
243 int process_id, | 269 int process_id, |
244 std::string* error) const { | 270 std::string* error) const { |
245 AccessType result = CanRunOnPage(extension, | 271 base::AutoLock auto_lock(runtime_lock_); |
246 document_url, | 272 AccessType result = |
247 tab_id, | 273 CanRunOnPage(extension, document_url, tab_id, process_id, |
248 process_id, | 274 active_permissions_unsafe_->scriptable_hosts(), |
249 active_permissions()->scriptable_hosts(), | 275 withheld_permissions_unsafe_->scriptable_hosts(), error); |
250 withheld_permissions()->scriptable_hosts(), | |
251 error); | |
252 // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. | 276 // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED. |
253 return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD; | 277 return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD; |
254 } | 278 } |
255 | 279 |
256 PermissionsData::AccessType PermissionsData::GetContentScriptAccess( | 280 PermissionsData::AccessType PermissionsData::GetContentScriptAccess( |
257 const Extension* extension, | 281 const Extension* extension, |
258 const GURL& document_url, | 282 const GURL& document_url, |
259 int tab_id, | 283 int tab_id, |
260 int process_id, | 284 int process_id, |
261 std::string* error) const { | 285 std::string* error) const { |
262 return CanRunOnPage(extension, | 286 base::AutoLock auto_lock(runtime_lock_); |
263 document_url, | 287 return CanRunOnPage(extension, document_url, tab_id, process_id, |
264 tab_id, | 288 active_permissions_unsafe_->scriptable_hosts(), |
265 process_id, | 289 withheld_permissions_unsafe_->scriptable_hosts(), error); |
266 active_permissions()->scriptable_hosts(), | |
267 withheld_permissions()->scriptable_hosts(), | |
268 error); | |
269 } | 290 } |
270 | 291 |
271 bool PermissionsData::CanCaptureVisiblePage(int tab_id, | 292 bool PermissionsData::CanCaptureVisiblePage(int tab_id, |
272 std::string* error) const { | 293 std::string* error) const { |
273 const URLPattern all_urls(URLPattern::SCHEME_ALL, | 294 const URLPattern all_urls(URLPattern::SCHEME_ALL, |
274 URLPattern::kAllUrlsPattern); | 295 URLPattern::kAllUrlsPattern); |
275 | 296 |
276 if (active_permissions()->explicit_hosts().ContainsPattern(all_urls)) | 297 base::AutoLock auto_lock(runtime_lock_); |
| 298 if (active_permissions_unsafe_->explicit_hosts().ContainsPattern(all_urls)) |
277 return true; | 299 return true; |
278 | 300 |
279 if (tab_id >= 0) { | 301 if (tab_id >= 0) { |
280 scoped_refptr<const PermissionSet> tab_permissions = | 302 const PermissionSet* tab_permissions = GetTabSpecificPermissions(tab_id); |
281 GetTabSpecificPermissions(tab_id); | 303 if (tab_permissions && |
282 if (tab_permissions.get() && | |
283 tab_permissions->HasAPIPermission(APIPermission::kTab)) { | 304 tab_permissions->HasAPIPermission(APIPermission::kTab)) { |
284 return true; | 305 return true; |
285 } | 306 } |
286 if (error) | 307 if (error) |
287 *error = manifest_errors::kActiveTabPermissionNotGranted; | 308 *error = manifest_errors::kActiveTabPermissionNotGranted; |
288 return false; | 309 return false; |
289 } | 310 } |
290 | 311 |
291 if (error) | 312 if (error) |
292 *error = manifest_errors::kAllURLOrActiveTabNeeded; | 313 *error = manifest_errors::kAllURLOrActiveTabNeeded; |
293 return false; | 314 return false; |
294 } | 315 } |
295 | 316 |
296 PermissionsData::TabPermissionsMap | 317 const PermissionSet* PermissionsData::GetTabSpecificPermissions( |
297 PermissionsData::CopyTabSpecificPermissionsMap() const { | |
298 base::AutoLock auto_lock(runtime_lock_); | |
299 return tab_specific_permissions_; | |
300 } | |
301 | |
302 scoped_refptr<const PermissionSet> PermissionsData::GetTabSpecificPermissions( | |
303 int tab_id) const { | 318 int tab_id) const { |
304 base::AutoLock auto_lock(runtime_lock_); | |
305 CHECK_GE(tab_id, 0); | 319 CHECK_GE(tab_id, 0); |
| 320 runtime_lock_.AssertAcquired(); |
306 TabPermissionsMap::const_iterator iter = | 321 TabPermissionsMap::const_iterator iter = |
307 tab_specific_permissions_.find(tab_id); | 322 tab_specific_permissions_.find(tab_id); |
308 return (iter != tab_specific_permissions_.end()) ? iter->second : NULL; | 323 return (iter != tab_specific_permissions_.end()) ? iter->second : nullptr; |
309 } | 324 } |
310 | 325 |
311 bool PermissionsData::HasTabSpecificPermissionToExecuteScript( | 326 bool PermissionsData::HasTabSpecificPermissionToExecuteScript( |
312 int tab_id, | 327 int tab_id, |
313 const GURL& url) const { | 328 const GURL& url) const { |
| 329 runtime_lock_.AssertAcquired(); |
314 if (tab_id >= 0) { | 330 if (tab_id >= 0) { |
315 scoped_refptr<const PermissionSet> tab_permissions = | 331 const PermissionSet* tab_permissions = GetTabSpecificPermissions(tab_id); |
316 GetTabSpecificPermissions(tab_id); | 332 if (tab_permissions && |
317 if (tab_permissions.get() && | |
318 tab_permissions->explicit_hosts().MatchesSecurityOrigin(url)) { | 333 tab_permissions->explicit_hosts().MatchesSecurityOrigin(url)) { |
319 return true; | 334 return true; |
320 } | 335 } |
321 } | 336 } |
322 return false; | 337 return false; |
323 } | 338 } |
324 | 339 |
325 PermissionsData::AccessType PermissionsData::CanRunOnPage( | 340 PermissionsData::AccessType PermissionsData::CanRunOnPage( |
326 const Extension* extension, | 341 const Extension* extension, |
327 const GURL& document_url, | 342 const GURL& document_url, |
328 int tab_id, | 343 int tab_id, |
329 int process_id, | 344 int process_id, |
330 const URLPatternSet& permitted_url_patterns, | 345 const URLPatternSet& permitted_url_patterns, |
331 const URLPatternSet& withheld_url_patterns, | 346 const URLPatternSet& withheld_url_patterns, |
332 std::string* error) const { | 347 std::string* error) const { |
| 348 runtime_lock_.AssertAcquired(); |
333 if (g_policy_delegate && | 349 if (g_policy_delegate && |
334 !g_policy_delegate->CanExecuteScriptOnPage( | 350 !g_policy_delegate->CanExecuteScriptOnPage( |
335 extension, document_url, tab_id, process_id, error)) { | 351 extension, document_url, tab_id, process_id, error)) { |
336 return ACCESS_DENIED; | 352 return ACCESS_DENIED; |
337 } | 353 } |
338 | 354 |
339 if (IsRestrictedUrl(document_url, extension, error)) | 355 if (IsRestrictedUrl(document_url, extension, error)) |
340 return ACCESS_DENIED; | 356 return ACCESS_DENIED; |
341 | 357 |
342 if (HasTabSpecificPermissionToExecuteScript(tab_id, document_url)) | 358 if (HasTabSpecificPermissionToExecuteScript(tab_id, document_url)) |
343 return ACCESS_ALLOWED; | 359 return ACCESS_ALLOWED; |
344 | 360 |
345 if (permitted_url_patterns.MatchesURL(document_url)) | 361 if (permitted_url_patterns.MatchesURL(document_url)) |
346 return ACCESS_ALLOWED; | 362 return ACCESS_ALLOWED; |
347 | 363 |
348 if (withheld_url_patterns.MatchesURL(document_url)) | 364 if (withheld_url_patterns.MatchesURL(document_url)) |
349 return ACCESS_WITHHELD; | 365 return ACCESS_WITHHELD; |
350 | 366 |
351 if (error) { | 367 if (error) { |
352 *error = ErrorUtils::FormatErrorMessage(manifest_errors::kCannotAccessPage, | 368 *error = ErrorUtils::FormatErrorMessage(manifest_errors::kCannotAccessPage, |
353 document_url.spec()); | 369 document_url.spec()); |
354 } | 370 } |
355 return ACCESS_DENIED; | 371 return ACCESS_DENIED; |
356 } | 372 } |
357 | 373 |
358 } // namespace extensions | 374 } // namespace extensions |
OLD | NEW |