summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/blocked_popup_container.cc
diff options
context:
space:
mode:
authorerg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-04 01:29:24 +0000
committererg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-04 01:29:24 +0000
commitbfd3886dea49078beed60f12b2c98e180172a2e7 (patch)
tree8bf0efa36b74a03a5425cbccc4a4b46b9b8ce0b9 /chrome/browser/views/blocked_popup_container.cc
parent57ecbe8836e353ba61860ca2f8ef2b6ddca75d6a (diff)
downloadchromium_src-bfd3886dea49078beed60f12b2c98e180172a2e7.zip
chromium_src-bfd3886dea49078beed60f12b2c98e180172a2e7.tar.gz
chromium_src-bfd3886dea49078beed60f12b2c98e180172a2e7.tar.bz2
Revert change r4523 because Vista doesn't like it.
TBR=nsylvain git-svn-id: svn://svn.chromium.org/chrome/trunk/src@4539 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views/blocked_popup_container.cc')
-rw-r--r--chrome/browser/views/blocked_popup_container.cc532
1 files changed, 0 insertions, 532 deletions
diff --git a/chrome/browser/views/blocked_popup_container.cc b/chrome/browser/views/blocked_popup_container.cc
deleted file mode 100644
index e69e859..0000000
--- a/chrome/browser/views/blocked_popup_container.cc
+++ /dev/null
@@ -1,532 +0,0 @@
-// Copyright (c) 2008 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.h"
-
-#include "chrome/app/theme/theme_resources.h"
-#include "chrome/browser/profile.h"
-#include "chrome/browser/tab_contents.h"
-#include "chrome/common/gfx/chrome_canvas.h"
-#include "chrome/common/resource_bundle.h"
-#include "chrome/views/background.h"
-#include "chrome/views/button.h"
-#include "chrome/views/menu_button.h"
-#include "chrome/views/menu.h"
-#include "chrome/common/l10n_util.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/common/gfx/path.h"
-
-#include "generated_resources.h"
-
-#include <math.h>
-
-const int kNotifyMenuItem = -1;
-
-// A number larger than the internal popup count on the Renderer; meant for
-// preventing a compromised renderer from exhausting GDI memory by spawning
-// infinite windows.
-const int kImpossibleNumberOfPopups = 30;
-
-// A small border around all widgets
-const int kSmallPadding = 2;
-
-// The background color of the blocked popup notification
-//static const SkColor kBackgroundColor = SkColorSetRGB(222, 234, 248);
-static const SkColor kBackgroundColorTop = SkColorSetRGB(255, 242, 183);
-static 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.
-static const SkColor kBorderColor = SkColorSetRGB(190, 205, 223);
-// Thickness of the border.
-static const int kBorderSize = 1;
-
-// Duration of the showing/hiding animations.
-static const int kShowAnimationDurationMS = 200;
-static const int kHideAnimationDurationMS = 120;
-static const int kFramerate = 25;
-
-// Rounded corner radius (in pixels)
-static const int kBackgroundCornerRadius = 4;
-
-// Rounded corner definition for the
-static 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
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// BlockedPopupContainerView
-//
-// The view presented to the user notifying them of the number of popups
-// blocked.
-//
-class BlockedPopupContainerView : public views::View,
- public views::BaseButton::ButtonListener,
- public Menu::Delegate {
- public:
- explicit BlockedPopupContainerView(BlockedPopupContainer* container);
- ~BlockedPopupContainerView();
-
- // Sets the label on the menu button
- void UpdatePopupCountLabel();
-
- // Overridden from views::View:
- virtual void Paint(ChromeCanvas* canvas);
- virtual void Layout();
- virtual gfx::Size GetPreferredSize();
-
- // Overridden from views::ButtonListener::ButtonPressed:
- virtual void ButtonPressed(views::BaseButton* sender);
-
- // Overridden from Menu::Delegate:
- virtual bool IsItemChecked(int id) const;
- virtual void ExecuteCommand(int id);
-
- private:
- // Our owner and HWND parent.
- BlockedPopupContainer* container_;
-
- // The button which brings up the popup menu.
- views::MenuButton* popup_count_label_;
-
- // Our "X" button.
- views::Button* close_button_;
-
- /// Popup menu shown to user.
- scoped_ptr<Menu> launch_menu_;
-};
-
-BlockedPopupContainerView::BlockedPopupContainerView(
- BlockedPopupContainer* container)
- : container_(container) {
- ResourceBundle &rb = ResourceBundle::GetSharedInstance();
-
- // Create a button with a multidigit number to reserve space.
- popup_count_label_ = new views::MenuButton(
- l10n_util::GetStringF(IDS_POPUPS_BLOCKED_COUNT, IntToWString(99)),
- NULL, true);
- popup_count_label_->SetTextAlignment(views::TextButton::ALIGN_CENTER);
- popup_count_label_->SetListener(this, 1);
- AddChildView(popup_count_label_);
-
- // For now, we steal the Find close button, since it looks OK.
- close_button_ = new views::Button();
- close_button_->SetFocusable(true);
- close_button_->SetImage(views::Button::BS_NORMAL,
- rb.GetBitmapNamed(IDR_CLOSE_BAR));
- close_button_->SetImage(views::Button::BS_HOT,
- rb.GetBitmapNamed(IDR_CLOSE_BAR_H));
- close_button_->SetImage(views::Button::BS_PUSHED,
- rb.GetBitmapNamed(IDR_CLOSE_BAR_P));
- close_button_->SetListener(this, 0);
- AddChildView(close_button_);
-
- SetBackground(views::Background::CreateStandardPanelBackground());
- UpdatePopupCountLabel();
-}
-
-BlockedPopupContainerView::~BlockedPopupContainerView() {
-}
-
-void BlockedPopupContainerView::UpdatePopupCountLabel() {
- popup_count_label_->SetText(container_->GetWindowTitle());
- Layout();
- SchedulePaint();
-}
-
-void BlockedPopupContainerView::Paint(ChromeCanvas* canvas) {
- View::Paint(canvas);
- // Draw the standard background
-
- 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 BlockedPopupContainerView::Layout() {
- gfx::Size panel_size = GetPreferredSize();
- gfx::Size button_size = close_button_->GetPreferredSize();
- gfx::Size sz = popup_count_label_->GetPreferredSize();
-
- popup_count_label_->SetBounds(kSmallPadding, kSmallPadding,
- sz.width(),
- sz.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 BlockedPopupContainerView::GetPreferredSize() {
- gfx::Size prefsize = popup_count_label_->GetPreferredSize();
- prefsize.Enlarge(close_button_->GetPreferredSize().width(), 0);
- // Add padding to all sides of the |popup_count_label_| except the right.
- prefsize.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(prefsize.height() / 2.0) -
- ceil(button_size.height() / 2.0));
- prefsize.Enlarge(2 * close_button_padding, 0);
-
- return prefsize;
-}
-
-void BlockedPopupContainerView::ButtonPressed(views::BaseButton* sender) {
- if (sender == popup_count_label_) {
- // Menu goes here.
- launch_menu_.reset(new Menu(this, Menu::TOPLEFT, container_->GetHWND()));
-
- int item_count = container_->GetTabContentsCount();
- for (int i = 0; i < item_count; ++i) {
- std::wstring label = container_->GetDisplayStringForItem(i);
- // We can't just use the index into container_ here because Menu reserves
- // the value 0 as the nop command.
- launch_menu_->AppendMenuItem(i + 1, label, Menu::NORMAL);
- }
-
- launch_menu_->AppendSeparator();
- launch_menu_->AppendMenuItem(
- kNotifyMenuItem,
- l10n_util::GetString(IDS_OPTIONS_SHOWPOPUPBLOCKEDNOTIFICATION),
- Menu::NORMAL);
-
- CPoint cursor_pos;
- ::GetCursorPos(&cursor_pos);
- launch_menu_->RunMenuAt(cursor_pos.x, cursor_pos.y);
- } else if (sender == close_button_) {
- container_->set_dismissed();
- container_->CloseAllPopups();
- }
-}
-
-bool BlockedPopupContainerView::IsItemChecked(int id) const {
- if (id == kNotifyMenuItem)
- return container_->GetShowBlockedPopupNotification();
-
- return false;
-}
-
-void BlockedPopupContainerView::ExecuteCommand(int id) {
- if (id == kNotifyMenuItem) {
- container_->ToggleBlockedPopupNotification();
- } else {
- // Decrement id since all index based commands have 1 added to them. (See
- // ButtonPressed() for detail).
- container_->LaunchPopupIndex(id - 1);
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// BlockedPopupContainer
-
-// static
-BlockedPopupContainer* BlockedPopupContainer::Create(
- TabContents* owner, Profile* profile, const gfx::Point& initial_anchor) {
- BlockedPopupContainer* c = new BlockedPopupContainer(owner, profile);
- c->Init(initial_anchor);
- return c;
-}
-
-BlockedPopupContainer::~BlockedPopupContainer() {
-}
-
-BlockedPopupContainer::BlockedPopupContainer(TabContents* owner,
- Profile* profile)
- : Animation(kFramerate, NULL),
- owner_(owner),
- container_view_(NULL),
- has_been_dismissed_(false),
- in_show_animation_(false),
- visibility_percentage_(0) {
- block_popup_pref_.Init(
- prefs::kBlockPopups, profile->GetPrefs(), NULL);
-}
-
-void BlockedPopupContainer::ToggleBlockedPopupNotification() {
- bool current = block_popup_pref_.GetValue();
- block_popup_pref_.SetValue(!current);
-}
-
-bool BlockedPopupContainer::GetShowBlockedPopupNotification() {
- return ! block_popup_pref_.GetValue();
-}
-
-void BlockedPopupContainer::AddTabContents(TabContents* blocked_contents,
- const gfx::Rect& bounds) {
- if (has_been_dismissed_) {
- // We simply bounce this popup without notice.
- blocked_contents->CloseContents();
- return;
- }
-
- if (blocked_popups_.size() > kImpossibleNumberOfPopups) {
- blocked_contents->CloseContents();
- LOG(INFO) << "Warning: Renderer is sending more popups to us then should be"
- " possible. Renderer compromised?";
- return;
- }
-
- blocked_contents->set_delegate(this);
- blocked_popups_.push_back(std::make_pair(blocked_contents, bounds));
- container_view_->UpdatePopupCountLabel();
-
- ShowSelf();
-}
-
-void BlockedPopupContainer::LaunchPopupIndex(int index) {
- if (static_cast<size_t>(index) < blocked_popups_.size()) {
- TabContents* contents = blocked_popups_[index].first;
- gfx::Rect bounds = blocked_popups_[index].second;
- blocked_popups_.erase(blocked_popups_.begin() + index);
- container_view_->UpdatePopupCountLabel();
-
- contents->set_delegate(NULL);
- contents->DisassociateFromPopupCount();
-
- // Pass this TabContents back to our owner, forcing the window to be
- // displayed since user_gesture is true.
- owner_->AddNewContents(contents, NEW_POPUP, bounds, true);
- }
-
- if (blocked_popups_.size() == 0)
- CloseAllPopups();
-}
-
-int BlockedPopupContainer::GetTabContentsCount() const {
- return blocked_popups_.size();
-}
-
-std::wstring BlockedPopupContainer::GetDisplayStringForItem(int index) {
- const GURL& url = blocked_popups_[index].first->GetURL().GetOrigin();
-
- std::wstring label =
- l10n_util::GetStringF(IDS_POPUP_TITLE_FORMAT,
- UTF8ToWide(url.possibly_invalid_spec()),
- blocked_popups_[index].first->GetTitle());
- return label;
-}
-
-void BlockedPopupContainer::CloseAllPopups() {
- CloseEachTabContents();
- container_view_->UpdatePopupCountLabel();
- HideSelf();
-}
-
-/////////////////////////////////////////////////////////////////////////////////
-// Override from ConstrainedWindow:
-
-void BlockedPopupContainer::CloseConstrainedWindow() {
- CloseEachTabContents();
-
- // Broadcast to all observers of NOTIFY_CWINDOW_CLOSED.
- // One example of such an observer is AutomationCWindowTracker in the
- // automation component.
- NotificationService::current()->Notify(NOTIFY_CWINDOW_CLOSED,
- Source<ConstrainedWindow>(this),
- NotificationService::NoDetails());
-
- Close();
-}
-
-void BlockedPopupContainer::RepositionConstrainedWindowTo(
- const gfx::Point& anchor_point) {
- anchor_point_ = anchor_point;
- SetPosition();
-}
-
-std::wstring BlockedPopupContainer::GetWindowTitle() const {
- return l10n_util::GetStringF(IDS_POPUPS_BLOCKED_COUNT,
- IntToWString(GetTabContentsCount()));
-}
-
-const gfx::Rect& BlockedPopupContainer::GetCurrentBounds() const {
- return bounds_;
-}
-
-/////////////////////////////////////////////////////////////////////////////////
-// Override from TabContentsDelegate:
-void BlockedPopupContainer::OpenURLFromTab(TabContents* source,
- const GURL& url, const GURL& referrer,
- WindowOpenDisposition disposition,
- PageTransition::Type transition) {
- owner_->OpenURL(url, referrer, disposition, transition);
-}
-
-void BlockedPopupContainer::ReplaceContents(TabContents* source,
- TabContents* new_contents) {
- // Walk the vector to find the correct TabContents and replace it.
- bool found = false;
- gfx::Rect rect;
- for (std::vector<std::pair<TabContents*, gfx::Rect> >::iterator it =
- blocked_popups_.begin(); it != blocked_popups_.end(); ++it) {
- if (it->first == source) {
- rect = it->second;
- found = true;
- blocked_popups_.erase(it);
- break;
- }
- }
-
- if (found)
- blocked_popups_.push_back(std::make_pair(new_contents, rect));
-}
-
-void BlockedPopupContainer::AddNewContents(TabContents* source,
- TabContents* new_contents,
- WindowOpenDisposition disposition,
- const gfx::Rect& initial_pos,
- bool user_gesture) {
- owner_->AddNewContents(new_contents, disposition, initial_pos,
- user_gesture);
-}
-
-void BlockedPopupContainer::CloseContents(TabContents* source) {
- for (std::vector<std::pair<TabContents*, gfx::Rect> >::iterator it =
- blocked_popups_.begin(); it != blocked_popups_.end(); ++it) {
- if (it->first == source) {
- blocked_popups_.erase(it);
- break;
- }
- }
-
- if (blocked_popups_.size() == 0)
- CloseAllPopups();
-}
-
-void BlockedPopupContainer::MoveContents(TabContents* source,
- const gfx::Rect& pos) {
- for (std::vector<std::pair<TabContents*, gfx::Rect> >::iterator it =
- blocked_popups_.begin(); it != blocked_popups_.end(); ++it) {
- if (it->first == source) {
- it->second = pos;
- break;
- }
- }
-}
-
-bool BlockedPopupContainer::IsPopup(TabContents* source) {
- return true;
-}
-
-TabContents* BlockedPopupContainer::GetConstrainingContents(
- TabContents* source) {
- return owner_;
-}
-
-/////////////////////////////////////////////////////////////////////////////////
-// Override from Animation:
-void BlockedPopupContainer::AnimateToState(double state) {
- if (in_show_animation_)
- visibility_percentage_ = state;
- else
- visibility_percentage_ = 1 - state;
-
- SetPosition();
-}
-
-/////////////////////////////////////////////////////////////////////////////////
-// Override from views::ContainerWin:
-void BlockedPopupContainer::OnFinalMessage(HWND window) {
- owner_->WillClose(this);
- CloseEachTabContents();
- ContainerWin::OnFinalMessage(window);
-}
-
-void BlockedPopupContainer::OnSize(UINT param, const CSize& size) {
- // Set the window region so we have rounded corners on the top.
- SkRect rect;
- rect.set(0, 0, SkIntToScalar(size.cx), SkIntToScalar(size.cy));
- gfx::Path path;
- path.addRoundRect(rect, kRoundedCornerRad, SkPath::kCW_Direction);
- SetWindowRgn(path.CreateHRGN(), TRUE);
-
- ChangeSize(param, size);
-}
-
-// private:
-
-void BlockedPopupContainer::Init(const gfx::Point& initial_anchor) {
- container_view_ = new BlockedPopupContainerView(this);
- container_view_->SetVisible(true);
-
- set_window_style(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
- ContainerWin::Init(owner_->GetContainerHWND(), gfx::Rect(), false);
- SetContentsView(container_view_);
- RepositionConstrainedWindowTo(initial_anchor);
-
- if (GetShowBlockedPopupNotification())
- ShowSelf();
- else
- has_been_dismissed_ = true;
-}
-
-void BlockedPopupContainer::HideSelf() {
- in_show_animation_ = false;
- Animation::SetDuration(kHideAnimationDurationMS);
- Animation::Start();
-}
-
-void BlockedPopupContainer::ShowSelf() {
- SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
- if (!Animation::IsAnimating() && visibility_percentage_ < 1.0) {
- in_show_animation_ = true;
- Animation::SetDuration(kShowAnimationDurationMS);
- Animation::Start();
- }
-}
-
-void BlockedPopupContainer::SetPosition() {
- gfx::Size size = container_view_->GetPreferredSize();
- int base_x = anchor_point_.x() - size.width();
- int base_y = anchor_point_.y() - size.height();
- // The bounds we report through the automation system are the real bounds;
- // the animation is short lived...
- bounds_ = gfx::Rect(gfx::Point(base_x, base_y), size);
-
- int real_height = static_cast<int>(size.height() * visibility_percentage_);
- int real_y = anchor_point_.y() - real_height;
-
- // Size this window to the bottom left corner starting at the anchor point.
- if (real_height > 0) {
- SetWindowPos(HWND_TOP, base_x, real_y, size.width(), real_height, 0);
- container_view_->SchedulePaint();
- } else {
- SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
- }
-}
-
-void BlockedPopupContainer::CloseEachTabContents() {
- while (!blocked_popups_.empty()) {
- blocked_popups_.back().first->CloseContents();
- blocked_popups_.pop_back();
- }
-
- blocked_popups_.clear();
-}