blob: 2d5ef6a0cc582de3219d4f91df48773fd1b4a5a1 [file] [log] [blame]
// 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.
// 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;
};
// 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 {
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_; }
// Sets this BlockedPopupContainer's view. BlockedPopupContainer now owns
// |view| and is responsible for calling Destroy() on it.
void set_view(BlockedPopupContainerView* view) { view_ = view; }
// 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);
// Shows the blocked popup at index |index|.
void LaunchPopupAtIndex(size_t index);
// 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();
// 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_|.
virtual void OpenURLFromTab(TabContents* source,
const GURL& url, const GURL& referrer,
WindowOpenDisposition disposition,
PageTransition::Type transition);
// Ignored; BlockedPopupContainer doesn't display a throbber.
virtual void NavigationStateChanged(const TabContents* source,
unsigned changed_flags) { }
// Forwards AddNewContents to our |owner_|.
virtual void AddNewContents(TabContents* source,
TabContents* new_contents,
WindowOpenDisposition disposition,
const gfx::Rect& initial_position,
bool user_gesture);
// Ignore activation requests from the TabContents we're blocking.
virtual void ActivateContents(TabContents* contents) { }
// Ignored; BlockedPopupContainer doesn't display a throbber.
virtual void LoadingStateChanged(TabContents* source) { }
// Removes |source| from our internal list of blocked popups.
virtual void CloseContents(TabContents* source);
// Changes the opening rectangle associated with |source|.
virtual void MoveContents(TabContents* source, const gfx::Rect& new_bounds);
// Always returns true.
virtual bool IsPopup(TabContents* source);
// Returns our |owner_|.
virtual TabContents* GetConstrainingContents(TabContents* source);
// Ignored; BlockedPopupContainer doesn't display a toolbar.
virtual void ToolbarSizeChanged(TabContents* source, bool is_animating) { }
// Ignored; BlockedPopupContainer doesn't display a bookmarking star.
virtual void URLStarredChanged(TabContents* source, bool starred) { }
// Ignored; BlockedPopupContainer doesn't display a URL bar.
virtual void UpdateTargetURL(TabContents* source, const GURL& url) { }
// A number larger than the internal popup count on the Renderer; meant for
// preventing a compromised renderer from exhausting GDI memory by spawning
// infinite windows.
static const size_t kImpossibleNumberOfPopups;
protected:
struct BlockedPopup {
BlockedPopup(TabContents* tab_contents,
const gfx::Rect& bounds,
const std::string& host)
: tab_contents(tab_contents), bounds(bounds), host(host) {
}
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);
};
#endif // CHROME_BROWSER_BLOCKED_POPUP_CONTAINER_H_