Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com> | 3 * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com> |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 407 return 0xE7C8; // mapped to xA8xBF by ICU. | 407 return 0xE7C8; // mapped to xA8xBF by ICU. |
| 408 case 0x1E3F: | 408 case 0x1E3F: |
| 409 return 0xE7C7; // mapped to xA8xBC by ICU. | 409 return 0xE7C7; // mapped to xA8xBC by ICU. |
| 410 } | 410 } |
| 411 return 0; | 411 return 0; |
| 412 } | 412 } |
| 413 #endif | 413 #endif |
| 414 | 414 |
| 415 // Invalid character handler when writing escaped entities for unrepresentable | 415 // Invalid character handler when writing escaped entities for unrepresentable |
| 416 // characters. See the declaration of TextCodec::encode for more. | 416 // characters. See the declaration of TextCodec::encode for more. |
| 417 static void cssEscapedEntityCallback(const void* context, UConverterFromUnicodeA rgs* fromUArgs, const UChar* codeUnits, int32_t length, | |
|
Dmitry Titov
2016/02/18 21:26:48
These two new functions are not really trivial cop
| |
| 418 UChar32 codePoint, UConverterCallbackReason reason, UErrorCode* err) | |
| 419 { | |
| 420 if (reason == UCNV_UNASSIGNED) { | |
| 421 *err = U_ZERO_ERROR; | |
| 422 | |
| 423 UnencodableReplacementArray entity; | |
| 424 int entityLen = TextCodec::getUnencodableReplacement(codePoint, CSSEncod edEntitiesForUnencodables, entity); | |
| 425 ucnv_cbFromUWriteBytes(fromUArgs, entity, entityLen, 0, err); | |
| 426 } else { | |
| 427 UCNV_FROM_U_CALLBACK_ESCAPE(context, fromUArgs, codeUnits, length, codeP oint, reason, err); | |
| 428 } | |
| 429 } | |
| 430 | |
| 431 // Invalid character handler when writing escaped entities for unrepresentable | |
| 432 // characters. See the declaration of TextCodec::encode for more. | |
| 417 static void urlEscapedEntityCallback(const void* context, UConverterFromUnicodeA rgs* fromUArgs, const UChar* codeUnits, int32_t length, | 433 static void urlEscapedEntityCallback(const void* context, UConverterFromUnicodeA rgs* fromUArgs, const UChar* codeUnits, int32_t length, |
| 418 UChar32 codePoint, UConverterCallbackReason reason, UErrorCode* err) | 434 UChar32 codePoint, UConverterCallbackReason reason, UErrorCode* err) |
| 419 { | 435 { |
| 420 if (reason == UCNV_UNASSIGNED) { | 436 if (reason == UCNV_UNASSIGNED) { |
| 421 *err = U_ZERO_ERROR; | 437 *err = U_ZERO_ERROR; |
| 422 | 438 |
| 423 UnencodableReplacementArray entity; | 439 UnencodableReplacementArray entity; |
| 424 int entityLen = TextCodec::getUnencodableReplacement(codePoint, URLEncod edEntitiesForUnencodables, entity); | 440 int entityLen = TextCodec::getUnencodableReplacement(codePoint, URLEncod edEntitiesForUnencodables, entity); |
| 425 ucnv_cbFromUWriteBytes(fromUArgs, entity, entityLen, 0, err); | 441 ucnv_cbFromUWriteBytes(fromUArgs, entity, entityLen, 0, err); |
| 426 } else { | 442 } else { |
| 427 UCNV_FROM_U_CALLBACK_ESCAPE(context, fromUArgs, codeUnits, length, codeP oint, reason, err); | 443 UCNV_FROM_U_CALLBACK_ESCAPE(context, fromUArgs, codeUnits, length, codeP oint, reason, err); |
| 428 } | 444 } |
| 429 } | 445 } |
| 430 | 446 |
| 431 #if defined(USING_SYSTEM_ICU) | 447 #if defined(USING_SYSTEM_ICU) |
| 432 // Substitutes special GBK characters, escaping all other unassigned entities. | 448 // Substitutes special GBK characters, escaping all other unassigned entities. |
| 433 static void gbkCallbackEscape(const void* context, UConverterFromUnicodeArgs* fr omUArgs, const UChar* codeUnits, int32_t length, | 449 static void gbkCallbackEscape(const void* context, UConverterFromUnicodeArgs* fr omUArgs, const UChar* codeUnits, int32_t length, |
| 434 UChar32 codePoint, UConverterCallbackReason reason, UErrorCode* err) | 450 UChar32 codePoint, UConverterCallbackReason reason, UErrorCode* err) |
| 435 { | 451 { |
| 436 UChar outChar; | 452 UChar outChar; |
| 437 if (reason == UCNV_UNASSIGNED && (outChar = fallbackForGBK(codePoint))) { | 453 if (reason == UCNV_UNASSIGNED && (outChar = fallbackForGBK(codePoint))) { |
| 438 const UChar* source = &outChar; | 454 const UChar* source = &outChar; |
| 439 *err = U_ZERO_ERROR; | 455 *err = U_ZERO_ERROR; |
| 440 ucnv_cbFromUWriteUChars(fromUArgs, &source, source + 1, 0, err); | 456 ucnv_cbFromUWriteUChars(fromUArgs, &source, source + 1, 0, err); |
| 441 return; | 457 return; |
| 442 } | 458 } |
| 443 UCNV_FROM_U_CALLBACK_ESCAPE(context, fromUArgs, codeUnits, length, codePoint , reason, err); | 459 UCNV_FROM_U_CALLBACK_ESCAPE(context, fromUArgs, codeUnits, length, codePoint , reason, err); |
| 444 } | 460 } |
| 445 | 461 |
| 462 // Combines both gbkCssEscapedEntityCallback and GBK character substitution. | |
| 463 static void gbkCssEscapedEntityCallack(const void* context, UConverterFromUnicod eArgs* fromUArgs, const UChar* codeUnits, int32_t length, | |
| 464 UChar32 codePoint, UConverterCallbackReason reason, UErrorCode* err) | |
| 465 { | |
| 466 if (reason == UCNV_UNASSIGNED) { | |
| 467 if (UChar outChar = fallbackForGBK(codePoint)) { | |
| 468 const UChar* source = &outChar; | |
| 469 *err = U_ZERO_ERROR; | |
| 470 ucnv_cbFromUWriteUChars(fromUArgs, &source, source + 1, 0, err); | |
| 471 return; | |
| 472 } | |
| 473 cssEscapedEntityCallback(context, fromUArgs, codeUnits, length, codePoin t, reason, err); | |
| 474 return; | |
| 475 } | |
| 476 UCNV_FROM_U_CALLBACK_ESCAPE(context, fromUArgs, codeUnits, length, codePoint , reason, err); | |
| 477 } | |
| 478 | |
| 446 // Combines both gbkUrlEscapedEntityCallback and GBK character substitution. | 479 // Combines both gbkUrlEscapedEntityCallback and GBK character substitution. |
| 447 static void gbkUrlEscapedEntityCallack(const void* context, UConverterFromUnicod eArgs* fromUArgs, const UChar* codeUnits, int32_t length, | 480 static void gbkUrlEscapedEntityCallack(const void* context, UConverterFromUnicod eArgs* fromUArgs, const UChar* codeUnits, int32_t length, |
| 448 UChar32 codePoint, UConverterCallbackReason reason, UErrorCode* err) | 481 UChar32 codePoint, UConverterCallbackReason reason, UErrorCode* err) |
| 449 { | 482 { |
| 450 if (reason == UCNV_UNASSIGNED) { | 483 if (reason == UCNV_UNASSIGNED) { |
| 451 if (UChar outChar = fallbackForGBK(codePoint)) { | 484 if (UChar outChar = fallbackForGBK(codePoint)) { |
| 452 const UChar* source = &outChar; | 485 const UChar* source = &outChar; |
| 453 *err = U_ZERO_ERROR; | 486 *err = U_ZERO_ERROR; |
| 454 ucnv_cbFromUWriteUChars(fromUArgs, &source, source + 1, 0, err); | 487 ucnv_cbFromUWriteUChars(fromUArgs, &source, source + 1, 0, err); |
| 455 return; | 488 return; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 523 ucnv_setFromUCallBack(m_converterICU, m_needsGBKFallbacks ? gbkCallbackE scape : UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_DEC, 0, 0, &err); | 556 ucnv_setFromUCallBack(m_converterICU, m_needsGBKFallbacks ? gbkCallbackE scape : UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_DEC, 0, 0, &err); |
| 524 #endif | 557 #endif |
| 525 break; | 558 break; |
| 526 case URLEncodedEntitiesForUnencodables: | 559 case URLEncodedEntitiesForUnencodables: |
| 527 #if !defined(USING_SYSTEM_ICU) | 560 #if !defined(USING_SYSTEM_ICU) |
| 528 ucnv_setFromUCallBack(m_converterICU, urlEscapedEntityCallback, 0, 0, 0, &err); | 561 ucnv_setFromUCallBack(m_converterICU, urlEscapedEntityCallback, 0, 0, 0, &err); |
| 529 #else | 562 #else |
| 530 ucnv_setFromUCallBack(m_converterICU, m_needsGBKFallbacks ? gbkUrlEscape dEntityCallack : urlEscapedEntityCallback, 0, 0, 0, &err); | 563 ucnv_setFromUCallBack(m_converterICU, m_needsGBKFallbacks ? gbkUrlEscape dEntityCallack : urlEscapedEntityCallback, 0, 0, 0, &err); |
| 531 #endif | 564 #endif |
| 532 break; | 565 break; |
| 566 case CSSEncodedEntitiesForUnencodables: | |
| 567 #if !defined(USING_SYSTEM_ICU) | |
| 568 ucnv_setFromUCallBack(m_converterICU, cssEscapedEntityCallback, 0, 0, 0, &err); | |
| 569 #else | |
| 570 ucnv_setFromUCallBack(m_converterICU, m_needsGBKFallbacks ? gbkCssEscape dEntityCallack : cssEscapedEntityCallback, 0, 0, 0, &err); | |
| 571 #endif | |
| 572 break; | |
| 533 } | 573 } |
| 534 | 574 |
| 535 ASSERT(U_SUCCESS(err)); | 575 ASSERT(U_SUCCESS(err)); |
| 536 if (U_FAILURE(err)) | 576 if (U_FAILURE(err)) |
| 537 return CString(); | 577 return CString(); |
| 538 | 578 |
| 539 Vector<char> result; | 579 Vector<char> result; |
| 540 size_t size = 0; | 580 size_t size = 0; |
| 541 do { | 581 do { |
| 542 char buffer[ConversionBufferSize]; | 582 char buffer[ConversionBufferSize]; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 572 { | 612 { |
| 573 return encodeCommon(characters, length, handling); | 613 return encodeCommon(characters, length, handling); |
| 574 } | 614 } |
| 575 | 615 |
| 576 CString TextCodecICU::encode(const LChar* characters, size_t length, Unencodable Handling handling) | 616 CString TextCodecICU::encode(const LChar* characters, size_t length, Unencodable Handling handling) |
| 577 { | 617 { |
| 578 return encodeCommon(characters, length, handling); | 618 return encodeCommon(characters, length, handling); |
| 579 } | 619 } |
| 580 | 620 |
| 581 } // namespace WTF | 621 } // namespace WTF |
| OLD | NEW |