diff options
author | eroman@chromium.org <eroman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-12 22:58:52 +0000 |
---|---|---|
committer | eroman@chromium.org <eroman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-12 22:58:52 +0000 |
commit | 2bb12ce481d5fd5cb4ba371efeb4d52601e822ee (patch) | |
tree | d45d7ba2d7d07e9358c7a365a01f0c996049f414 /chrome/browser/ui | |
parent | 3f74cc7cc9f89afb269369a5cc4ec8cefb0ba6b3 (diff) | |
download | chromium_src-2bb12ce481d5fd5cb4ba371efeb4d52601e822ee.zip chromium_src-2bb12ce481d5fd5cb4ba371efeb4d52601e822ee.tar.gz chromium_src-2bb12ce481d5fd5cb4ba371efeb4d52601e822ee.tar.bz2 |
Revert 71230 to see if it is related to hang on linux interactive_ui_tests.
Original CL description:
Streamline the layout of the BrowserView's children TabContents views.
Modify SingleSplitView to calculate its children view's bounds, but do not actually resize them
and change BrowserViewLayout accordingly (BrowserViewLayout resizes all views now).
Do all reserved contents rect calculations before resizing TabContents views.
Rationale: to do all BrowserView layout related actions in the context of
BrowserViewLayout::Layout call and to minimize actual contents re-layouts.
BUG=51084
TEST=All tests should pass
Review URL: http://codereview.chromium.org/5606012
TBR=alekseys@chromium.org
Review URL: http://codereview.chromium.org/6121007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@71252 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/ui')
6 files changed, 98 insertions, 181 deletions
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index a52745b..1993374 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc @@ -1348,8 +1348,10 @@ void BrowserView::PrepareForInstant() { } void BrowserView::ShowInstant(TabContents* preview_contents) { - if (!preview_container_) + if (!preview_container_) { preview_container_ = new TabContentsContainer(); + preview_container_->set_reserved_area_delegate(this); + } contents_->SetPreview(preview_container_, preview_contents); preview_container_->ChangeTabContents(preview_contents); @@ -1823,12 +1825,41 @@ void BrowserView::InfoBarSizeChanged(bool is_animating) { SelectedTabToolbarSizeChanged(is_animating); } -bool BrowserView::SplitHandleMoved(views::SingleSplitView* view) { - for (int i = 0; i < view->GetChildViewCount(); ++i) - view->GetChildViewAt(i)->InvalidateLayout(); - SchedulePaint(); - Layout(); - return false; +void BrowserView::UpdateReservedContentsRect( + const TabContentsContainer* source) { + RenderWidgetHostView* render_widget_host_view = + source->tab_contents() ? source->tab_contents()->GetRenderWidgetHostView() + : NULL; + if (!render_widget_host_view) + return; + + gfx::Rect reserved_rect; + + if (!frame_->GetWindow()->IsMaximized() && + !frame_->GetWindow()->IsFullscreen()) { + gfx::Size resize_corner_size = ResizeCorner::GetSize(); + if (!resize_corner_size.IsEmpty()) { + gfx::Point resize_corner_origin; + gfx::Rect bounds = GetLocalBounds(false); + resize_corner_origin.set_x(bounds.right() - resize_corner_size.width()); + resize_corner_origin.set_y(bounds.bottom() - resize_corner_size.height()); + + View::ConvertPointToView(this, source, &resize_corner_origin); + + gfx::Size container_size = source->size(); + + if (resize_corner_origin.x() < container_size.width() && + resize_corner_origin.y() < container_size.height()) { + reserved_rect = gfx::Rect(resize_corner_origin, resize_corner_size); + } + } + } + + // TODO(alekseys): for source == contents_container_, consult SidebarTabView + // for the current size to reserve. Something like this: + // reserved_rect = reserved_rect.Union(SidebarTabView::GetCurrentBounds()); + + render_widget_host_view->set_reserved_contents_rect(reserved_rect); } views::LayoutManager* BrowserView::CreateLayoutManager() const { @@ -1891,6 +1922,7 @@ void BrowserView::Init() { AddChildView(infobar_container_); contents_container_ = new TabContentsContainer; + contents_container_->set_reserved_area_delegate(this); contents_ = new ContentsContainer(contents_container_); SkColor bg_color = GetWidget()->GetThemeProvider()-> @@ -1899,14 +1931,14 @@ void BrowserView::Init() { bool sidebar_allowed = SidebarManager::IsSidebarAllowed(); if (sidebar_allowed) { sidebar_container_ = new TabContentsContainer; + sidebar_container_->set_reserved_area_delegate(this); sidebar_container_->SetID(VIEW_ID_SIDE_BAR_CONTAINER); sidebar_container_->SetVisible(false); sidebar_split_ = new views::SingleSplitView( contents_, sidebar_container_, - views::SingleSplitView::HORIZONTAL_SPLIT, - this); + views::SingleSplitView::HORIZONTAL_SPLIT); sidebar_split_->SetID(VIEW_ID_SIDE_BAR_SPLIT); sidebar_split_->SetAccessibleName( UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_SIDE_BAR))); @@ -1915,6 +1947,7 @@ void BrowserView::Init() { } devtools_container_ = new TabContentsContainer; + devtools_container_->set_reserved_area_delegate(this); devtools_container_->SetID(VIEW_ID_DEV_TOOLS_DOCKED); devtools_container_->SetVisible(false); @@ -1925,8 +1958,7 @@ void BrowserView::Init() { contents_split_ = new views::SingleSplitView( contents_view, devtools_container_, - views::SingleSplitView::VERTICAL_SPLIT, - this); + views::SingleSplitView::VERTICAL_SPLIT); contents_split_->SetID(VIEW_ID_CONTENTS_SPLIT); contents_split_->SetAccessibleName( UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_WEB_CONTENTS))); @@ -2070,8 +2102,7 @@ void BrowserView::UpdateSidebarForContents(TabContentsWrapper* tab_contents) { sidebar_split_->width() - sidebar_width); sidebar_container_->SetVisible(true); - sidebar_split_->InvalidateLayout(); - Layout(); + sidebar_split_->Layout(); } else if (should_hide) { // Store split offset when hiding sidebar only. g_browser_process->local_state()->SetInteger( @@ -2079,8 +2110,7 @@ void BrowserView::UpdateSidebarForContents(TabContentsWrapper* tab_contents) { sidebar_split_->width() - sidebar_split_->divider_offset()); sidebar_container_->SetVisible(false); - sidebar_split_->InvalidateLayout(); - Layout(); + sidebar_split_->Layout(); } } @@ -2117,8 +2147,7 @@ void BrowserView::UpdateDevToolsForContents(TabContentsWrapper* wrapper) { contents_split_->set_divider_offset(split_offset); devtools_container_->SetVisible(true); - contents_split_->InvalidateLayout(); - Layout(); + contents_split_->Layout(); } else if (should_hide) { // Store split offset when hiding devtools window only. g_browser_process->local_state()->SetInteger( @@ -2128,8 +2157,7 @@ void BrowserView::UpdateDevToolsForContents(TabContentsWrapper* wrapper) { devtools_focus_tracker_->FocusLastFocusedExternalView(); devtools_container_->SetVisible(false); - contents_split_->InvalidateLayout(); - Layout(); + contents_split_->Layout(); } } @@ -2539,10 +2567,6 @@ void BrowserView::ProcessTabSelected(TabContentsWrapper* new_contents, UpdateUIForContents(new_contents); } -gfx::Size BrowserView::GetResizeCornerSize() const { - return ResizeCorner::GetSize(); -} - #if !defined(OS_CHROMEOS) // static BrowserWindow* BrowserWindow::CreateBrowserWindow(Browser* browser) { diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index 1825d64a..79b0859 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h @@ -26,7 +26,6 @@ #include "chrome/browser/ui/views/unhandled_keyboard_event_handler.h" #include "chrome/common/notification_registrar.h" #include "gfx/native_widget_types.h" -#include "views/controls/single_split_view.h" #include "views/window/client_view.h" #include "views/window/window_delegate.h" @@ -54,7 +53,6 @@ class InfoBarContainer; class LocationBarView; class SideTabStrip; class StatusBubbleViews; -class TabContentsContainer; class TabStripModel; class ToolbarView; class ZoomMenuModel; @@ -68,6 +66,7 @@ class JumpList; namespace views { class ExternalFocusTracker; class Menu; +class SingleSplitView; } /////////////////////////////////////////////////////////////////////////////// @@ -85,7 +84,7 @@ class BrowserView : public BrowserBubbleHost, public views::WindowDelegate, public views::ClientView, public InfoBarContainer::Delegate, - public views::SingleSplitView::Observer { + public TabContentsContainer::ReservedAreaDelegate { public: // The browser view's class name. static const char kViewClassName[]; @@ -397,8 +396,8 @@ class BrowserView : public BrowserBubbleHost, // InfoBarContainer::Delegate overrides virtual void InfoBarSizeChanged(bool is_animating); - // views::SingleSplitView::Observer overrides: - virtual bool SplitHandleMoved(views::SingleSplitView* view); + // TabContentsContainer::ReservedAreaDelegate overrides. + virtual void UpdateReservedContentsRect(const TabContentsContainer* source); protected: // Appends to |toolbars| a pointer to each AccessiblePaneView that @@ -523,9 +522,6 @@ class BrowserView : public BrowserBubbleHost, void ProcessTabSelected(TabContentsWrapper* new_contents, bool change_tab_contents); - // Exposes resize corner size to BrowserViewLayout. - gfx::Size GetResizeCornerSize() const; - // Last focused view that issued a tab traversal. int last_focused_view_storage_id_; diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc index 6dc8cd0..34549bd 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout.cc +++ b/chrome/browser/ui/views/frame/browser_view_layout.cc @@ -13,12 +13,10 @@ #include "chrome/browser/ui/views/frame/browser_frame.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/contents_container.h" -#include "chrome/browser/ui/views/tab_contents/tab_contents_container.h" #include "chrome/browser/ui/views/tabs/side_tab_strip.h" #include "chrome/browser/ui/views/tabs/tab_strip.h" #include "chrome/browser/ui/views/toolbar_view.h" #include "gfx/scrollbar_size.h" -#include "views/controls/single_split_view.h" #include "views/window/window.h" #if defined(OS_LINUX) @@ -209,9 +207,9 @@ void BrowserViewLayout::Uninstalled(views::View* host) {} void BrowserViewLayout::ViewAdded(views::View* host, views::View* view) { switch (view->GetID()) { case VIEW_ID_CONTENTS_SPLIT: { - contents_split_ = static_cast<views::SingleSplitView*>(view); + contents_split_ = view; // We're installed as the LayoutManager before BrowserView creates the - // contents, so we have to set contents_container_ here rather than in + // contents, so we have to set contents_container_ here rather than // Installed. contents_container_ = browser_view_->contents_; break; @@ -365,112 +363,9 @@ int BrowserViewLayout::LayoutInfoBar(int top) { return top + height; } -// |browser_reserved_rect| is in browser_view_ coordinates. -// |future_source_bounds| is in |source|'s parent coordinates. -// |future_parent_offset| is required, since parent view is not moved yet. -// Note that |future_parent_offset| is relative to browser_view_, not to -// the parent view. -void BrowserViewLayout::UpdateReservedContentsRect( - const gfx::Rect& browser_reserved_rect, - TabContentsContainer* source, - const gfx::Rect& future_source_bounds, - const gfx::Point& future_parent_offset) { - gfx::Point resize_corner_origin(browser_reserved_rect.origin()); - // Convert |resize_corner_origin| from browser_view_ to source's parent - // coordinates. - views::View::ConvertPointToView(browser_view_, source->GetParent(), - &resize_corner_origin); - // Create |reserved_rect| in source's parent coordinates. - gfx::Rect reserved_rect(resize_corner_origin, browser_reserved_rect.size()); - // Apply source's parent future offset to it. - reserved_rect.Offset(-future_parent_offset.x(), -future_parent_offset.y()); - if (future_source_bounds.Intersects(reserved_rect)) { - // |source| is not properly positioned yet to use ConvertPointToView, - // so convert it into |source|'s coordinates manually. - reserved_rect.Offset(-future_source_bounds.x(), -future_source_bounds.y()); - } else { - reserved_rect = gfx::Rect(); - } - - source->SetReservedContentsRect(reserved_rect); -} - void BrowserViewLayout::LayoutTabContents(int top, int bottom) { - // The ultimate idea is to calcualte bounds and reserved areas for all - // contents views first and then resize them all, so every view - // (and its contents) is resized and laid out only once. - - // The views hierarcy (see browser_view.h for more details): - // 1) Sidebar is not allowed: - // contents_split_ -> [contents_container_ | devtools] - // 2) Sidebar is allowed: - // contents_split_ -> - // [sidebar_split -> [contents_container_ | sidebar]] | devtools - - gfx::Rect sidebar_split_bounds; - gfx::Rect contents_bounds; - gfx::Rect sidebar_bounds; - gfx::Rect devtools_bounds; - - gfx::Rect contents_split_bounds(vertical_layout_rect_.x(), top, - vertical_layout_rect_.width(), - std::max(0, bottom - top)); - contents_split_->CalculateChildrenBounds( - contents_split_bounds, &sidebar_split_bounds, &devtools_bounds); - gfx::Point contents_split_offset( - contents_split_bounds.x() - contents_split_->bounds().x(), - contents_split_bounds.y() - contents_split_->bounds().y()); - gfx::Point sidebar_split_offset(contents_split_offset); - sidebar_split_offset.Offset(sidebar_split_bounds.x(), - sidebar_split_bounds.y()); - - views::SingleSplitView* sidebar_split = browser_view_->sidebar_split_; - if (sidebar_split) { - DCHECK(sidebar_split == contents_split_->GetChildViewAt(0)); - sidebar_split->CalculateChildrenBounds( - sidebar_split_bounds, &contents_bounds, &sidebar_bounds); - } else { - contents_bounds = sidebar_split_bounds; - } - - // Layout resize corner, sidebar mini tabs and calculate reserved contents - // rects here as all contents view bounds are already determined, but not yet - // set at this point, so contents will be laid out once at most. - // TODO(alekseys): layout sidebar minitabs and adjust reserved rect - // accordingly. - gfx::Rect browser_reserved_rect; - if (!browser_view_->frame_->GetWindow()->IsMaximized() && - !browser_view_->frame_->GetWindow()->IsFullscreen()) { - gfx::Size resize_corner_size = browser_view_->GetResizeCornerSize(); - if (!resize_corner_size.IsEmpty()) { - gfx::Rect bounds = browser_view_->GetLocalBounds(false); - gfx::Point resize_corner_origin( - bounds.right() - resize_corner_size.width(), - bounds.bottom() - resize_corner_size.height()); - browser_reserved_rect = - gfx::Rect(resize_corner_origin, resize_corner_size); - } - } - - UpdateReservedContentsRect(browser_reserved_rect, - browser_view_->contents_container_, - contents_bounds, - sidebar_split_offset); - if (sidebar_split) { - UpdateReservedContentsRect(browser_reserved_rect, - browser_view_->sidebar_container_, - sidebar_bounds, - sidebar_split_offset); - } - UpdateReservedContentsRect(browser_reserved_rect, - browser_view_->devtools_container_, - devtools_bounds, - contents_split_offset); - - // Now it's safe to actually resize all contents views in the hierarchy. - contents_split_->SetBounds(contents_split_bounds); - if (sidebar_split) - sidebar_split->SetBounds(sidebar_split_bounds); + contents_split_->SetBounds(vertical_layout_rect_.x(), top, + vertical_layout_rect_.width(), bottom - top); } int BrowserViewLayout::GetTopMarginForActiveContent() { diff --git a/chrome/browser/ui/views/frame/browser_view_layout.h b/chrome/browser/ui/views/frame/browser_view_layout.h index 1b680a1..279803c 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout.h +++ b/chrome/browser/ui/views/frame/browser_view_layout.h @@ -14,13 +14,8 @@ class Browser; class BrowserView; class ContentsContainer; class DownloadShelfView; -class TabContentsContainer; class ToolbarView; -namespace views { -class SingleSplitView; -} - // The layout manager used in chrome browser. class BrowserViewLayout : public views::LayoutManager { public: @@ -66,15 +61,6 @@ class BrowserViewLayout : public views::LayoutManager { int LayoutBookmarkBar(int top); int LayoutInfoBar(int top); - // Updates |source|'s reserved contents rect by mapping BrowserView's - // |browser_reserved_rect| into |future_source_bounds| taking into - // account |source|'s |future_parent_offset| (offset is relative to - // browser_view_). - void UpdateReservedContentsRect(const gfx::Rect& browser_reserved_rect, - TabContentsContainer* source, - const gfx::Rect& future_source_bounds, - const gfx::Point& future_parent_offset); - // Layout the TabContents container, between the coordinates |top| and // |bottom|. void LayoutTabContents(int top, int bottom); @@ -102,7 +88,7 @@ class BrowserViewLayout : public views::LayoutManager { // Child views that the layout manager manages. BaseTabStrip* tabstrip_; ToolbarView* toolbar_; - views::SingleSplitView* contents_split_; + views::View* contents_split_; ContentsContainer* contents_container_; views::View* infobar_container_; DownloadShelfView* download_shelf_; diff --git a/chrome/browser/ui/views/tab_contents/tab_contents_container.cc b/chrome/browser/ui/views/tab_contents/tab_contents_container.cc index 90af997..06c3400 100644 --- a/chrome/browser/ui/views/tab_contents/tab_contents_container.cc +++ b/chrome/browser/ui/views/tab_contents/tab_contents_container.cc @@ -25,7 +25,8 @@ TabContentsContainer::TabContentsContainer() : native_container_(NULL), - tab_contents_(NULL) { + tab_contents_(NULL), + reserved_area_delegate_(NULL) { SetID(VIEW_ID_TAB_CONTAINER); } @@ -45,6 +46,9 @@ void TabContentsContainer::ChangeTabContents(TabContents* contents) { tab_contents_->WasHidden(); RemoveObservers(); } +#if !defined(TOUCH_UI) + TabContents* old_contents = tab_contents_; +#endif tab_contents_ = contents; // When detaching the last tab of the browser ChangeTabContents is invoked // with NULL. Don't attempt to do anything in that case. @@ -59,7 +63,9 @@ void TabContentsContainer::ChangeTabContents(TabContents* contents) { Layout(); } #else - RenderWidgetHostViewChanged(tab_contents_->GetRenderWidgetHostView()); + RenderWidgetHostViewChanged( + old_contents ? old_contents->GetRenderWidgetHostView() : NULL, + tab_contents_->GetRenderWidgetHostView()); native_container_->AttachContents(tab_contents_); #endif AddObservers(); @@ -76,17 +82,6 @@ void TabContentsContainer::SetFastResize(bool fast_resize) { native_container_->SetFastResize(fast_resize); } -void TabContentsContainer::SetReservedContentsRect( - const gfx::Rect& reserved_rect) { - cached_reserved_rect_ = reserved_rect; -#if !defined(TOUCH_UI) - if (tab_contents_ && tab_contents_->GetRenderWidgetHostView()) { - tab_contents_->GetRenderWidgetHostView()->set_reserved_contents_rect( - reserved_rect); - } -#endif -} - //////////////////////////////////////////////////////////////////////////////// // TabContentsContainer, NotificationObserver implementation: @@ -113,6 +108,8 @@ void TabContentsContainer::Layout() { views::View::Layout(); #else if (native_container_) { + if (reserved_area_delegate_) + reserved_area_delegate_->UpdateReservedContentsRect(this); native_container_->GetView()->SetBounds(0, 0, width(), height()); native_container_->GetView()->Layout(); } @@ -161,8 +158,10 @@ void TabContentsContainer::RenderViewHostChanged(RenderViewHost* old_host, #if defined(TOUCH_UI) NOTIMPLEMENTED(); // TODO(anicolao) #else - if (new_host) - RenderWidgetHostViewChanged(new_host->view()); + if (new_host) { + RenderWidgetHostViewChanged( + old_host ? old_host->view() : NULL, new_host->view()); + } native_container_->RenderViewHostChanged(old_host, new_host); #endif } @@ -175,7 +174,12 @@ void TabContentsContainer::TabContentsDestroyed(TabContents* contents) { } void TabContentsContainer::RenderWidgetHostViewChanged( - RenderWidgetHostView* new_view) { - if (new_view) - new_view->set_reserved_contents_rect(cached_reserved_rect_); + RenderWidgetHostView* old_view, RenderWidgetHostView* new_view) { + // Carry over the reserved rect, if possible. + if (old_view && new_view) { + new_view->set_reserved_contents_rect(old_view->reserved_contents_rect()); + } else { + if (reserved_area_delegate_) + reserved_area_delegate_->UpdateReservedContentsRect(this); + } } diff --git a/chrome/browser/ui/views/tab_contents/tab_contents_container.h b/chrome/browser/ui/views/tab_contents/tab_contents_container.h index 1ba30ed..83633e8 100644 --- a/chrome/browser/ui/views/tab_contents/tab_contents_container.h +++ b/chrome/browser/ui/views/tab_contents/tab_contents_container.h @@ -19,6 +19,19 @@ class TabContents; class TabContentsContainer : public views::View, public NotificationObserver { public: + // Interface to request the reserved contents area updates. + class ReservedAreaDelegate { + public: + // Notifies that |source|'s reserved contents area should be updated. + // Reserved contents area is a rect in tab contents view coordinates where + // contents should not be rendered (to display the resize corner, sidebar + // mini tabs or any other UI elements overlaying this container). + virtual void UpdateReservedContentsRect( + const TabContentsContainer* source) = 0; + protected: + virtual ~ReservedAreaDelegate() {} + }; + TabContentsContainer(); virtual ~TabContentsContainer(); @@ -37,9 +50,9 @@ class TabContentsContainer : public views::View, // so performance is better. void SetFastResize(bool fast_resize); - // Updates the current reserved rect in view coordinates where contents - // should not be rendered to draw the resize corner, sidebar mini tabs etc. - void SetReservedContentsRect(const gfx::Rect& reserved_rect); + void set_reserved_area_delegate(ReservedAreaDelegate* delegate) { + reserved_area_delegate_ = delegate; + } // Overridden from NotificationObserver: virtual void Observe(NotificationType type, @@ -71,7 +84,8 @@ class TabContentsContainer : public views::View, void TabContentsDestroyed(TabContents* contents); // Called when the RenderWidgetHostView of the hosted TabContents has changed. - void RenderWidgetHostViewChanged(RenderWidgetHostView* new_view); + void RenderWidgetHostViewChanged(RenderWidgetHostView* old_view, + RenderWidgetHostView* new_view); // An instance of a NativeTabContentsContainer object that holds the native // view handle associated with the attached TabContents. @@ -83,10 +97,8 @@ class TabContentsContainer : public views::View, // Handles registering for our notifications. NotificationRegistrar registrar_; - // The current reserved rect in view coordinates where contents should not be - // rendered to draw the resize corner, sidebar mini tabs etc. - // Cached here to update ever changing renderers. - gfx::Rect cached_reserved_rect_; + // Delegate for enquiring reserved contents area. Not owned by us. + ReservedAreaDelegate* reserved_area_delegate_; DISALLOW_COPY_AND_ASSIGN(TabContentsContainer); }; |