summaryrefslogtreecommitdiffstats
path: root/dom/bindings/ToJSValue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/bindings/ToJSValue.cpp')
-rw-r--r--dom/bindings/ToJSValue.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/dom/bindings/ToJSValue.cpp b/dom/bindings/ToJSValue.cpp
new file mode 100644
index 000000000..d84428fb3
--- /dev/null
+++ b/dom/bindings/ToJSValue.cpp
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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/. */
+
+#include "mozilla/dom/ToJSValue.h"
+#include "mozilla/dom/DOMException.h"
+#include "mozilla/dom/Exceptions.h"
+#ifdef SPIDERMONKEY_PROMISE
+#include "mozilla/dom/Promise.h"
+#endif // SPIDERMONKEY_PROMISE
+#include "nsAString.h"
+#include "nsContentUtils.h"
+#include "nsStringBuffer.h"
+#include "xpcpublic.h"
+
+namespace mozilla {
+namespace dom {
+
+bool
+ToJSValue(JSContext* aCx, const nsAString& aArgument,
+ JS::MutableHandle<JS::Value> aValue)
+{
+ // Make sure we're called in a compartment
+ MOZ_ASSERT(JS::CurrentGlobalOrNull(aCx));
+
+// XXXkhuey I'd love to use xpc::NonVoidStringToJsval here, but it requires
+ // a non-const nsAString for silly reasons.
+ nsStringBuffer* sharedBuffer;
+ if (!XPCStringConvert::ReadableToJSVal(aCx, aArgument, &sharedBuffer,
+ aValue)) {
+ return false;
+ }
+
+ if (sharedBuffer) {
+ NS_ADDREF(sharedBuffer);
+ }
+
+ return true;
+}
+
+
+bool
+ToJSValue(JSContext* aCx,
+ nsresult aArgument,
+ JS::MutableHandle<JS::Value> aValue)
+{
+ RefPtr<Exception> exception = CreateException(aCx, aArgument);
+ return ToJSValue(aCx, exception, aValue);
+}
+
+bool
+ToJSValue(JSContext* aCx,
+ ErrorResult& aArgument,
+ JS::MutableHandle<JS::Value> aValue)
+{
+ MOZ_ASSERT(aArgument.Failed());
+ MOZ_ASSERT(!aArgument.IsUncatchableException(),
+ "Doesn't make sense to convert uncatchable exception to a JS value!");
+ DebugOnly<bool> throwResult = aArgument.MaybeSetPendingException(aCx);
+ MOZ_ASSERT(throwResult);
+ DebugOnly<bool> getPendingResult = JS_GetPendingException(aCx, aValue);
+ MOZ_ASSERT(getPendingResult);
+ JS_ClearPendingException(aCx);
+ return true;
+}
+
+#ifdef SPIDERMONKEY_PROMISE
+bool
+ToJSValue(JSContext* aCx, Promise& aArgument,
+ JS::MutableHandle<JS::Value> aValue)
+{
+ aValue.setObject(*aArgument.PromiseObj());
+ return true;
+}
+#endif // SPIDERMONKEY_PROMISE
+
+} // namespace dom
+} // namespace mozilla