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

Unified Diff: chrome/browser/ui/views/frame/browser_view_layout.cc

Issue 13684002: cros: Instant extended support for immersive fullscreen (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/frame/browser_view_layout.cc
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc
index 97538653e1a2fbc6eb66198d8842d73ce37888b6..a6b7f49797fa495385dc02737667f2d4c873c00c 100644
--- a/chrome/browser/ui/views/frame/browser_view_layout.cc
+++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -29,13 +29,13 @@
#include "ui/views/controls/single_split_view.h"
#include "ui/views/controls/webview/webview.h"
+using views::View;
+
namespace {
// The visible height of the shadow above the tabs. Clicks in this area are
// treated as clicks to the frame, rather than clicks to the tab.
const int kTabShadowSize = 2;
-// The vertical overlap between the TabStrip and the Toolbar.
-const int kToolbarTabStripVerticalOverlap = 3;
// The number of pixels the bookmark bar should overlap the spacer by if the
// spacer is visible.
const int kSpacerBookmarkBarOverlap = 1;
@@ -100,6 +100,8 @@ class BrowserViewLayout::WebContentsModalDialogHostViews
DISALLOW_COPY_AND_ASSIGN(WebContentsModalDialogHostViews);
};
+// static
+const int BrowserViewLayout::kToolbarTabStripVerticalOverlap = 3;
////////////////////////////////////////////////////////////////////////////////
// BrowserViewLayout, public:
@@ -331,10 +333,21 @@ void BrowserViewLayout::Layout(views::View* host) {
browser_view_->top_container_->GetPreferredSize());
int bottom = LayoutDownloadShelf(browser_view_->height());
+ // Treat a detached bookmark bar as if the web contents container is shifted
+ // upwards and overlaps it.
+ top -= GetContentsOffsetForBookmarkBar();
+ LayoutContentsSplitView(top, bottom);
+
+ // Instant extended can put suggestions in a web view, which can require an
+ // offset to align with the omnibox. This offset must be recomputed after
+ // split view layout to account for infobar heights.
int active_top_margin = GetTopMarginForActiveContent();
- top -= active_top_margin;
- contents_container_->SetActiveTopMargin(active_top_margin);
- LayoutTabContents(top, bottom);
+ bool needs_layout =
+ contents_container_->SetActiveTopMargin(active_top_margin);
+ needs_layout |=
+ contents_container_->SetOverlayTopMargin(GetTopMarginForOverlayContent());
+ if (needs_layout)
+ contents_container_->Layout();
// Now set the contents to display at their previous origin if we just hid the
// bookmark and/or infobars.
@@ -475,6 +488,8 @@ int BrowserViewLayout::LayoutBookmarkBar(int top) {
int y = top;
if (!browser_view_->IsBookmarkBarVisible()) {
bookmark_bar->SetVisible(false);
+ // TODO(jamescook): Don't change the bookmark bar height when it is
+ // invisible, so we can use its height for layout even in that state.
bookmark_bar->SetBounds(0, y, browser_view_->width(), 0);
return y;
}
@@ -510,46 +525,19 @@ int BrowserViewLayout::LayoutInfoBar(int top) {
return overlapped_top + height;
}
-void BrowserViewLayout::LayoutTabContents(int top, int bottom) {
- // The ultimate idea is to calculate 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):
- // contents_split_ -> [contents_container_ | devtools]
-
- gfx::Rect contents_bounds;
- gfx::Rect devtools_bounds;
-
- gfx::Rect contents_split_bounds(vertical_layout_rect_.x(), top,
+void BrowserViewLayout::LayoutContentsSplitView(int top, int bottom) {
+ // |contents_split_| contains web page contents and devtools.
+ // See browser_view.h for details.
+ gfx::Rect contents_split_bounds(vertical_layout_rect_.x(),
+ top,
vertical_layout_rect_.width(),
std::max(0, bottom - top));
- gfx::Point contents_split_offset(
- contents_split_bounds.x() - contents_split_->bounds().x(),
- contents_split_bounds.y() - contents_split_->bounds().y());
-
- // Layout resize corner 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.
- gfx::Rect browser_reserved_rect;
- if (!browser_view_->frame_->IsMaximized() &&
- !browser_view_->frame_->IsFullscreen()) {
- gfx::Size resize_corner_size = browser_view_->GetResizeCornerSize();
- if (!resize_corner_size.IsEmpty()) {
- gfx::Rect bounds = browser_view_->GetContentsBounds();
- 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);
- }
- }
-
- // Now it's safe to actually resize all contents views in the hierarchy.
contents_split_->SetBoundsRect(contents_split_bounds);
}
-int BrowserViewLayout::GetTopMarginForActiveContent() {
+int BrowserViewLayout::GetContentsOffsetForBookmarkBar() {
+ // If the bookmark bar is hidden or attached to the omnibox the web contents
+ // will appear directly underneath it and does not need an offset.
BookmarkBarView* bookmark_bar = browser_view_->bookmark_bar_view_.get();
if (!bookmark_bar ||
!browser_view_->IsBookmarkBarVisible() ||
@@ -557,14 +545,70 @@ int BrowserViewLayout::GetTopMarginForActiveContent() {
return 0;
}
+ // Dev tools.
if (contents_split_->child_at(1) && contents_split_->child_at(1)->visible())
return 0;
- // Adjust for separator.
+ // Offset for the detached bookmark bar.
return bookmark_bar->height() -
views::NonClientFrameView::kClientEdgeThickness;
}
+int BrowserViewLayout::GetTopMarginForActiveContent() {
+ // During an immersive reveal, if instant extended is showing suggestions
+ // in the main active web view, ensure that active web view appears aligned
+ // with the bottom of the omnibox.
+ InstantUIState instant_ui_state = GetInstantUIState();
+ if (instant_ui_state == kInstantUIFullPageResults &&
+ browser_view_->immersive_mode_controller()->IsRevealed())
+ return GetTopMarginForImmersiveInstant();
+
+ // Usually we only use a margin if there's a detached bookmarks bar.
+ return GetContentsOffsetForBookmarkBar();
+}
+
+int BrowserViewLayout::GetTopMarginForOverlayContent() {
+ // During an immersive reveal, if instant extended is showing suggestions
+ // in an overlay web view, ensure that overlay web view appears aligned
+ // with the bottom of the omnibox.
+ InstantUIState instant_ui_state = GetInstantUIState();
+ if (instant_ui_state == kInstantUIOverlay &&
+ browser_view_->immersive_mode_controller()->IsRevealed())
+ return GetTopMarginForImmersiveInstant();
+
+ // Usually the overlay content is aligned with the active web content.
+ return 0;
+}
+
+int BrowserViewLayout::GetTopMarginForImmersiveInstant() {
+ // Compute the position of the bottom edge of the top container views,
+ // expressed as an offset in the coordinates of |contents_container_|,
+ // because the offset will be applied in |contents_container_| layout.
+ // NOTE: This requires contents_split_ layout to be complete, as the
+ // coordinate system conversion depends on the contents_split_ origin.
+ gfx::Point bottom_edge(0, browser_view_->top_container_->height());
+ views::View::ConvertPointToTarget(browser_view_->top_container_,
+ contents_container_,
+ &bottom_edge);
+ return bottom_edge.y();
+}
+
+BrowserViewLayout::InstantUIState BrowserViewLayout::GetInstantUIState() {
+ if (!browser()->search_model()->mode().is_search())
+ return kInstantUINone;
+
+ // If the search suggestions are already being displayed in the overlay
+ // contents then return kInstantUIOverlay.
+ if (contents_container_->overlay_height() > 0)
+ return kInstantUIOverlay;
+
+ // Top bars stay visible until the results page notifies Chrome it is ready.
+ if (browser()->search_model()->top_bars_visible())
+ return kInstantUINone;
+
+ return kInstantUIFullPageResults;
+}
+
int BrowserViewLayout::LayoutDownloadShelf(int bottom) {
// Re-layout the shelf either if it is visible or if its close animation
// is currently running.
« no previous file with comments | « chrome/browser/ui/views/frame/browser_view_layout.h ('k') | chrome/browser/ui/views/frame/contents_container.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698