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..c6b765a53cdad9b32a072b28c6ffcaa8ae353527 |
--- /dev/null |
+++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc |
@@ -0,0 +1,234 @@ |
+// 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/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_router_impl_factory.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 "chrome/browser/ui/webui/media_router/media_router_dialog_controller.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 { |
+ |
+using RenderFrameHostId = |
+ content::PresentationServiceDelegate::RenderFrameHostId; |
+ |
+// Helper function to extract ID for a RFH. |
+RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* rfh) { |
mark a. foltz
2015/05/14 22:20:46
It seems like this should be a ctor for RenderFram
haibinlu
2015/05/15 23:32:29
It is a typedef.
typedef std::pair<int, int> Rend
|
+ 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|. |
+std::string GetSourceHostForFrame(RenderFrameHostId rfh_id) { |
+ RenderFrameHost* rfh = RenderFrameHost::FromID(rfh_id.first, rfh_id.second); |
+ DCHECK(rfh); |
+ std::string host = rfh->GetLastCommittedURL().host(); |
mark a. foltz
2015/05/14 22:20:46
Is this guaranteed to be a valid URL? What about
|
+ if (StartsWithASCII(host, "www.", false)) |
+ host = host.substr(4); |
+ return host; |
+} |
+ |
+} // namespace |
+ |
+namespace media_router { |
+ |
+PresentationServiceDelegateImpl::PresentationServiceDelegateImpl( |
+ content::WebContents* web_contents) |
+ : web_contents_(web_contents), |
+ router_(MediaRouterImplFactory::GetMediaRouterForBrowserContext( |
+ web_contents_->GetBrowserContext())), |
+ frame_map_(web_contents), |
+ weak_factory_(this) { |
+ DCHECK(router_); |
+} |
+ |
+PresentationServiceDelegateImpl::~PresentationServiceDelegateImpl() { |
+} |
+ |
+void PresentationServiceDelegateImpl::AddObserver( |
+ int render_process_id, |
+ int render_frame_id, |
+ content::PresentationServiceDelegate::Observer* observer) { |
+ DCHECK(observer); |
+ frame_map_.SetDelegateObserver(render_process_id, render_frame_id, observer); |
+} |
+ |
+void PresentationServiceDelegateImpl::RemoveObserver(int render_process_id, |
+ int render_frame_id) { |
+ frame_map_.SetDelegateObserver(render_process_id, render_frame_id, NULL); |
mark a. foltz
2015/05/14 22:20:46
Please add a method RemoveDelegateObserver() inste
|
+} |
+ |
+bool PresentationServiceDelegateImpl::AddScreenAvailabilityListener( |
+ int render_process_id, |
+ int render_frame_id, |
+ content::PresentationScreenAvailabilityListener* listener) { |
+ DCHECK(listener); |
+ |
mark a. foltz
2015/05/14 22:20:46
Extra newline
haibinlu
2015/05/15 23:32:30
Done.
|
+ return frame_map_.AddScreenAvailabilityListener(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(render_process_id, |
+ render_frame_id, listener); |
+} |
+ |
+void PresentationServiceDelegateImpl::Reset(int render_process_id, |
+ int render_frame_id) { |
+ frame_map_.Reset(render_process_id, render_frame_id); |
+ RenderFrameHostId rfh_id(render_process_id, render_frame_id); |
+ if (IsMainFrame(rfh_id)) |
+ UpdateDefaultMediaSourceAndNotifyObservers(MediaSource(), std::string()); |
mark a. foltz
2015/05/14 22:20:46
I would prefer an explicit method, RemoveDefaultMe
|
+} |
+ |
+void PresentationServiceDelegateImpl::SetDefaultPresentationUrl( |
+ int render_process_id, |
+ int render_frame_id, |
+ const std::string& default_presentation_url, |
+ const std::string& default_presentation_id) { |
+ frame_map_.SetDefaultPresentationInfo(render_process_id, render_frame_id, |
+ default_presentation_url, |
+ default_presentation_id); |
+ |
+ RenderFrameHostId rfh_id(render_process_id, render_frame_id); |
+ if (IsMainFrame(rfh_id)) { |
+ // This is the main frame, that means tab-level default presentation |
+ // might have been updated. |
+ MediaSource new_default_source; |
+ if (!default_presentation_url.empty()) |
+ new_default_source = ForPresentationUrl(default_presentation_url); |
mark a. foltz
2015/05/14 22:20:46
What about setting |default_presentation_id| on |n
|
+ std::string new_default_source_host(GetSourceHostForFrame(rfh_id)); |
mark a. foltz
2015/05/14 22:20:46
Ah, this is not derived from new_default_source, b
|
+ UpdateDefaultMediaSourceAndNotifyObservers(new_default_source, |
+ new_default_source_host); |
+ } |
+} |
+ |
+bool PresentationServiceDelegateImpl::IsMainFrame( |
+ 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_)); |
+ } |
+} |
+ |
+std::string PresentationServiceDelegateImpl::GetOrGeneratePresentationId( |
+ RenderFrameHostId rfh_id, |
+ const std::string& presentation_id) const { |
+ if (!presentation_id.empty()) |
+ return presentation_id; |
+ |
+ const std::string& default_presentation_id = |
+ frame_map_.GetDefaultPresentationId(rfh_id); |
+ return default_presentation_id.empty() ? base::GenerateGUID() |
+ : default_presentation_id; |
+} |
+ |
+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(); |
mark a. foltz
2015/05/14 22:20:46
It seems like this can be implemented now: call in
haibinlu
2015/05/15 23:32:29
router_ can not be not properly set till the next
|
+} |
+ |
+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(); |
mark a. foltz
2015/05/14 22:20:46
Can you elaborate on what is required here? What
haibinlu
2015/05/15 23:32:30
Same here.
|
+} |
+ |
+void PresentationServiceDelegateImpl::OnRouteCreated(const MediaRoute& route) { |
+ const MediaSource& source = route.media_source(); |
+ DCHECK(!source.Empty()); |
+ if (default_source_.Equals(source)) { |
+ 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. |
+ observer->OnDefaultPresentationStarted(content::PresentationSessionInfo( |
+ GetPresentationUrl(source), std::string())); |
+ } |
+ } |
+ } |
mark a. foltz
2015/05/14 22:20:46
We need to instantiate a MediaRouter::Delegate for
|
+} |
+ |
+MediaSource PresentationServiceDelegateImpl::GetDefaultMediaSource() const { |
+ return default_source_; |
+} |
+ |
+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; |
+} |
+ |
+base::WeakPtr<PresentationServiceDelegateImpl> |
+PresentationServiceDelegateImpl::GetWeakPtr() { |
+ return weak_factory_.GetWeakPtr(); |
+} |
+ |
+} // namespace media_router |