Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(275)

Side by Side Diff: chrome/common/extensions/extension.cc

Issue 10443105: Take 2 at implementing activeTab. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: uninstall, tests, aa Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 "chrome/common/extensions/extension.h" 5 #include "chrome/common/extensions/extension.h"
6 6
7 #include "base/base64.h" 7 #include "base/base64.h"
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/file_path.h" 10 #include "base/file_path.h"
(...skipping 3302 matching lines...) Expand 10 before | Expand all | Expand 10 after
3313 if (browser_action()) 3313 if (browser_action())
3314 ++num_surfaces; 3314 ++num_surfaces;
3315 3315
3316 if (is_app()) 3316 if (is_app())
3317 ++num_surfaces; 3317 ++num_surfaces;
3318 3318
3319 return num_surfaces > 1; 3319 return num_surfaces > 1;
3320 } 3320 }
3321 3321
3322 bool Extension::CanExecuteScriptOnPage(const GURL& page_url, 3322 bool Extension::CanExecuteScriptOnPage(const GURL& page_url,
3323 int tab_id,
3323 const UserScript* script, 3324 const UserScript* script,
3324 std::string* error) const { 3325 std::string* error) const {
3325 base::AutoLock auto_lock(runtime_data_lock_); 3326 base::AutoLock auto_lock(runtime_data_lock_);
3326 // The gallery is special-cased as a restricted URL for scripting to prevent 3327 // The gallery is special-cased as a restricted URL for scripting to prevent
3327 // access to special JS bindings we expose to the gallery (and avoid things 3328 // access to special JS bindings we expose to the gallery (and avoid things
3328 // like extensions removing the "report abuse" link). 3329 // like extensions removing the "report abuse" link).
3329 // TODO(erikkay): This seems like the wrong test. Shouldn't we we testing 3330 // TODO(erikkay): This seems like the wrong test. Shouldn't we we testing
3330 // against the store app extent? 3331 // against the store app extent?
3331 GURL store_url(extension_urls::GetWebstoreLaunchURL()); 3332 GURL store_url(extension_urls::GetWebstoreLaunchURL());
3332 if ((page_url.host() == store_url.host()) && 3333 if ((page_url.host() == store_url.host()) &&
3333 !CanExecuteScriptEverywhere() && 3334 !CanExecuteScriptEverywhere() &&
3334 !CommandLine::ForCurrentProcess()->HasSwitch( 3335 !CommandLine::ForCurrentProcess()->HasSwitch(
3335 switches::kAllowScriptingGallery)) { 3336 switches::kAllowScriptingGallery)) {
3336 if (error) 3337 if (error)
3337 *error = errors::kCannotScriptGallery; 3338 *error = errors::kCannotScriptGallery;
3338 return false; 3339 return false;
3339 } 3340 }
3340 3341
3341 if (page_url.SchemeIs(chrome::kChromeUIScheme) && 3342 if (page_url.SchemeIs(chrome::kChromeUIScheme) &&
3342 !CanExecuteScriptEverywhere()) 3343 !CanExecuteScriptEverywhere())
3343 return false; 3344 return false;
3344 3345
3346 // If a tab ID is specified, try the tab-specific permissions.
3347 if (tab_id >= 0) {
3348 const URLPatternSet* tab_permissions =
3349 runtime_data_.GetTabSpecificHostPermissions(tab_id);
3350 if (tab_permissions &&
3351 tab_permissions->MatchesSecurityOrigin(page_url)) {
3352 return true;
3353 }
3354 }
3355
3345 // If a script is specified, use its matches. 3356 // If a script is specified, use its matches.
3346 if (script) 3357 if (script)
3347 return script->MatchesURL(page_url); 3358 return script->MatchesURL(page_url);
3348 3359
3349 // Otherwise, see if this extension has permission to execute script 3360 // Otherwise, see if this extension has permission to execute script
3350 // programmatically on pages. 3361 // programmatically on pages.
3351 if (runtime_data_.GetActivePermissions()->HasExplicitAccessToOrigin( 3362 if (runtime_data_.GetActivePermissions()->HasExplicitAccessToOrigin(
3352 page_url)) 3363 page_url))
3353 return true; 3364 return true;
3354 3365
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3397 it != whitelist->end(); ++it) { 3408 it != whitelist->end(); ++it) {
3398 if (id() == *it) { 3409 if (id() == *it) {
3399 return true; 3410 return true;
3400 } 3411 }
3401 } 3412 }
3402 3413
3403 return false; 3414 return false;
3404 } 3415 }
3405 3416
3406 bool Extension::CanCaptureVisiblePage(const GURL& page_url, 3417 bool Extension::CanCaptureVisiblePage(const GURL& page_url,
3418 int tab_id,
3407 std::string *error) const { 3419 std::string *error) const {
3420 if (tab_id >= 0) {
3421 const URLPatternSet* tab = GetTabSpecificHostPermissions(tab_id);
3422 if (tab && tab->MatchesSecurityOrigin(page_url))
3423 return true;
3424 }
3425
3408 if (HasHostPermission(page_url) || page_url.GetOrigin() == url()) 3426 if (HasHostPermission(page_url) || page_url.GetOrigin() == url())
3409 return true; 3427 return true;
3410 3428
3411 if (error) { 3429 if (error) {
3412 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, 3430 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage,
3413 page_url.spec()); 3431 page_url.spec());
3414 } 3432 }
3415 return false; 3433 return false;
3416 } 3434 }
3417 3435
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
3573 script_badge_->SetIcon(kDefaultTabId, icon); 3591 script_badge_->SetIcon(kDefaultTabId, icon);
3574 3592
3575 std::string title = browser_action()->GetTitle(kDefaultTabId); 3593 std::string title = browser_action()->GetTitle(kDefaultTabId);
3576 if (!title.empty()) 3594 if (!title.empty())
3577 script_badge_->SetTitle(kDefaultTabId, title); 3595 script_badge_->SetTitle(kDefaultTabId, title);
3578 } 3596 }
3579 3597
3580 return script_badge_.get(); 3598 return script_badge_.get();
3581 } 3599 }
3582 3600
3601 const URLPatternSet* Extension::GetTabSpecificHostPermissions(
3602 int tab_id) const {
3603 base::AutoLock auto_lock(runtime_data_lock_);
3604 return runtime_data_.GetTabSpecificHostPermissions(tab_id);
3605 }
3606
3607 void Extension::SetTabSpecificHostPermissions(
3608 int tab_id,
3609 const URLPatternSet& permissions) const {
3610 base::AutoLock auto_lock(runtime_data_lock_);
3611 runtime_data_.SetTabSpecificHostPermissions(tab_id, permissions);
3612 }
3613
3614 void Extension::ClearTabSpecificHostPermissions(int tab_id) const {
3615 base::AutoLock auto_lock(runtime_data_lock_);
3616 runtime_data_.ClearTabSpecificHostPermissions(tab_id);
3617 }
3618
3619 const URLPatternSet* Extension::GetActiveHostPermissionsForAllTabs() const {
3620 base::AutoLock auto_lock(runtime_data_lock_);
3621 return runtime_data_.GetActiveHostPermissionsForAllTabs();
3622 }
3623
3624 void Extension::GetAllTabSpecificHostPermissions(
3625 std::map<int, URLPatternSet>* out) const {
3626 base::AutoLock auto_lock(runtime_data_lock_);
3627 runtime_data_.GetAllTabSpecificHostPermissions(out);
3628 }
3629
3630 void Extension::SetAllTabSpecificHostPermissions(
3631 const std::map<int, URLPatternSet>& origins) const {
3632 base::AutoLock auto_lock(runtime_data_lock_);
3633 runtime_data_.SetAllTabSpecificHostPermissions(origins);
3634 }
3635
3583 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) { 3636 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) {
3584 if (!is_platform_app()) 3637 if (!is_platform_app())
3585 return true; 3638 return true;
3586 3639
3587 if (!CommandLine::ForCurrentProcess()->HasSwitch( 3640 if (!CommandLine::ForCurrentProcess()->HasSwitch(
3588 switches::kEnablePlatformApps)) { 3641 switches::kEnablePlatformApps)) {
3589 *utf8_error = errors::kPlatformAppFlagRequired; 3642 *utf8_error = errors::kPlatformAppFlagRequired;
3590 return false; 3643 return false;
3591 } 3644 }
3592 3645
(...skipping 23 matching lines...) Expand all
3616 Extension::RuntimeData::~RuntimeData() {} 3669 Extension::RuntimeData::~RuntimeData() {}
3617 3670
3618 scoped_refptr<const ExtensionPermissionSet> 3671 scoped_refptr<const ExtensionPermissionSet>
3619 Extension::RuntimeData::GetActivePermissions() const { 3672 Extension::RuntimeData::GetActivePermissions() const {
3620 return active_permissions_; 3673 return active_permissions_;
3621 } 3674 }
3622 3675
3623 void Extension::RuntimeData::SetActivePermissions( 3676 void Extension::RuntimeData::SetActivePermissions(
3624 const ExtensionPermissionSet* active) { 3677 const ExtensionPermissionSet* active) {
3625 active_permissions_ = active; 3678 active_permissions_ = active;
3679 active_host_permissions_for_all_tabs_.reset();
3680 }
3681
3682 const URLPatternSet*
3683 Extension::RuntimeData::GetTabSpecificHostPermissions(int tab_id) const {
3684 CHECK_GE(tab_id, 0);
3685 TabHostPermissionsMap::const_iterator it =
3686 tab_specific_host_permissions_.find(tab_id);
3687 return (it != tab_specific_host_permissions_.end()) ? it->second.get() : NULL;
3688 }
3689
3690 void Extension::RuntimeData::SetTabSpecificHostPermissions(
3691 int tab_id,
3692 const URLPatternSet& hosts) {
3693 CHECK_GE(tab_id, 0);
3694 tab_specific_host_permissions_[tab_id] =
3695 make_linked_ptr(new URLPatternSet(hosts));
3696
3697 // If we're tracking the active host permissions for all tabs, update it.
3698 if (active_host_permissions_for_all_tabs_.get()) {
3699 scoped_ptr<URLPatternSet> updated(new URLPatternSet());
3700 URLPatternSet::CreateUnion(*active_host_permissions_for_all_tabs_,
3701 hosts,
3702 updated.get());
3703 active_host_permissions_for_all_tabs_ = updated.Pass();
3704 }
3705 }
3706
3707 void Extension::RuntimeData::ClearTabSpecificHostPermissions(int tab_id) {
3708 CHECK_GE(tab_id, 0);
3709 tab_specific_host_permissions_.erase(tab_id);
3710 active_host_permissions_for_all_tabs_.reset();
3711 }
3712
3713 const URLPatternSet*
3714 Extension::RuntimeData::GetActiveHostPermissionsForAllTabs() const {
3715 if (active_host_permissions_for_all_tabs_.get())
3716 return active_host_permissions_for_all_tabs_.get();
3717
3718 if (tab_specific_host_permissions_.empty())
3719 return &active_permissions_->explicit_hosts();
3720
3721 // Compute and cache the union of all tab specific permissions. The union
3722 // operation for ExtensionPermissionSet is O(n), so the naive union
3723 // implementation would be O(n^2). Try to be smarter and do it in O(nlog(n)).
3724 std::vector<linked_ptr<const URLPatternSet> > all;
3725 for (TabHostPermissionsMap::const_iterator it =
3726 tab_specific_host_permissions_.begin();
3727 it != tab_specific_host_permissions_.end(); ++it) {
3728 all.push_back(it->second);
3729 }
3730
3731 for (size_t skip = 1; skip < all.size(); skip *= 2) {
3732 for (size_t i = 0; i < all.size() - skip; i += skip) {
3733 URLPatternSet* u = new URLPatternSet();
3734 URLPatternSet::CreateUnion(*all[i], *all[i + skip], u);
3735 all[i] = make_linked_ptr(u);
3736 }
3737 }
3738
3739 active_host_permissions_for_all_tabs_.reset(new URLPatternSet());
3740 URLPatternSet::CreateUnion(
3741 *all[0],
3742 active_permissions_->explicit_hosts(),
3743 active_host_permissions_for_all_tabs_.get());
3744 return active_host_permissions_for_all_tabs_.get();
3745 }
3746
3747 void Extension::RuntimeData::GetAllTabSpecificHostPermissions(
3748 std::map<int, URLPatternSet>* out) const {
3749 for (TabHostPermissionsMap::const_iterator it =
3750 tab_specific_host_permissions_.begin();
3751 it != tab_specific_host_permissions_.end(); ++it) {
3752 (*out)[it->first] = *it->second;
3753 }
3754 }
3755
3756 void Extension::RuntimeData::SetAllTabSpecificHostPermissions(
3757 const std::map<int, URLPatternSet>& in) {
3758 tab_specific_host_permissions_.clear();
3759 active_host_permissions_for_all_tabs_.reset();
3760
3761 for (std::map<int, URLPatternSet>::const_iterator it = in.begin();
3762 it != in.end(); ++it) {
3763 tab_specific_host_permissions_[it->first].reset(
3764 new URLPatternSet(it->second));
3765 }
3626 } 3766 }
3627 3767
3628 UnloadedExtensionInfo::UnloadedExtensionInfo( 3768 UnloadedExtensionInfo::UnloadedExtensionInfo(
3629 const Extension* extension, 3769 const Extension* extension,
3630 extension_misc::UnloadedExtensionReason reason) 3770 extension_misc::UnloadedExtensionReason reason)
3631 : reason(reason), 3771 : reason(reason),
3632 already_disabled(false), 3772 already_disabled(false),
3633 extension(extension) {} 3773 extension(extension) {}
3634 3774
3635 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( 3775 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo(
3636 const Extension* extension, 3776 const Extension* extension,
3637 const ExtensionPermissionSet* permissions, 3777 const ExtensionPermissionSet* permissions,
3638 Reason reason) 3778 Reason reason)
3639 : reason(reason), 3779 : reason(reason),
3640 extension(extension), 3780 extension(extension),
3641 permissions(permissions) {} 3781 permissions(permissions) {}
3642 3782
3643 } // namespace extensions 3783 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698