1 // Copyright 2020 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/views/bubble/webui_bubble_manager.h"
6 
7 #include "chrome/browser/ui/browser.h"
8 #include "chrome/browser/ui/views/bubble/webui_bubble_dialog_view.h"
9 #include "chrome/browser/ui/views/frame/browser_view.h"
10 #include "chrome/test/base/in_process_browser_test.h"
11 #include "content/public/test/browser_test.h"
12 
13 namespace {
14 
15 class TestWebUIBubbleManager : public WebUIBubbleManagerBase {
16  public:
TestWebUIBubbleManager(Browser * browser)17   explicit TestWebUIBubbleManager(Browser* browser)
18       : WebUIBubbleManagerBase(BrowserView::GetBrowserViewForBrowser(browser),
19                                browser->profile(),
20                                GURL("chrome://about")) {}
21   TestWebUIBubbleManager(const TestWebUIBubbleManager&) = delete;
22   const TestWebUIBubbleManager& operator=(const TestWebUIBubbleManager&) =
23       delete;
24   ~TestWebUIBubbleManager() override = default;
25 
26  private:
CreateWebView()27   std::unique_ptr<WebUIBubbleView> CreateWebView() override {
28     return std::make_unique<WebUIBubbleView>(browser_context());
29   }
30 };
31 
32 }  // namespace
33 
34 class WebUIBubbleManagerBrowserTest : public InProcessBrowserTest {
35  public:
36   WebUIBubbleManagerBrowserTest() = default;
37   WebUIBubbleManagerBrowserTest(const WebUIBubbleManagerBrowserTest&) = delete;
38   const WebUIBubbleManagerBrowserTest& operator=(
39       const WebUIBubbleManagerBrowserTest&) = delete;
40   ~WebUIBubbleManagerBrowserTest() override = default;
41 
42   // content::BrowserTestBase:
SetUpOnMainThread()43   void SetUpOnMainThread() override {
44     InProcessBrowserTest::SetUpOnMainThread();
45     bubble_manager_ = std::make_unique<TestWebUIBubbleManager>(browser());
46   }
TearDownOnMainThread()47   void TearDownOnMainThread() override {
48     auto* widget = bubble_manager_->GetBubbleWidget();
49     if (widget)
50       widget->CloseNow();
51     bubble_manager()->ResetWebViewForTesting();
52     InProcessBrowserTest::TearDownOnMainThread();
53   }
54 
bubble_manager()55   TestWebUIBubbleManager* bubble_manager() { return bubble_manager_.get(); }
56 
57  private:
58   std::unique_ptr<TestWebUIBubbleManager> bubble_manager_;
59 };
60 
IN_PROC_BROWSER_TEST_F(WebUIBubbleManagerBrowserTest,CreateAndCloseBubble)61 IN_PROC_BROWSER_TEST_F(WebUIBubbleManagerBrowserTest, CreateAndCloseBubble) {
62   EXPECT_EQ(nullptr, bubble_manager()->GetBubbleWidget());
63   bubble_manager()->ShowBubble();
64   EXPECT_NE(nullptr, bubble_manager()->GetBubbleWidget());
65   EXPECT_FALSE(bubble_manager()->GetBubbleWidget()->IsClosed());
66 
67   bubble_manager()->CloseBubble();
68   EXPECT_TRUE(bubble_manager()->GetBubbleWidget()->IsClosed());
69 }
70 
IN_PROC_BROWSER_TEST_F(WebUIBubbleManagerBrowserTest,ShowUISetsBubbleWidgetVisible)71 IN_PROC_BROWSER_TEST_F(WebUIBubbleManagerBrowserTest,
72                        ShowUISetsBubbleWidgetVisible) {
73   EXPECT_EQ(nullptr, bubble_manager()->GetBubbleWidget());
74   bubble_manager()->ShowBubble();
75   EXPECT_NE(nullptr, bubble_manager()->GetBubbleWidget());
76   EXPECT_FALSE(bubble_manager()->GetBubbleWidget()->IsClosed());
77   EXPECT_FALSE(bubble_manager()->GetBubbleWidget()->IsVisible());
78 
79   bubble_manager()->bubble_view_for_testing()->ShowUI();
80   EXPECT_TRUE(bubble_manager()->GetBubbleWidget()->IsVisible());
81 
82   bubble_manager()->CloseBubble();
83   EXPECT_TRUE(bubble_manager()->GetBubbleWidget()->IsClosed());
84 }
85