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

Side by Side Diff: chrome/browser/ui/webui/media_router/media_router_ui.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: Fix unit test 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_UI_H_ 5 #ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_UI_H_
6 #define CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_UI_H_ 6 #define CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_UI_H_
7 7
8 #include <set> 8 #include <set>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 13 matching lines...) Expand all
24 24
25 namespace content { 25 namespace content {
26 class WebContents; 26 class WebContents;
27 } // namespace content 27 } // namespace content
28 28
29 namespace media_router { 29 namespace media_router {
30 30
31 class IssuesObserver; 31 class IssuesObserver;
32 class MediaRoute; 32 class MediaRoute;
33 class MediaRouter; 33 class MediaRouter;
34 class MediaRouterDialogCallbacks;
34 class MediaRouterWebUIMessageHandler; 35 class MediaRouterWebUIMessageHandler;
35 class MediaRoutesObserver; 36 class MediaRoutesObserver;
36 class MediaSink; 37 class MediaSink;
37 class MediaSinksObserver; 38 class MediaSinksObserver;
38 class CreateSessionRequest; 39 class CreatePresentationSessionRequest;
39 40
40 // Implements the chrome://media-router user interface. 41 // Implements the chrome://media-router user interface.
41 class MediaRouterUI 42 class MediaRouterUI
42 : public ConstrainedWebDialogUI, 43 : public ConstrainedWebDialogUI,
43 public QueryResultManager::Observer, 44 public QueryResultManager::Observer,
44 public PresentationServiceDelegateImpl::DefaultMediaSourceObserver { 45 public PresentationServiceDelegateImpl::DefaultMediaSourceObserver {
45 public: 46 public:
46 // |web_ui| owns this object and is used to initialize the base class. 47 // |web_ui| owns this object and is used to initialize the base class.
47 explicit MediaRouterUI(content::WebUI* web_ui); 48 explicit MediaRouterUI(content::WebUI* web_ui);
48 ~MediaRouterUI() override; 49 ~MediaRouterUI() override;
49 50
50 // Initializes internal state (e.g. starts listening for MediaSinks) for 51 // Initializes internal state (e.g. starts listening for MediaSinks) for
51 // targeting the default MediaSource (if any) of the tab. The contents of the 52 // targeting the default MediaSource (if any) of the initiator tab that owns
52 // UI will change as the default MediaSource changes. If there is a default 53 // |delegate|, as well as mirroring sources of that tab.
53 // MediaSource, then DEFAULT MediaCastMode will be added to |cast_modes_|. 54 // The contents of the UI will change as the default MediaSource changes.
54 // |source_manager|: PresentationServiceDelegateImpl of the initiator tab. 55 // If there is a default MediaSource, then DEFAULT MediaCastMode will be
55 // Must not be null. 56 // added to |cast_modes_|.
56 // Can only be called once. 57 // Init* methods can only be called once.
58 // |delegate|: PresentationServiceDelegateImpl of the initiator tab.
59 // Must not be null.
57 // TODO(imcheng): Replace use of impl with an intermediate abstract 60 // TODO(imcheng): Replace use of impl with an intermediate abstract
58 // interface. 61 // interface.
59 void InitWithDefaultMediaSource(PresentationServiceDelegateImpl* delegate); 62 void InitWithDefaultMediaSource(
63 const base::WeakPtr<PresentationServiceDelegateImpl>& delegate);
60 64
61 // Initializes internal state targeting the presentation specified in 65 // Initializes internal state targeting the presentation specified in
62 // |request|. Also sets up mirroring sources based on |initiator|. 66 // |request|. Also sets up mirroring sources based on |initiator|.
63 // This is different from |InitWithDefaultMediaSource| in that it does not 67 // This is different from |InitWithDefaultMediaSource| in that it does not
64 // listen for default media source changes, as the UI is fixed to the source 68 // listen for default media source changes, as the UI is fixed to the source
65 // in |request|. 69 // in |request|.
70 // Init* methods can only be called once.
71 // |initiator|: Reference to the WebContents that initiated the dialog.
72 // Must not be null.
73 // |presentation_request|: The presentation request. This instance will take
74 // ownership of it. Must not be null.
66 void InitWithPresentationSessionRequest( 75 void InitWithPresentationSessionRequest(
67 const content::WebContents* initiator, 76 content::WebContents* initiator,
68 scoped_ptr<CreateSessionRequest> request); 77 scoped_ptr<CreatePresentationSessionRequest> presentation_request);
69 78
70 // Closes the media router UI. 79 // Closes the media router UI.
71 void Close(); 80 void Close();
72 81
73 // Notifies this instance that the UI has been initialized. 82 // Notifies this instance that the UI has been initialized.
74 void UIInitialized(); 83 void UIInitialized();
75 84
76 // Requests a route be created from the source determined by the preferred 85 // Requests a route be created from the source determined by the preferred
77 // MediaCastMode, to the sink given by |sink_id|. 86 // MediaCastMode, to the sink given by |sink_id|.
78 // The preferred cast mode is determined from the set of currently supported 87 // The preferred cast mode is determined from the set of currently supported
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 // Called by |issues_observer_| when the top issue has changed. 127 // Called by |issues_observer_| when the top issue has changed.
119 // If the UI is already initialized, notifies |handler_| to update the UI. 128 // If the UI is already initialized, notifies |handler_| to update the UI.
120 // Ignored if the UI is not yet initialized. 129 // Ignored if the UI is not yet initialized.
121 void SetIssue(const Issue* issue); 130 void SetIssue(const Issue* issue);
122 131
123 // Called by |routes_observer_| when the set of active routes has changed. 132 // Called by |routes_observer_| when the set of active routes has changed.
124 void OnRoutesUpdated(const std::vector<MediaRoute>& routes); 133 void OnRoutesUpdated(const std::vector<MediaRoute>& routes);
125 134
126 // Callback passed to MediaRouter to receive response to route creation 135 // Callback passed to MediaRouter to receive response to route creation
127 // requests. 136 // requests.
128 void OnRouteResponseReceived(scoped_ptr<MediaRoute> route, 137 void OnRouteResponseReceived(const MediaRoute* route,
129 const std::string& error); 138 const std::string& error);
130 139
131 bool DoCreateRoute(const MediaSink::Id& sink_id, MediaCastMode cast_mode); 140 bool DoCreateRoute(const MediaSink::Id& sink_id, MediaCastMode cast_mode);
132 141
133 // Sets the source host name to be displayed in the UI. 142 // Sets the source host name to be displayed in the UI.
134 // Gets cast modes from |query_result_manager_| and forwards it to UI. 143 // Gets cast modes from |query_result_manager_| and forwards it to UI.
135 // One of the Init* functions must have been called before. 144 // One of the Init* functions must have been called before.
136 void UpdateSourceHostAndCastModes(const GURL& frame_url); 145 void UpdateSourceHostAndCastModes(const GURL& frame_url);
137 146
138 // Initializes the dialog with mirroring sources derived from |initiator|, 147 // Initializes the dialog with mirroring sources derived from |initiator|,
139 // and optional |default_source| and |default_frame_url| if any. 148 // and optional |default_source| and |default_frame_url| if any.
140 void InitCommon(const content::WebContents* initiator, 149 void InitCommon(content::WebContents* initiator,
141 const MediaSource& default_source, 150 const MediaSource& default_source,
142 const GURL& default_frame_url); 151 const GURL& default_frame_url);
143 152
144 // Invoke presentation callbacks based on |route| and |error| if the dialog
145 // was created for Presentation API.
146 void HandleRouteResponseForPresentation(const MediaRoute* route,
147 const std::string& error);
148
149 // PresentationServiceDelegateImpl::DefaultMediaSourceObserver 153 // PresentationServiceDelegateImpl::DefaultMediaSourceObserver
150 void OnDefaultMediaSourceChanged(const MediaSource& source, 154 void OnDefaultMediaSourceChanged(const MediaSource& source,
151 const GURL& frame_url) override; 155 const GURL& frame_url) override;
152 156
153 // Owned by the |web_ui| passed in the ctor, and guaranteed to be deleted 157 // Owned by the |web_ui| passed in the ctor, and guaranteed to be deleted
154 // only after it has deleted |this|. 158 // only after it has deleted |this|.
155 MediaRouterWebUIMessageHandler* handler_; 159 MediaRouterWebUIMessageHandler* handler_;
156 160
157 // These are non-null while this instance is registered to receive 161 // These are non-null while this instance is registered to receive
158 // updates from them. 162 // updates from them.
159 scoped_ptr<IssuesObserver> issues_observer_; 163 scoped_ptr<IssuesObserver> issues_observer_;
160 scoped_ptr<MediaRoutesObserver> routes_observer_; 164 scoped_ptr<MediaRoutesObserver> routes_observer_;
161 165
162 // Set to true by |handler_| when the UI has been initialized. 166 // Set to true by |handler_| when the UI has been initialized.
163 bool ui_initialized_; 167 bool ui_initialized_;
164 168
165 // Set to |true| if there is a pending route request for this UI. 169 // Set to |true| if there is a pending route request for this UI.
166 bool has_pending_route_request_; 170 bool has_pending_route_request_;
167 171
168 bool requesting_route_for_default_source_; 172 bool requesting_route_for_default_source_;
169 173
170 std::vector<MediaSinkWithCastModes> sinks_; 174 std::vector<MediaSinkWithCastModes> sinks_;
171 std::vector<MediaRoute> routes_; 175 std::vector<MediaRoute> routes_;
172 CastModeSet cast_modes_; 176 CastModeSet cast_modes_;
173 GURL frame_url_; 177 GURL frame_url_;
174 178
175 scoped_ptr<QueryResultManager> query_result_manager_; 179 scoped_ptr<QueryResultManager> query_result_manager_;
176 180
177 // Only set if the UI is created as a result of Presentation API. 181 // If set, then the result of the next presentation route request will
178 scoped_ptr<CreateSessionRequest> presentation_session_request_; 182 // be handled by this object.
183 scoped_ptr<CreatePresentationSessionRequest> presentation_request_;
179 184
180 // It's possible for PresentationServiceDelegateImpl to be destroyed before 185 // It's possible for PresentationServiceDelegateImpl to be destroyed before
181 // this class. 186 // this class.
182 // (e.g. if a tab with the UI open is closed, then the tab WebContents will 187 // (e.g. if a tab with the UI open is closed, then the tab WebContents will
183 // be destroyed first momentarily before the UI WebContents). 188 // be destroyed first momentarily before the UI WebContents).
184 // Holding a WeakPtr to PresentationServiceDelegateImpl is the cleanest way to 189 // Holding a WeakPtr to PresentationServiceDelegateImpl is the cleanest way to
185 // handle this. 190 // handle this.
186 // TODO(imcheng): hold a weak ptr to an abstract type instead. 191 // TODO(imcheng): hold a weak ptr to an abstract type instead.
187 base::WeakPtr<PresentationServiceDelegateImpl> presentation_service_delegate_; 192 base::WeakPtr<PresentationServiceDelegateImpl> presentation_service_delegate_;
188 193
189 const content::WebContents* initiator_; 194 content::WebContents* initiator_;
190 195
191 // Cached pointer to the MediaRouter for this instance's BrowserContext. 196 // Cached pointer to the MediaRouter for this instance's BrowserContext.
192 MediaRouter* router_; 197 MediaRouter* router_;
193 198
194 // NOTE: Weak pointers must be invalidated before all other member variables. 199 // NOTE: Weak pointers must be invalidated before all other member variables.
195 // Therefore |weak_factory_| must be placed at the end. 200 // Therefore |weak_factory_| must be placed at the end.
196 base::WeakPtrFactory<MediaRouterUI> weak_factory_; 201 base::WeakPtrFactory<MediaRouterUI> weak_factory_;
197 202
198 DISALLOW_COPY_AND_ASSIGN(MediaRouterUI); 203 DISALLOW_COPY_AND_ASSIGN(MediaRouterUI);
199 }; 204 };
200 205
201 } // namespace media_router 206 } // namespace media_router
202 207
203 #endif // CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_UI_H_ 208 #endif // CHROME_BROWSER_UI_WEBUI_MEDIA_ROUTER_MEDIA_ROUTER_UI_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698