| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 configurable: true | 283 configurable: true |
| 284 }); | 284 }); |
| 285 } | 285 } |
| 286 | 286 |
| 287 | 287 |
| 288 /** | 288 /** |
| 289 * Returns an intersection of locales and service supported locales. | 289 * Returns an intersection of locales and service supported locales. |
| 290 * Parameter locales is treated as a priority list. | 290 * Parameter locales is treated as a priority list. |
| 291 */ | 291 */ |
| 292 function supportedLocalesOf(service, locales, options) { | 292 function supportedLocalesOf(service, locales, options) { |
| 293 if (service.match(GetServiceRE()) === null) { | 293 if (IS_NULL(service.match(GetServiceRE()))) { |
| 294 throw new $Error('Internal error, wrong service type: ' + service); | 294 throw new $Error('Internal error, wrong service type: ' + service); |
| 295 } | 295 } |
| 296 | 296 |
| 297 // Provide defaults if matcher was not specified. | 297 // Provide defaults if matcher was not specified. |
| 298 if (options === undefined) { | 298 if (options === undefined) { |
| 299 options = {}; | 299 options = {}; |
| 300 } else { | 300 } else { |
| 301 options = toObject(options); | 301 options = toObject(options); |
| 302 } | 302 } |
| 303 | 303 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 | 440 |
| 441 return resolved; | 441 return resolved; |
| 442 } | 442 } |
| 443 | 443 |
| 444 | 444 |
| 445 /** | 445 /** |
| 446 * Returns best matched supported locale and extension info using basic | 446 * Returns best matched supported locale and extension info using basic |
| 447 * lookup algorithm. | 447 * lookup algorithm. |
| 448 */ | 448 */ |
| 449 function lookupMatcher(service, requestedLocales) { | 449 function lookupMatcher(service, requestedLocales) { |
| 450 if (service.match(GetServiceRE()) === null) { | 450 if (IS_NULL(service.match(GetServiceRE()))) { |
| 451 throw new $Error('Internal error, wrong service type: ' + service); | 451 throw new $Error('Internal error, wrong service type: ' + service); |
| 452 } | 452 } |
| 453 | 453 |
| 454 // Cache these, they don't ever change per service. | 454 // Cache these, they don't ever change per service. |
| 455 if (AVAILABLE_LOCALES[service] === undefined) { | 455 if (AVAILABLE_LOCALES[service] === undefined) { |
| 456 AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service); | 456 AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service); |
| 457 } | 457 } |
| 458 | 458 |
| 459 for (var i = 0; i < requestedLocales.length; ++i) { | 459 for (var i = 0; i < requestedLocales.length; ++i) { |
| 460 // Remove all extensions. | 460 // Remove all extensions. |
| 461 var locale = requestedLocales[i].replace(GetAnyExtensionRE(), ''); | 461 var locale = requestedLocales[i].replace(GetAnyExtensionRE(), ''); |
| 462 do { | 462 do { |
| 463 if (AVAILABLE_LOCALES[service][locale] !== undefined) { | 463 if (AVAILABLE_LOCALES[service][locale] !== undefined) { |
| 464 // Return the resolved locale and extension. | 464 // Return the resolved locale and extension. |
| 465 var extensionMatch = requestedLocales[i].match(GetUnicodeExtensionRE()); | 465 var extensionMatch = requestedLocales[i].match(GetUnicodeExtensionRE()); |
| 466 var extension = (extensionMatch === null) ? '' : extensionMatch[0]; | 466 var extension = IS_NULL(extensionMatch) ? '' : extensionMatch[0]; |
| 467 return {'locale': locale, 'extension': extension, 'position': i}; | 467 return {'locale': locale, 'extension': extension, 'position': i}; |
| 468 } | 468 } |
| 469 // Truncate locale if possible. | 469 // Truncate locale if possible. |
| 470 var pos = locale.lastIndexOf('-'); | 470 var pos = locale.lastIndexOf('-'); |
| 471 if (pos === -1) { | 471 if (pos === -1) { |
| 472 break; | 472 break; |
| 473 } | 473 } |
| 474 locale = locale.substring(0, pos); | 474 locale = locale.substring(0, pos); |
| 475 } while (true); | 475 } while (true); |
| 476 } | 476 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 } | 528 } |
| 529 | 529 |
| 530 return extensionMap; | 530 return extensionMap; |
| 531 } | 531 } |
| 532 | 532 |
| 533 | 533 |
| 534 /** | 534 /** |
| 535 * Converts parameter to an Object if possible. | 535 * Converts parameter to an Object if possible. |
| 536 */ | 536 */ |
| 537 function toObject(value) { | 537 function toObject(value) { |
| 538 if (value === undefined || value === null) { | 538 if (IS_NULL_OR_UNDEFINED(value)) { |
| 539 throw new $TypeError('Value cannot be converted to an Object.'); | 539 throw new $TypeError('Value cannot be converted to an Object.'); |
| 540 } | 540 } |
| 541 | 541 |
| 542 return $Object(value); | 542 return $Object(value); |
| 543 } | 543 } |
| 544 | 544 |
| 545 | 545 |
| 546 /** | 546 /** |
| 547 * Populates internalOptions object with boolean key-value pairs | 547 * Populates internalOptions object with boolean key-value pairs |
| 548 * from extensionMap and options. | 548 * from extensionMap and options. |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 function toTitleCaseWord(word) { | 726 function toTitleCaseWord(word) { |
| 727 return word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase(); | 727 return word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase(); |
| 728 } | 728 } |
| 729 | 729 |
| 730 /** | 730 /** |
| 731 * Canonicalizes the language tag, or throws in case the tag is invalid. | 731 * Canonicalizes the language tag, or throws in case the tag is invalid. |
| 732 */ | 732 */ |
| 733 function canonicalizeLanguageTag(localeID) { | 733 function canonicalizeLanguageTag(localeID) { |
| 734 // null is typeof 'object' so we have to do extra check. | 734 // null is typeof 'object' so we have to do extra check. |
| 735 if (typeof localeID !== 'string' && typeof localeID !== 'object' || | 735 if (typeof localeID !== 'string' && typeof localeID !== 'object' || |
| 736 localeID === null) { | 736 IS_NULL(localeID)) { |
| 737 throw new $TypeError('Language ID should be string or object.'); | 737 throw new $TypeError('Language ID should be string or object.'); |
| 738 } | 738 } |
| 739 | 739 |
| 740 var localeString = $String(localeID); | 740 var localeString = $String(localeID); |
| 741 | 741 |
| 742 if (isValidLanguageTag(localeString) === false) { | 742 if (isValidLanguageTag(localeString) === false) { |
| 743 throw new $RangeError('Invalid language tag: ' + localeString); | 743 throw new $RangeError('Invalid language tag: ' + localeString); |
| 744 } | 744 } |
| 745 | 745 |
| 746 // This call will strip -kn but not -kn-true extensions. | 746 // This call will strip -kn but not -kn-true extensions. |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1442 | 1442 |
| 1443 match = ldmlString.match(/z|zzzz/g); | 1443 match = ldmlString.match(/z|zzzz/g); |
| 1444 options = appendToDateTimeObject( | 1444 options = appendToDateTimeObject( |
| 1445 options, 'timeZoneName', match, {z: 'short', zzzz: 'long'}); | 1445 options, 'timeZoneName', match, {z: 'short', zzzz: 'long'}); |
| 1446 | 1446 |
| 1447 return options; | 1447 return options; |
| 1448 } | 1448 } |
| 1449 | 1449 |
| 1450 | 1450 |
| 1451 function appendToDateTimeObject(options, option, match, pairs) { | 1451 function appendToDateTimeObject(options, option, match, pairs) { |
| 1452 if (match === null) { | 1452 if (IS_NULL(match)) { |
| 1453 if (!options.hasOwnProperty(option)) { | 1453 if (!options.hasOwnProperty(option)) { |
| 1454 defineWEProperty(options, option, undefined); | 1454 defineWEProperty(options, option, undefined); |
| 1455 } | 1455 } |
| 1456 return options; | 1456 return options; |
| 1457 } | 1457 } |
| 1458 | 1458 |
| 1459 var property = match[0]; | 1459 var property = match[0]; |
| 1460 defineWEProperty(options, option, pairs[property]); | 1460 defineWEProperty(options, option, pairs[property]); |
| 1461 | 1461 |
| 1462 return options; | 1462 return options; |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1744 // Special case handling (UTC, GMT). | 1744 // Special case handling (UTC, GMT). |
| 1745 var upperID = tzID.toUpperCase(); | 1745 var upperID = tzID.toUpperCase(); |
| 1746 if (upperID === 'UTC' || upperID === 'GMT' || | 1746 if (upperID === 'UTC' || upperID === 'GMT' || |
| 1747 upperID === 'ETC/UTC' || upperID === 'ETC/GMT') { | 1747 upperID === 'ETC/UTC' || upperID === 'ETC/GMT') { |
| 1748 return 'UTC'; | 1748 return 'UTC'; |
| 1749 } | 1749 } |
| 1750 | 1750 |
| 1751 // We expect only _ and / beside ASCII letters. | 1751 // We expect only _ and / beside ASCII letters. |
| 1752 // All inputs should conform to Area/Location from now on. | 1752 // All inputs should conform to Area/Location from now on. |
| 1753 var match = GetTimezoneNameCheckRE().exec(tzID); | 1753 var match = GetTimezoneNameCheckRE().exec(tzID); |
| 1754 if (match === null) { | 1754 if (IS_NULL(match)) { |
| 1755 throw new $RangeError('Expected Area/Location for time zone, got ' + tzID); | 1755 throw new $RangeError('Expected Area/Location for time zone, got ' + tzID); |
| 1756 } | 1756 } |
| 1757 | 1757 |
| 1758 var result = toTitleCaseWord(match[1]) + '/' + toTitleCaseWord(match[2]); | 1758 var result = toTitleCaseWord(match[1]) + '/' + toTitleCaseWord(match[2]); |
| 1759 var i = 3; | 1759 var i = 3; |
| 1760 while (match[i] !== undefined && i < match.length) { | 1760 while (match[i] !== undefined && i < match.length) { |
| 1761 result = result + '_' + toTitleCaseWord(match[i]); | 1761 result = result + '_' + toTitleCaseWord(match[i]); |
| 1762 i++; | 1762 i++; |
| 1763 } | 1763 } |
| 1764 | 1764 |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1964 /** | 1964 /** |
| 1965 * Compares this and that, and returns less than 0, 0 or greater than 0 value. | 1965 * Compares this and that, and returns less than 0, 0 or greater than 0 value. |
| 1966 * Overrides the built-in method. | 1966 * Overrides the built-in method. |
| 1967 */ | 1967 */ |
| 1968 $Object.defineProperty($String.prototype, 'localeCompare', { | 1968 $Object.defineProperty($String.prototype, 'localeCompare', { |
| 1969 value: function(that) { | 1969 value: function(that) { |
| 1970 if (%_IsConstructCall()) { | 1970 if (%_IsConstructCall()) { |
| 1971 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); | 1971 throw new $TypeError(ORDINARY_FUNCTION_CALLED_AS_CONSTRUCTOR); |
| 1972 } | 1972 } |
| 1973 | 1973 |
| 1974 if (this === undefined || this === null) { | 1974 if (IS_NULL_OR_UNDEFINED(this)) { |
| 1975 throw new $TypeError('Method invoked on undefined or null value.'); | 1975 throw new $TypeError('Method invoked on undefined or null value.'); |
| 1976 } | 1976 } |
| 1977 | 1977 |
| 1978 var locales = %_Arguments(1); | 1978 var locales = %_Arguments(1); |
| 1979 var options = %_Arguments(2); | 1979 var options = %_Arguments(2); |
| 1980 var collator = cachedOrNewService('collator', locales, options); | 1980 var collator = cachedOrNewService('collator', locales, options); |
| 1981 return compare(collator, this, that); | 1981 return compare(collator, this, that); |
| 1982 }, | 1982 }, |
| 1983 writable: true, | 1983 writable: true, |
| 1984 configurable: true, | 1984 configurable: true, |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2107 writable: true, | 2107 writable: true, |
| 2108 configurable: true, | 2108 configurable: true, |
| 2109 enumerable: false | 2109 enumerable: false |
| 2110 }); | 2110 }); |
| 2111 %FunctionSetName($Date.prototype.toLocaleTimeString, 'toLocaleTimeString'); | 2111 %FunctionSetName($Date.prototype.toLocaleTimeString, 'toLocaleTimeString'); |
| 2112 %FunctionRemovePrototype($Date.prototype.toLocaleTimeString); | 2112 %FunctionRemovePrototype($Date.prototype.toLocaleTimeString); |
| 2113 %SetNativeFlag($Date.prototype.toLocaleTimeString); | 2113 %SetNativeFlag($Date.prototype.toLocaleTimeString); |
| 2114 | 2114 |
| 2115 return Intl; | 2115 return Intl; |
| 2116 }())}); | 2116 }())}); |
| OLD | NEW |