| 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 |