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

Side by Side Diff: third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp

Issue 1414553002: Fix out-of-memory crashes related to ArrayBuffer allocation Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase+more tweaks Created 5 years, 1 month 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "config.h" 5 #include "config.h"
6 #include "modules/websockets/WebSocketChannel.h" 6 #include "modules/websockets/WebSocketChannel.h"
7 7
8 #include "core/dom/DOMArrayBuffer.h" 8 #include "core/dom/DOMArrayBuffer.h"
9 #include "core/dom/Document.h" 9 #include "core/dom/Document.h"
10 #include "core/fileapi/Blob.h" 10 #include "core/fileapi/Blob.h"
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 { 343 {
344 connect(); 344 connect();
345 { 345 {
346 InSequence s; 346 InSequence s;
347 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("foo", 3), 3)); 347 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("foo", 3), 3));
348 } 348 }
349 349
350 handleClient()->didReceiveFlowControl(handle(), 16); 350 handleClient()->didReceiveFlowControl(handle(), 16);
351 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() ); 351 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() );
352 352
353 RefPtr<DOMArrayBuffer> fooBuffer = DOMArrayBuffer::create("foo", 3); 353 RefPtr<DOMArrayBuffer> fooBuffer = DOMArrayBuffer::deprecatedCreateOrCrash(" foo", 3);
354 channel()->send(*fooBuffer, 0, 3); 354 channel()->send(*fooBuffer, 0, 3);
355 355
356 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount); 356 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount);
357 } 357 }
358 358
359 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferPartial) 359 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferPartial)
360 { 360 {
361 connect(); 361 connect();
362 { 362 {
363 InSequence s; 363 InSequence s;
364 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("foo", 3), 3)); 364 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("foo", 3), 3));
365 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("bar", 3), 3)); 365 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("bar", 3), 3));
366 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("baz", 3), 3)); 366 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("baz", 3), 3));
367 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("a", 1), 1)); 367 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("a", 1), 1));
368 } 368 }
369 369
370 handleClient()->didReceiveFlowControl(handle(), 16); 370 handleClient()->didReceiveFlowControl(handle(), 16);
371 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() ); 371 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() );
372 372
373 RefPtr<DOMArrayBuffer> foobarBuffer = DOMArrayBuffer::create("foobar", 6); 373 RefPtr<DOMArrayBuffer> foobarBuffer = DOMArrayBuffer::deprecatedCreateOrCras h("foobar", 6);
374 RefPtr<DOMArrayBuffer> qbazuxBuffer = DOMArrayBuffer::create("qbazux", 6); 374 RefPtr<DOMArrayBuffer> qbazuxBuffer = DOMArrayBuffer::deprecatedCreateOrCras h("qbazux", 6);
375 channel()->send(*foobarBuffer, 0, 3); 375 channel()->send(*foobarBuffer, 0, 3);
376 channel()->send(*foobarBuffer, 3, 3); 376 channel()->send(*foobarBuffer, 3, 3);
377 channel()->send(*qbazuxBuffer, 1, 3); 377 channel()->send(*qbazuxBuffer, 1, 3);
378 channel()->send(*qbazuxBuffer, 2, 1); 378 channel()->send(*qbazuxBuffer, 2, 1);
379 379
380 EXPECT_EQ(10ul, m_sumOfConsumedBufferedAmount); 380 EXPECT_EQ(10ul, m_sumOfConsumedBufferedAmount);
381 } 381 }
382 382
383 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferWithNullBytes) 383 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferWithNullBytes)
384 { 384 {
385 connect(); 385 connect();
386 { 386 {
387 InSequence s; 387 InSequence s;
388 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("\0ar", 3), 3)); 388 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("\0ar", 3), 3));
389 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("b\0z", 3), 3)); 389 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("b\0z", 3), 3));
390 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("qu\0", 3), 3)); 390 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("qu\0", 3), 3));
391 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("\0\0\0", 3), 3)); 391 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, Me mEq("\0\0\0", 3), 3));
392 } 392 }
393 393
394 handleClient()->didReceiveFlowControl(handle(), 16); 394 handleClient()->didReceiveFlowControl(handle(), 16);
395 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() ); 395 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() );
396 396
397 { 397 {
398 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::create("\0ar", 3); 398 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::deprecatedCreateOrCrash("\0ar ", 3);
399 channel()->send(*b, 0, 3); 399 channel()->send(*b, 0, 3);
400 } 400 }
401 { 401 {
402 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::create("b\0z", 3); 402 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::deprecatedCreateOrCrash("b\0z ", 3);
403 channel()->send(*b, 0, 3); 403 channel()->send(*b, 0, 3);
404 } 404 }
405 { 405 {
406 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::create("qu\0", 3); 406 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::deprecatedCreateOrCrash("qu\0 ", 3);
407 channel()->send(*b, 0, 3); 407 channel()->send(*b, 0, 3);
408 } 408 }
409 { 409 {
410 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::create("\0\0\0", 3); 410 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::deprecatedCreateOrCrash("\0\0 \0", 3);
411 channel()->send(*b, 0, 3); 411 channel()->send(*b, 0, 3);
412 } 412 }
413 413
414 EXPECT_EQ(12ul, m_sumOfConsumedBufferedAmount); 414 EXPECT_EQ(12ul, m_sumOfConsumedBufferedAmount);
415 } 415 }
416 416
417 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferNonLatin1UTF8) 417 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferNonLatin1UTF8)
418 { 418 {
419 connect(); 419 connect();
420 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq( "\xe7\x8b\x90", 3), 3)); 420 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq( "\xe7\x8b\x90", 3), 3));
421 421
422 handleClient()->didReceiveFlowControl(handle(), 16); 422 handleClient()->didReceiveFlowControl(handle(), 16);
423 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() ); 423 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() );
424 424
425 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::create("\xe7\x8b\x90", 3); 425 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::deprecatedCreateOrCrash("\xe7\x8b \x90", 3);
426 channel()->send(*b, 0, 3); 426 channel()->send(*b, 0, 3);
427 427
428 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount); 428 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount);
429 } 429 }
430 430
431 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferNonUTF8) 431 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferNonUTF8)
432 { 432 {
433 connect(); 433 connect();
434 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq( "\x80\xff\xe7", 3), 3)); 434 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeBinary, MemEq( "\x80\xff\xe7", 3), 3));
435 435
436 handleClient()->didReceiveFlowControl(handle(), 16); 436 handleClient()->didReceiveFlowControl(handle(), 16);
437 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() ); 437 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() );
438 438
439 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::create("\x80\xff\xe7", 3); 439 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::deprecatedCreateOrCrash("\x80\xff \xe7", 3);
440 channel()->send(*b, 0, 3); 440 channel()->send(*b, 0, 3);
441 441
442 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount); 442 EXPECT_EQ(3ul, m_sumOfConsumedBufferedAmount);
443 } 443 }
444 444
445 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferNonLatin1UTF8Continu ation) 445 TEST_F(DocumentWebSocketChannelTest, sendBinaryInArrayBufferNonLatin1UTF8Continu ation)
446 { 446 {
447 connect(); 447 connect();
448 Checkpoint checkpoint; 448 Checkpoint checkpoint;
449 { 449 {
450 InSequence s; 450 InSequence s;
451 EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeBinary, M emEq("\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7", 16), 16 )); 451 EXPECT_CALL(*handle(), send(false, WebSocketHandle::MessageTypeBinary, M emEq("\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7", 16), 16 ));
452 EXPECT_CALL(checkpoint, Call(1)); 452 EXPECT_CALL(checkpoint, Call(1));
453 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuati on, MemEq("\x8b\x90", 2), 2)); 453 EXPECT_CALL(*handle(), send(true, WebSocketHandle::MessageTypeContinuati on, MemEq("\x8b\x90", 2), 2));
454 } 454 }
455 455
456 handleClient()->didReceiveFlowControl(handle(), 16); 456 handleClient()->didReceiveFlowControl(handle(), 16);
457 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() ); 457 EXPECT_CALL(*channelClient(), didConsumeBufferedAmount(_)).Times(AnyNumber() );
458 458
459 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::create("\xe7\x8b\x90\xe7\x8b\x90\ xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90", 18); 459 RefPtr<DOMArrayBuffer> b = DOMArrayBuffer::deprecatedCreateOrCrash("\xe7\x8b \x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90\xe7\x8b\x90", 18);
460 channel()->send(*b, 0, 18); 460 channel()->send(*b, 0, 18);
461 checkpoint.Call(1); 461 checkpoint.Call(1);
462 462
463 handleClient()->didReceiveFlowControl(handle(), 16); 463 handleClient()->didReceiveFlowControl(handle(), 16);
464 464
465 EXPECT_EQ(18ul, m_sumOfConsumedBufferedAmount); 465 EXPECT_EQ(18ul, m_sumOfConsumedBufferedAmount);
466 } 466 }
467 467
468 // FIXME: Add tests for WebSocketChannel::send(PassRefPtr<BlobDataHandle>) 468 // FIXME: Add tests for WebSocketChannel::send(PassRefPtr<BlobDataHandle>)
469 469
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 EXPECT_CALL(*channelClient(), didError()); 681 EXPECT_CALL(*channelClient(), didError());
682 EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHa ndshakeIncomplete, WebSocketChannel::CloseEventCodeAbnormalClosure, String())); 682 EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHa ndshakeIncomplete, WebSocketChannel::CloseEventCodeAbnormalClosure, String()));
683 } 683 }
684 684
685 channel()->fail("fail message from WebSocket", ErrorMessageLevel, "sourceURL ", 1234); 685 channel()->fail("fail message from WebSocket", ErrorMessageLevel, "sourceURL ", 1234);
686 } 686 }
687 687
688 } // namespace 688 } // namespace
689 689
690 } // namespace blink 690 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698