Index: chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc |
diff --git a/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc b/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc |
index ad69808749ce7dd72bfd8aedcdc801c2c8f82e9b..3ae9fada4a6bfeb13226509c5d9f9322d7dd85ac 100644 |
--- a/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc |
+++ b/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc |
@@ -15,6 +15,8 @@ |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/browser_finder.h" |
#include "chrome/browser/ui/browser_window.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h" |
#include "chrome/browser/ui/toolbar/media_router_action.h" |
#include "chrome/browser/ui/webui/constrained_web_dialog_ui.h" |
#include "chrome/browser/ui/webui/media_router/media_router_ui.h" |
@@ -52,10 +54,9 @@ constexpr const int kWidth = 340; |
// will look like. |
class MediaRouterDialogDelegate : public WebDialogDelegate { |
public: |
- MediaRouterDialogDelegate(base::WeakPtr<MediaRouterAction> action, |
+ MediaRouterDialogDelegate( |
msw
2016/07/26 19:59:32
nit: explicit.
takumif
2016/07/28 20:04:11
Done.
|
const base::WeakPtr<MediaRouterDialogControllerImpl>& controller) |
- : action_(action), |
- controller_(controller) {} |
+ : controller_(controller) {} |
~MediaRouterDialogDelegate() override {} |
// WebDialogDelegate implementation. |
@@ -86,8 +87,7 @@ class MediaRouterDialogDelegate : public WebDialogDelegate { |
void OnDialogClosed(const std::string& json_retval) override { |
// We don't delete |this| here because this class is owned |
// by ConstrainedWebDialogDelegate. |
- if (action_) |
- action_->OnPopupHidden(); |
+ controller_.get()->OnDialogClosed(); |
} |
void OnCloseContents(WebContents* source, bool* out_close_dialog) override { |
@@ -100,7 +100,6 @@ class MediaRouterDialogDelegate : public WebDialogDelegate { |
} |
private: |
- base::WeakPtr<MediaRouterAction> action_; |
base::WeakPtr<MediaRouterDialogControllerImpl> controller_; |
DISALLOW_COPY_AND_ASSIGN(MediaRouterDialogDelegate); |
@@ -160,7 +159,10 @@ MediaRouterDialogControllerImpl::MediaRouterDialogControllerImpl( |
WebContents* web_contents) |
: MediaRouterDialogController(web_contents), |
media_router_dialog_pending_(false), |
+ tab_strip_model_observer_(this), |
weak_ptr_factory_(this) { |
+ tab_strip_model_observer_.Add( |
+ chrome::FindBrowserWithWebContents(initiator())->tab_strip_model()); |
} |
MediaRouterDialogControllerImpl::~MediaRouterDialogControllerImpl() { |
@@ -173,8 +175,7 @@ WebContents* MediaRouterDialogControllerImpl::GetMediaRouterDialog() const { |
void MediaRouterDialogControllerImpl::SetMediaRouterAction( |
const base::WeakPtr<MediaRouterAction>& action) { |
- if (!action_) |
- action_ = action; |
+ action_ = action; |
} |
bool MediaRouterDialogControllerImpl::IsShowingMediaRouterDialog() const { |
@@ -235,7 +236,7 @@ void MediaRouterDialogControllerImpl::CreateMediaRouterDialog() { |
// |web_dialog_delegate|'s owner is |constrained_delegate|. |
// |constrained_delegate| is owned by the parent |views::View|. |
WebDialogDelegate* web_dialog_delegate = |
- new MediaRouterDialogDelegate(action_, weak_ptr_factory_.GetWeakPtr()); |
+ new MediaRouterDialogDelegate(weak_ptr_factory_.GetWeakPtr()); |
// |ShowConstrainedWebDialogWithAutoResize()| will end up creating |
// ConstrainedWebDialogDelegateViewViews containing a WebContents containing |
@@ -266,9 +267,11 @@ void MediaRouterDialogControllerImpl::CreateMediaRouterDialog() { |
dialog_observer_.reset(new DialogWebContentsObserver( |
media_router_dialog, this)); |
+} |
+void MediaRouterDialogControllerImpl::OnDialogClosed() { |
if (action_) |
- action_->OnPopupShown(); |
msw
2016/07/26 19:59:32
Why doesn't CreateMediaRouterDialog still call OnP
takumif
2016/07/28 20:04:11
The only thing MediaRouterAction::OnPopupShown doe
|
+ action_->OnPopupHidden(); |
} |
void MediaRouterDialogControllerImpl::Reset() { |
@@ -295,6 +298,9 @@ void MediaRouterDialogControllerImpl::OnDialogNavigated( |
media_router_dialog_pending_ = false; |
PopulateDialog(media_router_dialog); |
+ |
+ if (action_) |
+ action_->OnPopupShown(); |
} |
void MediaRouterDialogControllerImpl::PopulateDialog( |
@@ -325,4 +331,33 @@ void MediaRouterDialogControllerImpl::PopulateDialog( |
} |
} |
+bool MediaRouterDialogControllerImpl::ShowMediaRouterDialog() { |
+ if (!action_) |
+ ShowMediaRouterAction(); |
msw
2016/07/26 19:59:32
Why doesn't the MediaRouterDialogController base c
takumif
2016/07/28 20:04:12
The base class contains logic that's shared across
|
+ return MediaRouterDialogController::ShowMediaRouterDialog(); |
+} |
+ |
+void MediaRouterDialogControllerImpl::ActiveTabChanged( |
+ content::WebContents* old_contents, |
+ content::WebContents* new_contents, |
+ int index, |
+ int reason) { |
+ if (IsShowingMediaRouterDialog() && !action_) |
msw
2016/07/26 19:59:32
Can the user actually change tabs while the dialog
takumif
2016/07/28 20:04:11
Yes, the user can switch tabs while the dialog is
|
+ ShowMediaRouterAction(); |
+} |
+ |
+void MediaRouterDialogControllerImpl::ShowMediaRouterAction() { |
+ Profile* profile = |
+ Profile::FromBrowserContext(initiator()->GetBrowserContext()); |
+ if (!profile) |
+ return; |
+ |
+ ToolbarActionsModel* model = ToolbarActionsModel::Get(profile); |
+ if (model && !model->HasComponentAction( |
+ ComponentToolbarActionsFactory::kMediaRouterActionId)) { |
+ model->AddComponentAction( |
+ ComponentToolbarActionsFactory::kMediaRouterActionId); |
+ } |
+} |
+ |
} // namespace media_router |