Commit 50f93fcd authored by Roman Arora's avatar Roman Arora Committed by Commit Bot

TabSearch: Close bubble view API

Bug: 1099917
Change-Id: Ia5995175891346769aadee1961f0da694b1d8b05
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2414513
Commit-Queue: Roman Arora <romanarora@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarThomas Lukaszewicz <tluk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#809958}
parent de375584
...@@ -1481,6 +1481,7 @@ static_library("ui") { ...@@ -1481,6 +1481,7 @@ static_library("ui") {
"webui/tab_search/tab_search_page_handler.h", "webui/tab_search/tab_search_page_handler.h",
"webui/tab_search/tab_search_ui.cc", "webui/tab_search/tab_search_ui.cc",
"webui/tab_search/tab_search_ui.h", "webui/tab_search/tab_search_ui.h",
"webui/tab_search/tab_search_ui_embedder.h",
"webui/theme_handler.cc", "webui/theme_handler.cc",
"webui/theme_handler.h", "webui/theme_handler.h",
"webui/theme_source.cc", "webui/theme_source.cc",
......
...@@ -64,8 +64,9 @@ TabSearchBubbleView::TabSearchBubbleView( ...@@ -64,8 +64,9 @@ TabSearchBubbleView::TabSearchBubbleView(
TabSearchUI* const tab_search_ui = static_cast<TabSearchUI*>( TabSearchUI* const tab_search_ui = static_cast<TabSearchUI*>(
web_view_->GetWebContents()->GetWebUI()->GetController()); web_view_->GetWebContents()->GetWebUI()->GetController());
tab_search_ui->AddShowUICallback( // Depends on the TabSearchUI object being constructed synchronously when the
base::BindOnce(&TabSearchBubbleView::ShowBubble, base::Unretained(this))); // navigation is started in LoadInitialURL().
tab_search_ui->SetEmbedder(this);
} }
TabSearchBubbleView::~TabSearchBubbleView() { TabSearchBubbleView::~TabSearchBubbleView() {
...@@ -85,16 +86,30 @@ gfx::Size TabSearchBubbleView::CalculatePreferredSize() const { ...@@ -85,16 +86,30 @@ gfx::Size TabSearchBubbleView::CalculatePreferredSize() const {
void TabSearchBubbleView::AddedToWidget() { void TabSearchBubbleView::AddedToWidget() {
BubbleDialogDelegateView::AddedToWidget(); BubbleDialogDelegateView::AddedToWidget();
observed_bubble_widget_.Add(GetWidget());
web_view_->holder()->SetCornerRadii(gfx::RoundedCornersF(GetCornerRadius())); web_view_->holder()->SetCornerRadii(gfx::RoundedCornersF(GetCornerRadius()));
} }
void TabSearchBubbleView::OnWebViewSizeChanged() {
SizeToContents();
}
void TabSearchBubbleView::ShowBubble() { void TabSearchBubbleView::ShowBubble() {
DCHECK(GetWidget()); DCHECK(GetWidget());
GetWidget()->Show(); GetWidget()->Show();
web_view_->GetWebContents()->Focus(); web_view_->GetWebContents()->Focus();
timer_ = base::ElapsedTimer(); timer_ = base::ElapsedTimer();
} }
void TabSearchBubbleView::CloseBubble() {
DCHECK(GetWidget());
GetWidget()->CloseWithReason(views::Widget::ClosedReason::kEscKeyPressed);
}
void TabSearchBubbleView::OnWidgetClosing(views::Widget* widget) {
if (widget == GetWidget()) {
TabSearchUI* const tab_search_ui = static_cast<TabSearchUI*>(
web_view_->GetWebContents()->GetWebUI()->GetController());
tab_search_ui->SetEmbedder(nullptr);
}
}
void TabSearchBubbleView::OnWebViewSizeChanged() {
SizeToContents();
}
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/scoped_observer.h" #include "base/scoped_observer.h"
#include "base/timer/elapsed_timer.h" #include "base/timer/elapsed_timer.h"
#include "chrome/browser/ui/webui/tab_search/tab_search_ui_embedder.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h"
namespace views { namespace views {
...@@ -28,7 +29,9 @@ enum class TabSearchOpenAction { ...@@ -28,7 +29,9 @@ enum class TabSearchOpenAction {
kMaxValue = kTouchGesture, kMaxValue = kTouchGesture,
}; };
class TabSearchBubbleView : public views::BubbleDialogDelegateView { class TabSearchBubbleView : public views::BubbleDialogDelegateView,
public TabSearchUIEmbedder,
public views::WidgetObserver {
public: public:
// TODO(tluk): Since the Bubble is shown asynchronously, we shouldn't call // TODO(tluk): Since the Bubble is shown asynchronously, we shouldn't call
// this if the Widget is hidden and yet to be revealed. // this if the Widget is hidden and yet to be revealed.
...@@ -44,16 +47,24 @@ class TabSearchBubbleView : public views::BubbleDialogDelegateView { ...@@ -44,16 +47,24 @@ class TabSearchBubbleView : public views::BubbleDialogDelegateView {
gfx::Size CalculatePreferredSize() const override; gfx::Size CalculatePreferredSize() const override;
void AddedToWidget() override; void AddedToWidget() override;
// TabSearchUIEmbedder:
void ShowBubble() override;
void CloseBubble() override;
// views::WidgetObserver:
void OnWidgetClosing(views::Widget* widget) override;
void OnWebViewSizeChanged(); void OnWebViewSizeChanged();
private: private:
void ShowBubble();
views::WebView* web_view_; views::WebView* web_view_;
// Time the Tab Search window has been open. // Time the Tab Search window has been open.
base::Optional<base::ElapsedTimer> timer_; base::Optional<base::ElapsedTimer> timer_;
ScopedObserver<views::Widget, views::WidgetObserver> observed_bubble_widget_{
this};
DISALLOW_COPY_AND_ASSIGN(TabSearchBubbleView); DISALLOW_COPY_AND_ASSIGN(TabSearchBubbleView);
}; };
......
...@@ -74,6 +74,9 @@ interface PageHandler { ...@@ -74,6 +74,9 @@ interface PageHandler {
// Notify the backend that the UI is ready to be shown. // Notify the backend that the UI is ready to be shown.
ShowUI(); ShowUI();
// Notify the backend that the UI is ready to be closed.
CloseUI();
}; };
// WebUI-side handler for requests from the browser. // WebUI-side handler for requests from the browser.
......
...@@ -155,6 +155,10 @@ void TabSearchPageHandler::ShowUI() { ...@@ -155,6 +155,10 @@ void TabSearchPageHandler::ShowUI() {
delegate_->ShowUI(); delegate_->ShowUI();
} }
void TabSearchPageHandler::CloseUI() {
delegate_->CloseUI();
}
tab_search::mojom::TabPtr TabSearchPageHandler::GetTabData( tab_search::mojom::TabPtr TabSearchPageHandler::GetTabData(
TabStripModel* tab_strip_model, TabStripModel* tab_strip_model,
content::WebContents* contents, content::WebContents* contents,
......
...@@ -36,6 +36,7 @@ class TabSearchPageHandler : public tab_search::mojom::PageHandler, ...@@ -36,6 +36,7 @@ class TabSearchPageHandler : public tab_search::mojom::PageHandler,
class Delegate { class Delegate {
public: public:
virtual void ShowUI() = 0; virtual void ShowUI() = 0;
virtual void CloseUI() = 0;
}; };
TabSearchPageHandler( TabSearchPageHandler(
...@@ -54,6 +55,7 @@ class TabSearchPageHandler : public tab_search::mojom::PageHandler, ...@@ -54,6 +55,7 @@ class TabSearchPageHandler : public tab_search::mojom::PageHandler,
void SwitchToTab( void SwitchToTab(
tab_search::mojom::SwitchToTabInfoPtr switch_to_tab_info) override; tab_search::mojom::SwitchToTabInfoPtr switch_to_tab_info) override;
void ShowUI() override; void ShowUI() override;
void CloseUI() override;
// TabStripModelObserver: // TabStripModelObserver:
void OnTabStripModelChanged( void OnTabStripModelChanged(
......
...@@ -101,6 +101,7 @@ class MockTabSearchPageHandlerDelegate : public TabSearchPageHandler::Delegate { ...@@ -101,6 +101,7 @@ class MockTabSearchPageHandlerDelegate : public TabSearchPageHandler::Delegate {
virtual ~MockTabSearchPageHandlerDelegate() = default; virtual ~MockTabSearchPageHandlerDelegate() = default;
MOCK_METHOD(void, ShowUI, (), (override)); MOCK_METHOD(void, ShowUI, (), (override));
MOCK_METHOD(void, CloseUI, (), (override));
}; };
class TabSearchPageHandlerTest : public BrowserWithTestWindowTest { class TabSearchPageHandlerTest : public BrowserWithTestWindowTest {
...@@ -350,4 +351,10 @@ TEST_F(TabSearchPageHandlerTest, ShowUITest) { ...@@ -350,4 +351,10 @@ TEST_F(TabSearchPageHandlerTest, ShowUITest) {
handler()->ShowUI(); handler()->ShowUI();
} }
// Make sure the delegate receives the closeUI() call.
TEST_F(TabSearchPageHandlerTest, CloseUITest) {
EXPECT_CALL(*handler_delegate(), CloseUI()).Times(1);
handler()->CloseUI();
}
} // namespace } // namespace
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include "build/branding_buildflags.h" #include "build/branding_buildflags.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/favicon_source.h" #include "chrome/browser/ui/webui/favicon_source.h"
#include "chrome/browser/ui/webui/tab_search/tab_search_page_handler.h"
#include "chrome/browser/ui/webui/webui_util.h" #include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/webui_url_constants.h" #include "chrome/common/webui_url_constants.h"
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
...@@ -80,13 +79,20 @@ void TabSearchUI::BindInterface( ...@@ -80,13 +79,20 @@ void TabSearchUI::BindInterface(
page_factory_receiver_.Bind(std::move(receiver)); page_factory_receiver_.Bind(std::move(receiver));
} }
void TabSearchUI::AddShowUICallback(base::OnceClosure callback) { void TabSearchUI::SetEmbedder(TabSearchUIEmbedder* embedder) {
show_ui_callback_ = std::move(callback); // Setting the embedder must be done before the page handler is created.
DCHECK(!embedder || !page_handler_);
embedder_ = embedder;
} }
void TabSearchUI::ShowUI() { void TabSearchUI::ShowUI() {
if (show_ui_callback_) if (embedder_)
std::move(show_ui_callback_).Run(); embedder_->ShowBubble();
}
void TabSearchUI::CloseUI() {
if (embedder_)
embedder_->CloseBubble();
} }
void TabSearchUI::CreatePageHandler( void TabSearchUI::CreatePageHandler(
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/ui/webui/tab_search/tab_search.mojom.h" #include "chrome/browser/ui/webui/tab_search/tab_search.mojom.h"
#include "chrome/browser/ui/webui/tab_search/tab_search_page_handler.h" #include "chrome/browser/ui/webui/tab_search/tab_search_page_handler.h"
#include "chrome/browser/ui/webui/tab_search/tab_search_ui_embedder.h"
#include "chrome/browser/ui/webui/webui_load_timer.h" #include "chrome/browser/ui/webui/webui_load_timer.h"
#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
...@@ -30,11 +31,11 @@ class TabSearchUI : public ui::MojoWebUIController, ...@@ -30,11 +31,11 @@ class TabSearchUI : public ui::MojoWebUIController,
// interface passing the pending receiver that will be internally bound. // interface passing the pending receiver that will be internally bound.
void BindInterface( void BindInterface(
mojo::PendingReceiver<tab_search::mojom::PageHandlerFactory> receiver); mojo::PendingReceiver<tab_search::mojom::PageHandlerFactory> receiver);
void SetEmbedder(TabSearchUIEmbedder* embedder);
void AddShowUICallback(base::OnceClosure callback);
// TabSearchPageHandler::Delegate: // TabSearchPageHandler::Delegate:
void ShowUI() override; void ShowUI() override;
void CloseUI() override;
private: private:
// tab_search::mojom::PageHandlerFactory // tab_search::mojom::PageHandlerFactory
...@@ -49,9 +50,7 @@ class TabSearchUI : public ui::MojoWebUIController, ...@@ -49,9 +50,7 @@ class TabSearchUI : public ui::MojoWebUIController,
WebuiLoadTimer webui_load_timer_; WebuiLoadTimer webui_load_timer_;
// This is called when the renderer process indicates that the UI is ready to TabSearchUIEmbedder* embedder_ = nullptr;
// be shown.
base::OnceClosure show_ui_callback_;
WEB_UI_CONTROLLER_TYPE_DECL(); WEB_UI_CONTROLLER_TYPE_DECL();
}; };
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_WEBUI_TAB_SEARCH_TAB_SEARCH_UI_EMBEDDER_H_
#define CHROME_BROWSER_UI_WEBUI_TAB_SEARCH_TAB_SEARCH_UI_EMBEDDER_H_
// Interface to be implemented by the embedder. Provides native UI
// functionality such as showing and closing a bubble view.
class TabSearchUIEmbedder {
public:
TabSearchUIEmbedder() = default;
virtual ~TabSearchUIEmbedder() = default;
virtual void ShowBubble() = 0;
virtual void CloseBubble() = 0;
};
#endif // CHROME_BROWSER_UI_WEBUI_TAB_SEARCH_TAB_SEARCH_UI_EMBEDDER_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment