diff options
Diffstat (limited to 'chrome/browser/tab_contents')
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.cc | 97 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.h | 47 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_delegate.h | 8 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_view_gtk.cc | 45 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_view_gtk.h | 15 |
5 files changed, 55 insertions, 157 deletions
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc index d8cc146..81215e9 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" @@ -246,6 +247,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), @@ -336,15 +338,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(); - BlockTabContent(false); - } - } + CloseConstrainedWindows(); + // Close all blocked popups. if (blocked_popups_) blocked_popups_->Destroy(); @@ -566,6 +562,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; } @@ -844,12 +843,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); } bool TabContents::ExecuteCode(int request_id, const std::string& extension_id, @@ -863,7 +859,11 @@ bool 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 { @@ -1053,6 +1053,7 @@ void TabContents::WillCloseBlockedPopupContainer( BlockedPopupContainer* container) { DCHECK(blocked_popups_ == container); blocked_popups_ = NULL; + PopupNotificationVisibilityChanged(false); } void TabContents::DidMoveOrResize(ConstrainedWindow* window) { @@ -1268,33 +1269,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 { @@ -1432,8 +1418,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(); @@ -1455,30 +1449,18 @@ 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()); for (int i = size - 1; i >= 0; --i) { ConstrainedWindow* window = child_windows_[i]; if (window) { - DCHECK(delegate_); window->CloseConstrainedWindow(); BlockTabContent(false); } } - - // Close the popup container. - if (blocked_popups_) { - blocked_popups_->Destroy(); - blocked_popups_ = NULL; - } } void TabContents::UpdateStarredStateForCurrentURL() { @@ -2012,11 +1994,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 e42c1fb..4222e77 100644 --- a/chrome/browser/tab_contents/tab_contents.h +++ b/chrome/browser/tab_contents/tab_contents.h @@ -369,12 +369,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. Returns true if the message was successfully // sent. bool ExecuteCode(int request_id, const std::string& extension_id, @@ -671,10 +665,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); @@ -701,30 +692,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. @@ -758,11 +729,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. @@ -874,7 +842,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); @@ -1092,12 +1059,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 9cdd2cc..a193b2e 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. @@ -111,6 +111,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 a085ced..6957566 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_expanded_container.h" @@ -112,7 +111,6 @@ TabContentsViewGtk::TabContentsViewGtk(TabContents* tab_contents) : TabContentsView(tab_contents), floating_(gtk_floating_container_new()), expanded_(gtk_expanded_container_new()), - popup_view_(NULL), constrained_window_(NULL) { gtk_widget_set_name(expanded_, "chrome-tab-contents-view"); g_signal_connect(expanded_, "size-allocate", @@ -134,21 +132,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(constrained_window_ == NULL); @@ -390,32 +373,6 @@ void 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 0c84e1e..954e560 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. @@ -14,7 +14,6 @@ #include "chrome/common/notification_registrar.h" #include "chrome/common/owned_widget_gtk.h" -class BlockedPopupContainerViewGtk; class ConstrainedWindowGtk; class GtkThemeProperties; class RenderViewContextMenuGtk; @@ -32,11 +31,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); @@ -104,8 +98,7 @@ class TabContentsViewGtk : public TabContentsView, GtkFloatingContainer* floating_container, GtkAllocation* allocation, TabContentsViewGtk* tab_contents_view); - // Contains |expanded_| as its GtkBin member and a possible floating widget - // from |popup_view_|. + // Contains |expanded_| as its GtkBin member. OwnedWidgetGtk floating_; // This container holds the tab's web page views. It is a GtkExpandedContainer @@ -127,10 +120,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_; - // The UI for the constrained dialog currently displayed. This is owned by // TabContents, not the view. ConstrainedWindowGtk* constrained_window_; |