Bug 570195 - Object.prototype.hasOwnProperty doesn't set the JSRESOLVE_DETECTING flag. r=jorendorff, test by jorendorff.

--HG--
extra : rebase_source : 20ef8f345efc18887c296059aff94e8d4e754cc9
This commit is contained in:
Taras Glek 2010-06-04 14:20:53 -07:00
Родитель 5bf5fbc4e7
Коммит 080da9a0bd
2 изменённых файлов: 42 добавлений и 0 удалений

Просмотреть файл

@ -27,3 +27,44 @@ BEGIN_TEST(testLookup_bug522590)
return true;
}
END_TEST(testLookup_bug522590)
JSBool
document_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp)
{
// If id is "all", and we're not detecting, resolve document.all=true.
jsvalRoot v(cx);
if (!JS_IdToValue(cx, id, v.addr()))
return false;
if (JSVAL_IS_STRING(v.value())) {
JSString *str = JSVAL_TO_STRING(v.value());
const char *p = JS_GetStringBytes(str);
if (strcmp(p, "all") == 0 && !(flags & JSRESOLVE_DETECTING)) {
JSBool ok = JS_DefinePropertyById(cx, obj, id, JSVAL_TRUE, NULL, NULL, 0);
*objp = ok ? obj : NULL;
return ok;
}
}
*objp = NULL;
return true;
}
static JSClass document_class = {
"document", JSCLASS_NEW_RESOLVE,
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, (JSResolveOp) document_resolve, JS_ConvertStub, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS
};
BEGIN_TEST(testLookup_bug570195)
{
JSObject *obj = JS_NewObject(cx, &document_class, NULL, NULL);
CHECK(obj);
CHECK(JS_DefineProperty(cx, global, "document", OBJECT_TO_JSVAL(obj), NULL, NULL, 0));
jsvalRoot v(cx);
EVAL("document.all ? true : false", v.addr());
CHECK_SAME(v.value(), JSVAL_FALSE);
EVAL("document.hasOwnProperty('all')", v.addr());
CHECK_SAME(v.value(), JSVAL_FALSE);
return true;
}
END_TEST(testLookup_bug570195)

Просмотреть файл

@ -1512,6 +1512,7 @@ JSBool
js_HasOwnProperty(JSContext *cx, JSLookupPropOp lookup, JSObject *obj, jsid id,
JSObject **objp, JSProperty **propp)
{
JSAutoResolveFlags rf(cx, JSRESOLVE_QUALIFIED | JSRESOLVE_DETECTING);
if (!lookup(cx, obj, id, objp, propp))
return false;
if (!*propp)