Changeset 53638 in webkit for trunk/JavaScriptCore/API
- Timestamp:
- Jan 21, 2010, 12:46:03 PM (15 years ago)
- Location:
- trunk/JavaScriptCore/API
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/API/JSCallbackObject.h
r53170 r53638 62 62 virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); 63 63 virtual bool getOwnPropertySlot(ExecState*, unsigned, PropertySlot&); 64 virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&); 64 65 65 66 virtual void put(ExecState*, const Identifier&, JSValue, PutPropertySlot&); -
trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h
r53170 r53638 169 169 170 170 template <class Base> 171 bool JSCallbackObject<Base>::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) 172 { 173 PropertySlot slot; 174 if (getOwnPropertySlot(exec, propertyName, slot)) { 175 // Ideally we should return an access descriptor, but returning a value descriptor is better than nothing. 176 JSValue value = slot.getValue(exec, propertyName); 177 if (!exec->hadException()) 178 descriptor.setValue(value); 179 // We don't know whether the property is configurable, but assume it is. 180 descriptor.setConfigurable(true); 181 // We don't know whether the property is enumerable (we could call getOwnPropertyNames() to find out), but assume it isn't. 182 descriptor.setEnumerable(false); 183 return true; 184 } 185 186 return Base::getOwnPropertyDescriptor(exec, propertyName, descriptor); 187 } 188 189 template <class Base> 171 190 void JSCallbackObject<Base>::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) 172 191 { -
trunk/JavaScriptCore/API/tests/testapi.js
r43603 r53638 114 114 fail("MyObject.regularType was not enumerated"); 115 115 116 var alwaysOneDescriptor = Object.getOwnPropertyDescriptor(MyObject, "alwaysOne"); 117 shouldBe('typeof alwaysOneDescriptor', "object"); 118 shouldBe('alwaysOneDescriptor.value', MyObject.alwaysOne); 119 shouldBe('alwaysOneDescriptor.configurable', true); 120 shouldBe('alwaysOneDescriptor.enumerable', false); // Actually it is. 121 var cantFindDescriptor = Object.getOwnPropertyDescriptor(MyObject, "cantFind"); 122 shouldBe('typeof cantFindDescriptor', "object"); 123 shouldBe('cantFindDescriptor.value', MyObject.cantFind); 124 shouldBe('cantFindDescriptor.configurable', true); 125 shouldBe('cantFindDescriptor.enumerable', false); 126 try { 127 // If getOwnPropertyDescriptor() returned an access descriptor, this wouldn't throw. 128 Object.getOwnPropertyDescriptor(MyObject, "throwOnGet"); 129 } catch (e) { 130 pass("getting property descriptor of throwOnGet threw exception"); 131 } 132 var myPropertyNameDescriptor = Object.getOwnPropertyDescriptor(MyObject, "myPropertyName"); 133 shouldBe('typeof myPropertyNameDescriptor', "object"); 134 shouldBe('myPropertyNameDescriptor.value', MyObject.myPropertyName); 135 shouldBe('myPropertyNameDescriptor.configurable', true); 136 shouldBe('myPropertyNameDescriptor.enumerable', false); // Actually it is. 137 try { 138 // if getOwnPropertyDescriptor() returned an access descriptor, this wouldn't throw. 139 Object.getOwnPropertyDescriptor(MyObject, "hasPropertyLie"); 140 } catch (e) { 141 pass("getting property descriptor of hasPropertyLie threw exception"); 142 } 143 shouldBe('Object.getOwnPropertyDescriptor(MyObject, "doesNotExist")', undefined); 144 116 145 myObject = new MyObject(); 117 146 … … 156 185 shouldBe("derived.protoDup = 0", 2); 157 186 187 shouldBe('Object.getOwnPropertyDescriptor(derived, "baseProto")', undefined); 188 shouldBe('Object.getOwnPropertyDescriptor(derived, "baseProtoDup")', undefined); 189 var baseDupDescriptor = Object.getOwnPropertyDescriptor(derived, "baseDup"); 190 shouldBe('typeof baseDupDescriptor', "object"); 191 shouldBe('baseDupDescriptor.value', derived.baseDup); 192 shouldBe('baseDupDescriptor.configurable', true); 193 shouldBe('baseDupDescriptor.enumerable', false); 194 var baseOnlyDescriptor = Object.getOwnPropertyDescriptor(derived, "baseOnly"); 195 shouldBe('typeof baseOnlyDescriptor', "object"); 196 shouldBe('baseOnlyDescriptor.value', derived.baseOnly); 197 shouldBe('baseOnlyDescriptor.configurable', true); 198 shouldBe('baseOnlyDescriptor.enumerable', false); 199 shouldBe('Object.getOwnPropertyDescriptor(derived, "protoOnly")', undefined); 200 var protoDupDescriptor = Object.getOwnPropertyDescriptor(derived, "protoDup"); 201 shouldBe('typeof protoDupDescriptor', "object"); 202 shouldBe('protoDupDescriptor.value', derived.protoDup); 203 shouldBe('protoDupDescriptor.configurable', true); 204 shouldBe('protoDupDescriptor.enumerable', false); 205 var derivedOnlyDescriptor = Object.getOwnPropertyDescriptor(derived, "derivedOnly"); 206 shouldBe('typeof derivedOnlyDescriptor', "object"); 207 shouldBe('derivedOnlyDescriptor.value', derived.derivedOnly); 208 shouldBe('derivedOnlyDescriptor.configurable', true); 209 shouldBe('derivedOnlyDescriptor.enumerable', false); 210 158 211 shouldBe("undefined instanceof MyObject", false); 159 212 EvilExceptionObject.hasInstance = function f() { return f(); };
Note:
See TracChangeset
for help on using the changeset viewer.