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

Side by Side Diff: Source/modules/websockets/WebSocket.cpp

Issue 298893008: Add WebSocket unittests. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase Created 6 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
« no previous file with comments | « Source/modules/websockets/WebSocket.h ('k') | Source/modules/websockets/WebSocketHandshake.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « Source/modules/websockets/WebSocket.h ('k') | Source/modules/websockets/WebSocketHandshake.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698