Fixing bug 257538. Fix problem where setting a property on a scriptable plugin would cache the property so that the plugin's getter wouldn't be called again for that property. r+sr=shaver@mozilla.org

git-svn-id: svn://10.0.0.236/trunk@164535 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
jst%mozilla.jstenback.com 2004-10-28 01:54:21 +00:00
parent 7bfc89b66d
commit ad92bef671
2 changed files with 66 additions and 11 deletions

View File

@ -386,6 +386,7 @@ static const char kDOMStringBundleURL[] =
#define EXTERNAL_OBJ_SCRIPTABLE_FLAGS \
(ELEMENT_SCRIPTABLE_FLAGS & ~nsIXPCScriptable::USE_JSSTUB_FOR_SETPROPERTY | \
nsIXPCScriptable::WANT_GETPROPERTY | \
nsIXPCScriptable::WANT_SETPROPERTY | \
nsIXPCScriptable::WANT_CALL)
@ -7074,27 +7075,79 @@ nsHTMLExternalObjSH::PostCreate(nsIXPConnectWrappedNative *wrapper,
NS_IMETHODIMP
nsHTMLExternalObjSH::SetProperty(nsIXPConnectWrappedNative *wrapper,
nsHTMLExternalObjSH::GetProperty(nsIXPConnectWrappedNative *wrapper,
JSContext *cx, JSObject *obj, jsval id,
jsval *vp, PRBool *_retval)
{
JSString *id_str = ::JS_ValueToString(cx, id);
if (!id_str) {
*_retval = JS_FALSE;
return NS_ERROR_FAILURE;
}
JSObject *pi_obj = ::JS_GetPrototype(cx, obj);
const jschar *id_chars = ::JS_GetStringChars(id_str);
size_t id_length = ::JS_GetStringLength(id_str);
const jschar *id_chars = nsnull;
size_t id_length = 0;
JSBool found;
if (!::JS_HasUCProperty(cx, pi_obj, id_chars, id_length, &found)) {
if (JSVAL_IS_STRING(id)) {
JSString *id_str = JSVAL_TO_STRING(id);
id_chars = ::JS_GetStringChars(id_str);
id_length = ::JS_GetStringLength(id_str);
*_retval = ::JS_HasUCProperty(cx, pi_obj, id_chars, id_length, &found);
} else {
*_retval = JS_HasElement(cx, pi_obj, JSVAL_TO_INT(id), &found);
}
if (!*_retval) {
return NS_ERROR_UNEXPECTED;
}
if (found) {
*_retval = ::JS_SetUCProperty(cx, pi_obj, id_chars, id_length, vp);
if (JSVAL_IS_STRING(id)) {
*_retval = ::JS_GetUCProperty(cx, pi_obj, id_chars, id_length, vp);
} else {
*_retval = ::JS_GetElement(cx, pi_obj, JSVAL_TO_INT(id), vp);
}
return *_retval ? NS_OK : NS_ERROR_FAILURE;
}
return nsElementSH::GetProperty(wrapper, cx, obj, id, vp, _retval);
}
NS_IMETHODIMP
nsHTMLExternalObjSH::SetProperty(nsIXPConnectWrappedNative *wrapper,
JSContext *cx, JSObject *obj, jsval id,
jsval *vp, PRBool *_retval)
{
JSObject *pi_obj = ::JS_GetPrototype(cx, obj);
const jschar *id_chars = nsnull;
size_t id_length = 0;
JSBool found;
if (JSVAL_IS_STRING(id)) {
JSString *id_str = JSVAL_TO_STRING(id);
id_chars = ::JS_GetStringChars(id_str);
id_length = ::JS_GetStringLength(id_str);
*_retval = ::JS_HasUCProperty(cx, pi_obj, id_chars, id_length, &found);
} else {
*_retval = JS_HasElement(cx, pi_obj, JSVAL_TO_INT(id), &found);
}
if (!*_retval) {
return NS_ERROR_UNEXPECTED;
}
if (found) {
if (JSVAL_IS_STRING(id)) {
*_retval = ::JS_SetUCProperty(cx, pi_obj, id_chars, id_length, vp);
} else {
*_retval = ::JS_SetElement(cx, pi_obj, JSVAL_TO_INT(id), vp);
}
return *_retval ? NS_OK : NS_ERROR_FAILURE;
}

View File

@ -864,6 +864,8 @@ protected:
public:
NS_IMETHOD PostCreate(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
JSObject *obj);
NS_IMETHOD GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
JSObject *obj, jsval id, jsval *vp, PRBool *_retval);
NS_IMETHOD SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
JSObject *obj, jsval id, jsval *vp, PRBool *_retval);
NS_IMETHOD Call(nsIXPConnectWrappedNative *wrapper, JSContext *cx,