gecko/dom/workers/DOMBindingInlines.h
Peter Van der Beken 1ef60a85a4 Fix for bug 778152 (Content window does not have an XMLHttpRequest property when accessed via an Xray wrapper in a subscript). r=bz.
Switch from using the interface objects from the Xrays compartment to wrapping
interface objects and interface prototype objects in Xrays. Make dom binding
Xrays deal with both instance objects and interface and interface prototype
objects.
2012-10-09 20:50:27 +02:00

91 lines
3.1 KiB
C++

/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_workers_dombindinginlines_h__
#define mozilla_dom_workers_dombindinginlines_h__
#include "mozilla/dom/FileReaderSyncBinding.h"
#include "mozilla/dom/XMLHttpRequestBinding.h"
#include "mozilla/dom/XMLHttpRequestUploadBinding.h"
BEGIN_WORKERS_NAMESPACE
class FileReaderSync;
class XMLHttpRequest;
class XMLHttpRequestUpload;
namespace {
template <class T>
struct WrapPrototypeTraits
{ };
// XXX I kinda hate this, but we decided it wasn't worth generating this in the
// binding headers.
#define SPECIALIZE_PROTO_TRAITS(_class) \
template <> \
struct WrapPrototypeTraits<_class> \
{ \
static inline JSClass* \
GetJSClass() \
{ \
using namespace mozilla::dom; \
return _class##Binding_workers::Class.ToJSClass(); \
} \
\
static inline JSObject* \
GetProtoObject(JSContext* aCx, JSObject* aGlobal) \
{ \
using namespace mozilla::dom; \
return _class##Binding_workers::GetProtoObject(aCx, aGlobal); \
} \
};
SPECIALIZE_PROTO_TRAITS(FileReaderSync)
SPECIALIZE_PROTO_TRAITS(XMLHttpRequest)
SPECIALIZE_PROTO_TRAITS(XMLHttpRequestUpload)
#undef SPECIALIZE_PROTO_TRAITS
} // anonymous namespace
template <class T>
inline JSObject*
Wrap(JSContext* aCx, JSObject* aGlobal, nsRefPtr<T>& aConcreteObject)
{
MOZ_ASSERT(aCx);
if (!aGlobal) {
aGlobal = JS_GetGlobalForScopeChain(aCx);
if (!aGlobal) {
return NULL;
}
}
JSObject* proto = WrapPrototypeTraits<T>::GetProtoObject(aCx, aGlobal);
if (!proto) {
return NULL;
}
JSObject* wrapper =
JS_NewObject(aCx, WrapPrototypeTraits<T>::GetJSClass(), proto, aGlobal);
if (!wrapper) {
return NULL;
}
js::SetReservedSlot(wrapper, DOM_OBJECT_SLOT,
PRIVATE_TO_JSVAL(aConcreteObject));
aConcreteObject->SetIsDOMBinding();
aConcreteObject->SetWrapper(wrapper);
NS_ADDREF(aConcreteObject.get());
return wrapper;
}
END_WORKERS_NAMESPACE
#endif // mozilla_dom_workers_dombindinginlines_h__