158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/devtools/devtools_window_testing.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/url_constants.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/test/base/ui_test_utils.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/bookmarks/common/bookmark_pref_names.h" 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/invalidate_type.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_contents.h" 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class BrowserViewTest : public InProcessBrowserTest { 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BrowserViewTest() : InProcessBrowserTest(), devtools_(NULL) {} 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected: 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BrowserView* browser_view() { 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return BrowserView::GetBrowserViewForBrowser(browser()); 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::WebView* devtools_web_view() { 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return browser_view()->GetDevToolsWebViewForTest(); 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) views::WebView* contents_web_view() { 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return browser_view()->GetContentsWebViewForTest(); 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OpenDevToolsWindow(bool docked) { 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) devtools_ = 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), docked); 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void CloseDevToolsWindow() { 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_); 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SetDevToolsBounds(const gfx::Rect& bounds) { 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DevToolsWindowTesting::Get(devtools_)->SetInspectedPageBounds(bounds); 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DevToolsWindow* devtools_; 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrowserViewTest); 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace { 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Used to simulate scenario in a crash. When WebContentsDestroyed() is invoked 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// updates the navigation state of another tab. 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class TestWebContentsObserver : public content::WebContentsObserver { 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestWebContentsObserver(content::WebContents* source, 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::WebContents* other) 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : content::WebContentsObserver(source), 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) other_(other) {} 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~TestWebContentsObserver() {} 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void WebContentsDestroyed() OVERRIDE { 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) other_->NotifyNavigationStateChanged(static_cast<content::InvalidateTypes>( 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::INVALIDATE_TYPE_URL | content::INVALIDATE_TYPE_LOAD)); 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::WebContents* other_; 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestWebContentsObserver); 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Verifies don't crash when CloseNow() is invoked with two tabs in a browser. 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Additionally when one of the tabs is destroyed NotifyNavigationStateChanged() 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// is invoked on the other. 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabs) { 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Browser* browser2 = 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new Browser(Browser::CreateParams(browser()->profile(), 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser()->host_desktop_type())); 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::AddTabAt(browser2, GURL(), -1, true); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::AddTabAt(browser2, GURL(), -1, true); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestWebContentsObserver observer( 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser2->tab_strip_model()->GetWebContentsAt(0), 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser2->tab_strip_model()->GetWebContentsAt(1)); 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow(); 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Same as CloseWithTabs, but activates the first tab, which is the first tab 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// BrowserView will destroy. 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserViewTest, CloseWithTabsStartWithActive) { 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Browser* browser2 = 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new Browser(Browser::CreateParams(browser()->profile(), 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser()->host_desktop_type())); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::AddTabAt(browser2, GURL(), -1, true); 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::AddTabAt(browser2, GURL(), -1, true); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser2->tab_strip_model()->ActivateTabAt(0, true); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebContentsObserver observer( 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser2->tab_strip_model()->GetWebContentsAt(0), 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser2->tab_strip_model()->GetWebContentsAt(1)); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserView::GetBrowserViewForBrowser(browser2)->GetWidget()->CloseNow(); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Verifies that page and devtools WebViews are being correctly layed out 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// when DevTools is opened/closed/updated/undocked. 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserViewTest, DevToolsUpdatesBrowserWindow) { 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Rect full_bounds = 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser_view()->GetContentsContainerForTest()->GetLocalBounds(); 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Rect small_bounds(10, 20, 30, 40); 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser_view()->UpdateDevTools(); 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(devtools_web_view()->web_contents()); 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, contents_web_view()->bounds()); 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Docked. 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OpenDevToolsWindow(true); 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(devtools_web_view()->web_contents()); 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetDevToolsBounds(small_bounds); 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(devtools_web_view()->web_contents()); 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(small_bounds, contents_web_view()->bounds()); 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser_view()->UpdateDevTools(); 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(devtools_web_view()->web_contents()); 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(small_bounds, contents_web_view()->bounds()); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CloseDevToolsWindow(); 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(devtools_web_view()->web_contents()); 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, contents_web_view()->bounds()); 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser_view()->UpdateDevTools(); 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(devtools_web_view()->web_contents()); 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, contents_web_view()->bounds()); 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Undocked. 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OpenDevToolsWindow(false); 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(devtools_web_view()->web_contents()); 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetDevToolsBounds(small_bounds); 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(devtools_web_view()->web_contents()); 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(small_bounds, contents_web_view()->bounds()); 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser_view()->UpdateDevTools(); 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(devtools_web_view()->web_contents()); 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(small_bounds, contents_web_view()->bounds()); 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CloseDevToolsWindow(); 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(devtools_web_view()->web_contents()); 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, contents_web_view()->bounds()); 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) browser_view()->UpdateDevTools(); 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(devtools_web_view()->web_contents()); 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, devtools_web_view()->bounds()); 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(full_bounds, contents_web_view()->bounds()); 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BookmarkBarViewObserverImpl : public BookmarkBarViewObserver { 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BookmarkBarViewObserverImpl() : change_count_(0) { 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int change_count() const { return change_count_; } 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void clear_change_count() { change_count_ = 0; } 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // BookmarkBarViewObserver: 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnBookmarkBarVisibilityChanged() OVERRIDE { 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci change_count_++; 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int change_count_; 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(BookmarkBarViewObserverImpl); 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies we don't unnecessarily change the visibility of the BookmarkBarView. 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(BrowserViewTest, AvoidUnnecessaryVisibilityChanges) { 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create two tabs, the first empty and the second the ntp. Make it so the 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // BookmarkBarView isn't shown (meaning it'll only be shown when on the ntp). 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->profile()->GetPrefs()->SetBoolean( 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bookmarks::prefs::kShowBookmarkBar, false); 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL new_tab_url(chrome::kChromeUINewTabURL); 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chrome::AddTabAt(browser(), GURL(), -1, true); 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui_test_utils::NavigateToURL(browser(), new_tab_url); 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(browser_view()->bookmark_bar()); 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BookmarkBarViewObserverImpl observer; 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BookmarkBarView* bookmark_bar = browser_view()->bookmark_bar(); 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bookmark_bar->AddObserver(&observer); 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(bookmark_bar->visible()); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Go to empty tab. Bookmark bar should hide. 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->tab_strip_model()->ActivateTabAt(0, true); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(bookmark_bar->visible()); 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, observer.change_count()); 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci observer.clear_change_count(); 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Go to ntp tab. Bookmark bar should show. 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->tab_strip_model()->ActivateTabAt(1, true); 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(bookmark_bar->visible()); 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, observer.change_count()); 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci observer.clear_change_count(); 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Repeat with the bookmark bar always visible. 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->profile()->GetPrefs()->SetBoolean( 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bookmarks::prefs::kShowBookmarkBar, true); 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->tab_strip_model()->ActivateTabAt(1, true); 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(bookmark_bar->visible()); 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci observer.clear_change_count(); 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->tab_strip_model()->ActivateTabAt(0, true); 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(bookmark_bar->visible()); 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, observer.change_count()); 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci observer.clear_change_count(); 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->tab_strip_model()->ActivateTabAt(1, true); 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(bookmark_bar->visible()); 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, observer.change_count()); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci observer.clear_change_count(); 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_view()->bookmark_bar()->RemoveObserver(&observer); 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 242