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/guid.h" | |
| 10 #include "base/strings/string_util.h" | |
| 11 #include "base/strings/stringprintf.h" | |
| 12 #include "chrome/browser/media/router/create_session_request.h" | |
| 13 #include "chrome/browser/media/router/media_route.h" | |
| 14 #include "chrome/browser/media/router/media_router.h" | |
| 15 #include "chrome/browser/media/router/media_router_impl_factory.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 "chrome/browser/ui/webui/media_router/media_router_dialog_controller.h" | |
| 22 #include "content/public/browser/presentation_screen_availability_listener.h" | |
| 23 #include "content/public/browser/presentation_session.h" | |
| 24 #include "content/public/browser/render_frame_host.h" | |
| 25 #include "content/public/browser/render_process_host.h" | |
| 26 | |
| 27 DEFINE_WEB_CONTENTS_USER_DATA_KEY( | |
| 28 media_router::PresentationServiceDelegateImpl); | |
| 29 | |
| 30 using content::RenderFrameHost; | |
| 31 | |
| 32 namespace { | |
| 33 | |
| 34 using RenderFrameHostId = | |
| 35 content::PresentationServiceDelegate::RenderFrameHostId; | |
| 36 | |
| 37 // Helper function to extract ID for a RFH. | |
| 38 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
| |
| 39 int render_process_id = rfh->GetProcess()->GetID(); | |
| 40 int render_frame_id = rfh->GetRoutingID(); | |
| 41 return RenderFrameHostId(render_process_id, render_frame_id); | |
| 42 } | |
| 43 | |
| 44 // Gets the host name associated with the frame given by |rfh_id|. | |
| 45 std::string GetSourceHostForFrame(RenderFrameHostId rfh_id) { | |
| 46 RenderFrameHost* rfh = RenderFrameHost::FromID(rfh_id.first, rfh_id.second); | |
| 47 DCHECK(rfh); | |
| 48 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
| |
| 49 if (StartsWithASCII(host, "www.", false)) | |
| 50 host = host.substr(4); | |
| 51 return host; | |
| 52 } | |
| 53 | |
| 54 } // namespace | |
| 55 | |
| 56 namespace media_router { | |
| 57 | |
| 58 PresentationServiceDelegateImpl::PresentationServiceDelegateImpl( | |
| 59 content::WebContents* web_contents) | |
| 60 : web_contents_(web_contents), | |
| 61 router_(MediaRouterImplFactory::GetMediaRouterForBrowserContext( | |
| 62 web_contents_->GetBrowserContext())), | |
| 63 frame_map_(web_contents), | |
| 64 weak_factory_(this) { | |
| 65 DCHECK(router_); | |
| 66 } | |
| 67 | |
| 68 PresentationServiceDelegateImpl::~PresentationServiceDelegateImpl() { | |
| 69 } | |
| 70 | |
| 71 void PresentationServiceDelegateImpl::AddObserver( | |
| 72 int render_process_id, | |
| 73 int render_frame_id, | |
| 74 content::PresentationServiceDelegate::Observer* observer) { | |
| 75 DCHECK(observer); | |
| 76 frame_map_.SetDelegateObserver(render_process_id, render_frame_id, observer); | |
| 77 } | |
| 78 | |
| 79 void PresentationServiceDelegateImpl::RemoveObserver(int render_process_id, | |
| 80 int render_frame_id) { | |
| 81 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
| |
| 82 } | |
| 83 | |
| 84 bool PresentationServiceDelegateImpl::AddScreenAvailabilityListener( | |
| 85 int render_process_id, | |
| 86 int render_frame_id, | |
| 87 content::PresentationScreenAvailabilityListener* listener) { | |
| 88 DCHECK(listener); | |
| 89 | |
|
mark a. foltz
2015/05/14 22:20:46
Extra newline
haibinlu
2015/05/15 23:32:30
Done.
| |
| 90 return frame_map_.AddScreenAvailabilityListener(render_process_id, | |
| 91 render_frame_id, listener); | |
| 92 } | |
| 93 | |
| 94 void PresentationServiceDelegateImpl::RemoveScreenAvailabilityListener( | |
| 95 int render_process_id, | |
| 96 int render_frame_id, | |
| 97 content::PresentationScreenAvailabilityListener* listener) { | |
| 98 DCHECK(listener); | |
| 99 frame_map_.RemoveScreenAvailabilityListener(render_process_id, | |
| 100 render_frame_id, listener); | |
| 101 } | |
| 102 | |
| 103 void PresentationServiceDelegateImpl::Reset(int render_process_id, | |
| 104 int render_frame_id) { | |
| 105 frame_map_.Reset(render_process_id, render_frame_id); | |
| 106 RenderFrameHostId rfh_id(render_process_id, render_frame_id); | |
| 107 if (IsMainFrame(rfh_id)) | |
| 108 UpdateDefaultMediaSourceAndNotifyObservers(MediaSource(), std::string()); | |
|
mark a. foltz
2015/05/14 22:20:46
I would prefer an explicit method, RemoveDefaultMe
| |
| 109 } | |
| 110 | |
| 111 void PresentationServiceDelegateImpl::SetDefaultPresentationUrl( | |
| 112 int render_process_id, | |
| 113 int render_frame_id, | |
| 114 const std::string& default_presentation_url, | |
| 115 const std::string& default_presentation_id) { | |
| 116 frame_map_.SetDefaultPresentationInfo(render_process_id, render_frame_id, | |
| 117 default_presentation_url, | |
| 118 default_presentation_id); | |
| 119 | |
| 120 RenderFrameHostId rfh_id(render_process_id, render_frame_id); | |
| 121 if (IsMainFrame(rfh_id)) { | |
| 122 // This is the main frame, that means tab-level default presentation | |
| 123 // might have been updated. | |
| 124 MediaSource new_default_source; | |
| 125 if (!default_presentation_url.empty()) | |
| 126 new_default_source = ForPresentationUrl(default_presentation_url); | |
|
mark a. foltz
2015/05/14 22:20:46
What about setting |default_presentation_id| on |n
| |
| 127 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
| |
| 128 UpdateDefaultMediaSourceAndNotifyObservers(new_default_source, | |
| 129 new_default_source_host); | |
| 130 } | |
| 131 } | |
| 132 | |
| 133 bool PresentationServiceDelegateImpl::IsMainFrame( | |
| 134 RenderFrameHostId rfh_id) const { | |
| 135 RenderFrameHost* main_frame = web_contents_->GetMainFrame(); | |
| 136 return main_frame && GetRenderFrameHostId(main_frame) == rfh_id; | |
| 137 } | |
| 138 | |
| 139 void PresentationServiceDelegateImpl:: | |
| 140 UpdateDefaultMediaSourceAndNotifyObservers( | |
| 141 const MediaSource& new_default_source, | |
| 142 const std::string& new_default_source_host) { | |
| 143 if (!new_default_source.Equals(default_source_) || | |
| 144 new_default_source_host != default_source_host_) { | |
| 145 default_source_ = new_default_source; | |
| 146 default_source_host_ = new_default_source_host; | |
| 147 FOR_EACH_OBSERVER( | |
| 148 DefaultMediaSourceObserver, default_media_source_observers_, | |
| 149 OnDefaultMediaSourceChanged(default_source_, default_source_host_)); | |
| 150 } | |
| 151 } | |
| 152 | |
| 153 std::string PresentationServiceDelegateImpl::GetOrGeneratePresentationId( | |
| 154 RenderFrameHostId rfh_id, | |
| 155 const std::string& presentation_id) const { | |
| 156 if (!presentation_id.empty()) | |
| 157 return presentation_id; | |
| 158 | |
| 159 const std::string& default_presentation_id = | |
| 160 frame_map_.GetDefaultPresentationId(rfh_id); | |
| 161 return default_presentation_id.empty() ? base::GenerateGUID() | |
| 162 : default_presentation_id; | |
| 163 } | |
| 164 | |
| 165 void PresentationServiceDelegateImpl::StartSession( | |
| 166 int render_process_id, | |
| 167 int render_frame_id, | |
| 168 const std::string& presentation_url, | |
| 169 const std::string& presentation_id, | |
| 170 const PresentationSessionSuccessCallback& success_cb, | |
| 171 const PresentationSessionErrorCallback& error_cb) { | |
| 172 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
| |
| 173 } | |
| 174 | |
| 175 void PresentationServiceDelegateImpl::JoinSession( | |
| 176 int render_process_id, | |
| 177 int render_frame_id, | |
| 178 const std::string& presentation_url, | |
| 179 const std::string& presentation_id, | |
| 180 const PresentationSessionSuccessCallback& success_cb, | |
| 181 const PresentationSessionErrorCallback& error_cb) { | |
| 182 NOTIMPLEMENTED(); | |
| 183 } | |
| 184 | |
| 185 void PresentationServiceDelegateImpl::ListenForSessionMessages( | |
| 186 int render_process_id, | |
| 187 int render_frame_id, | |
| 188 const PresentationSessionMessageCallback& message_cb) { | |
| 189 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.
| |
| 190 } | |
| 191 | |
| 192 void PresentationServiceDelegateImpl::OnRouteCreated(const MediaRoute& route) { | |
| 193 const MediaSource& source = route.media_source(); | |
| 194 DCHECK(!source.Empty()); | |
| 195 if (default_source_.Equals(source)) { | |
| 196 RenderFrameHost* main_frame = web_contents_->GetMainFrame(); | |
| 197 if (main_frame) { | |
| 198 RenderFrameHostId rfh_id(GetRenderFrameHostId(main_frame)); | |
| 199 auto observer = frame_map_.GetDelegateObserver(rfh_id); | |
| 200 if (observer) { | |
| 201 // TODO(imcheng): Pass in valid default presentation ID once it is | |
| 202 // available from MediaRoute URN. | |
| 203 observer->OnDefaultPresentationStarted(content::PresentationSessionInfo( | |
| 204 GetPresentationUrl(source), std::string())); | |
| 205 } | |
| 206 } | |
| 207 } | |
|
mark a. foltz
2015/05/14 22:20:46
We need to instantiate a MediaRouter::Delegate for
| |
| 208 } | |
| 209 | |
| 210 MediaSource PresentationServiceDelegateImpl::GetDefaultMediaSource() const { | |
| 211 return default_source_; | |
| 212 } | |
| 213 | |
| 214 void PresentationServiceDelegateImpl::AddDefaultMediaSourceObserver( | |
| 215 DefaultMediaSourceObserver* observer) { | |
| 216 default_media_source_observers_.AddObserver(observer); | |
| 217 } | |
| 218 | |
| 219 void PresentationServiceDelegateImpl::RemoveDefaultMediaSourceObserver( | |
| 220 DefaultMediaSourceObserver* observer) { | |
| 221 default_media_source_observers_.RemoveObserver(observer); | |
| 222 } | |
| 223 | |
| 224 void PresentationServiceDelegateImpl::SetMediaRouterForTest( | |
| 225 MediaRouter* router) { | |
| 226 router_ = router; | |
| 227 } | |
| 228 | |
| 229 base::WeakPtr<PresentationServiceDelegateImpl> | |
| 230 PresentationServiceDelegateImpl::GetWeakPtr() { | |
| 231 return weak_factory_.GetWeakPtr(); | |
| 232 } | |
| 233 | |
| 234 } // namespace media_router | |
| OLD | NEW |