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") {
"webui/tab_search/tab_search_page_handler.h",
"webui/tab_search/tab_search_ui.cc",
"webui/tab_search/tab_search_ui.h",
"webui/tab_search/tab_search_ui_embedder.h",
"webui/theme_handler.cc",
"webui/theme_handler.h",
"webui/theme_source.cc",
......
......@@ -64,8 +64,9 @@ TabSearchBubbleView::TabSearchBubbleView(
TabSearchUI* const tab_search_ui = static_cast<TabSearchUI*>(
web_view_->GetWebContents()->GetWebUI()->GetController());
tab_search_ui->AddShowUICallback(
base::BindOnce(&TabSearchBubbleView::ShowBubble, base::Unretained(this)));
// Depends on the TabSearchUI object being constructed synchronously when the
// navigation is started in LoadInitialURL().
tab_search_ui->SetEmbedder(this);
}
TabSearchBubbleView::~TabSearchBubbleView() {
......@@ -85,16 +86,30 @@ gfx::Size TabSearchBubbleView::CalculatePreferredSize() const {
void TabSearchBubbleView::AddedToWidget() {
BubbleDialogDelegateView::AddedToWidget();
observed_bubble_widget_.Add(GetWidget());
web_view_->holder()->SetCornerRadii(gfx::RoundedCornersF(GetCornerRadius()));
}
void TabSearchBubbleView::OnWebViewSizeChanged() {
SizeToContents();
}
void TabSearchBubbleView::ShowBubble() {
DCHECK(GetWidget());
GetWidget()->Show();
web_view_->GetWebContents()->Focus();
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 @@
#include "base/scoped_observer.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"
namespace views {
......@@ -28,7 +29,9 @@ enum class TabSearchOpenAction {
kMaxValue = kTouchGesture,
};
class TabSearchBubbleView : public views::BubbleDialogDelegateView {
class TabSearchBubbleView : public views::BubbleDialogDelegateView,
public TabSearchUIEmbedder,
public views::WidgetObserver {
public:
// TODO(tluk): Since the Bubble is shown asynchronously, we shouldn't call
// this if the Widget is hidden and yet to be revealed.
......@@ -44,16 +47,24 @@ class TabSearchBubbleView : public views::BubbleDialogDelegateView {
gfx::Size CalculatePreferredSize() const override;
void AddedToWidget() override;
// TabSearchUIEmbedder:
void ShowBubble() override;
void CloseBubble() override;
// views::WidgetObserver:
void OnWidgetClosing(views::Widget* widget) override;
void OnWebViewSizeChanged();
private:
void ShowBubble();
views::WebView* web_view_;
// Time the Tab Search window has been open.
base::Optional<base::ElapsedTimer> timer_;
ScopedObserver<views::Widget, views::WidgetObserver> observed_bubble_widget_{
this};
DISALLOW_COPY_AND_ASSIGN(TabSearchBubbleView);
};
......
......@@ -74,6 +74,9 @@ interface PageHandler {
// Notify the backend that the UI is ready to be shown.
ShowUI();
// Notify the backend that the UI is ready to be closed.
CloseUI();
};
// WebUI-side handler for requests from the browser.
......
......@@ -155,6 +155,10 @@ void TabSearchPageHandler::ShowUI() {
delegate_->ShowUI();
}
void TabSearchPageHandler::CloseUI() {
delegate_->CloseUI();
}
tab_search::mojom::TabPtr TabSearchPageHandler::GetTabData(
TabStripModel* tab_strip_model,
content::WebContents* contents,
......
......@@ -36,6 +36,7 @@ class TabSearchPageHandler : public tab_search::mojom::PageHandler,
class Delegate {
public:
virtual void ShowUI() = 0;
virtual void CloseUI() = 0;
};
TabSearchPageHandler(
......@@ -54,6 +55,7 @@ class TabSearchPageHandler : public tab_search::mojom::PageHandler,
void SwitchToTab(
tab_search::mojom::SwitchToTabInfoPtr switch_to_tab_info) override;
void ShowUI() override;
void CloseUI() override;
// TabStripModelObserver:
void OnTabStripModelChanged(
......
......@@ -101,6 +101,7 @@ class MockTabSearchPageHandlerDelegate : public TabSearchPageHandler::Delegate {
virtual ~MockTabSearchPageHandlerDelegate() = default;
MOCK_METHOD(void, ShowUI, (), (override));
MOCK_METHOD(void, CloseUI, (), (override));
};
class TabSearchPageHandlerTest : public BrowserWithTestWindowTest {
......@@ -350,4 +351,10 @@ TEST_F(TabSearchPageHandlerTest, ShowUITest) {
handler()->ShowUI();
}
// Make sure the delegate receives the closeUI() call.
TEST_F(TabSearchPageHandlerTest, CloseUITest) {
EXPECT_CALL(*handler_delegate(), CloseUI()).Times(1);
handler()->CloseUI();
}
} // namespace
......@@ -7,7 +7,6 @@
#include "build/branding_buildflags.h"
#include "chrome/browser/profiles/profile.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/common/webui_url_constants.h"
#include "chrome/grit/generated_resources.h"
......@@ -80,13 +79,20 @@ void TabSearchUI::BindInterface(
page_factory_receiver_.Bind(std::move(receiver));
}
void TabSearchUI::AddShowUICallback(base::OnceClosure callback) {
show_ui_callback_ = std::move(callback);
void TabSearchUI::SetEmbedder(TabSearchUIEmbedder* embedder) {
// Setting the embedder must be done before the page handler is created.
DCHECK(!embedder || !page_handler_);
embedder_ = embedder;
}
void TabSearchUI::ShowUI() {
if (show_ui_callback_)
std::move(show_ui_callback_).Run();
if (embedder_)
embedder_->ShowBubble();
}
void TabSearchUI::CloseUI() {
if (embedder_)
embedder_->CloseBubble();
}
void TabSearchUI::CreatePageHandler(
......
......@@ -11,6 +11,7 @@
#include "base/macros.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_ui_embedder.h"
#include "chrome/browser/ui/webui/webui_load_timer.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
......@@ -30,11 +31,11 @@ class TabSearchUI : public ui::MojoWebUIController,
// interface passing the pending receiver that will be internally bound.
void BindInterface(
mojo::PendingReceiver<tab_search::mojom::PageHandlerFactory> receiver);
void AddShowUICallback(base::OnceClosure callback);
void SetEmbedder(TabSearchUIEmbedder* embedder);
// TabSearchPageHandler::Delegate:
void ShowUI() override;
void CloseUI() override;
private:
// tab_search::mojom::PageHandlerFactory
......@@ -49,9 +50,7 @@ class TabSearchUI : public ui::MojoWebUIController,
WebuiLoadTimer webui_load_timer_;
// This is called when the renderer process indicates that the UI is ready to
// be shown.
base::OnceClosure show_ui_callback_;
TabSearchUIEmbedder* embedder_ = nullptr;
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