Bug 1503006 - Part 8: Move implementation of public Stream API functions from jsapi.cpp to builtin/Stream.cpp. r=tcampbell

Depends on D10432

Differential Revision: https://phabricator.services.mozilla.com/D10433

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Jason Orendorff 2018-11-02 21:07:34 +00:00
parent 61ace3d5c1
commit 387184986d
2 changed files with 367 additions and 374 deletions

View File

@ -4361,3 +4361,370 @@ js::UnwrapReadableStream(JSObject* obj)
}
return nullptr;
}
extern JS_PUBLIC_API(void)
JS::SetReadableStreamCallbacks(JSContext* cx,
JS::RequestReadableStreamDataCallback dataRequestCallback,
JS::WriteIntoReadRequestBufferCallback writeIntoReadRequestCallback,
JS::CancelReadableStreamCallback cancelCallback,
JS::ReadableStreamClosedCallback closedCallback,
JS::ReadableStreamErroredCallback erroredCallback,
JS::ReadableStreamFinalizeCallback finalizeCallback)
{
MOZ_ASSERT(dataRequestCallback);
MOZ_ASSERT(writeIntoReadRequestCallback);
MOZ_ASSERT(cancelCallback);
MOZ_ASSERT(closedCallback);
MOZ_ASSERT(erroredCallback);
MOZ_ASSERT(finalizeCallback);
JSRuntime* rt = cx->runtime();
MOZ_ASSERT(!rt->readableStreamDataRequestCallback);
MOZ_ASSERT(!rt->readableStreamWriteIntoReadRequestCallback);
MOZ_ASSERT(!rt->readableStreamCancelCallback);
MOZ_ASSERT(!rt->readableStreamClosedCallback);
MOZ_ASSERT(!rt->readableStreamErroredCallback);
MOZ_ASSERT(!rt->readableStreamFinalizeCallback);
rt->readableStreamDataRequestCallback = dataRequestCallback;
rt->readableStreamWriteIntoReadRequestCallback = writeIntoReadRequestCallback;
rt->readableStreamCancelCallback = cancelCallback;
rt->readableStreamClosedCallback = closedCallback;
rt->readableStreamErroredCallback = erroredCallback;
rt->readableStreamFinalizeCallback = finalizeCallback;
}
JS_PUBLIC_API(bool)
JS::HasReadableStreamCallbacks(JSContext* cx)
{
return cx->runtime()->readableStreamDataRequestCallback;
}
JS_PUBLIC_API(JSObject*)
JS::NewReadableDefaultStreamObject(JSContext* cx,
JS::HandleObject underlyingSource /* = nullptr */,
JS::HandleFunction size /* = nullptr */,
double highWaterMark /* = 1 */,
JS::HandleObject proto /* = nullptr */)
{
MOZ_ASSERT(!cx->zone()->isAtomsZone());
AssertHeapIsIdle();
CHECK_THREAD(cx);
RootedObject source(cx, underlyingSource);
if (!source) {
source = NewBuiltinClassInstance<PlainObject>(cx);
if (!source)
return nullptr;
}
RootedValue sourceVal(cx, ObjectValue(*source));
RootedValue sizeVal(cx, size ? ObjectValue(*size) : UndefinedValue());
RootedValue highWaterMarkVal(cx, NumberValue(highWaterMark));
return ReadableStream::createDefaultStream(cx, sourceVal, sizeVal, highWaterMarkVal, proto);
}
JS_PUBLIC_API(JSObject*)
JS::NewReadableExternalSourceStreamObject(JSContext* cx, void* underlyingSource,
uint8_t flags /* = 0 */,
HandleObject proto /* = nullptr */)
{
MOZ_ASSERT(!cx->zone()->isAtomsZone());
AssertHeapIsIdle();
CHECK_THREAD(cx);
MOZ_ASSERT((uintptr_t(underlyingSource) & 1) == 0,
"external underlying source pointers must be aligned");
#ifdef DEBUG
JSRuntime* rt = cx->runtime();
MOZ_ASSERT(rt->readableStreamDataRequestCallback);
MOZ_ASSERT(rt->readableStreamWriteIntoReadRequestCallback);
MOZ_ASSERT(rt->readableStreamCancelCallback);
MOZ_ASSERT(rt->readableStreamClosedCallback);
MOZ_ASSERT(rt->readableStreamErroredCallback);
MOZ_ASSERT(rt->readableStreamFinalizeCallback);
#endif // DEBUG
return ReadableStream::createExternalSourceStream(cx, underlyingSource, flags, proto);
}
JS_PUBLIC_API(bool)
JS::IsReadableStream(JSObject* obj)
{
return obj->canUnwrapAs<ReadableStream>();
}
JS_PUBLIC_API(bool)
JS::IsReadableStreamReader(JSObject* obj)
{
return obj->canUnwrapAs<ReadableStreamDefaultReader>();
}
JS_PUBLIC_API(bool)
JS::IsReadableStreamDefaultReader(JSObject* obj)
{
return obj->canUnwrapAs<ReadableStreamDefaultReader>();
}
template<class T>
static MOZ_MUST_USE T*
APIToUnwrapped(JSContext* cx, JSObject* obj)
{
cx->check(obj);
return ToUnwrapped<T>(cx, obj);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamIsReadable(JSContext* cx, HandleObject streamObj, bool* result)
{
ReadableStream* stream = APIToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*result = stream->readable();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamIsLocked(JSContext* cx, HandleObject streamObj, bool* result)
{
ReadableStream* stream = APIToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*result = stream->locked();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamIsDisturbed(JSContext* cx, HandleObject streamObj, bool* result)
{
ReadableStream* stream = APIToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*result = stream->disturbed();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamGetEmbeddingFlags(JSContext* cx, HandleObject streamObj, uint8_t* flags)
{
ReadableStream* stream = APIToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*flags = stream->embeddingFlags();
return true;
}
JS_PUBLIC_API(JSObject*)
JS::ReadableStreamCancel(JSContext* cx, HandleObject streamObj, HandleValue reason)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
cx->check(reason);
Rooted<ReadableStream*> stream(cx, APIToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return nullptr;
return ReadableStream::cancel(cx, stream, reason);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamGetMode(JSContext* cx, HandleObject streamObj, JS::ReadableStreamMode* mode)
{
ReadableStream* stream = APIToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*mode = stream->mode();
return true;
}
JS_PUBLIC_API(JSObject*)
JS::ReadableStreamGetReader(JSContext* cx, HandleObject streamObj, ReadableStreamReaderMode mode)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, APIToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return nullptr;
JSObject* result = ReadableStream::getReader(cx, stream, mode);
MOZ_ASSERT_IF(result, IsObjectInContextCompartment(result, cx));
return result;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamGetExternalUnderlyingSource(JSContext* cx, HandleObject streamObj, void** source)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, APIToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
return ReadableStream::getExternalSource(cx, stream, source);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamReleaseExternalUnderlyingSource(JSContext* cx, HandleObject streamObj)
{
ReadableStream* stream = APIToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
stream->releaseExternalSource();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamUpdateDataAvailableFromSource(JSContext* cx, JS::HandleObject streamObj,
uint32_t availableData)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, APIToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
return ReadableStream::updateDataAvailableFromSource(cx, stream, availableData);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamTee(JSContext* cx, HandleObject streamObj,
MutableHandleObject branch1Obj, MutableHandleObject branch2Obj)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, APIToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
Rooted<ReadableStream*> branch1Stream(cx);
Rooted<ReadableStream*> branch2Stream(cx);
if (!ReadableStream::tee(cx, stream, false, &branch1Stream, &branch2Stream)) {
return false;
}
branch1Obj.set(branch1Stream);
branch2Obj.set(branch2Stream);
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamGetDesiredSize(JSContext* cx, JSObject* streamObj, bool* hasValue, double* value)
{
ReadableStream* stream = APIToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
stream->desiredSize(hasValue, value);
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamClose(JSContext* cx, HandleObject streamObj)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, APIToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
return ReadableStream::close(cx, stream);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamEnqueue(JSContext* cx, HandleObject streamObj, HandleValue chunk)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
cx->check(chunk);
Rooted<ReadableStream*> stream(cx, APIToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
if (stream->mode() != JS::ReadableStreamMode::Default) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
JSMSG_READABLESTREAM_NOT_DEFAULT_CONTROLLER,
"JS::ReadableStreamEnqueue");
return false;
}
return ReadableStream::enqueue(cx, stream, chunk);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamError(JSContext* cx, HandleObject streamObj, HandleValue error)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
cx->check(error);
Rooted<ReadableStream*> stream(cx, APIToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
return js::ReadableStream::error(cx, stream, error);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamReaderIsClosed(JSContext* cx, HandleObject readerObj, bool* result)
{
Rooted<ReadableStreamReader*> reader(cx, APIToUnwrapped<ReadableStreamReader>(cx, readerObj));
if (!reader)
return false;
*result = reader->isClosed();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamReaderCancel(JSContext* cx, HandleObject readerObj, HandleValue reason)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
cx->check(reason);
RootedNativeObject reader(cx, APIToUnwrapped<NativeObject>(cx, readerObj));
if (!reader)
return false;
return js::ReadableStreamReaderCancel(cx, reader, reason);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamReaderReleaseLock(JSContext* cx, HandleObject readerObj)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
RootedNativeObject reader(cx, APIToUnwrapped<NativeObject>(cx, readerObj));
if (!reader)
return false;
return js::ReadableStreamReaderReleaseLock(cx, reader);
}
JS_PUBLIC_API(JSObject*)
JS::ReadableStreamDefaultReaderRead(JSContext* cx, HandleObject readerObj)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStreamDefaultReader*> reader(cx);
reader = APIToUnwrapped<ReadableStreamDefaultReader>(cx, readerObj);
if (!reader)
return nullptr;
return js::ReadableStreamDefaultReader::read(cx, reader);
}

View File

@ -4628,380 +4628,6 @@ JS::GetWaitForAllPromise(JSContext* cx, const JS::AutoObjectVector& promises)
return js::GetWaitForAllPromise(cx, promises);
}
extern JS_PUBLIC_API(void)
JS::SetReadableStreamCallbacks(JSContext* cx,
JS::RequestReadableStreamDataCallback dataRequestCallback,
JS::WriteIntoReadRequestBufferCallback writeIntoReadRequestCallback,
JS::CancelReadableStreamCallback cancelCallback,
JS::ReadableStreamClosedCallback closedCallback,
JS::ReadableStreamErroredCallback erroredCallback,
JS::ReadableStreamFinalizeCallback finalizeCallback)
{
MOZ_ASSERT(dataRequestCallback);
MOZ_ASSERT(writeIntoReadRequestCallback);
MOZ_ASSERT(cancelCallback);
MOZ_ASSERT(closedCallback);
MOZ_ASSERT(erroredCallback);
MOZ_ASSERT(finalizeCallback);
JSRuntime* rt = cx->runtime();
MOZ_ASSERT(!rt->readableStreamDataRequestCallback);
MOZ_ASSERT(!rt->readableStreamWriteIntoReadRequestCallback);
MOZ_ASSERT(!rt->readableStreamCancelCallback);
MOZ_ASSERT(!rt->readableStreamClosedCallback);
MOZ_ASSERT(!rt->readableStreamErroredCallback);
MOZ_ASSERT(!rt->readableStreamFinalizeCallback);
rt->readableStreamDataRequestCallback = dataRequestCallback;
rt->readableStreamWriteIntoReadRequestCallback = writeIntoReadRequestCallback;
rt->readableStreamCancelCallback = cancelCallback;
rt->readableStreamClosedCallback = closedCallback;
rt->readableStreamErroredCallback = erroredCallback;
rt->readableStreamFinalizeCallback = finalizeCallback;
}
JS_PUBLIC_API(bool)
JS::HasReadableStreamCallbacks(JSContext* cx)
{
return cx->runtime()->readableStreamDataRequestCallback;
}
JS_PUBLIC_API(JSObject*)
JS::NewReadableDefaultStreamObject(JSContext* cx,
JS::HandleObject underlyingSource /* = nullptr */,
JS::HandleFunction size /* = nullptr */,
double highWaterMark /* = 1 */,
JS::HandleObject proto /* = nullptr */)
{
MOZ_ASSERT(!cx->zone()->isAtomsZone());
AssertHeapIsIdle();
CHECK_THREAD(cx);
RootedObject source(cx, underlyingSource);
if (!source) {
source = NewBuiltinClassInstance<PlainObject>(cx);
if (!source)
return nullptr;
}
RootedValue sourceVal(cx, ObjectValue(*source));
RootedValue sizeVal(cx, size ? ObjectValue(*size) : UndefinedValue());
RootedValue highWaterMarkVal(cx, NumberValue(highWaterMark));
return ReadableStream::createDefaultStream(cx, sourceVal, sizeVal, highWaterMarkVal, proto);
}
JS_PUBLIC_API(JSObject*)
JS::NewReadableExternalSourceStreamObject(JSContext* cx, void* underlyingSource,
uint8_t flags /* = 0 */,
HandleObject proto /* = nullptr */)
{
MOZ_ASSERT(!cx->zone()->isAtomsZone());
AssertHeapIsIdle();
CHECK_THREAD(cx);
MOZ_ASSERT((uintptr_t(underlyingSource) & 1) == 0,
"external underlying source pointers must be aligned");
#ifdef DEBUG
JSRuntime* rt = cx->runtime();
MOZ_ASSERT(rt->readableStreamDataRequestCallback);
MOZ_ASSERT(rt->readableStreamWriteIntoReadRequestCallback);
MOZ_ASSERT(rt->readableStreamCancelCallback);
MOZ_ASSERT(rt->readableStreamClosedCallback);
MOZ_ASSERT(rt->readableStreamErroredCallback);
MOZ_ASSERT(rt->readableStreamFinalizeCallback);
#endif // DEBUG
return ReadableStream::createExternalSourceStream(cx, underlyingSource, flags, proto);
}
JS_PUBLIC_API(bool)
JS::IsReadableStream(JSObject* obj)
{
return obj->canUnwrapAs<ReadableStream>();
}
JS_PUBLIC_API(bool)
JS::IsReadableStreamReader(JSObject* obj)
{
return obj->canUnwrapAs<ReadableStreamDefaultReader>();
}
JS_PUBLIC_API(bool)
JS::IsReadableStreamDefaultReader(JSObject* obj)
{
return obj->canUnwrapAs<ReadableStreamDefaultReader>();
}
template<class T>
static MOZ_MUST_USE T*
ToUnwrapped(JSContext* cx, JSObject* obj)
{
cx->check(obj);
if (IsWrapper(obj)) {
obj = CheckedUnwrap(obj);
if (!obj) {
ReportAccessDenied(cx);
return nullptr;
}
}
return &obj->as<T>();
}
JS_PUBLIC_API(bool)
JS::ReadableStreamIsReadable(JSContext* cx, HandleObject streamObj, bool* result)
{
ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*result = stream->readable();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamIsLocked(JSContext* cx, HandleObject streamObj, bool* result)
{
ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*result = stream->locked();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamIsDisturbed(JSContext* cx, HandleObject streamObj, bool* result)
{
ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*result = stream->disturbed();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamGetEmbeddingFlags(JSContext* cx, HandleObject streamObj, uint8_t* flags)
{
ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*flags = stream->embeddingFlags();
return true;
}
JS_PUBLIC_API(JSObject*)
JS::ReadableStreamCancel(JSContext* cx, HandleObject streamObj, HandleValue reason)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
cx->check(reason);
Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return nullptr;
return ReadableStream::cancel(cx, stream, reason);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamGetMode(JSContext* cx, HandleObject streamObj, JS::ReadableStreamMode* mode)
{
ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
*mode = stream->mode();
return true;
}
JS_PUBLIC_API(JSObject*)
JS::ReadableStreamGetReader(JSContext* cx, HandleObject streamObj, ReadableStreamReaderMode mode)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return nullptr;
JSObject* result = ReadableStream::getReader(cx, stream, mode);
MOZ_ASSERT_IF(result, IsObjectInContextCompartment(result, cx));
return result;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamGetExternalUnderlyingSource(JSContext* cx, HandleObject streamObj, void** source)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
return ReadableStream::getExternalSource(cx, stream, source);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamReleaseExternalUnderlyingSource(JSContext* cx, HandleObject streamObj)
{
ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
stream->releaseExternalSource();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamUpdateDataAvailableFromSource(JSContext* cx, JS::HandleObject streamObj,
uint32_t availableData)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
return ReadableStream::updateDataAvailableFromSource(cx, stream, availableData);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamTee(JSContext* cx, HandleObject streamObj,
MutableHandleObject branch1Obj, MutableHandleObject branch2Obj)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
Rooted<ReadableStream*> branch1Stream(cx);
Rooted<ReadableStream*> branch2Stream(cx);
if (!ReadableStream::tee(cx, stream, false, &branch1Stream, &branch2Stream)) {
return false;
}
branch1Obj.set(branch1Stream);
branch2Obj.set(branch2Stream);
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamGetDesiredSize(JSContext* cx, JSObject* streamObj, bool* hasValue, double* value)
{
ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
if (!stream)
return false;
stream->desiredSize(hasValue, value);
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamClose(JSContext* cx, HandleObject streamObj)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
return ReadableStream::close(cx, stream);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamEnqueue(JSContext* cx, HandleObject streamObj, HandleValue chunk)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
cx->check(chunk);
Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
if (stream->mode() != JS::ReadableStreamMode::Default) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
JSMSG_READABLESTREAM_NOT_DEFAULT_CONTROLLER,
"JS::ReadableStreamEnqueue");
return false;
}
return ReadableStream::enqueue(cx, stream, chunk);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamError(JSContext* cx, HandleObject streamObj, HandleValue error)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
cx->check(error);
Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
if (!stream)
return false;
return js::ReadableStream::error(cx, stream, error);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamReaderIsClosed(JSContext* cx, HandleObject readerObj, bool* result)
{
Rooted<ReadableStreamReader*> reader(cx, ToUnwrapped<ReadableStreamReader>(cx, readerObj));
if (!reader)
return false;
*result = reader->isClosed();
return true;
}
JS_PUBLIC_API(bool)
JS::ReadableStreamReaderCancel(JSContext* cx, HandleObject readerObj, HandleValue reason)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
cx->check(reason);
RootedNativeObject reader(cx, ToUnwrapped<NativeObject>(cx, readerObj));
if (!reader)
return false;
return js::ReadableStreamReaderCancel(cx, reader, reason);
}
JS_PUBLIC_API(bool)
JS::ReadableStreamReaderReleaseLock(JSContext* cx, HandleObject readerObj)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
RootedNativeObject reader(cx, ToUnwrapped<NativeObject>(cx, readerObj));
if (!reader)
return false;
return js::ReadableStreamReaderReleaseLock(cx, reader);
}
JS_PUBLIC_API(JSObject*)
JS::ReadableStreamDefaultReaderRead(JSContext* cx, HandleObject readerObj)
{
AssertHeapIsIdle();
CHECK_THREAD(cx);
Rooted<ReadableStreamDefaultReader*> reader(cx);
reader = ToUnwrapped<ReadableStreamDefaultReader>(cx, readerObj);
if (!reader)
return nullptr;
return js::ReadableStreamDefaultReader::read(cx, reader);
}
JS_PUBLIC_API(void)
JS::InitDispatchToEventLoop(JSContext* cx, JS::DispatchToEventLoopCallback callback, void* closure)
{