| OLD | NEW | 
|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/browser/ui/views/frame/browser_view_layout.h" | 5 #include "chrome/browser/ui/views/frame/browser_view_layout.h" | 
| 6 | 6 | 
| 7 #include "base/observer_list.h" | 7 #include "base/observer_list.h" | 
| 8 #include "chrome/browser/profiles/profile.h" | 8 #include "chrome/browser/profiles/profile.h" | 
| 9 #include "chrome/browser/ui/browser.h" | 9 #include "chrome/browser/ui/browser.h" | 
| 10 #include "chrome/browser/ui/browser_finder.h" | 10 #include "chrome/browser/ui/browser_finder.h" | 
| 11 #include "chrome/browser/ui/browser_window.h" | 11 #include "chrome/browser/ui/browser_window.h" | 
| 12 #include "chrome/browser/ui/find_bar/find_bar.h" | 12 #include "chrome/browser/ui/find_bar/find_bar.h" | 
| 13 #include "chrome/browser/ui/find_bar/find_bar_controller.h" | 13 #include "chrome/browser/ui/find_bar/find_bar_controller.h" | 
| 14 #include "chrome/browser/ui/search/search_model.h" | 14 #include "chrome/browser/ui/search/search_model.h" | 
| 15 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" | 15 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" | 
| 16 #include "chrome/browser/ui/views/download/download_shelf_view.h" | 16 #include "chrome/browser/ui/views/download/download_shelf_view.h" | 
| 17 #include "chrome/browser/ui/views/frame/browser_view_layout_delegate.h" | 17 #include "chrome/browser/ui/views/frame/browser_view_layout_delegate.h" | 
| 18 #include "chrome/browser/ui/views/frame/contents_container.h" | 18 #include "chrome/browser/ui/views/frame/contents_layout_manager.h" | 
| 19 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" | 19 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" | 
| 20 #include "chrome/browser/ui/views/frame/top_container_view.h" | 20 #include "chrome/browser/ui/views/frame/top_container_view.h" | 
| 21 #include "chrome/browser/ui/views/fullscreen_exit_bubble_views.h" | 21 #include "chrome/browser/ui/views/fullscreen_exit_bubble_views.h" | 
| 22 #include "chrome/browser/ui/views/infobars/infobar_container_view.h" | 22 #include "chrome/browser/ui/views/infobars/infobar_container_view.h" | 
| 23 #include "chrome/browser/ui/views/tabs/tab_strip.h" | 23 #include "chrome/browser/ui/views/tabs/tab_strip.h" | 
| 24 #include "components/web_modal/web_contents_modal_dialog_host.h" | 24 #include "components/web_modal/web_contents_modal_dialog_host.h" | 
| 25 #include "ui/base/hit_test.h" | 25 #include "ui/base/hit_test.h" | 
| 26 #include "ui/gfx/point.h" | 26 #include "ui/gfx/point.h" | 
| 27 #include "ui/gfx/scrollbar_size.h" | 27 #include "ui/gfx/scrollbar_size.h" | 
| 28 #include "ui/gfx/size.h" | 28 #include "ui/gfx/size.h" | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 83     gfx::NativeWindow native_window = | 83     gfx::NativeWindow native_window = | 
| 84         browser_view_layout_->browser()->window()->GetNativeWindow(); | 84         browser_view_layout_->browser()->window()->GetNativeWindow(); | 
| 85     return views::Widget::GetWidgetForNativeWindow(native_window)-> | 85     return views::Widget::GetWidgetForNativeWindow(native_window)-> | 
| 86         GetNativeView(); | 86         GetNativeView(); | 
| 87   } | 87   } | 
| 88 | 88 | 
| 89   // Center horizontally over the content area, with the top overlapping the | 89   // Center horizontally over the content area, with the top overlapping the | 
| 90   // browser chrome. | 90   // browser chrome. | 
| 91   virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE { | 91   virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE { | 
| 92     int top_y = browser_view_layout_->web_contents_modal_dialog_top_y_; | 92     int top_y = browser_view_layout_->web_contents_modal_dialog_top_y_; | 
| 93     ContentsContainer* contents_container = | 93     views::View* contents_container = | 
| 94         browser_view_layout_->contents_container_; | 94         browser_view_layout_->contents_container_; | 
| 95     gfx::Rect contents_container_bounds_in_widget = | 95     gfx::Rect contents_container_bounds_in_widget = | 
| 96         contents_container->ConvertRectToWidget( | 96         contents_container->ConvertRectToWidget( | 
| 97             contents_container->GetLocalBounds()); | 97             contents_container->GetLocalBounds()); | 
| 98     int middle_x = contents_container_bounds_in_widget.x() + | 98     int middle_x = contents_container_bounds_in_widget.x() + | 
| 99         contents_container_bounds_in_widget.width() / 2; | 99         contents_container_bounds_in_widget.width() / 2; | 
| 100     return gfx::Point(middle_x - size.width() / 2, top_y); | 100     return gfx::Point(middle_x - size.width() / 2, top_y); | 
| 101   } | 101   } | 
| 102 | 102 | 
| 103   virtual gfx::Size GetMaximumDialogSize() OVERRIDE { | 103   virtual gfx::Size GetMaximumDialogSize() OVERRIDE { | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 138 // BrowserViewLayout, public: | 138 // BrowserViewLayout, public: | 
| 139 | 139 | 
| 140 BrowserViewLayout::BrowserViewLayout() | 140 BrowserViewLayout::BrowserViewLayout() | 
| 141     : browser_(NULL), | 141     : browser_(NULL), | 
| 142       browser_view_(NULL), | 142       browser_view_(NULL), | 
| 143       top_container_(NULL), | 143       top_container_(NULL), | 
| 144       tab_strip_(NULL), | 144       tab_strip_(NULL), | 
| 145       toolbar_(NULL), | 145       toolbar_(NULL), | 
| 146       bookmark_bar_(NULL), | 146       bookmark_bar_(NULL), | 
| 147       infobar_container_(NULL), | 147       infobar_container_(NULL), | 
| 148       contents_split_(NULL), |  | 
| 149       contents_container_(NULL), | 148       contents_container_(NULL), | 
|  | 149       contents_layout_manager_(NULL), | 
| 150       download_shelf_(NULL), | 150       download_shelf_(NULL), | 
| 151       immersive_mode_controller_(NULL), | 151       immersive_mode_controller_(NULL), | 
| 152       dialog_host_(new WebContentsModalDialogHostViews(this)), | 152       dialog_host_(new WebContentsModalDialogHostViews(this)), | 
| 153       web_contents_modal_dialog_top_y_(-1) {} | 153       web_contents_modal_dialog_top_y_(-1) {} | 
| 154 | 154 | 
| 155 BrowserViewLayout::~BrowserViewLayout() { | 155 BrowserViewLayout::~BrowserViewLayout() { | 
| 156 } | 156 } | 
| 157 | 157 | 
| 158 void BrowserViewLayout::Init( | 158 void BrowserViewLayout::Init( | 
| 159     BrowserViewLayoutDelegate* delegate, | 159     BrowserViewLayoutDelegate* delegate, | 
| 160     Browser* browser, | 160     Browser* browser, | 
| 161     views::ClientView* browser_view, | 161     views::ClientView* browser_view, | 
| 162     views::View* top_container, | 162     views::View* top_container, | 
| 163     TabStrip* tab_strip, | 163     TabStrip* tab_strip, | 
| 164     views::View* toolbar, | 164     views::View* toolbar, | 
| 165     InfoBarContainerView* infobar_container, | 165     InfoBarContainerView* infobar_container, | 
| 166     views::View* contents_split, | 166     views::View* contents_container, | 
| 167     ContentsContainer* contents_container, | 167     ContentsLayoutManager* contents_layout_manager, | 
| 168     ImmersiveModeController* immersive_mode_controller) { | 168     ImmersiveModeController* immersive_mode_controller) { | 
| 169   delegate_.reset(delegate); | 169   delegate_.reset(delegate); | 
| 170   browser_ = browser; | 170   browser_ = browser; | 
| 171   browser_view_ = browser_view; | 171   browser_view_ = browser_view; | 
| 172   top_container_ = top_container; | 172   top_container_ = top_container; | 
| 173   tab_strip_ = tab_strip; | 173   tab_strip_ = tab_strip; | 
| 174   toolbar_ = toolbar; | 174   toolbar_ = toolbar; | 
| 175   infobar_container_ = infobar_container; | 175   infobar_container_ = infobar_container; | 
| 176   contents_split_ = contents_split; |  | 
| 177   contents_container_ = contents_container; | 176   contents_container_ = contents_container; | 
|  | 177   contents_layout_manager_ = contents_layout_manager; | 
| 178   immersive_mode_controller_ = immersive_mode_controller; | 178   immersive_mode_controller_ = immersive_mode_controller; | 
| 179 } | 179 } | 
| 180 | 180 | 
| 181 WebContentsModalDialogHost* | 181 WebContentsModalDialogHost* | 
| 182     BrowserViewLayout::GetWebContentsModalDialogHost() { | 182     BrowserViewLayout::GetWebContentsModalDialogHost() { | 
| 183   return dialog_host_.get(); | 183   return dialog_host_.get(); | 
| 184 } | 184 } | 
| 185 | 185 | 
| 186 gfx::Size BrowserViewLayout::GetMinimumSize() { | 186 gfx::Size BrowserViewLayout::GetMinimumSize() { | 
| 187   gfx::Size tabstrip_size( | 187   gfx::Size tabstrip_size( | 
| 188       browser()->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ? | 188       browser()->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ? | 
| 189       tab_strip_->GetMinimumSize() : gfx::Size()); | 189       tab_strip_->GetMinimumSize() : gfx::Size()); | 
| 190   gfx::Size toolbar_size( | 190   gfx::Size toolbar_size( | 
| 191       (browser()->SupportsWindowFeature(Browser::FEATURE_TOOLBAR) || | 191       (browser()->SupportsWindowFeature(Browser::FEATURE_TOOLBAR) || | 
| 192        browser()->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) ? | 192        browser()->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) ? | 
| 193            toolbar_->GetMinimumSize() : gfx::Size()); | 193            toolbar_->GetMinimumSize() : gfx::Size()); | 
| 194   if (tabstrip_size.height() && toolbar_size.height()) | 194   if (tabstrip_size.height() && toolbar_size.height()) | 
| 195     toolbar_size.Enlarge(0, -kToolbarTabStripVerticalOverlap); | 195     toolbar_size.Enlarge(0, -kToolbarTabStripVerticalOverlap); | 
| 196   gfx::Size bookmark_bar_size; | 196   gfx::Size bookmark_bar_size; | 
| 197   if (bookmark_bar_ && | 197   if (bookmark_bar_ && | 
| 198       bookmark_bar_->visible() && | 198       bookmark_bar_->visible() && | 
| 199       browser()->SupportsWindowFeature(Browser::FEATURE_BOOKMARKBAR)) { | 199       browser()->SupportsWindowFeature(Browser::FEATURE_BOOKMARKBAR)) { | 
| 200     bookmark_bar_size = bookmark_bar_->GetMinimumSize(); | 200     bookmark_bar_size = bookmark_bar_->GetMinimumSize(); | 
| 201     bookmark_bar_size.Enlarge(0, -bookmark_bar_->GetToolbarOverlap()); | 201     bookmark_bar_size.Enlarge(0, -bookmark_bar_->GetToolbarOverlap()); | 
| 202   } | 202   } | 
| 203   // TODO: Adjust the minimum height for the find bar. | 203   // TODO: Adjust the minimum height for the find bar. | 
| 204 | 204 | 
| 205   gfx::Size contents_size(contents_split_->GetMinimumSize()); | 205   gfx::Size contents_size(contents_container_->GetMinimumSize()); | 
| 206 | 206 | 
| 207   int min_height = delegate_->GetTopInsetInBrowserView() + | 207   int min_height = delegate_->GetTopInsetInBrowserView() + | 
| 208       tabstrip_size.height() + toolbar_size.height() + | 208       tabstrip_size.height() + toolbar_size.height() + | 
| 209       bookmark_bar_size.height() + contents_size.height(); | 209       bookmark_bar_size.height() + contents_size.height(); | 
| 210   int widths[] = { | 210   int widths[] = { | 
| 211         tabstrip_size.width(), | 211         tabstrip_size.width(), | 
| 212         toolbar_size.width(), | 212         toolbar_size.width(), | 
| 213         bookmark_bar_size.width(), | 213         bookmark_bar_size.width(), | 
| 214         contents_size.width() }; | 214         contents_size.width() }; | 
| 215   int min_width = *std::max_element(&widths[0], &widths[arraysize(widths)]); | 215   int min_width = *std::max_element(&widths[0], &widths[arraysize(widths)]); | 
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 357 | 357 | 
| 358   top = LayoutBookmarkAndInfoBars(top, browser_view->y()); | 358   top = LayoutBookmarkAndInfoBars(top, browser_view->y()); | 
| 359 | 359 | 
| 360   // Top container requires updated toolbar and bookmark bar to compute bounds. | 360   // Top container requires updated toolbar and bookmark bar to compute bounds. | 
| 361   UpdateTopContainerBounds(); | 361   UpdateTopContainerBounds(); | 
| 362 | 362 | 
| 363   int bottom = LayoutDownloadShelf(browser_view->height()); | 363   int bottom = LayoutDownloadShelf(browser_view->height()); | 
| 364   // Treat a detached bookmark bar as if the web contents container is shifted | 364   // Treat a detached bookmark bar as if the web contents container is shifted | 
| 365   // upwards and overlaps it. | 365   // upwards and overlaps it. | 
| 366   int active_top_margin = GetContentsOffsetForBookmarkBar(); | 366   int active_top_margin = GetContentsOffsetForBookmarkBar(); | 
| 367   contents_container_->SetActiveTopMargin(active_top_margin); | 367   contents_layout_manager_->SetActiveTopMargin(active_top_margin); | 
| 368   top -= active_top_margin; | 368   top -= active_top_margin; | 
| 369   LayoutContentsSplitView(top, bottom); | 369   LayoutContentsContainerView(top, bottom); | 
| 370 | 370 | 
| 371   // This must be done _after_ we lay out the WebContents since this | 371   // This must be done _after_ we lay out the WebContents since this | 
| 372   // code calls back into us to find the bounding box the find bar | 372   // code calls back into us to find the bounding box the find bar | 
| 373   // must be laid out within, and that code depends on the | 373   // must be laid out within, and that code depends on the | 
| 374   // TabContentsContainer's bounds being up to date. | 374   // TabContentsContainer's bounds being up to date. | 
| 375   if (browser()->HasFindBarController()) { | 375   if (browser()->HasFindBarController()) { | 
| 376     browser()->GetFindBarController()->find_bar()->MoveWindowIfNecessary( | 376     browser()->GetFindBarController()->find_bar()->MoveWindowIfNecessary( | 
| 377         gfx::Rect(), true); | 377         gfx::Rect(), true); | 
| 378   } | 378   } | 
| 379 | 379 | 
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 513   infobar_container_->SetVisible(InfobarVisible()); | 513   infobar_container_->SetVisible(InfobarVisible()); | 
| 514   int height; | 514   int height; | 
| 515   int overlapped_top = top - infobar_container_->GetVerticalOverlap(&height); | 515   int overlapped_top = top - infobar_container_->GetVerticalOverlap(&height); | 
| 516   infobar_container_->SetBounds(vertical_layout_rect_.x(), | 516   infobar_container_->SetBounds(vertical_layout_rect_.x(), | 
| 517                                 overlapped_top, | 517                                 overlapped_top, | 
| 518                                 vertical_layout_rect_.width(), | 518                                 vertical_layout_rect_.width(), | 
| 519                                 height); | 519                                 height); | 
| 520   return overlapped_top + height; | 520   return overlapped_top + height; | 
| 521 } | 521 } | 
| 522 | 522 | 
| 523 void BrowserViewLayout::LayoutContentsSplitView(int top, int bottom) { | 523 void BrowserViewLayout::LayoutContentsContainerView(int top, int bottom) { | 
| 524   // |contents_split_| contains web page contents and devtools. | 524   // |contents_container_| contains web page contents and devtools. | 
| 525   // See browser_view.h for details. | 525   // See browser_view.h for details. | 
| 526   gfx::Rect contents_split_bounds(vertical_layout_rect_.x(), | 526   gfx::Rect contents_container_bounds(vertical_layout_rect_.x(), | 
| 527                                   top, | 527                                       top, | 
| 528                                   vertical_layout_rect_.width(), | 528                                       vertical_layout_rect_.width(), | 
| 529                                   std::max(0, bottom - top)); | 529                                       std::max(0, bottom - top)); | 
| 530   contents_split_->SetBoundsRect(contents_split_bounds); | 530   contents_container_->SetBoundsRect(contents_container_bounds); | 
| 531 } | 531 } | 
| 532 | 532 | 
| 533 void BrowserViewLayout::UpdateTopContainerBounds() { | 533 void BrowserViewLayout::UpdateTopContainerBounds() { | 
| 534   gfx::Rect top_container_bounds(top_container_->GetPreferredSize()); | 534   gfx::Rect top_container_bounds(top_container_->GetPreferredSize()); | 
| 535 | 535 | 
| 536   // If the immersive mode controller is animating the top container, it may be | 536   // If the immersive mode controller is animating the top container, it may be | 
| 537   // partly offscreen. The top container is positioned relative to the top of | 537   // partly offscreen. The top container is positioned relative to the top of | 
| 538   // the client view instead of relative to GetTopInsetInBrowserView() because | 538   // the client view instead of relative to GetTopInsetInBrowserView() because | 
| 539   // the top container paints parts of the frame (title, window controls) during | 539   // the top container paints parts of the frame (title, window controls) during | 
| 540   // an immersive reveal. | 540   // an immersive reveal. | 
| 541   top_container_bounds.set_y( | 541   top_container_bounds.set_y( | 
| 542       immersive_mode_controller_->GetTopContainerVerticalOffset( | 542       immersive_mode_controller_->GetTopContainerVerticalOffset( | 
| 543           top_container_bounds.size())); | 543           top_container_bounds.size())); | 
| 544   top_container_->SetBoundsRect(top_container_bounds); | 544   top_container_->SetBoundsRect(top_container_bounds); | 
| 545 } | 545 } | 
| 546 | 546 | 
| 547 int BrowserViewLayout::GetContentsOffsetForBookmarkBar() { | 547 int BrowserViewLayout::GetContentsOffsetForBookmarkBar() { | 
| 548   // If the bookmark bar is hidden or attached to the omnibox the web contents | 548   // If the bookmark bar is hidden or attached to the omnibox the web contents | 
| 549   // will appear directly underneath it and does not need an offset. | 549   // will appear directly underneath it and does not need an offset. | 
| 550   if (!bookmark_bar_ || | 550   if (!bookmark_bar_ || | 
| 551       !delegate_->IsBookmarkBarVisible() || | 551       !delegate_->IsBookmarkBarVisible() || | 
| 552       !bookmark_bar_->IsDetached()) { | 552       !bookmark_bar_->IsDetached()) { | 
| 553     return 0; | 553     return 0; | 
| 554   } | 554   } | 
| 555 | 555 | 
| 556   // Dev tools. |  | 
| 557   if (contents_split_->child_at(1) && contents_split_->child_at(1)->visible()) |  | 
| 558     return 0; |  | 
| 559 |  | 
| 560   // Offset for the detached bookmark bar. | 556   // Offset for the detached bookmark bar. | 
| 561   return bookmark_bar_->height() - | 557   return bookmark_bar_->height() - | 
| 562       bookmark_bar_->GetFullyDetachedToolbarOverlap(); | 558       bookmark_bar_->GetFullyDetachedToolbarOverlap(); | 
| 563 } | 559 } | 
| 564 | 560 | 
| 565 int BrowserViewLayout::LayoutDownloadShelf(int bottom) { | 561 int BrowserViewLayout::LayoutDownloadShelf(int bottom) { | 
| 566   if (delegate_->DownloadShelfNeedsLayout()) { | 562   if (delegate_->DownloadShelfNeedsLayout()) { | 
| 567     bool visible = browser()->SupportsWindowFeature( | 563     bool visible = browser()->SupportsWindowFeature( | 
| 568         Browser::FEATURE_DOWNLOADSHELF); | 564         Browser::FEATURE_DOWNLOADSHELF); | 
| 569     DCHECK(download_shelf_); | 565     DCHECK(download_shelf_); | 
| 570     int height = visible ? download_shelf_->GetPreferredSize().height() : 0; | 566     int height = visible ? download_shelf_->GetPreferredSize().height() : 0; | 
| 571     download_shelf_->SetVisible(visible); | 567     download_shelf_->SetVisible(visible); | 
| 572     download_shelf_->SetBounds(vertical_layout_rect_.x(), bottom - height, | 568     download_shelf_->SetBounds(vertical_layout_rect_.x(), bottom - height, | 
| 573                                vertical_layout_rect_.width(), height); | 569                                vertical_layout_rect_.width(), height); | 
| 574     download_shelf_->Layout(); | 570     download_shelf_->Layout(); | 
| 575     bottom -= height; | 571     bottom -= height; | 
| 576   } | 572   } | 
| 577   return bottom; | 573   return bottom; | 
| 578 } | 574 } | 
| 579 | 575 | 
| 580 bool BrowserViewLayout::InfobarVisible() const { | 576 bool BrowserViewLayout::InfobarVisible() const { | 
| 581   // Cast to a views::View to access GetPreferredSize(). | 577   // Cast to a views::View to access GetPreferredSize(). | 
| 582   views::View* infobar_container = infobar_container_; | 578   views::View* infobar_container = infobar_container_; | 
| 583   // NOTE: Can't check if the size IsEmpty() since it's always 0-width. | 579   // NOTE: Can't check if the size IsEmpty() since it's always 0-width. | 
| 584   return browser_->SupportsWindowFeature(Browser::FEATURE_INFOBAR) && | 580   return browser_->SupportsWindowFeature(Browser::FEATURE_INFOBAR) && | 
| 585       (infobar_container->GetPreferredSize().height() != 0); | 581       (infobar_container->GetPreferredSize().height() != 0); | 
| 586 } | 582 } | 
| OLD | NEW | 
|---|