Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/media/router/presentation_service_delegate_impl.h" | |
| 6 | |
| 7 #include <string> | |
| 8 | |
| 9 #include "base/containers/scoped_ptr_hash_map.h" | |
| 10 #include "base/guid.h" | |
| 11 #include "base/strings/string_util.h" | |
| 12 #include "base/strings/stringprintf.h" | |
| 13 #include "chrome/browser/media/router/create_session_request.h" | |
| 14 #include "chrome/browser/media/router/media_route.h" | |
| 15 #include "chrome/browser/media/router/media_router.h" | |
| 16 #include "chrome/browser/media/router/media_sink.h" | |
| 17 #include "chrome/browser/media/router/media_source_helper.h" | |
| 18 #include "chrome/browser/media/router/presentation_helper.h" | |
| 19 #include "chrome/browser/media/router/presentation_media_sinks_observer.h" | |
| 20 #include "chrome/browser/sessions/session_tab_helper.h" | |
| 21 #include "content/public/browser/presentation_screen_availability_listener.h" | |
| 22 #include "content/public/browser/presentation_session.h" | |
| 23 #include "content/public/browser/render_frame_host.h" | |
| 24 #include "content/public/browser/render_process_host.h" | |
| 25 | |
| 26 DEFINE_WEB_CONTENTS_USER_DATA_KEY( | |
| 27 media_router::PresentationServiceDelegateImpl); | |
| 28 | |
| 29 using content::RenderFrameHost; | |
| 30 | |
| 31 namespace media_router { | |
| 32 | |
| 33 namespace { | |
| 34 | |
| 35 // Helper function to extract ID for a RFH. | |
|
Wez
2015/05/27 22:37:51
RFH->RenderFrameHost.
Suggest: "Returns the uniqu
haibinlu
2015/05/28 21:44:02
Done.
| |
| 36 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* rfh) { | |
|
Wez
2015/05/27 22:37:51
nit: rfh->render_view_host
haibinlu
2015/05/28 21:44:02
Done.
| |
| 37 int render_process_id = rfh->GetProcess()->GetID(); | |
| 38 int render_frame_id = rfh->GetRoutingID(); | |
| 39 return RenderFrameHostId(render_process_id, render_frame_id); | |
| 40 } | |
| 41 | |
| 42 // Gets the host name associated with the frame given by |rfh_id|. | |
|
Wez
2015/05/27 22:37:50
I think you need to be more specific about what th
haibinlu
2015/05/28 21:44:02
Done.
| |
| 43 std::string GetSourceHostForFrame(RenderFrameHostId rfh_id) { | |
|
Wez
2015/05/27 22:37:50
nit: render_view_host_id
haibinlu
2015/05/28 21:44:03
Done.
| |
| 44 RenderFrameHost* rfh = RenderFrameHost::FromID(rfh_id.first, rfh_id.second); | |
|
Wez
2015/05/27 22:37:50
nit: render_view_host
haibinlu
2015/05/28 21:44:03
Done.
| |
| 45 DCHECK(rfh); | |
|
Wez
2015/05/27 22:37:51
Don't DCHECK |rfh| here - you're dereferencing it
haibinlu
2015/05/28 21:44:02
Done.
| |
| 46 std::string host = rfh->GetLastCommittedURL().host(); | |
| 47 if (StartsWithASCII(host, "www.", false)) | |
| 48 host = host.substr(4); | |
| 49 return host; | |
| 50 } | |
| 51 | |
| 52 } // namespace | |
| 53 | |
| 54 // Helper class for PresentationServiceDelegateImpl to manage | |
|
Wez
2015/05/27 22:37:51
nit: No need for "Helper class..." intro - suggest
haibinlu
2015/05/28 21:44:04
Done.
| |
| 55 // listeners and default presentation info in a render frame. | |
| 56 class PresentationFrame final { | |
|
Wez
2015/05/27 22:37:49
We rarely use "final" in Chromium code, AFAIK, and
haibinlu
2015/05/28 21:44:02
Removed "final". If it is in anonymous namespace,
| |
| 57 public: | |
| 58 using DelegateObserver = content::PresentationServiceDelegate::Observer; | |
| 59 | |
| 60 PresentationFrame(content::WebContents* web_contents, MediaRouter* router); | |
| 61 ~PresentationFrame(); | |
| 62 | |
| 63 // Returns true if listener was added. | |
|
Wez
2015/05/27 22:37:50
It looks like these APIs mirror corresponding APIs
haibinlu
2015/05/28 21:44:04
Mostly mirror PresentationFrameManager API. Update
| |
| 64 bool AddScreenAvailabilityListener( | |
| 65 content::PresentationScreenAvailabilityListener* listener); | |
| 66 | |
| 67 // Returns true if listener was removed. | |
| 68 bool RemoveScreenAvailabilityListener( | |
| 69 content::PresentationScreenAvailabilityListener* listener); | |
| 70 | |
| 71 // Returns true if there is a listener for |source_id|. | |
| 72 bool HasScreenAvailabilityListenerForTest( | |
| 73 const MediaSourceId& source_id) const; | |
| 74 | |
| 75 // Returns the number of screen-availability listeners. | |
|
Wez
2015/05/27 22:37:50
nit: Why does Has*ForTest() take a |source_id| but
haibinlu
2015/05/28 21:44:03
method removed. Checked the presentation API, ther
| |
| 76 int NumScreenAvailabilityListeners() const; | |
| 77 | |
| 78 // Sets the default presentation URL and ID. | |
|
Wez
2015/05/27 22:37:50
nit: This comment adds nothing!
haibinlu
2015/05/28 21:44:03
removed
| |
| 79 void SetDefaultPresentationInfo(const std::string& default_presentation_url, | |
| 80 const std::string& default_presentation_id); | |
| 81 | |
| 82 // Returns empty string if no default presentation ID is set. | |
| 83 std::string GetDefaultPresentationId() const; | |
|
Wez
2015/05/27 22:37:50
nit: Blank line after this.
haibinlu
2015/05/28 21:44:03
Acknowledged.
| |
| 84 void set_delegate_observer(DelegateObserver* observer) { | |
| 85 delegate_observer_ = observer; | |
| 86 } | |
| 87 DelegateObserver* delegate_observer() const { return delegate_observer_; } | |
| 88 | |
| 89 void Reset(); | |
| 90 void OnDelegateDestroyed(); | |
|
Wez
2015/05/27 22:37:49
nit: Add comments to explain these.
haibinlu
2015/05/28 21:44:03
method removed
| |
| 91 | |
| 92 private: | |
| 93 MediaSource GetMediaSourceFromListener( | |
| 94 content::PresentationScreenAvailabilityListener* listener); | |
| 95 | |
| 96 scoped_ptr<content::PresentationSessionInfo> default_presentation_info_; | |
| 97 base::ScopedPtrHashMap<MediaSourceId, scoped_ptr<MediaSinksObserver>> | |
| 98 sink_observers_; | |
| 99 | |
| 100 // Does not own these objects. | |
|
Wez
2015/05/27 22:37:50
nit: Suggest "References to the owning WebContents
haibinlu
2015/05/28 21:44:02
Done.
| |
| 101 const content::WebContents* web_contents_; | |
| 102 MediaRouter* router_; | |
| 103 DelegateObserver* delegate_observer_; | |
| 104 }; | |
| 105 | |
| 106 PresentationFrame::PresentationFrame(content::WebContents* web_contents, | |
| 107 MediaRouter* router) | |
| 108 : web_contents_(web_contents), | |
| 109 router_(router), | |
| 110 delegate_observer_(nullptr) { | |
| 111 DCHECK(web_contents_); | |
| 112 DCHECK(router_); | |
| 113 } | |
| 114 | |
| 115 PresentationFrame::~PresentationFrame() { | |
| 116 DCHECK(sink_observers_.empty()); | |
| 117 } | |
| 118 | |
| 119 bool PresentationFrame::AddScreenAvailabilityListener( | |
| 120 content::PresentationScreenAvailabilityListener* listener) { | |
| 121 MediaSource source(GetMediaSourceFromListener(listener)); | |
| 122 if (sink_observers_.contains(source.id())) | |
|
Wez
2015/05/27 22:37:51
This doesn't look like it'll behave as intended if
haibinlu
2015/05/28 21:44:02
method updated. Checked the presentation API, ther
| |
| 123 return false; | |
| 124 | |
| 125 return sink_observers_.add(source.id(), | |
| 126 make_scoped_ptr(new PresentationMediaSinksObserver( | |
| 127 router_, listener, source))).second; | |
|
Wez
2015/05/27 22:37:51
This is weird - why are you returning .second? How
haibinlu
2015/05/28 21:44:03
Updated to 'Setter'
| |
| 128 } | |
| 129 | |
| 130 bool PresentationFrame::RemoveScreenAvailabilityListener( | |
| 131 content::PresentationScreenAvailabilityListener* listener) { | |
| 132 MediaSource source(GetMediaSourceFromListener(listener)); | |
|
Wez
2015/05/27 22:37:50
Do you need to check that the registered listener
haibinlu
2015/05/28 21:44:03
Done.
| |
| 133 return sink_observers_.erase(source.id()) == 1; | |
| 134 } | |
| 135 | |
| 136 bool PresentationFrame::HasScreenAvailabilityListenerForTest( | |
| 137 const MediaSourceId& source_id) const { | |
| 138 return sink_observers_.contains(source_id); | |
| 139 } | |
| 140 | |
| 141 int PresentationFrame::NumScreenAvailabilityListeners() const { | |
| 142 return sink_observers_.size(); | |
| 143 } | |
| 144 | |
| 145 void PresentationFrame::Reset() { | |
| 146 sink_observers_.clear(); | |
| 147 default_presentation_info_.reset(); | |
| 148 } | |
| 149 | |
| 150 void PresentationFrame::OnDelegateDestroyed() { | |
| 151 if (delegate_observer_) { | |
| 152 delegate_observer_->OnDelegateDestroyed(); | |
| 153 } | |
| 154 } | |
| 155 | |
| 156 void PresentationFrame::SetDefaultPresentationInfo( | |
| 157 const std::string& default_presentation_url, | |
| 158 const std::string& default_presentation_id) { | |
| 159 if (default_presentation_url.empty() && default_presentation_id.empty()) { | |
| 160 default_presentation_info_.reset(); | |
| 161 } else { | |
| 162 default_presentation_info_.reset(new content::PresentationSessionInfo( | |
| 163 default_presentation_url, default_presentation_id)); | |
| 164 } | |
| 165 } | |
| 166 | |
| 167 std::string PresentationFrame::GetDefaultPresentationId() const { | |
| 168 return default_presentation_info_ | |
| 169 ? default_presentation_info_->presentation_id | |
| 170 : ""; | |
|
Wez
2015/05/27 22:37:49
nit: I think this would read more clearly as if(..
haibinlu
2015/05/28 21:44:03
Done.
| |
| 171 } | |
| 172 | |
| 173 MediaSource PresentationFrame::GetMediaSourceFromListener( | |
| 174 content::PresentationScreenAvailabilityListener* listener) { | |
| 175 // If the default presentation URL is empty then fall back to 1-UA mode, | |
| 176 // i.e. offscreeen tab rendering. | |
|
Wez
2015/05/27 22:37:50
typo: offscreen
Do we have off-screen tab renderi
haibinlu
2015/05/28 21:44:04
Off-screen tab mirroring is not hooked up. Updated
| |
| 177 std::string presentation_url(listener->GetPresentationUrl()); | |
| 178 return presentation_url.empty() | |
| 179 ? ForTabMediaSource(SessionTabHelper::IdForTab(web_contents_)) | |
| 180 : ForPresentationUrl(presentation_url); | |
| 181 } | |
| 182 | |
| 183 // Helper class for PresentationServiceDelegateImpl to manage | |
| 184 // PresentationFrames. | |
|
Wez
2015/05/27 22:37:50
nit: As above, clarify in this comment what it mea
haibinlu
2015/05/28 21:44:03
Done.
| |
| 185 class PresentationFrameMap final { | |
|
Wez
2015/05/27 22:37:49
Suggest PresentationFrameManager rather than Map -
haibinlu
2015/05/28 21:44:04
Done.
| |
| 186 public: | |
| 187 using DelegateObserver = content::PresentationServiceDelegate::Observer; | |
| 188 | |
| 189 PresentationFrameMap(content::WebContents* web_contents, MediaRouter* router); | |
| 190 ~PresentationFrameMap(); | |
| 191 | |
| 192 // Returns true if listener was added. | |
|
Wez
2015/05/27 22:37:51
See above re having a block comment to indicate th
haibinlu
2015/05/28 21:44:02
Done.
| |
| 193 bool AddScreenAvailabilityListener( | |
| 194 const RenderFrameHostId& rfh_id, | |
|
Wez
2015/05/27 22:37:51
render_view_host_id here and elsewhere
haibinlu
2015/05/28 21:44:04
Done.
| |
| 195 content::PresentationScreenAvailabilityListener* listener); | |
| 196 | |
| 197 // Returns true if listener was removed. | |
| 198 bool RemoveScreenAvailabilityListener( | |
| 199 const RenderFrameHostId& rfh_id, | |
| 200 content::PresentationScreenAvailabilityListener* listener); | |
| 201 | |
| 202 // Returns true if there is a listener for |source_id| in the frame. | |
| 203 bool HasScreenAvailabilityListenerForTest( | |
| 204 const RenderFrameHostId& rfh_id, | |
| 205 const MediaSourceId& source_id) const; | |
| 206 | |
| 207 // Returns the number of screen-availability listeners. | |
| 208 int NumScreenAvailabilityListeners() const; | |
| 209 | |
| 210 // Returns the default presentation URL and ID for the frame. | |
| 211 void SetDefaultPresentationInfo(const RenderFrameHostId& rfh_id, | |
| 212 const std::string& default_presentation_url, | |
| 213 const std::string& default_presentation_id); | |
| 214 | |
| 215 // Returns empty string if no default presentation ID is set in the frame. | |
| 216 std::string GetDefaultPresentationId(const RenderFrameHostId& rfh_id) const; | |
| 217 | |
| 218 void RegisterPresenationFrame(const RenderFrameHostId& rfh_id, | |
|
Wez
2015/05/27 22:37:50
typo: RegisterPresentationFrame, and Unregister
D
haibinlu
2015/05/28 21:44:03
Registers a presentation frame and adds an observe
| |
| 219 DelegateObserver* observer); | |
| 220 void UnregisterPresenationFrame(const RenderFrameHostId& rfh_id); | |
| 221 | |
| 222 DelegateObserver* GetDelegateObserver(const RenderFrameHostId& rfh_id) const; | |
| 223 | |
| 224 void Reset(const RenderFrameHostId& rfh_id); | |
| 225 void OnDelegateDestroyed(); | |
|
Wez
2015/05/27 22:37:51
OnDelegatesDestroyed(), since this applies to all
haibinlu
2015/05/28 21:44:03
The delegate means PresentationServiceDelegateImpl
| |
| 226 void SetMediaRouterForTest(MediaRouter* router); | |
| 227 | |
| 228 private: | |
| 229 PresentationFrame* GetOrAddFrame(const RenderFrameHostId& rfh_id); | |
| 230 | |
| 231 // Maps a frame identifier to a PresentationFrame object for frames | |
| 232 // that are using presentation API. | |
| 233 base::ScopedPtrHashMap<RenderFrameHostId, scoped_ptr<PresentationFrame>> | |
| 234 presentation_frames_; | |
| 235 | |
| 236 // Does not own these two objects. | |
|
Wez
2015/05/27 22:37:51
nit: See elsewhere re wording these comments.
haibinlu
2015/05/28 21:44:03
Done.
| |
| 237 MediaRouter* router_; | |
| 238 content::WebContents* web_contents_; | |
| 239 }; | |
| 240 | |
| 241 PresentationFrameMap::PresentationFrameMap(content::WebContents* web_contents, | |
| 242 MediaRouter* router) | |
| 243 : router_(router), web_contents_(web_contents) { | |
| 244 DCHECK(web_contents_); | |
|
Wez
2015/05/27 22:37:50
nit: DCHECK(router_)?
haibinlu
2015/05/28 21:44:04
cannot do this check now. Need to Derek's CL for M
| |
| 245 } | |
| 246 | |
| 247 PresentationFrameMap::~PresentationFrameMap() { | |
| 248 } | |
| 249 | |
| 250 bool PresentationFrameMap::AddScreenAvailabilityListener( | |
| 251 const RenderFrameHostId& rfh_id, | |
| 252 content::PresentationScreenAvailabilityListener* listener) { | |
| 253 DCHECK(listener); | |
| 254 if (NumScreenAvailabilityListeners() >= | |
| 255 PresentationServiceDelegateImpl::kMaxNumSources) { | |
| 256 return false; | |
| 257 } | |
| 258 | |
| 259 auto presentation_frame = GetOrAddFrame(rfh_id); | |
| 260 return presentation_frame->AddScreenAvailabilityListener(listener); | |
| 261 } | |
| 262 | |
| 263 bool PresentationFrameMap::RemoveScreenAvailabilityListener( | |
| 264 const RenderFrameHostId& rfh_id, | |
| 265 content::PresentationScreenAvailabilityListener* listener) { | |
| 266 DCHECK(listener); | |
| 267 auto presentation_frame = presentation_frames_.get(rfh_id); | |
| 268 return presentation_frame && | |
| 269 presentation_frame->RemoveScreenAvailabilityListener(listener); | |
| 270 } | |
| 271 | |
| 272 bool PresentationFrameMap::HasScreenAvailabilityListenerForTest( | |
| 273 const RenderFrameHostId& rfh_id, | |
| 274 const MediaSourceId& source_id) const { | |
| 275 auto presentation_frame = presentation_frames_.get(rfh_id); | |
| 276 return presentation_frame && | |
| 277 presentation_frame->HasScreenAvailabilityListenerForTest(source_id); | |
| 278 } | |
| 279 | |
| 280 int PresentationFrameMap::NumScreenAvailabilityListeners() const { | |
| 281 int count = 0; | |
| 282 for (const auto& pf : presentation_frames_) { | |
|
Wez
2015/05/27 22:37:50
nit: pf -> frame
haibinlu
2015/05/28 21:44:03
method updated. with one screen listener per frame
| |
| 283 count += pf.second->NumScreenAvailabilityListeners(); | |
| 284 } | |
| 285 return count; | |
| 286 } | |
| 287 | |
| 288 void PresentationFrameMap::SetDefaultPresentationInfo( | |
| 289 const RenderFrameHostId& rfh_id, | |
| 290 const std::string& default_presentation_url, | |
| 291 const std::string& default_presentation_id) { | |
| 292 auto presentation_frame = GetOrAddFrame(rfh_id); | |
| 293 presentation_frame->SetDefaultPresentationInfo(default_presentation_url, | |
| 294 default_presentation_id); | |
| 295 } | |
| 296 | |
| 297 std::string PresentationFrameMap::GetDefaultPresentationId( | |
| 298 const RenderFrameHostId& rfh_id) const { | |
| 299 auto presentation_frame = presentation_frames_.get(rfh_id); | |
| 300 return presentation_frame ? presentation_frame->GetDefaultPresentationId() | |
| 301 : ""; | |
|
Wez
2015/05/27 22:37:49
nit: May be clearer as if (...) return x; return y
haibinlu
2015/05/28 21:44:04
Done.
| |
| 302 } | |
| 303 | |
| 304 void PresentationFrameMap::RegisterPresenationFrame( | |
| 305 const RenderFrameHostId& rfh_id, | |
| 306 content::PresentationServiceDelegate::Observer* observer) { | |
| 307 auto presentation_frame = GetOrAddFrame(rfh_id); | |
| 308 presentation_frame->set_delegate_observer(observer); | |
| 309 } | |
| 310 | |
| 311 void PresentationFrameMap::UnregisterPresenationFrame( | |
| 312 const RenderFrameHostId& rfh_id) { | |
| 313 presentation_frames_.erase(rfh_id); | |
| 314 } | |
| 315 | |
| 316 PresentationFrameMap::DelegateObserver* | |
| 317 PresentationFrameMap::GetDelegateObserver(const RenderFrameHostId& rfh_id) const { | |
| 318 auto presentation_frame = presentation_frames_.get(rfh_id); | |
| 319 return presentation_frame ? presentation_frame->delegate_observer() : nullptr; | |
| 320 } | |
| 321 | |
| 322 void PresentationFrameMap::Reset(const RenderFrameHostId& rfh_id) { | |
| 323 auto presentation_frame = presentation_frames_.get(rfh_id); | |
| 324 if (presentation_frame) | |
| 325 presentation_frame->Reset(); | |
| 326 } | |
| 327 | |
| 328 void PresentationFrameMap::OnDelegateDestroyed() { | |
| 329 for (auto& kv : presentation_frames_) | |
|
Wez
2015/05/27 22:37:49
nit: kv -> frame
haibinlu
2015/05/28 21:44:03
Done.
| |
| 330 kv.second->OnDelegateDestroyed(); | |
| 331 } | |
| 332 | |
| 333 PresentationFrame* PresentationFrameMap::GetOrAddFrame( | |
| 334 const RenderFrameHostId& rfh_id) { | |
| 335 if (!presentation_frames_.contains(rfh_id)) { | |
| 336 presentation_frames_.add( | |
| 337 rfh_id, scoped_ptr<PresentationFrame>( | |
| 338 new PresentationFrame(web_contents_, router_))); | |
| 339 } | |
| 340 return presentation_frames_.get(rfh_id); | |
| 341 } | |
| 342 | |
| 343 void PresentationFrameMap::SetMediaRouterForTest(MediaRouter* router) { | |
| 344 router_ = router; | |
| 345 } | |
| 346 | |
| 347 // TODO(haibinlu): Get router from MediaRouterMojoImplFactory once it lands. | |
|
Wez
2015/05/27 22:37:49
Add bug # for that change
haibinlu
2015/05/28 21:44:03
Done.
| |
| 348 PresentationServiceDelegateImpl::PresentationServiceDelegateImpl( | |
| 349 content::WebContents* web_contents) | |
| 350 : frame_map_(new PresentationFrameMap(web_contents, nullptr)), | |
| 351 web_contents_(web_contents), | |
| 352 router_(NULL), | |
|
Wez
2015/05/27 22:37:51
nullptr
haibinlu
2015/05/28 21:44:04
Done.
| |
| 353 weak_factory_(this) { | |
| 354 } | |
| 355 | |
| 356 PresentationServiceDelegateImpl::~PresentationServiceDelegateImpl() { | |
| 357 frame_map_->OnDelegateDestroyed(); | |
|
Wez
2015/05/27 22:37:50
Given that |frame_map_| is about to be destroyed a
haibinlu
2015/05/28 21:44:04
Done.
| |
| 358 } | |
| 359 | |
| 360 void PresentationServiceDelegateImpl::AddObserver( | |
| 361 int render_process_id, | |
| 362 int render_frame_id, | |
| 363 content::PresentationServiceDelegate::Observer* observer) { | |
| 364 DCHECK(observer); | |
| 365 frame_map_->RegisterPresenationFrame( | |
| 366 RenderFrameHostId(render_process_id, render_frame_id), observer); | |
| 367 } | |
| 368 | |
| 369 void PresentationServiceDelegateImpl::RemoveObserver(int render_process_id, | |
| 370 int render_frame_id) { | |
| 371 frame_map_->UnregisterPresenationFrame( | |
| 372 RenderFrameHostId(render_process_id, render_frame_id)); | |
| 373 } | |
| 374 | |
| 375 bool PresentationServiceDelegateImpl::AddScreenAvailabilityListener( | |
| 376 int render_process_id, | |
| 377 int render_frame_id, | |
| 378 content::PresentationScreenAvailabilityListener* listener) { | |
| 379 DCHECK(listener); | |
| 380 return frame_map_->AddScreenAvailabilityListener( | |
| 381 RenderFrameHostId(render_process_id, render_frame_id), listener); | |
| 382 } | |
| 383 | |
| 384 void PresentationServiceDelegateImpl::RemoveScreenAvailabilityListener( | |
| 385 int render_process_id, | |
| 386 int render_frame_id, | |
| 387 content::PresentationScreenAvailabilityListener* listener) { | |
| 388 DCHECK(listener); | |
| 389 frame_map_->RemoveScreenAvailabilityListener( | |
| 390 RenderFrameHostId(render_process_id, render_frame_id), listener); | |
| 391 } | |
| 392 | |
| 393 void PresentationServiceDelegateImpl::Reset(int render_process_id, | |
| 394 int render_frame_id) { | |
| 395 RenderFrameHostId rfh_id(render_process_id, render_frame_id); | |
| 396 frame_map_->Reset(rfh_id); | |
| 397 if (IsMainFrame(rfh_id)) | |
| 398 UpdateDefaultMediaSourceAndNotifyObservers(MediaSource(), std::string()); | |
| 399 } | |
| 400 | |
| 401 void PresentationServiceDelegateImpl::SetDefaultPresentationUrl( | |
| 402 int render_process_id, | |
| 403 int render_frame_id, | |
| 404 const std::string& default_presentation_url, | |
| 405 const std::string& default_presentation_id) { | |
| 406 RenderFrameHostId rfh_id(render_process_id, render_frame_id); | |
| 407 frame_map_->SetDefaultPresentationInfo(rfh_id, default_presentation_url, | |
| 408 default_presentation_id); | |
| 409 if (IsMainFrame(rfh_id)) { | |
| 410 // This is the main frame, that means tab-level default presentation | |
|
Wez
2015/05/27 22:37:50
nit: that -> which
haibinlu
2015/05/28 21:44:02
Done.
| |
| 411 // might have been updated. | |
|
Wez
2015/05/27 22:37:50
Suggest "... which means we may have switched betw
haibinlu
2015/05/28 21:44:04
This is caused by apps update its default presenta
| |
| 412 MediaSource new_default_source; | |
| 413 if (!default_presentation_url.empty()) | |
| 414 new_default_source = ForPresentationUrl(default_presentation_url); | |
| 415 std::string new_default_source_host(GetSourceHostForFrame(rfh_id)); | |
| 416 UpdateDefaultMediaSourceAndNotifyObservers(new_default_source, | |
| 417 new_default_source_host); | |
| 418 } | |
| 419 } | |
| 420 | |
| 421 bool PresentationServiceDelegateImpl::IsMainFrame( | |
| 422 const RenderFrameHostId& rfh_id) const { | |
| 423 RenderFrameHost* main_frame = web_contents_->GetMainFrame(); | |
| 424 return main_frame && GetRenderFrameHostId(main_frame) == rfh_id; | |
| 425 } | |
| 426 | |
| 427 void PresentationServiceDelegateImpl:: | |
| 428 UpdateDefaultMediaSourceAndNotifyObservers( | |
| 429 const MediaSource& new_default_source, | |
| 430 const std::string& new_default_source_host) { | |
| 431 if (!new_default_source.Equals(default_source_) || | |
| 432 new_default_source_host != default_source_host_) { | |
| 433 default_source_ = new_default_source; | |
| 434 default_source_host_ = new_default_source_host; | |
| 435 FOR_EACH_OBSERVER( | |
| 436 DefaultMediaSourceObserver, default_media_source_observers_, | |
| 437 OnDefaultMediaSourceChanged(default_source_, default_source_host_)); | |
| 438 } | |
| 439 } | |
| 440 | |
| 441 void PresentationServiceDelegateImpl::StartSession( | |
| 442 int render_process_id, | |
| 443 int render_frame_id, | |
| 444 const std::string& presentation_url, | |
| 445 const std::string& presentation_id, | |
| 446 const PresentationSessionSuccessCallback& success_cb, | |
| 447 const PresentationSessionErrorCallback& error_cb) { | |
| 448 NOTIMPLEMENTED(); | |
|
Wez
2015/05/27 22:37:51
Is this and the below going to be implemented? If
haibinlu
2015/05/28 21:44:02
Done.
| |
| 449 } | |
| 450 | |
| 451 void PresentationServiceDelegateImpl::JoinSession( | |
| 452 int render_process_id, | |
| 453 int render_frame_id, | |
| 454 const std::string& presentation_url, | |
| 455 const std::string& presentation_id, | |
| 456 const PresentationSessionSuccessCallback& success_cb, | |
| 457 const PresentationSessionErrorCallback& error_cb) { | |
| 458 NOTIMPLEMENTED(); | |
| 459 } | |
| 460 | |
| 461 void PresentationServiceDelegateImpl::ListenForSessionMessages( | |
| 462 int render_process_id, | |
| 463 int render_frame_id, | |
| 464 const PresentationSessionMessageCallback& message_cb) { | |
| 465 NOTIMPLEMENTED(); | |
| 466 } | |
| 467 | |
| 468 void PresentationServiceDelegateImpl::SendMessage( | |
| 469 int render_process_id, | |
| 470 int render_frame_id, | |
| 471 scoped_ptr<content::PresentationSessionMessage> message_request, | |
| 472 const SendMessageCallback& send_message_cb) { | |
| 473 NOTIMPLEMENTED(); | |
| 474 } | |
| 475 | |
| 476 void PresentationServiceDelegateImpl::OnRouteCreated(const MediaRoute& route) { | |
| 477 const MediaSource& source = route.media_source(); | |
| 478 DCHECK(!source.Empty()); | |
| 479 if (default_source_.Equals(source)) { | |
|
Wez
2015/05/27 22:37:51
Suggest restructuring this to use early-exit if !E
haibinlu
2015/05/28 21:44:02
Done.
| |
| 480 RenderFrameHost* main_frame = web_contents_->GetMainFrame(); | |
| 481 if (main_frame) { | |
| 482 RenderFrameHostId rfh_id(GetRenderFrameHostId(main_frame)); | |
| 483 auto observer = frame_map_->GetDelegateObserver(rfh_id); | |
| 484 if (observer) { | |
| 485 // TODO(imcheng): Pass in valid default presentation ID once it is | |
| 486 // available from MediaRoute URN. | |
|
Wez
2015/05/27 22:37:51
Bug #?
haibinlu
2015/05/28 21:44:04
Done.
| |
| 487 observer->OnDefaultPresentationStarted(content::PresentationSessionInfo( | |
|
Wez
2015/05/27 22:37:50
Why not have a boilerplate OnDefaultPresentationSt
haibinlu
2015/05/28 21:44:03
Done.
| |
| 488 GetPresentationUrl(source), std::string())); | |
| 489 } | |
| 490 } | |
| 491 } | |
| 492 } | |
| 493 | |
| 494 void PresentationServiceDelegateImpl::AddDefaultMediaSourceObserver( | |
| 495 DefaultMediaSourceObserver* observer) { | |
| 496 default_media_source_observers_.AddObserver(observer); | |
| 497 } | |
| 498 | |
| 499 void PresentationServiceDelegateImpl::RemoveDefaultMediaSourceObserver( | |
| 500 DefaultMediaSourceObserver* observer) { | |
| 501 default_media_source_observers_.RemoveObserver(observer); | |
| 502 } | |
| 503 | |
| 504 void PresentationServiceDelegateImpl::SetMediaRouterForTest( | |
| 505 MediaRouter* router) { | |
| 506 router_ = router; | |
| 507 frame_map_->SetMediaRouterForTest(router); | |
| 508 } | |
| 509 | |
| 510 base::WeakPtr<PresentationServiceDelegateImpl> | |
| 511 PresentationServiceDelegateImpl::GetWeakPtr() { | |
| 512 return weak_factory_.GetWeakPtr(); | |
| 513 } | |
| 514 | |
| 515 bool PresentationServiceDelegateImpl::HasScreenAvailabilityListenerForTest( | |
| 516 const RenderFrameHostId& rfh_id, | |
| 517 const MediaSourceId& source_id) const { | |
| 518 return frame_map_->HasScreenAvailabilityListenerForTest(rfh_id, source_id); | |
| 519 } | |
| 520 | |
| 521 } // namespace media_router | |
| OLD | NEW |