| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 2011 Google Inc.  All rights reserved. | 2  * Copyright (C) 2011 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 54 #include "wtf/ArrayBuffer.h" | 54 #include "wtf/ArrayBuffer.h" | 
| 55 #include "wtf/ArrayBufferView.h" | 55 #include "wtf/ArrayBufferView.h" | 
| 56 #include "wtf/Assertions.h" | 56 #include "wtf/Assertions.h" | 
| 57 #include "wtf/HashSet.h" | 57 #include "wtf/HashSet.h" | 
| 58 #include "wtf/PassOwnPtr.h" | 58 #include "wtf/PassOwnPtr.h" | 
| 59 #include "wtf/StdLibExtras.h" | 59 #include "wtf/StdLibExtras.h" | 
| 60 #include "wtf/text/CString.h" | 60 #include "wtf/text/CString.h" | 
| 61 #include "wtf/text/StringBuilder.h" | 61 #include "wtf/text/StringBuilder.h" | 
| 62 #include "wtf/text/WTFString.h" | 62 #include "wtf/text/WTFString.h" | 
| 63 | 63 | 
| 64 using namespace std; |  | 
| 65 |  | 
| 66 namespace WebCore { | 64 namespace WebCore { | 
| 67 | 65 | 
| 68 WebSocket::EventQueue::EventQueue(EventTarget* target) | 66 WebSocket::EventQueue::EventQueue(EventTarget* target) | 
| 69     : m_state(Active) | 67     : m_state(Active) | 
| 70     , m_target(target) | 68     , m_target(target) | 
| 71     , m_resumeTimer(this, &EventQueue::resumeTimerFired) { } | 69     , m_resumeTimer(this, &EventQueue::resumeTimerFired) { } | 
| 72 | 70 | 
| 73 WebSocket::EventQueue::~EventQueue() { stop(); } | 71 WebSocket::EventQueue::~EventQueue() { stop(); } | 
| 74 | 72 | 
| 75 void WebSocket::EventQueue::dispatch(PassRefPtrWillBeRawPtr<Event> event) | 73 void WebSocket::EventQueue::dispatch(PassRefPtrWillBeRawPtr<Event> event) | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 165     const UChar maximumProtocolCharacter = '~'; // U+007E. | 163     const UChar maximumProtocolCharacter = '~'; // U+007E. | 
| 166     // Set to true if character does not matches "separators" ABNF defined in | 164     // Set to true if character does not matches "separators" ABNF defined in | 
| 167     // RFC2616. SP and HT are excluded since the range check excludes them. | 165     // RFC2616. SP and HT are excluded since the range check excludes them. | 
| 168     bool isNotSeparator = character != '"' && character != '(' && character != '
     )' && character != ',' && character != '/' | 166     bool isNotSeparator = character != '"' && character != '(' && character != '
     )' && character != ',' && character != '/' | 
| 169         && !(character >= ':' && character <= '@') // U+003A - U+0040 (':', ';',
      '<', '=', '>', '?', '@'). | 167         && !(character >= ':' && character <= '@') // U+003A - U+0040 (':', ';',
      '<', '=', '>', '?', '@'). | 
| 170         && !(character >= '[' && character <= ']') // U+005B - U+005D ('[', '\\'
     , ']'). | 168         && !(character >= '[' && character <= ']') // U+005B - U+005D ('[', '\\'
     , ']'). | 
| 171         && character != '{' && character != '}'; | 169         && character != '{' && character != '}'; | 
| 172     return character >= minimumProtocolCharacter && character <= maximumProtocol
     Character && isNotSeparator; | 170     return character >= minimumProtocolCharacter && character <= maximumProtocol
     Character && isNotSeparator; | 
