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..b79ef717157dc4d2e67b3c0da8a3e36a8d0507d5 100644 |
--- a/chrome/browser/media/router/media_router_dialog_controller.cc |
+++ b/chrome/browser/media/router/media_router_dialog_controller.cc |
@@ -4,6 +4,9 @@ |
#include "chrome/browser/media/router/media_router_dialog_controller.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 +27,75 @@ 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) { |
+ } |
imcheng
2015/07/23 00:41:14
DCHECK(dialog_controller_);
whywhat
2015/07/23 21:20:09
Done.
|
+ |
+ 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(initiator_); |
+} |
+ |
+MediaRouterDialogController::~MediaRouterDialogController() { |
+} |
+ |
+void MediaRouterDialogController::ActivateInitiatorWebContents() { |
+ DCHECK(initiator_); |
imcheng
2015/07/23 00:41:14
DCHECK not needed as it is already done in ctor.
whywhat
2015/07/23 21:20:09
Done.
|
+ initiator_->GetDelegate()->ActivateContents(initiator_); |
+} |
+ |
+void MediaRouterDialogController::CloseMediaRouterDialog() { |
imcheng
2015/07/23 00:41:14
isn't this function pure virtual?
whywhat
2015/07/23 21:20:09
Yep, changed that.
|
+ DCHECK(initiator_observer_.get()); |
+ Reset(); |
+} |
+ |
+void MediaRouterDialogController::CreateMediaRouterDialog() { |
+ DCHECK(!initiator_observer_.get()); |
+ initiator_observer_.reset(new InitiatorWebContentsObserver( |
imcheng
2015/07/23 00:41:13
This function doesn't create the dialog - how abou
whywhat
2015/07/23 21:20:09
Done.
|
+ initiator_, this)); |
+} |
+ |
+void MediaRouterDialogController::SetPresentationRequest( |
imcheng
2015/07/23 00:41:14
nit: TakePresentationRequest ?
whywhat
2015/07/23 21:20:09
Done.
|
+ scoped_ptr<CreatePresentationSessionRequest> request) { |
+ presentation_request_ = request.Pass(); |
+} |
+ |
+scoped_ptr<CreatePresentationSessionRequest> |
+MediaRouterDialogController::PassPresentationRequest() { |
+ return presentation_request_.Pass(); |
+} |
+ |
+void MediaRouterDialogController::Reset() { |
+ DCHECK(initiator_observer_.get()); |
+ initiator_observer_.reset(); |
+ presentation_request_.reset(); |
+} |
+ |
} // namespace media_router |