1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/tab_closeable_state_watcher.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/tab_strip_model.h"
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabCloseableStateWatcherTest : public InProcessBrowserTest {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabCloseableStateWatcherTest() {
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This test is testing TabCloseStateWatcher, so enable it.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EnableTabCloseableStateWatcher();
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    blank_url_ = GURL(chrome::kAboutBlankURL);
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ntp_url_ = GURL(chrome::kChromeUINewTabURL);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    other_url_ = ui_test_utils::GetTestUrl(
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        FilePath(FilePath::kCurrentDirectory),
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        FilePath(FILE_PATH_LITERAL("title2.html")));
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Wrapper for Browser::AddTabWithURL
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddTabWithURL(Browser* browser, const GURL& url) {
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    AddTabAtIndexToBrowser(browser, 0, url, PageTransition::TYPED);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Wait for page to finish loading.
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ui_test_utils::WaitForNavigation(
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        &browser->GetSelectedTabContents()->controller());
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Wrapper for TabCloseableStateWatcher::CanCloseTab
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool CanCloseTab(const Browser* browser) {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return browser->tabstrip_model()->delegate()->CanCloseTab();
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create popup browser.
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* CreatePopupBrowser() {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This is mostly duplicated from InPocessBrowserTest::CreateBrowser,
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // except that a popup browser is created here.
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Browser* popup_browser = Browser::CreateForType(Browser::TYPE_POPUP,
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                    browser()->profile());
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddTabWithURL(popup_browser, ntp_url_);
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    popup_browser->window()->Show();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return popup_browser;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create incognito browser.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* CreateIncognitoBrowser() {
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // This is mostly duplicated from InPocessBrowserTest::CreateBrowser,
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // except that an incognito browser is created here.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Browser* incognito_browser =
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Browser::Create(browser()->profile()->GetOffTheRecordProfile());
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AddTabWithURL(incognito_browser, ntp_url_);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    incognito_browser->window()->Show();
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return incognito_browser;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NavigateToURL(const GURL& url) {
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ui_test_utils::NavigateToURL(browser(), url);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ui_test_utils::RunAllPendingInMessageLoop();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to URL with BeforeUnload handler.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NavigateToBeforeUnloadURL() {
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string kBeforeUnloadHtml =
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "<html><head><title>beforeunload</title></head><body>"
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "<script>window.onbeforeunload=function(e){return 'foo'}</script>"
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "</body></html>";
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NavigateToURL(GURL("data:text/html," + kBeforeUnloadHtml));
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Data members.
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL blank_url_;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL ntp_url_;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL other_url_;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This is used to block until a new tab in the specified browser is inserted.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NewTabObserver : public TabStripModelObserver {
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit NewTabObserver(Browser* browser) : browser_(browser) {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    browser_->tabstrip_model()->AddObserver(this);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ui_test_utils::RunMessageLoop();
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~NewTabObserver() {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    browser_->tabstrip_model()->RemoveObserver(this);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void TabInsertedAt(TabContentsWrapper* contents,
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             int index,
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             bool foreground) {
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoopForUI::current()->Quit();
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* browser_;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests with the only tab in the only normal browser:
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - if tab is about:blank, it is closeable
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - if tab is NewTabPage, it is not closeable
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - if tab is other url, it is closeable
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest,
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       OneNormalBrowserWithOneTab) {
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check that default about::blank tab is closeable.
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, browser()->tab_count());
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Naviate tab to NewTabPage, and check that it's not closeable.
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(ntp_url_);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(CanCloseTab(browser()));
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate tab to any other URL, and check that it's closeable.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(other_url_);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests with 2 tabs in the only normal browser
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - as long as there's > 1 tab, all tabs in the browser are always closeable
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest,
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       OneNormalBrowserWithTwoTabs) {
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 1 NewTabPage with any other tab are closeable.
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First, set up the first NewTabPage.
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(ntp_url_);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(CanCloseTab(browser()));
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add the 2nd tab with blank page.
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddTabWithURL(browser(), blank_url_);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, browser()->tab_count());
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate 2nd tab to other URL.
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(other_url_);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate 2nd tab to NewTabPage.
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(ntp_url_);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close 1st NewTabPage.
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->tabstrip_model()->CloseTabContentsAt(0,
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      TabStripModel::CLOSE_CREATE_HISTORICAL_TAB);
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(CanCloseTab(browser()));
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests with one tab in one normal browser and another non-normal browser.
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - non-normal browser with any tab(s) is always closeable.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - non-normal browser does not affect closeable state of tab(s) in normal
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// browser(s).
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest, SecondNonNormalBrowser) {
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open non-normal browser.
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* popup_browser = CreatePopupBrowser();
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(popup_browser));
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to NewTabPage for 1st browser.
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(ntp_url_);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(CanCloseTab(browser()));
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(popup_browser));
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close non-normal browser.
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  popup_browser->CloseWindow();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(CanCloseTab(browser()));
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests closing a closeable tab - tab should be closed, browser should remain
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// opened with a NewTabPage.
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest, CloseCloseableTab) {
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseTab();
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ntp_url_, browser()->GetSelectedTabContents()->GetURL());
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests closing a closeable browser - all tabs in browser should be closed,
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// browser should remain opened with a NewTabPage.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest, CloseCloseableBrowser) {
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseWindow();
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1u, BrowserList::size());
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(browser(), *(BrowserList::begin()));
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ntp_url_, browser()->GetSelectedTabContents()->GetURL());
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests closing a non-closeable tab and hence non-closeable browser - tab and
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// browser should remain opened.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest,
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       CloseNonCloseableTabAndBrowser) {
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close non-closeable tab.
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(ntp_url_);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(CanCloseTab(browser()));
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab_contents = browser()->GetSelectedTabContents();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseTab();
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab_contents, browser()->GetSelectedTabContents());
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close browser with non-closeable tab.
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseWindow();
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1u, BrowserList::size());
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(browser(), *(BrowserList::begin()));
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab_contents, browser()->GetSelectedTabContents());
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests an incognito browsr with a normal browser.
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - when incognito browser is opened, all browsers (including previously
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   non-clsoeable normal browsers) become closeable.
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - when incognito browser is closed, normal browsers return to adhering to the
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   original closebable rules.
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest, SecondIncognitoBrowser) {
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(ntp_url_);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(CanCloseTab(browser()));
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open an incognito browser.
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* incognito_browser = CreateIncognitoBrowser();
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(incognito_browser->profile()->IsOffTheRecord());
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2u, BrowserList::size());
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(incognito_browser));
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close incognito browser.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  incognito_browser->CloseWindow();
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1u, BrowserList::size());
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(browser(), *(BrowserList::begin()));
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(CanCloseTab(browser()));
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests closing an incognito browser - the incognito browser should close,
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and a new normal browser opened with a NewTabPage (which is not closeable).
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest, CloseIncognitoBrowser) {
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NavigateToURL(ntp_url_);
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open an incognito browser.
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* incognito_browser = CreateIncognitoBrowser();
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(incognito_browser->profile()->IsOffTheRecord());
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2u, BrowserList::size());
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close 1st normal browser.
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseWindow();
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1u, BrowserList::size());
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(incognito_browser, *(BrowserList::begin()));
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(incognito_browser));
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close incognito browser.
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  incognito_browser->CloseWindow();
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Browser* new_browser = ui_test_utils::WaitForNewBrowser();
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1u, BrowserList::size());
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(new_browser->profile()->IsOffTheRecord());
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, new_browser->tab_count());
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ntp_url_, new_browser->GetSelectedTabContents()->GetURL());
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests closing of browser with BeforeUnload handler where user clicks cancel
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (i.e. stay on the page and cancel closing) - browser and its tabs should stay
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the same.
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Sporadically crashing test. See http://crbug.com/79333
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest,
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       DISABLED_CloseBrowserWithBeforeUnloadHandlerCancel) {
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to URL with BeforeUnload handler.
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToBeforeUnloadURL();
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close browser, click Cancel in BeforeUnload confirm dialog.
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab_contents = browser()->GetSelectedTabContents();
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseWindow();
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialog* confirm = ui_test_utils::WaitForAppModalDialog();
2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  confirm->native_dialog()->CancelAppModalDialog();
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1u, BrowserList::size());
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(browser(), *(BrowserList::begin()));
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab_contents, browser()->GetSelectedTabContents());
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the browser.
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseWindow();
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  confirm = ui_test_utils::WaitForAppModalDialog();
2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  confirm->native_dialog()->AcceptAppModalDialog();
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests closing of browser with BeforeUnload handler where user clicks OK (i.e.
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// leave the page and proceed with closing), all tabs in browser should close,
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// browser remains opened with a NewTabPage.
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(TabCloseableStateWatcherTest,
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       CloseBrowserWithBeforeUnloadHandlerOK) {
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to URL with BeforeUnload handler.
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToBeforeUnloadURL();
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(CanCloseTab(browser()));
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close browser, click OK in BeforeUnload confirm dialog.
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseWindow();
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialog* confirm = ui_test_utils::WaitForAppModalDialog();
3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  confirm->native_dialog()->AcceptAppModalDialog();
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NewTabObserver new_tab_observer(browser());
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1u, BrowserList::size());
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(browser(), *(BrowserList::begin()));
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ntp_url_, browser()->GetSelectedTabContents()->GetURL());
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
323