Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Unified Diff: chrome/browser/ui/webui/media_router/media_router_dialog_controller.h

Issue 1224093004: [Media Router] 2nd take on fix route response callback lifetime in UI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/ui/webui/media_router/media_router_dialog_controller.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/webui/media_router/media_router_dialog_controller.h
diff --git a/chrome/browser/ui/webui/media_router/media_router_dialog_controller.h b/chrome/browser/ui/webui/media_router/media_router_dialog_controller.h
index f357d00bb173adb44d65fe467591b1280f31dc7a..e77ea43c87f36c7cfe49e44db1f1367599c9d001 100644
--- a/chrome/browser/ui/webui/media_router/media_router_dialog_controller.h
+++ b/chrome/browser/ui/webui/media_router/media_router_dialog_controller.h
@@ -6,12 +6,15 @@
#define CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_DIALOG_CONTROLLER_H_
#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
#include "chrome/browser/media/router/create_session_request.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
namespace media_router {
+class PresentationServiceDelegateImpl;
+
// An instance of this class is tied to a WebContents known as the initiator,
// and is lazily created when a Media Router dialog needs to be shown.
// The MediaRouterDialogController allows creating, querying, and removing a
@@ -89,6 +92,103 @@ class MediaRouterDialogController
DISALLOW_COPY_AND_ASSIGN(MediaRouterDialogController);
};
+// Class used by the Media Router dialog to signal route response and dialog
+// destruction. In addition, it contains logic for handling Presentation API
+// startSession requests and ondefaultsessionstart event handler. As such, this
+// class can be used for both Presentation-API-initiated and browser-initiated
+// dialogs.
+// Instances of this class correspond 1:1 with Media Router dialogs and are
+// self-managed.
+// An instance will get notified in the following cases:
+// (1) When the response of a Media Router route request initiated from the
+// dialog arrives.
+// (2) When the dialog is being destroyed.
+// There is also an API for the dialog to attach additional listeners for (1),
+// e.g., to update the UI on route response.
+// Instances are self-managed and generally have the same lifetime as the
+// dialog (i.e., they delete themselves in (2)), but will outlive the dialog
+// if there is a pending route request at the time of dialog destruction.
+// In that case, the instance will be destroyed on the next invocation of (1),
+// which is assumed to always happen eventually.
+// It also assumes that the dialog will not make concurrent route requests
+// (That is, it will wait to make the next route request until a response has
+// come back).
+class MediaRouterDialogCallbacks {
+ public:
+ using DialogRouteResponseCallback =
+ base::Callback<void(const MediaRoute*, const std::string&)>;
+
+ // Constructs an instance without a presentation request. Used for
+ // browser-initiated dialogs.
+ // |delegate|: PresentationServiceDelegateImpl instance corresponding to the
+ // initiator tab. Used for notifying ondefaultsessionstart event.
+ explicit MediaRouterDialogCallbacks(
+ const base::WeakPtr<PresentationServiceDelegateImpl>& delegate);
haibinlu 2015/07/09 21:45:59 per offline discussion, it is clearer to pass in w
imcheng 2015/07/09 22:22:29 Done. To do that, I needed to make sure initiator
+ // Used for Presentation-API-initiated dialogs.
+ // |presentation_request|: The Presentation API startSession request.
+ // |delegate|: PresentationServiceDelegateImpl instance corresponding to the
+ // initiator tab. Used for notifying ondefaultsessionstart event.
+ MediaRouterDialogCallbacks(
+ scoped_ptr<CreateSessionRequest> presentation_request,
+ const base::WeakPtr<PresentationServiceDelegateImpl>& delegate);
+
+ ~MediaRouterDialogCallbacks();
+
+ // Attaches |callback| to be invoked when |OnRouteResponseReceived| is
+ // invoked.
+ void SetRouteResponseCallback(const DialogRouteResponseCallback& callback);
+
+ // Invoked when the corresponding Media Router dialog is being destroyed.
+ // If there is a Presentation API request and there is no pending presentation
+ // route response, the request will be rejected.
+ // |has_pending_presentation_response|: True if there is a pending
+ // presentation route response from the MediaRouter. If true, this instance
+ // will continue existing until the route response comes back. Otherwise, it
+ // will be destroyed at the end of this method.
+ void OnDialogDestroyed(bool has_pending_presentation_response);
+
+ // Invoked when a route response for a Media Router route request initiated
+ // from the
+ // corresponding Media Router dialog comes back.
+ // If the response was for a presentationthere is a Presentation API request,
+ // two things can happen:
+ // (1) If there is a Presentation API request, then the request will be
+ // resolved/rejected accordingly.
+ // (2) Otherwise, if route response was a success, then
+ // PresentationServiceDelegateImpl will be notified that a browser-initiated
+ // presentation has started.
+ // If |route_response_cb_| is set, it will be invoked with the response.
+ // Finally, if the response arrived after the dialog has been destroyed, then
+ // this instance will be destroyed at the end of this method.
haibinlu 2015/07/09 21:45:59 If UX wants enabling multiple launch simultaneousl
imcheng 2015/07/09 22:22:29 UX mentioned that they will only allow one at a ti
+ void OnRouteResponseReceived(bool is_presentation,
+ scoped_ptr<MediaRoute> route,
+ const std::string& error);
+
+ base::WeakPtr<MediaRouterDialogCallbacks> GetWeakPtr();
+
+ const CreateSessionRequest* presentation_request() const {
+ return presentation_request_.get();
+ }
+
+ void set_route_response_cb(const DialogRouteResponseCallback& callback) {
+ route_response_cb_ = callback;
+ }
+
+ private:
+ void HandleRouteResponseForPresentation(const MediaRoute* route,
+ const std::string& error);
+
+ DialogRouteResponseCallback route_response_cb_;
+ scoped_ptr<CreateSessionRequest> presentation_request_;
+ bool pending_presentation_response_after_dialog_destroyed_;
+
+ base::WeakPtr<PresentationServiceDelegateImpl> presentation_service_delegate_;
+
+ base::WeakPtrFactory<MediaRouterDialogCallbacks> weak_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(MediaRouterDialogCallbacks);
+};
+
} // namespace media_router
#endif // CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_DIALOG_CONTROLLER_H_
« no previous file with comments | « no previous file | chrome/browser/ui/webui/media_router/media_router_dialog_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698