Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: chrome/browser/ui/views/frame/browser_view.cc

Issue 14589016: Unit test for BrowserViewLayout that does not depend on BrowserView (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: layout works thru toolbar Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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.h" 5 #include "chrome/browser/ui/views/frame/browser_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 // occur for "browser-fullscreen" and not for "tab-fullscreen" (which has a URL 247 // occur for "browser-fullscreen" and not for "tab-fullscreen" (which has a URL
248 // for the tab entering fullscreen). 248 // for the tab entering fullscreen).
249 bool UseImmersiveFullscreenForUrl(const GURL& url) { 249 bool UseImmersiveFullscreenForUrl(const GURL& url) {
250 bool is_browser_fullscreen = url.is_empty(); 250 bool is_browser_fullscreen = url.is_empty();
251 return is_browser_fullscreen && chrome::UseImmersiveFullscreen(); 251 return is_browser_fullscreen && chrome::UseImmersiveFullscreen();
252 } 252 }
253 253
254 } // namespace 254 } // namespace
255 255
256 /////////////////////////////////////////////////////////////////////////////// 256 ///////////////////////////////////////////////////////////////////////////////
257
258 // Delegate implementation for BrowserViewLayout. Usually just forwards calls
259 // into BrowserView.
260 class BrowserViewLayoutDelegateImpl : public BrowserViewLayoutDelegate {
261 public:
262 explicit BrowserViewLayoutDelegateImpl(BrowserView* browser_view)
263 : browser_view_(browser_view) {}
264 virtual ~BrowserViewLayoutDelegateImpl() {}
265
266 // BrowserViewLayoutDelegate overrides:
267 virtual bool DownloadShelfNeedsLayout() const OVERRIDE {
268 DownloadShelfView* download_shelf = browser_view_->download_shelf_.get();
269 // Re-layout the shelf either if it is visible or if its close animation
270 // is currently running.
271 return download_shelf &&
272 (download_shelf->IsShowing() || download_shelf->IsClosing());
273 }
274
275 virtual bool IsTabStripVisible() const OVERRIDE {
276 return browser_view_->IsTabStripVisible();
277 }
278
279 virtual gfx::Rect GetBoundsForTabStrip(
280 views::View* tab_strip) const OVERRIDE {
281 return browser_view_->frame()->GetBoundsForTabStrip(tab_strip);
282 }
283
284 virtual bool IsToolbarVisible() const OVERRIDE {
285 return browser_view_->IsToolbarVisible();
286 }
287
288 virtual bool IsBookmarkBarVisible() const OVERRIDE {
289 return browser_view_->IsBookmarkBarVisible();
290 }
291
292 private:
293 BrowserView* browser_view_;
294
295 DISALLOW_COPY_AND_ASSIGN(BrowserViewLayoutDelegateImpl);
296 };
297
298 ///////////////////////////////////////////////////////////////////////////////
257 // BookmarkExtensionBackground, private: 299 // BookmarkExtensionBackground, private:
258 // This object serves as the views::Background object which is used to layout 300 // This object serves as the views::Background object which is used to layout
259 // and paint the bookmark bar. 301 // and paint the bookmark bar.
260 class BookmarkExtensionBackground : public views::Background { 302 class BookmarkExtensionBackground : public views::Background {
261 public: 303 public:
262 BookmarkExtensionBackground(BrowserView* browser_view, 304 BookmarkExtensionBackground(BrowserView* browser_view,
263 DetachableToolbarView* host_view, 305 DetachableToolbarView* host_view,
264 Browser* browser); 306 Browser* browser);
265 307
266 // View methods overridden from views:Background. 308 // View methods overridden from views:Background.
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 } 423 }
382 424
383 /////////////////////////////////////////////////////////////////////////////// 425 ///////////////////////////////////////////////////////////////////////////////
384 // BrowserView, public: 426 // BrowserView, public:
385 427
386 BrowserView::BrowserView() 428 BrowserView::BrowserView()
387 : views::ClientView(NULL, NULL), 429 : views::ClientView(NULL, NULL),
388 last_focused_view_storage_id_( 430 last_focused_view_storage_id_(
389 views::ViewStorage::GetInstance()->CreateStorageID()), 431 views::ViewStorage::GetInstance()->CreateStorageID()),
390 frame_(NULL), 432 frame_(NULL),
433 layout_delegate_(new BrowserViewLayoutDelegateImpl(this)),
391 top_container_(NULL), 434 top_container_(NULL),
392 tabstrip_(NULL), 435 tabstrip_(NULL),
393 toolbar_(NULL), 436 toolbar_(NULL),
394 window_switcher_button_(NULL), 437 window_switcher_button_(NULL),
395 infobar_container_(NULL), 438 infobar_container_(NULL),
396 contents_web_view_(NULL), 439 contents_web_view_(NULL),
397 devtools_container_(NULL), 440 devtools_container_(NULL),
398 contents_container_(NULL), 441 contents_container_(NULL),
399 overlay_container_(NULL), 442 overlay_container_(NULL),
400 contents_split_(NULL), 443 contents_split_(NULL),
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 // destroyed. 478 // destroyed.
436 if (jumplist_) { 479 if (jumplist_) {
437 jumplist_->Terminate(); 480 jumplist_->Terminate();
438 } 481 }
439 #endif 482 #endif
440 483
441 // We destroy the download shelf before |browser_| to remove its child 484 // We destroy the download shelf before |browser_| to remove its child
442 // download views from the set of download observers (since the observed 485 // download views from the set of download observers (since the observed
443 // downloads can be destroyed along with |browser_| and the observer 486 // downloads can be destroyed along with |browser_| and the observer
444 // notifications will call back into deleted objects). 487 // notifications will call back into deleted objects).
445 download_shelf_.reset();
446 BrowserViewLayout* browser_view_layout = GetBrowserViewLayout(); 488 BrowserViewLayout* browser_view_layout = GetBrowserViewLayout();
447 if (browser_view_layout) 489 if (browser_view_layout)
448 browser_view_layout->set_download_shelf(NULL); 490 browser_view_layout->set_download_shelf(NULL);
491 download_shelf_.reset();
449 492
450 // The TabStrip attaches a listener to the model. Make sure we shut down the 493 // The TabStrip attaches a listener to the model. Make sure we shut down the
451 // TabStrip first so that it can cleanly remove the listener. 494 // TabStrip first so that it can cleanly remove the listener.
452 if (tabstrip_) { 495 if (tabstrip_) {
453 tabstrip_->parent()->RemoveChildView(tabstrip_); 496 tabstrip_->parent()->RemoveChildView(tabstrip_);
497 if (browser_view_layout)
498 browser_view_layout->set_tab_strip(NULL);
454 delete tabstrip_; 499 delete tabstrip_;
455 tabstrip_ = NULL; 500 tabstrip_ = NULL;
456 } 501 }
457 // Child views maintain PrefMember attributes that point to 502 // Child views maintain PrefMember attributes that point to
458 // OffTheRecordProfile's PrefService which gets deleted by ~Browser. 503 // OffTheRecordProfile's PrefService which gets deleted by ~Browser.
459 RemoveAllChildViews(true); 504 RemoveAllChildViews(true);
460 505
461 // It is possible that we were forced-closed by the native view system and 506 // It is possible that we were forced-closed by the native view system and
462 // that tabs remain in the browser. Close any such remaining tabs. 507 // that tabs remain in the browser. Close any such remaining tabs.
463 while (browser_->tab_strip_model()->count()) 508 while (browser_->tab_strip_model()->count())
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 void BrowserView::RestoreFocus() { 935 void BrowserView::RestoreFocus() {
891 WebContents* selected_web_contents = GetActiveWebContents(); 936 WebContents* selected_web_contents = GetActiveWebContents();
892 if (selected_web_contents) 937 if (selected_web_contents)
893 selected_web_contents->GetView()->RestoreFocus(); 938 selected_web_contents->GetView()->RestoreFocus();
894 } 939 }
895 940
896 void BrowserView::SetWindowSwitcherButton(views::Button* button) { 941 void BrowserView::SetWindowSwitcherButton(views::Button* button) {
897 if (window_switcher_button_) 942 if (window_switcher_button_)
898 RemoveChildView(window_switcher_button_); 943 RemoveChildView(window_switcher_button_);
899 window_switcher_button_ = button; 944 window_switcher_button_ = button;
945 GetBrowserViewLayout()->set_window_switcher_button(button);
900 AddChildView(button); 946 AddChildView(button);
901 } 947 }
902 948
903 void BrowserView::ToolbarSizeChanged(bool is_animating) { 949 void BrowserView::ToolbarSizeChanged(bool is_animating) {
904 // The call to InfoBarContainer::SetMaxTopArrowHeight() below can result in 950 // The call to InfoBarContainer::SetMaxTopArrowHeight() below can result in
905 // reentrancy; |call_state| tracks whether we're reentrant. We can't just 951 // reentrancy; |call_state| tracks whether we're reentrant. We can't just
906 // early-return in this case because we need to layout again so the infobar 952 // early-return in this case because we need to layout again so the infobar
907 // container's bounds are set correctly. 953 // container's bounds are set correctly.
908 static CallState call_state = NORMAL; 954 static CallState call_state = NORMAL;
909 955
(...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after
1812 const char* BrowserView::GetClassName() const { 1858 const char* BrowserView::GetClassName() const {
1813 return kViewClassName; 1859 return kViewClassName;
1814 } 1860 }
1815 1861
1816 void BrowserView::Layout() { 1862 void BrowserView::Layout() {
1817 if (ignore_layout_) 1863 if (ignore_layout_)
1818 return; 1864 return;
1819 1865
1820 views::View::Layout(); 1866 views::View::Layout();
1821 1867
1868 // TODO(jamescook): Why was this in the middle of layout code?
1869 toolbar_->location_bar()->SetLocationEntryFocusable(IsToolbarVisible());
1870
1822 // The status bubble position requires that all other layout finish first. 1871 // The status bubble position requires that all other layout finish first.
1823 LayoutStatusBubble(); 1872 LayoutStatusBubble();
1824 } 1873 }
1825 1874
1826 void BrowserView::PaintChildren(gfx::Canvas* canvas) { 1875 void BrowserView::PaintChildren(gfx::Canvas* canvas) {
1827 // Paint the |infobar_container_| last so that it may paint its 1876 // Paint the |infobar_container_| last so that it may paint its
1828 // overlapping tabs. 1877 // overlapping tabs.
1829 for (int i = 0; i < child_count(); ++i) { 1878 for (int i = 0; i < child_count(); ++i) {
1830 View* child = child_at(i); 1879 View* child = child_at(i);
1831 if (child != infobar_container_) 1880 if (child != infobar_container_)
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1871 accelerator_table_.find(accelerator); 1920 accelerator_table_.find(accelerator);
1872 DCHECK(iter != accelerator_table_.end()); 1921 DCHECK(iter != accelerator_table_.end());
1873 int command_id = iter->second; 1922 int command_id = iter->second;
1874 1923
1875 chrome::BrowserCommandController* controller = browser_->command_controller(); 1924 chrome::BrowserCommandController* controller = browser_->command_controller();
1876 if (!controller->block_command_execution()) 1925 if (!controller->block_command_execution())
1877 UpdateAcceleratorMetrics(accelerator, command_id); 1926 UpdateAcceleratorMetrics(accelerator, command_id);
1878 return chrome::ExecuteCommand(browser_.get(), command_id); 1927 return chrome::ExecuteCommand(browser_.get(), command_id);
1879 } 1928 }
1880 1929
1881 ///////////////////////////////////////////////////////////////////////////////
1882 // BrowserView, private
1883
1884 SkColor BrowserView::GetInfoBarSeparatorColor() const { 1930 SkColor BrowserView::GetInfoBarSeparatorColor() const {
1885 // NOTE: Keep this in sync with ToolbarView::OnPaint()! 1931 // NOTE: Keep this in sync with ToolbarView::OnPaint()!
1886 return (IsTabStripVisible() || !frame_->ShouldUseNativeFrame()) ? 1932 return (IsTabStripVisible() || !frame_->ShouldUseNativeFrame()) ?
1887 ThemeProperties::GetDefaultColor( 1933 ThemeProperties::GetDefaultColor(
1888 ThemeProperties::COLOR_TOOLBAR_SEPARATOR) : 1934 ThemeProperties::COLOR_TOOLBAR_SEPARATOR) :
1889 SK_ColorBLACK; 1935 SK_ColorBLACK;
1890 } 1936 }
1891 1937
1892 void BrowserView::InfoBarContainerStateChanged(bool is_animating) { 1938 void BrowserView::InfoBarContainerStateChanged(bool is_animating) {
1893 ToolbarSizeChanged(is_animating); 1939 ToolbarSizeChanged(is_animating);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1991 2037
1992 overlay_container_ = new OverlayContainer(this); 2038 overlay_container_ = new OverlayContainer(this);
1993 overlay_container_->SetVisible(false); 2039 overlay_container_->SetVisible(false);
1994 AddChildView(overlay_container_); 2040 AddChildView(overlay_container_);
1995 2041
1996 overlay_controller_.reset( 2042 overlay_controller_.reset(
1997 new InstantOverlayControllerViews(browser(), overlay_container_)); 2043 new InstantOverlayControllerViews(browser(), overlay_container_));
1998 2044
1999 BrowserViewLayout* browser_view_layout = new BrowserViewLayout; 2045 BrowserViewLayout* browser_view_layout = new BrowserViewLayout;
2000 browser_view_layout->Init(browser(), 2046 browser_view_layout->Init(browser(),
2047 layout_delegate_.get(),
2001 this, 2048 this,
2049 top_container_,
2050 tabstrip_,
2051 toolbar_,
2002 infobar_container_, 2052 infobar_container_,
2003 contents_split_, 2053 contents_split_,
2004 contents_container_, 2054 contents_container_,
2005 overlay_container_); 2055 overlay_container_,
2056 immersive_mode_controller_.get());
2006 SetLayoutManager(browser_view_layout); 2057 SetLayoutManager(browser_view_layout);
2007 2058
2008 #if defined(OS_WIN) && !defined(USE_AURA) 2059 #if defined(OS_WIN) && !defined(USE_AURA)
2009 // Create a custom JumpList and add it to an observer of TabRestoreService 2060 // Create a custom JumpList and add it to an observer of TabRestoreService
2010 // so we can update the custom JumpList when a tab is added or removed. 2061 // so we can update the custom JumpList when a tab is added or removed.
2011 if (JumpList::Enabled()) { 2062 if (JumpList::Enabled()) {
2012 load_complete_listener_.reset(new LoadCompleteListener(this)); 2063 load_complete_listener_.reset(new LoadCompleteListener(this));
2013 } 2064 }
2014 #endif 2065 #endif
2015 2066
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after
2682 // The +1 in the next line creates a 1-px gap between icon and arrow tip. 2733 // The +1 in the next line creates a 1-px gap between icon and arrow tip.
2683 gfx::Point icon_bottom(0, location_icon_view->GetImageBounds().bottom() - 2734 gfx::Point icon_bottom(0, location_icon_view->GetImageBounds().bottom() -
2684 LocationBarView::kIconInternalPadding + 1); 2735 LocationBarView::kIconInternalPadding + 1);
2685 ConvertPointToTarget(location_icon_view, this, &icon_bottom); 2736 ConvertPointToTarget(location_icon_view, this, &icon_bottom);
2686 gfx::Point infobar_top(0, infobar_container_->GetVerticalOverlap(NULL)); 2737 gfx::Point infobar_top(0, infobar_container_->GetVerticalOverlap(NULL));
2687 ConvertPointToTarget(infobar_container_, this, &infobar_top); 2738 ConvertPointToTarget(infobar_container_, this, &infobar_top);
2688 top_arrow_height = infobar_top.y() - icon_bottom.y(); 2739 top_arrow_height = infobar_top.y() - icon_bottom.y();
2689 } 2740 }
2690 return top_arrow_height; 2741 return top_arrow_height;
2691 } 2742 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698