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 00311c5eb48adc645296308410b000f51fd54005..c21ca776b3e4d9c7ae2711260b6c37771faf4a35 100644 |
--- a/chrome/browser/ui/views/frame/browser_view_layout.cc |
+++ b/chrome/browser/ui/views/frame/browser_view_layout.cc |
@@ -7,6 +7,7 @@ |
#include "chrome/browser/ui/browser_finder.h" |
#include "chrome/browser/ui/find_bar/find_bar.h" |
#include "chrome/browser/ui/find_bar/find_bar_controller.h" |
+#include "chrome/browser/ui/search/search_model.h" |
#include "chrome/browser/ui/view_ids.h" |
#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" |
#include "chrome/browser/ui/views/download/download_shelf_view.h" |
@@ -22,6 +23,7 @@ |
#include "ui/gfx/scrollbar_size.h" |
#include "ui/gfx/size.h" |
#include "ui/views/controls/single_split_view.h" |
+#include "ui/views/controls/webview/webview.h" |
namespace { |
@@ -257,6 +259,24 @@ void BrowserViewLayout::ViewRemoved(views::View* host, views::View* view) { |
} |
void BrowserViewLayout::Layout(views::View* host) { |
+ // Showing instant extended suggestions causes us to temporarily hide any |
+ // visible bookmark bar and infobars. In turn, this hiding would normally |
+ // cause the content below the suggestions to shift upwards, which looks |
+ // surprising (since from the user's perspective, we're "covering" rather than |
+ // "removing" the bookmark bar/infobars). To prevent this, we save off the |
+ // content origin here, then once we finish laying things out, force the |
+ // contents to continue to display from that origin. |
+ const chrome::search::Mode& mode = browser()->search_model()->mode(); |
+ views::WebView* contents = browser_view_->contents_container_; |
+ int preview_height = contents_container_->preview_height(); |
+ gfx::Point old_contents_origin; |
+ if (preview_height > 0 && mode.is_search_suggestions() && |
+ mode.is_origin_default()) { |
+ old_contents_origin = contents->bounds().origin(); |
+ views::View::ConvertPointToTarget(contents->parent(), browser_view_, |
+ &old_contents_origin); |
+ } |
+ |
vertical_layout_rect_ = browser_view_->GetLocalBounds(); |
int top = LayoutTabStripRegion(); |
if (browser_view_->IsTabStripVisible()) { |
@@ -280,6 +300,23 @@ void BrowserViewLayout::Layout(views::View* host) { |
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 < preview_height) |
+ contents_container_->SetActiveTopMargin(active_top_margin); |
+ } |
+ |
// 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 |
// must be laid out within, and that code depends on the |
@@ -320,7 +357,7 @@ int BrowserViewLayout::LayoutTabStripRegion() { |
browser_view_->frame()->GetBoundsForTabStrip(tabstrip)); |
gfx::Point tabstrip_origin(tabstrip_bounds.origin()); |
views::View::ConvertPointToTarget(browser_view_->parent(), browser_view_, |
- &tabstrip_origin); |
+ &tabstrip_origin); |
tabstrip_bounds.set_origin(tabstrip_origin); |
tabstrip->SetVisible(true); |