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

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: method ordering 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 68198926309d6592fd596c4cf7e24c1eca403a8b..4205a317f16b94346aa682f87c2952d6c6a137d3 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,26 +333,7 @@ void BrowserViewLayout::Layout(views::View* host) {
browser_view_->top_container_->GetPreferredSize());
int bottom = LayoutDownloadShelf(browser_view_->height());
- int active_top_margin = GetTopMarginForActiveContent();
- top -= active_top_margin;
- contents_container_->SetActiveTopMargin(active_top_margin);
- LayoutTabContents(top, bottom);
-
- // Now set the contents to display at their previous origin if we just hid the
- // bookmark and/or infobars.
- if (active_top_margin == 0 && !old_contents_origin.IsOrigin()) {
- gfx::Point new_contents_origin(contents->bounds().origin());
- views::View::ConvertPointToTarget(contents->parent(), browser_view_,
- &new_contents_origin);
- active_top_margin = old_contents_origin.y() - new_contents_origin.y();
- // Special case: While normally the suggestions appear to "cover" any
- // bookmark/infobars, if the suggestions are very short, they might not
- // fully cover that gap, and leaving the contents at their original height
- // would leave an odd-looking blank space. In this case, we allow the
- // contents to go ahead and shift upward.
- if (active_top_margin > 0 && active_top_margin < overlay_height)
- contents_container_->SetActiveTopMargin(active_top_margin);
- }
+ LayoutTabContents(top, bottom, old_contents_origin);
// This must be done _after_ we lay out the WebContents since this
// code calls back into us to find the bounding box the find bar
@@ -475,6 +458,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,43 +495,70 @@ 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;
+void BrowserViewLayout::LayoutTabContents(
+ int top,
+ int bottom,
+ const gfx::Point& contents_origin) {
+ // Vertical offsets for the active page and instant overlay.
+ int active_top_margin = GetTopMarginForActiveContent();
+ int overlay_top_margin = 0;
- gfx::Rect contents_split_bounds(vertical_layout_rect_.x(), top,
+ // |contents_split_| contains web page contents and devtools.
+ // See browser_view.h for details.
+ top -= active_top_margin;
+ 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);
+ contents_split_->SetBoundsRect(contents_split_bounds);
James Cook 2013/04/05 02:05:05 The diff is confusing - LayoutTabContents() contai
kuan 2013/04/08 15:56:30 if SetBoundsRect changes bounds of contents_contai
kuan 2013/04/08 16:05:33 in the scenario that fails, Layout is called separ
+
+ // During an immersive reveal, if instant extended is showing suggestions
+ // (either in an overlay web view or the active web view) ensure the
+ // the web view appears aligned with the bottom of the omnibox.
+ InstantUIState instant_ui_state = GetInstantUIState();
+ if (instant_ui_state != kInstantUINone &&
+ browser_view_->immersive_mode_controller()->IsRevealed()) {
+ gfx::Point bottom_edge(0, browser_view_->top_container_->height());
+ views::View::ConvertPointToTarget(browser_view_->top_container_,
+ contents_container_,
+ &bottom_edge);
+ switch (instant_ui_state) {
+ case kInstantUINone:
+ break;
+ case kInstantUIOverlay:
+ overlay_top_margin = bottom_edge.y();
+ break;
+ case kInstantUIFullPageResults:
+ active_top_margin = bottom_edge.y();
+ break;
}
}
- // Now it's safe to actually resize all contents views in the hierarchy.
- contents_split_->SetBoundsRect(contents_split_bounds);
+ // Now set the contents to display at their previous origin if we just hid the
+ // bookmark and/or infobars for instant extended. We can't just compute the
+ // proper position at this point because we don't know the height of all the
+ // infobars and their arrows.
+ if (active_top_margin == 0 && !contents_origin.IsOrigin()) {
+ views::WebView* contents_view = browser_view_->contents_container_;
+ gfx::Point new_contents_origin(contents_view->bounds().origin());
+ views::View::ConvertPointToTarget(contents_view->parent(),
+ browser_view_,
+ &new_contents_origin);
+ int contents_offset = contents_origin.y() - new_contents_origin.y();
+ // Special case: While normally the suggestions appear to "cover" any
+ // bookmark/infobars, if the suggestions are very short, they might not
+ // fully cover that gap, and leaving the contents at their original height
+ // would leave an odd-looking blank space. In this case, we allow the
+ // contents to go ahead and shift upward.
+ if (contents_offset > 0 &&
+ contents_offset < contents_container_->overlay_height())
+ active_top_margin = contents_offset;
+ }
+
+ // Apply our adjustments to the active page and instant overlay position
+ // to account for detached bookmark bars, instant extended and immersive mode.
+ contents_container_->SetWebViewsTopMargins(active_top_margin,
+ overlay_top_margin);
}
int BrowserViewLayout::GetTopMarginForActiveContent() {
@@ -557,14 +569,31 @@ int BrowserViewLayout::GetTopMarginForActiveContent() {
return 0;
}
+ // Handle 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;
}
+BrowserViewLayout::InstantUIState BrowserViewLayout::GetInstantUIState() {
James Cook 2013/04/05 02:05:05 This is a near-copy of the Mac function currentIns
+ if (!browser()->search_model()->mode().is_search_suggestions())
+ 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.

Powered by Google App Engine
This is Rietveld 408576698