- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / browser_unittest.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/browser.h"
6
7 #include "chrome/browser/ui/browser_commands.h"
8 #include "chrome/browser/ui/tabs/tab_strip_model.h"
9 #include "chrome/test/base/browser_with_test_window_test.h"
10 #include "content/public/browser/site_instance.h"
11 #include "content/public/browser/web_contents.h"
12 #include "content/public/test/web_contents_tester.h"
13
14 // Both tests below require a tab strip, so skip the file entirely on platforms
15 // without one.
16 #if !defined(OS_ANDROID) && !defined(OS_IOS)
17
18 using content::SiteInstance;
19 using content::WebContents;
20 using content::WebContentsTester;
21
22 class BrowserUnitTest : public BrowserWithTestWindowTest {
23  public:
24   BrowserUnitTest() {}
25   virtual ~BrowserUnitTest() {}
26
27   // Caller owns the memory.
28   WebContents* CreateTestWebContents() {
29     return WebContentsTester::CreateTestWebContents(
30         profile(), SiteInstance::Create(profile()));
31   }
32
33  private:
34   DISALLOW_COPY_AND_ASSIGN(BrowserUnitTest);
35 };
36
37 // Ensure crashed tabs are not reloaded when selected. crbug.com/232323
38 TEST_F(BrowserUnitTest, ReloadCrashedTab) {
39   TabStripModel* tab_strip_model = browser()->tab_strip_model();
40
41   // Start with a single foreground tab. |tab_strip_model| owns the memory.
42   WebContents* contents1 = CreateTestWebContents();
43   tab_strip_model->AppendWebContents(contents1, true);
44   WebContentsTester::For(contents1)->NavigateAndCommit(GURL("about:blank"));
45   WebContentsTester::For(contents1)->TestSetIsLoading(false);
46   EXPECT_TRUE(tab_strip_model->IsTabSelected(0));
47   EXPECT_FALSE(contents1->IsLoading());
48
49   // Add a second tab in the background.
50   WebContents* contents2 = CreateTestWebContents();
51   tab_strip_model->AppendWebContents(contents2, false);
52   WebContentsTester::For(contents2)->NavigateAndCommit(GURL("about:blank"));
53   WebContentsTester::For(contents2)->TestSetIsLoading(false);
54   EXPECT_EQ(2, browser()->tab_strip_model()->count());
55   EXPECT_TRUE(tab_strip_model->IsTabSelected(0));
56   EXPECT_FALSE(contents2->IsLoading());
57
58   // Simulate the second tab crashing.
59   contents2->SetIsCrashed(base::TERMINATION_STATUS_PROCESS_CRASHED, -1);
60   EXPECT_TRUE(contents2->IsCrashed());
61
62   // Selecting the second tab does not cause a load or clear the crash.
63   tab_strip_model->ActivateTabAt(1, true);
64   EXPECT_TRUE(tab_strip_model->IsTabSelected(1));
65   EXPECT_FALSE(contents2->IsLoading());
66   EXPECT_TRUE(contents2->IsCrashed());
67 }
68
69 class BrowserBookmarkBarTest : public BrowserWithTestWindowTest {
70  public:
71   BrowserBookmarkBarTest() {}
72   virtual ~BrowserBookmarkBarTest() {}
73
74  protected:
75   BookmarkBar::State window_bookmark_bar_state() const {
76     return static_cast<BookmarkBarStateTestBrowserWindow*>(
77         browser()->window())->bookmark_bar_state();
78   }
79
80   // BrowserWithTestWindowTest:
81   virtual void SetUp() OVERRIDE {
82     BrowserWithTestWindowTest::SetUp();
83     static_cast<BookmarkBarStateTestBrowserWindow*>(
84         browser()->window())->set_browser(browser());
85   }
86
87   virtual BrowserWindow* CreateBrowserWindow() OVERRIDE {
88     return new BookmarkBarStateTestBrowserWindow();
89   }
90
91  private:
92   class BookmarkBarStateTestBrowserWindow : public TestBrowserWindow {
93    public:
94     BookmarkBarStateTestBrowserWindow()
95         : browser_(NULL),
96           bookmark_bar_state_(BookmarkBar::HIDDEN) {}
97     virtual ~BookmarkBarStateTestBrowserWindow() {}
98
99     void set_browser(Browser* browser) { browser_ = browser; }
100
101     BookmarkBar::State bookmark_bar_state() const {
102       return bookmark_bar_state_;
103     }
104
105    private:
106     // TestBrowserWindow:
107     virtual void BookmarkBarStateChanged(
108         BookmarkBar::AnimateChangeType change_type) OVERRIDE {
109       bookmark_bar_state_ = browser_->bookmark_bar_state();
110       TestBrowserWindow::BookmarkBarStateChanged(change_type);
111     }
112
113     virtual void OnActiveTabChanged(content::WebContents* old_contents,
114                                     content::WebContents* new_contents,
115                                     int index,
116                                     int reason) OVERRIDE {
117       bookmark_bar_state_ = browser_->bookmark_bar_state();
118       TestBrowserWindow::OnActiveTabChanged(old_contents, new_contents, index,
119                                             reason);
120     }
121
122     Browser* browser_;  // Weak ptr.
123     BookmarkBar::State bookmark_bar_state_;
124
125     DISALLOW_COPY_AND_ASSIGN(BookmarkBarStateTestBrowserWindow);
126   };
127
128   DISALLOW_COPY_AND_ASSIGN(BrowserBookmarkBarTest);
129 };
130
131 // Ensure bookmark bar states in Browser and BrowserWindow are in sync after
132 // Browser::ActiveTabChanged() calls BrowserWindow::OnActiveTabChanged().
133 TEST_F(BrowserBookmarkBarTest, StateOnActiveTabChanged) {
134   ASSERT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
135   ASSERT_EQ(BookmarkBar::HIDDEN, window_bookmark_bar_state());
136
137   GURL ntp_url("chrome://newtab");
138   GURL non_ntp_url("http://foo");
139
140   // Open a tab to NTP.
141   AddTab(browser(), ntp_url);
142   EXPECT_EQ(BookmarkBar::DETACHED, browser()->bookmark_bar_state());
143   EXPECT_EQ(BookmarkBar::DETACHED, window_bookmark_bar_state());
144
145   // Navigate 1st tab to a non-NTP URL.
146   NavigateAndCommitActiveTab(non_ntp_url);
147   EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
148   EXPECT_EQ(BookmarkBar::HIDDEN, window_bookmark_bar_state());
149
150   // Open a tab to NTP at index 0.
151   AddTab(browser(), ntp_url);
152   EXPECT_EQ(BookmarkBar::DETACHED, browser()->bookmark_bar_state());
153   EXPECT_EQ(BookmarkBar::DETACHED, window_bookmark_bar_state());
154
155   // Activate the 2nd tab which is non-NTP.
156   browser()->tab_strip_model()->ActivateTabAt(1, true);
157   EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
158   EXPECT_EQ(BookmarkBar::HIDDEN, window_bookmark_bar_state());
159
160   // Toggle bookmark bar while 2nd tab (non-NTP) is active.
161   chrome::ToggleBookmarkBar(browser());
162   EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
163   EXPECT_EQ(BookmarkBar::SHOW, window_bookmark_bar_state());
164
165   // Activate the 1st tab which is NTP.
166   browser()->tab_strip_model()->ActivateTabAt(0, true);
167   EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
168   EXPECT_EQ(BookmarkBar::SHOW, window_bookmark_bar_state());
169
170   // Activate the 2nd tab which is non-NTP.
171   browser()->tab_strip_model()->ActivateTabAt(1, true);
172   EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
173   EXPECT_EQ(BookmarkBar::SHOW, window_bookmark_bar_state());
174 }
175
176 #endif  // !defined(OS_ANDROID) && !defined(OS_IOS)