зеркало из https://github.com/mozilla/gecko-dev.git
merge
This commit is contained in:
Коммит
5e4f712e4f
|
@ -103,7 +103,14 @@ interface nsIAccessible : nsISupports
|
||||||
readonly attribute long indexInParent;
|
readonly attribute long indexInParent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accessible name -- the main text equivalent for this node
|
* Accessible name -- the main text equivalent for this node. The name is
|
||||||
|
* specified by ARIA or by native markup. Example of ARIA markup is
|
||||||
|
* aria-labelledby attribute placed on element of this accessible. Example
|
||||||
|
* of native markup is HTML label linked with HTML element of this accessible.
|
||||||
|
*
|
||||||
|
* Value can be string or null. A null value indicates that AT may attempt to
|
||||||
|
* compute the name. Any string value, including the empty string, should be
|
||||||
|
* considered author-intentional, and respected.
|
||||||
*/
|
*/
|
||||||
attribute AString name;
|
attribute AString name;
|
||||||
|
|
||||||
|
|
|
@ -308,7 +308,7 @@ nsAccessible::GetName(nsAString& aName)
|
||||||
if (content->GetAttr(kNameSpaceID_None, tooltipAttr, name)) {
|
if (content->GetAttr(kNameSpaceID_None, tooltipAttr, name)) {
|
||||||
name.CompressWhitespace();
|
name.CompressWhitespace();
|
||||||
aName = name;
|
aName = name;
|
||||||
} else {
|
} else if (rv != NS_OK_EMPTY_NAME) {
|
||||||
aName.SetIsVoid(PR_TRUE);
|
aName.SetIsVoid(PR_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,9 +66,14 @@ class nsIDOMNode;
|
||||||
class nsIAtom;
|
class nsIAtom;
|
||||||
class nsIView;
|
class nsIView;
|
||||||
|
|
||||||
|
// see nsAccessible::GetAttrValue
|
||||||
#define NS_OK_NO_ARIA_VALUE \
|
#define NS_OK_NO_ARIA_VALUE \
|
||||||
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_GENERAL, 0x21)
|
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_GENERAL, 0x21)
|
||||||
|
|
||||||
|
// see nsAccessible::GetNameInternal
|
||||||
|
#define NS_OK_EMPTY_NAME \
|
||||||
|
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_GENERAL, 0x23)
|
||||||
|
|
||||||
// Saves a data member -- if child count equals this value we haven't
|
// Saves a data member -- if child count equals this value we haven't
|
||||||
// cached children or child count yet
|
// cached children or child count yet
|
||||||
enum { eChildCountUninitialized = -1 };
|
enum { eChildCountUninitialized = -1 };
|
||||||
|
@ -135,7 +140,13 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the accessible name provided by native markup. It doesn't take
|
* Returns the accessible name provided by native markup. It doesn't take
|
||||||
* into account ARIA stuffs used to specify the name.
|
* into account ARIA markup used to specify the name.
|
||||||
|
*
|
||||||
|
* @param aName [out] the accessible name
|
||||||
|
*
|
||||||
|
* @return NS_OK_EMPTY_NAME points empty name was specified by native markup
|
||||||
|
* explicitly (see nsIAccessible::name attribute for
|
||||||
|
* details)
|
||||||
*/
|
*/
|
||||||
virtual nsresult GetNameInternal(nsAString& aName);
|
virtual nsresult GetNameInternal(nsAString& aName);
|
||||||
|
|
||||||
|
|
|
@ -127,10 +127,6 @@ nsHTMLImageAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState)
|
||||||
nsresult
|
nsresult
|
||||||
nsHTMLImageAccessible::GetNameInternal(nsAString& aName)
|
nsHTMLImageAccessible::GetNameInternal(nsAString& aName)
|
||||||
{
|
{
|
||||||
// No alt attribute means AT can repair if there is no accessible name
|
|
||||||
// alt="" with no title or aria-labelledby means image is presentational and
|
|
||||||
// AT should leave accessible name empty
|
|
||||||
|
|
||||||
nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
|
nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
|
||||||
PRBool hasAltAttrib =
|
PRBool hasAltAttrib =
|
||||||
content->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::alt, aName);
|
content->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::alt, aName);
|
||||||
|
@ -140,10 +136,12 @@ nsHTMLImageAccessible::GetNameInternal(nsAString& aName)
|
||||||
nsresult rv = nsAccessible::GetNameInternal(aName);
|
nsresult rv = nsAccessible::GetNameInternal(aName);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
if (aName.IsVoid() && hasAltAttrib) {
|
if (aName.IsEmpty() && hasAltAttrib) {
|
||||||
// No accessible name but empty alt attribute is present. This means a name
|
// No accessible name but empty 'alt' attribute is present. If further name
|
||||||
// was provided by author and AT repair of the name isn't allowed.
|
// computation algorithm doesn't provide non empty name then it means
|
||||||
aName.Truncate();
|
// an empty 'alt' attribute was used to indicate a decorative image (see
|
||||||
|
// nsIAccessible::name attribute for details).
|
||||||
|
return NS_OK_EMPTY_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
|
@ -147,10 +147,10 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=429659
|
||||||
testThis("linkedImageWithTitle", "Link to MoFo", "moz.png", 93, 42);
|
testThis("linkedImageWithTitle", "Link to MoFo", "moz.png", 93, 42);
|
||||||
|
|
||||||
// Test simple image with empty alt attribute
|
// Test simple image with empty alt attribute
|
||||||
// testThis("nonLinkedImageEmptyAlt", "", "moz.png", 89, 38);
|
testThis("nonLinkedImageEmptyAlt", "", "moz.png", 89, 38);
|
||||||
|
|
||||||
// Test linked image with empty alt attribute
|
// Test linked image with empty alt attribute
|
||||||
// testThis("linkedImageEmptyAlt", "", "moz.png", 93, 42);
|
testThis("linkedImageEmptyAlt", "", "moz.png", 93, 42);
|
||||||
|
|
||||||
// Test simple image with empty alt attribute and title
|
// Test simple image with empty alt attribute and title
|
||||||
testThis("nonLinkedImageEmptyAltAndTitle", "MozillaFoundation", "moz.png", 89, 38);
|
testThis("nonLinkedImageEmptyAltAndTitle", "MozillaFoundation", "moz.png", 89, 38);
|
||||||
|
|
|
@ -98,6 +98,7 @@ function cleanUp()
|
||||||
"places.sqlite",
|
"places.sqlite",
|
||||||
"cookies.sqlite",
|
"cookies.sqlite",
|
||||||
"signons.sqlite",
|
"signons.sqlite",
|
||||||
|
"permissions.sqlite"
|
||||||
];
|
];
|
||||||
|
|
||||||
for (let i = 0; i < files.length; i++) {
|
for (let i = 0; i < files.length; i++) {
|
||||||
|
|
|
@ -2175,6 +2175,9 @@ echo-variable-%:
|
||||||
echo-tiers:
|
echo-tiers:
|
||||||
@echo $(TIERS)
|
@echo $(TIERS)
|
||||||
|
|
||||||
|
echo-tier-dirs:
|
||||||
|
@$(foreach tier,$(TIERS),echo '$(tier):'; echo ' dirs: $(tier_$(tier)_dirs)'; echo ' staticdirs: $(tier_$(tier)_staticdirs)'; )
|
||||||
|
|
||||||
echo-dirs:
|
echo-dirs:
|
||||||
@echo $(DIRS)
|
@echo $(DIRS)
|
||||||
|
|
||||||
|
|
|
@ -1635,12 +1635,12 @@ nsDOMClassInfo::DefineStaticJSVals(JSContext *cx)
|
||||||
// static
|
// static
|
||||||
nsresult
|
nsresult
|
||||||
nsDOMClassInfo::WrapNative(JSContext *cx, JSObject *scope, nsISupports *native,
|
nsDOMClassInfo::WrapNative(JSContext *cx, JSObject *scope, nsISupports *native,
|
||||||
const nsIID& aIID, jsval *vp,
|
const nsIID* aIID, jsval *vp,
|
||||||
nsIXPConnectJSObjectHolder **aHolder)
|
nsIXPConnectJSObjectHolder **aHolder)
|
||||||
{
|
{
|
||||||
*aHolder = nsnull;
|
|
||||||
|
|
||||||
if (!native) {
|
if (!native) {
|
||||||
|
NS_ASSERTION(!aHolder || !*aHolder, "*aHolder should be null!");
|
||||||
|
|
||||||
*vp = JSVAL_NULL;
|
*vp = JSVAL_NULL;
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
@ -1648,19 +1648,8 @@ nsDOMClassInfo::WrapNative(JSContext *cx, JSObject *scope, nsISupports *native,
|
||||||
|
|
||||||
NS_ENSURE_TRUE(sXPConnect, NS_ERROR_UNEXPECTED);
|
NS_ENSURE_TRUE(sXPConnect, NS_ERROR_UNEXPECTED);
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
return sXPConnect->WrapNativeToJSVal(cx, ::JS_GetGlobalForObject(cx, scope),
|
||||||
nsresult rv = sXPConnect->WrapNative(cx, ::JS_GetGlobalForObject(cx, scope),
|
native, aIID, vp, aHolder);
|
||||||
native, aIID, getter_AddRefs(holder));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
JSObject* obj = nsnull;
|
|
||||||
rv = holder->GetJSObject(&obj);
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
*vp = OBJECT_TO_JSVAL(obj);
|
|
||||||
holder.swap(*aHolder);
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
|
@ -1691,7 +1680,7 @@ nsDOMClassInfo::ThrowJSException(JSContext *cx, nsresult aResult)
|
||||||
jsval jv;
|
jsval jv;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, ::JS_GetGlobalObject(cx), exception,
|
rv = WrapNative(cx, ::JS_GetGlobalObject(cx), exception,
|
||||||
NS_GET_IID(nsIException), &jv, getter_AddRefs(holder));
|
&NS_GET_IID(nsIException), &jv, getter_AddRefs(holder));
|
||||||
if (NS_FAILED(rv) || JSVAL_IS_NULL(jv)) {
|
if (NS_FAILED(rv) || JSVAL_IS_NULL(jv)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4495,8 +4484,7 @@ nsWindowSH::GlobalScopePolluterNewResolve(JSContext *cx, JSObject *obj,
|
||||||
if (result) {
|
if (result) {
|
||||||
jsval v;
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
nsresult rv = WrapNative(cx, obj, result, NS_GET_IID(nsISupports), &v,
|
nsresult rv = WrapNative(cx, obj, result, &v, getter_AddRefs(holder));
|
||||||
getter_AddRefs(holder));
|
|
||||||
NS_ENSURE_SUCCESS(rv, JS_FALSE);
|
NS_ENSURE_SUCCESS(rv, JS_FALSE);
|
||||||
|
|
||||||
if (!::JS_DefineUCProperty(cx, obj, ::JS_GetStringChars(jsstr),
|
if (!::JS_DefineUCProperty(cx, obj, ::JS_GetStringChars(jsstr),
|
||||||
|
@ -4690,7 +4678,7 @@ nsWindowSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, frameWin->GetGlobalJSObject(), frame,
|
rv = WrapNative(cx, frameWin->GetGlobalJSObject(), frame,
|
||||||
NS_GET_IID(nsIDOMWindow), vp,
|
&NS_GET_IID(nsIDOMWindow), vp,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4807,7 +4795,7 @@ nsWindowSH::SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
NS_ENSURE_TRUE(NS_SUCCEEDED(rv) && location, rv);
|
NS_ENSURE_TRUE(NS_SUCCEEDED(rv) && location, rv);
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, obj, location, NS_GET_IID(nsIDOMLocation), vp,
|
rv = WrapNative(cx, obj, location, &NS_GET_IID(nsIDOMLocation), vp,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
@ -5062,8 +5050,8 @@ BaseStubConstructor(nsIWeakReference* aWeakOwner,
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = nsDOMGenericSH::WrapNative(cx, obj, native, NS_GET_IID(nsISupports),
|
rv = nsDOMGenericSH::WrapNative(cx, obj, native, rval,
|
||||||
rval, getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -5529,7 +5517,7 @@ nsWindowSH::GlobalResolve(nsGlobalWindow *aWin, JSContext *cx,
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
jsval v;
|
jsval v;
|
||||||
|
|
||||||
rv = WrapNative(cx, obj, constructor, NS_GET_IID(nsIDOMDOMConstructor), &v,
|
rv = WrapNative(cx, obj, constructor, &NS_GET_IID(nsIDOMDOMConstructor), &v,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
|
|
||||||
sDoSecurityCheckInAddProperty = doSecurityCheckInAddProperty;
|
sDoSecurityCheckInAddProperty = doSecurityCheckInAddProperty;
|
||||||
|
@ -5591,7 +5579,7 @@ nsWindowSH::GlobalResolve(nsGlobalWindow *aWin, JSContext *cx,
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
jsval v;
|
jsval v;
|
||||||
|
|
||||||
rv = WrapNative(cx, obj, constructor, NS_GET_IID(nsIDOMDOMConstructor), &v,
|
rv = WrapNative(cx, obj, constructor, &NS_GET_IID(nsIDOMDOMConstructor), &v,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
|
|
||||||
sDoSecurityCheckInAddProperty = doSecurityCheckInAddProperty;
|
sDoSecurityCheckInAddProperty = doSecurityCheckInAddProperty;
|
||||||
|
@ -5806,7 +5794,7 @@ nsWindowSH::GlobalResolve(nsGlobalWindow *aWin, JSContext *cx,
|
||||||
|
|
||||||
jsval val;
|
jsval val;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, obj, constructor, NS_GET_IID(nsIDOMDOMConstructor),
|
rv = WrapNative(cx, obj, constructor, &NS_GET_IID(nsIDOMDOMConstructor),
|
||||||
&val, getter_AddRefs(holder));
|
&val, getter_AddRefs(holder));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
@ -5854,8 +5842,7 @@ nsWindowSH::GlobalResolve(nsGlobalWindow *aWin, JSContext *cx,
|
||||||
scope = aWin->GetGlobalJSObject();
|
scope = aWin->GetGlobalJSObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
rv = WrapNative(cx, scope, native, NS_GET_IID(nsISupports), &prop_val,
|
rv = WrapNative(cx, scope, native, &prop_val, getter_AddRefs(holder));
|
||||||
getter_AddRefs(holder));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
@ -6146,7 +6133,7 @@ nsWindowSH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
jsval v;
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, wrapperObj, child_win,
|
rv = WrapNative(cx, wrapperObj, child_win,
|
||||||
NS_GET_IID(nsIDOMWindowInternal), &v,
|
&NS_GET_IID(nsIDOMWindowInternal), &v,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
@ -6267,7 +6254,7 @@ nsWindowSH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
|
|
||||||
jsval v;
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, scope, location, NS_GET_IID(nsIDOMLocation), &v,
|
rv = WrapNative(cx, scope, location, &NS_GET_IID(nsIDOMLocation), &v,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
@ -6324,7 +6311,7 @@ nsWindowSH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
|
|
||||||
jsval v;
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, obj, navigator, NS_GET_IID(nsIDOMNavigator), &v,
|
rv = WrapNative(cx, obj, navigator, &NS_GET_IID(nsIDOMNavigator), &v,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
@ -6348,7 +6335,7 @@ nsWindowSH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
|
|
||||||
jsval v;
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, obj, document, NS_GET_IID(nsIDOMDocument), &v,
|
rv = WrapNative(cx, obj, document, &NS_GET_IID(nsIDOMDocument), &v,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
@ -6953,8 +6940,7 @@ nsNodeSH::PreCreate(nsISupports *nativeObj, JSContext *cx, JSObject *globalObj,
|
||||||
|
|
||||||
jsval v;
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
nsresult rv = WrapNative(cx, globalObj, native_parent,
|
nsresult rv = WrapNative(cx, globalObj, native_parent, &v,
|
||||||
NS_GET_IID(nsISupports), &v,
|
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
|
|
||||||
*parentObj = JSVAL_TO_OBJECT(v);
|
*parentObj = JSVAL_TO_OBJECT(v);
|
||||||
|
@ -7021,7 +7007,7 @@ nsNodeSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
nsresult rv = WrapNative(cx, obj, uri, NS_GET_IID(nsIURI), vp,
|
nsresult rv = WrapNative(cx, obj, uri, &NS_GET_IID(nsIURI), vp,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
||||||
}
|
}
|
||||||
|
@ -7032,7 +7018,7 @@ nsNodeSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
nsresult rv = WrapNative(cx, obj, node->NodePrincipal(),
|
nsresult rv = WrapNative(cx, obj, node->NodePrincipal(),
|
||||||
NS_GET_IID(nsIPrincipal), vp,
|
&NS_GET_IID(nsIPrincipal), vp,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
||||||
}
|
}
|
||||||
|
@ -7730,9 +7716,7 @@ nsArraySH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
if (array_item) {
|
if (array_item) {
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
rv = WrapNative(cx, obj, array_item, vp);
|
||||||
rv = WrapNative(cx, obj, array_item, NS_GET_IID(nsISupports), vp,
|
|
||||||
getter_AddRefs(holder));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
rv = NS_SUCCESS_I_DID_SOMETHING;
|
rv = NS_SUCCESS_I_DID_SOMETHING;
|
||||||
|
@ -7766,8 +7750,7 @@ nsNodeListSH::PreCreate(nsISupports *nativeObj, JSContext *cx,
|
||||||
|
|
||||||
jsval v;
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
nsresult rv = WrapNative(cx, globalObj, native_parent,
|
nsresult rv = WrapNative(cx, globalObj, native_parent, &v,
|
||||||
NS_GET_IID(nsISupports), &v,
|
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
|
|
||||||
*parentObj = JSVAL_TO_OBJECT(v);
|
*parentObj = JSVAL_TO_OBJECT(v);
|
||||||
|
@ -7867,9 +7850,7 @@ nsNamedArraySH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
if (item) {
|
if (item) {
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
rv = WrapNative(cx, obj, item, vp);
|
||||||
rv = WrapNative(cx, obj, item, NS_GET_IID(nsISupports), vp,
|
|
||||||
getter_AddRefs(holder));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
rv = NS_SUCCESS_I_DID_SOMETHING;
|
rv = NS_SUCCESS_I_DID_SOMETHING;
|
||||||
|
@ -7981,8 +7962,7 @@ nsContentListSH::PreCreate(nsISupports *nativeObj, JSContext *cx,
|
||||||
|
|
||||||
jsval v;
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
nsresult rv = WrapNative(cx, globalObj, native_parent,
|
nsresult rv = WrapNative(cx, globalObj, native_parent, &v,
|
||||||
NS_GET_IID(nsISupports), &v,
|
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
|
|
||||||
*parentObj = JSVAL_TO_OBJECT(v);
|
*parentObj = JSVAL_TO_OBJECT(v);
|
||||||
|
@ -8098,7 +8078,7 @@ nsDocumentSH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
jsval v;
|
jsval v;
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, obj, location, NS_GET_IID(nsIDOMLocation), &v,
|
rv = WrapNative(cx, obj, location, &NS_GET_IID(nsIDOMLocation), &v,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
@ -8142,7 +8122,7 @@ nsDocumentSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
NS_ENSURE_TRUE(uri, NS_ERROR_NOT_AVAILABLE);
|
NS_ENSURE_TRUE(uri, NS_ERROR_NOT_AVAILABLE);
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
nsresult rv = WrapNative(cx, obj, uri, NS_GET_IID(nsIURI), vp,
|
nsresult rv = WrapNative(cx, obj, uri, &NS_GET_IID(nsIURI), vp,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
|
|
||||||
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
||||||
|
@ -8174,7 +8154,7 @@ nsDocumentSH::SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, obj, location, NS_GET_IID(nsIDOMLocation), vp,
|
rv = WrapNative(cx, obj, location, &NS_GET_IID(nsIDOMLocation), vp,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
||||||
}
|
}
|
||||||
|
@ -8232,7 +8212,7 @@ nsDocumentSH::PostCreate(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
|
||||||
jsval winVal;
|
jsval winVal;
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, obj, win, NS_GET_IID(nsIDOMWindow), &winVal,
|
rv = WrapNative(cx, obj, win, &NS_GET_IID(nsIDOMWindow), &winVal,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
@ -8351,7 +8331,7 @@ nsHTMLDocumentSH::DocumentOpen(JSContext *cx, JSObject *obj, uintN argc,
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv = WrapNative(cx, obj, retval, NS_GET_IID(nsIDOMDocument), rval,
|
rv = WrapNative(cx, obj, retval, &NS_GET_IID(nsIDOMDocument), rval,
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to wrap native!");
|
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to wrap native!");
|
||||||
|
|
||||||
|
@ -8426,8 +8406,7 @@ nsHTMLDocumentSH::GetDocumentAllNodeList(JSContext *cx, JSObject *obj,
|
||||||
rv |= domdoc->GetElementsByTagName(NS_LITERAL_STRING("*"), nodeList);
|
rv |= domdoc->GetElementsByTagName(NS_LITERAL_STRING("*"), nodeList);
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
rv |= nsDOMClassInfo::WrapNative(cx, obj, *nodeList,
|
rv |= nsDOMClassInfo::WrapNative(cx, obj, *nodeList, &collection,
|
||||||
NS_GET_IID(nsISupports), &collection,
|
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
|
|
||||||
// ... and store it in our reserved slot.
|
// ... and store it in our reserved slot.
|
||||||
|
@ -8514,9 +8493,7 @@ nsHTMLDocumentSH::DocumentAllGetProperty(JSContext *cx, JSObject *obj,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
rv = WrapNative(cx, obj, result, vp);
|
||||||
rv = nsDOMClassInfo::WrapNative(cx, obj, result, NS_GET_IID(nsISupports),
|
|
||||||
vp, getter_AddRefs(holder));
|
|
||||||
if (NS_FAILED(rv)) {
|
if (NS_FAILED(rv)) {
|
||||||
nsDOMClassInfo::ThrowJSException(cx, rv);
|
nsDOMClassInfo::ThrowJSException(cx, rv);
|
||||||
|
|
||||||
|
@ -8788,8 +8765,7 @@ nsHTMLDocumentSH::DocumentAllTagsNewResolve(JSContext *cx, JSObject *obj,
|
||||||
if (tags) {
|
if (tags) {
|
||||||
jsval v;
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
nsresult rv = nsDOMClassInfo::WrapNative(cx, obj, tags,
|
nsresult rv = nsDOMClassInfo::WrapNative(cx, obj, tags, &v,
|
||||||
NS_GET_IID(nsISupports), &v,
|
|
||||||
getter_AddRefs(holder));
|
getter_AddRefs(holder));
|
||||||
if (NS_FAILED(rv)) {
|
if (NS_FAILED(rv)) {
|
||||||
nsDOMClassInfo::ThrowJSException(cx, rv);
|
nsDOMClassInfo::ThrowJSException(cx, rv);
|
||||||
|
@ -8948,9 +8924,7 @@ nsHTMLDocumentSH::GetProperty(nsIXPConnectWrappedNative *wrapper,
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
rv = WrapNative(cx, obj, result, vp);
|
||||||
rv = WrapNative(cx, obj, result, NS_GET_IID(nsISupports), vp,
|
|
||||||
getter_AddRefs(holder));
|
|
||||||
if (NS_SUCCEEDED(rv)) {
|
if (NS_SUCCEEDED(rv)) {
|
||||||
rv = NS_SUCCESS_I_DID_SOMETHING;
|
rv = NS_SUCCESS_I_DID_SOMETHING;
|
||||||
}
|
}
|
||||||
|
@ -9090,9 +9064,7 @@ nsHTMLFormElementSH::GetProperty(nsIXPConnectWrappedNative *wrapper,
|
||||||
if (result) {
|
if (result) {
|
||||||
// Wrap result, result can be either an element or a list of
|
// Wrap result, result can be either an element or a list of
|
||||||
// elements
|
// elements
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsresult rv = WrapNative(cx, obj, result, vp);
|
||||||
nsresult rv = WrapNative(cx, obj, result, NS_GET_IID(nsISupports), vp,
|
|
||||||
getter_AddRefs(holder));
|
|
||||||
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9104,9 +9076,7 @@ nsHTMLFormElementSH::GetProperty(nsIXPConnectWrappedNative *wrapper,
|
||||||
form->GetElementAt(n, getter_AddRefs(control));
|
form->GetElementAt(n, getter_AddRefs(control));
|
||||||
|
|
||||||
if (control) {
|
if (control) {
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsresult rv = WrapNative(cx, obj, control, vp);
|
||||||
nsresult rv = WrapNative(cx, obj, control, NS_GET_IID(nsISupports), vp,
|
|
||||||
getter_AddRefs(holder));
|
|
||||||
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
return NS_FAILED(rv) ? rv : NS_SUCCESS_I_DID_SOMETHING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9213,9 +9183,7 @@ nsHTMLSelectElementSH::GetProperty(nsIXPConnectWrappedNative *wrapper,
|
||||||
|
|
||||||
options->Item(n, getter_AddRefs(node));
|
options->Item(n, getter_AddRefs(node));
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
rv = WrapNative(cx, obj, node, &NS_GET_IID(nsIDOMNode), vp);
|
||||||
rv = WrapNative(cx, obj, node, NS_GET_IID(nsIDOMNode), vp,
|
|
||||||
getter_AddRefs(holder));
|
|
||||||
if (NS_SUCCEEDED(rv)) {
|
if (NS_SUCCEEDED(rv)) {
|
||||||
rv = NS_SUCCESS_I_DID_SOMETHING;
|
rv = NS_SUCCESS_I_DID_SOMETHING;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,11 +130,22 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
static nsresult WrapNative(JSContext *cx, JSObject *scope,
|
static nsresult WrapNative(JSContext *cx, JSObject *scope,
|
||||||
nsISupports *native, const nsIID& aIID,
|
nsISupports *native, const nsIID* aIID,
|
||||||
jsval *vp,
|
jsval *vp,
|
||||||
// aHolder keeps the jsval alive while
|
// If non-null aHolder will keep the jsval alive
|
||||||
// there's a ref to it
|
// while there's a ref to it
|
||||||
nsIXPConnectJSObjectHolder** aHolder);
|
nsIXPConnectJSObjectHolder** aHolder = nsnull);
|
||||||
|
|
||||||
|
// Same as the WrapNative above, but use this one if aIID is nsISupports' IID.
|
||||||
|
static nsresult WrapNative(JSContext *cx, JSObject *scope,
|
||||||
|
nsISupports *native, jsval *vp,
|
||||||
|
// If non-null aHolder will keep the jsval alive
|
||||||
|
// while there's a ref to it
|
||||||
|
nsIXPConnectJSObjectHolder** aHolder = nsnull)
|
||||||
|
{
|
||||||
|
return WrapNative(cx, scope, native, nsnull, vp, aHolder);
|
||||||
|
}
|
||||||
|
|
||||||
static nsresult ThrowJSException(JSContext *cx, nsresult aResult);
|
static nsresult ThrowJSException(JSContext *cx, nsresult aResult);
|
||||||
|
|
||||||
static nsresult InitDOMJSClass(JSContext *cx, JSObject *obj);
|
static nsresult InitDOMJSClass(JSContext *cx, JSObject *obj);
|
||||||
|
|
|
@ -2175,6 +2175,9 @@ echo-variable-%:
|
||||||
echo-tiers:
|
echo-tiers:
|
||||||
@echo $(TIERS)
|
@echo $(TIERS)
|
||||||
|
|
||||||
|
echo-tier-dirs:
|
||||||
|
@$(foreach tier,$(TIERS),echo '$(tier):'; echo ' dirs: $(tier_$(tier)_dirs)'; echo ' staticdirs: $(tier_$(tier)_staticdirs)'; )
|
||||||
|
|
||||||
echo-dirs:
|
echo-dirs:
|
||||||
@echo $(DIRS)
|
@echo $(DIRS)
|
||||||
|
|
||||||
|
|
|
@ -405,7 +405,7 @@ interface nsIXPCFunctionThisTranslator : nsISupports
|
||||||
{ 0xbd, 0xd6, 0x0, 0x0, 0x64, 0x65, 0x73, 0x74 } }
|
{ 0xbd, 0xd6, 0x0, 0x0, 0x64, 0x65, 0x73, 0x74 } }
|
||||||
%}
|
%}
|
||||||
|
|
||||||
[uuid(d4c6bc06-2a4f-4315-90ec-d12904aca046)]
|
[uuid(f8bf005e-3700-411c-ba0c-e018075f22a4)]
|
||||||
interface nsIXPConnect : nsISupports
|
interface nsIXPConnect : nsISupports
|
||||||
{
|
{
|
||||||
%{ C++
|
%{ C++
|
||||||
|
@ -468,6 +468,23 @@ interface nsIXPConnect : nsISupports
|
||||||
in nsISupports aCOMObj,
|
in nsISupports aCOMObj,
|
||||||
in nsIIDRef aIID);
|
in nsIIDRef aIID);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Same as wrapNative, but also returns the JSObject in aVal. C++ callers
|
||||||
|
* can pass in null for the aHolder argument, but in that case they must
|
||||||
|
* ensure that aVal is rooted.
|
||||||
|
* aIID may be null, it means the same as passing in
|
||||||
|
* &NS_GET_IID(nsISupports) but when passing in null certain shortcuts
|
||||||
|
* can be taken because we know without comparing IIDs that the caller is
|
||||||
|
* asking for an nsISupports wrapper.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
wrapNativeToJSVal(in JSContextPtr aJSContext,
|
||||||
|
in JSObjectPtr aScope,
|
||||||
|
in nsISupports aCOMObj,
|
||||||
|
in nsIIDPtr aIID,
|
||||||
|
out JSVal aVal,
|
||||||
|
out nsIXPConnectJSObjectHolder aHolder);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wrapJS will yield a new or previously existing xpcom interface pointer
|
* wrapJS will yield a new or previously existing xpcom interface pointer
|
||||||
* to represent the JSObject passed in.
|
* to represent the JSObject passed in.
|
||||||
|
|
|
@ -176,6 +176,8 @@ endif
|
||||||
|
|
||||||
nsXPConnect.$(OBJ_SUFFIX): dom_quickstubs.h
|
nsXPConnect.$(OBJ_SUFFIX): dom_quickstubs.h
|
||||||
|
|
||||||
|
xpcjsruntime.$(OBJ_SUFFIX): dom_quickstubs.h
|
||||||
|
|
||||||
dom_quickstubs.h dom_quickstubs.cpp: $(srcdir)/dom_quickstubs.qsconf \
|
dom_quickstubs.h dom_quickstubs.cpp: $(srcdir)/dom_quickstubs.qsconf \
|
||||||
$(srcdir)/qsgen.py \
|
$(srcdir)/qsgen.py \
|
||||||
$(topsrcdir)/xpcom/idl-parser/header.py \
|
$(topsrcdir)/xpcom/idl-parser/header.py \
|
||||||
|
|
|
@ -1099,6 +1099,7 @@ nsXPConnect::InitClassesWithNewWrappedGlobal(JSContext * aJSContext,
|
||||||
!JS_SetPrototype(aJSContext, tempGlobal, nsnull))
|
!JS_SetPrototype(aJSContext, tempGlobal, nsnull))
|
||||||
return UnexpectedFailure(NS_ERROR_FAILURE);
|
return UnexpectedFailure(NS_ERROR_FAILURE);
|
||||||
|
|
||||||
|
jsval v;
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
||||||
{
|
{
|
||||||
// Scope for our auto-marker; it just needs to keep tempGlobal alive
|
// Scope for our auto-marker; it just needs to keep tempGlobal alive
|
||||||
|
@ -1109,16 +1110,18 @@ nsXPConnect::InitClassesWithNewWrappedGlobal(JSContext * aJSContext,
|
||||||
return UnexpectedFailure(NS_ERROR_FAILURE);
|
return UnexpectedFailure(NS_ERROR_FAILURE);
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
if(!XPCConvert::NativeInterface2JSObject(ccx, getter_AddRefs(holder),
|
if(!XPCConvert::NativeInterface2JSObject(ccx, &v,
|
||||||
aCOMObj, &aIID, tempGlobal,
|
getter_AddRefs(holder),
|
||||||
PR_FALSE, OBJ_IS_GLOBAL, &rv))
|
aCOMObj, &aIID, nsnull,
|
||||||
|
tempGlobal, PR_FALSE,
|
||||||
|
OBJ_IS_GLOBAL, &rv))
|
||||||
return UnexpectedFailure(rv);
|
return UnexpectedFailure(rv);
|
||||||
|
|
||||||
NS_ASSERTION(NS_SUCCEEDED(rv) && holder, "Didn't wrap properly");
|
NS_ASSERTION(NS_SUCCEEDED(rv) && holder, "Didn't wrap properly");
|
||||||
}
|
}
|
||||||
|
|
||||||
JSObject* globalJSObj;
|
JSObject* globalJSObj = JSVAL_TO_OBJECT(v);
|
||||||
if(NS_FAILED(holder->GetJSObject(&globalJSObj)) || !globalJSObj)
|
if(!globalJSObj)
|
||||||
return UnexpectedFailure(NS_ERROR_FAILURE);
|
return UnexpectedFailure(NS_ERROR_FAILURE);
|
||||||
|
|
||||||
if(aFlags & nsIXPConnect::FLAG_SYSTEM_GLOBAL_OBJECT)
|
if(aFlags & nsIXPConnect::FLAG_SYSTEM_GLOBAL_OBJECT)
|
||||||
|
@ -1180,29 +1183,42 @@ nsXPConnect::WrapNative(JSContext * aJSContext,
|
||||||
JSObject * aScope,
|
JSObject * aScope,
|
||||||
nsISupports *aCOMObj,
|
nsISupports *aCOMObj,
|
||||||
const nsIID & aIID,
|
const nsIID & aIID,
|
||||||
nsIXPConnectJSObjectHolder **_retval)
|
nsIXPConnectJSObjectHolder **aHolder)
|
||||||
|
{
|
||||||
|
NS_ASSERTION(aHolder, "bad param");
|
||||||
|
|
||||||
|
jsval v;
|
||||||
|
return WrapNativeToJSVal(aJSContext, aScope, aCOMObj, &aIID, &v, aHolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* void wrapNativeToJSVal (in JSContextPtr aJSContext, in JSObjectPtr aScope, in nsISupports aCOMObj, in nsIIDPtr aIID, out JSVal aVal, out nsIXPConnectJSObjectHolder aHolder); */
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXPConnect::WrapNativeToJSVal(JSContext * aJSContext,
|
||||||
|
JSObject * aScope,
|
||||||
|
nsISupports *aCOMObj,
|
||||||
|
const nsIID * aIID,
|
||||||
|
jsval *aVal,
|
||||||
|
nsIXPConnectJSObjectHolder **aHolder)
|
||||||
{
|
{
|
||||||
NS_ASSERTION(aJSContext, "bad param");
|
NS_ASSERTION(aJSContext, "bad param");
|
||||||
NS_ASSERTION(aScope, "bad param");
|
NS_ASSERTION(aScope, "bad param");
|
||||||
NS_ASSERTION(aCOMObj, "bad param");
|
NS_ASSERTION(aCOMObj, "bad param");
|
||||||
NS_ASSERTION(_retval, "bad param");
|
|
||||||
|
|
||||||
*_retval = nsnull;
|
if(aHolder)
|
||||||
|
*aHolder = nsnull;
|
||||||
|
|
||||||
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
||||||
if(!ccx.IsValid())
|
if(!ccx.IsValid())
|
||||||
return UnexpectedFailure(NS_ERROR_FAILURE);
|
return UnexpectedFailure(NS_ERROR_FAILURE);
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
if(!XPCConvert::NativeInterface2JSObject(ccx, _retval, aCOMObj, &aIID,
|
if(!XPCConvert::NativeInterface2JSObject(ccx, aVal, aHolder, aCOMObj, aIID,
|
||||||
aScope, PR_FALSE,
|
nsnull, aScope, PR_FALSE,
|
||||||
OBJ_IS_NOT_GLOBAL, &rv))
|
OBJ_IS_NOT_GLOBAL, &rv))
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
JSObject* returnObj;
|
NS_ASSERTION(!XPCNativeWrapper::IsNativeWrapper(JSVAL_TO_OBJECT(*aVal)),
|
||||||
(*_retval)->GetJSObject(&returnObj);
|
|
||||||
NS_ASSERTION(!XPCNativeWrapper::IsNativeWrapper(returnObj),
|
|
||||||
"Shouldn't be returning a native wrapper here");
|
"Shouldn't be returning a native wrapper here");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -330,10 +330,16 @@ def writeHeaderFile(filename, name):
|
||||||
try:
|
try:
|
||||||
f.write("/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */\n"
|
f.write("/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */\n"
|
||||||
"#ifndef " + headerMacro + "\n"
|
"#ifndef " + headerMacro + "\n"
|
||||||
"#define " + headerMacro + "\n"
|
"#define " + headerMacro + "\n\n"
|
||||||
"JSBool " + name + "_DefineQuickStubs("
|
"JSBool " + name + "_DefineQuickStubs("
|
||||||
"JSContext *cx, JSObject *proto, uintN flags, "
|
"JSContext *cx, JSObject *proto, uintN flags, "
|
||||||
"PRUint32 count, const nsID **iids);\n"
|
"PRUint32 count, const nsID **iids);\n\n"
|
||||||
|
"void " + name + "_MarkInterfaces();\n\n"
|
||||||
|
"void " + name + "_ClearInterfaces();\n\n"
|
||||||
|
"inline void " + name + "_InitInterfaces()\n"
|
||||||
|
"{\n"
|
||||||
|
" " + name + "_ClearInterfaces();\n"
|
||||||
|
"}\n\n"
|
||||||
"#endif\n")
|
"#endif\n")
|
||||||
finally:
|
finally:
|
||||||
f.close()
|
f.close()
|
||||||
|
@ -598,8 +604,10 @@ def writeResultConv(f, type, paramNum, jsvalPtr, jsvalRef):
|
||||||
% (paramNum, jsvalPtr))
|
% (paramNum, jsvalPtr))
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
f.write(" AutoMarkingNativeInterfacePtr resultiface(ccx, "
|
||||||
|
"%s_Interface(ccx));\n" % type.name)
|
||||||
f.write(" return xpc_qsXPCOMObjectToJsval(ccx, result, "
|
f.write(" return xpc_qsXPCOMObjectToJsval(ccx, result, "
|
||||||
"NS_GET_IID(%s), %s);\n" % (type.name, jsvalPtr))
|
"resultiface, %s);\n" % jsvalPtr)
|
||||||
return
|
return
|
||||||
|
|
||||||
warn("Unable to convert result of type %s" % type.name)
|
warn("Unable to convert result of type %s" % type.name)
|
||||||
|
@ -819,6 +827,32 @@ def hashIID(iid):
|
||||||
|
|
||||||
uuid_re = re.compile(r'^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$')
|
uuid_re = re.compile(r'^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$')
|
||||||
|
|
||||||
|
def writeResultXPCInterfacesArray(f, conf, resulttypes):
|
||||||
|
f.write("// === XPCNativeInterface cache \n\n")
|
||||||
|
count = len(resulttypes)
|
||||||
|
if count > 0:
|
||||||
|
f.write("static XPCNativeInterface* interfaces[%d];\n\n" % count)
|
||||||
|
f.write("void %s_MarkInterfaces()\n"
|
||||||
|
"{\n" % conf.name)
|
||||||
|
if count > 0:
|
||||||
|
f.write(" for (PRUint32 i = 0; i < %d; ++i)\n"
|
||||||
|
" if (interfaces[i])\n"
|
||||||
|
" interfaces[i]->Mark();\n" % count)
|
||||||
|
f.write("}\n")
|
||||||
|
f.write("void %s_ClearInterfaces()\n"
|
||||||
|
"{\n" % conf.name)
|
||||||
|
if count > 0:
|
||||||
|
f.write(" memset(interfaces, 0, %d * "
|
||||||
|
"sizeof(XPCNativeInterface*));\n" % count)
|
||||||
|
f.write("}\n\n")
|
||||||
|
i = 0
|
||||||
|
for type in resulttypes:
|
||||||
|
f.write("XPC_QS_DEFINE_XPCNATIVEINTERFACE_GETTER(%s, interfaces[%d])\n"
|
||||||
|
% (type, i))
|
||||||
|
i += 1
|
||||||
|
if count > 0:
|
||||||
|
f.write("\n\n")
|
||||||
|
|
||||||
def writeDefiner(f, conf, interfaces):
|
def writeDefiner(f, conf, interfaces):
|
||||||
f.write("// === Definer\n\n")
|
f.write("// === Definer\n\n")
|
||||||
|
|
||||||
|
@ -937,31 +971,41 @@ def writeStubFile(filename, headerFilename, conf, interfaces):
|
||||||
def includeType(type):
|
def includeType(type):
|
||||||
type = unaliasType(type)
|
type = unaliasType(type)
|
||||||
if type.kind in ('builtin', 'native'):
|
if type.kind in ('builtin', 'native'):
|
||||||
return
|
return None
|
||||||
file = conf.irregularFilenames.get(type.name, type.name) + '.h'
|
file = conf.irregularFilenames.get(type.name, type.name) + '.h'
|
||||||
if file not in filesIncluded:
|
if file not in filesIncluded:
|
||||||
f.write('#include "%s"\n' % file)
|
f.write('#include "%s"\n' % file)
|
||||||
filesIncluded.add(file)
|
filesIncluded.add(file)
|
||||||
|
return type
|
||||||
|
|
||||||
def writeIncludesForMember(member):
|
def writeIncludesForMember(member):
|
||||||
assert member.kind in ('attribute', 'method')
|
assert member.kind in ('attribute', 'method')
|
||||||
includeType(member.realtype)
|
resulttype = includeType(member.realtype)
|
||||||
if member.kind == 'method':
|
if member.kind == 'method':
|
||||||
for p in member.params:
|
for p in member.params:
|
||||||
includeType(p.realtype)
|
includeType(p.realtype)
|
||||||
|
return resulttype
|
||||||
|
|
||||||
def writeIncludesForInterface(iface):
|
def writeIncludesForInterface(iface):
|
||||||
assert iface.kind == 'interface'
|
assert iface.kind == 'interface'
|
||||||
|
resulttypes = []
|
||||||
for member in iface.stubMembers:
|
for member in iface.stubMembers:
|
||||||
writeIncludesForMember(member)
|
resulttype = writeIncludesForMember(member)
|
||||||
|
if resulttype is not None and not isVariantType(resulttype):
|
||||||
|
resulttypes.append(resulttype.name)
|
||||||
|
|
||||||
includeType(iface)
|
includeType(iface)
|
||||||
|
|
||||||
|
return resulttypes
|
||||||
|
|
||||||
try:
|
try:
|
||||||
f.write(stubTopTemplate % os.path.basename(headerFilename))
|
f.write(stubTopTemplate % os.path.basename(headerFilename))
|
||||||
N = 256
|
N = 256
|
||||||
|
resulttypes = []
|
||||||
for iface in interfaces:
|
for iface in interfaces:
|
||||||
writeIncludesForInterface(iface)
|
resulttypes.extend(writeIncludesForInterface(iface))
|
||||||
f.write("\n\n")
|
f.write("\n\n")
|
||||||
|
writeResultXPCInterfacesArray(f, conf, sets.ImmutableSet(resulttypes))
|
||||||
for iface in interfaces:
|
for iface in interfaces:
|
||||||
writeStubsForInterface(f, iface)
|
writeStubsForInterface(f, iface)
|
||||||
writeDefiner(f, conf, interfaces)
|
writeDefiner(f, conf, interfaces)
|
||||||
|
|
|
@ -467,24 +467,17 @@ XPCConvert::NativeData2JS(XPCCallContext& ccx, jsval* d, const void* s,
|
||||||
// global object will not have been collected, and
|
// global object will not have been collected, and
|
||||||
// therefore this NativeInterface2JSObject will not end up
|
// therefore this NativeInterface2JSObject will not end up
|
||||||
// creating a new XPCNativeScriptableShared.
|
// creating a new XPCNativeScriptableShared.
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
if(!NativeInterface2JSObject(ccx, d, nsnull, iface, iid,
|
||||||
if(!NativeInterface2JSObject(ccx, getter_AddRefs(holder),
|
nsnull, scope, PR_TRUE,
|
||||||
iface, iid, scope, PR_TRUE,
|
|
||||||
OBJ_IS_NOT_GLOBAL, pErr))
|
OBJ_IS_NOT_GLOBAL, pErr))
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
|
|
||||||
if(holder)
|
|
||||||
{
|
|
||||||
JSObject* jsobj;
|
|
||||||
if(NS_FAILED(holder->GetJSObject(&jsobj)))
|
|
||||||
return JS_FALSE;
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if(!STOBJ_GET_PARENT(jsobj))
|
JSObject* jsobj = JSVAL_TO_OBJECT(*d);
|
||||||
NS_ASSERTION(STOBJ_GET_CLASS(jsobj)->flags & JSCLASS_IS_GLOBAL,
|
if(jsobj && !STOBJ_GET_PARENT(jsobj))
|
||||||
"Why did we recreate this wrapper?");
|
NS_ASSERTION(STOBJ_GET_CLASS(jsobj)->flags & JSCLASS_IS_GLOBAL,
|
||||||
|
"Why did we recreate this wrapper?");
|
||||||
#endif
|
#endif
|
||||||
*d = OBJECT_TO_JSVAL(jsobj);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1033,15 +1026,20 @@ XPCConvert::JSData2Native(XPCCallContext& ccx, void* d, jsval s,
|
||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSBool
|
inline JSBool
|
||||||
CreateHolderIfNeeded(XPCCallContext& ccx, JSObject* obj,
|
CreateHolderIfNeeded(XPCCallContext& ccx, JSObject* obj, jsval* d,
|
||||||
nsIXPConnectJSObjectHolder** dest)
|
nsIXPConnectJSObjectHolder** dest)
|
||||||
{
|
{
|
||||||
XPCJSObjectHolder* objHolder = XPCJSObjectHolder::newHolder(ccx, obj);
|
if(dest)
|
||||||
if(!objHolder)
|
{
|
||||||
return JS_FALSE;
|
XPCJSObjectHolder* objHolder = XPCJSObjectHolder::newHolder(ccx, obj);
|
||||||
|
if(!objHolder)
|
||||||
NS_ADDREF(*dest = objHolder);
|
return JS_FALSE;
|
||||||
|
|
||||||
|
NS_ADDREF(*dest = objHolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
*d = OBJECT_TO_JSVAL(obj);
|
||||||
|
|
||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1050,19 +1048,21 @@ CreateHolderIfNeeded(XPCCallContext& ccx, JSObject* obj,
|
||||||
// static
|
// static
|
||||||
JSBool
|
JSBool
|
||||||
XPCConvert::NativeInterface2JSObject(XPCCallContext& ccx,
|
XPCConvert::NativeInterface2JSObject(XPCCallContext& ccx,
|
||||||
|
jsval* d,
|
||||||
nsIXPConnectJSObjectHolder** dest,
|
nsIXPConnectJSObjectHolder** dest,
|
||||||
nsISupports* src,
|
nsISupports* src,
|
||||||
const nsID* iid,
|
const nsID* iid,
|
||||||
|
XPCNativeInterface* Interface,
|
||||||
JSObject* scope,
|
JSObject* scope,
|
||||||
PRBool allowNativeWrapper,
|
PRBool allowNativeWrapper,
|
||||||
PRBool isGlobal,
|
PRBool isGlobal,
|
||||||
nsresult* pErr)
|
nsresult* pErr)
|
||||||
{
|
{
|
||||||
NS_ASSERTION(dest, "bad param");
|
|
||||||
NS_ASSERTION(iid, "bad param");
|
|
||||||
NS_ASSERTION(scope, "bad param");
|
NS_ASSERTION(scope, "bad param");
|
||||||
|
|
||||||
*dest = nsnull;
|
*d = JSVAL_NULL;
|
||||||
|
if(dest)
|
||||||
|
*dest = nsnull;
|
||||||
if(!src)
|
if(!src)
|
||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
if(pErr)
|
if(pErr)
|
||||||
|
@ -1086,11 +1086,23 @@ XPCConvert::NativeInterface2JSObject(XPCCallContext& ccx,
|
||||||
|
|
||||||
// verify that this wrapper is for the right interface
|
// verify that this wrapper is for the right interface
|
||||||
nsCOMPtr<nsISupports> wrapper;
|
nsCOMPtr<nsISupports> wrapper;
|
||||||
if(NS_FAILED(src->QueryInterface(*iid,(void**)getter_AddRefs(wrapper))))
|
if(Interface)
|
||||||
|
src->QueryInterface(*Interface->GetIID(),
|
||||||
|
(void**)getter_AddRefs(wrapper));
|
||||||
|
else if(iid)
|
||||||
|
src->QueryInterface(*iid, (void**)getter_AddRefs(wrapper));
|
||||||
|
else
|
||||||
|
wrapper = do_QueryInterface(src);
|
||||||
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder =
|
||||||
|
do_QueryInterface(wrapper);
|
||||||
|
JSObject* flat;
|
||||||
|
if(!holder || !(flat = holder->GetFlatJSObject()))
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
return NS_SUCCEEDED(wrapper->QueryInterface(
|
|
||||||
NS_GET_IID(nsIXPConnectJSObjectHolder),
|
*d = OBJECT_TO_JSVAL(flat);
|
||||||
(void**) dest));
|
if(dest)
|
||||||
|
holder.swap(*dest);
|
||||||
|
return JS_TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif /* XPC_DO_DOUBLE_WRAP */
|
#endif /* XPC_DO_DOUBLE_WRAP */
|
||||||
|
@ -1100,27 +1112,39 @@ XPCConvert::NativeInterface2JSObject(XPCCallContext& ccx,
|
||||||
if(!xpcscope)
|
if(!xpcscope)
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
|
|
||||||
AutoMarkingNativeInterfacePtr iface(ccx);
|
AutoMarkingNativeInterfacePtr iface(ccx, Interface);
|
||||||
iface = XPCNativeInterface::GetNewOrUsed(ccx, iid);
|
if(!iface && iid)
|
||||||
if(!iface)
|
{
|
||||||
return JS_FALSE;
|
iface = XPCNativeInterface::GetNewOrUsed(ccx, iid);
|
||||||
|
if(!iface)
|
||||||
|
return JS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
XPCWrappedNative* wrapper;
|
XPCWrappedNative* wrapper;
|
||||||
|
nsRefPtr<XPCWrappedNative> strongWrapper;
|
||||||
nsWrapperCache* cache = nsnull;
|
nsWrapperCache* cache = nsnull;
|
||||||
CallQueryInterface(src, &cache);
|
CallQueryInterface(src, &cache);
|
||||||
if(cache &&
|
if(cache &&
|
||||||
(wrapper = static_cast<XPCWrappedNative*>(cache->GetWrapper())))
|
(wrapper = static_cast<XPCWrappedNative*>(cache->GetWrapper())))
|
||||||
{
|
{
|
||||||
NS_ADDREF(wrapper);
|
// If asked to return the wrapper we'll return a strong reference,
|
||||||
wrapper->FindTearOff(ccx, iface, JS_FALSE, &rv);
|
// otherwise we'll just return its JSObject in rval (which should be
|
||||||
if(NS_FAILED(rv))
|
// rooted in that case).
|
||||||
NS_RELEASE(wrapper);
|
if(dest)
|
||||||
|
strongWrapper = wrapper;
|
||||||
|
if(iface)
|
||||||
|
wrapper->FindTearOff(ccx, iface, JS_FALSE, &rv);
|
||||||
|
else
|
||||||
|
rv = NS_OK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rv = XPCWrappedNative::GetNewOrUsed(ccx, src, xpcscope, iface,
|
rv = XPCWrappedNative::GetNewOrUsed(ccx, src, xpcscope, iface,
|
||||||
isGlobal, &wrapper);
|
isGlobal,
|
||||||
|
getter_AddRefs(strongWrapper));
|
||||||
|
|
||||||
|
wrapper = strongWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pErr)
|
if(pErr)
|
||||||
|
@ -1185,6 +1209,11 @@ XPCConvert::NativeInterface2JSObject(XPCCallContext& ccx,
|
||||||
|
|
||||||
if(!JS_IsSystemObject(ccx, flat))
|
if(!JS_IsSystemObject(ccx, flat))
|
||||||
{
|
{
|
||||||
|
// From here on we might create new JSObjects, so we need to
|
||||||
|
// make sure that wrapper stays alive.
|
||||||
|
if(!strongWrapper)
|
||||||
|
strongWrapper = wrapper;
|
||||||
|
|
||||||
JSObject *destObj = nsnull;
|
JSObject *destObj = nsnull;
|
||||||
if(flags & JSFILENAME_PROTECTED)
|
if(flags & JSFILENAME_PROTECTED)
|
||||||
{
|
{
|
||||||
|
@ -1243,11 +1272,8 @@ XPCConvert::NativeInterface2JSObject(XPCCallContext& ccx,
|
||||||
destObj = JSVAL_TO_OBJECT(v);
|
destObj = JSVAL_TO_OBJECT(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
PRBool ok = destObj &&
|
return destObj &&
|
||||||
CreateHolderIfNeeded(ccx, destObj, dest);
|
CreateHolderIfNeeded(ccx, destObj, d, dest);
|
||||||
|
|
||||||
NS_RELEASE(wrapper);
|
|
||||||
return ok;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1257,14 +1283,18 @@ XPCConvert::NativeInterface2JSObject(XPCCallContext& ccx,
|
||||||
!JS_IsSystemObject(ccx, flat) &&
|
!JS_IsSystemObject(ccx, flat) &&
|
||||||
XPC_XOW_ClassNeedsXOW(name))
|
XPC_XOW_ClassNeedsXOW(name))
|
||||||
{
|
{
|
||||||
PRBool ok = XPC_XOW_WrapObject(ccx, scope, &v) &&
|
// From here on we might create new JSObjects, so we need to
|
||||||
CreateHolderIfNeeded(ccx, JSVAL_TO_OBJECT(v), dest);
|
// make sure that wrapper stays alive.
|
||||||
|
if(!strongWrapper)
|
||||||
|
strongWrapper = wrapper;
|
||||||
|
|
||||||
NS_RELEASE(wrapper);
|
return XPC_XOW_WrapObject(ccx, scope, &v) &&
|
||||||
return ok;
|
CreateHolderIfNeeded(ccx, JSVAL_TO_OBJECT(v), d, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
*dest = static_cast<nsIXPConnectJSObjectHolder*>(wrapper);
|
*d = v;
|
||||||
|
if(dest)
|
||||||
|
*dest = strongWrapper.forget().get();
|
||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
/* Per JSRuntime object */
|
/* Per JSRuntime object */
|
||||||
|
|
||||||
#include "xpcprivate.h"
|
#include "xpcprivate.h"
|
||||||
|
#include "dom_quickstubs.h"
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
|
@ -559,6 +560,8 @@ JSBool XPCJSRuntime::GCCallback(JSContext *cx, JSGCStatus status)
|
||||||
self->mDetachedWrappedNativeProtoMap->
|
self->mDetachedWrappedNativeProtoMap->
|
||||||
Enumerate(DetachedWrappedNativeProtoMarker, nsnull);
|
Enumerate(DetachedWrappedNativeProtoMarker, nsnull);
|
||||||
|
|
||||||
|
DOM_MarkInterfaces();
|
||||||
|
|
||||||
// Mark the sets used in the call contexts. There is a small
|
// Mark the sets used in the call contexts. There is a small
|
||||||
// chance that a wrapper's set will change *while* a call is
|
// chance that a wrapper's set will change *while* a call is
|
||||||
// happening which uses that wrapper's old interfface set. So,
|
// happening which uses that wrapper's old interfface set. So,
|
||||||
|
@ -813,6 +816,8 @@ DetachedWrappedNativeProtoShutdownMarker(JSDHashTable *table, JSDHashEntryHdr *h
|
||||||
|
|
||||||
void XPCJSRuntime::SystemIsBeingShutDown(JSContext* cx)
|
void XPCJSRuntime::SystemIsBeingShutDown(JSContext* cx)
|
||||||
{
|
{
|
||||||
|
DOM_ClearInterfaces();
|
||||||
|
|
||||||
if(mDetachedWrappedNativeProtoMap)
|
if(mDetachedWrappedNativeProtoMap)
|
||||||
mDetachedWrappedNativeProtoMap->
|
mDetachedWrappedNativeProtoMap->
|
||||||
Enumerate(DetachedWrappedNativeProtoShutdownMarker, cx);
|
Enumerate(DetachedWrappedNativeProtoShutdownMarker, cx);
|
||||||
|
@ -1001,6 +1006,8 @@ XPCJSRuntime::XPCJSRuntime(nsXPConnect* aXPConnect)
|
||||||
sizeof(JSDHashEntryStub), 128);
|
sizeof(JSDHashEntryStub), 128);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
DOM_InitInterfaces();
|
||||||
|
|
||||||
// these jsids filled in later when we have a JSContext to work with.
|
// these jsids filled in later when we have a JSContext to work with.
|
||||||
mStrIDs[0] = 0;
|
mStrIDs[0] = 0;
|
||||||
|
|
||||||
|
|
|
@ -2759,9 +2759,11 @@ public:
|
||||||
* @param pErr [out] relevant error code, if any.
|
* @param pErr [out] relevant error code, if any.
|
||||||
*/
|
*/
|
||||||
static JSBool NativeInterface2JSObject(XPCCallContext& ccx,
|
static JSBool NativeInterface2JSObject(XPCCallContext& ccx,
|
||||||
|
jsval* d,
|
||||||
nsIXPConnectJSObjectHolder** dest,
|
nsIXPConnectJSObjectHolder** dest,
|
||||||
nsISupports* src,
|
nsISupports* src,
|
||||||
const nsID* iid,
|
const nsID* iid,
|
||||||
|
XPCNativeInterface* Interface,
|
||||||
JSObject* scope,
|
JSObject* scope,
|
||||||
PRBool allowNativeWrapper,
|
PRBool allowNativeWrapper,
|
||||||
PRBool isGlobal,
|
PRBool isGlobal,
|
||||||
|
|
|
@ -743,7 +743,7 @@ xpc_qsStringToJsval(JSContext *cx, const nsAString &str, jsval *rval)
|
||||||
|
|
||||||
JSBool
|
JSBool
|
||||||
xpc_qsXPCOMObjectToJsval(XPCCallContext &ccx, nsISupports *p,
|
xpc_qsXPCOMObjectToJsval(XPCCallContext &ccx, nsISupports *p,
|
||||||
const nsIID &iid, jsval *rval)
|
XPCNativeInterface *iface, jsval *rval)
|
||||||
{
|
{
|
||||||
// From the T_INTERFACE case in XPCConvert::NativeData2JS.
|
// From the T_INTERFACE case in XPCConvert::NativeData2JS.
|
||||||
// This is one of the slowest things quick stubs do.
|
// This is one of the slowest things quick stubs do.
|
||||||
|
@ -751,16 +751,18 @@ xpc_qsXPCOMObjectToJsval(XPCCallContext &ccx, nsISupports *p,
|
||||||
JSObject *scope = ccx.GetCurrentJSObject();
|
JSObject *scope = ccx.GetCurrentJSObject();
|
||||||
NS_ASSERTION(scope, "bad ccx");
|
NS_ASSERTION(scope, "bad ccx");
|
||||||
|
|
||||||
|
if(!iface)
|
||||||
|
return xpc_qsThrow(ccx, NS_ERROR_XPC_BAD_CONVERT_NATIVE);
|
||||||
|
|
||||||
// XXX The OBJ_IS_NOT_GLOBAL here is not really right. In
|
// XXX The OBJ_IS_NOT_GLOBAL here is not really right. In
|
||||||
// fact, this code is depending on the fact that the
|
// fact, this code is depending on the fact that the
|
||||||
// global object will not have been collected, and
|
// global object will not have been collected, and
|
||||||
// therefore this NativeInterface2JSObject will not end up
|
// therefore this NativeInterface2JSObject will not end up
|
||||||
// creating a new XPCNativeScriptableShared.
|
// creating a new XPCNativeScriptableShared.
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
if(!XPCConvert::NativeInterface2JSObject(ccx, getter_AddRefs(holder),
|
if(!XPCConvert::NativeInterface2JSObject(ccx, rval, nsnull, p, nsnull,
|
||||||
p, &iid, scope, PR_TRUE,
|
iface, scope, PR_TRUE,
|
||||||
OBJ_IS_NOT_GLOBAL, &rv))
|
OBJ_IS_NOT_GLOBAL, &rv))
|
||||||
{
|
{
|
||||||
// I can't tell if NativeInterface2JSObject throws JS exceptions
|
// I can't tell if NativeInterface2JSObject throws JS exceptions
|
||||||
// or not. This is a sloppy stab at the right semantics; the
|
// or not. This is a sloppy stab at the right semantics; the
|
||||||
|
@ -770,22 +772,13 @@ xpc_qsXPCOMObjectToJsval(XPCCallContext &ccx, nsISupports *p,
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(holder)
|
|
||||||
{
|
|
||||||
JSObject* jsobj;
|
|
||||||
if(NS_FAILED(holder->GetJSObject(&jsobj)))
|
|
||||||
return JS_FALSE;
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if(!STOBJ_GET_PARENT(jsobj))
|
JSObject* jsobj = JSVAL_TO_OBJECT(*rval);
|
||||||
NS_ASSERTION(STOBJ_GET_CLASS(jsobj)->flags & JSCLASS_IS_GLOBAL,
|
if(jsobj && !STOBJ_GET_PARENT(jsobj))
|
||||||
"Why did we recreate this wrapper?");
|
NS_ASSERTION(STOBJ_GET_CLASS(jsobj)->flags & JSCLASS_IS_GLOBAL,
|
||||||
|
"Why did we recreate this wrapper?");
|
||||||
#endif
|
#endif
|
||||||
*rval = OBJECT_TO_JSVAL(jsobj);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*rval = JSVAL_NULL;
|
|
||||||
}
|
|
||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -398,7 +398,7 @@ xpc_qsUnwrapArg(JSContext *cx, jsval v, T **ppArg)
|
||||||
JSBool
|
JSBool
|
||||||
xpc_qsXPCOMObjectToJsval(XPCCallContext &ccx,
|
xpc_qsXPCOMObjectToJsval(XPCCallContext &ccx,
|
||||||
nsISupports *p,
|
nsISupports *p,
|
||||||
const nsIID &iid,
|
XPCNativeInterface *iface,
|
||||||
jsval *rval);
|
jsval *rval);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -432,4 +432,14 @@ xpc_qsAssertContextOK(JSContext *cx);
|
||||||
#define XPC_QS_ASSERT_CONTEXT_OK(cx) ((void) 0)
|
#define XPC_QS_ASSERT_CONTEXT_OK(cx) ((void) 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define XPC_QS_DEFINE_XPCNATIVEINTERFACE_GETTER(_iface, _iface_cache) \
|
||||||
|
inline XPCNativeInterface* \
|
||||||
|
_iface##_Interface(XPCCallContext& ccx) \
|
||||||
|
{ \
|
||||||
|
if(!(_iface_cache)) \
|
||||||
|
(_iface_cache) = \
|
||||||
|
XPCNativeInterface::GetNewOrUsed(ccx, &NS_GET_IID(_iface)); \
|
||||||
|
return (_iface_cache); \
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* xpcquickstubs_h___ */
|
#endif /* xpcquickstubs_h___ */
|
||||||
|
|
|
@ -1342,23 +1342,19 @@ nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS* wrapper, uint16 methodIndex,
|
||||||
}
|
}
|
||||||
if(newThis)
|
if(newThis)
|
||||||
{
|
{
|
||||||
if(!newWrapperIID)
|
jsval v;
|
||||||
newWrapperIID =
|
|
||||||
const_cast<nsIID*>
|
|
||||||
(&NS_GET_IID(nsISupports));
|
|
||||||
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
|
||||||
JSBool ok =
|
JSBool ok =
|
||||||
XPCConvert::NativeInterface2JSObject(ccx,
|
XPCConvert::NativeInterface2JSObject(ccx,
|
||||||
getter_AddRefs(holder), newThis,
|
&v, nsnull, newThis, newWrapperIID,
|
||||||
newWrapperIID, obj, PR_FALSE, PR_FALSE,
|
nsnull, obj, PR_FALSE, PR_FALSE,
|
||||||
nsnull);
|
nsnull);
|
||||||
if(newWrapperIID != &NS_GET_IID(nsISupports))
|
if(newWrapperIID)
|
||||||
nsMemory::Free(newWrapperIID);
|
nsMemory::Free(newWrapperIID);
|
||||||
if(!ok ||
|
if(!ok)
|
||||||
NS_FAILED(holder->GetJSObject(&thisObj)))
|
|
||||||
{
|
{
|
||||||
goto pre_call_clean_up;
|
goto pre_call_clean_up;
|
||||||
}
|
}
|
||||||
|
thisObj = JSVAL_TO_OBJECT(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -302,7 +302,8 @@ XPCWrappedNative::GetNewOrUsed(XPCCallContext& ccx,
|
||||||
// in a pointer that hasn't been QI'd to IDispatch properly this could
|
// in a pointer that hasn't been QI'd to IDispatch properly this could
|
||||||
// create multiple wrappers for the same object, creating a fair bit of
|
// create multiple wrappers for the same object, creating a fair bit of
|
||||||
// confusion.
|
// confusion.
|
||||||
PRBool isIDispatch = Interface->GetIID()->Equals(NSID_IDISPATCH);
|
PRBool isIDispatch = Interface &&
|
||||||
|
Interface->GetIID()->Equals(NSID_IDISPATCH);
|
||||||
if(isIDispatch)
|
if(isIDispatch)
|
||||||
identity = Object;
|
identity = Object;
|
||||||
else
|
else
|
||||||
|
@ -333,7 +334,7 @@ XPCWrappedNative::GetNewOrUsed(XPCCallContext& ccx,
|
||||||
|
|
||||||
if(wrapper)
|
if(wrapper)
|
||||||
{
|
{
|
||||||
if(!wrapper->FindTearOff(ccx, Interface, JS_FALSE, &rv))
|
if(Interface && !wrapper->FindTearOff(ccx, Interface, JS_FALSE, &rv))
|
||||||
{
|
{
|
||||||
NS_RELEASE(wrapper);
|
NS_RELEASE(wrapper);
|
||||||
NS_ASSERTION(NS_FAILED(rv), "returning NS_OK on failure");
|
NS_ASSERTION(NS_FAILED(rv), "returning NS_OK on failure");
|
||||||
|
@ -356,7 +357,8 @@ XPCWrappedNative::GetNewOrUsed(XPCCallContext& ccx,
|
||||||
// If we are making a wrapper for the nsIClassInfo interface then
|
// If we are making a wrapper for the nsIClassInfo interface then
|
||||||
// We *don't* want to have it use the prototype meant for instances
|
// We *don't* want to have it use the prototype meant for instances
|
||||||
// of that class.
|
// of that class.
|
||||||
JSBool isClassInfo = Interface->GetIID()->Equals(NS_GET_IID(nsIClassInfo));
|
JSBool isClassInfo = Interface &&
|
||||||
|
Interface->GetIID()->Equals(NS_GET_IID(nsIClassInfo));
|
||||||
|
|
||||||
nsCOMPtr<nsIClassInfo> info;
|
nsCOMPtr<nsIClassInfo> info;
|
||||||
|
|
||||||
|
@ -429,7 +431,7 @@ XPCWrappedNative::GetNewOrUsed(XPCCallContext& ccx,
|
||||||
|
|
||||||
if(wrapper)
|
if(wrapper)
|
||||||
{
|
{
|
||||||
if(!wrapper->FindTearOff(ccx, Interface, JS_FALSE, &rv))
|
if(Interface && !wrapper->FindTearOff(ccx, Interface, JS_FALSE, &rv))
|
||||||
{
|
{
|
||||||
NS_RELEASE(wrapper);
|
NS_RELEASE(wrapper);
|
||||||
NS_ASSERTION(NS_FAILED(rv), "returning NS_OK on failure");
|
NS_ASSERTION(NS_FAILED(rv), "returning NS_OK on failure");
|
||||||
|
@ -488,7 +490,7 @@ XPCWrappedNative::GetNewOrUsed(XPCCallContext& ccx,
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!wrapper->FindTearOff(ccx, Interface, JS_FALSE, &rv))
|
if(Interface && !wrapper->FindTearOff(ccx, Interface, JS_FALSE, &rv))
|
||||||
{
|
{
|
||||||
// Second reference will be released by the FlatJSObject's finializer.
|
// Second reference will be released by the FlatJSObject's finializer.
|
||||||
wrapper->Release();
|
wrapper->Release();
|
||||||
|
@ -636,7 +638,7 @@ XPCWrappedNative::GetUsedOnly(XPCCallContext& ccx,
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
if(!wrapper->FindTearOff(ccx, Interface, JS_FALSE, &rv))
|
if(Interface && !wrapper->FindTearOff(ccx, Interface, JS_FALSE, &rv))
|
||||||
{
|
{
|
||||||
NS_RELEASE(wrapper);
|
NS_RELEASE(wrapper);
|
||||||
NS_ASSERTION(NS_FAILED(rv), "returning NS_OK on failure");
|
NS_ASSERTION(NS_FAILED(rv), "returning NS_OK on failure");
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
// defined in nsChildView.mm
|
// defined in nsChildView.mm
|
||||||
extern nsIRollupListener * gRollupListener;
|
extern nsIRollupListener * gRollupListener;
|
||||||
extern nsIWidget * gRollupWidget;
|
extern nsIWidget * gRollupWidget;
|
||||||
|
extern PRUint32 gLastModifierState;
|
||||||
|
|
||||||
// defined in nsCocoaWindow.mm
|
// defined in nsCocoaWindow.mm
|
||||||
extern PRInt32 gXULModalLevel;
|
extern PRInt32 gXULModalLevel;
|
||||||
|
@ -816,6 +817,10 @@ nsAppShell::AfterProcessNextEvent(nsIThreadInternal *aThread,
|
||||||
selector:@selector(applicationWillTerminate:)
|
selector:@selector(applicationWillTerminate:)
|
||||||
name:NSApplicationWillTerminateNotification
|
name:NSApplicationWillTerminateNotification
|
||||||
object:NSApp];
|
object:NSApp];
|
||||||
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||||
|
selector:@selector(applicationDidBecomeActive:)
|
||||||
|
name:NSApplicationDidBecomeActiveNotification
|
||||||
|
object:NSApp];
|
||||||
[[NSDistributedNotificationCenter defaultCenter] addObserver:self
|
[[NSDistributedNotificationCenter defaultCenter] addObserver:self
|
||||||
selector:@selector(beginMenuTracking:)
|
selector:@selector(beginMenuTracking:)
|
||||||
name:@"com.apple.HIToolbox.beginMenuTrackingNotification"
|
name:@"com.apple.HIToolbox.beginMenuTrackingNotification"
|
||||||
|
@ -850,6 +855,25 @@ nsAppShell::AfterProcessNextEvent(nsIThreadInternal *aThread,
|
||||||
NS_OBJC_END_TRY_ABORT_BLOCK;
|
NS_OBJC_END_TRY_ABORT_BLOCK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// applicationDidBecomeActive
|
||||||
|
//
|
||||||
|
// Make sure gLastModifierState is updated when we become active (since we
|
||||||
|
// won't have received [ChildView flagsChanged:] messages while inactive).
|
||||||
|
- (void)applicationDidBecomeActive:(NSNotification*)aNotification
|
||||||
|
{
|
||||||
|
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
|
||||||
|
|
||||||
|
// [NSEvent modifierFlags] is valid on every kind of event, so we don't need
|
||||||
|
// to worry about getting an NSInternalInconsistencyException here.
|
||||||
|
NSEvent* currentEvent = [NSApp currentEvent];
|
||||||
|
if (currentEvent) {
|
||||||
|
gLastModifierState =
|
||||||
|
nsCocoaUtils::GetCocoaEventModifierFlags(currentEvent) & NSDeviceIndependentModifierFlagsMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_OBJC_END_TRY_ABORT_BLOCK;
|
||||||
|
}
|
||||||
|
|
||||||
// beginMenuTracking
|
// beginMenuTracking
|
||||||
//
|
//
|
||||||
// Roll up our context menu (if any) when some other app (or the OS) opens
|
// Roll up our context menu (if any) when some other app (or the OS) opens
|
||||||
|
|
|
@ -174,8 +174,6 @@ enum {
|
||||||
// when handling |draggingUpdated:| messages.
|
// when handling |draggingUpdated:| messages.
|
||||||
nsIDragService* mDragService;
|
nsIDragService* mDragService;
|
||||||
|
|
||||||
PRUint32 mLastModifierState;
|
|
||||||
|
|
||||||
// For use with plugins, so that we can support IME in them. We can't use
|
// For use with plugins, so that we can support IME in them. We can't use
|
||||||
// Cocoa TSM documents (those created and managed by the NSTSMInputContext
|
// Cocoa TSM documents (those created and managed by the NSTSMInputContext
|
||||||
// class) -- for some reason TSMProcessRawKeyEvent() doesn't work with them.
|
// class) -- for some reason TSMProcessRawKeyEvent() doesn't work with them.
|
||||||
|
|
|
@ -136,6 +136,8 @@ static void blinkRgn(RgnHandle rgn);
|
||||||
nsIRollupListener * gRollupListener = nsnull;
|
nsIRollupListener * gRollupListener = nsnull;
|
||||||
nsIWidget * gRollupWidget = nsnull;
|
nsIWidget * gRollupWidget = nsnull;
|
||||||
|
|
||||||
|
PRUint32 gLastModifierState = 0;
|
||||||
|
|
||||||
|
|
||||||
@interface ChildView(Private)
|
@interface ChildView(Private)
|
||||||
|
|
||||||
|
@ -6021,10 +6023,7 @@ static BOOL keyUpAlreadySentKeyDown = NO;
|
||||||
|
|
||||||
// CapsLock state and other modifier states are different:
|
// CapsLock state and other modifier states are different:
|
||||||
// CapsLock state does not revert when the CapsLock key goes up, as the
|
// CapsLock state does not revert when the CapsLock key goes up, as the
|
||||||
// modifier state does for other modifier keys on key up. Also,
|
// modifier state does for other modifier keys on key up.
|
||||||
// mLastModifierState is set only when this view is the first responder. We
|
|
||||||
// cannot trust mLastModifierState to accurately reflect the state of CapsLock
|
|
||||||
// since CapsLock maybe have been toggled when another window was active.
|
|
||||||
if ([theEvent keyCode] == kCapsLockKeyCode) {
|
if ([theEvent keyCode] == kCapsLockKeyCode) {
|
||||||
// Fire key down event for caps lock.
|
// Fire key down event for caps lock.
|
||||||
[self fireKeyEventForFlagsChanged:theEvent keyDown:YES];
|
[self fireKeyEventForFlagsChanged:theEvent keyDown:YES];
|
||||||
|
@ -6043,7 +6042,7 @@ static BOOL keyUpAlreadySentKeyDown = NO;
|
||||||
|
|
||||||
for (PRUint32 i = 0; i < kModifierCount; i++) {
|
for (PRUint32 i = 0; i < kModifierCount; i++) {
|
||||||
PRUint32 modifierBit = kModifierMaskTable[i];
|
PRUint32 modifierBit = kModifierMaskTable[i];
|
||||||
if ((modifiers & modifierBit) != (mLastModifierState & modifierBit)) {
|
if ((modifiers & modifierBit) != (gLastModifierState & modifierBit)) {
|
||||||
BOOL isKeyDown = (modifiers & modifierBit) != 0 ? YES : NO;
|
BOOL isKeyDown = (modifiers & modifierBit) != 0 ? YES : NO;
|
||||||
|
|
||||||
[self fireKeyEventForFlagsChanged:theEvent keyDown:isKeyDown];
|
[self fireKeyEventForFlagsChanged:theEvent keyDown:isKeyDown];
|
||||||
|
@ -6058,7 +6057,7 @@ static BOOL keyUpAlreadySentKeyDown = NO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mLastModifierState = modifiers;
|
gLastModifierState = modifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if the hand scroll cursor needs to be set/unset
|
// check if the hand scroll cursor needs to be set/unset
|
||||||
|
|
Загрузка…
Ссылка в новой задаче