| 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/Decimal.h" | 7 #include "platform/inspector_protocol/String16.h" |
| 8 #include "platform/inspector_protocol/Values.h" | 8 #include "platform/inspector_protocol/Values.h" |
| 9 #include "wtf/text/StringBuilder.h" | |
| 10 #include "wtf/text/UTF8.h" | |
| 11 | 9 |
| 12 namespace blink { | 10 namespace blink { |
| 13 namespace protocol { | 11 namespace protocol { |
| 14 | 12 |
| 15 namespace { | 13 namespace { |
| 16 | 14 |
| 17 const int stackLimit = 1000; | 15 const int stackLimit = 1000; |
| 18 | 16 |
| 19 enum Token { | 17 enum Token { |
| 20 ObjectBegin, | 18 ObjectBegin, |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 return c - '0'; | 290 return c - '0'; |
| 293 if ('A' <= c && c <= 'F') | 291 if ('A' <= c && c <= 'F') |
| 294 return c - 'A' + 10; | 292 return c - 'A' + 10; |
| 295 if ('a' <= c && c <= 'f') | 293 if ('a' <= c && c <= 'f') |
| 296 return c - 'a' + 10; | 294 return c - 'a' + 10; |
| 297 ASSERT_NOT_REACHED(); | 295 ASSERT_NOT_REACHED(); |
| 298 return 0; | 296 return 0; |
| 299 } | 297 } |
| 300 | 298 |
| 301 template<typename CharType> | 299 template<typename CharType> |
| 302 bool decodeUTF8(const CharType* start, const CharType* end, const CharType** utf
8charEnd, StringBuilder* output) | 300 bool decodeUTF8(const CharType* start, const CharType* end, const CharType** utf
8charEnd, String16Builder* output) |
| 303 { | 301 { |
| 304 UChar utf16[4] = {0}; | 302 UChar utf16[4] = {0}; |
| 305 char utf8[6] = {0}; | 303 char utf8[6] = {0}; |
| 306 size_t utf8count = 0; | 304 size_t utf8count = 0; |
| 307 | 305 |
| 308 while (start < end) { | 306 while (start < end) { |
| 309 if (start + 1 >= end || *start != '\\' || *(start + 1) != 'x') | 307 if (start + 1 >= end || *start != '\\' || *(start + 1) != 'x') |
| 310 return false; | 308 return false; |
| 311 start += 2; | 309 start += 2; |
| 312 | 310 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 336 | 334 |
| 337 // Keep accumulating utf8 characters up to buffer length (6 should be en
ough). | 335 // Keep accumulating utf8 characters up to buffer length (6 should be en
ough). |
| 338 if (utf8count >= WTF_ARRAY_LENGTH(utf8)) | 336 if (utf8count >= WTF_ARRAY_LENGTH(utf8)) |
| 339 return false; | 337 return false; |
| 340 } | 338 } |
| 341 | 339 |
| 342 return false; | 340 return false; |
| 343 } | 341 } |
| 344 | 342 |
| 345 template<typename CharType> | 343 template<typename CharType> |
| 346 bool decodeString(const CharType* start, const CharType* end, StringBuilder* out
put) | 344 bool decodeString(const CharType* start, const CharType* end, String16Builder* o
utput) |
| 347 { | 345 { |
| 348 while (start < end) { | 346 while (start < end) { |
| 349 UChar c = *start++; | 347 UChar c = *start++; |
| 350 if ('\\' != c) { | 348 if ('\\' != c) { |
| 351 output->append(c); | 349 output->append(c); |
| 352 continue; | 350 continue; |
| 353 } | 351 } |
| 354 c = *start++; | 352 c = *start++; |
| 355 | 353 |
| 356 if (c == 'x') { | 354 if (c == 'x') { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 | 398 |
| 401 template<typename CharType> | 399 template<typename CharType> |
| 402 bool decodeString(const CharType* start, const CharType* end, String* output) | 400 bool decodeString(const CharType* start, const CharType* end, String* output) |
| 403 { | 401 { |
| 404 if (start == end) { | 402 if (start == end) { |
| 405 *output = ""; | 403 *output = ""; |
| 406 return true; | 404 return true; |
| 407 } | 405 } |
| 408 if (start > end) | 406 if (start > end) |
| 409 return false; | 407 return false; |
| 410 StringBuilder buffer; | 408 String16Builder buffer; |
| 411 buffer.reserveCapacity(end - start); | 409 buffer.reserveCapacity(end - start); |
| 412 if (!decodeString(start, end, &buffer)) | 410 if (!decodeString(start, end, &buffer)) |
| 413 return false; | 411 return false; |
| 414 *output = buffer.toString(); | 412 *output = buffer.toString(); |
| 415 // Validate constructed utf16 string. | 413 // Validate constructed utf16 string. |
| 416 if (output->utf8(StrictUTF8Conversion).isNull()) | 414 if (output->utf8(StrictUTF8Conversion).isNull()) |
| 417 return false; | 415 return false; |
| 418 return true; | 416 return true; |
| 419 } | 417 } |
| 420 | 418 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 435 result = Value::null(); | 433 result = Value::null(); |
| 436 break; | 434 break; |
| 437 case BoolTrue: | 435 case BoolTrue: |
| 438 result = FundamentalValue::create(true); | 436 result = FundamentalValue::create(true); |
| 439 break; | 437 break; |
| 440 case BoolFalse: | 438 case BoolFalse: |
| 441 result = FundamentalValue::create(false); | 439 result = FundamentalValue::create(false); |
| 442 break; | 440 break; |
| 443 case Number: { | 441 case Number: { |
| 444 bool ok; | 442 bool ok; |
| 445 double value = charactersToDouble(tokenStart, tokenEnd - tokenStart, &ok
); | 443 double value = String16::charactersToDouble(tokenStart, tokenEnd - token
Start, &ok); |
| 446 if (Decimal::fromDouble(value).isInfinity()) | |
| 447 ok = false; | |
| 448 if (!ok) | 444 if (!ok) |
| 449 return nullptr; | 445 return nullptr; |
| 450 result = FundamentalValue::create(value); | 446 result = FundamentalValue::create(value); |
| 451 break; | 447 break; |
| 452 } | 448 } |
| 453 case StringLiteral: { | 449 case StringLiteral: { |
| 454 String value; | 450 String value; |
| 455 bool ok = decodeString(tokenStart + 1, tokenEnd - 1, &value); | 451 bool ok = decodeString(tokenStart + 1, tokenEnd - 1, &value); |
| 456 if (!ok) | 452 if (!ok) |
| 457 return nullptr; | 453 return nullptr; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 const CharType* end = start + length; | 539 const CharType* end = start + length; |
| 544 const CharType *tokenEnd; | 540 const CharType *tokenEnd; |
| 545 OwnPtr<Value> value = buildValue(start, end, &tokenEnd, 0); | 541 OwnPtr<Value> value = buildValue(start, end, &tokenEnd, 0); |
| 546 if (!value || tokenEnd != end) | 542 if (!value || tokenEnd != end) |
| 547 return nullptr; | 543 return nullptr; |
| 548 return value.release(); | 544 return value.release(); |
| 549 } | 545 } |
| 550 | 546 |
| 551 } // anonymous namespace | 547 } // anonymous namespace |
| 552 | 548 |
| 553 PassOwnPtr<Value> parseJSON(const String& json) | 549 PassOwnPtr<Value> parseJSON(const String16& json) |
| 554 { | 550 { |
| 555 if (json.isEmpty()) | 551 if (json.isEmpty()) |
| 556 return nullptr; | 552 return nullptr; |
| 557 if (json.is8Bit()) | 553 if (json.is8Bit()) |
| 558 return parseJSONInternal(json.characters8(), json.length()); | 554 return parseJSONInternal(json.characters8(), json.length()); |
| 559 return parseJSONInternal(json.characters16(), json.length()); | 555 return parseJSONInternal(json.characters16(), json.length()); |
| 560 } | 556 } |
| 561 | 557 |
| 562 } // namespace protocol | 558 } // namespace protocol |
| 563 } // namespace blink | 559 } // namespace blink |
| OLD | NEW |