OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |