| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "platform/inspector_protocol/Parser.h" | 5 #include "platform/inspector_protocol/Parser.h" |
| 6 | 6 |
| 7 #include "platform/inspector_protocol/String16.h" | 7 #include "platform/inspector_protocol/String16.h" |
| 8 #include "platform/inspector_protocol/Values.h" | 8 #include "platform/inspector_protocol/Values.h" |
| 9 | 9 |
| 10 namespace blink { | 10 namespace blink { |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 break; | 394 break; |
| 395 } | 395 } |
| 396 case ArrayBegin: { | 396 case ArrayBegin: { |
| 397 OwnPtr<ListValue> array = ListValue::create(); | 397 OwnPtr<ListValue> array = ListValue::create(); |
| 398 start = tokenEnd; | 398 start = tokenEnd; |
| 399 token = parseToken(start, end, &tokenStart, &tokenEnd); | 399 token = parseToken(start, end, &tokenStart, &tokenEnd); |
| 400 while (token != ArrayEnd) { | 400 while (token != ArrayEnd) { |
| 401 OwnPtr<Value> arrayNode = buildValue(start, end, &tokenEnd, depth +
1); | 401 OwnPtr<Value> arrayNode = buildValue(start, end, &tokenEnd, depth +
1); |
| 402 if (!arrayNode) | 402 if (!arrayNode) |
| 403 return nullptr; | 403 return nullptr; |
| 404 array->pushValue(arrayNode.release()); | 404 array->pushValue(std::move(arrayNode)); |
| 405 | 405 |
| 406 // After a list value, we expect a comma or the end of the list. | 406 // After a list value, we expect a comma or the end of the list. |
| 407 start = tokenEnd; | 407 start = tokenEnd; |
| 408 token = parseToken(start, end, &tokenStart, &tokenEnd); | 408 token = parseToken(start, end, &tokenStart, &tokenEnd); |
| 409 if (token == ListSeparator) { | 409 if (token == ListSeparator) { |
| 410 start = tokenEnd; | 410 start = tokenEnd; |
| 411 token = parseToken(start, end, &tokenStart, &tokenEnd); | 411 token = parseToken(start, end, &tokenStart, &tokenEnd); |
| 412 if (token == ArrayEnd) | 412 if (token == ArrayEnd) |
| 413 return nullptr; | 413 return nullptr; |
| 414 } else if (token != ArrayEnd) { | 414 } else if (token != ArrayEnd) { |
| 415 // Unexpected value after list value. Bail out. | 415 // Unexpected value after list value. Bail out. |
| 416 return nullptr; | 416 return nullptr; |
| 417 } | 417 } |
| 418 } | 418 } |
| 419 if (token != ArrayEnd) | 419 if (token != ArrayEnd) |
| 420 return nullptr; | 420 return nullptr; |
| 421 result = array.release(); | 421 result = std::move(array); |
| 422 break; | 422 break; |
| 423 } | 423 } |
| 424 case ObjectBegin: { | 424 case ObjectBegin: { |
| 425 OwnPtr<DictionaryValue> object = DictionaryValue::create(); | 425 OwnPtr<DictionaryValue> object = DictionaryValue::create(); |
| 426 start = tokenEnd; | 426 start = tokenEnd; |
| 427 token = parseToken(start, end, &tokenStart, &tokenEnd); | 427 token = parseToken(start, end, &tokenStart, &tokenEnd); |
| 428 while (token != ObjectEnd) { | 428 while (token != ObjectEnd) { |
| 429 if (token != StringLiteral) | 429 if (token != StringLiteral) |
| 430 return nullptr; | 430 return nullptr; |
| 431 String16 key; | 431 String16 key; |
| 432 if (!decodeString(tokenStart + 1, tokenEnd - 1, &key)) | 432 if (!decodeString(tokenStart + 1, tokenEnd - 1, &key)) |
| 433 return nullptr; | 433 return nullptr; |
| 434 start = tokenEnd; | 434 start = tokenEnd; |
| 435 | 435 |
| 436 token = parseToken(start, end, &tokenStart, &tokenEnd); | 436 token = parseToken(start, end, &tokenStart, &tokenEnd); |
| 437 if (token != ObjectPairSeparator) | 437 if (token != ObjectPairSeparator) |
| 438 return nullptr; | 438 return nullptr; |
| 439 start = tokenEnd; | 439 start = tokenEnd; |
| 440 | 440 |
| 441 OwnPtr<Value> value = buildValue(start, end, &tokenEnd, depth + 1); | 441 OwnPtr<Value> value = buildValue(start, end, &tokenEnd, depth + 1); |
| 442 if (!value) | 442 if (!value) |
| 443 return nullptr; | 443 return nullptr; |
| 444 object->setValue(key, value.release()); | 444 object->setValue(key, std::move(value)); |
| 445 start = tokenEnd; | 445 start = tokenEnd; |
| 446 | 446 |
| 447 // After a key/value pair, we expect a comma or the end of the | 447 // After a key/value pair, we expect a comma or the end of the |
| 448 // object. | 448 // object. |
| 449 token = parseToken(start, end, &tokenStart, &tokenEnd); | 449 token = parseToken(start, end, &tokenStart, &tokenEnd); |
| 450 if (token == ListSeparator) { | 450 if (token == ListSeparator) { |
| 451 start = tokenEnd; | 451 start = tokenEnd; |
| 452 token = parseToken(start, end, &tokenStart, &tokenEnd); | 452 token = parseToken(start, end, &tokenStart, &tokenEnd); |
| 453 if (token == ObjectEnd) | 453 if (token == ObjectEnd) |
| 454 return nullptr; | 454 return nullptr; |
| 455 } else if (token != ObjectEnd) { | 455 } else if (token != ObjectEnd) { |
| 456 // Unexpected value after last object value. Bail out. | 456 // Unexpected value after last object value. Bail out. |
| 457 return nullptr; | 457 return nullptr; |
| 458 } | 458 } |
| 459 } | 459 } |
| 460 if (token != ObjectEnd) | 460 if (token != ObjectEnd) |
| 461 return nullptr; | 461 return nullptr; |
| 462 result = object.release(); | 462 result = std::move(object); |
| 463 break; | 463 break; |
| 464 } | 464 } |
| 465 | 465 |
| 466 default: | 466 default: |
| 467 // We got a token that's not a value. | 467 // We got a token that's not a value. |
| 468 return nullptr; | 468 return nullptr; |
| 469 } | 469 } |
| 470 | 470 |
| 471 skipWhitespaceAndComments(tokenEnd, end, valueTokenEnd); | 471 skipWhitespaceAndComments(tokenEnd, end, valueTokenEnd); |
| 472 return result.release(); | 472 return result; |
| 473 } | 473 } |
| 474 | 474 |
| 475 PassOwnPtr<Value> parseJSONInternal(const UChar* start, unsigned length) | 475 PassOwnPtr<Value> parseJSONInternal(const UChar* start, unsigned length) |
| 476 { | 476 { |
| 477 const UChar* end = start + length; | 477 const UChar* end = start + length; |
| 478 const UChar *tokenEnd; | 478 const UChar *tokenEnd; |
| 479 OwnPtr<Value> value = buildValue(start, end, &tokenEnd, 0); | 479 OwnPtr<Value> value = buildValue(start, end, &tokenEnd, 0); |
| 480 if (!value || tokenEnd != end) | 480 if (!value || tokenEnd != end) |
| 481 return nullptr; | 481 return nullptr; |
| 482 return value.release(); | 482 return value; |
| 483 } | 483 } |
| 484 | 484 |
| 485 } // anonymous namespace | 485 } // anonymous namespace |
| 486 | 486 |
| 487 PassOwnPtr<Value> parseJSON(const String16& json) | 487 PassOwnPtr<Value> parseJSON(const String16& json) |
| 488 { | 488 { |
| 489 if (json.isEmpty()) | 489 if (json.isEmpty()) |
| 490 return nullptr; | 490 return nullptr; |
| 491 return parseJSONInternal(json.characters16(), json.length()); | 491 return parseJSONInternal(json.characters16(), json.length()); |
| 492 } | 492 } |
| 493 | 493 |
| 494 } // namespace protocol | 494 } // namespace protocol |
| 495 } // namespace blink | 495 } // namespace blink |
| OLD | NEW |