1// Copyright 2010 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28// This file only tests very simple descriptors that always have 29// configurable, enumerable, and writable set to true. 30// A range of more elaborate tests are performed in 31// object-define-property.js 32 33function get() { return x; } 34function set(x) { this.x = x; } 35 36var obj = {x: 1}; 37obj.__defineGetter__("accessor", get); 38obj.__defineSetter__("accessor", set); 39var a = new Array(); 40a[1] = 42; 41obj[1] = 42; 42 43var descIsData = Object.getOwnPropertyDescriptor(obj, 'x'); 44assertTrue(descIsData.enumerable); 45assertTrue(descIsData.writable); 46assertTrue(descIsData.configurable); 47 48var descIsAccessor = Object.getOwnPropertyDescriptor(obj, 'accessor'); 49assertTrue(descIsAccessor.enumerable); 50assertTrue(descIsAccessor.configurable); 51assertTrue(descIsAccessor.get == get); 52assertTrue(descIsAccessor.set == set); 53 54var descIsNotData = Object.getOwnPropertyDescriptor(obj, 'not-x'); 55assertTrue(descIsNotData == undefined); 56 57var descIsNotAccessor = Object.getOwnPropertyDescriptor(obj, 'not-accessor'); 58assertTrue(descIsNotAccessor == undefined); 59 60var descArray = Object.getOwnPropertyDescriptor(a, '1'); 61assertTrue(descArray.enumerable); 62assertTrue(descArray.configurable); 63assertTrue(descArray.writable); 64assertEquals(descArray.value, 42); 65 66var descObjectElement = Object.getOwnPropertyDescriptor(obj, '1'); 67assertTrue(descObjectElement.enumerable); 68assertTrue(descObjectElement.configurable); 69assertTrue(descObjectElement.writable); 70assertEquals(descObjectElement.value, 42); 71 72// String objects. 73var a = new String('foobar'); 74for (var i = 0; i < a.length; i++) { 75 var descStringObject = Object.getOwnPropertyDescriptor(a, i); 76 assertTrue(descStringObject.enumerable); 77 assertFalse(descStringObject.configurable); 78 assertFalse(descStringObject.writable); 79 assertEquals(descStringObject.value, a.substring(i, i+1)); 80} 81 82// Support for additional attributes on string objects. 83a.x = 42; 84a[10] = 'foo'; 85var descStringProperty = Object.getOwnPropertyDescriptor(a, 'x'); 86assertTrue(descStringProperty.enumerable); 87assertTrue(descStringProperty.configurable); 88assertTrue(descStringProperty.writable); 89assertEquals(descStringProperty.value, 42); 90 91var descStringElement = Object.getOwnPropertyDescriptor(a, '10'); 92assertTrue(descStringElement.enumerable); 93assertTrue(descStringElement.configurable); 94assertTrue(descStringElement.writable); 95assertEquals(descStringElement.value, 'foo'); 96 97// Test that elements in the prototype chain is not returned. 98var proto = {}; 99proto[10] = 42; 100 101var objWithProto = new Array(); 102objWithProto.prototype = proto; 103objWithProto[0] = 'bar'; 104var descWithProto = Object.getOwnPropertyDescriptor(objWithProto, '10'); 105assertEquals(undefined, descWithProto); 106 107// Test elements on global proxy object. 108var global = (function() { return this; })(); 109 110global[42] = 42; 111 112function el_getter() { return 239; }; 113function el_setter() {}; 114Object.defineProperty(global, '239', {get: el_getter, set: el_setter}); 115 116var descRegularElement = Object.getOwnPropertyDescriptor(global, '42'); 117assertEquals(42, descRegularElement.value); 118 119var descAccessorElement = Object.getOwnPropertyDescriptor(global, '239'); 120assertEquals(el_getter, descAccessorElement.get); 121assertEquals(el_setter, descAccessorElement.set); 122