From b1fc1f7d2abd60ab08a1558ad04343d3cb0077fe Mon Sep 17 00:00:00 2001 From: Ed Morley Date: Thu, 1 Sep 2011 00:58:00 +0100 Subject: [PATCH] Backout 89b87e96dc17 (bug 639720), b449db7a038b (bug 679689) & ef216b965a04 (bug 679671) for Mochitest oranges, on a CLOSED TREE; a=philor --- content/base/crashtests/679689-1.html | 2 - content/base/crashtests/crashtests.list | 1 - content/base/src/nsAttrValue.cpp | 14 +- dom/base/nsDOMClassInfo.cpp | 125 +++++++++--------- dom/base/nsDOMClassInfo.h | 2 + dom/tests/mochitest/dom-level0/Makefile.in | 1 - .../dom-level0/test_location_setters.html | 75 ----------- 7 files changed, 71 insertions(+), 149 deletions(-) delete mode 100644 content/base/crashtests/679689-1.html delete mode 100644 dom/tests/mochitest/dom-level0/test_location_setters.html diff --git a/content/base/crashtests/679689-1.html b/content/base/crashtests/679689-1.html deleted file mode 100644 index aab88bbc3633..000000000000 --- a/content/base/crashtests/679689-1.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/content/base/crashtests/crashtests.list b/content/base/crashtests/crashtests.list index 5a2a9ecc6989..0291bcc09538 100644 --- a/content/base/crashtests/crashtests.list +++ b/content/base/crashtests/crashtests.list @@ -93,4 +93,3 @@ load 642022-1.html load 646184.html load 658845-1.svg load 667336-1.html -load 679689-1.html diff --git a/content/base/src/nsAttrValue.cpp b/content/base/src/nsAttrValue.cpp index e6b726e00781..70ce9bd49be2 100644 --- a/content/base/src/nsAttrValue.cpp +++ b/content/base/src/nsAttrValue.cpp @@ -1112,7 +1112,7 @@ nsAttrValue::ParseNonNegativeIntValue(const nsAString& aString) return PR_FALSE; } - SetIntValueAndType(originalVal, eInteger, strict ? nsnull : &aString); + SetIntValueAndType(originalVal, eInteger, nsnull); return PR_TRUE; } @@ -1129,7 +1129,7 @@ nsAttrValue::ParsePositiveIntValue(const nsAString& aString) return PR_FALSE; } - SetIntValueAndType(originalVal, eInteger, strict ? nsnull : &aString); + SetIntValueAndType(originalVal, eInteger, nsnull); return PR_TRUE; } @@ -1250,14 +1250,10 @@ nsAttrValue::SetMiscAtomOrString(const nsAString* aValue) "Trying to re-set atom or string!"); if (aValue) { PRUint32 len = aValue->Length(); - // * We're allowing eCSSStyleRule attributes to store empty strings as it - // can be beneficial to store an empty style attribute as a parsed rule. - // * We're allowing enumerated values because sometimes the empty - // string corresponds to a particular enumerated value, especially - // for enumerated values that are not limited enumerated. + // We're allowing eCSSStyleRule attributes to store empty strings as it + // can be beneficial to store an empty style attribute as a parsed rule. // Add other types as needed. - NS_ASSERTION(len || Type() == eCSSStyleRule || Type() == eEnum, - "Empty string?"); + NS_ASSERTION(len || Type() == eCSSStyleRule, "Empty string?"); MiscContainer* cont = GetMiscContainer(); if (len <= NS_ATTRVALUE_MAX_STRINGLENGTH_ATOM) { nsIAtom* atom = NS_NewAtom(*aValue); diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 01fdfc195e71..94f0342d2612 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -48,7 +48,6 @@ #include "AccessCheck.h" #include "xpcprivate.h" -#include "XPCWrapper.h" #include "nscore.h" #include "nsDOMClassInfo.h" @@ -517,6 +516,7 @@ static const char kDOMStringBundleURL[] = #define WINDOW_SCRIPTABLE_FLAGS \ (nsIXPCScriptable::WANT_GETPROPERTY | \ + nsIXPCScriptable::WANT_SETPROPERTY | \ nsIXPCScriptable::WANT_PRECREATE | \ nsIXPCScriptable::WANT_FINALIZE | \ nsIXPCScriptable::WANT_EQUALITY | \ @@ -5269,6 +5269,39 @@ nsWindowSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, return NS_OK; } +NS_IMETHODIMP +nsWindowSH::SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, + JSObject *obj, jsid id, jsval *vp, PRBool *_retval) +{ + if (id == sLocation_id) { + JSAutoRequest ar(cx); + + JSString *val = ::JS_ValueToString(cx, *vp); + NS_ENSURE_TRUE(val, NS_ERROR_UNEXPECTED); + + nsCOMPtr window = do_QueryWrappedNative(wrapper); + NS_ENSURE_TRUE(window, NS_ERROR_UNEXPECTED); + + nsCOMPtr location; + nsresult rv = window->GetLocation(getter_AddRefs(location)); + NS_ENSURE_TRUE(NS_SUCCEEDED(rv) && location, rv); + + nsCOMPtr holder; + rv = WrapNative(cx, obj, location, &NS_GET_IID(nsIDOMLocation), PR_TRUE, + vp, getter_AddRefs(holder)); + NS_ENSURE_SUCCESS(rv, rv); + + nsDependentJSString depStr; + NS_ENSURE_TRUE(depStr.init(cx, val), NS_ERROR_UNEXPECTED); + + rv = location->SetHref(depStr); + + return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING; + } + + return NS_OK; +} + NS_IMETHODIMP nsWindowSH::Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, PRBool *_retval) @@ -6359,62 +6392,6 @@ static JSNewResolveOp sOtherResolveFuncs[] = { mozilla::dom::workers::ResolveWorkerClasses }; -template -static nsresult -LocationSetterGuts(JSContext *cx, JSObject *obj, jsval *vp) -{ - // This function duplicates some of the logic in XPC_WN_HelperSetProperty - XPCWrappedNative *wrapper = - XPCWrappedNative::GetWrappedNativeOfJSObject(cx, obj); - - // The error checks duplicate code in THROW_AND_RETURN_IF_BAD_WRAPPER - NS_ENSURE_TRUE(wrapper, NS_ERROR_XPC_BAD_OP_ON_WN_PROTO); - NS_ENSURE_TRUE(wrapper->IsValid(), NS_ERROR_XPC_HAS_BEEN_SHUTDOWN); - - nsresult rv = NS_OK; - - nsCOMPtr location; - nsCOMPtr xpcomObj = do_QueryWrappedNative(wrapper); - NS_ENSURE_TRUE(xpcomObj, NS_ERROR_UNEXPECTED); - - rv = xpcomObj->GetLocation(getter_AddRefs(location)); - NS_ENSURE_SUCCESS(rv, rv); - - JSString *val = ::JS_ValueToString(cx, *vp); - NS_ENSURE_TRUE(val, NS_ERROR_UNEXPECTED); - - nsDependentJSString depStr; - NS_ENSURE_TRUE(depStr.init(cx, val), NS_ERROR_UNEXPECTED); - - return location->SetHref(depStr); -} - -template -static JSBool -LocationSetter(JSContext *cx, JSObject *obj, jsid id, JSBool strict, - jsval *vp) -{ - nsresult rv = LocationSetterGuts(cx, obj, vp); - if (NS_FAILED(rv)) { - nsDOMClassInfo::ThrowJSException(cx, rv); - return JS_FALSE; - } - - return JS_TRUE; -} - -static JSBool -LocationSetterUnwrapper(JSContext *cx, JSObject *obj, jsid id, JSBool strict, - jsval *vp) -{ - JSObject *wrapped = XPCWrapper::UnsafeUnwrapSecurityWrapper(obj); - if (wrapped) { - obj = wrapped; - } - - return LocationSetter(cx, obj, id, strict, vp); -} - NS_IMETHODIMP nsWindowSH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, jsid id, PRUint32 flags, @@ -6567,8 +6544,7 @@ nsWindowSH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx, NS_ENSURE_SUCCESS(rv, rv); JSBool ok = JS_WrapValue(cx, &v) && - JS_DefinePropertyById(cx, obj, id, v, nsnull, - LocationSetterUnwrapper, + JS_DefinePropertyById(cx, obj, id, v, nsnull, nsnull, JSPROP_PERMANENT | JSPROP_ENUMERATE); if (!ok) { @@ -8201,8 +8177,7 @@ nsDocumentSH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSAutoRequest ar(cx); - JSBool ok = ::JS_DefinePropertyById(cx, obj, id, v, nsnull, - LocationSetter, + JSBool ok = ::JS_DefinePropertyById(cx, obj, id, v, nsnull, nsnull, JSPROP_PERMANENT | JSPROP_ENUMERATE); if (!ok) { @@ -8247,6 +8222,34 @@ NS_IMETHODIMP nsDocumentSH::SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, jsid id, jsval *vp, PRBool *_retval) { + if (id == sLocation_id) { + nsCOMPtr doc = do_QueryWrappedNative(wrapper); + NS_ENSURE_TRUE(doc, NS_ERROR_UNEXPECTED); + + nsCOMPtr location; + nsresult rv = doc->GetLocation(getter_AddRefs(location)); + NS_ENSURE_SUCCESS(rv, rv); + + if (location) { + JSAutoRequest ar(cx); + + JSString *val = ::JS_ValueToString(cx, *vp); + NS_ENSURE_TRUE(val, NS_ERROR_UNEXPECTED); + + nsDependentJSString depStr; + NS_ENSURE_TRUE(depStr.init(cx, val), NS_ERROR_UNEXPECTED); + + rv = location->SetHref(depStr); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr holder; + rv = WrapNative(cx, JS_GetGlobalForScopeChain(cx), location, + &NS_GET_IID(nsIDOMLocation), PR_TRUE, vp, + getter_AddRefs(holder)); + return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING; + } + } + if (id == sDocumentURIObject_id && IsPrivilegedScript()) { // We don't want privileged script that can read this property to set it, // but _do_ want to allow everyone else to set a value they can then read. diff --git a/dom/base/nsDOMClassInfo.h b/dom/base/nsDOMClassInfo.h index 5efb38084cb4..7f0e94bba1a8 100644 --- a/dom/base/nsDOMClassInfo.h +++ b/dom/base/nsDOMClassInfo.h @@ -407,6 +407,8 @@ public: #endif NS_IMETHOD GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, jsid id, jsval *vp, PRBool *_retval); + NS_IMETHOD SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, + JSObject *obj, jsid id, jsval *vp, PRBool *_retval); NS_IMETHOD Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, PRBool *_retval); NS_IMETHOD NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx, diff --git a/dom/tests/mochitest/dom-level0/Makefile.in b/dom/tests/mochitest/dom-level0/Makefile.in index a08896bb4a8b..55ace1c5d62f 100644 --- a/dom/tests/mochitest/dom-level0/Makefile.in +++ b/dom/tests/mochitest/dom-level0/Makefile.in @@ -55,7 +55,6 @@ _TEST_FILES = \ test_location.html \ test_innerWidthHeight_script.html \ innerWidthHeight_script.html \ - test_location_setters.html \ $(NULL) libs:: $(_TEST_FILES) diff --git a/dom/tests/mochitest/dom-level0/test_location_setters.html b/dom/tests/mochitest/dom-level0/test_location_setters.html deleted file mode 100644 index bbb95fc0cf6a..000000000000 --- a/dom/tests/mochitest/dom-level0/test_location_setters.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Test for Bug 639720 - - - - -Mozilla Bug 639720 -

- -

- -
-
-
- -