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

Side by Side Diff: content/browser/presentation/presentation_service_impl.cc

Issue 979413002: [Presentation API] Additional plumbing for PresentationServiceImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@REAL-NEW-MASTER
Patch Set: updated comments Created 5 years, 9 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 #include "content/browser/presentation/presentation_service_impl.h" 5 #include "content/browser/presentation/presentation_service_impl.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "content/browser/presentation/presentation_type_converters.h"
8 #include "content/public/browser/content_browser_client.h" 9 #include "content/public/browser/content_browser_client.h"
9 #include "content/public/browser/navigation_details.h" 10 #include "content/public/browser/navigation_details.h"
10 #include "content/public/browser/render_frame_host.h" 11 #include "content/public/browser/render_frame_host.h"
11 #include "content/public/browser/render_process_host.h" 12 #include "content/public/browser/render_process_host.h"
12 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
13 #include "content/public/common/content_client.h" 14 #include "content/public/common/content_client.h"
14 #include "content/public/common/frame_navigate_params.h" 15 #include "content/public/common/frame_navigate_params.h"
15 16
16 namespace content { 17 namespace content {
17 18
18 PresentationServiceImpl::PresentationServiceImpl( 19 PresentationServiceImpl::PresentationServiceImpl(
19 RenderFrameHost* render_frame_host, 20 RenderFrameHost* render_frame_host,
20 WebContents* web_contents, 21 WebContents* web_contents,
21 PresentationServiceDelegate* delegate) 22 PresentationServiceDelegate* delegate)
22 : WebContentsObserver(web_contents), 23 : WebContentsObserver(web_contents),
23 render_frame_host_(render_frame_host), 24 render_frame_host_(render_frame_host),
24 delegate_(delegate) { 25 delegate_(delegate),
26 weak_factory_(this) {
25 DCHECK(render_frame_host_); 27 DCHECK(render_frame_host_);
26 DCHECK(web_contents); 28 DCHECK(web_contents);
27 VLOG(2) << "PresentationServiceImpl: " 29 VLOG(2) << "PresentationServiceImpl: "
28 << render_frame_host_->GetProcess()->GetID() << ", " 30 << render_frame_host_->GetProcess()->GetID() << ", "
29 << render_frame_host_->GetRoutingID(); 31 << render_frame_host_->GetRoutingID();
30 if (delegate_) 32 if (delegate_)
31 delegate_->AddObserver(this); 33 delegate_->AddObserver(this);
32 } 34 }
33 35
34 PresentationServiceImpl::~PresentationServiceImpl() { 36 PresentationServiceImpl::~PresentationServiceImpl() {
35 if (delegate_) 37 if (delegate_)
36 delegate_->RemoveObserver(this); 38 delegate_->RemoveObserver(this);
37 } 39 }
38 40
39 // static 41 // static
40 void PresentationServiceImpl::CreateMojoService( 42 void PresentationServiceImpl::CreateMojoService(
41 RenderFrameHost* render_frame_host, 43 RenderFrameHost* render_frame_host,
42 mojo::InterfaceRequest<presentation::PresentationService> request) { 44 mojo::InterfaceRequest<presentation::PresentationService> request) {
43 VLOG(2) << "PresentationServiceImpl::CreateService"; 45 VLOG(2) << "CreateMojoService";
44 WebContents* web_contents = 46 WebContents* web_contents =
45 WebContents::FromRenderFrameHost(render_frame_host); 47 WebContents::FromRenderFrameHost(render_frame_host);
46 DCHECK(web_contents); 48 DCHECK(web_contents);
47 49
48 mojo::BindToRequest( 50 mojo::BindToRequest(
49 new PresentationServiceImpl( 51 new PresentationServiceImpl(
50 render_frame_host, 52 render_frame_host,
51 web_contents, 53 web_contents,
52 GetContentClient()->browser()->GetPresentationServiceDelegate( 54 GetContentClient()->browser()->GetPresentationServiceDelegate(
53 web_contents)), 55 web_contents)),
54 &request); 56 &request);
55 } 57 }
56 58
57 void PresentationServiceImpl::OnConnectionError() { 59 void PresentationServiceImpl::OnConnectionError() {
58 VLOG(1) << "PresentationServiceImpl::OnConnectionError: " 60 VLOG(1) << "OnConnectionError: "
59 << render_frame_host_->GetProcess()->GetID() << ", " 61 << render_frame_host_->GetProcess()->GetID() << ", "
60 << render_frame_host_->GetRoutingID(); 62 << render_frame_host_->GetRoutingID();
61 } 63 }
62 64
63 void PresentationServiceImpl::GetScreenAvailability( 65 void PresentationServiceImpl::GetScreenAvailability(
64 const mojo::String& presentation_url, 66 const mojo::String& presentation_url,
65 const ScreenAvailabilityMojoCallback& callback) { 67 const ScreenAvailabilityMojoCallback& callback) {
66 VLOG(2) << "PresentationServiceImpl::GetScreenAvailability"; 68 VLOG(2) << "GetScreenAvailability";
67 if (!delegate_) 69 if (!delegate_)
68 return; 70 return;
69 71
70 const std::string& presentation_url_str = !presentation_url.is_null() ? 72 const std::string& presentation_url_str = !presentation_url.is_null() ?
71 presentation_url.get() : default_presentation_url_; 73 presentation_url.get() : default_presentation_url_;
72 74
73 // GetScreenAvailability() is called with no URL and there is no default 75 // GetScreenAvailability() is called with no URL and there is no default
74 // Presentation URL. 76 // Presentation URL.
whywhat 2015/03/10 17:05:04 BTW, are we going to support this situation for th
imcheng 2015/03/10 18:31:15 Maybe there's something I don't understand here.
whywhat 2015/03/10 23:20:22 I believe that the absence of DPU from the spec me
imcheng 2015/03/12 20:03:40 Ok, gotcha. We also talked about this briefly in t
75 if (presentation_url_str.empty()) 77 if (presentation_url_str.empty()) {
78 VLOG(1) << "No valid presentation URL.";
76 return; 79 return;
80 }
77 81
78 auto it = availability_contexts_.find(presentation_url_str); 82 auto it = availability_contexts_.find(presentation_url_str);
79 if (it == availability_contexts_.end()) { 83 if (it == availability_contexts_.end()) {
80 linked_ptr<ScreenAvailabilityContext> context( 84 linked_ptr<ScreenAvailabilityContext> context(
81 new ScreenAvailabilityContext(presentation_url_str)); 85 new ScreenAvailabilityContext(presentation_url_str));
82 86
83 if (!delegate_->AddScreenAvailabilityListener( 87 if (!delegate_->AddScreenAvailabilityListener(
84 render_frame_host_->GetProcess()->GetID(), 88 render_frame_host_->GetProcess()->GetID(),
85 render_frame_host_->GetRoutingID(), 89 render_frame_host_->GetRoutingID(),
86 context.get())) { 90 context.get())) {
87 VLOG(1) << "AddScreenAvailabilityListener failed. Ignoring request."; 91 VLOG(1) << "AddScreenAvailabilityListener failed. Ignoring request.";
88 return; 92 return;
89 } 93 }
90 94
91 it = availability_contexts_.insert( 95 it = availability_contexts_.insert(
92 std::make_pair(presentation_url_str, context)).first; 96 std::make_pair(context->GetPresentationUrl(), context)).first;
93 } 97 }
94 98
95 it->second->CallbackReceived(callback); 99 it->second->CallbackReceived(callback);
96 } 100 }
97 101
98 void PresentationServiceImpl::OnScreenAvailabilityListenerRemoved() { 102 void PresentationServiceImpl::OnScreenAvailabilityListenerRemoved() {
99 NOTIMPLEMENTED(); 103 VLOG(2) << "OnScreenAvailabilityListenerRemoved";
104 if (!delegate_)
105 return;
106
107 const std::string presentation_url_str = default_presentation_url_;
whywhat 2015/03/10 17:05:04 It seems like you could eliminate this whole parag
imcheng 2015/03/10 18:31:15 Done. But shouldn't we support removing listener b
whywhat 2015/03/10 23:20:22 Yes, but we don't pass a URL there yet. Let's fix
imcheng 2015/03/12 20:03:40 I see you have added the param to the .mojom in yo
108 if (presentation_url_str.empty())
109 return;
110
111 auto it = availability_contexts_.find(presentation_url_str);
112 if (it == availability_contexts_.end())
113 return;
114
115 delegate_->RemoveScreenAvailabilityListener(
116 render_frame_host_->GetProcess()->GetID(),
117 render_frame_host_->GetRoutingID(),
118 it->second.get());
119 availability_contexts_.erase(it);
100 } 120 }
101 121
102 void PresentationServiceImpl::StartSession( 122 void PresentationServiceImpl::StartSession(
103 const mojo::String& presentation_url, 123 const mojo::String& presentation_url,
104 const mojo::String& presentation_id, 124 const mojo::String& presentation_id,
105 const NewSessionMojoCallback& callback) { 125 const NewSessionMojoCallback& callback) {
106 NOTIMPLEMENTED(); 126 if (start_or_join_session_cb_.get())
127 return;
whywhat 2015/03/10 17:05:04 VLOG?
imcheng 2015/03/10 18:31:15 Done.
128
129 delegate_->StartSession(
130 render_frame_host_->GetProcess()->GetID(),
131 render_frame_host_->GetRoutingID(),
132 presentation_url,
133 presentation_id,
134 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded,
135 weak_factory_.GetWeakPtr()),
136 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError,
137 weak_factory_.GetWeakPtr()));
138 start_or_join_session_cb_.reset(new NewSessionMojoCallback(callback));
107 } 139 }
108 140
109 void PresentationServiceImpl::JoinSession( 141 void PresentationServiceImpl::JoinSession(
110 const mojo::String& presentation_url, 142 const mojo::String& presentation_url,
111 const mojo::String& presentation_id, 143 const mojo::String& presentation_id,
112 const NewSessionMojoCallback& callback) { 144 const NewSessionMojoCallback& callback) {
113 NOTIMPLEMENTED(); 145 if (start_or_join_session_cb_.get())
146 return;
147
148 delegate_->JoinSession(
149 render_frame_host_->GetProcess()->GetID(),
150 render_frame_host_->GetRoutingID(),
151 presentation_url,
152 presentation_id,
153 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionSucceeded,
154 weak_factory_.GetWeakPtr()),
155 base::Bind(&PresentationServiceImpl::OnStartOrJoinSessionError,
156 weak_factory_.GetWeakPtr()));
157 start_or_join_session_cb_.reset(new NewSessionMojoCallback(callback));
158 }
159
160 void PresentationServiceImpl::OnStartOrJoinSessionSucceeded(
161 const PresentationSessionInfo& session_info) {
162 CHECK(start_or_join_session_cb_.get());
163 start_or_join_session_cb_->Run(
164 presentation::PresentationSessionInfo::From(session_info),
165 presentation::PresentationErrorPtr());
166 start_or_join_session_cb_.reset();
167 }
168
169 void PresentationServiceImpl::OnStartOrJoinSessionError(
170 const PresentationError& error) {
171 CHECK(start_or_join_session_cb_.get());
172 start_or_join_session_cb_->Run(
173 presentation::PresentationSessionInfoPtr(),
174 presentation::PresentationError::From(error));
175 start_or_join_session_cb_.reset();
176 }
177
178
179 void PresentationServiceImpl::DoSetDefaultPresentationUrl(
180 const std::string& presentation_url) {
181 delegate_->SetDefaultPresentationUrl(
182 render_frame_host_->GetProcess()->GetID(),
183 render_frame_host_->GetRoutingID(),
184 presentation_url);
185 default_presentation_url_ = presentation_url;
186 }
187
188 void PresentationServiceImpl::SetDefaultPresentationUrl(
189 const mojo::String& presentation_url) {
190 VLOG(2) << "SetDefaultPresentationUrl";
191 if (!delegate_)
192 return;
193
194 std::string old_default_url = default_presentation_url_;
195 std::string new_default_url = presentation_url;
196
197 if (old_default_url == new_default_url)
198 return;
199
200 if (old_default_url.empty()) {
201 DoSetDefaultPresentationUrl(new_default_url);
202 return;
203 }
204
205 auto old_it = availability_contexts_.find(old_default_url);
206 // Haven't started listening yet.
207 if (old_it == availability_contexts_.end()) {
208 DoSetDefaultPresentationUrl(new_default_url);
209 return;
210 }
211
212 // Have already started listening. Create a listener for the new URL and
213 // transfer the callback from the old listener, if any.
214 // This is done so that a listener added before default URL is changed
215 // will continue to work.
216 ScreenAvailabilityMojoCallback* old_callback = old_it->second->callback();
217 if (!new_default_url.empty()) {
218 auto new_it = availability_contexts_.find(new_default_url);
219 if (new_it == availability_contexts_.end()) {
220 linked_ptr<ScreenAvailabilityContext> context(
221 new ScreenAvailabilityContext(new_default_url));
222 if (!delegate_->AddScreenAvailabilityListener(
223 render_frame_host_->GetProcess()->GetID(),
224 render_frame_host_->GetRoutingID(),
225 context.get())) {
226 VLOG(1) << "AddScreenAvailabilityListener failed. Ignoring request.";
227 return;
228 }
229 new_it = availability_contexts_.insert(
230 std::make_pair(context->GetPresentationUrl(), context)).first;
231 }
232 if (old_callback)
233 new_it->second->CallbackReceived(*old_callback);
234 }
235
236 // Remove listener for old default presentation URL.
237 delegate_->RemoveScreenAvailabilityListener(
238 render_frame_host_->GetProcess()->GetID(),
239 render_frame_host_->GetRoutingID(),
240 old_it->second.get());
241 availability_contexts_.erase(old_it);
242 DoSetDefaultPresentationUrl(new_default_url);
114 } 243 }
115 244
116 void PresentationServiceImpl::DidNavigateAnyFrame( 245 void PresentationServiceImpl::DidNavigateAnyFrame(
117 content::RenderFrameHost* render_frame_host, 246 content::RenderFrameHost* render_frame_host,
118 const content::LoadCommittedDetails& details, 247 const content::LoadCommittedDetails& details,
119 const content::FrameNavigateParams& params) { 248 const content::FrameNavigateParams& params) {
120 VLOG(2) << "PresentationServiceImpl::DidNavigateAnyFrame"; 249 VLOG(2) << "PresentationServiceImpl::DidNavigateAnyFrame";
121 if (render_frame_host_ != render_frame_host) 250 if (render_frame_host_ != render_frame_host)
122 return; 251 return;
123 252
124 std::string prev_url_host = details.previous_url.host(); 253 std::string prev_url_host = details.previous_url.host();
125 std::string curr_url_host = params.url.host(); 254 std::string curr_url_host = params.url.host();
126 255
127 // If a frame navigation is in-page (e.g. navigating to a fragment in 256 // If a frame navigation is in-page (e.g. navigating to a fragment in
128 // same page) then we do not unregister listeners. 257 // same page) then we do not unregister listeners.
129 bool in_page_navigation = details.is_in_page || 258 bool in_page_navigation = details.is_in_page ||
130 details.type == content::NAVIGATION_TYPE_IN_PAGE; 259 details.type == content::NAVIGATION_TYPE_IN_PAGE;
131 260
132 VLOG(2) << "DidNavigateAnyFrame: " 261 VLOG(2) << "DidNavigateAnyFrame: "
133 << "prev host: " << prev_url_host << ", curr host: " << curr_url_host 262 << "prev host: " << prev_url_host << ", curr host: " << curr_url_host
134 << ", in_page_navigation: " << in_page_navigation; 263 << ", in_page_navigation: " << in_page_navigation;
135 264
136 if (in_page_navigation) 265 if (in_page_navigation)
137 return; 266 return;
138 267
139 // Unregister all sources if the frame actually navigated. 268 // Reset if the frame actually navigated.
140 RemoveAllListeners(); 269 Reset();
141 } 270 }
142 271
143 void PresentationServiceImpl::RenderFrameDeleted( 272 void PresentationServiceImpl::RenderFrameDeleted(
144 content::RenderFrameHost* render_frame_host) { 273 content::RenderFrameHost* render_frame_host) {
145 VLOG(2) << "PresentationServiceImpl::RenderFrameDeleted"; 274 VLOG(2) << "PresentationServiceImpl::RenderFrameDeleted";
146 if (render_frame_host_ != render_frame_host) 275 if (render_frame_host_ != render_frame_host)
147 return; 276 return;
148 277
149 // RenderFrameDeleted means this object is getting deleted soon. 278 // RenderFrameDeleted means this object is getting deleted soon.
150 RemoveAllListeners(); 279 Reset();
151 } 280 }
152 281
153 void PresentationServiceImpl::RemoveAllListeners() { 282 void PresentationServiceImpl::Reset() {
154 VLOG(2) << "PresentationServiceImpl::RemoveAllListeners"; 283 VLOG(2) << "PresentationServiceImpl::Reset";
155 if (!delegate_) 284 if (!delegate_)
156 return; 285 return;
157 286
287 // Unregister all sources.
158 delegate_->RemoveAllScreenAvailabilityListeners( 288 delegate_->RemoveAllScreenAvailabilityListeners(
159 render_frame_host_->GetProcess()->GetID(), 289 render_frame_host_->GetProcess()->GetID(),
160 render_frame_host_->GetRoutingID()); 290 render_frame_host_->GetRoutingID());
291 availability_contexts_.clear();
161 292
162 availability_contexts_.clear(); 293 // Clear default presentation URL.
294 DoSetDefaultPresentationUrl(std::string());
295
296 start_or_join_session_cb_.reset();
163 } 297 }
164 298
165 void PresentationServiceImpl::OnDelegateDestroyed() { 299 void PresentationServiceImpl::OnDelegateDestroyed() {
166 VLOG(2) << "PresentationServiceImpl::OnDelegateDestroyed"; 300 VLOG(2) << "PresentationServiceImpl::OnDelegateDestroyed";
167 delegate_ = nullptr; 301 delegate_ = nullptr;
302 start_or_join_session_cb_.reset();
168 } 303 }
169 304
170 PresentationServiceImpl::ScreenAvailabilityContext::ScreenAvailabilityContext( 305 PresentationServiceImpl::ScreenAvailabilityContext::ScreenAvailabilityContext(
171 const std::string& presentation_url) 306 const std::string& presentation_url)
172 : presentation_url_(presentation_url) { 307 : presentation_url_(presentation_url) {
173 } 308 }
174 309
175 PresentationServiceImpl::ScreenAvailabilityContext:: 310 PresentationServiceImpl::ScreenAvailabilityContext::
176 ~ScreenAvailabilityContext() { 311 ~ScreenAvailabilityContext() {
177 } 312 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 } else { 344 } else {
210 // Invoke callback and erase it. 345 // Invoke callback and erase it.
211 // There shouldn't be any result stored in this scenario. 346 // There shouldn't be any result stored in this scenario.
212 DCHECK(!available_ptr_); 347 DCHECK(!available_ptr_);
213 callback_ptr_->Run(available); 348 callback_ptr_->Run(available);
214 Reset(); 349 Reset();
215 } 350 }
216 } 351 }
217 352
218 } // namespace content 353 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698