Bug 1189822 part 3. Stop using EnsureExpandoObject in codegen code when we just want to preserver the wrapper for a DOM proxy. r=peterv

This commit is contained in:
Boris Zbarsky 2017-05-17 00:52:53 -04:00
Родитель cba820b01b
Коммит 9f3244d605
6 изменённых файлов: 29 добавлений и 14 удалений

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

@ -261,6 +261,7 @@ public:
// nsWrapperCache
using nsWrapperCache::GetWrapperPreserveColor;
using nsWrapperCache::PreserveWrapper;
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
protected:
virtual ~nsContentList();
@ -269,6 +270,10 @@ protected:
{
return nsWrapperCache::GetWrapperPreserveColor();
}
virtual void PreserveWrapperInternal(nsISupports* aScriptObjectHolder) override
{
nsWrapperCache::PreserveWrapper(aScriptObjectHolder);
}
public:
// nsIDOMHTMLCollection

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

@ -3738,17 +3738,6 @@ class CGWrapWithCacheMethod(CGAbstractMethod):
self.properties = properties
def definition_body(self):
if self.descriptor.proxy:
preserveWrapper = dedent(
"""
// For DOM proxies, the only reliable way to preserve the wrapper
// is to force creation of the expando object.
JS::Rooted<JSObject*> unused(aCx,
DOMProxyHandler::EnsureExpandoObject(aCx, aReflector));
""")
else:
preserveWrapper = "PreserveWrapper(aObject);\n"
failureCode = dedent(
"""
aCache->ReleaseWrapper(aObject);
@ -3804,7 +3793,7 @@ class CGWrapWithCacheMethod(CGAbstractMethod):
// somewhat common) to have a non-null aGivenProto which is the
// same as canonicalProto.
if (proto != canonicalProto) {
$*{preserveWrapper}
PreserveWrapper(aObject);
}
return true;
@ -3816,8 +3805,7 @@ class CGWrapWithCacheMethod(CGAbstractMethod):
failureCode),
slots=InitMemberSlots(self.descriptor, failureCode),
setImmutablePrototype=SetImmutablePrototype(self.descriptor,
failureCode),
preserveWrapper=preserveWrapper)
failureCode))
class CGWrapMethod(CGAbstractMethod):

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

@ -79,6 +79,7 @@ public:
// nsWrapperCache
using nsWrapperCache::GetWrapperPreserveColor;
using nsWrapperCache::PreserveWrapper;
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
protected:
virtual ~HTMLFormControlsCollection();
@ -86,6 +87,10 @@ protected:
{
return nsWrapperCache::GetWrapperPreserveColor();
}
virtual void PreserveWrapperInternal(nsISupports* aScriptObjectHolder) override
{
nsWrapperCache::PreserveWrapper(aScriptObjectHolder);
}
public:
static bool ShouldBeInElements(nsIFormControl* aFormControl);

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

@ -44,6 +44,7 @@ public:
// nsWrapperCache
using nsWrapperCache::GetWrapperPreserveColor;
using nsWrapperCache::GetWrapper;
using nsWrapperCache::PreserveWrapper;
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
protected:
virtual ~HTMLOptionsCollection();
@ -52,6 +53,10 @@ protected:
{
return nsWrapperCache::GetWrapperPreserveColor();
}
virtual void PreserveWrapperInternal(nsISupports* aScriptObjectHolder) override
{
nsWrapperCache::PreserveWrapper(aScriptObjectHolder);
}
public:
// nsIDOMHTMLOptionsCollection interface

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

@ -49,6 +49,7 @@ public:
// nsWrapperCache
using nsWrapperCache::GetWrapperPreserveColor;
using nsWrapperCache::PreserveWrapper;
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
protected:
virtual ~TableRowsCollection();
@ -57,6 +58,10 @@ protected:
{
return nsWrapperCache::GetWrapperPreserveColor();
}
virtual void PreserveWrapperInternal(nsISupports* aScriptObjectHolder) override
{
nsWrapperCache::PreserveWrapper(aScriptObjectHolder);
}
// Those rows that are not in table sections
HTMLTableElement* mParent;

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

@ -86,9 +86,16 @@ public:
}
return obj;
}
void PreserveWrapper(nsISupports* aScriptObjectHolder)
{
PreserveWrapperInternal(aScriptObjectHolder);
}
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) = 0;
protected:
// Hook for calling nsWrapperCache::GetWrapperPreserveColor.
virtual JSObject* GetWrapperPreserveColorInternal() = 0;
// Hook for calling nsWrapperCache::PreserveWrapper.
virtual void PreserveWrapperInternal(nsISupports* aScriptObjectHolder) = 0;
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsIHTMLCollection, NS_IHTMLCOLLECTION_IID)