diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /toolkit/components/ctypes/ctypes.cpp | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/components/ctypes/ctypes.cpp')
-rw-r--r-- | toolkit/components/ctypes/ctypes.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/toolkit/components/ctypes/ctypes.cpp b/toolkit/components/ctypes/ctypes.cpp new file mode 100644 index 0000000000..623dba1d19 --- /dev/null +++ b/toolkit/components/ctypes/ctypes.cpp @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- + * 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 "ctypes.h" +#include "jsapi.h" +#include "js/experimental/CTypes.h" // JS::CTypesCallbacks, JS::InitCTypesClass, JS::SetCTypesCallbacks +#include "js/MemoryFunctions.h" +#include "js/PropertyAndElement.h" // JS_GetProperty +#include "nsString.h" +#include "nsNativeCharsetUtils.h" +#include "mozJSModuleLoader.h" +#include "xpc_make_class.h" + +namespace mozilla::ctypes { + +static char* UnicodeToNative(JSContext* cx, const char16_t* source, + size_t slen) { + nsAutoCString native; + nsDependentSubstring unicode(source, slen); + nsresult rv = NS_CopyUnicodeToNative(unicode, native); + if (NS_FAILED(rv)) { + JS_ReportErrorASCII(cx, "could not convert string to native charset"); + return nullptr; + } + + char* result = static_cast<char*>(JS_malloc(cx, native.Length() + 1)); + if (!result) { + return nullptr; + } + + memcpy(result, native.get(), native.Length() + 1); + return result; +} + +static JS::CTypesCallbacks sCallbacks = {UnicodeToNative}; + +NS_IMPL_ISUPPORTS(Module, nsIXPCScriptable) + +Module::Module() = default; + +Module::~Module() = default; + +#define XPC_MAP_CLASSNAME Module +#define XPC_MAP_QUOTED_CLASSNAME "Module" +#define XPC_MAP_FLAGS XPC_SCRIPTABLE_WANT_CALL +#include "xpc_map_end.h" + +static bool InitCTypesClassAndSetCallbacks(JSContext* cx, + JS::Handle<JSObject*> global) { + // Init the ctypes object. + if (!JS::InitCTypesClass(cx, global)) { + return false; + } + + // Set callbacks for charset conversion and such. + JS::Rooted<JS::Value> ctypes(cx); + if (!JS_GetProperty(cx, global, "ctypes", &ctypes)) { + return false; + } + + JS::SetCTypesCallbacks(ctypes.toObjectOrNull(), &sCallbacks); + + return true; +} + +NS_IMETHODIMP +Module::Call(nsIXPConnectWrappedNative* wrapper, JSContext* cx, JSObject* obj, + const JS::CallArgs& args, bool* _retval) { + mozJSModuleLoader* loader = mozJSModuleLoader::Get(); + JS::Rooted<JSObject*> targetObj(cx); + loader->FindTargetObject(cx, &targetObj); + + *_retval = InitCTypesClassAndSetCallbacks(cx, targetObj); + return NS_OK; +} + +} // namespace mozilla::ctypes |