| Index: chrome/browser/media/router/media_router_dialog_controller.cc
|
| diff --git a/chrome/browser/media/router/media_router_dialog_controller.cc b/chrome/browser/media/router/media_router_dialog_controller.cc
|
| index d9f80cc75805b71c733e0376807c6da84a604de5..e6c36dafaddf6ee54fa9782a04bcc204bd96271e 100644
|
| --- a/chrome/browser/media/router/media_router_dialog_controller.cc
|
| +++ b/chrome/browser/media/router/media_router_dialog_controller.cc
|
| @@ -4,6 +4,10 @@
|
|
|
| #include "chrome/browser/media/router/media_router_dialog_controller.h"
|
|
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/web_contents.h"
|
| +#include "content/public/browser/web_contents_delegate.h"
|
| +
|
| #if defined(OS_ANDROID)
|
| #include "chrome/browser/media/android/router/media_router_dialog_controller_android.h"
|
| #else
|
| @@ -24,4 +28,96 @@ MediaRouterDialogController::GetOrCreateForWebContents(
|
| #endif
|
| }
|
|
|
| +class MediaRouterDialogController::InitiatorWebContentsObserver
|
| + : public content::WebContentsObserver {
|
| + public:
|
| + InitiatorWebContentsObserver(
|
| + content::WebContents* web_contents,
|
| + MediaRouterDialogController* dialog_controller)
|
| + : content::WebContentsObserver(web_contents),
|
| + dialog_controller_(dialog_controller) {
|
| + DCHECK(dialog_controller_);
|
| + }
|
| +
|
| + private:
|
| + void WebContentsDestroyed() override {
|
| + // NOTE: |this| is deleted after CloseMediaRouterDialog() returns.
|
| + dialog_controller_->CloseMediaRouterDialog();
|
| + }
|
| +
|
| + void NavigationEntryCommitted(
|
| + const content::LoadCommittedDetails& load_details) override {
|
| + // NOTE: |this| is deleted after CloseMediaRouterDialog() returns.
|
| + dialog_controller_->CloseMediaRouterDialog();
|
| + }
|
| +
|
| + void RenderProcessGone(base::TerminationStatus status) override {
|
| + // NOTE: |this| is deleted after CloseMediaRouterDialog() returns.
|
| + dialog_controller_->CloseMediaRouterDialog();
|
| + }
|
| +
|
| + MediaRouterDialogController* const dialog_controller_;
|
| +};
|
| +
|
| +MediaRouterDialogController::MediaRouterDialogController(
|
| + content::WebContents* initiator)
|
| + : initiator_(initiator) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| + DCHECK(initiator_);
|
| + initiator_observer_.reset(new InitiatorWebContentsObserver(initiator_, this));
|
| +}
|
| +
|
| +MediaRouterDialogController::~MediaRouterDialogController() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +}
|
| +
|
| +bool MediaRouterDialogController::ShowMediaRouterDialogForPresentation(
|
| + scoped_ptr<CreatePresentationSessionRequest> request) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + // Check if the media router dialog exists for |initiator| and return if so.
|
| + if (IsShowingMediaRouterDialog())
|
| + return false;
|
| +
|
| + presentation_request_ = request.Pass();
|
| + CreateMediaRouterDialog();
|
| +
|
| + // Show the initiator holding the existing media router dialog.
|
| + ActivateInitiatorWebContents();
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool MediaRouterDialogController::ShowMediaRouterDialog() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + // Don't create dialog if it already exists.
|
| + bool dialog_needs_creation = !IsShowingMediaRouterDialog();
|
| + if (dialog_needs_creation)
|
| + CreateMediaRouterDialog();
|
| +
|
| + ActivateInitiatorWebContents();
|
| + return dialog_needs_creation;
|
| +}
|
| +
|
| +void MediaRouterDialogController::HideMediaRouterDialog() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + CloseMediaRouterDialog();
|
| + Reset();
|
| +}
|
| +
|
| +void MediaRouterDialogController::ActivateInitiatorWebContents() {
|
| + initiator_->GetDelegate()->ActivateContents(initiator_);
|
| +}
|
| +
|
| +scoped_ptr<CreatePresentationSessionRequest>
|
| +MediaRouterDialogController::PassPresentationRequest() {
|
| + return presentation_request_.Pass();
|
| +}
|
| +
|
| +void MediaRouterDialogController::Reset() {
|
| + initiator_observer_.reset();
|
| + presentation_request_.reset();
|
| +}
|
| +
|
| } // namespace media_router
|
|
|