| 173 } | 171 } | 
| 174 | 172 | 
| 175 static bool isValidSubprotocolString(const String& protocol) | 173 bool WebSocket::isValidSubprotocolString(const String& protocol) | 
| 176 { | 174 { | 
| 177     if (protocol.isEmpty()) | 175     if (protocol.isEmpty()) | 
| 178         return false; | 176         return false; | 
| 179     for (size_t i = 0; i < protocol.length(); ++i) { | 177     for (size_t i = 0; i < protocol.length(); ++i) { | 
| 180         if (!isValidSubprotocolCharacter(protocol[i])) | 178         if (!isValidSubprotocolCharacter(protocol[i])) | 
| 181             return false; | 179             return false; | 
| 182     } | 180     } | 
| 183     return true; | 181     return true; | 
| 184 } | 182 } | 
| 185 | 183 | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 203     for (size_t i = 0; i < strings.size(); ++i) { | 201     for (size_t i = 0; i < strings.size(); ++i) { | 
| 204         if (i) | 202         if (i) | 
| 205             builder.append(separator); | 203             builder.append(separator); | 
| 206         builder.append(strings[i]); | 204         builder.append(strings[i]); | 
| 207     } | 205     } | 
| 208     return builder.toString(); | 206     return builder.toString(); | 
| 209 } | 207 } | 
| 210 | 208 | 
| 211 static unsigned long saturateAdd(unsigned long a, unsigned long b) | 209 static unsigned long saturateAdd(unsigned long a, unsigned long b) | 
| 212 { | 210 { | 
| 213     if (numeric_limits<unsigned long>::max() - a < b) | 211     if (std::numeric_limits<unsigned long>::max() - a < b) | 
| 214         return numeric_limits<unsigned long>::max(); | 212         return std::numeric_limits<unsigned long>::max(); | 
| 215     return a + b; | 213     return a + b; | 
| 216 } | 214 } | 
| 217 | 215 | 
| 218 static void setInvalidStateErrorForSendMethod(ExceptionState& exceptionState) | 216 static void setInvalidStateErrorForSendMethod(ExceptionState& exceptionState) | 
| 219 { | 217 { | 
| 220     exceptionState.throwDOMException(InvalidStateError, "Still in CONNECTING sta
     te."); | 218     exceptionState.throwDOMException(InvalidStateError, "Still in CONNECTING sta
     te."); | 
| 221 } | 219 } | 
| 222 | 220 | 
| 223 const char* WebSocket::subProtocolSeperator() | 221 const char* WebSocket::subprotocolSeperator() | 
| 224 { | 222 { | 
| 225     return ", "; | 223     return ", "; | 
| 226 } | 224 } | 
| 227 | 225 | 
| 228 WebSocket::WebSocket(ExecutionContext* context) | 226 WebSocket::WebSocket(ExecutionContext* context) | 
| 229     : ActiveDOMObject(context) | 227     : ActiveDOMObject(context) | 
| 230     , m_state(CONNECTING) | 228     , m_state(CONNECTING) | 
| 231     , m_bufferedAmount(0) | 229     , m_bufferedAmount(0) | 
| 232     , m_bufferedAmountAfterClose(0) | 230     , m_bufferedAmountAfterClose(0) | 
| 233     , m_binaryType(BinaryTypeBlob) | 231     , m_binaryType(BinaryTypeBlob) | 
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 311         Document* document = toDocument(executionContext()); | 309         Document* document = toDocument(executionContext()); | 
| 312         shouldBypassMainWorldContentSecurityPolicy = document->frame()->script()
     .shouldBypassMainWorldContentSecurityPolicy(); | 310         shouldBypassMainWorldContentSecurityPolicy = document->frame()->script()
     .shouldBypassMainWorldContentSecurityPolicy(); | 
| 313     } | 311     } | 
| 314     if (!shouldBypassMainWorldContentSecurityPolicy && !executionContext()->cont
     entSecurityPolicy()->allowConnectToSource(m_url)) { | 312     if (!shouldBypassMainWorldContentSecurityPolicy && !executionContext()->cont
     entSecurityPolicy()->allowConnectToSource(m_url)) { | 
| 315         m_state = CLOSED; | 313         m_state = CLOSED; | 
| 316         // The URL is safe to expose to JavaScript, as this check happens synchr
     onously before redirection. | 314         // The URL is safe to expose to JavaScript, as this check happens synchr
     onously before redirection. | 
| 317         exceptionState.throwSecurityError("Refused to connect to '" + m_url.elid
     edString() + "' because it violates the document's Content Security Policy."); | 315         exceptionState.throwSecurityError("Refused to connect to '" + m_url.elid
     edString() + "' because it violates the document's Content Security Policy."); | 
| 318         return; | 316         return; | 
| 319     } | 317     } | 
| 320 | 318 | 
| 321     m_channel = WebSocketChannel::create(executionContext(), this); | 319     m_channel = createChannel(executionContext(), this); | 
| 322 | 320 | 
| 323     for (size_t i = 0; i < protocols.size(); ++i) { | 321     for (size_t i = 0; i < protocols.size(); ++i) { | 
| 324         if (!isValidSubprotocolString(protocols[i])) { | 322         if (!isValidSubprotocolString(protocols[i])) { | 
| 325             m_state = CLOSED; | 323             m_state = CLOSED; | 
| 326             exceptionState.throwDOMException(SyntaxError, "The subprotocol '" + 
     encodeSubprotocolString(protocols[i]) + "' is invalid."); | 324             exceptionState.throwDOMException(SyntaxError, "The subprotocol '" + 
     encodeSubprotocolString(protocols[i]) + "' is invalid."); | 
| 327             releaseChannel(); | 325             releaseChannel(); | 
| 328             return; | 326             return; | 
| 329         } | 327         } | 
| 330     } | 328     } | 
| 331     HashSet<String> visited; | 329     HashSet<String> visited; | 
| 332     for (size_t i = 0; i < protocols.size(); ++i) { | 330     for (size_t i = 0; i < protocols.size(); ++i) { | 
| 333         if (!visited.add(protocols[i]).isNewEntry) { | 331         if (!visited.add(protocols[i]).isNewEntry) { | 
| 334             m_state = CLOSED; | 332             m_state = CLOSED; | 
| 335             exceptionState.throwDOMException(SyntaxError, "The subprotocol '" + 
     encodeSubprotocolString(protocols[i]) + "' is duplicated."); | 333             exceptionState.throwDOMException(SyntaxError, "The subprotocol '" + 
     encodeSubprotocolString(protocols[i]) + "' is duplicated."); | 
| 336             releaseChannel(); | 334             releaseChannel(); | 
| 337             return; | 335             return; | 
| 338         } | 336         } | 
| 339     } | 337     } | 
| 340 | 338 | 
| 341     String protocolString; | 339     String protocolString; | 
| 342     if (!protocols.isEmpty()) | 340     if (!protocols.isEmpty()) | 
| 343         protocolString = joinStrings(protocols, subProtocolSeperator()); | 341         protocolString = joinStrings(protocols, subprotocolSeperator()); | 
| 344 | 342 | 
| 345     if (!m_channel->connect(m_url, protocolString)) { | 343     if (!m_channel->connect(m_url, protocolString)) { | 
| 346         m_state = CLOSED; | 344         m_state = CLOSED; | 
| 347         exceptionState.throwSecurityError("An insecure WebSocket connection may 
     not be initiated from a page loaded over HTTPS."); | 345         exceptionState.throwSecurityError("An insecure WebSocket connection may 
     not be initiated from a page loaded over HTTPS."); | 
| 348         releaseChannel(); | 346         releaseChannel(); | 
| 349         return; | 347         return; | 
| 350     } | 348     } | 
| 351 } | 349 } | 
| 352 | 350 | 
| 353 void WebSocket::handleSendResult(WebSocketChannel::SendResult result, ExceptionS
     tate& exceptionState, WebSocketSendType dataType) | 351 void WebSocket::handleSendResult(WebSocketChannel::SendResult result, ExceptionS
     tate& exceptionState, WebSocketSendType dataType) | 
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 683 } | 681 } | 
| 684 | 682 | 
| 685 void WebSocket::trace(Visitor* visitor) | 683 void WebSocket::trace(Visitor* visitor) | 
| 686 { | 684 { | 
| 687     visitor->trace(m_channel); | 685     visitor->trace(m_channel); | 
| 688     visitor->trace(m_eventQueue); | 686     visitor->trace(m_eventQueue); | 
| 689     EventTargetWithInlineData::trace(visitor); | 687     EventTargetWithInlineData::trace(visitor); | 
| 690 } | 688 } | 
| 691 | 689 | 
| 692 } // namespace WebCore | 690 } // namespace WebCore | 
| OLD | NEW | 
|---|