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