Commit 754213fe authored by Takumi Fujimoto's avatar Takumi Fujimoto Committed by Commit Bot

[Harmony Cast Dialog] Show dialog for browser_actions-less windows

In a browser window without BrowserActionsContainer, there is no Cast
toolbar icon to anchor the dialog to. So we anchor it to the top center
of the window.

Bug: 853371

Change-Id: If79016f0bd06e322db8b96621ab058e215ba5364
Reviewed-on: https://chromium-review.googlesource.com/1145237
Commit-Queue: Takumi Fujimoto <takumif@chromium.org>
Reviewed-by: default avatarmark a. foltz <mfoltz@chromium.org>
Reviewed-by: default avatarBret Sepulveda <bsep@chromium.org>
Cr-Commit-Position: refs/heads/master@{#577205}
parent 96fb2db7
...@@ -13,9 +13,14 @@ ...@@ -13,9 +13,14 @@
#include "chrome/browser/ui/media_router/cast_dialog_model.h" #include "chrome/browser/ui/media_router/cast_dialog_model.h"
#include "chrome/browser/ui/media_router/media_cast_mode.h" #include "chrome/browser/ui/media_router/media_cast_mode.h"
#include "chrome/browser/ui/media_router/ui_media_sink.h" #include "chrome/browser/ui/media_router/ui_media_sink.h"
#include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/frame/top_container_view.h"
#include "chrome/browser/ui/views/harmony/chrome_layout_provider.h" #include "chrome/browser/ui/views/harmony/chrome_layout_provider.h"
#include "chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.h" #include "chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.h"
#include "chrome/browser/ui/views/media_router/cast_dialog_sink_button.h" #include "chrome/browser/ui/views/media_router/cast_dialog_sink_button.h"
#include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
#include "chrome/common/media_router/media_sink.h" #include "chrome/common/media_router/media_sink.h"
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
...@@ -23,6 +28,7 @@ ...@@ -23,6 +28,7 @@
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
#include "ui/gfx/native_widget_types.h" #include "ui/gfx/native_widget_types.h"
#include "ui/gfx/vector_icon_types.h" #include "ui/gfx/vector_icon_types.h"
#include "ui/views/bubble/bubble_border.h"
#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/button/md_text_button.h" #include "ui/views/controls/button/md_text_button.h"
#include "ui/views/controls/scroll_view.h" #include "ui/views/controls/scroll_view.h"
...@@ -54,16 +60,25 @@ bool SupportsDesktopSource(const UIMediaSink& sink) { ...@@ -54,16 +60,25 @@ bool SupportsDesktopSource(const UIMediaSink& sink) {
} // namespace } // namespace
// static // static
void CastDialogView::ShowDialog(views::View* anchor_view, void CastDialogView::ShowDialogWithToolbarAction(
CastDialogController* controller, CastDialogController* controller,
Browser* browser, Browser* browser,
const base::Time& start_time) { const base::Time& start_time) {
DCHECK(!instance_); BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
DCHECK(!start_time.is_null()); DCHECK(browser_view->toolbar()->browser_actions());
instance_ = new CastDialogView(anchor_view, controller, browser, start_time); views::View* action_view =
views::Widget* widget = browser_view->toolbar()->browser_actions()->GetViewForId(
views::BubbleDialogDelegateView::CreateBubble(instance_); ComponentToolbarActionsFactory::kMediaRouterActionId);
widget->Show(); ShowDialog(action_view, views::BubbleBorder::TOP_RIGHT, controller, browser,
start_time);
}
// static
void CastDialogView::ShowDialogTopCentered(CastDialogController* controller,
Browser* browser,
const base::Time& start_time) {
ShowDialog(BrowserView::GetBrowserViewForBrowser(browser)->top_container(),
views::BubbleBorder::TOP_CENTER, controller, browser, start_time);
} }
// static // static
...@@ -205,11 +220,27 @@ void CastDialogView::ExecuteCommand(int command_id, int event_flags) { ...@@ -205,11 +220,27 @@ void CastDialogView::ExecuteCommand(int command_id, int event_flags) {
metrics_.OnCastModeSelected(); metrics_.OnCastModeSelected();
} }
// static
void CastDialogView::ShowDialog(views::View* anchor_view,
views::BubbleBorder::Arrow anchor_position,
CastDialogController* controller,
Browser* browser,
const base::Time& start_time) {
DCHECK(!instance_);
DCHECK(!start_time.is_null());
instance_ = new CastDialogView(anchor_view, anchor_position, controller,
browser, start_time);
views::Widget* widget =
views::BubbleDialogDelegateView::CreateBubble(instance_);
widget->Show();
}
CastDialogView::CastDialogView(views::View* anchor_view, CastDialogView::CastDialogView(views::View* anchor_view,
views::BubbleBorder::Arrow anchor_position,
CastDialogController* controller, CastDialogController* controller,
Browser* browser, Browser* browser,
const base::Time& start_time) const base::Time& start_time)
: BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), : BubbleDialogDelegateView(anchor_view, anchor_position),
selected_source_(kTabSource), selected_source_(kTabSource),
controller_(controller), controller_(controller),
browser_(browser), browser_(browser),
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "chrome/browser/ui/media_router/cast_dialog_controller.h" #include "chrome/browser/ui/media_router/cast_dialog_controller.h"
#include "chrome/browser/ui/views/media_router/cast_dialog_metrics.h" #include "chrome/browser/ui/views/media_router/cast_dialog_metrics.h"
#include "ui/base/models/simple_menu_model.h" #include "ui/base/models/simple_menu_model.h"
#include "ui/views/bubble/bubble_border.h"
#include "ui/views/bubble/bubble_dialog_delegate.h" #include "ui/views/bubble/bubble_dialog_delegate.h"
#include "ui/views/controls/button/button.h" #include "ui/views/controls/button/button.h"
#include "ui/views/controls/menu/menu_runner.h" #include "ui/views/controls/menu/menu_runner.h"
...@@ -35,10 +36,15 @@ class CastDialogView : public views::BubbleDialogDelegateView, ...@@ -35,10 +36,15 @@ class CastDialogView : public views::BubbleDialogDelegateView,
public CastDialogController::Observer, public CastDialogController::Observer,
public ui::SimpleMenuModel::Delegate { public ui::SimpleMenuModel::Delegate {
public: public:
// Instantiates and shows the singleton dialog. The dialog must not be // Shows the singleton dialog anchored to the Cast toolbar icon. Requires that
// currently shown. // BrowserActionsContainer exists for |browser|.
static void ShowDialog(views::View* anchor_view, static void ShowDialogWithToolbarAction(CastDialogController* controller,
CastDialogController* controller, Browser* browser,
const base::Time& start_time);
// Shows the singleton dialog anchored to the top-center of the browser
// window.
static void ShowDialogTopCentered(CastDialogController* controller,
Browser* browser, Browser* browser,
const base::Time& start_time); const base::Time& start_time);
...@@ -98,7 +104,19 @@ class CastDialogView : public views::BubbleDialogDelegateView, ...@@ -98,7 +104,19 @@ class CastDialogView : public views::BubbleDialogDelegateView,
} }
private: private:
friend class CastDialogViewTest;
FRIEND_TEST_ALL_PREFIXES(CastDialogViewTest, ShowAndHideDialog);
// Instantiates and shows the singleton dialog. The dialog must not be
// currently shown.
static void ShowDialog(views::View* anchor_view,
views::BubbleBorder::Arrow anchor_position,
CastDialogController* controller,
Browser* browser,
const base::Time& start_time);
CastDialogView(views::View* anchor_view, CastDialogView(views::View* anchor_view,
views::BubbleBorder::Arrow anchor_position,
CastDialogController* controller, CastDialogController* controller,
Browser* browser, Browser* browser,
const base::Time& start_time); const base::Time& start_time);
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
#include "ui/events/base_event_utils.h" #include "ui/events/base_event_utils.h"
#include "ui/views/bubble/bubble_border.h"
#include "ui/views/controls/scroll_view.h" #include "ui/views/controls/scroll_view.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
#include "ui/views/window/dialog_client_view.h" #include "ui/views/window/dialog_client_view.h"
...@@ -102,7 +103,8 @@ class CastDialogViewTest : public ChromeViewsTestBase { ...@@ -102,7 +103,8 @@ class CastDialogViewTest : public ChromeViewsTestBase {
WithArg<0>(Invoke([this](CastDialogController::Observer* observer) { WithArg<0>(Invoke([this](CastDialogController::Observer* observer) {
dialog_ = static_cast<CastDialogView*>(observer); dialog_ = static_cast<CastDialogView*>(observer);
}))); })));
CastDialogView::ShowDialog(anchor_widget_->GetContentsView(), &controller_, CastDialogView::ShowDialog(anchor_widget_->GetContentsView(),
views::BubbleBorder::TOP_RIGHT, &controller_,
nullptr, base::Time::Now()); nullptr, base::Time::Now());
dialog_->OnModelUpdated(model); dialog_->OnModelUpdated(model);
...@@ -149,7 +151,8 @@ TEST_F(CastDialogViewTest, MAYBE_ShowAndHideDialog) { ...@@ -149,7 +151,8 @@ TEST_F(CastDialogViewTest, MAYBE_ShowAndHideDialog) {
EXPECT_EQ(nullptr, CastDialogView::GetCurrentDialogWidget()); EXPECT_EQ(nullptr, CastDialogView::GetCurrentDialogWidget());
EXPECT_CALL(controller_, AddObserver(_)); EXPECT_CALL(controller_, AddObserver(_));
CastDialogView::ShowDialog(anchor_widget_->GetContentsView(), &controller_, CastDialogView::ShowDialog(anchor_widget_->GetContentsView(),
views::BubbleBorder::TOP_RIGHT, &controller_,
nullptr, base::Time::Now()); nullptr, base::Time::Now());
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
EXPECT_TRUE(CastDialogView::IsShowing()); EXPECT_TRUE(CastDialogView::IsShowing());
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/media/router/media_router_feature.h" #include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h"
#include "chrome/browser/ui/toolbar/media_router_action.h" #include "chrome/browser/ui/toolbar/media_router_action.h"
#include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/media_router/cast_dialog_view.h" #include "chrome/browser/ui/views/media_router/cast_dialog_view.h"
...@@ -57,22 +56,17 @@ void MediaRouterDialogControllerViews::CreateMediaRouterDialog() { ...@@ -57,22 +56,17 @@ void MediaRouterDialogControllerViews::CreateMediaRouterDialog() {
Browser* browser = chrome::FindBrowserWithWebContents(initiator()); Browser* browser = chrome::FindBrowserWithWebContents(initiator());
if (!browser) if (!browser)
return; return;
BrowserActionsContainer* browser_actions =
BrowserView::GetBrowserViewForBrowser(browser)
->toolbar()
->browser_actions();
// |browser_actions| may be null in toolbar-less browser windows.
// TODO(takumif): Show the dialog at the top-middle of the window if the
// toolbar is missing.
if (!browser_actions)
return;
views::View* action_view = browser_actions->GetViewForId(
ComponentToolbarActionsFactory::kMediaRouterActionId);
ui_ = std::make_unique<MediaRouterViewsUI>(); ui_ = std::make_unique<MediaRouterViewsUI>();
InitializeMediaRouterUI(ui_.get()); InitializeMediaRouterUI(ui_.get());
CastDialogView::ShowDialog(action_view, ui_.get(), browser, BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
if (browser_view->toolbar()->browser_actions()) {
CastDialogView::ShowDialogWithToolbarAction(ui_.get(), browser,
dialog_creation_time);
} else {
CastDialogView::ShowDialogTopCentered(ui_.get(), browser,
dialog_creation_time); dialog_creation_time);
}
CastDialogView::GetCurrentDialogWidget()->AddObserver(this); CastDialogView::GetCurrentDialogWidget()->AddObserver(this);
} }
......
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