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

Side by Side Diff: content/renderer/presentation/presentation_dispatcher.cc

Issue 1140713005: [PresentationAPI] Implements send API for Blob data from WebPresentationClient (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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/renderer/presentation/presentation_dispatcher.h" 5 #include "content/renderer/presentation/presentation_dispatcher.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "content/common/presentation/presentation_service.mojom.h" 8 #include "content/common/presentation/presentation_service.mojom.h"
9 #include "content/public/common/presentation_constants.h" 9 #include "content/public/common/presentation_constants.h"
10 #include "content/public/common/service_registry.h" 10 #include "content/public/common/service_registry.h"
11 #include "content/public/renderer/render_frame.h" 11 #include "content/public/renderer/render_frame.h"
12 #include "content/renderer/presentation/presentation_session_client.h" 12 #include "content/renderer/presentation/presentation_session_client.h"
13 #include "third_party/WebKit/public/platform/WebString.h" 13 #include "third_party/WebKit/public/platform/WebString.h"
14 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nController.h" 14 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nController.h"
15 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nError.h" 15 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nError.h"
16 #include "third_party/WebKit/public/web/WebDocument.h" 16 #include "third_party/WebKit/public/web/WebDocument.h"
17 #include "third_party/WebKit/public/web/WebLocalFrame.h" 17 #include "third_party/WebKit/public/web/WebLocalFrame.h"
18 #include "url/gurl.h" 18 #include "url/gurl.h"
19 19
20 using presentation::PresentationMessageType;
21
20 namespace { 22 namespace {
21 23
22 blink::WebPresentationError::ErrorType GetWebPresentationErrorTypeFromMojo( 24 blink::WebPresentationError::ErrorType GetWebPresentationErrorTypeFromMojo(
23 presentation::PresentationErrorType mojoErrorType) { 25 presentation::PresentationErrorType mojoErrorType) {
24 switch (mojoErrorType) { 26 switch (mojoErrorType) {
25 case presentation::PRESENTATION_ERROR_TYPE_NO_AVAILABLE_SCREENS: 27 case presentation::PRESENTATION_ERROR_TYPE_NO_AVAILABLE_SCREENS:
26 return blink::WebPresentationError::ErrorTypeNoAvailableScreens; 28 return blink::WebPresentationError::ErrorTypeNoAvailableScreens;
27 case presentation::PRESENTATION_ERROR_TYPE_SESSION_REQUEST_CANCELLED: 29 case presentation::PRESENTATION_ERROR_TYPE_SESSION_REQUEST_CANCELLED:
28 return blink::WebPresentationError::ErrorTypeSessionRequestCancelled; 30 return blink::WebPresentationError::ErrorTypeSessionRequestCancelled;
29 case presentation::PRESENTATION_ERROR_TYPE_NO_PRESENTATION_FOUND: 31 case presentation::PRESENTATION_ERROR_TYPE_NO_PRESENTATION_FOUND:
(...skipping 17 matching lines...) Expand all
47 return blink::WebPresentationSessionState::Disconnected; 49 return blink::WebPresentationSessionState::Disconnected;
48 } 50 }
49 51
50 GURL GetPresentationURLFromFrame(content::RenderFrame* frame) { 52 GURL GetPresentationURLFromFrame(content::RenderFrame* frame) {
51 DCHECK(frame); 53 DCHECK(frame);
52 54
53 GURL url(frame->GetWebFrame()->document().defaultPresentationURL()); 55 GURL url(frame->GetWebFrame()->document().defaultPresentationURL());
54 return url.is_valid() ? url : GURL(); 56 return url.is_valid() ? url : GURL();
55 } 57 }
56 58
59 presentation::SessionMessage* GetMojoSessionMessage(
60 const blink::WebString& presentationUrl,
61 const blink::WebString& presentationId,
62 PresentationMessageType type,
63 const uint8* data,
64 size_t length) {
65 presentation::SessionMessage* session_message =
66 new presentation::SessionMessage();
67 session_message->presentation_url = presentationUrl.utf8();
68 session_message->presentation_id = presentationId.utf8();
69 session_message->type = type;
70 const std::vector<uint8> vector(data, data + length);
71 session_message->data = mojo::Array<uint8>::From(vector);
72 return session_message;
73 }
74
57 } // namespace 75 } // namespace
58 76
59 namespace content { 77 namespace content {
60 78
61 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame) 79 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame)
62 : RenderFrameObserver(render_frame), 80 : RenderFrameObserver(render_frame),
63 controller_(nullptr), 81 controller_(nullptr),
64 binding_(this) { 82 binding_(this) {
65 } 83 }
66 84
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 // for now. Consider throwing DOMException or splitting bigger messages 151 // for now. Consider throwing DOMException or splitting bigger messages
134 // into smaller chunks later. 152 // into smaller chunks later.
135 LOG(WARNING) << "message size exceeded limit!"; 153 LOG(WARNING) << "message size exceeded limit!";
136 return; 154 return;
137 } 155 }
138 156
139 presentation::SessionMessage* session_message = 157 presentation::SessionMessage* session_message =
140 new presentation::SessionMessage(); 158 new presentation::SessionMessage();
141 session_message->presentation_url = presentationUrl.utf8(); 159 session_message->presentation_url = presentationUrl.utf8();
142 session_message->presentation_id = presentationId.utf8(); 160 session_message->presentation_id = presentationId.utf8();
143 session_message->type = presentation::PresentationMessageType:: 161 session_message->type =
144 PRESENTATION_MESSAGE_TYPE_TEXT; 162 PresentationMessageType::PRESENTATION_MESSAGE_TYPE_TEXT;
145 session_message->message = message.utf8(); 163 session_message->message = message.utf8();
146 164
147 message_request_queue_.push(make_linked_ptr(session_message)); 165 message_request_queue_.push(make_linked_ptr(session_message));
148 // Start processing request if only one in the queue. 166 // Start processing request if only one in the queue.
149 if (message_request_queue_.size() == 1) { 167 if (message_request_queue_.size() == 1) {
150 const linked_ptr<presentation::SessionMessage>& request = 168 const linked_ptr<presentation::SessionMessage>& request =
151 message_request_queue_.front(); 169 message_request_queue_.front();
152 DoSendMessage(*request); 170 DoSendMessage(*request);
153 } 171 }
154 } 172 }
155 173
156 void PresentationDispatcher::sendArrayBuffer( 174 void PresentationDispatcher::sendArrayBuffer(
157 const blink::WebString& presentationUrl, 175 const blink::WebString& presentationUrl,
158 const blink::WebString& presentationId, 176 const blink::WebString& presentationId,
159 const uint8* data, 177 const uint8* data,
160 size_t length) { 178 size_t length) {
161 DCHECK(data); 179 DCHECK(data);
162 if (length > kMaxPresentationSessionMessageSize) { 180 if (length > kMaxPresentationSessionMessageSize) {
163 // TODO(crbug.com/459008): Same as in sendString(). 181 // TODO(crbug.com/459008): Same as in sendString().
164 LOG(WARNING) << "data size exceeded limit!"; 182 LOG(WARNING) << "data size exceeded limit!";
165 return; 183 return;
166 } 184 }
167 185
168 const std::vector<uint8> vector(data, data + length);
169 presentation::SessionMessage* session_message = 186 presentation::SessionMessage* session_message =
170 new presentation::SessionMessage(); 187 GetMojoSessionMessage(presentationUrl, presentationId,
171 session_message->presentation_url = presentationUrl.utf8(); 188 PresentationMessageType::
172 session_message->presentation_id = presentationId.utf8(); 189 PRESENTATION_MESSAGE_TYPE_ARRAY_BUFFER,
173 session_message->type = presentation::PresentationMessageType:: 190 data, length);
174 PRESENTATION_MESSAGE_TYPE_ARRAY_BUFFER;
175 session_message->data = mojo::Array<uint8>::From(vector);
176
177 message_request_queue_.push(make_linked_ptr(session_message)); 191 message_request_queue_.push(make_linked_ptr(session_message));
178 // Start processing request if only one in the queue. 192 // Start processing request if only one in the queue.
179 if (message_request_queue_.size() == 1) { 193 if (message_request_queue_.size() == 1) {
180 const linked_ptr<presentation::SessionMessage>& request = 194 const linked_ptr<presentation::SessionMessage>& request =
181 message_request_queue_.front(); 195 message_request_queue_.front();
182 DoSendMessage(*request); 196 DoSendMessage(*request);
183 } 197 }
184 } 198 }
185 199
200 void PresentationDispatcher::sendBlobData(
201 const blink::WebString& presentationUrl,
202 const blink::WebString& presentationId,
203 const uint8* data,
204 size_t length) {
205 DCHECK(data);
206 if (length > kMaxPresentationSessionMessageSize) {
207 // TODO(crbug.com/459008): Same as in sendString().
208 LOG(WARNING) << "data size exceeded limit!";
209 return;
210 }
211
212 presentation::SessionMessage* session_message = GetMojoSessionMessage(
213 presentationUrl, presentationId,
214 PresentationMessageType::PRESENTATION_MESSAGE_TYPE_BLOB,
215 data, length);
216 message_request_queue_.push(make_linked_ptr(session_message));
217 if (message_request_queue_.size() == 1) {
218 const linked_ptr<presentation::SessionMessage>& request =
219 message_request_queue_.front();
220 DoSendMessage(*request);
221 }
222 }
223
186 void PresentationDispatcher::DoSendMessage( 224 void PresentationDispatcher::DoSendMessage(
187 const presentation::SessionMessage& session_message) { 225 const presentation::SessionMessage& session_message) {
188 ConnectToPresentationServiceIfNeeded(); 226 ConnectToPresentationServiceIfNeeded();
189
190 presentation::SessionMessagePtr message_request( 227 presentation::SessionMessagePtr message_request(
191 presentation::SessionMessage::New()); 228 presentation::SessionMessage::New());
192 message_request->presentation_url = session_message.presentation_url; 229 message_request->presentation_url = session_message.presentation_url;
193 message_request->presentation_id = session_message.presentation_id; 230 message_request->presentation_id = session_message.presentation_id;
194 message_request->type = session_message.type; 231 message_request->type = session_message.type;
195 if (session_message.type == presentation::PresentationMessageType:: 232 switch (session_message.type) {
196 PRESENTATION_MESSAGE_TYPE_TEXT) { 233 case PresentationMessageType::PRESENTATION_MESSAGE_TYPE_TEXT: {
197 message_request->message = session_message.message; 234 message_request->message = session_message.message;
198 } else if (session_message.type == presentation::PresentationMessageType:: 235 break;
199 PRESENTATION_MESSAGE_TYPE_ARRAY_BUFFER) { 236 }
200 message_request->data = mojo::Array<uint8>::From( 237 case PresentationMessageType::PRESENTATION_MESSAGE_TYPE_ARRAY_BUFFER:
201 session_message.data.storage()); 238 case PresentationMessageType::PRESENTATION_MESSAGE_TYPE_BLOB: {
239 message_request->data =
240 mojo::Array<uint8>::From(session_message.data.storage());
241 break;
242 }
243 default: {
244 NOTREACHED() << "Invalid presentation message type "
245 << session_message.type;
246 break;
247 }
202 } 248 }
203 249
204 presentation_service_->SendSessionMessage( 250 presentation_service_->SendSessionMessage(
205 message_request.Pass(), 251 message_request.Pass(),
206 base::Bind(&PresentationDispatcher::HandleSendMessageRequests, 252 base::Bind(&PresentationDispatcher::HandleSendMessageRequests,
207 base::Unretained(this))); 253 base::Unretained(this)));
208 } 254 }
209 255
210 void PresentationDispatcher::HandleSendMessageRequests(bool success) { 256 void PresentationDispatcher::HandleSendMessageRequests(bool success) {
211 // In normal cases, message_request_queue_ should not be empty at this point 257 // In normal cases, message_request_queue_ should not be empty at this point
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 } 362 }
317 363
318 void PresentationDispatcher::OnSessionMessagesReceived( 364 void PresentationDispatcher::OnSessionMessagesReceived(
319 mojo::Array<presentation::SessionMessagePtr> messages) { 365 mojo::Array<presentation::SessionMessagePtr> messages) {
320 // When messages is null, there is an error at presentation service side. 366 // When messages is null, there is an error at presentation service side.
321 if (!controller_ || messages.is_null()) 367 if (!controller_ || messages.is_null())
322 return; 368 return;
323 369
324 for (size_t i = 0; i < messages.size(); ++i) { 370 for (size_t i = 0; i < messages.size(); ++i) {
325 if (messages[i]->type == 371 if (messages[i]->type ==
326 presentation::PresentationMessageType::PRESENTATION_MESSAGE_TYPE_TEXT) { 372 PresentationMessageType::PRESENTATION_MESSAGE_TYPE_TEXT) {
327 controller_->didReceiveSessionTextMessage( 373 controller_->didReceiveSessionTextMessage(
328 new PresentationSessionClient(messages[i]->presentation_url, 374 new PresentationSessionClient(messages[i]->presentation_url,
329 messages[i]->presentation_id), 375 messages[i]->presentation_id),
330 blink::WebString::fromUTF8(messages[i]->message)); 376 blink::WebString::fromUTF8(messages[i]->message));
331 } else { 377 } else {
332 // TODO(haibinlu): handle binary message 378 // TODO(haibinlu): handle binary message
333 } 379 }
334 } 380 }
335 381
336 presentation_service_->ListenForSessionMessages( 382 presentation_service_->ListenForSessionMessages(
(...skipping 20 matching lines...) Expand all
357 presentation_service_->ListenForSessionStateChange(base::Bind( 403 presentation_service_->ListenForSessionStateChange(base::Bind(
358 &PresentationDispatcher::OnSessionStateChange, 404 &PresentationDispatcher::OnSessionStateChange,
359 base::Unretained(this))); 405 base::Unretained(this)));
360 presentation_service_->ListenForSessionMessages( 406 presentation_service_->ListenForSessionMessages(
361 base::Bind(&PresentationDispatcher::OnSessionMessagesReceived, 407 base::Bind(&PresentationDispatcher::OnSessionMessagesReceived,
362 base::Unretained(this))); 408 base::Unretained(this)));
363 */ 409 */
364 } 410 }
365 411
366 } // namespace content 412 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698