gecko/dom/workers/DOMBindingInlines.h
Peter Van der Beken 1780bb4050 Fix for bug 741267 (UserScript's XMLHttpRequest is undefined in 20120401 nightly).
Pass two objects when creating a DOM interface object, the global used to cache
the DOM interface objects and a receiver object on which the named property is
that points to the DOM interface object.

--HG--
extra : rebase_source : b462393e7376fdb68f3b279ccd08b3ab25ac154a
2012-04-23 16:10:56 +02:00

88 lines
3.0 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/bindings/XMLHttpRequestBinding.h"
#include "mozilla/dom/bindings/XMLHttpRequestUploadBinding.h"
BEGIN_WORKERS_NAMESPACE
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::bindings::prototypes; \
return _class##_workers::Class.ToJSClass(); \
} \
\
static inline JSObject* \
GetProtoObject(JSContext* aCx, JSObject* aGlobal) \
{ \
using namespace mozilla::dom::bindings::prototypes; \
return _class##_workers::GetProtoObject(aCx, aGlobal, aGlobal); \
} \
};
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__