summaryrefslogtreecommitdiffstats
path: root/chrome/browser/blocked_popup_container.h
diff options
context:
space:
mode:
authorpkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-02 10:40:49 +0000
committerpkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-02 10:40:49 +0000
commit8cc8d4914c363a3308fdbae1415e2a3fbbce8e9e (patch)
treef2b38543aa09fd9945341376bfca465b7efbbf92 /chrome/browser/blocked_popup_container.h
parent458788376076d57d182ca22060b335d2e5f2e18f (diff)
downloadchromium_src-8cc8d4914c363a3308fdbae1415e2a3fbbce8e9e.zip
chromium_src-8cc8d4914c363a3308fdbae1415e2a3fbbce8e9e.tar.gz
chromium_src-8cc8d4914c363a3308fdbae1415e2a3fbbce8e9e.tar.bz2
Wire popup blocking UI to the new machinery and port over the user's old whitelist.
Notably, this removes the UI entirely for Mac and Linux. We need to rebuild it. This also guts the old system's testing, since most of it disappeared or changed radically. We should test the new stuff. I will file a followup bug for that. There are various tiny edge cases, like if you click the address bar icon really quickly, sometimes you'll get popups without any title yet, which makes them leave gaps in the bubble that appears. We can fix that sort of thing. The critical bit I tried to ensure was that we never try to open a dead popup or use a dead TabContents, no matter what. BUG=33314 TEST=Go visit some sites with popups and play with things Review URL: http://codereview.chromium.org/562013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37819 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/blocked_popup_container.h')
-rw-r--r--chrome/browser/blocked_popup_container.h240
1 files changed, 17 insertions, 223 deletions
diff --git a/chrome/browser/blocked_popup_container.h b/chrome/browser/blocked_popup_container.h
index c3c5682..1cbc0f2 100644
--- a/chrome/browser/blocked_popup_container.h
+++ b/chrome/browser/blocked_popup_container.h
@@ -1,157 +1,43 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
-// source code is governed by a BSD-style license that can be found in the
-// LICENSE file.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
// Defines the public interface for the blocked popup notifications. This
// interface should only be used by TabContents. Users and subclasses of
// TabContents should use the appropriate methods on TabContents to access
// information about blocked popups.
-// TODO(idanan): Rename class to BlockedContentContainer.
-
#ifndef CHROME_BROWSER_BLOCKED_POPUP_CONTAINER_H_
#define CHROME_BROWSER_BLOCKED_POPUP_CONTAINER_H_
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "app/gfx/native_widget_types.h"
-#include "base/gfx/rect.h"
-#include "base/string16.h"
-#include "chrome/browser/tab_contents/constrained_window.h"
#include "chrome/browser/tab_contents/tab_contents_delegate.h"
-#include "chrome/common/notification_registrar.h"
-
-class BlockedPopupContainer;
-class PrefService;
-class Profile;
-class TabContents;
-
-// Interface that the BlockedPopupContainer model/controller uses to
-// communicate with its platform specific view.
-class BlockedPopupContainerView {
- public:
- // Platform specific constructor used by BlockedPopupContainer to create a
- // view that is displayed to the user.
- static BlockedPopupContainerView* Create(BlockedPopupContainer* container);
-
- // Notification that the view should properly position itself in |view|.
- virtual void SetPosition() = 0;
-
- // Shows the blocked popup view / Animates the blocked popup view in.
- virtual void ShowView() = 0;
- // Sets the text in the blocked popup label.
- virtual void UpdateLabel() = 0;
-
- // Hides the blocked popup view / Animates the blocked popup view out.
- virtual void HideView() = 0;
-
- // Called by the BlockedPopupContainer that owns us. Destroys the view or
- // starts a delayed Task to destroy the View at some later time.
- virtual void Destroy() = 0;
-
- virtual ~BlockedPopupContainerView() {}
-};
-
-// Takes ownership of TabContents that are unrequested popup windows and
-// presents an interface to the user for launching them. (Or never showing them
-// again). This class contains all the cross-platform bits that can be used in
-// all ports.
-//
-// +- BlockedPopupContainer ---+ +- BlockedPopupContainerView -----+
-// | All model logic | +--->| Abstract cross platform |
-// | | | | interface |
-// | | | | |
-// | Owns a platform view_ +----+ | |
-// +---------------------------+ +---------------------------------+
-// ^
-// |
-// +-------------------------------+-----------+
-// | |
-// +- BPCViewGtk -----------+ +- BPCViewWin ----------------------+
-// | Gtk UI | | Views UI |
-// | | | |
-// +------------------------+ +-----------------------------------+
-//
-// Getting here will take multiple patches.
-class BlockedPopupContainer : public TabContentsDelegate,
- public NotificationObserver {
+// Takes ownership of TabContents that are unrequested popup windows.
+class BlockedPopupContainer : public TabContentsDelegate {
public:
- // Creates a BlockedPopupContainer, anchoring the container to the lower
- // right corner.
- static BlockedPopupContainer* Create(TabContents* owner, Profile* profile);
-
- static void RegisterUserPrefs(PrefService* prefs);
-
- // Returns the profile associated with the Browser this container exists in.
- Profile* profile() const { return profile_; }
+ typedef std::vector<TabContents*> BlockedContents;
- // Sets this BlockedPopupContainer's view. BlockedPopupContainer now owns
- // |view| and is responsible for calling Destroy() on it.
- void set_view(BlockedPopupContainerView* view) { view_ = view; }
+ // Creates a container for a certain TabContents:
+ explicit BlockedPopupContainer(TabContents* owner);
// Adds a popup to this container. |bounds| are the window bounds requested by
// the popup window.
void AddTabContents(TabContents* tab_contents,
- const gfx::Rect& bounds,
- const std::string& host);
+ const gfx::Rect& bounds);
- // Shows the blocked popup at index |index|.
- void LaunchPopupAtIndex(size_t index);
+ // Shows the blocked popup with TabContents |tab_contents|.
+ void LaunchPopupForContents(TabContents* tab_contents);
- // Returns the number of blocked popups
+ // Returns the number of blocked popups.
size_t GetBlockedPopupCount() const;
- // Adds a blocked notice if one is not already there for the same host.
- void AddBlockedNotice(const GURL& url, const string16& reason);
-
- // Returns the hostname and reason for notice |index|.
- void GetHostAndReasonForNotice(size_t index,
- std::string* host,
- string16* reason) const;
-
- // Returns the number of blocked notices, popups don't count.
- size_t GetBlockedNoticeCount() const;
-
- // Returns true if host |index| is whitelisted.
- // NOTE: Does not sanity-check; do not pass an invalid index!
- bool IsHostWhitelisted(size_t index) const;
-
- // If host |index| is currently whitelisted, un-whitelists it. Otherwise,
- // whitelists it and opens all blocked popups from it.
- // NOTE: Does not sanity-check; do not pass an invalid index!
- void ToggleWhitelistingForHost(size_t index);
-
- // Deletes all popups and hides the interface parts.
- void CloseAll();
+ // Returns the contained TabContents pointers. |blocked_contents| must be
+ // non-NULL.
+ void GetBlockedContents(BlockedContents* blocked_contents) const;
// Sets this object up to delete itself.
void Destroy();
- // Message called when a BlockedPopupContainer should move itself to the
- // bottom right corner of our parent view.
- void RepositionBlockedPopupContainer();
-
- // Returns the TabContents for the blocked popup |index|.
- TabContents* GetTabContentsAt(size_t index) const;
-
- // Returns the names of hosts showing popups.
- std::vector<std::string> GetHosts() const;
-
- // Returns the number of popup hosts.
- size_t GetPopupHostCount() const {
- return popup_hosts_.size();
- }
-
- // Deletes all local state.
- void ClearData();
-
- // Called to force this container to never show itself again.
- void set_dismissed() { has_been_dismissed_ = true; }
-
// Overridden from TabContentsDelegate:
// Forwards OpenURLFromTab to our |owner_|.
@@ -206,114 +92,22 @@ class BlockedPopupContainer : public TabContentsDelegate,
protected:
struct BlockedPopup {
BlockedPopup(TabContents* tab_contents,
- const gfx::Rect& bounds,
- const std::string& host)
- : tab_contents(tab_contents), bounds(bounds), host(host) {
+ const gfx::Rect& bounds)
+ : tab_contents(tab_contents), bounds(bounds) {
}
TabContents* tab_contents;
gfx::Rect bounds;
- std::string host;
};
typedef std::vector<BlockedPopup> BlockedPopups;
- // TabContents is the popup contents. string is opener hostname.
- typedef std::map<TabContents*, std::string> UnblockedPopups;
-
- // string is hostname. bool is whitelisted status.
- typedef std::map<std::string, bool> PopupHosts;
-
- struct BlockedNotice {
- BlockedNotice(const GURL& url, const string16& reason)
- : url_(url), reason_(reason) {}
-
- GURL url_;
- string16 reason_;
- };
- typedef std::vector<BlockedNotice> BlockedNotices;
-
- // Hosts with notifications showing.
- typedef std::set<std::string> NoticeHosts;
-
- // Creates a BlockedPopupContainer, anchoring the container to the lower
- // right corner using the given BlockedPopupContainerView. Use only for
- // testing.
- static BlockedPopupContainer* Create(TabContents* owner, Profile* profile,
- BlockedPopupContainerView* view);
-
- // Hides the UI portion of the container.
- void HideSelf();
-
- // Helper function to convert a host index (which the view uses) into an
- // iterator into |popup_hosts_|. Returns popup_hosts_.end() if |index| is
- // invalid.
- PopupHosts::const_iterator ConvertHostIndexToIterator(size_t index) const;
-
- // Removes the popup at |i| from the blocked popup list. If this popup's host
- // is not otherwised referenced on either popup list, removes the host from
- // the host list. Updates the view's label to match the new state.
- void EraseDataForPopupAndUpdateUI(BlockedPopups::iterator i);
-
- // Same as above, but works on the unblocked popup list.
- void EraseDataForPopupAndUpdateUI(UnblockedPopups::iterator i);
-
private:
- friend class BlockedPopupContainerImpl;
- friend class BlockedPopupContainerTest;
- friend class BlockedPopupContainerControllerTest;
-
- // string is hostname.
- typedef std::set<std::string> Whitelist;
-
- // Creates a container for a certain TabContents:
- BlockedPopupContainer(TabContents* owner, Profile* profile);
-
- // Either hides the view if there are no popups, or updates the label if
- // there are.
- void UpdateView();
-
- // Overridden from notificationObserver:
- virtual void Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details);
-
// The TabContents that owns and constrains this BlockedPopupContainer.
TabContents* owner_;
- // The PrefService we can query to find out what's on the whitelist. If the
- // profile is off the record, this will be NULL.
- PrefService* prefs_;
-
- // Once the container is hidden, this is set to prevent it from reappearing.
- bool has_been_dismissed_;
-
- // 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_;
- // Information about all unblocked popups.
- UnblockedPopups unblocked_popups_;
-
- // Information about all popup hosts.
- PopupHosts popup_hosts_;
-
- // Notices for all blocked resources.
- BlockedNotices blocked_notices_;
-
- // Hosts which had notifications shown.
- NoticeHosts notice_hosts_;
-
- // Our platform specific view.
- BlockedPopupContainerView* view_;
-
- // The profile for the browser associated with the container.
- Profile* profile_;
-
DISALLOW_IMPLICIT_CONSTRUCTORS(BlockedPopupContainer);
};