1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
#include "chrome/browser/ui/views/frame/browser_view_layout.h"
#include "chrome/browser/ui/views/frame/test_with_browser_view.h"
#include "chrome/browser/ui/views/frame/top_container_view.h"
#include "chrome/browser/ui/views/infobars/infobar_container_view.h"
#include "chrome/browser/ui/views/tabs/tab_strip.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
#include "chrome/common/url_constants.h"
#include "ui/views/controls/single_split_view.h"
#include "ui/views/controls/webview/webview.h"
namespace {
// Tab strip bounds depend on the window frame sizes.
gfx::Point ExpectedTabStripOrigin(BrowserView* browser_view) {
gfx::Rect tabstrip_bounds(
browser_view->frame()->GetBoundsForTabStrip(browser_view->tabstrip()));
gfx::Point tabstrip_origin(tabstrip_bounds.origin());
views::View::ConvertPointToTarget(browser_view->parent(),
browser_view,
&tabstrip_origin);
return tabstrip_origin;
}
} // namespace
typedef TestWithBrowserView BrowserViewTest;
// Test basic construction and initialization.
TEST_F(BrowserViewTest, BrowserView) {
// The window is owned by the native widget, not the test class.
EXPECT_FALSE(window());
EXPECT_TRUE(browser_view()->browser());
// Test initial state.
EXPECT_TRUE(browser_view()->IsTabStripVisible());
EXPECT_FALSE(browser_view()->IsOffTheRecord());
EXPECT_FALSE(browser_view()->IsGuestSession());
EXPECT_FALSE(browser_view()->ShouldShowAvatar());
EXPECT_TRUE(browser_view()->IsBrowserTypeNormal());
EXPECT_FALSE(browser_view()->IsFullscreen());
EXPECT_FALSE(browser_view()->IsBookmarkBarVisible());
EXPECT_FALSE(browser_view()->IsBookmarkBarAnimating());
}
// Test layout of the top-of-window UI.
TEST_F(BrowserViewTest, BrowserViewLayout) {
BookmarkBarView::DisableAnimationsForTesting(true);
// |browser_view_| owns the Browser, not the test class.
Browser* browser = browser_view()->browser();
TopContainerView* top_container = browser_view()->top_container();
TabStrip* tabstrip = browser_view()->tabstrip();
ToolbarView* toolbar = browser_view()->toolbar();
views::View* contents_container =
browser_view()->GetContentsContainerForTest();
views::WebView* contents_web_view =
browser_view()->GetContentsWebViewForTest();
views::WebView* devtools_web_view =
browser_view()->GetDevToolsWebViewForTest();
// Start with a single tab open to a normal page.
AddTab(browser, GURL("about:blank"));
// Verify the view hierarchy.
EXPECT_EQ(top_container, browser_view()->tabstrip()->parent());
EXPECT_EQ(top_container, browser_view()->toolbar()->parent());
EXPECT_EQ(top_container, browser_view()->GetBookmarkBarView()->parent());
EXPECT_EQ(browser_view(), browser_view()->infobar_container()->parent());
// Find bar host is at the front of the view hierarchy, followed by the top
// container.
EXPECT_EQ(browser_view()->child_count() - 1,
browser_view()->GetIndexOf(browser_view()->find_bar_host_view()));
EXPECT_EQ(browser_view()->child_count() - 2,
browser_view()->GetIndexOf(top_container));
// Verify basic layout.
EXPECT_EQ(0, top_container->x());
EXPECT_EQ(0, top_container->y());
EXPECT_EQ(browser_view()->width(), top_container->width());
// Tabstrip layout varies based on window frame sizes.
gfx::Point expected_tabstrip_origin = ExpectedTabStripOrigin(browser_view());
EXPECT_EQ(expected_tabstrip_origin.x(), tabstrip->x());
EXPECT_EQ(expected_tabstrip_origin.y(), tabstrip->y());
EXPECT_EQ(0, toolbar->x());
EXPECT_EQ(
tabstrip->bounds().bottom() -
BrowserViewLayout::kToolbarTabStripVerticalOverlap,
toolbar->y());
EXPECT_EQ(0, contents_container->x());
EXPECT_EQ(toolbar->bounds().bottom(), contents_container->y());
EXPECT_EQ(top_container->bounds().bottom(), contents_container->y());
EXPECT_EQ(0, devtools_web_view->x());
EXPECT_EQ(0, devtools_web_view->y());
EXPECT_EQ(0, contents_web_view->x());
EXPECT_EQ(0, contents_web_view->y());
// Verify bookmark bar visibility.
BookmarkBarView* bookmark_bar = browser_view()->GetBookmarkBarView();
EXPECT_FALSE(bookmark_bar->visible());
EXPECT_FALSE(bookmark_bar->IsDetached());
chrome::ExecuteCommand(browser, IDC_SHOW_BOOKMARK_BAR);
EXPECT_TRUE(bookmark_bar->visible());
EXPECT_FALSE(bookmark_bar->IsDetached());
chrome::ExecuteCommand(browser, IDC_SHOW_BOOKMARK_BAR);
EXPECT_FALSE(bookmark_bar->visible());
EXPECT_FALSE(bookmark_bar->IsDetached());
// Bookmark bar is reparented to BrowserView on NTP.
NavigateAndCommitActiveTabWithTitle(browser,
GURL(chrome::kChromeUINewTabURL),
base::string16());
EXPECT_TRUE(bookmark_bar->visible());
EXPECT_TRUE(bookmark_bar->IsDetached());
EXPECT_EQ(browser_view(), bookmark_bar->parent());
// Find bar host is still at the front of the view hierarchy, followed by
// the top container.
EXPECT_EQ(browser_view()->child_count() - 1,
browser_view()->GetIndexOf(browser_view()->find_bar_host_view()));
EXPECT_EQ(browser_view()->child_count() - 2,
browser_view()->GetIndexOf(top_container));
// Bookmark bar layout on NTP.
EXPECT_EQ(0, bookmark_bar->x());
EXPECT_EQ(
tabstrip->bounds().bottom() +
toolbar->height() -
BrowserViewLayout::kToolbarTabStripVerticalOverlap -
views::NonClientFrameView::kClientEdgeThickness,
bookmark_bar->y());
EXPECT_EQ(toolbar->bounds().bottom(), contents_container->y());
// Contents view has a "top margin" pushing it below the bookmark bar.
EXPECT_EQ(bookmark_bar->height() -
views::NonClientFrameView::kClientEdgeThickness,
devtools_web_view->y());
EXPECT_EQ(bookmark_bar->height() -
views::NonClientFrameView::kClientEdgeThickness,
contents_web_view->y());
// Bookmark bar is parented back to top container on normal page.
NavigateAndCommitActiveTabWithTitle(browser,
GURL("about:blank"),
base::string16());
EXPECT_FALSE(bookmark_bar->visible());
EXPECT_FALSE(bookmark_bar->IsDetached());
EXPECT_EQ(top_container, bookmark_bar->parent());
// Top container is still second from front.
EXPECT_EQ(browser_view()->child_count() - 2,
browser_view()->GetIndexOf(top_container));
BookmarkBarView::DisableAnimationsForTesting(false);
}
class BrowserViewHostedAppTest : public TestWithBrowserView {
public:
BrowserViewHostedAppTest()
: TestWithBrowserView(Browser::TYPE_POPUP,
chrome::HOST_DESKTOP_TYPE_NATIVE,
true) {
}
~BrowserViewHostedAppTest() override {}
private:
DISALLOW_COPY_AND_ASSIGN(BrowserViewHostedAppTest);
};
// Test basic layout for hosted apps.
TEST_F(BrowserViewHostedAppTest, Layout) {
// Add a tab because the browser starts out without any tabs at all.
AddTab(browser(), GURL("about:blank"));
views::View* contents_container =
browser_view()->GetContentsContainerForTest();
// The tabstrip, toolbar and bookmark bar should not be visible for hosted
// apps.
EXPECT_FALSE(browser_view()->tabstrip()->visible());
EXPECT_FALSE(browser_view()->toolbar()->visible());
EXPECT_FALSE(browser_view()->IsBookmarkBarVisible());
gfx::Point header_offset;
views::View::ConvertPointToTarget(
browser_view(),
browser_view()->frame()->non_client_view()->frame_view(),
&header_offset);
// The position of the bottom of the header (the bar with the window
// controls) in the coordinates of BrowserView.
int bottom_of_header = browser_view()->frame()->GetTopInset() -
header_offset.y();
// The web contents should be flush with the bottom of the header.
EXPECT_EQ(bottom_of_header, contents_container->y());
// The find bar should overlap the 1px header/web-contents separator at the
// bottom of the header.
EXPECT_EQ(browser_view()->frame()->GetTopInset() - 1,
browser_view()->GetFindBarBoundingBox().y());
}
|