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

Unified Diff: chrome/browser/media/router/presentation_service_delegate_impl.cc

Issue 1132903002: [MediaRouter] Add implementation of PresentationServiceDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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
Index: chrome/browser/media/router/presentation_service_delegate_impl.cc
diff --git a/chrome/browser/media/router/presentation_service_delegate_impl.cc b/chrome/browser/media/router/presentation_service_delegate_impl.cc
new file mode 100644
index 0000000000000000000000000000000000000000..7764840ff3d7d42a44d4377599b1e737f017ba99
--- /dev/null
+++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc
@@ -0,0 +1,521 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/router/presentation_service_delegate_impl.h"
+
+#include <string>
+
+#include "base/containers/scoped_ptr_hash_map.h"
+#include "base/guid.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "chrome/browser/media/router/create_session_request.h"
+#include "chrome/browser/media/router/media_route.h"
+#include "chrome/browser/media/router/media_router.h"
+#include "chrome/browser/media/router/media_sink.h"
+#include "chrome/browser/media/router/media_source_helper.h"
+#include "chrome/browser/media/router/presentation_helper.h"
+#include "chrome/browser/media/router/presentation_media_sinks_observer.h"
+#include "chrome/browser/sessions/session_tab_helper.h"
+#include "content/public/browser/presentation_screen_availability_listener.h"
+#include "content/public/browser/presentation_session.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
+
+DEFINE_WEB_CONTENTS_USER_DATA_KEY(
+ media_router::PresentationServiceDelegateImpl);
+
+using content::RenderFrameHost;
+
+namespace media_router {
+
+namespace {
+
+// 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.
+RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* rfh) {
Wez 2015/05/27 22:37:51 nit: rfh->render_view_host
haibinlu 2015/05/28 21:44:02 Done.
+ int render_process_id = rfh->GetProcess()->GetID();
+ int render_frame_id = rfh->GetRoutingID();
+ return RenderFrameHostId(render_process_id, render_frame_id);
+}
+
+// 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.
+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.
+ 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.
+ 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.
+ std::string host = rfh->GetLastCommittedURL().host();
+ if (StartsWithASCII(host, "www.", false))
+ host = host.substr(4);
+ return host;
+}
+
+} // namespace
+
+// 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.
+// listeners and default presentation info in a render frame.
+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,
+ public:
+ using DelegateObserver = content::PresentationServiceDelegate::Observer;
+
+ PresentationFrame(content::WebContents* web_contents, MediaRouter* router);
+ ~PresentationFrame();
+
+ // 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
+ bool AddScreenAvailabilityListener(
+ content::PresentationScreenAvailabilityListener* listener);
+
+ // Returns true if listener was removed.
+ bool RemoveScreenAvailabilityListener(
+ content::PresentationScreenAvailabilityListener* listener);
+
+ // Returns true if there is a listener for |source_id|.
+ bool HasScreenAvailabilityListenerForTest(
+ const MediaSourceId& source_id) const;
+
+ // 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
+ int NumScreenAvailabilityListeners() const;
+
+ // 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
+ void SetDefaultPresentationInfo(const std::string& default_presentation_url,
+ const std::string& default_presentation_id);
+
+ // Returns empty string if no default presentation ID is set.
+ std::string GetDefaultPresentationId() const;
Wez 2015/05/27 22:37:50 nit: Blank line after this.
haibinlu 2015/05/28 21:44:03 Acknowledged.
+ void set_delegate_observer(DelegateObserver* observer) {
+ delegate_observer_ = observer;
+ }
+ DelegateObserver* delegate_observer() const { return delegate_observer_; }
+
+ void Reset();
+ void OnDelegateDestroyed();
Wez 2015/05/27 22:37:49 nit: Add comments to explain these.
haibinlu 2015/05/28 21:44:03 method removed
+
+ private:
+ MediaSource GetMediaSourceFromListener(
+ content::PresentationScreenAvailabilityListener* listener);
+
+ scoped_ptr<content::PresentationSessionInfo> default_presentation_info_;
+ base::ScopedPtrHashMap<MediaSourceId, scoped_ptr<MediaSinksObserver>>
+ sink_observers_;
+
+ // 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.
+ const content::WebContents* web_contents_;
+ MediaRouter* router_;
+ DelegateObserver* delegate_observer_;
+};
+
+PresentationFrame::PresentationFrame(content::WebContents* web_contents,
+ MediaRouter* router)
+ : web_contents_(web_contents),
+ router_(router),
+ delegate_observer_(nullptr) {
+ DCHECK(web_contents_);
+ DCHECK(router_);
+}
+
+PresentationFrame::~PresentationFrame() {
+ DCHECK(sink_observers_.empty());
+}
+
+bool PresentationFrame::AddScreenAvailabilityListener(
+ content::PresentationScreenAvailabilityListener* listener) {
+ MediaSource source(GetMediaSourceFromListener(listener));
+ 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
+ return false;
+
+ return sink_observers_.add(source.id(),
+ make_scoped_ptr(new PresentationMediaSinksObserver(
+ 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'
+}
+
+bool PresentationFrame::RemoveScreenAvailabilityListener(
+ content::PresentationScreenAvailabilityListener* listener) {
+ 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.
+ return sink_observers_.erase(source.id()) == 1;
+}
+
+bool PresentationFrame::HasScreenAvailabilityListenerForTest(
+ const MediaSourceId& source_id) const {
+ return sink_observers_.contains(source_id);
+}
+
+int PresentationFrame::NumScreenAvailabilityListeners() const {
+ return sink_observers_.size();
+}
+
+void PresentationFrame::Reset() {
+ sink_observers_.clear();
+ default_presentation_info_.reset();
+}
+
+void PresentationFrame::OnDelegateDestroyed() {
+ if (delegate_observer_) {
+ delegate_observer_->OnDelegateDestroyed();
+ }
+}
+
+void PresentationFrame::SetDefaultPresentationInfo(
+ const std::string& default_presentation_url,
+ const std::string& default_presentation_id) {
+ if (default_presentation_url.empty() && default_presentation_id.empty()) {
+ default_presentation_info_.reset();
+ } else {
+ default_presentation_info_.reset(new content::PresentationSessionInfo(
+ default_presentation_url, default_presentation_id));
+ }
+}
+
+std::string PresentationFrame::GetDefaultPresentationId() const {
+ return default_presentation_info_
+ ? default_presentation_info_->presentation_id
+ : "";
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.
+}
+
+MediaSource PresentationFrame::GetMediaSourceFromListener(
+ content::PresentationScreenAvailabilityListener* listener) {
+ // If the default presentation URL is empty then fall back to 1-UA mode,
+ // 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
+ std::string presentation_url(listener->GetPresentationUrl());
+ return presentation_url.empty()
+ ? ForTabMediaSource(SessionTabHelper::IdForTab(web_contents_))
+ : ForPresentationUrl(presentation_url);
+}
+
+// Helper class for PresentationServiceDelegateImpl to manage
+// 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.
+class PresentationFrameMap final {
Wez 2015/05/27 22:37:49 Suggest PresentationFrameManager rather than Map -
haibinlu 2015/05/28 21:44:04 Done.
+ public:
+ using DelegateObserver = content::PresentationServiceDelegate::Observer;
+
+ PresentationFrameMap(content::WebContents* web_contents, MediaRouter* router);
+ ~PresentationFrameMap();
+
+ // 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.
+ bool AddScreenAvailabilityListener(
+ 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.
+ content::PresentationScreenAvailabilityListener* listener);
+
+ // Returns true if listener was removed.
+ bool RemoveScreenAvailabilityListener(
+ const RenderFrameHostId& rfh_id,
+ content::PresentationScreenAvailabilityListener* listener);
+
+ // Returns true if there is a listener for |source_id| in the frame.
+ bool HasScreenAvailabilityListenerForTest(
+ const RenderFrameHostId& rfh_id,
+ const MediaSourceId& source_id) const;
+
+ // Returns the number of screen-availability listeners.
+ int NumScreenAvailabilityListeners() const;
+
+ // Returns the default presentation URL and ID for the frame.
+ void SetDefaultPresentationInfo(const RenderFrameHostId& rfh_id,
+ const std::string& default_presentation_url,
+ const std::string& default_presentation_id);
+
+ // Returns empty string if no default presentation ID is set in the frame.
+ std::string GetDefaultPresentationId(const RenderFrameHostId& rfh_id) const;
+
+ 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
+ DelegateObserver* observer);
+ void UnregisterPresenationFrame(const RenderFrameHostId& rfh_id);
+
+ DelegateObserver* GetDelegateObserver(const RenderFrameHostId& rfh_id) const;
+
+ void Reset(const RenderFrameHostId& rfh_id);
+ 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
+ void SetMediaRouterForTest(MediaRouter* router);
+
+ private:
+ PresentationFrame* GetOrAddFrame(const RenderFrameHostId& rfh_id);
+
+ // Maps a frame identifier to a PresentationFrame object for frames
+ // that are using presentation API.
+ base::ScopedPtrHashMap<RenderFrameHostId, scoped_ptr<PresentationFrame>>
+ presentation_frames_;
+
+ // 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.
+ MediaRouter* router_;
+ content::WebContents* web_contents_;
+};
+
+PresentationFrameMap::PresentationFrameMap(content::WebContents* web_contents,
+ MediaRouter* router)
+ : router_(router), web_contents_(web_contents) {
+ 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
+}
+
+PresentationFrameMap::~PresentationFrameMap() {
+}
+
+bool PresentationFrameMap::AddScreenAvailabilityListener(
+ const RenderFrameHostId& rfh_id,
+ content::PresentationScreenAvailabilityListener* listener) {
+ DCHECK(listener);
+ if (NumScreenAvailabilityListeners() >=
+ PresentationServiceDelegateImpl::kMaxNumSources) {
+ return false;
+ }
+
+ auto presentation_frame = GetOrAddFrame(rfh_id);
+ return presentation_frame->AddScreenAvailabilityListener(listener);
+}
+
+bool PresentationFrameMap::RemoveScreenAvailabilityListener(
+ const RenderFrameHostId& rfh_id,
+ content::PresentationScreenAvailabilityListener* listener) {
+ DCHECK(listener);
+ auto presentation_frame = presentation_frames_.get(rfh_id);
+ return presentation_frame &&
+ presentation_frame->RemoveScreenAvailabilityListener(listener);
+}
+
+bool PresentationFrameMap::HasScreenAvailabilityListenerForTest(
+ const RenderFrameHostId& rfh_id,
+ const MediaSourceId& source_id) const {
+ auto presentation_frame = presentation_frames_.get(rfh_id);
+ return presentation_frame &&
+ presentation_frame->HasScreenAvailabilityListenerForTest(source_id);
+}
+
+int PresentationFrameMap::NumScreenAvailabilityListeners() const {
+ int count = 0;
+ 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
+ count += pf.second->NumScreenAvailabilityListeners();
+ }
+ return count;
+}
+
+void PresentationFrameMap::SetDefaultPresentationInfo(
+ const RenderFrameHostId& rfh_id,
+ const std::string& default_presentation_url,
+ const std::string& default_presentation_id) {
+ auto presentation_frame = GetOrAddFrame(rfh_id);
+ presentation_frame->SetDefaultPresentationInfo(default_presentation_url,
+ default_presentation_id);
+}
+
+std::string PresentationFrameMap::GetDefaultPresentationId(
+ const RenderFrameHostId& rfh_id) const {
+ auto presentation_frame = presentation_frames_.get(rfh_id);
+ return presentation_frame ? presentation_frame->GetDefaultPresentationId()
+ : "";
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.
+}
+
+void PresentationFrameMap::RegisterPresenationFrame(
+ const RenderFrameHostId& rfh_id,
+ content::PresentationServiceDelegate::Observer* observer) {
+ auto presentation_frame = GetOrAddFrame(rfh_id);
+ presentation_frame->set_delegate_observer(observer);
+}
+
+void PresentationFrameMap::UnregisterPresenationFrame(
+ const RenderFrameHostId& rfh_id) {
+ presentation_frames_.erase(rfh_id);
+}
+
+PresentationFrameMap::DelegateObserver*
+PresentationFrameMap::GetDelegateObserver(const RenderFrameHostId& rfh_id) const {
+ auto presentation_frame = presentation_frames_.get(rfh_id);
+ return presentation_frame ? presentation_frame->delegate_observer() : nullptr;
+}
+
+void PresentationFrameMap::Reset(const RenderFrameHostId& rfh_id) {
+ auto presentation_frame = presentation_frames_.get(rfh_id);
+ if (presentation_frame)
+ presentation_frame->Reset();
+}
+
+void PresentationFrameMap::OnDelegateDestroyed() {
+ for (auto& kv : presentation_frames_)
Wez 2015/05/27 22:37:49 nit: kv -> frame
haibinlu 2015/05/28 21:44:03 Done.
+ kv.second->OnDelegateDestroyed();
+}
+
+PresentationFrame* PresentationFrameMap::GetOrAddFrame(
+ const RenderFrameHostId& rfh_id) {
+ if (!presentation_frames_.contains(rfh_id)) {
+ presentation_frames_.add(
+ rfh_id, scoped_ptr<PresentationFrame>(
+ new PresentationFrame(web_contents_, router_)));
+ }
+ return presentation_frames_.get(rfh_id);
+}
+
+void PresentationFrameMap::SetMediaRouterForTest(MediaRouter* router) {
+ router_ = router;
+}
+
+// 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.
+PresentationServiceDelegateImpl::PresentationServiceDelegateImpl(
+ content::WebContents* web_contents)
+ : frame_map_(new PresentationFrameMap(web_contents, nullptr)),
+ web_contents_(web_contents),
+ router_(NULL),
Wez 2015/05/27 22:37:51 nullptr
haibinlu 2015/05/28 21:44:04 Done.
+ weak_factory_(this) {
+}
+
+PresentationServiceDelegateImpl::~PresentationServiceDelegateImpl() {
+ 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.
+}
+
+void PresentationServiceDelegateImpl::AddObserver(
+ int render_process_id,
+ int render_frame_id,
+ content::PresentationServiceDelegate::Observer* observer) {
+ DCHECK(observer);
+ frame_map_->RegisterPresenationFrame(
+ RenderFrameHostId(render_process_id, render_frame_id), observer);
+}
+
+void PresentationServiceDelegateImpl::RemoveObserver(int render_process_id,
+ int render_frame_id) {
+ frame_map_->UnregisterPresenationFrame(
+ RenderFrameHostId(render_process_id, render_frame_id));
+}
+
+bool PresentationServiceDelegateImpl::AddScreenAvailabilityListener(
+ int render_process_id,
+ int render_frame_id,
+ content::PresentationScreenAvailabilityListener* listener) {
+ DCHECK(listener);
+ return frame_map_->AddScreenAvailabilityListener(
+ RenderFrameHostId(render_process_id, render_frame_id), listener);
+}
+
+void PresentationServiceDelegateImpl::RemoveScreenAvailabilityListener(
+ int render_process_id,
+ int render_frame_id,
+ content::PresentationScreenAvailabilityListener* listener) {
+ DCHECK(listener);
+ frame_map_->RemoveScreenAvailabilityListener(
+ RenderFrameHostId(render_process_id, render_frame_id), listener);
+}
+
+void PresentationServiceDelegateImpl::Reset(int render_process_id,
+ int render_frame_id) {
+ RenderFrameHostId rfh_id(render_process_id, render_frame_id);
+ frame_map_->Reset(rfh_id);
+ if (IsMainFrame(rfh_id))
+ UpdateDefaultMediaSourceAndNotifyObservers(MediaSource(), std::string());
+}
+
+void PresentationServiceDelegateImpl::SetDefaultPresentationUrl(
+ int render_process_id,
+ int render_frame_id,
+ const std::string& default_presentation_url,
+ const std::string& default_presentation_id) {
+ RenderFrameHostId rfh_id(render_process_id, render_frame_id);
+ frame_map_->SetDefaultPresentationInfo(rfh_id, default_presentation_url,
+ default_presentation_id);
+ if (IsMainFrame(rfh_id)) {
+ // 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.
+ // 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
+ MediaSource new_default_source;
+ if (!default_presentation_url.empty())
+ new_default_source = ForPresentationUrl(default_presentation_url);
+ std::string new_default_source_host(GetSourceHostForFrame(rfh_id));
+ UpdateDefaultMediaSourceAndNotifyObservers(new_default_source,
+ new_default_source_host);
+ }
+}
+
+bool PresentationServiceDelegateImpl::IsMainFrame(
+ const RenderFrameHostId& rfh_id) const {
+ RenderFrameHost* main_frame = web_contents_->GetMainFrame();
+ return main_frame && GetRenderFrameHostId(main_frame) == rfh_id;
+}
+
+void PresentationServiceDelegateImpl::
+ UpdateDefaultMediaSourceAndNotifyObservers(
+ const MediaSource& new_default_source,
+ const std::string& new_default_source_host) {
+ if (!new_default_source.Equals(default_source_) ||
+ new_default_source_host != default_source_host_) {
+ default_source_ = new_default_source;
+ default_source_host_ = new_default_source_host;
+ FOR_EACH_OBSERVER(
+ DefaultMediaSourceObserver, default_media_source_observers_,
+ OnDefaultMediaSourceChanged(default_source_, default_source_host_));
+ }
+}
+
+void PresentationServiceDelegateImpl::StartSession(
+ int render_process_id,
+ int render_frame_id,
+ const std::string& presentation_url,
+ const std::string& presentation_id,
+ const PresentationSessionSuccessCallback& success_cb,
+ const PresentationSessionErrorCallback& error_cb) {
+ 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.
+}
+
+void PresentationServiceDelegateImpl::JoinSession(
+ int render_process_id,
+ int render_frame_id,
+ const std::string& presentation_url,
+ const std::string& presentation_id,
+ const PresentationSessionSuccessCallback& success_cb,
+ const PresentationSessionErrorCallback& error_cb) {
+ NOTIMPLEMENTED();
+}
+
+void PresentationServiceDelegateImpl::ListenForSessionMessages(
+ int render_process_id,
+ int render_frame_id,
+ const PresentationSessionMessageCallback& message_cb) {
+ NOTIMPLEMENTED();
+}
+
+void PresentationServiceDelegateImpl::SendMessage(
+ int render_process_id,
+ int render_frame_id,
+ scoped_ptr<content::PresentationSessionMessage> message_request,
+ const SendMessageCallback& send_message_cb) {
+ NOTIMPLEMENTED();
+}
+
+void PresentationServiceDelegateImpl::OnRouteCreated(const MediaRoute& route) {
+ const MediaSource& source = route.media_source();
+ DCHECK(!source.Empty());
+ 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.
+ RenderFrameHost* main_frame = web_contents_->GetMainFrame();
+ if (main_frame) {
+ RenderFrameHostId rfh_id(GetRenderFrameHostId(main_frame));
+ auto observer = frame_map_->GetDelegateObserver(rfh_id);
+ if (observer) {
+ // TODO(imcheng): Pass in valid default presentation ID once it is
+ // available from MediaRoute URN.
Wez 2015/05/27 22:37:51 Bug #?
haibinlu 2015/05/28 21:44:04 Done.
+ 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.
+ GetPresentationUrl(source), std::string()));
+ }
+ }
+ }
+}
+
+void PresentationServiceDelegateImpl::AddDefaultMediaSourceObserver(
+ DefaultMediaSourceObserver* observer) {
+ default_media_source_observers_.AddObserver(observer);
+}
+
+void PresentationServiceDelegateImpl::RemoveDefaultMediaSourceObserver(
+ DefaultMediaSourceObserver* observer) {
+ default_media_source_observers_.RemoveObserver(observer);
+}
+
+void PresentationServiceDelegateImpl::SetMediaRouterForTest(
+ MediaRouter* router) {
+ router_ = router;
+ frame_map_->SetMediaRouterForTest(router);
+}
+
+base::WeakPtr<PresentationServiceDelegateImpl>
+PresentationServiceDelegateImpl::GetWeakPtr() {
+ return weak_factory_.GetWeakPtr();
+}
+
+bool PresentationServiceDelegateImpl::HasScreenAvailabilityListenerForTest(
+ const RenderFrameHostId& rfh_id,
+ const MediaSourceId& source_id) const {
+ return frame_map_->HasScreenAvailabilityListenerForTest(rfh_id, source_id);
+}
+
+} // namespace media_router

Powered by Google App Engine
This is Rietveld 408576698