mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 14:22:01 +00:00
Bug 1088228 part 6. Simplify the DOM GetParentObject setup, now that we no longer rely on it for scope chains. r=peterv
This commit is contained in:
parent
e08b9cd7ca
commit
1f640ff753
@ -2877,7 +2877,11 @@ nsINode::OwnerDocAsNode() const
|
||||
inline mozilla::dom::ParentObject
|
||||
nsINode::GetParentObject() const
|
||||
{
|
||||
return GetParentObjectInternal(OwnerDoc());
|
||||
mozilla::dom::ParentObject p(OwnerDoc());
|
||||
// Note that mUseXBLScope is a no-op for chrome, and other places where we
|
||||
// don't use XBL scopes.
|
||||
p.mUseXBLScope = IsInAnonymousSubtree() && !IsAnonymousContentInSVGUseSubtree();
|
||||
return p;
|
||||
}
|
||||
|
||||
#endif /* nsIDocument_h___ */
|
||||
|
@ -382,17 +382,6 @@ protected:
|
||||
*/
|
||||
virtual JSObject* WrapNode(JSContext *aCx) = 0;
|
||||
|
||||
// Subclasses that wish to override the parent behavior should return the
|
||||
// result of GetParentObjectIntenral, which handles the XBL scope stuff.
|
||||
//
|
||||
mozilla::dom::ParentObject GetParentObjectInternal(nsINode* aNativeParent) const {
|
||||
mozilla::dom::ParentObject p(aNativeParent);
|
||||
// Note that mUseXBLScope is a no-op for chrome, and other places where we
|
||||
// don't use XBL scopes.
|
||||
p.mUseXBLScope = IsInAnonymousSubtree() && !IsAnonymousContentInSVGUseSubtree();
|
||||
return p;
|
||||
}
|
||||
|
||||
public:
|
||||
mozilla::dom::ParentObject GetParentObject() const; // Implemented in nsIDocument.h
|
||||
|
||||
|
@ -1504,22 +1504,6 @@ WrapNativeParent(JSContext* cx, const T& p)
|
||||
return WrapNativeParent(cx, GetParentPointer(p), GetWrapperCache(p), GetUseXBLScope(p));
|
||||
}
|
||||
|
||||
// A way to differentiate between nodes, which use the parent object
|
||||
// returned by native->GetParentObject(), and all other objects, which
|
||||
// just use the parent's global.
|
||||
static inline JSObject*
|
||||
GetRealParentObject(void* aParent, JSObject* aParentObject)
|
||||
{
|
||||
return aParentObject ?
|
||||
js::GetGlobalForObjectCrossCompartment(aParentObject) : nullptr;
|
||||
}
|
||||
|
||||
static inline JSObject*
|
||||
GetRealParentObject(Element* aParent, JSObject* aParentObject)
|
||||
{
|
||||
return aParentObject;
|
||||
}
|
||||
|
||||
HAS_MEMBER(GetParentObject)
|
||||
|
||||
template<typename T, bool WrapperCached=HasGetParentObjectMember<T>::Value>
|
||||
@ -1529,9 +1513,8 @@ struct GetParentObject
|
||||
{
|
||||
MOZ_ASSERT(js::IsObjectInContextCompartment(obj, cx));
|
||||
T* native = UnwrapDOMObject<T>(obj);
|
||||
return
|
||||
GetRealParentObject(native,
|
||||
WrapNativeParent(cx, native->GetParentObject()));
|
||||
JSObject* wrappedParent = WrapNativeParent(cx, native->GetParentObject());
|
||||
return wrappedParent ? js::GetGlobalForObjectCrossCompartment(wrappedParent) : nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -3069,24 +3069,23 @@ class CGConstructorEnabled(CGAbstractMethod):
|
||||
return body.define()
|
||||
|
||||
|
||||
def CreateBindingJSObject(descriptor, properties, parent):
|
||||
def CreateBindingJSObject(descriptor, properties):
|
||||
# We don't always need to root obj, but there are a variety
|
||||
# of cases where we do, so for simplicity, just always root it.
|
||||
objDecl = "JS::Rooted<JSObject*> obj(aCx);\n"
|
||||
if descriptor.proxy:
|
||||
create = fill(
|
||||
create = dedent(
|
||||
"""
|
||||
JS::Rooted<JS::Value> proxyPrivateVal(aCx, JS::PrivateValue(aObject));
|
||||
js::ProxyOptions options;
|
||||
options.setClass(&Class.mBase);
|
||||
obj = NewProxyObject(aCx, DOMProxyHandler::getInstance(),
|
||||
proxyPrivateVal, proto, ${parent}, options);
|
||||
proxyPrivateVal, proto, global, options);
|
||||
if (!obj) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
""",
|
||||
parent=parent)
|
||||
""")
|
||||
if descriptor.interface.getExtendedAttribute('OverrideBuiltins'):
|
||||
create += dedent("""
|
||||
js::SetProxyExtra(obj, JSPROXYSLOT_EXPANDO,
|
||||
@ -3094,16 +3093,15 @@ def CreateBindingJSObject(descriptor, properties, parent):
|
||||
|
||||
""")
|
||||
else:
|
||||
create = fill(
|
||||
create = dedent(
|
||||
"""
|
||||
obj = JS_NewObject(aCx, Class.ToJSClass(), proto, ${parent});
|
||||
obj = JS_NewObject(aCx, Class.ToJSClass(), proto, global);
|
||||
if (!obj) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
js::SetReservedSlot(obj, DOM_OBJECT_SLOT, PRIVATE_TO_JSVAL(aObject));
|
||||
""",
|
||||
parent=parent)
|
||||
""")
|
||||
create = objDecl + create
|
||||
|
||||
if descriptor.nativeOwnership == 'refcounted':
|
||||
@ -3254,9 +3252,7 @@ class CGWrapWithCacheMethod(CGAbstractMethod):
|
||||
MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
|
||||
"nsISupports must be on our primary inheritance chain");
|
||||
|
||||
JS::Rooted<JSObject*> parent(aCx,
|
||||
GetRealParentObject(aObject,
|
||||
WrapNativeParent(aCx, aObject->GetParentObject())));
|
||||
JS::Rooted<JSObject*> parent(aCx, WrapNativeParent(aCx, aObject->GetParentObject()));
|
||||
if (!parent) {
|
||||
return nullptr;
|
||||
}
|
||||
@ -3272,13 +3268,13 @@ class CGWrapWithCacheMethod(CGAbstractMethod):
|
||||
}
|
||||
|
||||
JSAutoCompartment ac(aCx, parent);
|
||||
JS::Rooted<JSObject*> global(aCx, JS_GetGlobalForObject(aCx, parent));
|
||||
JS::Rooted<JSObject*> global(aCx, js::GetGlobalForObjectCrossCompartment(parent));
|
||||
JS::Handle<JSObject*> proto = GetProtoObjectHandle(aCx, global);
|
||||
if (!proto) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
$*{parent}
|
||||
$*{createObject}
|
||||
|
||||
$*{unforgeable}
|
||||
|
||||
@ -3287,8 +3283,7 @@ class CGWrapWithCacheMethod(CGAbstractMethod):
|
||||
return obj;
|
||||
""",
|
||||
assertion=AssertInheritanceChain(self.descriptor),
|
||||
parent=CreateBindingJSObject(self.descriptor, self.properties,
|
||||
"parent"),
|
||||
createObject=CreateBindingJSObject(self.descriptor, self.properties),
|
||||
unforgeable=InitUnforgeableProperties(self.descriptor, self.properties),
|
||||
slots=InitMemberSlots(self.descriptor, True))
|
||||
|
||||
@ -3334,7 +3329,7 @@ class CGWrapNonWrapperCacheMethod(CGAbstractMethod):
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
$*{global_}
|
||||
$*{createObject}
|
||||
|
||||
$*{unforgeable}
|
||||
|
||||
@ -3342,8 +3337,7 @@ class CGWrapNonWrapperCacheMethod(CGAbstractMethod):
|
||||
return obj;
|
||||
""",
|
||||
assertions=AssertInheritanceChain(self.descriptor),
|
||||
global_=CreateBindingJSObject(self.descriptor, self.properties,
|
||||
"global"),
|
||||
createObject=CreateBindingJSObject(self.descriptor, self.properties),
|
||||
unforgeable=InitUnforgeableProperties(self.descriptor, self.properties),
|
||||
slots=InitMemberSlots(self.descriptor, False))
|
||||
|
||||
|
@ -77,12 +77,6 @@ public:
|
||||
SetHTMLAttr(nsGkAtoms::align, aAlign, aError);
|
||||
}
|
||||
|
||||
ParentObject GetParentObject() {
|
||||
Element* form = GetFormElement();
|
||||
return form ? GetParentObjectInternal(form)
|
||||
: nsGenericHTMLElement::GetParentObject();
|
||||
}
|
||||
|
||||
nsINode* GetScopeChainParent() const MOZ_OVERRIDE
|
||||
{
|
||||
Element* form = GetFormElement();
|
||||
|
@ -1896,16 +1896,6 @@ NS_IMPL_ISUPPORTS_INHERITED(nsGenericHTMLFormElement,
|
||||
nsGenericHTMLElement,
|
||||
nsIFormControl)
|
||||
|
||||
mozilla::dom::ParentObject
|
||||
nsGenericHTMLFormElement::GetParentObject() const
|
||||
{
|
||||
// We use the parent chain to implement the scope for event handlers.
|
||||
if (mForm) {
|
||||
return GetParentObjectInternal(mForm);
|
||||
}
|
||||
return nsGenericHTMLElement::GetParentObject();
|
||||
}
|
||||
|
||||
nsINode*
|
||||
nsGenericHTMLFormElement::GetScopeChainParent() const
|
||||
{
|
||||
|
@ -1245,8 +1245,6 @@ public:
|
||||
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
mozilla::dom::ParentObject GetParentObject() const;
|
||||
|
||||
nsINode* GetScopeChainParent() const MOZ_OVERRIDE;
|
||||
|
||||
virtual bool IsNodeOfType(uint32_t aFlags) const MOZ_OVERRIDE;
|
||||
|
@ -606,18 +606,9 @@ public:
|
||||
already_AddRefed<nsFrameLoader> GetFrameLoader();
|
||||
void SwapFrameLoaders(nsXULElement& aOtherOwner, mozilla::ErrorResult& rv);
|
||||
|
||||
// For XUL, the parent is the parent element, if any
|
||||
mozilla::dom::ParentObject GetParentObject() const
|
||||
{
|
||||
Element* parent = GetParentElement();
|
||||
if (parent) {
|
||||
return GetParentObjectInternal(parent);
|
||||
}
|
||||
return nsStyledElement::GetParentObject();
|
||||
}
|
||||
|
||||
nsINode* GetScopeChainParent() const MOZ_OVERRIDE
|
||||
{
|
||||
// For XUL, the parent is the parent element, if any
|
||||
Element* parent = GetParentElement();
|
||||
return parent ? parent : nsStyledElement::GetScopeChainParent();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user