diff options
author | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-09 00:33:04 +0000 |
---|---|---|
committer | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-09 00:33:04 +0000 |
commit | e7f5c6f8aede399fe896e8218d89087408011d18 (patch) | |
tree | 58ed75a2b1ae424a089a9a9fd8bb5724fed35ded /chrome/browser/views | |
parent | 1188a6c0b9025c6ccb9eff833599b951fc778a9a (diff) | |
download | chromium_src-e7f5c6f8aede399fe896e8218d89087408011d18.zip chromium_src-e7f5c6f8aede399fe896e8218d89087408011d18.tar.gz chromium_src-e7f5c6f8aede399fe896e8218d89087408011d18.tar.bz2 |
Implement the popup blocking whitelist pref. This makes the whitelist actually function.BUG=11440
Review URL: http://codereview.chromium.org/115149
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15702 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views')
-rw-r--r-- | chrome/browser/views/blocked_popup_container.cc | 66 | ||||
-rw-r--r-- | chrome/browser/views/blocked_popup_container.h | 17 |
2 files changed, 62 insertions, 21 deletions
diff --git a/chrome/browser/views/blocked_popup_container.cc b/chrome/browser/views/blocked_popup_container.cc index 5fcd792..47e5f8e 100644 --- a/chrome/browser/views/blocked_popup_container.cc +++ b/chrome/browser/views/blocked_popup_container.cc @@ -21,6 +21,8 @@ #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/common/notification_service.h" +#include "chrome/common/pref_names.h" +#include "chrome/common/pref_service.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "views/background.h" @@ -221,7 +223,7 @@ bool BlockedPopupContainerView::IsItemChecked(int id) const { } void BlockedPopupContainerView::ExecuteCommand(int id) { - DCHECK(id > 0); + DCHECK_GT(id, 0); size_t id_size_t = static_cast<size_t>(id); if (id_size_t > kImpossibleNumberOfPopups) { // Decrement id since all index based commands have 1 added to them. (See @@ -233,33 +235,28 @@ void BlockedPopupContainerView::ExecuteCommand(int id) { } } +BlockedPopupContainer::~BlockedPopupContainer() { +} + +// static +void BlockedPopupContainer::RegisterUserPrefs(PrefService* prefs) { + prefs->RegisterListPref(prefs::kPopupWhitelistedHosts); +} + // static BlockedPopupContainer* BlockedPopupContainer::Create( TabContents* owner, Profile* profile, const gfx::Point& initial_anchor) { - BlockedPopupContainer* container = new BlockedPopupContainer(owner, profile); + BlockedPopupContainer* container = + new BlockedPopupContainer(owner, profile->GetPrefs()); container->Init(initial_anchor); return container; } -BlockedPopupContainer::~BlockedPopupContainer() { -} - -BlockedPopupContainer::BlockedPopupContainer(TabContents* owner, - Profile* profile) - : Animation(kFramerate, NULL), - owner_(owner), - container_view_(NULL), - has_been_dismissed_(false), - in_show_animation_(false), - visibility_percentage_(0) { -} - void BlockedPopupContainer::AddTabContents(TabContents* tab_contents, const gfx::Rect& bounds, const std::string& host) { - bool whitelisted = false; // TODO: Check if host is on whitelist. - // Show whitelisted popups immediately. + bool whitelisted = !!whitelist_.count(host); if (whitelisted) owner_->AddNewContents(tab_contents, NEW_POPUP, bounds, true, GURL()); @@ -293,7 +290,7 @@ void BlockedPopupContainer::AddTabContents(TabContents* tab_contents, if (i == popup_hosts_.end()) popup_hosts_[host] = whitelisted; else - DCHECK(!i->second); // This host was already reported as whitelisted! + DCHECK_EQ(whitelisted, i->second); // Update UI. container_view_->UpdateLabel(); @@ -364,9 +361,13 @@ void BlockedPopupContainer::ToggleWhitelistingForHost(size_t index) { const std::string& host = i->first; bool should_whitelist = !i->second; popup_hosts_[host] = should_whitelist; - // TODO: Update whitelist pref. + ListValue* whitelist_pref = + prefs_->GetMutableList(prefs::kPopupWhitelistedHosts); if (should_whitelist) { + whitelist_.insert(host); + whitelist_pref->Append(new StringValue(host)); + // Open the popups in order. for (size_t j = 0; j < blocked_popups_.size(); ) { if (blocked_popups_[j].host == host) @@ -375,6 +376,10 @@ void BlockedPopupContainer::ToggleWhitelistingForHost(size_t index) { ++j; } } else { + // Remove from whitelist. + whitelist_.erase(host); + whitelist_pref->Remove(StringValue(host)); + for (UnblockedPopups::iterator i(unblocked_popups_.begin()); i != unblocked_popups_.end(); ) { TabContents* tab_contents = i->first; @@ -482,6 +487,29 @@ ExtensionFunctionDispatcher* BlockedPopupContainer:: // private: +BlockedPopupContainer::BlockedPopupContainer(TabContents* owner, + PrefService* prefs) + : Animation(kFramerate, NULL), + owner_(owner), + prefs_(prefs), + container_view_(NULL), + has_been_dismissed_(false), + in_show_animation_(false), + visibility_percentage_(0) { + // Copy whitelist pref into local member that's easier to use. + const ListValue* whitelist_pref = + prefs_->GetList(prefs::kPopupWhitelistedHosts); + // Careful: The returned value could be NULL if the pref has never been set. + if (whitelist_pref != NULL) { + for (ListValue::const_iterator i(whitelist_pref->begin()); + i != whitelist_pref->end(); ++i) { + std::string host; + (*i)->GetAsString(&host); + whitelist_.insert(host); + } + } +} + void BlockedPopupContainer::AnimateToState(double state) { visibility_percentage_ = in_show_animation_ ? state : (1 - state); SetPosition(); diff --git a/chrome/browser/views/blocked_popup_container.h b/chrome/browser/views/blocked_popup_container.h index 894cc42..640bdd0 100644 --- a/chrome/browser/views/blocked_popup_container.h +++ b/chrome/browser/views/blocked_popup_container.h @@ -10,6 +10,7 @@ #ifndef CHROME_BROWSER_VIEWS_BLOCKED_POPUP_CONTAINER_H_ #define CHROME_BROWSER_VIEWS_BLOCKED_POPUP_CONTAINER_H_ +#include <set> #include <utility> #include <vector> @@ -25,6 +26,7 @@ #include "views/widget/widget_win.h" class BlockedPopupContainer; +class PrefService; class Profile; class TabContents; class TextButton; @@ -93,6 +95,8 @@ class BlockedPopupContainer : public Animation, public: virtual ~BlockedPopupContainer(); + static void RegisterUserPrefs(PrefService* prefs); + // Creates a BlockedPopupContainer, anchoring the container to the lower // right corner. static BlockedPopupContainer* Create( @@ -200,7 +204,7 @@ class BlockedPopupContainer : public Animation, virtual void UpdateTargetURL(TabContents* source, const GURL& url) { } // Creates an ExtensionFunctionDispatcher that has no browser - virtual ExtensionFunctionDispatcher *CreateExtensionFunctionDispatcher( + virtual ExtensionFunctionDispatcher* CreateExtensionFunctionDispatcher( RenderViewHost* render_view_host, const std::string& extension_id); @@ -224,8 +228,11 @@ class BlockedPopupContainer : public Animation, // string is hostname. bool is whitelisted status. typedef std::map<std::string, bool> PopupHosts; + // string is hostname. + typedef std::set<std::string> Whitelist; + // Creates a container for a certain TabContents. - BlockedPopupContainer(TabContents* owner, Profile* profile); + BlockedPopupContainer(TabContents* owner, PrefService* prefs); // Overridden from Animation: // Changes the visibility percentage of the BlockedPopupContainer. This is @@ -279,9 +286,15 @@ class BlockedPopupContainer : public Animation, // The TabContents that owns and constrains this BlockedPopupContainer. TabContents* owner_; + // The PrefService we can query to find out what's on the whitelist. + PrefService* prefs_; + // Registrar to handle notifications we care about. NotificationRegistrar registrar_; + // The whitelisted hosts, which we allow to open popups directly. + Whitelist whitelist_; + // Information about all blocked popups. BlockedPopups blocked_popups_; |