| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 #include "core/fileapi/FileReaderLoaderClient.h" | 38 #include "core/fileapi/FileReaderLoaderClient.h" |
| 39 #include "core/frame/LocalFrame.h" | 39 #include "core/frame/LocalFrame.h" |
| 40 #include "core/inspector/ConsoleMessage.h" | 40 #include "core/inspector/ConsoleMessage.h" |
| 41 #include "core/inspector/InspectorInstrumentation.h" | 41 #include "core/inspector/InspectorInstrumentation.h" |
| 42 #include "core/loader/FrameLoader.h" | 42 #include "core/loader/FrameLoader.h" |
| 43 #include "core/loader/FrameLoaderClient.h" | 43 #include "core/loader/FrameLoaderClient.h" |
| 44 #include "core/loader/MixedContentChecker.h" | 44 #include "core/loader/MixedContentChecker.h" |
| 45 #include "modules/websockets/InspectorWebSocketEvents.h" | 45 #include "modules/websockets/InspectorWebSocketEvents.h" |
| 46 #include "modules/websockets/WebSocketChannelClient.h" | 46 #include "modules/websockets/WebSocketChannelClient.h" |
| 47 #include "modules/websockets/WebSocketFrame.h" | 47 #include "modules/websockets/WebSocketFrame.h" |
| 48 #include "modules/websockets/WebSocketHandle.h" |
| 48 #include "platform/network/NetworkLog.h" | 49 #include "platform/network/NetworkLog.h" |
| 49 #include "platform/network/WebSocketHandshakeRequest.h" | 50 #include "platform/network/WebSocketHandshakeRequest.h" |
| 50 #include "platform/weborigin/SecurityOrigin.h" | 51 #include "platform/weborigin/SecurityOrigin.h" |
| 51 #include "public/platform/Platform.h" | 52 #include "public/platform/Platform.h" |
| 52 #include "public/platform/WebSecurityOrigin.h" | |
| 53 #include "public/platform/WebString.h" | |
| 54 #include "public/platform/WebURL.h" | |
| 55 #include "public/platform/WebVector.h" | |
| 56 #include "public/platform/modules/websockets/WebSocketHandshakeRequestInfo.h" | |
| 57 #include "public/platform/modules/websockets/WebSocketHandshakeResponseInfo.h" | |
| 58 #include "wtf/PtrUtil.h" | 53 #include "wtf/PtrUtil.h" |
| 59 #include <memory> | 54 #include <memory> |
| 60 | 55 |
| 61 namespace blink { | 56 namespace blink { |
| 62 | 57 |
| 63 class DocumentWebSocketChannel::BlobLoader final : public GarbageCollectedFinali
zed<DocumentWebSocketChannel::BlobLoader>, public FileReaderLoaderClient { | 58 class DocumentWebSocketChannel::BlobLoader final : public GarbageCollectedFinali
zed<DocumentWebSocketChannel::BlobLoader>, public FileReaderLoaderClient { |
| 64 public: | 59 public: |
| 65 BlobLoader(PassRefPtr<BlobDataHandle>, DocumentWebSocketChannel*); | 60 BlobLoader(PassRefPtr<BlobDataHandle>, DocumentWebSocketChannel*); |
| 66 ~BlobLoader() override { } | 61 ~BlobLoader() override { } |
| 67 | 62 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 } | 124 } |
| 130 | 125 |
| 131 void DocumentWebSocketChannel::BlobLoader::didFail(FileError::ErrorCode errorCod
e) | 126 void DocumentWebSocketChannel::BlobLoader::didFail(FileError::ErrorCode errorCod
e) |
| 132 { | 127 { |
| 133 m_channel->didFailLoadingBlob(errorCode); | 128 m_channel->didFailLoadingBlob(errorCode); |
| 134 // |this| is deleted here. | 129 // |this| is deleted here. |
| 135 } | 130 } |
| 136 | 131 |
| 137 DocumentWebSocketChannel::DocumentWebSocketChannel(Document* document, WebSocket
ChannelClient* client, std::unique_ptr<SourceLocation> location, WebSocketHandle
*handle) | 132 DocumentWebSocketChannel::DocumentWebSocketChannel(Document* document, WebSocket
ChannelClient* client, std::unique_ptr<SourceLocation> location, WebSocketHandle
*handle) |
| 138 : ContextLifecycleObserver(document) | 133 : ContextLifecycleObserver(document) |
| 139 , m_handle(wrapUnique(handle ? handle : Platform::current()->createWebSocket
Handle())) | 134 , m_handle(wrapUnique(handle ? handle : new WebSocketHandle())) |
| 140 , m_client(client) | 135 , m_client(client) |
| 141 , m_identifier(createUniqueIdentifier()) | 136 , m_identifier(createUniqueIdentifier()) |
| 142 , m_sendingQuota(0) | 137 , m_sendingQuota(0) |
| 143 , m_receivedDataSizeForFlowControl(receivedDataSizeForFlowControlHighWaterMa
rk * 2) // initial quota | 138 , m_receivedDataSizeForFlowControl(receivedDataSizeForFlowControlHighWaterMa
rk * 2) // initial quota |
| 144 , m_sentSizeOfTopMessage(0) | 139 , m_sentSizeOfTopMessage(0) |
| 145 , m_locationAtConstruction(std::move(location)) | 140 , m_locationAtConstruction(std::move(location)) |
| 146 { | 141 { |
| 147 } | 142 } |
| 148 | 143 |
| 149 DocumentWebSocketChannel::~DocumentWebSocketChannel() | 144 DocumentWebSocketChannel::~DocumentWebSocketChannel() |
| (...skipping 18 matching lines...) Expand all Loading... |
| 168 | 163 |
| 169 m_url = url; | 164 m_url = url; |
| 170 Vector<String> protocols; | 165 Vector<String> protocols; |
| 171 // Avoid placing an empty token in the Vector when the protocol string is | 166 // Avoid placing an empty token in the Vector when the protocol string is |
| 172 // empty. | 167 // empty. |
| 173 if (!protocol.isEmpty()) { | 168 if (!protocol.isEmpty()) { |
| 174 // Since protocol is already verified and escaped, we can simply split | 169 // Since protocol is already verified and escaped, we can simply split |
| 175 // it. | 170 // it. |
| 176 protocol.split(", ", true, protocols); | 171 protocol.split(", ", true, protocols); |
| 177 } | 172 } |
| 178 WebVector<WebString> webProtocols(protocols.size()); | 173 |
| 179 for (size_t i = 0; i < protocols.size(); ++i) { | 174 if (document()->frame()) { |
| 180 webProtocols[i] = protocols[i]; | 175 // Initialize the WebSocketHandle with the frame's InterfaceProvider to |
| 176 // provide the WebSocket implementation with context about this frame. |
| 177 // This is important so that the browser can show UI associated with |
| 178 // the WebSocket (e.g., for certificate errors). |
| 179 m_handle->initialize(document()->frame()->interfaceProvider()); |
| 180 } else { |
| 181 m_handle->initialize(Platform::current()->interfaceProvider()); |
| 181 } | 182 } |
| 182 | 183 m_handle->connect(url, protocols, getExecutionContext()->getSecurityOrigin()
, document()->firstPartyForCookies(), document()->userAgent(), this); |
| 183 if (document()->frame()) | |
| 184 document()->frame()->loader().client()->dispatchWillOpenWebSocket(m_hand
le.get()); | |
| 185 m_handle->connect(url, webProtocols, WebSecurityOrigin(getExecutionContext()
->getSecurityOrigin()), document()->firstPartyForCookies(), document()->userAgen
t(), this); | |
| 186 | 184 |
| 187 flowControlIfNecessary(); | 185 flowControlIfNecessary(); |
| 188 TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketCreate", TRACE_EVENT_SCO
PE_THREAD, "data", InspectorWebSocketCreateEvent::data(document(), m_identifier,
url, protocol)); | 186 TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketCreate", TRACE_EVENT_SCO
PE_THREAD, "data", InspectorWebSocketCreateEvent::data(document(), m_identifier,
url, protocol)); |
| 189 InspectorInstrumentation::didCreateWebSocket(document(), m_identifier, url,
protocol); | 187 InspectorInstrumentation::didCreateWebSocket(document(), m_identifier, url,
protocol); |
| 190 return true; | 188 return true; |
| 191 } | 189 } |
| 192 | 190 |
| 193 void DocumentWebSocketChannel::send(const CString& message) | 191 void DocumentWebSocketChannel::send(const CString& message) |
| 194 { | 192 { |
| 195 NETWORK_DVLOG(1) << this << " sendText(" << message << ")"; | 193 NETWORK_DVLOG(1) << this << " sendText(" << message << ")"; |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 } | 402 } |
| 405 | 403 |
| 406 Document* DocumentWebSocketChannel::document() | 404 Document* DocumentWebSocketChannel::document() |
| 407 { | 405 { |
| 408 // This context is always a Document. See the constructor. | 406 // This context is always a Document. See the constructor. |
| 409 ExecutionContext* context = getExecutionContext(); | 407 ExecutionContext* context = getExecutionContext(); |
| 410 ASSERT(context->isDocument()); | 408 ASSERT(context->isDocument()); |
| 411 return toDocument(context); | 409 return toDocument(context); |
| 412 } | 410 } |
| 413 | 411 |
| 414 void DocumentWebSocketChannel::didConnect(WebSocketHandle* handle, const WebStri
ng& selectedProtocol, const WebString& extensions) | 412 void DocumentWebSocketChannel::didConnect(WebSocketHandle* handle, const String&
selectedProtocol, const String& extensions) |
| 415 { | 413 { |
| 416 NETWORK_DVLOG(1) << this << " didConnect(" << handle << ", " << String(selec
tedProtocol) << ", " << String(extensions) << ")"; | 414 NETWORK_DVLOG(1) << this << " didConnect(" << handle << ", " << String(selec
tedProtocol) << ", " << String(extensions) << ")"; |
| 417 | 415 |
| 418 ASSERT(m_handle); | 416 ASSERT(m_handle); |
| 419 ASSERT(handle == m_handle.get()); | 417 ASSERT(handle == m_handle.get()); |
| 420 ASSERT(m_client); | 418 ASSERT(m_client); |
| 421 | 419 |
| 422 m_client->didConnect(selectedProtocol, extensions); | 420 m_client->didConnect(selectedProtocol, extensions); |
| 423 } | 421 } |
| 424 | 422 |
| 425 void DocumentWebSocketChannel::didStartOpeningHandshake(WebSocketHandle* handle,
const WebSocketHandshakeRequestInfo& request) | 423 void DocumentWebSocketChannel::didStartOpeningHandshake(WebSocketHandle* handle,
PassRefPtr<WebSocketHandshakeRequest> request) |
| 426 { | 424 { |
| 427 NETWORK_DVLOG(1) << this << " didStartOpeningHandshake(" << handle << ")"; | 425 NETWORK_DVLOG(1) << this << " didStartOpeningHandshake(" << handle << ")"; |
| 428 | 426 |
| 429 ASSERT(m_handle); | 427 ASSERT(m_handle); |
| 430 ASSERT(handle == m_handle.get()); | 428 ASSERT(handle == m_handle.get()); |
| 431 | 429 |
| 432 TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketSendHandshakeRequest", T
RACE_EVENT_SCOPE_THREAD, "data", InspectorWebSocketEvent::data(document(), m_ide
ntifier)); | 430 TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketSendHandshakeRequest", T
RACE_EVENT_SCOPE_THREAD, "data", InspectorWebSocketEvent::data(document(), m_ide
ntifier)); |
| 433 InspectorInstrumentation::willSendWebSocketHandshakeRequest(document(), m_id
entifier, &request.toCoreRequest()); | 431 InspectorInstrumentation::willSendWebSocketHandshakeRequest(document(), m_id
entifier, request.get()); |
| 434 m_handshakeRequest = WebSocketHandshakeRequest::create(request.toCoreRequest
()); | 432 m_handshakeRequest = request; |
| 435 } | 433 } |
| 436 | 434 |
| 437 void DocumentWebSocketChannel::didFinishOpeningHandshake(WebSocketHandle* handle
, const WebSocketHandshakeResponseInfo& response) | 435 void DocumentWebSocketChannel::didFinishOpeningHandshake(WebSocketHandle* handle
, const WebSocketHandshakeResponse* response) |
| 438 { | 436 { |
| 439 NETWORK_DVLOG(1) << this << " didFinishOpeningHandshake(" << handle << ")"; | 437 NETWORK_DVLOG(1) << this << " didFinishOpeningHandshake(" << handle << ")"; |
| 440 | 438 |
| 441 ASSERT(m_handle); | 439 ASSERT(m_handle); |
| 442 ASSERT(handle == m_handle.get()); | 440 ASSERT(handle == m_handle.get()); |
| 443 | 441 |
| 444 TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketReceiveHandshakeResponse
", TRACE_EVENT_SCOPE_THREAD, "data", InspectorWebSocketEvent::data(document(), m
_identifier)); | 442 TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketReceiveHandshakeResponse
", TRACE_EVENT_SCOPE_THREAD, "data", InspectorWebSocketEvent::data(document(), m
_identifier)); |
| 445 InspectorInstrumentation::didReceiveWebSocketHandshakeResponse(document(), m
_identifier, m_handshakeRequest.get(), &response.toCoreResponse()); | 443 InspectorInstrumentation::didReceiveWebSocketHandshakeResponse(document(), m
_identifier, m_handshakeRequest.get(), response); |
| 446 m_handshakeRequest.clear(); | 444 m_handshakeRequest.clear(); |
| 447 } | 445 } |
| 448 | 446 |
| 449 void DocumentWebSocketChannel::didFail(WebSocketHandle* handle, const WebString&
message) | 447 void DocumentWebSocketChannel::didFail(WebSocketHandle* handle, const String& me
ssage) |
| 450 { | 448 { |
| 451 NETWORK_DVLOG(1) << this << " didFail(" << handle << ", " << String(message)
<< ")"; | 449 NETWORK_DVLOG(1) << this << " didFail(" << handle << ", " << String(message)
<< ")"; |
| 452 | 450 |
| 453 ASSERT(m_handle); | 451 ASSERT(m_handle); |
| 454 ASSERT(handle == m_handle.get()); | 452 ASSERT(handle == m_handle.get()); |
| 455 | 453 |
| 456 // This function is called when the browser is required to fail the | 454 // This function is called when the browser is required to fail the |
| 457 // WebSocketConnection. Hence we fail this channel by calling | 455 // WebSocketConnection. Hence we fail this channel by calling |
| 458 // |this->failAsError| function. | 456 // |this->failAsError| function. |
| 459 failAsError(message); | 457 failAsError(message); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 } else { | 502 } else { |
| 505 m_client->didReceiveTextMessage(message); | 503 m_client->didReceiveTextMessage(message); |
| 506 } | 504 } |
| 507 } else { | 505 } else { |
| 508 std::unique_ptr<Vector<char>> binaryData = wrapUnique(new Vector<char>); | 506 std::unique_ptr<Vector<char>> binaryData = wrapUnique(new Vector<char>); |
| 509 binaryData->swap(m_receivingMessageData); | 507 binaryData->swap(m_receivingMessageData); |
| 510 m_client->didReceiveBinaryMessage(std::move(binaryData)); | 508 m_client->didReceiveBinaryMessage(std::move(binaryData)); |
| 511 } | 509 } |
| 512 } | 510 } |
| 513 | 511 |
| 514 void DocumentWebSocketChannel::didClose(WebSocketHandle* handle, bool wasClean,
unsigned short code, const WebString& reason) | 512 void DocumentWebSocketChannel::didClose(WebSocketHandle* handle, bool wasClean,
unsigned short code, const String& reason) |
| 515 { | 513 { |
| 516 NETWORK_DVLOG(1) << this << " didClose(" << handle << ", " << wasClean << ",
" << code << ", " << String(reason) << ")"; | 514 NETWORK_DVLOG(1) << this << " didClose(" << handle << ", " << wasClean << ",
" << code << ", " << String(reason) << ")"; |
| 517 | 515 |
| 518 ASSERT(m_handle); | 516 ASSERT(m_handle); |
| 519 ASSERT(handle == m_handle.get()); | 517 ASSERT(handle == m_handle.get()); |
| 520 | 518 |
| 521 m_handle.reset(); | 519 m_handle.reset(); |
| 522 | 520 |
| 523 if (m_identifier) { | 521 if (m_identifier) { |
| 524 TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketDestroy", TRACE_EVEN
T_SCOPE_THREAD, "data", InspectorWebSocketEvent::data(document(), m_identifier))
; | 522 TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketDestroy", TRACE_EVEN
T_SCOPE_THREAD, "data", InspectorWebSocketEvent::data(document(), m_identifier))
; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 WebSocketChannel::trace(visitor); | 582 WebSocketChannel::trace(visitor); |
| 585 ContextLifecycleObserver::trace(visitor); | 583 ContextLifecycleObserver::trace(visitor); |
| 586 } | 584 } |
| 587 | 585 |
| 588 std::ostream& operator<<(std::ostream& ostream, const DocumentWebSocketChannel*
channel) | 586 std::ostream& operator<<(std::ostream& ostream, const DocumentWebSocketChannel*
channel) |
| 589 { | 587 { |
| 590 return ostream << "DocumentWebSocketChannel " << static_cast<const void*>(ch
annel); | 588 return ostream << "DocumentWebSocketChannel " << static_cast<const void*>(ch
annel); |
| 591 } | 589 } |
| 592 | 590 |
| 593 } // namespace blink | 591 } // namespace blink |
| OLD | NEW |