diff options
author | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-02 11:15:57 +0000 |
---|---|---|
committer | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-02 11:15:57 +0000 |
commit | 63e6ede2a5026a96b22856474a40067ef87ba088 (patch) | |
tree | 9a0fda8ab72a5ec7be7684823352643f7ece5933 /chrome | |
parent | 01b6b61c9e61ba79bccd2036b7f85b6113827379 (diff) | |
download | chromium_src-63e6ede2a5026a96b22856474a40067ef87ba088.zip chromium_src-63e6ede2a5026a96b22856474a40067ef87ba088.tar.gz chromium_src-63e6ede2a5026a96b22856474a40067ef87ba088.tar.bz2 |
Merge 37819 - 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
TBR=pkasting@chromium.org
Review URL: http://codereview.chromium.org/560010
git-svn-id: svn://svn.chromium.org/chrome/branches/249/src@37821 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
36 files changed, 229 insertions, 2911 deletions
diff --git a/chrome/app/chrome_dll.rc b/chrome/app/chrome_dll.rc index 1e6d185..1d9e162 100644 --- a/chrome/app/chrome_dll.rc +++ b/chrome/app/chrome_dll.rc @@ -39,7 +39,6 @@ BEGIN VK_DELETE, IDC_CLEAR_BROWSING_DATA, VIRTKEY, CONTROL, SHIFT VK_F4, IDC_CLOSE_TAB, VIRTKEY, CONTROL "W", IDC_CLOSE_TAB, VIRTKEY, CONTROL - "W", IDC_CLOSE_POPUPS, VIRTKEY, SHIFT, ALT "W", IDC_CLOSE_WINDOW, VIRTKEY, CONTROL, SHIFT "F", IDC_FIND, VIRTKEY, CONTROL "G", IDC_FIND_NEXT, VIRTKEY, CONTROL diff --git a/chrome/app/chrome_dll_resource.h b/chrome/app/chrome_dll_resource.h index 4aee050..be95402 100644 --- a/chrome/app/chrome_dll_resource.h +++ b/chrome/app/chrome_dll_resource.h @@ -113,10 +113,9 @@ #define IDC_BOOKMARK_PAGE 35000 #define IDC_BOOKMARK_ALL_TABS 35001 #define IDC_VIEW_SOURCE 35002 -#define IDC_CLOSE_POPUPS 35003 -#define IDC_PRINT 35004 -#define IDC_SAVE_PAGE 35005 -#define IDC_ENCODING_MENU 35006 +#define IDC_PRINT 35003 +#define IDC_SAVE_PAGE 35004 +#define IDC_ENCODING_MENU 35005 // When adding a new encoding to this list, be sure to append it to the // EncodingMenuController::kValidEncodingIds array in diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 679cd88..8e76c9d 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -5598,36 +5598,6 @@ Keep your key file in a safe place. You will need it to create new versions of y Continue </message> - <!-- Constrained Window --> - <message name="IDS_BLOCKED_POPUP" desc="Text on a blocked popup's window titlebar."> - Blocked Pop-up - </message> - <message name="IDS_POPUPS_BLOCKED_COUNT" desc="Message on the blocked popup window when there are blocked popups"> - Pop-ups Blocked: <ph name="COUNT">$1<ex>2</ex></ph> - </message> - <message name="IDS_POPUPS_UNBLOCKED" desc="Message on the blocked popup window when there are only whitelisted popups"> - Manage pop-ups - </message> - <message name="IDS_POPUP_TITLE_FORMAT" desc="Order of URL - Title on the popup"> - <ph name="URL">$1</ph> - <ph name="WINDOW_TITLE">$2</ph> - </message> - <message name="IDS_NOTICE_TITLE_FORMAT" desc="Order of URL - Reason"> - <ph name="URL">$1</ph> - <ph name="REASON">$2</ph> - </message> - <if expr="not pp_ifdef('use_titlecase')"> - <message name="IDS_POPUP_HOST_FORMAT" desc="Checkable menu item to always allow popups from a particular hostname"> - Always show pop-ups from <ph name="URL">$1</ph> - </message> - </if> - <if expr="pp_ifdef('use_titlecase')"> - <message name="IDS_POPUP_HOST_FORMAT" desc="In Title Case: Checkable menu item to always allow popups from a particular hostname"> - Always Show Pop-ups From <ph name="URL">$1</ph> - </message> - </if> - <message name="IDS_BLOCKED_NOTICE_COUNT" desc="Message shown in the corner of the content window when there are blocked items."> - Blocked Items: <ph name="COUNT">$1<ex>2</ex></ph> - </message> - <!-- Multiple download warning--> <message name="IDS_MULTI_DOWNLOAD_WARNING" desc="Warning invoked if multiple downloads are attempted without user interaction."> This site is attempting to download multiple files. Do you want to allow this? diff --git a/chrome/browser/blocked_popup_container.cc b/chrome/browser/blocked_popup_container.cc index 183a125..ae52604 100644 --- a/chrome/browser/blocked_popup_container.cc +++ b/chrome/browser/blocked_popup_container.cc @@ -1,234 +1,73 @@ -// 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. +// 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. #include "chrome/browser/blocked_popup_container.h" -#include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/tab_contents.h" -#include "chrome/common/pref_names.h" -#include "chrome/common/pref_service.h" -#include "chrome/common/notification_service.h" // static const size_t BlockedPopupContainer::kImpossibleNumberOfPopups = 30; -// static -BlockedPopupContainer* BlockedPopupContainer::Create( - TabContents* owner, Profile* profile) { - BlockedPopupContainer* container = - new BlockedPopupContainer(owner, profile); - BlockedPopupContainerView* view = - BlockedPopupContainerView::Create(container); - container->set_view(view); - return container; -} - -// static -BlockedPopupContainer* BlockedPopupContainer::Create( - TabContents* owner, Profile* profile, BlockedPopupContainerView* view) { - BlockedPopupContainer* container = - new BlockedPopupContainer(owner, profile); - container->set_view(view); - return container; -} - -// static -void BlockedPopupContainer::RegisterUserPrefs(PrefService* prefs) { - prefs->RegisterListPref(prefs::kPopupWhitelistedHosts); +BlockedPopupContainer::BlockedPopupContainer(TabContents* owner) + : owner_(owner) { } void BlockedPopupContainer::AddTabContents(TabContents* tab_contents, - const gfx::Rect& bounds, - const std::string& host) { - // Show whitelisted popups immediately. - bool whitelisted = !!whitelist_.count(host); - if (whitelisted) - owner_->AddNewContents(tab_contents, NEW_POPUP, bounds, true); - - if (has_been_dismissed_) { - // Don't want to show any other UI. - if (!whitelisted) - delete tab_contents; // Discard blocked popups entirely. + const gfx::Rect& bounds) { + if (blocked_popups_.size() == (kImpossibleNumberOfPopups - 1)) { + delete tab_contents; + LOG(INFO) << "Warning: Renderer is sending more popups to us than should " + "be possible. Renderer compromised?"; return; } - if (whitelisted) { - // Listen for this popup's destruction, so if the user closes it manually, - // we'll know to stop caring about it. - registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED, - Source<TabContents>(tab_contents)); - - unblocked_popups_[tab_contents] = host; - } else { - if (blocked_popups_.size() == (kImpossibleNumberOfPopups - 1)) { - delete tab_contents; - LOG(INFO) << "Warning: Renderer is sending more popups to us than should " - "be possible. Renderer compromised?"; - return; - } - blocked_popups_.push_back(BlockedPopup(tab_contents, bounds, host)); - - tab_contents->set_delegate(this); - } - - PopupHosts::const_iterator i(popup_hosts_.find(host)); - if (i == popup_hosts_.end()) - popup_hosts_[host] = whitelisted; - else - DCHECK_EQ(whitelisted, i->second); - - UpdateView(); - view_->ShowView(); - owner_->PopupNotificationVisibilityChanged(true); + blocked_popups_.push_back(BlockedPopup(tab_contents, bounds)); + tab_contents->set_delegate(this); + if (blocked_popups_.size() == 1) + owner_->PopupNotificationVisibilityChanged(true); } -void BlockedPopupContainer::LaunchPopupAtIndex(size_t index) { - if (index >= blocked_popups_.size()) - return; - +void BlockedPopupContainer::LaunchPopupForContents(TabContents* tab_contents) { // Open the popup. - BlockedPopups::iterator i(blocked_popups_.begin() + index); - TabContents* tab_contents = i->tab_contents; - tab_contents->set_delegate(NULL); - owner_->AddNewContents(tab_contents, NEW_POPUP, i->bounds, true); - - const std::string& host = i->host; - if (!host.empty()) { - // Listen for this popup's destruction, so if the user closes it manually, - // we'll know to stop caring about it. - registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED, - Source<TabContents>(tab_contents)); - - // Add the popup to the unblocked list. (Do this before the below call!) - unblocked_popups_[tab_contents] = i->host; + for (BlockedPopups::iterator i(blocked_popups_.begin()); + i != blocked_popups_.end(); ++i) { + if (i->tab_contents == tab_contents) { + tab_contents->set_delegate(NULL); + owner_->AddNewContents(tab_contents, NEW_POPUP, i->bounds, true); + blocked_popups_.erase(i); + break; + } } - // Remove the popup from the blocked list. - EraseDataForPopupAndUpdateUI(i); -} - -void BlockedPopupContainer::AddBlockedNotice(const GURL& url, - const string16& reason) { - // Nothing to show after we have been dismissed. - if (has_been_dismissed_) - return; - - // Don't notify for hosts which are already shown. Too much noise otherwise. - // TODO(idanan): Figure out what to do for multiple reasons of blocking the - // same host. - if (notice_hosts_.find(url.host()) != notice_hosts_.end()) - return; - - notice_hosts_.insert(url.host()); - blocked_notices_.push_back(BlockedNotice(url, reason)); - - UpdateView(); - view_->ShowView(); - owner_->PopupNotificationVisibilityChanged(true); -} - -void BlockedPopupContainer::GetHostAndReasonForNotice(size_t index, - std::string* host, - string16* reason) const { - DCHECK(host); - DCHECK(reason); - *host = blocked_notices_[index].url_.host(); - *reason = blocked_notices_[index].reason_; + if (blocked_popups_.empty()) + Destroy(); } size_t BlockedPopupContainer::GetBlockedPopupCount() const { return blocked_popups_.size(); } -size_t BlockedPopupContainer::GetBlockedNoticeCount() const { - return blocked_notices_.size(); -} - -bool BlockedPopupContainer::IsHostWhitelisted(size_t index) const { - return ConvertHostIndexToIterator(index)->second; -} - -void BlockedPopupContainer::ToggleWhitelistingForHost(size_t index) { - PopupHosts::const_iterator i(ConvertHostIndexToIterator(index)); - const std::string& host = i->first; - bool should_whitelist = !i->second; - popup_hosts_[host] = should_whitelist; - - 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) - LaunchPopupAtIndex(j); // This shifts the rest of the entries down. - else - ++j; - } - } else { - // Remove from whitelist. - whitelist_.erase(host); - StringValue host_as_string(host); - whitelist_pref->Remove(host_as_string); - - for (UnblockedPopups::iterator i(unblocked_popups_.begin()); - i != unblocked_popups_.end(); ) { - TabContents* tab_contents = i->first; - TabContentsDelegate* delegate = tab_contents->delegate(); - if ((i->second == host) && delegate->IsPopup(tab_contents)) { - // Convert the popup back into a blocked popup. - delegate->DetachContents(tab_contents); - tab_contents->set_delegate(this); - - // Add the popup to the blocked list. (Do this before the below call!) - gfx::Rect bounds; - tab_contents->GetContainerBounds(&bounds); - blocked_popups_.push_back(BlockedPopup(tab_contents, bounds, host)); - - // Remove the popup from the unblocked list. - UnblockedPopups::iterator to_erase = i; - ++i; - EraseDataForPopupAndUpdateUI(to_erase); - } else { - ++i; - } - } - } -} - -void BlockedPopupContainer::CloseAll() { - ClearData(); - HideSelf(); +void BlockedPopupContainer::GetBlockedContents( + BlockedContents* blocked_contents) const { + DCHECK(blocked_contents); + for (BlockedPopups::const_iterator i(blocked_popups_.begin()); + i != blocked_popups_.end(); ++i) + blocked_contents->push_back(i->tab_contents); } void BlockedPopupContainer::Destroy() { - view_->Destroy(); - - ClearData(); - GetConstrainingContents(NULL)->WillCloseBlockedPopupContainer(this); - + for (BlockedPopups::iterator i(blocked_popups_.begin()); + i != blocked_popups_.end(); ++i) { + TabContents* tab_contents = i->tab_contents; + tab_contents->set_delegate(NULL); + delete tab_contents; + } + blocked_popups_.clear(); + owner_->WillCloseBlockedPopupContainer(this); delete this; } -void BlockedPopupContainer::RepositionBlockedPopupContainer() { - view_->SetPosition(); -} - -TabContents* BlockedPopupContainer::GetTabContentsAt(size_t index) const { - return blocked_popups_[index].tab_contents; -} - -std::vector<std::string> BlockedPopupContainer::GetHosts() const { - std::vector<std::string> hosts; - for (PopupHosts::const_iterator i(popup_hosts_.begin()); - i != popup_hosts_.end(); ++i) - hosts.push_back(i->first); - return hosts; -} - // Overridden from TabContentsDelegate: void BlockedPopupContainer::OpenURLFromTab(TabContents* source, const GURL& url, @@ -248,12 +87,12 @@ void BlockedPopupContainer::AddNewContents(TabContents* source, } void BlockedPopupContainer::CloseContents(TabContents* source) { - for (BlockedPopups::iterator it = blocked_popups_.begin(); - it != blocked_popups_.end(); ++it) { - TabContents* tab_contents = it->tab_contents; + for (BlockedPopups::iterator i(blocked_popups_.begin()); + i != blocked_popups_.end(); ++i) { + TabContents* tab_contents = i->tab_contents; if (tab_contents == source) { tab_contents->set_delegate(NULL); - EraseDataForPopupAndUpdateUI(it); + blocked_popups_.erase(i); delete tab_contents; break; } @@ -262,10 +101,10 @@ void BlockedPopupContainer::CloseContents(TabContents* source) { void BlockedPopupContainer::MoveContents(TabContents* source, const gfx::Rect& new_bounds) { - for (BlockedPopups::iterator it = blocked_popups_.begin(); - it != blocked_popups_.end(); ++it) { - if (it->tab_contents == source) { - it->bounds = new_bounds; + for (BlockedPopups::iterator i(blocked_popups_.begin()); + i != blocked_popups_.end(); ++i) { + if (i->tab_contents == source) { + i->bounds = new_bounds; break; } } @@ -279,142 +118,3 @@ TabContents* BlockedPopupContainer::GetConstrainingContents( TabContents* source) { return owner_; } - -void BlockedPopupContainer::HideSelf() { - view_->HideView(); - owner_->PopupNotificationVisibilityChanged(false); -} - -void BlockedPopupContainer::ClearData() { - for (BlockedPopups::iterator i(blocked_popups_.begin()); - i != blocked_popups_.end(); ++i) { - TabContents* tab_contents = i->tab_contents; - tab_contents->set_delegate(NULL); - delete tab_contents; - } - blocked_popups_.clear(); - - registrar_.RemoveAll(); - unblocked_popups_.clear(); - - popup_hosts_.clear(); -} - -BlockedPopupContainer::PopupHosts::const_iterator - BlockedPopupContainer::ConvertHostIndexToIterator(size_t index) const { - if (index >= popup_hosts_.size()) - return popup_hosts_.end(); - // If only there was a std::map::const_iterator::operator +=() ... - PopupHosts::const_iterator i(popup_hosts_.begin()); - for (size_t j = 0; j < index; ++j) - ++i; - return i; -} - -void BlockedPopupContainer::EraseDataForPopupAndUpdateUI( - BlockedPopups::iterator i) { - // Erase the host if this is the last popup for that host. - const std::string& host = i->host; - if (!host.empty()) { - bool should_erase_host = true; - for (BlockedPopups::const_iterator j(blocked_popups_.begin()); - j != blocked_popups_.end(); ++j) { - if ((j != i) && (j->host == host)) { - should_erase_host = false; - break; - } - } - if (should_erase_host) { - for (UnblockedPopups::const_iterator j(unblocked_popups_.begin()); - j != unblocked_popups_.end(); ++j) { - if (j->second == host) { - should_erase_host = false; - break; - } - } - if (should_erase_host) - popup_hosts_.erase(host); - } - } - - // Erase the popup and update the UI. - blocked_popups_.erase(i); - UpdateView(); -} - -void BlockedPopupContainer::EraseDataForPopupAndUpdateUI( - UnblockedPopups::iterator i) { - // Stop listening for this popup's destruction. - registrar_.Remove(this, NotificationType::TAB_CONTENTS_DESTROYED, - Source<TabContents>(i->first)); - - // Erase the host if this is the last popup for that host. - const std::string& host = i->second; - if (!host.empty()) { - bool should_erase_host = true; - for (UnblockedPopups::const_iterator j(unblocked_popups_.begin()); - j != unblocked_popups_.end(); ++j) { - if ((j != i) && (j->second == host)) { - should_erase_host = false; - break; - } - } - if (should_erase_host) { - for (BlockedPopups::const_iterator j(blocked_popups_.begin()); - j != blocked_popups_.end(); ++j) { - if (j->host == host) { - should_erase_host = false; - break; - } - } - if (should_erase_host) - popup_hosts_.erase(host); - } - } - - // Erase the popup and update the UI. - unblocked_popups_.erase(i); - UpdateView(); -} - - -// private: - -BlockedPopupContainer::BlockedPopupContainer(TabContents* owner, - Profile* profile) - : owner_(owner), - prefs_(profile->GetPrefs()), - has_been_dismissed_(false), - view_(NULL), - profile_(profile) { - // 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::UpdateView() { - if (blocked_popups_.empty() && unblocked_popups_.empty() && - blocked_notices_.empty()) - HideSelf(); - else - view_->UpdateLabel(); -} - -void BlockedPopupContainer::Observe(NotificationType type, - const NotificationSource& source, - const NotificationDetails& details) { - DCHECK(type == NotificationType::TAB_CONTENTS_DESTROYED); - TabContents* tab_contents = Source<TabContents>(source).ptr(); - UnblockedPopups::iterator i(unblocked_popups_.find(tab_contents)); - DCHECK(i != unblocked_popups_.end()); - EraseDataForPopupAndUpdateUI(i); -} diff --git a/chrome/browser/blocked_popup_container.h b/chrome/browser/blocked_popup_container.h index 23b4547..7140303 100644 --- a/chrome/browser/blocked_popup_container.h +++ b/chrome/browser/blocked_popup_container.h @@ -1,155 +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 { +// Takes ownership of TabContents that are unrequested popup windows. +class BlockedPopupContainer : public TabContentsDelegate { 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_; } + 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_|. @@ -204,113 +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. - 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); }; diff --git a/chrome/browser/blocked_popup_container_interactive_uitest.cc b/chrome/browser/blocked_popup_container_interactive_uitest.cc deleted file mode 100644 index 754be30..0000000 --- a/chrome/browser/blocked_popup_container_interactive_uitest.cc +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright (c) 2006-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. - -#include <string> - -#include "app/l10n_util.h" -#include "base/file_path.h" -#include "base/gfx/rect.h" -#include "base/keyboard_codes.h" -#include "chrome/browser/view_ids.h" -#include "chrome/common/chrome_constants.h" -#include "chrome/test/automation/automation_constants.h" -#include "chrome/test/automation/browser_proxy.h" -#include "chrome/test/automation/tab_proxy.h" -#include "chrome/test/automation/window_proxy.h" -#include "chrome/test/ui/ui_test.h" -#include "grit/generated_resources.h" -#include "net/base/net_util.h" -#include "views/event.h" - -class BlockedPopupContainerInteractiveTest : public UITest { - protected: - BlockedPopupContainerInteractiveTest() { - show_window_ = true; - } - - virtual void SetUp() { - UITest::SetUp(); - - browser_ = automation()->GetBrowserWindow(0); - ASSERT_TRUE(browser_.get()); - - window_ = browser_->GetWindow(); - ASSERT_TRUE(window_.get()); - - tab_ = browser_->GetTab(0); - ASSERT_TRUE(tab_.get()); - } - - void NavigateMainTabTo(const std::string& file_name) { - FilePath filename(test_data_directory_); - filename = filename.AppendASCII("constrained_files"); - filename = filename.AppendASCII(file_name); - ASSERT_TRUE(tab_->NavigateToURL(net::FilePathToFileURL(filename))); - } - - void SimulateClickInCenterOf(const scoped_refptr<WindowProxy>& window) { - gfx::Rect tab_view_bounds; - ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_CONTAINER, - &tab_view_bounds, true)); - - // Simulate a click of the actual link to force user_gesture to be - // true; if we don't, the resulting popup will be constrained, which - // isn't what we want to test. - ASSERT_TRUE(window->SimulateOSClick(tab_view_bounds.CenterPoint(), - views::Event::EF_LEFT_BUTTON_DOWN)); - } - - scoped_refptr<BrowserProxy> browser_; - scoped_refptr<WindowProxy> window_; - scoped_refptr<TabProxy> tab_; -}; - -TEST_F(BlockedPopupContainerInteractiveTest, TestOpenAndResizeTo) { - NavigateMainTabTo("constrained_window_onload_resizeto.html"); - SimulateClickInCenterOf(window_); - - ASSERT_TRUE(automation()->WaitForWindowCountToBecome(2, 1000)); - - scoped_refptr<BrowserProxy> popup_browser(automation()->GetBrowserWindow(1)); - ASSERT_TRUE(popup_browser != NULL); - scoped_refptr<WindowProxy> popup_window(popup_browser->GetWindow()); - ASSERT_TRUE(popup_window != NULL); - - // Make sure we were created with the correct width and height. - gfx::Rect rect; - bool is_timeout = false; - ASSERT_TRUE(popup_window->GetViewBoundsWithTimeout( - VIEW_ID_TAB_CONTAINER, &rect, false, 1000, &is_timeout)); - ASSERT_FALSE(is_timeout); - EXPECT_EQ(300, rect.width()); - EXPECT_EQ(320, rect.height()); - -#if defined(OS_LINUX) - // It seems we have to wait a little bit for the widgets to spin up before - // we can start clicking on them. - PlatformThread::Sleep(500); -#endif - - SimulateClickInCenterOf(popup_window); - - // No idea how to wait here other then sleeping. This timeout used to be - // lower, then we started hitting it before it was done. :( - PlatformThread::Sleep(5000); - - // The actual content will be LESS than (200, 200) because resizeTo - // deals with a window's outer{Width,Height} instead of its - // inner{Width,Height}. - is_timeout = false; - ASSERT_TRUE(popup_window->GetViewBoundsWithTimeout( - VIEW_ID_TAB_CONTAINER, &rect, false, 1000, &is_timeout)); - ASSERT_FALSE(is_timeout); - EXPECT_LT(rect.height(), 200); -#if defined(OS_LINUX) - // On Linux we may run in an environment where there is no window frame. In - // this case our width might be exactly 200. The height will still be less - // because we have to show the location bar. - EXPECT_LE(rect.width(), 200); -#else - EXPECT_LT(rect.width(), 200); -#endif -} - -// Helper function used to get the number of blocked popups out of the window -// title. -bool ParseCountOutOfTitle(const std::wstring& title, int* output) { - // Since we will be reading the number of popup windows open by grabbing the - // number out of the window title, and that format string is localized, we - // need to find out the offset into that string. - const wchar_t* placeholder = L"XXXX"; - size_t offset = - l10n_util::GetStringF(IDS_POPUPS_BLOCKED_COUNT, placeholder). - find(placeholder); - - std::wstring number; - while (offset < title.size() && iswdigit(title[offset])) { - number += title[offset]; - offset++; - } - - return StringToInt(WideToUTF16(number), output); -} - -// Tests that in the window.open() equivalent of a fork bomb, we stop building -// windows. -// Flaky, http://crbug.com/26692. -TEST_F(BlockedPopupContainerInteractiveTest, FLAKY_DontSpawnEndlessPopups) { - NavigateMainTabTo("infinite_popups.html"); - SimulateClickInCenterOf(window_); - - ASSERT_TRUE(automation()->WaitForWindowCountToBecome(2, 1000)); - - scoped_refptr<BrowserProxy> popup_browser(automation()->GetBrowserWindow(1)); - ASSERT_TRUE(popup_browser.get()); - scoped_refptr<TabProxy> popup_tab(popup_browser->GetTab(0)); - ASSERT_TRUE(popup_tab.get()); - - // And now we spin, waiting to make sure that we don't spawn popup - // windows endlessly. The current limit is 25, so allowing for possible race - // conditions and one off errors, don't break out until we go over 30 popup - // windows (in which case we are bork bork bork). - const int kMaxPopupWindows = 30; - - int popup_window_count = 0; - int new_popup_window_count = 0; - int times_slept = 0; - bool continuing = true; - while (continuing && popup_window_count < kMaxPopupWindows) { - ASSERT_TRUE(popup_tab->GetBlockedPopupCount(&new_popup_window_count)); - if (new_popup_window_count == popup_window_count) { - if (times_slept == 10) { - continuing = false; - } else { - // Nothing intereseting is going on wait it out. - PlatformThread::Sleep(automation::kSleepTime); - times_slept++; - } - } else { - times_slept = 0; - } - - EXPECT_GE(new_popup_window_count, popup_window_count); - EXPECT_LE(new_popup_window_count, kMaxPopupWindows); - popup_window_count = new_popup_window_count; - } -} - -// Make sure that we refuse to close windows when a constrained popup is -// displayed. -TEST_F(BlockedPopupContainerInteractiveTest, FLAKY_WindowOpenWindowClosePopup) { - NavigateMainTabTo("openclose_main.html"); - SimulateClickInCenterOf(window_); - - ASSERT_TRUE(automation()->WaitForWindowCountToBecome(2, 5000)); - - // Make sure we have a blocked popup notification - scoped_refptr<BrowserProxy> popup_browser(automation()->GetBrowserWindow(1)); - ASSERT_TRUE(popup_browser.get()); - scoped_refptr<WindowProxy> popup_window(popup_browser->GetWindow()); - ASSERT_TRUE(popup_window.get()); - scoped_refptr<TabProxy> popup_tab(popup_browser->GetTab(0)); - ASSERT_TRUE(popup_tab.get()); - ASSERT_TRUE(popup_tab->WaitForBlockedPopupCountToChangeTo(1, 1000)); - - // Ensure we didn't close the first popup window. - ASSERT_FALSE(automation()->WaitForWindowCountToBecome(1, 3000)); -} - -TEST_F(BlockedPopupContainerInteractiveTest, BlockAlertFromBlockedPopup) { - NavigateMainTabTo("block_alert.html"); - - // Wait for there to be an app modal dialog (and fail if it's shown). - ASSERT_FALSE(automation()->WaitForAppModalDialog(4000)); - - // Ensure one browser window. - int browser_window_count; - ASSERT_TRUE(automation()->GetBrowserWindowCount(&browser_window_count)); - ASSERT_EQ(1, browser_window_count); - - // Ensure one blocked popup window: the popup didn't escape. - int popup_count = 0; - ASSERT_TRUE(tab_->GetBlockedPopupCount(&popup_count)); - ASSERT_EQ(1, popup_count); -} - -TEST_F(BlockedPopupContainerInteractiveTest, ShowAlertFromNormalPopup) { - NavigateMainTabTo("show_alert.html"); - SimulateClickInCenterOf(window_); - - ASSERT_TRUE(automation()->WaitForWindowCountToBecome(2, 5000)); - - scoped_refptr<BrowserProxy> popup_browser(automation()->GetBrowserWindow(1)); - ASSERT_TRUE(popup_browser.get()); - scoped_refptr<WindowProxy> popup_window(popup_browser->GetWindow()); - ASSERT_TRUE(popup_window.get()); - scoped_refptr<TabProxy> popup_tab(popup_browser->GetTab(0)); - ASSERT_TRUE(popup_tab.get()); - -#if defined(OS_LINUX) - // It seems we have to wait a little bit for the widgets to spin up before - // we can start clicking on them. - PlatformThread::Sleep(500); -#endif - - SimulateClickInCenterOf(popup_window); - - // Wait for there to be an app modal dialog. - ASSERT_TRUE(automation()->WaitForAppModalDialog(5000)); -} - -// Make sure that window focus works while creating a popup window so that we -// don't -TEST_F(BlockedPopupContainerInteractiveTest, DontBreakOnBlur) { - NavigateMainTabTo("window_blur_test.html"); - SimulateClickInCenterOf(window_); - - // Wait for the popup window to open. - ASSERT_TRUE(automation()->WaitForWindowCountToBecome(2, 1000)); - - // We popup shouldn't be closed by the onblur handler. - ASSERT_FALSE(automation()->WaitForWindowCountToBecome(1, 1500)); -} - -// Tests that tab related keyboard accelerators are reserved by the app. - -class BrowserInteractiveTest : public UITest { -}; - -TEST_F(BrowserInteractiveTest, ReserveKeyboardAccelerators) { - const std::string kBadPage = - "<html><script>" - "document.onkeydown = function() {" - " event.preventDefault();" - " return false;" - "}" - "</script></html>"; - scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); - browser->AppendTab(GURL("data:text/html," + kBadPage)); - int tab_count = 0; - ASSERT_TRUE(browser->GetTabCount(&tab_count)); - ASSERT_EQ(tab_count, 2); - - int active_tab = 0; - ASSERT_TRUE(browser->GetActiveTabIndex(&active_tab)); - ASSERT_EQ(active_tab, 1); - - scoped_refptr<WindowProxy> window(browser->GetWindow()); - ASSERT_TRUE(window->SimulateOSKeyPress( - base::VKEY_TAB, views::Event::EF_CONTROL_DOWN)); - ASSERT_TRUE(browser->WaitForTabToBecomeActive(0, action_max_timeout_ms())); - -#if !defined(OS_MACOSX) // see BrowserWindowCocoa::GetCommandId - ASSERT_TRUE(browser->ActivateTab(1)); - ASSERT_TRUE(window->SimulateOSKeyPress( - base::VKEY_W, views::Event::EF_CONTROL_DOWN)); - ASSERT_TRUE(browser->WaitForTabCountToBecome(1, action_max_timeout_ms())); -#endif -} diff --git a/chrome/browser/blocked_popup_container_unittest.cc b/chrome/browser/blocked_popup_container_unittest.cc deleted file mode 100644 index e57fec4..0000000 --- a/chrome/browser/blocked_popup_container_unittest.cc +++ /dev/null @@ -1,101 +0,0 @@ -// 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. - -// Tests the cross platform BlockedPopupContainer model/controller object. -// -// TODO(erg): The unit tests on BlockedPopupContainer need to be greatly -// expanded. - -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -#include "app/app_paths.h" -#include "base/path_service.h" -#include "chrome/browser/blocked_popup_container.h" -#include "chrome/browser/tab_contents/test_tab_contents.h" -#include "chrome/browser/renderer_host/test/test_render_view_host.h" -#include "chrome/test/testing_profile.h" -#include "net/base/net_util.h" - -namespace { -const std::string host1 = "host1"; -} // namespace - -// Mock for our view. -class MockBlockedPopupContainerView : public BlockedPopupContainerView { - public: - MOCK_METHOD0(SetPosition, void()); - MOCK_METHOD0(ShowView, void()); - MOCK_METHOD0(UpdateLabel, void()); - MOCK_METHOD0(HideView, void()); - MOCK_METHOD0(Destroy, void()); -}; - -class BlockedPopupContainerTest : public RenderViewHostTestHarness { - public: - TabContents* BuildTabContents() { - // This will be deleted when the TabContents goes away. - SiteInstance* instance = SiteInstance::CreateSiteInstance(profile_.get()); - - // Set up and use TestTabContents here. - return new TestTabContents(profile_.get(), instance); - } - - GURL GetTestCase(const std::string& file) { - FilePath filename; - PathService::Get(app::DIR_TEST_DATA, &filename); - filename = filename.AppendASCII("constrained_files"); - filename = filename.AppendASCII(file); - return net::FilePathToFileURL(filename); - } - - protected: - virtual void SetUp() { - RenderViewHostTestHarness::SetUp(); - container_ = new BlockedPopupContainer(contents(), profile()); - container_->set_view(&mock); - - contents_->set_blocked_popup_container(container_); - } - - // Our blocked popup container that we are testing. WARNING: If you are - // trying to test destruction issues, make sure to remove |container_| from - // |contents_|. - BlockedPopupContainer* container_; - - // The mock that we're using. - MockBlockedPopupContainerView mock; -}; - -// Destroying the container should tell the View to destroy itself. -TEST_F(BlockedPopupContainerTest, TestDestroy) { - EXPECT_CALL(mock, Destroy()).Times(1); -} - -// Make sure TabContents::RepositionSupressedPopupsToFit() filters to the view. -TEST_F(BlockedPopupContainerTest, TestReposition) { - EXPECT_CALL(mock, SetPosition()).Times(1); - // Always need this to shut gmock up. :-/ - EXPECT_CALL(mock, Destroy()).Times(1); - - contents_->RepositionSupressedPopupsToFit(); -} - -// Test the basic blocked popup case. -TEST_F(BlockedPopupContainerTest, BasicCase) { - EXPECT_CALL(mock, UpdateLabel()).Times(1); - EXPECT_CALL(mock, ShowView()).Times(1); - EXPECT_CALL(mock, Destroy()).Times(1); - - // Create another TabContents representing the blocked popup case. - TabContents* popup = BuildTabContents(); - popup->controller().LoadURL(GetTestCase("error"), GURL(), - PageTransition::LINK); - container_->AddTabContents(popup, gfx::Rect(), host1); - - EXPECT_EQ(container_->GetBlockedPopupCount(), static_cast<size_t>(1)); - EXPECT_EQ(container_->GetTabContentsAt(0), popup); - ASSERT_THAT(container_->GetHosts(), testing::Contains(host1)); - EXPECT_FALSE(container_->IsHostWhitelisted(0)); -} diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc index e7e3552..701294b 100644 --- a/chrome/browser/browser.cc +++ b/chrome/browser/browser.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. +// 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. @@ -1013,13 +1013,6 @@ bool Browser::SupportsWindowFeature(WindowFeature feature) const { return !!(features & feature); } -#if defined(OS_WIN) -void Browser::ClosePopups() { - UserMetrics::RecordAction(L"CloseAllSuppressedPopups", profile_); - GetSelectedTabContents()->CloseAllSuppressedPopups(); -} -#endif - void Browser::Print() { UserMetrics::RecordAction(L"PrintPreview", profile_); GetSelectedTabContents()->PrintPreview(); @@ -1438,9 +1431,6 @@ void Browser::ExecuteCommandWithDisposition( case IDC_BOOKMARK_PAGE: BookmarkCurrentPage(); break; case IDC_BOOKMARK_ALL_TABS: BookmarkAllTabs(); break; case IDC_VIEW_SOURCE: ViewSource(); break; -#if defined(OS_WIN) - case IDC_CLOSE_POPUPS: ClosePopups(); break; -#endif case IDC_PRINT: Print(); break; case IDC_ENCODING_AUTO_DETECT: ToggleEncodingAutoDetect(); break; case IDC_ENCODING_UTF8: @@ -2054,6 +2044,11 @@ void Browser::ContentsZoomChange(bool zoom_in) { ExecuteCommand(zoom_in ? IDC_ZOOM_PLUS : IDC_ZOOM_MINUS); } +void Browser::OnBlockedContentChange(TabContents* source) { + if (source == GetSelectedTabContents()) + window_->GetLocationBar()->UpdateContentBlockedIcons(); +} + void Browser::TabContentsFocused(TabContents* tab_content) { window_->TabContentsFocused(tab_content); } @@ -2191,7 +2186,6 @@ bool Browser::IsReservedAccelerator(const NativeWebKeyboardEvent& event) { int command_id = window()->GetCommandId(event); return command_id == IDC_CLOSE_TAB || - command_id == IDC_CLOSE_POPUPS || command_id == IDC_CLOSE_WINDOW || command_id == IDC_NEW_INCOGNITO_WINDOW || command_id == IDC_NEW_TAB || @@ -2361,7 +2355,6 @@ void Browser::InitCommandState() { #endif // Page-related commands - command_updater_.UpdateCommandEnabled(IDC_CLOSE_POPUPS, true); command_updater_.UpdateCommandEnabled(IDC_PRINT, true); command_updater_.UpdateCommandEnabled(IDC_ENCODING_AUTO_DETECT, true); command_updater_.UpdateCommandEnabled(IDC_ENCODING_UTF8, true); diff --git a/chrome/browser/browser.h b/chrome/browser/browser.h index 6e65c6a..e6d8696 100644 --- a/chrome/browser/browser.h +++ b/chrome/browser/browser.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. +// 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. @@ -367,10 +367,7 @@ class Browser : public TabStripModelDelegate, virtual bool SupportsWindowFeature(WindowFeature feature) const; // TODO(port): port these, and re-merge the two function declaration lists. -#if defined(OS_WIN) // Page-related commands. - void ClosePopups(); -#endif void Print(); void ToggleEncodingAutoDetect(); void OverrideEncoding(int encoding_id); @@ -548,6 +545,7 @@ class Browser : public TabStripModelDelegate, virtual void ContentsMouseEvent( TabContents* source, const gfx::Point& location, bool motion); virtual void ContentsZoomChange(bool zoom_in); + virtual void OnBlockedContentChange(TabContents* source); virtual void TabContentsFocused(TabContents* tab_content); virtual bool TakeFocus(bool reverse); virtual bool IsApplication() const; diff --git a/chrome/browser/browser_prefs.cc b/chrome/browser/browser_prefs.cc index faacfbc..cf1f3bd 100644 --- a/chrome/browser/browser_prefs.cc +++ b/chrome/browser/browser_prefs.cc @@ -5,7 +5,6 @@ #include "chrome/browser/browser_prefs.h" #include "chrome/browser/bookmarks/bookmark_utils.h" -#include "chrome/browser/blocked_popup_container.h" #include "chrome/browser/browser.h" #include "chrome/browser/browser_shutdown.h" #include "chrome/browser/debugger/devtools_manager.h" @@ -84,7 +83,6 @@ void RegisterAllPrefs(PrefService* user_prefs, PrefService* local_state) { ExtensionDOMUI::RegisterUserPrefs(user_prefs); ExtensionsUI::RegisterUserPrefs(user_prefs); NewTabUI::RegisterUserPrefs(user_prefs); - BlockedPopupContainer::RegisterUserPrefs(user_prefs); HostContentSettingsMap::RegisterUserPrefs(user_prefs); DevToolsManager::RegisterUserPrefs(user_prefs); #if defined(TOOLKIT_VIEWS) // TODO(port): whittle this down as we port. diff --git a/chrome/browser/cocoa/blocked_popup_container_controller.h b/chrome/browser/cocoa/blocked_popup_container_controller.h deleted file mode 100644 index 1df895c..0000000 --- a/chrome/browser/cocoa/blocked_popup_container_controller.h +++ /dev/null @@ -1,58 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_VIEWS_BLOCKED_POPUP_CONTAINER_CONTROLLER_H_ -#define CHROME_BROWSER_VIEWS_BLOCKED_POPUP_CONTAINER_CONTROLLER_H_ - -#import <Cocoa/Cocoa.h> - -#include "base/scoped_nsobject.h" -#include "base/scoped_ptr.h" -#include "chrome/browser/blocked_popup_container.h" - -@class BubbleView; - -// Controller for the blocked popup view. Communicates with the cross-platform -// code via a C++ bridge class, below. The BlockedPopupContainer class doesn't -// really "own" the bridge, it just keeps a pointer to it and calls Destroy() on -// it when it's supposed to go away. As a result, this class needs to own itself -// (always keep an extra retain), and will autorelease itself (and the bridge -// which it owns) when the bridge gets a Destroy() message. -// TODO(pinkerton): Reverse the ownership if it makes more sense. I'm leaving -// it this way because I assume we eventually want this to be a -// NSViewController, and we usually have the Obj-C controller owning the -// bridge (rather than the other way around). -@interface BlockedPopupContainerController : NSObject { - @private - scoped_ptr<BlockedPopupContainerView> bridge_; - BlockedPopupContainer* container_; // Weak. "owns" me. - scoped_nsobject<BubbleView> view_; - scoped_nsobject<NSButton> closeButton_; - // Tracking area for close button mouseover images. - scoped_nsobject<NSTrackingArea> closeTrackingArea_; - IBOutlet NSPopUpButton* popupButton_; -} - -// Initialize with the given popup container. Creates the C++ bridge object -// used to represet the "view". -- (id)initWithContainer:(BlockedPopupContainer*)container; - -// Returns the C++ brige object. -- (BlockedPopupContainerView*)bridge; - -// Called by the bridge to perform certain actions from the back-end code. -- (void)show; -- (void)hide; -- (void)update; - -@end - -@interface BlockedPopupContainerController(ForTesting) -- (BubbleView*)view; -- (IBAction)closePopup:(id)sender; -- (NSMenu*)buildMenu; -- (void)setContainer:(BlockedPopupContainer*)container; -@end - -#endif // CHROME_BROWSER_VIEWS_BLOCKED_POPUP_CONTAINER_CONTROLLER_H_ diff --git a/chrome/browser/cocoa/blocked_popup_container_controller.mm b/chrome/browser/cocoa/blocked_popup_container_controller.mm deleted file mode 100644 index 9151750..0000000 --- a/chrome/browser/cocoa/blocked_popup_container_controller.mm +++ /dev/null @@ -1,409 +0,0 @@ -// 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. - -#import "chrome/browser/cocoa/blocked_popup_container_controller.h" - -#include "app/l10n_util_mac.h" -#include "base/nsimage_cache_mac.h" -#include "base/sys_string_conversions.h" -#import "chrome/browser/cocoa/bubble_view.h" -#include "chrome/browser/tab_contents/tab_contents.h" -#include "chrome/browser/tab_contents/tab_contents_view.h" -#include "grit/generated_resources.h" - -// A C++ bridge class that manages the interaction between the C++ interface -// and the Objective-C view controller that implements the popup blocker. -class BlockedPopupContainerViewBridge : public BlockedPopupContainerView { - public: - BlockedPopupContainerViewBridge(BlockedPopupContainerController* controller); - virtual ~BlockedPopupContainerViewBridge(); - - // Overrides from BlockedPopupContainerView - virtual void SetPosition(); - virtual void ShowView(); - virtual void UpdateLabel(); - virtual void HideView(); - virtual void Destroy(); - - private: - BlockedPopupContainerController* controller_; // Weak, owns us. -}; - -@interface BlockedPopupContainerController(Private) -- (void)initPopupView; -- (NSView*)containingView; -@end - -@implementation BlockedPopupContainerController - -// Initialize with the given popup container. Creates the C++ bridge object -// used to represent the "view". -- (id)initWithContainer:(BlockedPopupContainer*)container { - if ((self = [super init])) { - container_ = container; - bridge_.reset(new BlockedPopupContainerViewBridge(self)); - [self initPopupView]; - } - return self; -} - -- (void)dealloc { - [closeButton_ removeTrackingArea:closeTrackingArea_.get()]; - [view_ removeFromSuperview]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [super dealloc]; -} - -- (IBAction)closePopup:(id)sender { - container_->set_dismissed(); - container_->CloseAll(); -} - -// Create and initialize the popup view and its label, close box, etc. -- (void)initPopupView { - static const float kWidth = 200.0; - static const float kHeight = 20.0; - static const float kCloseBoxSize = 16.0; - static const float kCloseBoxPaddingY = 2.0; - static const float kLabelPaddingX = 5.0; - - NSWindow* window = [[self containingView] window]; - - // Create it below the parent's bottom edge so we can animate it into place. - NSRect startFrame = NSMakeRect(0.0, -kHeight, kWidth, kHeight); - view_.reset([[BubbleView alloc] initWithFrame:startFrame - themeProvider:window]); - [view_ setAutoresizingMask:NSViewMinXMargin | NSViewMaxYMargin]; - [view_ setCornerFlags:kRoundedTopLeftCorner | kRoundedTopRightCorner]; - - // Create the text label and position it. We'll resize it later when the - // label gets updated. The view owns the label, we only hold a weak reference. - NSRect labelFrame = NSMakeRect(kLabelPaddingX, - 0, - startFrame.size.width - kCloseBoxSize, - startFrame.size.height); - popupButton_ = [[[NSPopUpButton alloc] initWithFrame:labelFrame] autorelease]; - [popupButton_ setAutoresizingMask:NSViewWidthSizable]; - [popupButton_ setBordered:NO]; - [popupButton_ setBezelStyle:NSTexturedRoundedBezelStyle]; - [popupButton_ setPullsDown:YES]; - // TODO(pinkerton): this doesn't work, not sure why. - [popupButton_ setPreferredEdge:NSMaxYEdge]; - // TODO(pinkerton): no matter what, the arrows always draw in the middle - // of the button. We can turn off the arrows entirely, but then will the - // user ever know to click it? - [[popupButton_ cell] setArrowPosition:NSPopUpNoArrow]; - [[popupButton_ cell] setAltersStateOfSelectedItem:NO]; - // If we don't add this, no title will ever display. - [popupButton_ addItemWithTitle:@""]; - [view_ addSubview:popupButton_]; - - // Register for notifications that the menu is about to display so we can - // fill it in lazily - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(showMenu:) - name:NSPopUpButtonCellWillPopUpNotification - object:[popupButton_ cell]]; - - // Create the close box and position at the left of the view. - NSRect closeFrame = NSMakeRect(startFrame.size.width - kCloseBoxSize, - kCloseBoxPaddingY, - kCloseBoxSize, - kCloseBoxSize); - closeButton_.reset([[NSButton alloc] initWithFrame:closeFrame]); - [closeButton_ setAutoresizingMask:NSViewMinXMargin]; - [closeButton_ setButtonType:NSMomentaryChangeButton]; - [closeButton_ setImage:nsimage_cache::ImageNamed(@"close_bar.pdf")]; - [closeButton_ - setAlternateImage:nsimage_cache::ImageNamed(@"close_bar_p.pdf")]; - [closeButton_ setBordered:NO]; - [closeButton_ setTarget:self]; - [closeButton_ setAction:@selector(closePopup:)]; - [view_ addSubview:closeButton_]; - - // Set up the tracking rect for the close button mouseover. Add it - // to the |closeButton_| view, but we'll handle the message ourself. - // The mouseover is always enabled, because the close button works - // regardless of key/main/active status. - closeTrackingArea_.reset( - [[NSTrackingArea alloc] initWithRect:[closeButton_ bounds] - options:NSTrackingMouseEnteredAndExited | - NSTrackingActiveAlways - owner:self - userInfo:nil]); - [closeButton_ addTrackingArea:closeTrackingArea_.get()]; -} - -// Returns the C++ brige object. -- (BlockedPopupContainerView*)bridge { - return bridge_.get(); -} - -// Returns the parent of the RWHVMac. We insert our popup blocker as a sibling -// so that it stays around as the RWHVMac is created/destroyed during -// navigation. -- (NSView*)containingView { - NSView* view = nil; - if (container_) - view = container_->GetConstrainingContents(NULL)->view()->GetNativeView(); - return view; -} - -- (void)show { - const float kLeftPadding = 20; // Leave room for the scrollbar. - - // No need to do anything if it's already on screen. - if ([view_ superview]) return; - - // Position the view at the bottom right corner, always leaving room for the - // scrollbar. This is what window does. It also doesn't care about covering - // up the horizontal scrollbar. - NSView* parent = [self containingView]; - NSRect frame = [view_ frame]; - frame.origin.x = [parent frame].size.width - frame.size.width - kLeftPadding; - [view_ setFrame:frame]; - - // Add the view and animate it sliding up into view. - [parent addSubview:view_.get()]; - frame.origin.y = 0; - [[view_ animator] setFrame:frame]; -} - -- (void)hide { - [view_ removeFromSuperview]; -} - -// Resize the view based on the new label contents. The autoresize mask will -// take care of resizing everything else. -- (void)resizeWithLabel:(NSString*)label { - // It would be nice to teach BubbleView to honor -sizeToFit, but it can't - // really handle the subviews that get added. So just measure the string - // and pad for the views. - NSDictionary* attributes = - [NSDictionary dictionaryWithObjectsAndKeys: - NSFontAttributeName, [view_ font], - nil]; - NSSize stringSize = [label sizeWithAttributes:attributes]; - // Keep the right edge in the same place. - NSRect frame = [view_ frame]; - CGFloat originalWidth = frame.size.width; - frame.size.width = - stringSize.width + [closeButton_ frame].size.width + - [popupButton_ frame].origin.x + kBubbleViewTextPositionX; - frame.origin.x -= frame.size.width - originalWidth; - [view_ setFrame:frame]; -} - -- (void)update { - size_t blockedNotices = container_->GetBlockedNoticeCount(); - size_t blockedItems = container_->GetBlockedPopupCount() + blockedNotices; - NSString* label = nil; - if (!blockedItems) { - label = l10n_util::GetNSString(IDS_POPUPS_UNBLOCKED); - } else if (!blockedNotices) { - label = l10n_util::GetNSStringF(IDS_POPUPS_BLOCKED_COUNT, - UintToString16(blockedItems)); - } else { - label = l10n_util::GetNSStringF(IDS_BLOCKED_NOTICE_COUNT, - UintToString16(blockedItems)); - } - [self resizeWithLabel:label]; - [view_ setContent:label]; -} - -// Called when the user selects an item from the popup menu. The tag, if below -// |kImpossibleNumberOfPopups| will be the index into the container's popup -// array. In that case, we should display the popup. Otherwise, the tag is -// either a host we should toggle whitelisting on or a notice (for which we do -// nothing as yet). -// |sender| is the NSMenuItem that was chosen. -- (void)menuAction:(id)sender { - size_t tag = static_cast<size_t>([sender tag]); - - // Is this a click on a popup? - if (tag < BlockedPopupContainer::kImpossibleNumberOfPopups) { - container_->LaunchPopupAtIndex(tag); - return; - } - - tag -= BlockedPopupContainer::kImpossibleNumberOfPopups; - - // Is this a click on a host? - size_t hostCount = container_->GetPopupHostCount(); - if (tag < hostCount) { - container_->ToggleWhitelistingForHost(tag); - return; - } - - tag -= hostCount; - - // Nothing to do for now for notices. -} - -namespace { -void GetURLAndTitleForPopup( - const BlockedPopupContainer* container, - size_t index, - string16* url, - string16* title) { - DCHECK(url); - DCHECK(title); - TabContents* tab_contents = container->GetTabContentsAt(index); - const GURL& tab_contents_url = tab_contents->GetURL().GetOrigin(); - *url = UTF8ToUTF16(tab_contents_url.possibly_invalid_spec()); - *title = tab_contents->GetTitle(); -} -} // namespace - -// Build a new popup menu from scratch. The menu contains the blocked popups -// (tags being the popup's index), followed by the list of hosts from which -// the popups were blocked (tags being |kImpossibleNumberOfPopups| + host -// index). The hosts are used to toggle whitelisting for a site. -- (NSMenu*)buildMenu { - NSMenu* menu = [[[NSMenu alloc] init] autorelease]; - - // For pop-down menus, the first item is what is displayed while tracking the - // menu and it remains there if nothing is selected. Set it to the - // current title. - NSString* currentTitle = [popupButton_ title]; - scoped_nsobject<NSMenuItem> dummy( - [[NSMenuItem alloc] initWithTitle:currentTitle - action:nil - keyEquivalent:@""]); - [menu addItem:dummy.get()]; - - // Add the list of blocked popups titles to the menu. We set the array index - // as the tag for use in the menu action rather than relying on the menu item - // index. - const size_t count = container_->GetBlockedPopupCount(); - for (size_t i = 0; i < count; ++i) { - string16 url, title; - GetURLAndTitleForPopup(container_, i, &url, &title); - NSString* titleStr = - l10n_util::GetNSStringF(IDS_POPUP_TITLE_FORMAT, url, title); - scoped_nsobject<NSMenuItem> item( - [[NSMenuItem alloc] initWithTitle:titleStr - action:@selector(menuAction:) - keyEquivalent:@""]); - [item setTag:i]; - [item setTarget:self]; - [menu addItem:item.get()]; - } - - // Add the list of hosts. We begin tagging these at - // |kImpossibleNumberOfPopups|. If whitelisting has already been enabled - // for a site, mark it with a checkmark. - std::vector<std::string> hosts(container_->GetHosts()); - if (!hosts.empty() && count) - [menu addItem:[NSMenuItem separatorItem]]; - size_t first_host = BlockedPopupContainer::kImpossibleNumberOfPopups; - for (size_t i = 0; i < hosts.size(); ++i) { - NSString* titleStr = - l10n_util::GetNSStringF(IDS_POPUP_HOST_FORMAT, UTF8ToUTF16(hosts[i])); - scoped_nsobject<NSMenuItem> item( - [[NSMenuItem alloc] initWithTitle:titleStr - action:@selector(menuAction:) - keyEquivalent:@""]); - if (container_->IsHostWhitelisted(i)) - [item setState:NSOnState]; - [item setTag:first_host + i]; - [item setTarget:self]; - [menu addItem:item.get()]; - } - - // Add the list of notices. We begin tagging these at - // |kImpossibleNumberOfPopups + hosts.size()|. - size_t notice_count = container_->GetBlockedNoticeCount(); - if (notice_count && (!hosts.empty() || count)) - [menu addItem:[NSMenuItem separatorItem]]; - size_t first_notice = first_host + hosts.size(); - for (size_t i = 0; i < notice_count; ++i) { - std::string host; - string16 reason; - container_->GetHostAndReasonForNotice(i, &host, &reason); - NSString* titleStr = - l10n_util::GetNSStringF(IDS_NOTICE_TITLE_FORMAT, UTF8ToUTF16(host)); - scoped_nsobject<NSMenuItem> item( - [[NSMenuItem alloc] initWithTitle:titleStr - action:@selector(menuAction:) - keyEquivalent:@""]); - [item setTag:first_notice + i]; - [item setTarget:self]; - [menu addItem:item.get()]; - } - - return menu; -} - -// Called when the popup button is about to display the menu, giving us a -// chance to fill in the contents. -- (void)showMenu:(NSNotification*)notify { - NSMenu* menu = [self buildMenu]; - [[notify object] setMenu:menu]; -} - -// Only used for testing. -- (BubbleView*)view { - return view_.get(); -} - -// Only used for testing. -- (void)setContainer:(BlockedPopupContainer*)container { - container_ = container; -} - -// Called when the mouse enters the tracking rect for the close box. -- (void)mouseEntered:(NSEvent *)theEvent { - if ([theEvent trackingArea] == closeTrackingArea_) - [closeButton_ setImage:nsimage_cache::ImageNamed(@"close_bar_h.pdf")]; -} - -// Called when the mouse exits the tracking rect for the close box. -- (void)mouseExited:(NSEvent *)theEvent { - if ([theEvent trackingArea] == closeTrackingArea_) - [closeButton_ setImage:nsimage_cache::ImageNamed(@"close_bar.pdf")]; -} - -@end - -//--------------------------------------------------------------------------- - -BlockedPopupContainerView* BlockedPopupContainerView::Create( - BlockedPopupContainer* container) { - // We "leak" |blocker| for now, we'll release it when the bridge class - // gets a Destroy() message. - BlockedPopupContainerController* blocker = - [[BlockedPopupContainerController alloc] initWithContainer:container]; - return [blocker bridge]; -} - -BlockedPopupContainerViewBridge::BlockedPopupContainerViewBridge( - BlockedPopupContainerController* controller) { - controller_ = controller; -} - -BlockedPopupContainerViewBridge::~BlockedPopupContainerViewBridge() { -} - -void BlockedPopupContainerViewBridge::SetPosition() { - // Doesn't ever get called, also a no-op on GTK. - NOTIMPLEMENTED(); -} - -void BlockedPopupContainerViewBridge::ShowView() { - [controller_ show]; -} - -void BlockedPopupContainerViewBridge::UpdateLabel() { - [controller_ update]; -} - -void BlockedPopupContainerViewBridge::HideView() { - [controller_ hide]; -} - -void BlockedPopupContainerViewBridge::Destroy() { - [controller_ autorelease]; -} diff --git a/chrome/browser/cocoa/blocked_popup_container_controller_unittest.mm b/chrome/browser/cocoa/blocked_popup_container_controller_unittest.mm deleted file mode 100644 index 40a3f3bd..0000000 --- a/chrome/browser/cocoa/blocked_popup_container_controller_unittest.mm +++ /dev/null @@ -1,105 +0,0 @@ -// 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. - -#import <Cocoa/Cocoa.h> - -#include "app/app_paths.h" -#include "base/path_service.h" -#include "base/scoped_nsautorelease_pool.h" -#import "chrome/browser/cocoa/blocked_popup_container_controller.h" -#include "chrome/browser/cocoa/browser_test_helper.h" -#include "chrome/browser/cocoa/cocoa_test_helper.h" -#include "chrome/browser/renderer_host/test/test_render_view_host.h" -#include "net/base/net_util.h" -#include "testing/gtest/include/gtest/gtest.h" - - -namespace { -const std::string host1 = "host1"; -} // namespace - -class BlockedPopupContainerControllerTest : public RenderViewHostTestHarness { - public: - virtual void SetUp() { - // This is all a bit convoluted because the standard factory Create() call - // doesn't give us access to the cocoa controller for testing (since it's - // an internal implementation detail). As a result, we need to create one - // separately and inject the bridge with a test-only Create() call. - // Unfortunate, but no way around it. - RenderViewHostTestHarness::SetUp(); - cocoa_controller_ = [[BlockedPopupContainerController alloc] - initWithContainer:nil]; - EXPECT_TRUE([cocoa_controller_ bridge]); - container_ = BlockedPopupContainer::Create(contents(), profile(), - [cocoa_controller_ bridge]); - [cocoa_controller_ setContainer:container_]; - contents_->set_blocked_popup_container(container_); - } - - virtual void TearDown() { - // This will also signal the Cocoa controller to delete itself with a - // Destroy() mesage to the bridge. It also clears out the association with - // |contents_|. - container_->Destroy(); - RenderViewHostTestHarness::TearDown(); - } - - TabContents* BuildTabContents() { - // This will be deleted when the TabContents goes away. - SiteInstance* instance = SiteInstance::CreateSiteInstance(profile_.get()); - - // Set up and use TestTabContents here. - return new TestTabContents(profile_.get(), instance); - } - - GURL GetTestCase(const std::string& file) { - FilePath filename; - PathService::Get(app::DIR_TEST_DATA, &filename); - filename = filename.AppendASCII("constrained_files"); - filename = filename.AppendASCII(file); - return net::FilePathToFileURL(filename); - } - - base::ScopedNSAutoreleasePool pool; - CocoaTestHelper cocoa_helper_; - BlockedPopupContainer* container_; - BlockedPopupContainerController* cocoa_controller_; -}; - -TEST_F(BlockedPopupContainerControllerTest, BasicPopupBlock) { - // This is taken from the popup blocker unit test. - TabContents* popup = BuildTabContents(); - popup->controller().LoadURL(GetTestCase("error"), GURL(), - PageTransition::LINK); - container_->AddTabContents(popup, gfx::Rect(), host1); - EXPECT_EQ(1U, container_->GetBlockedPopupCount()); - EXPECT_EQ(popup, container_->GetTabContentsAt(0)); - ASSERT_EQ(1U, container_->GetPopupHostCount()); - EXPECT_FALSE(container_->IsHostWhitelisted(0)); - - // Ensure the view has been displayed. If it has a superview, then ShowView() - // has been called on the bridge. If the bubble has a string, then - // UpdateLabel() has been called. - EXPECT_TRUE([cocoa_controller_ view]); - EXPECT_TRUE([[cocoa_controller_ view] superview]); - EXPECT_GT([[[cocoa_controller_ view] content] length], 0U); - - // Validate the menu. It should have 4 items (the dummy title item, 1 poupup, - // a separator, 1 host). - NSMenu* menu = [cocoa_controller_ buildMenu]; - EXPECT_TRUE(menu); - EXPECT_EQ(4, [menu numberOfItems]); - - // Change the whitelisting and make sure the host is checked. - container_->ToggleWhitelistingForHost(0); - menu = [cocoa_controller_ buildMenu]; - EXPECT_TRUE(menu); - EXPECT_EQ(2, [menu numberOfItems]); - EXPECT_EQ(NSOnState, [[menu itemAtIndex:1] state]); - - // Close the popup and verify it's no longer in the view hierarchy. This - // means HideView() has been called. - [cocoa_controller_ closePopup:nil]; - EXPECT_FALSE([[cocoa_controller_ view] superview]); -} diff --git a/chrome/browser/gtk/blocked_popup_container_view_gtk.cc b/chrome/browser/gtk/blocked_popup_container_view_gtk.cc deleted file mode 100644 index 51eead3..0000000 --- a/chrome/browser/gtk/blocked_popup_container_view_gtk.cc +++ /dev/null @@ -1,307 +0,0 @@ -// 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. - -#include "chrome/browser/gtk/blocked_popup_container_view_gtk.h" - -#include "app/gfx/gtk_util.h" -#include "app/l10n_util.h" -#include "base/string_util.h" -#include "chrome/browser/gtk/custom_button.h" -#include "chrome/browser/gtk/gtk_chrome_button.h" -#include "chrome/browser/gtk/gtk_theme_provider.h" -#include "chrome/browser/gtk/rounded_window.h" -#include "chrome/browser/profile.h" -#include "chrome/browser/tab_contents/tab_contents.h" -#include "chrome/browser/tab_contents/tab_contents_view_gtk.h" -#include "chrome/common/gtk_util.h" -#include "chrome/common/notification_service.h" -#include "grit/generated_resources.h" -#include "grit/theme_resources.h" - -namespace { - -// The minimal border around the edge of the notification. -const int kSmallPadding = 2; - -// Color of the gradient in the background. -const double kBackgroundColorTop[] = { 246.0 / 255, 250.0 / 255, 1.0 }; -const double kBackgroundColorBottom[] = { 219.0 / 255, 235.0 / 255, 1.0 }; - -// Rounded corner radius (in pixels). -const int kCornerSize = 4; - -} // namespace - -// static -BlockedPopupContainerView* BlockedPopupContainerView::Create( - BlockedPopupContainer* container) { - return new BlockedPopupContainerViewGtk(container); -} - -BlockedPopupContainerViewGtk::~BlockedPopupContainerViewGtk() { - container_.Destroy(); -} - -TabContentsViewGtk* BlockedPopupContainerViewGtk::ContainingView() { - return static_cast<TabContentsViewGtk*>( - model_->GetConstrainingContents(NULL)->view()); -} - -void BlockedPopupContainerViewGtk::GetURLAndTitleForPopup( - size_t index, string16* url, string16* title) const { - DCHECK(url); - DCHECK(title); - TabContents* tab_contents = model_->GetTabContentsAt(index); - const GURL& tab_contents_url = tab_contents->GetURL().GetOrigin(); - *url = UTF8ToUTF16(tab_contents_url.possibly_invalid_spec()); - *title = tab_contents->GetTitle(); -} - -// Overridden from BlockedPopupContainerView: -void BlockedPopupContainerViewGtk::SetPosition() { - // No-op. Not required with the GTK version. -} - -void BlockedPopupContainerViewGtk::ShowView() { - // TODO(erg): Animate in. - gtk_widget_show_all(container_.get()); -} - -void BlockedPopupContainerViewGtk::UpdateLabel() { - size_t blocked_notices = model_->GetBlockedNoticeCount(); - size_t blocked_items = model_->GetBlockedPopupCount() + blocked_notices; - - GtkWidget* label = gtk_bin_get_child(GTK_BIN(menu_button_)); - if (!label) { - label = gtk_label_new(""); - gtk_container_add(GTK_CONTAINER(menu_button_), label); - } - - std::string label_text; - if (blocked_items == 0) { - label_text = l10n_util::GetStringUTF8(IDS_POPUPS_UNBLOCKED); - } else if (blocked_notices == 0) { - label_text = l10n_util::GetStringFUTF8(IDS_POPUPS_BLOCKED_COUNT, - UintToString16(blocked_items)); - } else { - label_text = l10n_util::GetStringFUTF8(IDS_BLOCKED_NOTICE_COUNT, - UintToString16(blocked_items)); - } - gtk_label_set_text(GTK_LABEL(label), label_text.c_str()); -} - -void BlockedPopupContainerViewGtk::HideView() { - // TODO(erg): Animate out. - gtk_widget_hide(container_.get()); -} - -void BlockedPopupContainerViewGtk::Destroy() { - ContainingView()->RemoveBlockedPopupView(this); - delete this; -} - -void BlockedPopupContainerViewGtk::Observe(NotificationType type, - const NotificationSource& source, - const NotificationDetails& details) { - DCHECK(type == NotificationType::BROWSER_THEME_CHANGED); - - // Make sure the label exists (so we can change its colors). - UpdateLabel(); - - // Update the label's colors. - GtkWidget* label = gtk_bin_get_child(GTK_BIN(menu_button_)); - if (theme_provider_->UseGtkTheme()) { - gtk_util::SetLabelColor(label, NULL); - } else { - GdkColor color = theme_provider_->GetGdkColor( - BrowserThemeProvider::COLOR_BOOKMARK_TEXT); - gtk_util::SetLabelColor(label, &color); - } - - GdkColor color = theme_provider_->GetBorderColor(); - gtk_util::SetRoundedWindowBorderColor(container_.get(), color); -} - -bool BlockedPopupContainerViewGtk::IsCommandEnabled(int command_id) const { - return true; -} - -bool BlockedPopupContainerViewGtk::IsItemChecked(int id) const { - // |id| should be > 0 since all index based commands have 1 added to them. - DCHECK_GT(id, 0); - size_t id_size_t = static_cast<size_t>(id); - - if (id_size_t > BlockedPopupContainer::kImpossibleNumberOfPopups) { - id_size_t -= BlockedPopupContainer::kImpossibleNumberOfPopups + 1; - if (id_size_t < model_->GetPopupHostCount()) - return model_->IsHostWhitelisted(id_size_t); - } - - return false; -} - -void BlockedPopupContainerViewGtk::ExecuteCommand(int id) { - DCHECK_GT(id, 0); - size_t id_size_t = static_cast<size_t>(id); - - // Is this a click on a popup? - if (id_size_t < BlockedPopupContainer::kImpossibleNumberOfPopups) { - model_->LaunchPopupAtIndex(id_size_t - 1); - return; - } - - // |id| shouldn't be == kImpossibleNumberOfPopups since the popups end before - // this and the hosts start after it. (If it is used, it is as a separator.) - DCHECK_NE(id_size_t, BlockedPopupContainer::kImpossibleNumberOfPopups); - id_size_t -= BlockedPopupContainer::kImpossibleNumberOfPopups + 1; - - // Is this a click on a host? - size_t host_count = model_->GetPopupHostCount(); - if (id_size_t < host_count) { - model_->ToggleWhitelistingForHost(id_size_t); - return; - } - - // |id shouldn't be == host_count since this is the separator between hosts - // and notices. - DCHECK_NE(id_size_t, host_count); - id_size_t -= host_count + 1; - - // Nothing to do for now for notices. -} - -BlockedPopupContainerViewGtk::BlockedPopupContainerViewGtk( - BlockedPopupContainer* container) - : model_(container), - theme_provider_(GtkThemeProvider::GetFrom(container->profile())), - close_button_(CustomDrawButton::CloseButton(theme_provider_)) { - Init(); - - registrar_.Add(this, - NotificationType::BROWSER_THEME_CHANGED, - NotificationService::AllSources()); - theme_provider_->InitThemesFor(this); -} - -void BlockedPopupContainerViewGtk::Init() { - menu_button_ = theme_provider_->BuildChromeButton(); - UpdateLabel(); - g_signal_connect(menu_button_, "clicked", - G_CALLBACK(OnMenuButtonClicked), this); - - GtkWidget* hbox = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), menu_button_, FALSE, FALSE, kSmallPadding); - gtk_util::CenterWidgetInHBox(hbox, close_button_->widget(), true, 0); - g_signal_connect(close_button_->widget(), "clicked", - G_CALLBACK(OnCloseButtonClicked), this); - - container_.Own(gtk_util::CreateGtkBorderBin(hbox, NULL, - kSmallPadding, kSmallPadding, kSmallPadding, kSmallPadding)); - // Connect an expose signal that draws the background. Most connect before - // the ActAsRoundedWindow one. - g_signal_connect(container_.get(), "expose-event", - G_CALLBACK(OnRoundedExposeCallback), this); - gtk_util::ActAsRoundedWindow( - container_.get(), gfx::kGdkBlack, kCornerSize, - gtk_util::ROUNDED_TOP_LEFT | gtk_util::ROUNDED_TOP_RIGHT, - gtk_util::BORDER_LEFT | gtk_util::BORDER_TOP | gtk_util::BORDER_RIGHT); - - ContainingView()->AttachBlockedPopupView(this); -} - -void BlockedPopupContainerViewGtk::OnMenuButtonClicked( - GtkButton *button, BlockedPopupContainerViewGtk* container) { - container->launch_menu_.reset(new MenuGtk(container, false)); - - // Set items 1 .. popup_count as individual popups. - size_t popup_count = container->model_->GetBlockedPopupCount(); - for (size_t i = 0; i < popup_count; ++i) { - string16 url, title; - container->GetURLAndTitleForPopup(i, &url, &title); - // We can't just use the index into container_ here because Menu reserves - // the value 0 as the nop command. - container->launch_menu_->AppendMenuItemWithLabel(i + 1, - l10n_util::GetStringFUTF8(IDS_POPUP_TITLE_FORMAT, url, title)); - } - - // Set items (kImpossibleNumberOfPopups + 1) .. - // (kImpossibleNumberOfPopups + hosts.size()) as hosts. - std::vector<std::string> hosts(container->model_->GetHosts()); - if (!hosts.empty() && (popup_count > 0)) - container->launch_menu_->AppendSeparator(); - size_t first_host = BlockedPopupContainer::kImpossibleNumberOfPopups + 1; - for (size_t i = 0; i < hosts.size(); ++i) { - container->launch_menu_->AppendCheckMenuItemWithLabel(first_host + i, - l10n_util::GetStringFUTF8(IDS_POPUP_HOST_FORMAT, - UTF8ToUTF16(hosts[i]))); - } - - // Set items (kImpossibleNumberOfPopups + hosts.size() + 2) .. - // (kImpossibleNumberOfPopups + hosts.size() + 1 + notice_count) as notices. - size_t notice_count = container->model_->GetBlockedNoticeCount(); - if (notice_count && (!hosts.empty() || (popup_count > 0))) - container->launch_menu_->AppendSeparator(); - size_t first_notice = first_host + hosts.size() + 1; - for (size_t i = 0; i < notice_count; ++i) { - std::string host; - string16 reason; - container->model_->GetHostAndReasonForNotice(i, &host, &reason); - container->launch_menu_->AppendMenuItemWithLabel(first_notice + i, - l10n_util::GetStringFUTF8(IDS_NOTICE_TITLE_FORMAT, UTF8ToUTF16(host), - reason)); - } - - container->launch_menu_->PopupAsContext(gtk_get_current_event_time()); -} - -void BlockedPopupContainerViewGtk::OnCloseButtonClicked( - GtkButton *button, BlockedPopupContainerViewGtk* container) { - container->model_->set_dismissed(); - container->model_->CloseAll(); -} - -gboolean BlockedPopupContainerViewGtk::OnRoundedExposeCallback( - GtkWidget* widget, GdkEventExpose* event, - BlockedPopupContainerViewGtk* container) { - if (!container->theme_provider_->UseGtkTheme()) { - int width = widget->allocation.width; - int height = widget->allocation.height; - - // Clip to our damage rect. - cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(event->window)); - cairo_rectangle(cr, event->area.x, event->area.y, - event->area.width, event->area.height); - cairo_clip(cr); - - if (container->theme_provider_->GetThemeID() == - BrowserThemeProvider::kDefaultThemeID) { - // We are using the default theme. Use a fairly soft gradient for the - // background of the blocked popup notification. - int half_width = width / 2; - cairo_pattern_t* pattern = cairo_pattern_create_linear( - half_width, 0, half_width, height); - cairo_pattern_add_color_stop_rgb( - pattern, 0.0, kBackgroundColorTop[0], kBackgroundColorTop[1], - kBackgroundColorTop[2]); - cairo_pattern_add_color_stop_rgb( - pattern, 1.0, - kBackgroundColorBottom[0], kBackgroundColorBottom[1], - kBackgroundColorBottom[2]); - cairo_set_source(cr, pattern); - cairo_paint(cr); - cairo_pattern_destroy(pattern); - } else { - // Use the toolbar color the theme specifies instead. It would be nice to - // have a gradient here, but there isn't a second color to use... - GdkColor color = container->theme_provider_->GetGdkColor( - BrowserThemeProvider::COLOR_TOOLBAR); - gdk_cairo_set_source_color(cr, &color); - cairo_paint(cr); - } - - cairo_destroy(cr); - } - - return FALSE; -} diff --git a/chrome/browser/gtk/blocked_popup_container_view_gtk.h b/chrome/browser/gtk/blocked_popup_container_view_gtk.h deleted file mode 100644 index 50a256b3..0000000 --- a/chrome/browser/gtk/blocked_popup_container_view_gtk.h +++ /dev/null @@ -1,112 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_GTK_BLOCKED_POPUP_CONTAINER_VIEW_GTK_H_ -#define CHROME_BROWSER_GTK_BLOCKED_POPUP_CONTAINER_VIEW_GTK_H_ - -#include <gtk/gtk.h> - -#include "base/basictypes.h" -#include "base/scoped_ptr.h" -#include "chrome/browser/blocked_popup_container.h" -#include "chrome/browser/gtk/menu_gtk.h" -#include "chrome/common/notification_observer.h" -#include "chrome/common/notification_registrar.h" -#include "chrome/common/owned_widget_gtk.h" - -class BlockedPopupContainerInternalView; -class CustomDrawButton; -class GtkThemeProvider; -class MenuGtk; -class NotificationObserver; -class PrefService; -class Profile; -class TabContents; -class TabContentsViewGtk; -class TextButton; - -namespace views { -class ImageButton; -} - -// The GTK blocked popup container notification. -class BlockedPopupContainerViewGtk : public BlockedPopupContainerView, - public NotificationObserver, - public MenuGtk::Delegate { - public: - virtual ~BlockedPopupContainerViewGtk(); - - // Returns the Gtk view that currently owns us. - TabContentsViewGtk* ContainingView(); - - // Returns the URL and title for popup |index|, used to construct a string for - // display. - void GetURLAndTitleForPopup(size_t index, - string16* url, - string16* title) const; - - GtkWidget* widget() { return container_.get(); } - - // Overridden from BlockedPopupContainerView: - virtual void SetPosition(); - virtual void ShowView(); - virtual void UpdateLabel(); - virtual void HideView(); - virtual void Destroy(); - - // Overridden from NotificationObserver: - virtual void Observe(NotificationType type, - const NotificationSource& source, - const NotificationDetails& details); - - // Overridden from MenuGtk::Delegate: - virtual bool IsCommandEnabled(int command_id) const; - virtual bool IsItemChecked(int command_id) const; - virtual void ExecuteCommand(int command_id); - - private: - // For the static constructor BlockedPopupContainerView::Create(). - friend class BlockedPopupContainerView; - - // Creates a container for a certain TabContents. - explicit BlockedPopupContainerViewGtk(BlockedPopupContainer* container); - - // Builds all the messy GTK stuff. - void Init(); - - // Callbacks for the two buttons in the notification - static void OnMenuButtonClicked(GtkButton *button, - BlockedPopupContainerViewGtk* container); - static void OnCloseButtonClicked(GtkButton *button, - BlockedPopupContainerViewGtk* container); - - // Draw the custom background to our rounded widget. - static gboolean OnRoundedExposeCallback( - GtkWidget* widget, GdkEventExpose* event, - BlockedPopupContainerViewGtk* container); - - NotificationRegistrar registrar_; - - // Our model; calling the shots. - BlockedPopupContainer* model_; - - // The top level of our local GTK hierarchy. - OwnedWidgetGtk container_; - - // The "Blocked Popups: XXX" button. - GtkWidget* menu_button_; - - // Our theme provider. - GtkThemeProvider* theme_provider_; - - // Closes the container. - scoped_ptr<CustomDrawButton> close_button_; - - // The popup menu with options to launch blocked popups. - scoped_ptr<MenuGtk> launch_menu_; - - DISALLOW_COPY_AND_ASSIGN(BlockedPopupContainerViewGtk); -}; - -#endif // CHROME_BROWSER_GTK_BLOCKED_POPUP_CONTAINER_VIEW_GTK_H_ diff --git a/chrome/browser/host_content_settings_map.cc b/chrome/browser/host_content_settings_map.cc index eb35f5c..0546ece 100644 --- a/chrome/browser/host_content_settings_map.cc +++ b/chrome/browser/host_content_settings_map.cc @@ -53,6 +53,21 @@ HostContentSettingsMap::HostContentSettingsMap(Profile* profile) } } + // Migrate obsolete popups pref. + if (prefs->HasPrefPath(prefs::kPopupWhitelistedHosts)) { + const ListValue* whitelist_pref = + prefs->GetList(prefs::kPopupWhitelistedHosts); + for (ListValue::const_iterator i(whitelist_pref->begin()); + i != whitelist_pref->end(); ++i) { + std::string host; + (*i)->GetAsString(&host); + SetContentSetting(host, CONTENT_SETTINGS_TYPE_POPUPS, + CONTENT_SETTING_ALLOW); + } + prefs->ClearPref(prefs::kPopupWhitelistedHosts); + } + + // Read global defaults. DCHECK_EQ(arraysize(kTypeNames), static_cast<size_t>(CONTENT_SETTINGS_NUM_TYPES)); const DictionaryValue* default_settings_dictionary = @@ -64,6 +79,7 @@ HostContentSettingsMap::HostContentSettingsMap(Profile* profile) } ForceDefaultsToBeExplicit(); + // Read host-specific exceptions. const DictionaryValue* all_settings_dictionary = prefs->GetDictionary(prefs::kPerHostContentSettings); // Careful: The returned value could be NULL if the pref has never been set. @@ -81,6 +97,7 @@ HostContentSettingsMap::HostContentSettingsMap(Profile* profile) } } + // Read misc. global settings. block_third_party_cookies_ = prefs->GetBoolean(prefs::kBlockThirdPartyCookies); } @@ -94,6 +111,7 @@ void HostContentSettingsMap::RegisterUserPrefs(PrefService* prefs) { // Obsolete prefs, for migration: prefs->RegisterIntegerPref(prefs::kCookieBehavior, net::StaticCookiePolicy::ALLOW_ALL_COOKIES); + prefs->RegisterListPref(prefs::kPopupWhitelistedHosts); } ContentSetting HostContentSettingsMap::GetDefaultContentSetting( diff --git a/chrome/browser/privacy_blacklist/blacklist_observer.cc b/chrome/browser/privacy_blacklist/blacklist_observer.cc index b62d0c8..50324c1 100644 --- a/chrome/browser/privacy_blacklist/blacklist_observer.cc +++ b/chrome/browser/privacy_blacklist/blacklist_observer.cc @@ -1,72 +1,22 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// 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. #include "chrome/browser/privacy_blacklist/blacklist_observer.h" -#include "app/l10n_util.h" -#include "app/resource_bundle.h" -#include "base/string16.h" -#include "chrome/browser/blocked_popup_container.h" #include "chrome/browser/chrome_thread.h" -#include "chrome/browser/privacy_blacklist/blacklist.h" -#include "chrome/browser/renderer_host/render_view_host.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "chrome/browser/renderer_host/resource_dispatcher_host_request_info.h" -#include "chrome/browser/tab_contents/tab_contents.h" -#include "chrome/common/notification_details.h" -#include "chrome/common/notification_service.h" -#include "chrome/common/notification_type.h" -#include "grit/generated_resources.h" -class BlockedContentNotice : public Task { - public: - BlockedContentNotice(const GURL& gurl, - const Blacklist::Match* match, - const ResourceDispatcherHostRequestInfo* info) - : gurl_(gurl), - match_(match), - child_id_(info->child_id()), - route_id_(info->route_id()) { - if (match_->attributes() & Blacklist::kDontStoreCookies) { - // No cookies stored. - reason_ = l10n_util::GetStringUTF16(IDS_BLACKLIST_BLOCKED_COOKIES); - } else if (match_->attributes() & Blacklist::kDontSendCookies) { - // No cookies sent. - reason_ = l10n_util::GetStringUTF16(IDS_BLACKLIST_BLOCKED_COOKIES); - } else if (match_->attributes() & Blacklist::kDontSendReferrer) { - // No referrer sent. - reason_ = l10n_util::GetStringUTF16(IDS_BLACKLIST_BLOCKED_REFERRER); - } - } +void BlacklistObserver::ContentBlocked(const URLRequest* /*request*/) { + // TODO - virtual void Run() { - RenderViewHost* view = RenderViewHost::FromID(child_id_, route_id_); - if (!view) - return; // The view may be gone by the time we get here. - - view->delegate()->AddBlockedNotice(gurl_, reason_); - } - - private: - const GURL gurl_; - const Blacklist::Match* match_; - const int child_id_; - const int route_id_; - - string16 reason_; -}; - -void BlacklistObserver::ContentBlocked(const URLRequest* request) { + /* This code will probably be useful when this function is implemented. const URLRequest::UserData* d = request->GetUserData(&Blacklist::kRequestDataKey); const Blacklist::Match* match = static_cast<const Blacklist::Match*>(d); const ResourceDispatcherHostRequestInfo* info = ResourceDispatcherHost::InfoForRequest(request); const GURL& gurl = request->url(); - - // Notify the UI that something non-visual has been blocked. - ChromeThread::PostTask( - ChromeThread::UI, FROM_HERE, - new BlockedContentNotice(gurl, match, info)); + */ } diff --git a/chrome/browser/renderer_host/render_view_host_delegate.cc b/chrome/browser/renderer_host/render_view_host_delegate.cc index 304d729..5458dcd 100644 --- a/chrome/browser/renderer_host/render_view_host_delegate.cc +++ b/chrome/browser/renderer_host/render_view_host_delegate.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// 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. @@ -60,10 +60,6 @@ TabContents* RenderViewHostDelegate::GetAsTabContents() { return NULL; } -void RenderViewHostDelegate::AddBlockedNotice(const GURL& url, - const string16& reason) { -} - GURL RenderViewHostDelegate::GetAlternateErrorPageURL() const { return GURL(); } diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h index 335527ac..ad849b7 100644 --- a/chrome/browser/renderer_host/render_view_host_delegate.h +++ b/chrome/browser/renderer_host/render_view_host_delegate.h @@ -395,9 +395,6 @@ class RenderViewHostDelegate { // not a TabContents, returns NULL. virtual TabContents* GetAsTabContents(); - // Adds a notice that something was blocked. - virtual void AddBlockedNotice(const GURL& url, const string16& reason); - // Return id number of browser window which this object is attached to. If no // browser window is attached to, just return -1. virtual int GetBrowserWindowID() const = 0; diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc index 96b0e38..668988d 100644 --- a/chrome/browser/tab_contents/tab_contents.cc +++ b/chrome/browser/tab_contents/tab_contents.cc @@ -7,6 +7,7 @@ #include "app/gfx/text_elider.h" #include "app/l10n_util.h" #include "app/resource_bundle.h" +#include "base/auto_reset.h" #include "base/file_version_info.h" #include "base/process_util.h" #include "base/string16.h" @@ -265,6 +266,7 @@ TabContents::TabContents(Profile* profile, contents_mime_type_(), encoding_(), blocked_popups_(NULL), + dont_notify_render_view_(false), infobar_delegates_(), find_ui_active_(false), find_op_aborted_(false), @@ -360,13 +362,9 @@ TabContents::~TabContents() { // TODO(mpcomplete): handle case if MaybeCloseChildWindows() already asked // some of these to close. CloseWindows is async, so it might get called // twice before it runs. - int size = static_cast<int>(child_windows_.size()); - for (int i = size - 1; i >= 0; --i) { - ConstrainedWindow* window = child_windows_[i]; - if (window) - window->CloseConstrainedWindow(); - } + CloseConstrainedWindows(); + // Close all blocked popups. if (blocked_popups_) blocked_popups_->Destroy(); @@ -588,6 +586,9 @@ bool TabContents::ShouldDisplayFavIcon() { } bool TabContents::IsContentBlocked(ContentSettingsType content_type) const { + if (content_type == CONTENT_SETTINGS_TYPE_POPUPS) + return blocked_popups_ != NULL; + // TODO(pkasting): Return meaningful values here. return false; } @@ -876,12 +877,9 @@ void TabContents::AddNewContents(TabContents* new_contents, Source<TabContentsDelegate>(delegate_), Details<TabContents>(this)); } - PopupNotificationVisibilityChanged(ShowingBlockedPopupNotification()); -} -void TabContents::CloseAllSuppressedPopups() { - if (blocked_popups_) - blocked_popups_->CloseAll(); + // TODO(pkasting): Why is this necessary? + PopupNotificationVisibilityChanged(blocked_popups_ != NULL); } void TabContents::ExecuteCode(int request_id, const std::string& extension_id, @@ -895,7 +893,11 @@ void TabContents::ExecuteCode(int request_id, const std::string& extension_id, } void TabContents::PopupNotificationVisibilityChanged(bool visible) { - render_view_host()->PopupNotificationVisibilityChanged(visible); + if (is_being_destroyed_) + return; + if (!dont_notify_render_view_) + render_view_host()->PopupNotificationVisibilityChanged(visible); + delegate_->OnBlockedContentChange(this); } gfx::NativeView TabContents::GetContentNativeView() const { @@ -1078,6 +1080,7 @@ void TabContents::WillCloseBlockedPopupContainer( BlockedPopupContainer* container) { DCHECK(blocked_popups_ == container); blocked_popups_ = NULL; + PopupNotificationVisibilityChanged(false); } void TabContents::DidMoveOrResize(ConstrainedWindow* window) { @@ -1264,33 +1267,18 @@ void TabContents::SetIsLoading(bool is_loading, det); } -void TabContents::CreateBlockedPopupContainerIfNecessary() { - if (blocked_popups_) - return; - - blocked_popups_ = BlockedPopupContainer::Create(this, profile()); -} - void TabContents::AddPopup(TabContents* new_contents, const gfx::Rect& initial_pos) { - CreateBlockedPopupContainerIfNecessary(); - // A popup is associated with the toplevel site instead of a potential frame - // that spawns it. - const GURL& url = GetURL(); - blocked_popups_->AddTabContents( - new_contents, initial_pos, - url.is_valid() ? url.host() : std::string()); -} - -// TODO(brettw) This should be on the TabContentsView. -void TabContents::RepositionSupressedPopupsToFit() { - if (blocked_popups_) - blocked_popups_->RepositionBlockedPopupContainer(); -} - -bool TabContents::ShowingBlockedPopupNotification() const { - return blocked_popups_ != NULL && - blocked_popups_->GetBlockedPopupCount() != 0; + GURL url(GetURL()); + if (url.is_valid() && + profile()->GetHostContentSettingsMap()->GetContentSetting( + url.host(), CONTENT_SETTINGS_TYPE_POPUPS) == CONTENT_SETTING_ALLOW) { + AddNewContents(new_contents, NEW_POPUP, initial_pos, true); + } else { + if (!blocked_popups_) + blocked_popups_ = new BlockedPopupContainer(this); + blocked_popups_->AddTabContents(new_contents, initial_pos); + } } namespace { @@ -1446,8 +1434,16 @@ void TabContents::DidNavigateMainFramePostCommit( } } - // Close constrained popups if necessary. - MaybeCloseChildWindows(details.previous_url, details.entry->url()); + // Close constrained windows if necessary. + if (!net::RegistryControlledDomainService::SameDomainOrHost( + details.previous_url, details.entry->url())) + CloseConstrainedWindows(); + + // Close blocked popups. + if (blocked_popups_) { + AutoReset auto_reset(&dont_notify_render_view_, true); + blocked_popups_->Destroy(); + } // Update the starred state. UpdateStarredStateForCurrentURL(); @@ -1469,13 +1465,8 @@ void TabContents::DidNavigateAnyFramePostCommit( GetPasswordManager()->ProvisionallySavePassword(params.password_form); } -void TabContents::MaybeCloseChildWindows(const GURL& previous_url, - const GURL& current_url) { - if (net::RegistryControlledDomainService::SameDomainOrHost( - previous_url, current_url)) - return; - - // Clear out any child windows since we are leaving this page entirely. +void TabContents::CloseConstrainedWindows() { + // Clear out any constrained windows since we are leaving this page entirely. // We use indices instead of iterators in case CloseWindow does something // that may invalidate an iterator. int size = static_cast<int>(child_windows_.size()); @@ -1484,12 +1475,6 @@ void TabContents::MaybeCloseChildWindows(const GURL& previous_url, if (window) window->CloseConstrainedWindow(); } - - // Close the popup container. - if (blocked_popups_) { - blocked_popups_->Destroy(); - blocked_popups_ = NULL; - } } void TabContents::UpdateStarredStateForCurrentURL() { @@ -1984,11 +1969,6 @@ TabContents* TabContents::GetAsTabContents() { return this; } -void TabContents::AddBlockedNotice(const GURL& url, const string16& reason) { - CreateBlockedPopupContainerIfNecessary(); - blocked_popups_->AddBlockedNotice(url, reason); -} - ViewType::Type TabContents::GetRenderViewType() const { return ViewType::TAB_CONTENTS; } diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h index 3d3c1e8..b832fef 100644 --- a/chrome/browser/tab_contents/tab_contents.h +++ b/chrome/browser/tab_contents/tab_contents.h @@ -361,12 +361,6 @@ class TabContents : public PageNavigator, const gfx::Rect& initial_pos, bool user_gesture); - // Closes all constrained windows that represent web popups that have not yet - // been activated by the user and are as such auto-positioned in the bottom - // right of the screen. This is a quick way for users to "clean up" a flurry - // of unwanted popups. - void CloseAllSuppressedPopups(); - // Execute code in this tab. void ExecuteCode(int request_id, const std::string& extension_id, const std::vector<URLPattern>& host_permissions, @@ -645,10 +639,7 @@ class TabContents : public PageNavigator, // Used to access the child_windows_ (ConstrainedWindowList) for testing // automation purposes. friend class AutomationProvider; - friend class BlockedPopupContainerTest; - friend class BlockedPopupContainerControllerTest; - FRIEND_TEST(BlockedPopupContainerTest, TestReposition); FRIEND_TEST(TabContentsTest, NoJSMessageOnInterstitials); FRIEND_TEST(TabContentsTest, UpdateTitle); FRIEND_TEST(TabContentsTest, CrossSiteCantPreemptAfterUnload); @@ -690,30 +681,10 @@ class TabContents : public PageNavigator, void SetIsLoading(bool is_loading, LoadNotificationDetails* details); - // Constructs |blocked_popups_| if need be. - void CreateBlockedPopupContainerIfNecessary(); - // Adds the incoming |new_contents| to the |blocked_popups_| container. void AddPopup(TabContents* new_contents, const gfx::Rect& initial_pos); - // Called by a derived class when the TabContents is resized, causing - // suppressed constrained web popups to be repositioned to the new bounds - // if necessary. - void RepositionSupressedPopupsToFit(); - - // Whether we have a notification AND the notification owns popups windows. - // (We keep the notification object around even when it's not shown since it - // determines whether to show itself). - bool ShowingBlockedPopupNotification() const; - - // Only used during unit testing; otherwise |blocked_popups_| will be created - // on demand. - void set_blocked_popup_container(BlockedPopupContainer* container) { - DCHECK(blocked_popups_ == NULL); - blocked_popups_ = container; - } - // Called by derived classes to indicate that we're no longer waiting for a // response. This won't actually update the throbber, but it will get picked // up at the next animation step if the throbber is going. @@ -753,11 +724,8 @@ class TabContents : public PageNavigator, const NavigationController::LoadCommittedDetails& details, const ViewHostMsg_FrameNavigate_Params& params); - // Closes all child windows (constrained popups) when the domain changes. - // Supply the new and old URLs, and this function will figure out when the - // domain changing conditions are met. - void MaybeCloseChildWindows(const GURL& previous_url, - const GURL& current_url); + // Closes all constrained windows. + void CloseConstrainedWindows(); // Updates the starred state from the bookmark bar model. If the state has // changed, the delegate is notified. @@ -861,7 +829,6 @@ class TabContents : public PageNavigator, GetFormFieldHistoryDelegate(); virtual RenderViewHostDelegate::AutoFill* GetAutoFillDelegate(); virtual TabContents* GetAsTabContents(); - virtual void AddBlockedNotice(const GURL& url, const string16& reason); virtual ViewType::Type GetRenderViewType() const; virtual int GetBrowserWindowID() const; virtual void RenderViewCreated(RenderViewHost* render_view_host); @@ -1080,12 +1047,14 @@ class TabContents : public PageNavigator, // Character encoding. TODO(jungshik) : convert to std::string std::string encoding_; - // Data for shelves and stuff ------------------------------------------------ - - // ConstrainedWindow with additional methods for managing blocked - // popups. + // Object that holds any blocked popups frmo the current page. BlockedPopupContainer* blocked_popups_; + // TODO(pkasting): Hack to try and fix Linux browser tests. + bool dont_notify_render_view_; + + // Data for shelves and stuff ------------------------------------------------ + // Delegates for InfoBars associated with this TabContents. std::vector<InfoBarDelegate*> infobar_delegates_; diff --git a/chrome/browser/tab_contents/tab_contents_delegate.h b/chrome/browser/tab_contents/tab_contents_delegate.h index b4d3009..8431bae 100644 --- a/chrome/browser/tab_contents/tab_contents_delegate.h +++ b/chrome/browser/tab_contents/tab_contents_delegate.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// 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. @@ -106,6 +106,12 @@ class TabContentsDelegate { // Request the delegate to change the zoom level of the current tab. virtual void ContentsZoomChange(bool zoom_in) { } + // Notifies the delegate that something has changed about what content the + // TabContents is blocking. Interested parties should call + // TabContents::IsContentBlocked() to see if something they care about has + // changed. + virtual void OnBlockedContentChange(TabContents* source) { } + // Check whether this contents is inside a window dedicated to running a web // application. virtual bool IsApplication() const { return false; } diff --git a/chrome/browser/tab_contents/tab_contents_view_gtk.cc b/chrome/browser/tab_contents/tab_contents_view_gtk.cc index 61c685e..23b9ec3 100644 --- a/chrome/browser/tab_contents/tab_contents_view_gtk.cc +++ b/chrome/browser/tab_contents/tab_contents_view_gtk.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// 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. @@ -16,7 +16,6 @@ #include "base/string_util.h" #include "build/build_config.h" #include "chrome/browser/download/download_shelf.h" -#include "chrome/browser/gtk/blocked_popup_container_view_gtk.h" #include "chrome/browser/gtk/browser_window_gtk.h" #include "chrome/browser/gtk/constrained_window_gtk.h" #include "chrome/browser/gtk/gtk_floating_container.h" @@ -120,8 +119,7 @@ TabContentsView* TabContentsView::Create(TabContents* tab_contents) { TabContentsViewGtk::TabContentsViewGtk(TabContents* tab_contents) : TabContentsView(tab_contents), floating_(gtk_floating_container_new()), - fixed_(gtk_fixed_new()), - popup_view_(NULL) { + fixed_(gtk_fixed_new()) { gtk_widget_set_name(fixed_, "chrome-tab-contents-view"); g_signal_connect(fixed_, "size-allocate", G_CALLBACK(OnSizeAllocate), this); @@ -140,21 +138,6 @@ TabContentsViewGtk::~TabContentsViewGtk() { floating_.Destroy(); } -void TabContentsViewGtk::AttachBlockedPopupView( - BlockedPopupContainerViewGtk* popup_view) { - DCHECK(popup_view_ == NULL); - popup_view_ = popup_view; - gtk_floating_container_add_floating(GTK_FLOATING_CONTAINER(floating_.get()), - popup_view->widget()); -} - -void TabContentsViewGtk::RemoveBlockedPopupView( - BlockedPopupContainerViewGtk* popup_view) { - DCHECK(popup_view_ == popup_view); - gtk_container_remove(GTK_CONTAINER(floating_.get()), popup_view->widget()); - popup_view_ = NULL; -} - void TabContentsViewGtk::AttachConstrainedWindow( ConstrainedWindowGtk* constrained_window) { DCHECK(find(constrained_windows_.begin(), constrained_windows_.end(), @@ -426,32 +409,6 @@ gboolean TabContentsViewGtk::OnSizeAllocate(GtkWidget* widget, void TabContentsViewGtk::OnSetFloatingPosition( GtkFloatingContainer* floating_container, GtkAllocation* allocation, TabContentsViewGtk* tab_contents_view) { - if (tab_contents_view->popup_view_) { - GtkWidget* widget = tab_contents_view->popup_view_->widget(); - - // Look at the size request of the status bubble and tell the - // GtkFloatingContainer where we want it positioned. - GtkRequisition requisition; - gtk_widget_size_request(widget, &requisition); - - GValue value = { 0, }; - g_value_init(&value, G_TYPE_INT); - - int child_x = std::max( - allocation->x + allocation->width - requisition.width - - kScrollbarWidthHack, 0); - g_value_set_int(&value, child_x); - gtk_container_child_set_property(GTK_CONTAINER(floating_container), - widget, "x", &value); - - int child_y = std::max( - allocation->y + allocation->height - requisition.height, 0); - g_value_set_int(&value, child_y); - gtk_container_child_set_property(GTK_CONTAINER(floating_container), - widget, "y", &value); - g_value_unset(&value); - } - // Place each ConstrainedWindow in the center of the view. int half_view_width = std::max((allocation->x + allocation->width) / 2, 0); int half_view_height = std::max((allocation->y + allocation->height) / 2, 0); diff --git a/chrome/browser/tab_contents/tab_contents_view_gtk.h b/chrome/browser/tab_contents/tab_contents_view_gtk.h index d4bc0cf..62c3604 100644 --- a/chrome/browser/tab_contents/tab_contents_view_gtk.h +++ b/chrome/browser/tab_contents/tab_contents_view_gtk.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// 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. @@ -16,7 +16,6 @@ #include "chrome/common/notification_registrar.h" #include "chrome/common/owned_widget_gtk.h" -class BlockedPopupContainerViewGtk; class ConstrainedWindowGtk; class GtkThemeProperties; class RenderViewContextMenuGtk; @@ -34,11 +33,6 @@ class TabContentsViewGtk : public TabContentsView, explicit TabContentsViewGtk(TabContents* tab_contents); virtual ~TabContentsViewGtk(); - // Unlike Windows, the BlockedPopupContainerView needs to collaborate with - // the TabContentsViewGtk to position the notification. - void AttachBlockedPopupView(BlockedPopupContainerViewGtk* popup_view); - void RemoveBlockedPopupView(BlockedPopupContainerViewGtk* popup_view); - // Unlike Windows, ConstrainedWindows need to collaborate with the // TabContentsViewGtk to position the dialogs. void AttachConstrainedWindow(ConstrainedWindowGtk* constrained_window); @@ -100,8 +94,7 @@ class TabContentsViewGtk : public TabContentsView, GtkFloatingContainer* floating_container, GtkAllocation* allocation, TabContentsViewGtk* tab_contents_view); - // Contains |fixed_| as its GtkBin member and a possible floating widget from - // |popup_view_|. + // Contains |fixed_| as its GtkBin member. OwnedWidgetGtk floating_; // This container holds the tab's web page views. It is a GtkFixed so that we @@ -123,10 +116,6 @@ class TabContentsViewGtk : public TabContentsView, FocusStoreGtk focus_store_; - // Our UI for controlling popups (or NULL if no popup windows have been - // opened). |popup_view_| is owned by the TabContents, not the view. - BlockedPopupContainerViewGtk* popup_view_; - // Each individual UI for constrained dialogs currently displayed. The // objects in this vector are owned by the TabContents, not the view. std::vector<ConstrainedWindowGtk*> constrained_windows_; diff --git a/chrome/browser/views/accelerator_table_gtk.cc b/chrome/browser/views/accelerator_table_gtk.cc index e5ca48d..b55fe76 100644 --- a/chrome/browser/views/accelerator_table_gtk.cc +++ b/chrome/browser/views/accelerator_table_gtk.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// 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. diff --git a/chrome/browser/views/blocked_popup_container_view_views.cc b/chrome/browser/views/blocked_popup_container_view_views.cc deleted file mode 100644 index 4a47eb0..0000000 --- a/chrome/browser/views/blocked_popup_container_view_views.cc +++ /dev/null @@ -1,574 +0,0 @@ -// 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. - -#include "chrome/browser/views/blocked_popup_container_view_views.h" - -#include <math.h> -#if defined(OS_WIN) -#include <windows.h> -#endif - -#include "app/gfx/canvas.h" -#include "app/gfx/path.h" -#include "app/l10n_util.h" -#include "app/resource_bundle.h" -#include "app/slide_animation.h" -#include "base/string_util.h" -#include "base/utf_string_conversions.h" -#include "chrome/browser/profile.h" -#include "chrome/browser/tab_contents/tab_contents.h" -#include "grit/generated_resources.h" -#include "grit/theme_resources.h" -#include "views/background.h" -#include "views/controls/button/image_button.h" -#include "views/controls/button/menu_button.h" -#include "views/controls/menu/menu_2.h" -#include "views/controls/menu/simple_menu_model.h" -#include "views/controls/scrollbar/native_scroll_bar.h" -#include "views/screen.h" - -#if defined(OS_WIN) -#include "views/widget/widget_win.h" -#elif defined(OS_LINUX) -#include "views/widget/widget_gtk.h" -#endif - -namespace { -// The minimal border around the edge of the notification. -const int kSmallPadding = 2; - -// The background color of the blocked popup notification. -const SkColor kBackgroundColorTop = SkColorSetRGB(255, 242, 183); -const SkColor kBackgroundColorBottom = SkColorSetRGB(250, 230, 145); - -// The border color of the blocked popup notification. This is the same as the -// border around the inside of the tab contents. -const SkColor kBorderColor = SkColorSetRGB(190, 205, 223); - -// So that the MenuButton doesn't change its size as its text changes, during -// construction we feed it the strings it will be displaying, so it can set the -// max text width to the right value. "99" should preallocate enough space for -// all numbers we'd show. -const int kWidestNumber = 99; - -// Rounded corner radius (in pixels). -const int kBackgroundCornerRadius = 4; - -// Rounded corner definition so the top corners are rounded, and the bottom are -// normal 90 degree angles. -const SkScalar kRoundedCornerRad[8] = { - // Top left corner - SkIntToScalar(kBackgroundCornerRadius), - SkIntToScalar(kBackgroundCornerRadius), - // Top right corner - SkIntToScalar(kBackgroundCornerRadius), - SkIntToScalar(kBackgroundCornerRadius), - // Bottom right corner - 0, - 0, - // Bottom left corner - 0, - 0 -}; - -} // namespace - -#if defined(OS_WIN) - -// BlockedPopupContainerViewWidget Win ---------------------------------------- - -class BlockedPopupContainerViewWidget : public views::WidgetWin { - public: - BlockedPopupContainerViewWidget(BlockedPopupContainerViewViews* container, - gfx::NativeView parent); - - void SetBoundsAndShow(const gfx::Rect& bounds); - void Show(); - void Hide(); - - // Returns the size of our parent. - gfx::Size GetParentSize(); - - private: - virtual void OnSize(UINT param, const CSize& size); - - BlockedPopupContainerViewViews* container_; - - DISALLOW_COPY_AND_ASSIGN(BlockedPopupContainerViewWidget); -}; - -BlockedPopupContainerViewWidget::BlockedPopupContainerViewWidget( - BlockedPopupContainerViewViews* container, gfx::NativeView parent) - : container_(container) { - set_window_style(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); - WidgetWin::Init(parent, gfx::Rect()); -} - -void BlockedPopupContainerViewWidget::SetBoundsAndShow( - const gfx::Rect& bounds) { - SetWindowPos(HWND_TOP, bounds.x(), bounds.y(), bounds.width(), - bounds.height(), SWP_SHOWWINDOW); -} - -void BlockedPopupContainerViewWidget::Show() { - SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); -} - -void BlockedPopupContainerViewWidget::Hide() { - SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); -} - -gfx::Size BlockedPopupContainerViewWidget::GetParentSize() { - HWND parent = GetParent(); - RECT client_rect; - ::GetClientRect(parent, &client_rect); - return gfx::Size(client_rect.right - client_rect.left, - client_rect.bottom - client_rect.top); -} - -void BlockedPopupContainerViewWidget::OnSize(UINT param, const CSize& size) { - container_->UpdateWidgetShape(this, gfx::Size(size.cx, size.cy)); - - LayoutRootView(); -} - -#elif defined(OS_LINUX) - -// BlockedPopupContainerViewWidget GTK ---------------------------------------- -class BlockedPopupContainerViewWidget : public views::WidgetGtk { - public: - BlockedPopupContainerViewWidget(BlockedPopupContainerViewViews* container, - gfx::NativeView parent); - - void SetBoundsAndShow(const gfx::Rect& bounds); - - // Returns the size of our parent. - gfx::Size GetParentSize(); - - private: - virtual void OnSizeAllocate(GtkWidget* widget, GtkAllocation* allocation); - - BlockedPopupContainerViewViews* container_; - - DISALLOW_COPY_AND_ASSIGN(BlockedPopupContainerViewWidget); -}; - -BlockedPopupContainerViewWidget::BlockedPopupContainerViewWidget( - BlockedPopupContainerViewViews* container, - gfx::NativeView parent) - : views::WidgetGtk(views::WidgetGtk::TYPE_CHILD), - container_(container) { - WidgetGtk::Init(parent, gfx::Rect()); -} - -void BlockedPopupContainerViewWidget::SetBoundsAndShow( - const gfx::Rect& bounds) { - SetBounds(bounds); - Show(); -} - -gfx::Size BlockedPopupContainerViewWidget::GetParentSize() { - GtkWidget* parent = gtk_widget_get_parent(GetNativeView()); - return gfx::Size(parent->allocation.width, parent->allocation.height); -} - -void BlockedPopupContainerViewWidget::OnSizeAllocate( - GtkWidget* widget, GtkAllocation* allocation) { - WidgetGtk::OnSizeAllocate(widget, allocation); - container_->UpdateWidgetShape( - this, gfx::Size(allocation->width, allocation->height)); -} - -#endif - -// BlockedPopupContainerInternalView ------------------------------------------ - -// The view presented to the user notifying them of the number of popups -// blocked. This view should only be used inside of BlockedPopupContainer. -class BlockedPopupContainerInternalView : public views::View, - public views::ButtonListener, - public views::SimpleMenuModel::Delegate { - public: - explicit BlockedPopupContainerInternalView( - BlockedPopupContainerViewViews* container); - ~BlockedPopupContainerInternalView(); - - // Sets the label on the menu button. - void UpdateLabel(); - - std::wstring label() const { return popup_count_label_->text(); } - - // Overridden from views::View: - - // Paints our border and background. (Does not paint children.) - virtual void Paint(gfx::Canvas* canvas); - // Sets positions of all child views. - virtual void Layout(); - // Gets the desired size of the popup notification. - virtual gfx::Size GetPreferredSize(); - - // Overridden from views::ButtonListener: - virtual void ButtonPressed(views::Button* sender, const views::Event& event); - - // Overridden from SimpleMenuModel::Delegate: - - // Displays the status of the "Show Blocked Popup Notification" item. - virtual bool IsCommandIdChecked(int id) const; - virtual bool IsCommandIdEnabled(int id) const { return true; } - virtual bool GetAcceleratorForCommandId(int command_id, - views::Accelerator* accelerator) { - return false; - } - // Called after user clicks a menu item. - virtual void ExecuteCommand(int id); - - private: - // Our owner and HWND parent. - BlockedPopupContainerViewViews* container_; - - // The button which brings up the popup menu. - views::MenuButton* popup_count_label_; - - // Our "X" button. - views::ImageButton* close_button_; - - // Model for the menu. - scoped_ptr<views::SimpleMenuModel> launch_menu_model_; - - // Popup menu shown to user. - scoped_ptr<views::Menu2> launch_menu_; - - DISALLOW_IMPLICIT_CONSTRUCTORS(BlockedPopupContainerInternalView); -}; - - -BlockedPopupContainerInternalView::BlockedPopupContainerInternalView( - BlockedPopupContainerViewViews* container) - : container_(container) { - ResourceBundle &resource_bundle = ResourceBundle::GetSharedInstance(); - - // Create a button with a multidigit number to reserve space. - popup_count_label_ = new views::MenuButton( - this, - l10n_util::GetStringF(IDS_POPUPS_BLOCKED_COUNT, - IntToWString(kWidestNumber)), - NULL, true); - // Now set the text to the other possible display strings so that the button - // will update its max text width (in case one of these string is longer). - popup_count_label_->SetText(l10n_util::GetString(IDS_POPUPS_UNBLOCKED)); - popup_count_label_->SetText(l10n_util::GetString(IDS_BLOCKED_NOTICE_COUNT)); - popup_count_label_->set_alignment(views::TextButton::ALIGN_CENTER); - AddChildView(popup_count_label_); - - // For now, we steal the Find close button, since it looks OK. - close_button_ = new views::ImageButton(this); - close_button_->SetFocusable(true); - close_button_->SetImage(views::CustomButton::BS_NORMAL, - resource_bundle.GetBitmapNamed(IDR_CLOSE_BAR)); - close_button_->SetImage(views::CustomButton::BS_HOT, - resource_bundle.GetBitmapNamed(IDR_CLOSE_BAR_H)); - close_button_->SetImage(views::CustomButton::BS_PUSHED, - resource_bundle.GetBitmapNamed(IDR_CLOSE_BAR_P)); - AddChildView(close_button_); - - set_background(views::Background::CreateStandardPanelBackground()); - UpdateLabel(); -} - -BlockedPopupContainerInternalView::~BlockedPopupContainerInternalView() { -} - -void BlockedPopupContainerInternalView::UpdateLabel() { - size_t blocked_notices = container_->model()->GetBlockedNoticeCount(); - size_t blocked_items = container_->model()->GetBlockedPopupCount() + - blocked_notices; - - std::wstring label; - if (blocked_items == 0) { - label = l10n_util::GetString(IDS_POPUPS_UNBLOCKED); - } else if (blocked_notices == 0) { - label = l10n_util::GetStringF(IDS_POPUPS_BLOCKED_COUNT, - UintToWString(blocked_items)); - } else { - label = l10n_util::GetStringF(IDS_BLOCKED_NOTICE_COUNT, - UintToWString(blocked_items)); - } - popup_count_label_->SetText(label); - - Layout(); - SchedulePaint(); -} - -void BlockedPopupContainerInternalView::Paint(gfx::Canvas* canvas) { - // Draw the standard background. - View::Paint(canvas); - - SkRect rect; - rect.set(0, 0, SkIntToScalar(width()), SkIntToScalar(height())); - - // Draw the border - SkPaint border_paint; - border_paint.setFlags(SkPaint::kAntiAlias_Flag); - border_paint.setStyle(SkPaint::kStroke_Style); - border_paint.setColor(kBorderColor); - SkPath border_path; - border_path.addRoundRect(rect, kRoundedCornerRad, SkPath::kCW_Direction); - canvas->drawPath(border_path, border_paint); -} - -void BlockedPopupContainerInternalView::Layout() { - gfx::Size panel_size = GetPreferredSize(); - gfx::Size button_size = close_button_->GetPreferredSize(); - gfx::Size size = popup_count_label_->GetPreferredSize(); - - popup_count_label_->SetBounds(kSmallPadding, kSmallPadding, - size.width(), - size.height()); - - int close_button_padding = - static_cast<int>(ceil(panel_size.height() / 2.0) - - ceil(button_size.height() / 2.0)); - close_button_->SetBounds(width() - button_size.width() - close_button_padding, - close_button_padding, - button_size.width(), - button_size.height()); -} - -gfx::Size BlockedPopupContainerInternalView::GetPreferredSize() { - gfx::Size preferred_size = popup_count_label_->GetPreferredSize(); - preferred_size.Enlarge(close_button_->GetPreferredSize().width(), 0); - // Add padding to all sides of the |popup_count_label_| except the right. - preferred_size.Enlarge(kSmallPadding, 2 * kSmallPadding); - - // Add padding to the left and right side of |close_button_| equal to its - // horizontal/vertical spacing. - gfx::Size button_size = close_button_->GetPreferredSize(); - int close_button_padding = - static_cast<int>(ceil(preferred_size.height() / 2.0) - - ceil(button_size.height() / 2.0)); - preferred_size.Enlarge(2 * close_button_padding, 0); - - return preferred_size; -} - -void BlockedPopupContainerInternalView::ButtonPressed( - views::Button* sender, const views::Event& event) { - if (sender == close_button_) { - container_->model()->set_dismissed(); - container_->model()->CloseAll(); - } - - if (sender != popup_count_label_) - return; - - launch_menu_model_.reset(new views::SimpleMenuModel(this)); - - // Set items 1 .. popup_count as individual popups. - size_t popup_count = container_->model()->GetBlockedPopupCount(); - for (size_t i = 0; i < popup_count; ++i) { - std::wstring url, title; - container_->GetURLAndTitleForPopup(i, &url, &title); - // We can't just use the index into container_ here because Menu reserves - // the value 0 as the nop command. - launch_menu_model_->AddItem(i + 1, - l10n_util::GetStringFUTF16(IDS_POPUP_TITLE_FORMAT, WideToUTF16(url), - WideToUTF16(title))); - } - - // Set items (kImpossibleNumberOfPopups + 1) .. - // (kImpossibleNumberOfPopups + hosts.size()) as hosts. - std::vector<std::string> hosts(container_->model()->GetHosts()); - if (!hosts.empty() && (popup_count > 0)) - launch_menu_model_->AddSeparator(); - size_t first_host = BlockedPopupContainer::kImpossibleNumberOfPopups + 1; - for (size_t i = 0; i < hosts.size(); ++i) { - launch_menu_model_->AddCheckItem(first_host + i, - l10n_util::GetStringFUTF16(IDS_POPUP_HOST_FORMAT, - UTF8ToUTF16(hosts[i]))); - } - - // Set items (kImpossibleNumberOfPopups + hosts.size() + 2) .. - // (kImpossibleNumberOfPopups + hosts.size() + 1 + notice_count) as notices. - size_t notice_count = container_->model()->GetBlockedNoticeCount(); - if (notice_count && (!hosts.empty() || (popup_count > 0))) - launch_menu_model_->AddSeparator(); - size_t first_notice = first_host + hosts.size() + 1; - for (size_t i = 0; i < notice_count; ++i) { - std::string host; - string16 reason; - container_->model()->GetHostAndReasonForNotice(i, &host, &reason); - launch_menu_model_->AddItem(first_notice + i, - l10n_util::GetStringFUTF16(IDS_NOTICE_TITLE_FORMAT, ASCIIToUTF16(host), - reason)); - } - - launch_menu_.reset(new views::Menu2(launch_menu_model_.get())); - launch_menu_->RunContextMenuAt(views::Screen::GetCursorScreenPoint()); -} - -bool BlockedPopupContainerInternalView::IsCommandIdChecked(int id) const { - // |id| should be > 0 since all index based commands have 1 added to them. - DCHECK_GT(id, 0); - size_t id_size_t = static_cast<size_t>(id); - - if (id_size_t > BlockedPopupContainer::kImpossibleNumberOfPopups) { - id_size_t -= BlockedPopupContainer::kImpossibleNumberOfPopups + 1; - if (id_size_t < container_->model()->GetPopupHostCount()) - return container_->model()->IsHostWhitelisted(id_size_t); - } - - return false; -} - -void BlockedPopupContainerInternalView::ExecuteCommand(int id) { - // |id| should be > 0 since all index based commands have 1 added to them. - DCHECK_GT(id, 0); - size_t id_size_t = static_cast<size_t>(id); - - // Is this a click on a popup? - if (id_size_t < BlockedPopupContainer::kImpossibleNumberOfPopups) { - container_->model()->LaunchPopupAtIndex(id_size_t - 1); - return; - } - - // |id| shouldn't be == kImpossibleNumberOfPopups since the popups end before - // this and the hosts start after it. (If it is used, it is as a separator.) - DCHECK_NE(id_size_t, BlockedPopupContainer::kImpossibleNumberOfPopups); - id_size_t -= BlockedPopupContainer::kImpossibleNumberOfPopups + 1; - - // Is this a click on a host? - size_t host_count = container_->model()->GetPopupHostCount(); - if (id_size_t < host_count) { - container_->model()->ToggleWhitelistingForHost(id_size_t); - return; - } - - // |id shouldn't be == host_count since this is the separator between hosts - // and notices. - DCHECK_NE(id_size_t, host_count); - id_size_t -= host_count + 1; - - // Nothing to do for now for notices. -} - -// BlockedPopupContainerViewViews --------------------------------------------- - -// static -BlockedPopupContainerView* BlockedPopupContainerView::Create( - BlockedPopupContainer* container) { - return new BlockedPopupContainerViewViews(container); -} - -BlockedPopupContainerViewViews::~BlockedPopupContainerViewViews() { -} - -void BlockedPopupContainerViewViews::GetURLAndTitleForPopup( - size_t index, std::wstring* url, std::wstring* title) const { - DCHECK(url); - DCHECK(title); - TabContents* tab_contents = model()->GetTabContentsAt(index); - const GURL& tab_contents_url = tab_contents->GetURL().GetOrigin(); - *url = UTF8ToWide(tab_contents_url.possibly_invalid_spec()); - *title = UTF16ToWideHack(tab_contents->GetTitle()); -} - -// Overridden from AnimationDelegate: - -void BlockedPopupContainerViewViews::AnimationStarted( - const Animation* animation) { - SetPosition(); -} - -void BlockedPopupContainerViewViews::AnimationEnded(const Animation* animation) { - SetPosition(); -} - -void BlockedPopupContainerViewViews::AnimationProgressed( - const Animation* animation) { - SetPosition(); -} - -// Overridden from BlockedPopupContainerView: - -void BlockedPopupContainerViewViews::SetPosition() { - gfx::Size parent_size = widget_->GetParentSize(); - - // TODO(erg): There's no way to detect whether scroll bars are - // visible, so for beta, we're just going to assume that the - // vertical scroll bar is visible, and not care about covering up - // the horizontal scroll bar. Fixing this is half of - // http://b/1118139. - gfx::Point anchor_point( - parent_size.width() - - views::NativeScrollBar::GetVerticalScrollBarWidth(), - parent_size.height()); - - gfx::Size size = container_view_->GetPreferredSize(); - int base_x = anchor_point.x() - size.width(); - - int real_height = - static_cast<int>(size.height() * slide_animation_->GetCurrentValue()); - int real_y = anchor_point.y() - real_height; - - if (real_height > 0) { - int x; - if (l10n_util::GetTextDirection() == l10n_util::LEFT_TO_RIGHT) { - // Size this window using the anchor point as top-right corner. - x = base_x; - } else { - // Size this window to the bottom left corner of top client window. In - // Chrome, scrollbars always appear on the right, even for a RTL page or - // when the UI is RTL (see http://crbug.com/6113 for more detail). Thus 0 - // is always a safe value for x-axis. - x = 0; - } - widget_->SetBoundsAndShow(gfx::Rect(x, real_y, size.width(), real_height)); - container_view_->SchedulePaint(); - } else { - widget_->Hide(); - } -} - -void BlockedPopupContainerViewViews::ShowView() { - widget_->Show(); - slide_animation_->Show(); -} - -void BlockedPopupContainerViewViews::UpdateLabel() { - container_view_->UpdateLabel(); -} - -void BlockedPopupContainerViewViews::HideView() { - slide_animation_->Hide(); -} - -void BlockedPopupContainerViewViews::Destroy() { - widget_->CloseNow(); - delete this; -} - -// private: - -BlockedPopupContainerViewViews::BlockedPopupContainerViewViews( - BlockedPopupContainer* container) - : widget_(NULL), - model_(container), - container_view_(NULL), - slide_animation_(new SlideAnimation(this)) { - widget_ = new BlockedPopupContainerViewWidget(this, - model_->GetConstrainingContents(NULL)->GetNativeView()); - container_view_ = new BlockedPopupContainerInternalView(this); - widget_->SetContentsView(container_view_); - SetPosition(); -} - -void BlockedPopupContainerViewViews::UpdateWidgetShape( - BlockedPopupContainerViewWidget* widget, const gfx::Size& size) { - // Set the shape so we have rounded corners on the top. - SkRect rect; - rect.set(0, 0, SkIntToScalar(size.width()), SkIntToScalar(size.height())); - gfx::Path path; - path.addRoundRect(rect, kRoundedCornerRad, SkPath::kCW_Direction); - widget->SetShape(path.CreateNativeRegion()); -} diff --git a/chrome/browser/views/blocked_popup_container_view_views.h b/chrome/browser/views/blocked_popup_container_view_views.h deleted file mode 100644 index 2553021..0000000 --- a/chrome/browser/views/blocked_popup_container_view_views.h +++ /dev/null @@ -1,71 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_VIEWS_BLOCKED_POPUP_CONTAINER_VIEW_VIEWS_H_ -#define CHROME_BROWSER_VIEWS_BLOCKED_POPUP_CONTAINER_VIEW_VIEWS_H_ - -#include "app/animation.h" -#include "chrome/browser/blocked_popup_container.h" - -class BlockedPopupContainerViewWidget; -class BlockedPopupContainerInternalView; -class SlideAnimation; - -// Takes ownership of TabContents that are unrequested popup windows and -// presents an interface to the user for launching them. (Or never showing them -// again). -class BlockedPopupContainerViewViews : public BlockedPopupContainerView, - public AnimationDelegate { - public: - virtual ~BlockedPopupContainerViewViews(); - - // Returns the URL and title for popup |index|, used to construct a string for - // display. - void GetURLAndTitleForPopup(size_t index, - std::wstring* url, - std::wstring* title) const; - - // Returns the model that owns us. - BlockedPopupContainer* model() const { return model_; } - - // Overridden from AnimationDelegate: - virtual void AnimationStarted(const Animation* animation); - virtual void AnimationEnded(const Animation* animation); - virtual void AnimationProgressed(const Animation* animation); - - // Overridden from BlockedPopupContainerView: - virtual void SetPosition(); - virtual void ShowView(); - virtual void UpdateLabel(); - virtual void HideView(); - virtual void Destroy(); - - private: - // For the static constructor BlockedPopupContainerView::Create(). - friend class BlockedPopupContainerView; - friend class BlockedPopupContainerViewWidget; - - // Creates a container for a certain TabContents. - explicit BlockedPopupContainerViewViews(BlockedPopupContainer* container); - - // Updates the shape of the widget. - void UpdateWidgetShape(BlockedPopupContainerViewWidget* widget, - const gfx::Size& size); - - // Widget hosting container_view_. - BlockedPopupContainerViewWidget* widget_; - - // Our model; calling the shots. - BlockedPopupContainer* model_; - - // Our associated view object. - BlockedPopupContainerInternalView* container_view_; - - // The animation that slides us up and down. - scoped_ptr<SlideAnimation> slide_animation_; - - DISALLOW_COPY_AND_ASSIGN(BlockedPopupContainerViewViews); -}; - -#endif // CHROME_BROWSER_VIEWS_BLOCKED_POPUP_CONTAINER_VIEW_VIEWS_H_ diff --git a/chrome/browser/views/content_blocked_bubble_contents.cc b/chrome/browser/views/content_blocked_bubble_contents.cc index 82c9eca..35eb5b4 100644 --- a/chrome/browser/views/content_blocked_bubble_contents.cc +++ b/chrome/browser/views/content_blocked_bubble_contents.cc @@ -5,9 +5,13 @@ #include "chrome/browser/views/content_blocked_bubble_contents.h" #include "app/l10n_util.h" +#include "chrome/browser/blocked_popup_container.h" #include "chrome/browser/host_content_settings_map.h" #include "chrome/browser/profile.h" +#include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/views/info_bubble.h" +#include "chrome/common/notification_source.h" +#include "chrome/common/notification_type.h" #include "grit/generated_resources.h" #include "views/controls/button/native_button.h" #include "views/controls/button/radio_button.h" @@ -24,16 +28,20 @@ ContentBlockedBubbleContents::ContentBlockedBubbleContents( ContentSettingsType content_type, const std::string& host, const std::wstring& display_host, - Profile* profile) + Profile* profile, + TabContents* tab_contents) : content_type_(content_type), host_(host), display_host_(display_host), profile_(profile), + tab_contents_(tab_contents), info_bubble_(NULL), allow_radio_(NULL), block_radio_(NULL), close_button_(NULL), manage_link_(NULL) { + registrar_.Add(this, NotificationType::TAB_CONTENTS_DESTROYED, + Source<TabContents>(tab_contents)); } ContentBlockedBubbleContents::~ContentBlockedBubbleContents() { @@ -71,7 +79,18 @@ void ContentBlockedBubbleContents::LinkActivated(views::Link* source, #endif } - // TODO(pkasting): A popup link was clicked, show the corresponding popup. + PopupLinks::const_iterator i(popup_links_.find(source)); + DCHECK(i != popup_links_.end()); + if (tab_contents_ && tab_contents_->blocked_popup_container()) + tab_contents_->blocked_popup_container()->LaunchPopupForContents(i->second); +} + +void ContentBlockedBubbleContents::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + DCHECK(type == NotificationType::TAB_CONTENTS_DESTROYED); + DCHECK(source == Source<TabContents>(tab_contents_)); + tab_contents_ = NULL; } void ContentBlockedBubbleContents::InitControlLayout() { @@ -102,15 +121,21 @@ void ContentBlockedBubbleContents::InitControlLayout() { layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); if (content_type_ == CONTENT_SETTINGS_TYPE_POPUPS) { - /* TODO(pkasting): Show list of blocked popups as clickable links. - for (size_t i = 0; i < num_popups; ++i) { - if (i != 0) + BlockedPopupContainer::BlockedContents blocked_contents; + DCHECK(tab_contents_->blocked_popup_container()); + tab_contents_->blocked_popup_container()->GetBlockedContents( + &blocked_contents); + for (BlockedPopupContainer::BlockedContents::const_iterator + i(blocked_contents.begin()); i != blocked_contents.end(); ++i) { + views::Link* link = new views::Link(UTF16ToWideHack((*i)->GetTitle())); + link->SetController(this); + popup_links_[link] = *i; + if (i != blocked_contents.begin()) layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); layout->StartRow(0, single_column_set_id); - layout->AddView(popup_link); + layout->AddView(link); } layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); - */ views::Separator* separator = new views::Separator; layout->StartRow(0, single_column_set_id); diff --git a/chrome/browser/views/content_blocked_bubble_contents.h b/chrome/browser/views/content_blocked_bubble_contents.h index 7b7c434..f7ffe1b 100644 --- a/chrome/browser/views/content_blocked_bubble_contents.h +++ b/chrome/browser/views/content_blocked_bubble_contents.h @@ -5,9 +5,11 @@ #ifndef CHROME_BROWSER_VIEWS_CONTENT_BLOCKED_BUBBLE_CONTENTS_H_ #define CHROME_BROWSER_VIEWS_CONTENT_BLOCKED_BUBBLE_CONTENTS_H_ +#include <map> #include <string> #include "chrome/common/content_settings_types.h" +#include "chrome/common/notification_registrar.h" #include "views/controls/button/button.h" #include "views/controls/link.h" @@ -23,6 +25,7 @@ class InfoBubble; class Profile; +class TabContents; namespace views { class NativeButton; @@ -31,14 +34,23 @@ class RadioButton; class ContentBlockedBubbleContents : public views::View, public views::ButtonListener, - public views::LinkController { + public views::LinkController, + public NotificationObserver { public: ContentBlockedBubbleContents(ContentSettingsType content_type, const std::string& host, const std::wstring& display_host, - Profile* profile); + Profile* profile, + TabContents* tab_contents); virtual ~ContentBlockedBubbleContents(); + // Sets |info_bubble_|, so we can close the bubble if needed. The caller owns + // the bubble and must keep it alive. + void set_info_bubble(InfoBubble* info_bubble) { info_bubble_ = info_bubble; } + + private: + typedef std::map<views::Link*, TabContents*> PopupLinks; + // Overridden from views::View: virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child); @@ -48,11 +60,11 @@ class ContentBlockedBubbleContents : public views::View, // views::LinkController: virtual void LinkActivated(views::Link* source, int event_flags); - // Sets |info_bubble_|, so we can close the bubble if needed. The caller owns - // the bubble and must keep it alive. - void set_info_bubble(InfoBubble* info_bubble) { info_bubble_ = info_bubble; } + // NotificationObserver: + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); - private: // Creates the child views. void InitControlLayout(); @@ -66,11 +78,18 @@ class ContentBlockedBubbleContents : public views::View, // The active profile. Profile* profile_; + // The active tab contents. + TabContents* tab_contents_; + + // A registrar for listening for TAB_CONTENTS_DESTROYED notifications. + NotificationRegistrar registrar_; + // The InfoBubble holding us. InfoBubble* info_bubble_; // Some of our controls, so we can tell what's been clicked when we get a // message. + PopupLinks popup_links_; views::RadioButton* allow_radio_; views::RadioButton* block_radio_; views::NativeButton* close_button_; diff --git a/chrome/browser/views/location_bar_view.cc b/chrome/browser/views/location_bar_view.cc index 9f43102..3ae1ac0 100644 --- a/chrome/browser/views/location_bar_view.cc +++ b/chrome/browser/views/location_bar_view.cc @@ -348,9 +348,8 @@ void LocationBarView::SetProfile(Profile* profile) { } } -GURL LocationBarView::GetURL() const { - const TabContents* tab_contents = delegate_->GetTabContents(); - return tab_contents ? tab_contents->GetURL() : GURL(); +TabContents* LocationBarView::GetTabContents() const { + return delegate_->GetTabContents(); } void LocationBarView::SetPreviewEnabledPageAction(ExtensionAction *page_action, @@ -1379,14 +1378,17 @@ bool LocationBarView::ContentBlockedImageView::OnMousePressed( bounds.set_x(location.x()); bounds.set_width(width()); - GURL url = parent_->GetURL(); + TabContents* tab_contents = parent_->GetTabContents(); + if (!tab_contents) + return true; + GURL url = tab_contents->GetURL(); std::wstring display_host; net::AppendFormattedHost(url, profile_->GetPrefs()->GetString(prefs::kAcceptLanguages), &display_host, NULL, NULL); ContentBlockedBubbleContents* bubble_contents = new ContentBlockedBubbleContents(content_type_, url.host(), display_host, - profile_); + profile_, tab_contents); DCHECK(!info_bubble_); info_bubble_ = InfoBubble::Show(GetWindow(), bounds, bubble_contents, this); bubble_contents->set_info_bubble(info_bubble_); diff --git a/chrome/browser/views/location_bar_view.h b/chrome/browser/views/location_bar_view.h index cd9db1c..10edde4 100644 --- a/chrome/browser/views/location_bar_view.h +++ b/chrome/browser/views/location_bar_view.h @@ -102,9 +102,9 @@ class LocationBarView : public LocationBar, void SetProfile(Profile* profile); Profile* profile() { return profile_; } - // Returns the URL for the current page. This should only be used by the + // Returns the current TabContents. This should only be used by the // ContentBlockedImageView. - GURL GetURL() const; + TabContents* GetTabContents() const; // Sets |preview_enabled| for the PageAction View associated with this // |page_action|. If |preview_enabled| is true, the view will display the diff --git a/chrome/browser/views/tab_contents/tab_contents_view_gtk.cc b/chrome/browser/views/tab_contents/tab_contents_view_gtk.cc index 7db5ad4..4a1f3fd 100644 --- a/chrome/browser/views/tab_contents/tab_contents_view_gtk.cc +++ b/chrome/browser/views/tab_contents/tab_contents_view_gtk.cc @@ -1,6 +1,6 @@ -// 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. #include "chrome/browser/views/tab_contents/tab_contents_view_gtk.h" @@ -23,7 +23,6 @@ #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/tab_contents/tab_contents_delegate.h" #include "chrome/browser/tab_contents/web_drag_dest_gtk.h" -#include "chrome/browser/views/blocked_popup_container_view_views.h" #include "chrome/browser/views/sad_tab_view.h" #include "chrome/browser/views/tab_contents/render_view_context_menu_win.h" #include "views/controls/native/native_view_host.h" @@ -403,9 +402,6 @@ void TabContentsViewGtk::WasSized(const gfx::Size& size) { if (tab_contents()->render_widget_host_view()) tab_contents()->render_widget_host_view()->SetSize(size); - // TODO(brettw) this function can probably be moved to this class. - tab_contents()->RepositionSupressedPopupsToFit(); - SetFloatingPosition(size); } diff --git a/chrome/browser/views/tab_contents/tab_contents_view_win.cc b/chrome/browser/views/tab_contents/tab_contents_view_win.cc index 9c79650..6af5dc5 100644 --- a/chrome/browser/views/tab_contents/tab_contents_view_win.cc +++ b/chrome/browser/views/tab_contents/tab_contents_view_win.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// 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. @@ -637,9 +637,6 @@ void TabContentsViewWin::WasSized(const gfx::Size& size) { tab_contents()->interstitial_page()->SetSize(size); if (tab_contents()->render_widget_host_view()) tab_contents()->render_widget_host_view()->SetSize(size); - - // TODO(brettw) this function can probably be moved to this class. - tab_contents()->RepositionSupressedPopupsToFit(); } bool TabContentsViewWin::ScrollZoom(int scroll_type) { diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index d58e06e..6f31b09 100755 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -1,4 +1,4 @@ -# Copyright (c) 2009 The Chromium Authors. All rights reserved. +# 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. @@ -1079,8 +1079,6 @@ 'browser/cocoa/base_view.h', 'browser/cocoa/base_view.mm', 'browser/cocoa/browser_window_factory.mm', - 'browser/cocoa/blocked_popup_container_controller.h', - 'browser/cocoa/blocked_popup_container_controller.mm', 'browser/cocoa/bookmark_all_tabs_controller.h', 'browser/cocoa/bookmark_all_tabs_controller.mm', 'browser/cocoa/bookmark_bar_bridge.h', @@ -1524,8 +1522,6 @@ 'browser/gtk/back_forward_button_gtk.h', 'browser/gtk/back_forward_menu_model_gtk.cc', 'browser/gtk/back_forward_menu_model_gtk.h', - 'browser/gtk/blocked_popup_container_view_gtk.cc', - 'browser/gtk/blocked_popup_container_view_gtk.h', 'browser/gtk/bookmark_bar_gtk.cc', 'browser/gtk/bookmark_bar_gtk.h', 'browser/gtk/bookmark_bubble_gtk.cc', @@ -2283,8 +2279,6 @@ 'browser/views/autocomplete/autocomplete_popup_win.h', 'browser/views/autocomplete/autocomplete_popup_gtk.cc', 'browser/views/autocomplete/autocomplete_popup_gtk.h', - 'browser/views/blocked_popup_container_view_views.cc', - 'browser/views/blocked_popup_container_view_views.h', 'browser/views/bookmark_bar_view.cc', 'browser/views/bookmark_bar_view.h', 'browser/views/bookmark_bubble_view.cc', @@ -2859,8 +2853,6 @@ ['include', '^browser/views/autocomplete/autocomplete_popup_contents_view.h'], ['include', '^browser/views/autocomplete/autocomplete_popup_gtk.cc'], ['include', '^browser/views/autocomplete/autocomplete_popup_gtk.h'], - ['include', '^browser/views/blocked_popup_container_view_views.cc'], - ['include', '^browser/views/blocked_popup_container_view_views.h'], ['include', '^browser/views/bookmark_bar_view.cc'], ['include', '^browser/views/bookmark_bar_view.h'], ['include', '^browser/views/bookmark_bubble_view.cc'], @@ -4550,7 +4542,6 @@ 'browser/autocomplete/keyword_provider_unittest.cc', 'browser/autocomplete/search_provider_unittest.cc', 'browser/back_forward_menu_model_unittest.cc', - 'browser/blocked_popup_container_unittest.cc', 'browser/bookmarks/bookmark_codec_unittest.cc', 'browser/bookmarks/bookmark_drag_data_unittest.cc', 'browser/bookmarks/bookmark_folder_tree_model_unittest.cc', @@ -4588,7 +4579,6 @@ 'browser/cocoa/base_view_unittest.mm', 'browser/cocoa/background_gradient_view_unittest.mm', 'browser/cocoa/background_tile_view_unittest.mm', - 'browser/cocoa/blocked_popup_container_controller_unittest.mm', 'browser/cocoa/bookmark_all_tabs_controller_unittest.mm', 'browser/cocoa/bookmark_bar_bridge_unittest.mm', 'browser/cocoa/bookmark_bar_controller_unittest.mm', diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 13ed494..700f840 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc @@ -60,7 +60,8 @@ const wchar_t kAcceptLanguages[] = L"intl.accept_languages"; // stored in non-translatable part of the resource bundle. const wchar_t kStaticEncodings[] = L"intl.static_encodings"; -// The list of hostnames for which we whitelist popups (rather than blocking). +// OBSOLETE. The list of hostnames for which we whitelist popups (rather than +// blocking). const wchar_t kPopupWhitelistedHosts[] = L"profile.popup_whitelisted_sites"; // WebKit preferences. diff --git a/chrome/test/interactive_ui/interactive_ui_tests.gypi b/chrome/test/interactive_ui/interactive_ui_tests.gypi index 7f0838c..c055014 100644 --- a/chrome/test/interactive_ui/interactive_ui_tests.gypi +++ b/chrome/test/interactive_ui/interactive_ui_tests.gypi @@ -32,7 +32,6 @@ '<(DEPTH)/chrome/browser/browser_keyevents_browsertest.cc', '<(DEPTH)/chrome/browser/debugger/devtools_sanity_unittest.cc', '<(DEPTH)/chrome/browser/views/bookmark_bar_view_test.cc', - '<(DEPTH)/chrome/browser/blocked_popup_container_interactive_uitest.cc', '<(DEPTH)/chrome/browser/views/find_bar_host_interactive_uitest.cc', '<(DEPTH)/chrome/browser/views/tabs/tab_dragging_test.cc', '<(DEPTH)/chrome/test/in_process_browser_test.cc', @@ -82,7 +81,6 @@ '<(DEPTH)/chrome/browser/browser_keyevents_browsertest.cc', '<(DEPTH)/chrome/browser/debugger/devtools_sanity_unittest.cc', '<(DEPTH)/chrome/browser/views/bookmark_bar_view_test.cc', - '<(DEPTH)/chrome/browser/blocked_popup_container_interactive_uitest.cc', '<(DEPTH)/chrome/browser/views/find_bar_host_interactive_uitest.cc', '<(DEPTH)/chrome/browser/views/tabs/tab_dragging_test.cc', '<(DEPTH)/chrome/test/interactive_ui/npapi_interactive_test.cc', |