| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Checks for security holes introduced by Object.property overrides. |
| // For example: |
| // Object.defineProperty(Array.prototype, 'locale', { |
| // set: function(value) { |
| // throw new Error('blah'); |
| // }, |
| // configurable: true, |
| // enumerable: false |
| // }); |
| // |
| // would throw in case of (JS) x.locale = 'us' or (C++) x->Set('locale', 'us'). |
| |
| // First get supported properties. |
| // Some of the properties are optional, so we request them. |
| var properties = []; |
| var options = Intl.DateTimeFormat( |
| 'en-US', {dateStyle: 'full', timeStyle: 'full'}).resolvedOptions(); |
| for (var prop in options) { |
| if (options.hasOwnProperty(prop)) { |
| properties.push(prop); |
| } |
| } |
| |
| // In the order of Table 6 of |
| // ecma402 #sec-intl.datetimeformat.prototype.resolvedoptions |
| var expectedProperties = [ |
| 'locale', |
| 'calendar', |
| 'numberingSystem', |
| 'timeZone', |
| 'hourCycle', |
| 'hour12', |
| 'dateStyle', |
| 'timeStyle', |
| ]; |
| |
| assertEquals(expectedProperties.length, properties.length); |
| |
| properties.forEach(function(prop) { |
| assertFalse(expectedProperties.indexOf(prop) === -1); |
| }); |
| |
| taintProperties(properties); |
| |
| var locale = Intl.DateTimeFormat().resolvedOptions().locale; |