| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/browser_finder.h" |
| |
| #include "ash/wm/desks/desk.h" |
| #include "ash/wm/desks/desks_controller.h" |
| #include "ash/wm/desks/desks_test_util.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_window.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "content/public/test/browser_test.h" |
| |
| namespace { |
| |
| class BrowserFinderWithDesksTest : public InProcessBrowserTest { |
| public: |
| BrowserFinderWithDesksTest() = default; |
| |
| BrowserFinderWithDesksTest(const BrowserFinderWithDesksTest&) = delete; |
| BrowserFinderWithDesksTest& operator=(const BrowserFinderWithDesksTest&) = |
| delete; |
| |
| ~BrowserFinderWithDesksTest() override = default; |
| |
| // InProcessBrowserTest: |
| void SetUpOnMainThread() override { |
| InProcessBrowserTest::SetUpOnMainThread(); |
| // Create three desks (two other than the default). |
| auto* desks_controller = ash::DesksController::Get(); |
| desks_controller->NewDesk(ash::DesksCreationRemovalSource::kButton); |
| desks_controller->NewDesk(ash::DesksCreationRemovalSource::kButton); |
| } |
| |
| void ActivateBrowser(Browser* browser) { browser->window()->Activate(); } |
| |
| Browser* CreateTestBrowser() { |
| Browser* new_browser = CreateBrowser(browser()->profile()); |
| new_browser->window()->Show(); |
| ActivateBrowser(new_browser); |
| return new_browser; |
| } |
| }; |
| |
| } // namespace |
| |
| IN_PROC_BROWSER_TEST_F(BrowserFinderWithDesksTest, FindAnyBrowser) { |
| auto* desks_controller = ash::DesksController::Get(); |
| ASSERT_EQ(3u, desks_controller->desks().size()); |
| auto* desk_1 = desks_controller->desks()[0].get(); |
| auto* desk_2 = desks_controller->desks()[1].get(); |
| auto* desk_3 = desks_controller->desks()[2].get(); |
| |
| Browser* browser_1 = CreateTestBrowser(); |
| CloseBrowserSynchronously(browser()); |
| SelectFirstBrowser(); |
| auto* window_1 = browser_1->window()->GetNativeWindow(); |
| EXPECT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); |
| EXPECT_TRUE(desk_1->is_active()); |
| EXPECT_TRUE(desks_controller->BelongsToActiveDesk(window_1)); |
| EXPECT_EQ(browser_1, chrome::FindAnyBrowser(browser()->profile(), true)); |
| |
| // Switch to desk_2 and create a browser there. |
| ash::ActivateDesk(desk_2); |
| EXPECT_TRUE(desk_2->is_active()); |
| Browser* browser_2 = CreateTestBrowser(); |
| auto* window_2 = browser_2->window()->GetNativeWindow(); |
| EXPECT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); |
| EXPECT_FALSE(desks_controller->BelongsToActiveDesk(window_1)); |
| EXPECT_TRUE(desks_controller->BelongsToActiveDesk(window_2)); |
| |
| // FindAnyBrowser should return the MRU browser, which is browser_2 in this |
| // case. |
| EXPECT_EQ(browser_2, chrome::FindAnyBrowser(browser()->profile(), true)); |
| |
| // Switch to desk_3, no browsers on this desk, however, FindAnyBrowser should |
| // still return browser_2. |
| ash::ActivateDesk(desk_3); |
| EXPECT_TRUE(desk_3->is_active()); |
| EXPECT_FALSE(desks_controller->BelongsToActiveDesk(window_1)); |
| EXPECT_FALSE(desks_controller->BelongsToActiveDesk(window_2)); |
| EXPECT_EQ(browser_2, chrome::FindAnyBrowser(browser()->profile(), true)); |
| |
| // Switch to desk_1 by activating browser_1. When we switch back to desk_3, |
| // FindAnyBrowser() will return browser_1 as the MRU browser. |
| ash::DeskSwitchAnimationWaiter waiter; |
| ActivateBrowser(browser_1); |
| waiter.Wait(); |
| |
| EXPECT_TRUE(desk_1->is_active()); |
| EXPECT_TRUE(desks_controller->BelongsToActiveDesk(window_1)); |
| EXPECT_EQ(browser_1, chrome::FindAnyBrowser(browser()->profile(), true)); |
| |
| ash::ActivateDesk(desk_3); |
| EXPECT_TRUE(desk_3->is_active()); |
| EXPECT_EQ(browser_1, chrome::FindAnyBrowser(browser()->profile(), true)); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(BrowserFinderWithDesksTest, FindTabbedBrowser) { |
| auto* desks_controller = ash::DesksController::Get(); |
| ASSERT_EQ(3u, desks_controller->desks().size()); |
| auto* desk_1 = desks_controller->desks()[0].get(); |
| auto* desk_2 = desks_controller->desks()[1].get(); |
| auto* desk_3 = desks_controller->desks()[2].get(); |
| |
| Browser* browser_1 = CreateTestBrowser(); |
| CloseBrowserSynchronously(browser()); |
| SelectFirstBrowser(); |
| auto* window_1 = browser_1->window()->GetNativeWindow(); |
| EXPECT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); |
| EXPECT_TRUE(desk_1->is_active()); |
| EXPECT_TRUE(desks_controller->BelongsToActiveDesk(window_1)); |
| EXPECT_EQ(browser_1, chrome::FindTabbedBrowser(browser()->profile(), true)); |
| |
| // Switch to desk_2, expect that FindTabbedBrowser() favors the current desk. |
| ash::ActivateDesk(desk_2); |
| EXPECT_TRUE(desk_2->is_active()); |
| EXPECT_FALSE(chrome::FindTabbedBrowser(browser()->profile(), true)); |
| |
| // Create a browser on desk_2, and expect that FindTabbedBrowser() to find it. |
| Browser* browser_2 = CreateTestBrowser(); |
| EXPECT_EQ(browser_2, chrome::FindTabbedBrowser(browser()->profile(), true)); |
| |
| // Switch to desk_3, and expect there is no tabbed browser. |
| ash::ActivateDesk(desk_3); |
| EXPECT_TRUE(desk_3->is_active()); |
| EXPECT_FALSE(chrome::FindTabbedBrowser(browser()->profile(), true)); |
| |
| // Create a browser on desk_3 |
| Browser* browser_3 = CreateTestBrowser(); |
| |
| // Since browser_3 is not closing, FindTabbedBrowser with |
| // ignore_closing_browsers=true should return it. |
| EXPECT_EQ(browser_3, |
| chrome::FindTabbedBrowser(browser()->profile(), true, |
| display::kInvalidDisplayId, true)); |
| // FindTabbedBrowser with ignore_closing_browsers=false should also return |
| // browser_3. |
| EXPECT_EQ(browser_3, |
| chrome::FindTabbedBrowser(browser()->profile(), true, |
| display::kInvalidDisplayId, false)); |
| |
| // Start closing the browser |
| CloseBrowserAsynchronously(browser_3); |
| |
| // Since browser_3 is closing at this point, FindTabbedBrowser should always |
| // return nullptr. |
| EXPECT_EQ(nullptr, |
| chrome::FindTabbedBrowser(browser()->profile(), true, |
| display::kInvalidDisplayId, true)); |
| EXPECT_EQ(nullptr, |
| chrome::FindTabbedBrowser(browser()->profile(), true, |
| display::kInvalidDisplayId, false)); |
| } |