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 /js/src/jsapi-tests/testArrayBufferOrViewAPI.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 'js/src/jsapi-tests/testArrayBufferOrViewAPI.cpp')
-rw-r--r-- | js/src/jsapi-tests/testArrayBufferOrViewAPI.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/js/src/jsapi-tests/testArrayBufferOrViewAPI.cpp b/js/src/jsapi-tests/testArrayBufferOrViewAPI.cpp new file mode 100644 index 0000000000..6b9189af04 --- /dev/null +++ b/js/src/jsapi-tests/testArrayBufferOrViewAPI.cpp @@ -0,0 +1,111 @@ +/* -*- 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 <type_traits> + +#include "jsfriendapi.h" + +#include "js/ArrayBuffer.h" // JS::NewArrayBuffer +#include "js/experimental/TypedData.h" +#include "js/ScalarType.h" // JS::Scalar::Type +#include "jsapi-tests/tests.h" + +#include "vm/Realm-inl.h" + +using namespace js; + +template <class ViewType> +static JSObject* CreateObj(JSContext* cx, size_t len) { + return ViewType::create(cx, len).asObject(); +} + +template <> +JSObject* CreateObj<JS::DataView>(JSContext* cx, size_t len) { + JS::Rooted<JSObject*> buffer(cx, JS::NewArrayBuffer(cx, len)); + if (!buffer) { + return nullptr; + } + return JS_NewDataView(cx, buffer, 0, len); +} + +BEGIN_TEST(testArrayBufferOrView_type) { + JS::RealmOptions options; + JS::RootedObject otherGlobal( + cx, JS_NewGlobalObject(cx, basicGlobalClass(), nullptr, + JS::DontFireOnNewGlobalHook, options)); + CHECK(otherGlobal); + + CHECK((TestType<JS::TypedArray<Scalar::Uint8>>(cx, otherGlobal))); + CHECK((TestType<JS::TypedArray<Scalar::Int8>>(cx, otherGlobal))); + CHECK((TestType<JS::TypedArray<Scalar::Uint8Clamped>>(cx, otherGlobal))); + CHECK((TestType<JS::TypedArray<Scalar::Uint16>>(cx, otherGlobal))); + CHECK((TestType<JS::TypedArray<Scalar::Int16>>(cx, otherGlobal))); + CHECK((TestType<JS::TypedArray<Scalar::Uint32>>(cx, otherGlobal))); + CHECK((TestType<JS::TypedArray<Scalar::Int32>>(cx, otherGlobal))); + CHECK((TestType<JS::TypedArray<Scalar::Float32>>(cx, otherGlobal))); + CHECK((TestType<JS::TypedArray<Scalar::Float64>>(cx, otherGlobal))); + CHECK((TestType<JS::DataView>(cx, otherGlobal))); + CHECK((TestType<JS::ArrayBuffer>(cx, otherGlobal))); + + return true; +} + +template <class APIType> +bool TestType(JSContext* cx, Handle<JSObject*> otherGlobal) { + JS::Rooted<JSObject*> obj(cx, CreateObj<APIType>(cx, 8)); + CHECK(obj); + + // Any of these should be creatable as an ArrayBufferOrView. + JS::Rooted<JS::ArrayBufferOrView> abov( + cx, JS::ArrayBufferOrView::fromObject(obj)); + CHECK(abov); + + // And that should allow unwrapping as well. + abov = JS::ArrayBufferOrView::unwrap(obj); + CHECK(abov); + + if constexpr (!std::is_same_v<APIType, JS::Uint16Array>) { + // Check that we can't make an API object of a different type. + JS::Rooted<JS::Uint16Array> nope(cx, JS::Uint16Array::unwrap(obj)); + CHECK(!nope); + + // And that we can't make an API object from an object of a different type. + JS::Rooted<JSObject*> u16array(cx, CreateObj<JS::Uint16Array>(cx, 10)); + CHECK(u16array); + auto deny = APIType::fromObject(u16array); + CHECK(!deny); + deny = APIType::unwrap(u16array); + CHECK(!deny); + } + + CHECK_EQUAL(abov.asObject(), obj); + + JS::Rooted<JSObject*> wrapped(cx); + { + AutoRealm ar(cx, otherGlobal); + wrapped = CreateObj<APIType>(cx, 8); // Not wrapped yet! + CHECK(wrapped); + } + CHECK(wrapped->compartment() == otherGlobal->compartment()); + CHECK(JS_WrapObject(cx, &wrapped)); // Now it's wrapped. + CHECK(wrapped->compartment() == global->compartment()); + + abov = JS::ArrayBufferOrView::fromObject(wrapped); + CHECK(!abov); + abov = JS::ArrayBufferOrView::unwrap(wrapped); + CHECK(abov); + + JS::Rooted<APIType> dummy(cx, APIType::fromObject(obj)); + CHECK(obj); + CHECK(dummy); + CHECK(dummy.asObject()); + + return true; +} + +END_TEST(testArrayBufferOrView_type) |