Files
palemoon27/dom/workers/FileReaderSync.cpp
T
roytam1 5a5b052a7c import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 930218 part 1. Factor out the computation of block-size taken up by box-sizing into a separate function so we can reuse it. r=dbaron (22033f4184)
- Bug 930218 part 2. Account for the parent's box-sizing whe figuring out the percentage height of a kid with an intrinsic ratio for purposes of determining the parent's shrink-wrap width. r=dbaron (041711f58f)
- Bug 1235306 - Fix -Wimplicit-fallthrough warnings in layout/. r=dholbert (581c212254)
- Bug 1074971 - Add support for reserved commandkey combinations that can't be handled by content (e10s-only feature). r=smaug (e43d39dcef)
- Bug 1186799 part.1 nsHTMLEditorEventListener should commit composition when it receives unacceptable mousedown event r=smaug (17f2c48e96)
- Bug 1230216 - Changing nsIDOM*Event interfaces so that they don't inherit nsIDOMEvent. r=smaug (df77f91ecc)
- fix cancelBubble situation and align to gecko (bc133dc50a)
- Bug 1211402. Re-enable the upload step, but take out the stuff that no longer works (as in, everything.) r=me (cb7abd67d2)
- align (bac4aec6cc)
- Bug 1243608: P1. Only use video time if video frame contains seek target. r=cpearce (21d9e988ed)
- Bug 1244477: Offset seek time by start time. r=jwwang (743c24b2f7)
- Bug 1243608: P2. Pass the full SeekTarget object to MediaDecoderReader::Seek. r=cpearce (6ff30b4b65)
- Bug 1243608: P3. Make SeekTarget::mTime a TimeUnit object. r=cpearce (357d9864de)
- Bug 1243608: P4. Have MediaDecoderReader::SeekPromise return a TimeUnit. r=cpearce (53b476c62d)
- Bug 1159343: Interrupt seek early when possible. r=jwwang (9e26e69593)
- Bug 1243608: P5. Add type utility methods to SeekTarget class. r=cpearce (8e740bab50)
- Bug 1243608: P6. Only seek audio to video seek time when performing a fast seek. r=cpearce (d2a51a71f0)
- Bug 1233650. Part 1 - extract OutputStreamManager to its own file. r=roc. (52d533f923)
- Bug 1230882. Part 2 - remove DecodedStream::BeginShutdown() and other unused code. r=roc. (b2820b8f14)
- Bug 1231091. Part 1 - Add mVideoCompleted so MDSM can check when audio/video is done rendering. This removes the only caller of DecodedStream::IsFinished(). r=roc. (536f63e385)
- Bug 1146086: Properly marking overridden member with override keyword. v2. a=bustage (b6ed1b4e6c)
- Bug 1177243 - Use PodZero rather than memset in WebM decoders. r=rillian (f9853b72ee)
- Bug 1230054: Remove unused WebMReader. r=kinetik (1f88fe3c43)
- Bug 1230054: Add missing headers ON A CLOSED TREE. r=me (6e33accf03)
- Bug 1231091. Part 2 - return correct promises when audio/video track is asked. r=roc. (aef6342e59)
- Bug 1231091. Part 3 - resolve the end promise when all frames are rendered. r=roc. (bbb180dd90)
- Bug 1231091. Part 4 - ensure the end promise is resolved in the special case where video duration is 0. r=roc. (7835c31e75)
- Bug 1231091. Part 5 - Remove DecodedStream::IsFinished() and unused code. r=roc. (6dd02e5d6b)
- Bug 1231091. Part 6 - fix test_streams_element_capture.html timeout. r=roc. (8aae5c09cc)
- Bug 1232520 - dont' invoke AbstractThread::MainThread()->Dispatch() to avoid reentrant of AutoTaskDispatcher during tail dispatching phase. r=jya. (5434d0f370)
- Bug 1233650. Part 2 - make OutputStreamManager ref-counted so it can be shared between MDSM and DecodedStream. r=roc. (93e7d0e065)
- Bug 1233650. Part 3 - move creation of OutputStreamManager from DecodedStream to MDSM. r=roc. (a469dbcc9f)
- Bug 1233650. Part 4 - remove unused functions from DecodedStream. r=roc. (ec8753365e)
- Bug 1248314. Part 1 - Since OutputStreamManager::Connect/Disconnect is tightly coupled with the constructor/destructor of DecodedStreamData, it would improve cohesion to let DecodedStreamData manage an OutputStreamManager and know when to call OutputStreamManager::Connect/Disconnect. r=roc. (467d1472ca)
- Bug 1234424. Part 1 - share the underlying value of MDSM::mSameOriginMedia with DecodedStream. r=roc. (ff0abefb26)
- Bug 1234424. Part 2 - remove unused code. r=roc. (5a8266779b)
- Bug 1248314. part 2 - move track initialization code into the constructor of DecodedStreamData. r=roc. (4d57f47654)
- Bug 1248229. Part 1 - add test case to test if playback can work correctly after GC. r=roc. (83c81dc7cc)
- Bug 1248229. Part 2 - GC might happen in between OutputStreamManager::Disconnect() and OutputStreamManager::Connect(). We need to check if the stream is already destroyed before trying to connect it. r=roc. (c5a0ed670c)
- remove PM leftover (ed9ce00aad)
- Bug 1236703: P1. Add debugging information for MSE to about:media plugin. r=kentuckyfriedtakahe (4385a86197)
- Bug 1236703: P2. Add methods to retrieve debugging data on plain readers. r=jwwang (34bf637124)
- Bug 1236703: P3. Add moz specific method to retrieve debug data to media object IDL. r=bz (65c95eff74)
- Bug 1194721: Add additional PDU pack and unpack functions, r=shuang (d6ae416a10)
- Bug 1261307: Convert Unix socket IPC code to |UniquePtr|, r=nfroyd (cd797f4581)
- Bug 1236574 - use UniquePtr<T[]> instead of nsAutoArrayPtr<T> in SocketBase subclasses; r=tzimmerman (6a20e9e905)
- Bug 1239207 - Don't process IPDL when not compiling; r=glandium (20ba7fb311)
- Bug 1210099 - Use diagnostic assert for union discriminator checks (r=jld) (74844eee1b)
- Bug 1208226 - Don't crash when failing to map a segment of shared memory. r=sotaro, billm (1822a634d9)
- Bug 1236635 - Fix compile error in IPC unit tests (r=jld) (c82e0bfe61)
- Bug 1263429 - Don't build libevent with sysctl on Linux. r=billm (00f248f61e)
- Bug 1304266 - Remove libevent workaround for MacOS 10.4 bug (r=dvander) a=jcristau (676758a926)
- Bug 1241776 - turn ENABLE_SHARED_ARRAY_BUFFER on for all channels. r=nbp (dc53fff545)
- Bug 1248851 part 1 - Explicitly mark some release() calls result-unused. r=Waldo (b377e3d86e)
- Bug 1246697 - Use simpler semantics for PersistentRooted<Traceable>; r=sfink (7afab5c807)
- bug 1225649 use CreatePlanarYCbCrImage() now that CreateImage() is gone r=dvander (b8a30f3d84)
- Bug 1234092: P1. Remove GStreamer support. r=kentuckyfriedtakahe (bf6a5d8811)
- Bug 1234092: P2. Remove GStreamer check from configure. r=glandium (73b69b41db)
- remove configure options (f9585af0d1)
- Bug 1168309 - Add the define, MOZ_GONK_MEDIACODEC, to dom/media. r=cpearce. (a4481af932)
- Bug 1240616 - mach mochitest-run suggests deprecated commands as an alternative r=cmanchester (17687db974)
- Bug 1249838 - Avoid dependency from the mozconfig loader on mach. r=gps (a88506c027)
- Bug 382721 - Part 0: Add missing includes and namespaces. r=jrmuizel (eecf253c5e)
2023-10-26 14:38:19 +08:00

266 lines
7.5 KiB
C++

/* -*- 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 "FileReaderSync.h"
#include "jsfriendapi.h"
#include "mozilla/unused.h"
#include "mozilla/Base64.h"
#include "mozilla/dom/EncodingUtils.h"
#include "mozilla/dom/File.h"
#include "nsContentUtils.h"
#include "mozilla/dom/FileReaderSyncBinding.h"
#include "nsCExternalHandlerService.h"
#include "nsComponentManagerUtils.h"
#include "nsCOMPtr.h"
#include "nsDOMClassInfoID.h"
#include "nsError.h"
#include "nsIConverterInputStream.h"
#include "nsIInputStream.h"
#include "nsISeekableStream.h"
#include "nsISupportsImpl.h"
#include "nsNetUtil.h"
#include "nsServiceManagerUtils.h"
#include "RuntimeService.h"
USING_WORKERS_NAMESPACE
using namespace mozilla;
using namespace mozilla::dom;
using mozilla::dom::Optional;
using mozilla::dom::GlobalObject;
// static
already_AddRefed<FileReaderSync>
FileReaderSync::Constructor(const GlobalObject& aGlobal, ErrorResult& aRv)
{
RefPtr<FileReaderSync> frs = new FileReaderSync();
return frs.forget();
}
bool
FileReaderSync::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto,
JS::MutableHandle<JSObject*> aReflector)
{
return FileReaderSyncBinding_workers::Wrap(aCx, this, aGivenProto, aReflector);
}
void
FileReaderSync::ReadAsArrayBuffer(JSContext* aCx,
JS::Handle<JSObject*> aScopeObj,
Blob& aBlob,
JS::MutableHandle<JSObject*> aRetval,
ErrorResult& aRv)
{
uint64_t blobSize = aBlob.GetSize(aRv);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
UniquePtr<char[], JS::FreePolicy> bufferData(js_pod_malloc<char>(blobSize));
if (!bufferData) {
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
return;
}
nsCOMPtr<nsIInputStream> stream;
aBlob.GetInternalStream(getter_AddRefs(stream), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
uint32_t numRead;
aRv = stream->Read(bufferData.get(), blobSize, &numRead);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
NS_ASSERTION(numRead == blobSize, "failed to read data");
JSObject* arrayBuffer = JS_NewArrayBufferWithContents(aCx, blobSize, bufferData.get());
if (!arrayBuffer) {
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
return;
}
// arrayBuffer takes the ownership when it is not null. Otherwise we
// need to release it explicitly.
mozilla::Unused << bufferData.release();
aRetval.set(arrayBuffer);
}
void
FileReaderSync::ReadAsBinaryString(Blob& aBlob,
nsAString& aResult,
ErrorResult& aRv)
{
nsCOMPtr<nsIInputStream> stream;
aBlob.GetInternalStream(getter_AddRefs(stream), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
uint32_t numRead;
do {
char readBuf[4096];
aRv = stream->Read(readBuf, sizeof(readBuf), &numRead);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
uint32_t oldLength = aResult.Length();
AppendASCIItoUTF16(Substring(readBuf, readBuf + numRead), aResult);
if (aResult.Length() - oldLength != numRead) {
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
return;
}
} while (numRead > 0);
}
void
FileReaderSync::ReadAsText(Blob& aBlob,
const Optional<nsAString>& aEncoding,
nsAString& aResult,
ErrorResult& aRv)
{
nsCOMPtr<nsIInputStream> stream;
aBlob.GetInternalStream(getter_AddRefs(stream), aRv);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
nsAutoCString encoding;
unsigned char sniffBuf[3] = { 0, 0, 0 };
uint32_t numRead;
aRv = stream->Read(reinterpret_cast<char*>(sniffBuf),
sizeof(sniffBuf), &numRead);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
// The BOM sniffing is baked into the "decode" part of the Encoding
// Standard, which the File API references.
if (!nsContentUtils::CheckForBOM(sniffBuf, numRead, encoding)) {
// BOM sniffing failed. Try the API argument.
if (!aEncoding.WasPassed() ||
!EncodingUtils::FindEncodingForLabel(aEncoding.Value(),
encoding)) {
// API argument failed. Try the type property of the blob.
nsAutoString type16;
aBlob.GetType(type16);
NS_ConvertUTF16toUTF8 type(type16);
nsAutoCString specifiedCharset;
bool haveCharset;
int32_t charsetStart, charsetEnd;
NS_ExtractCharsetFromContentType(type,
specifiedCharset,
&haveCharset,
&charsetStart,
&charsetEnd);
if (!EncodingUtils::FindEncodingForLabel(specifiedCharset, encoding)) {
// Type property failed. Use UTF-8.
encoding.AssignLiteral("UTF-8");
}
}
}
nsCOMPtr<nsISeekableStream> seekable = do_QueryInterface(stream);
if (!seekable) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
// Seek to 0 because to undo the BOM sniffing advance. UTF-8 and UTF-16
// decoders will swallow the BOM.
aRv = seekable->Seek(nsISeekableStream::NS_SEEK_SET, 0);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
aRv = ConvertStream(stream, encoding.get(), aResult);
if (NS_WARN_IF(aRv.Failed())) {
return;
}
}
void
FileReaderSync::ReadAsDataURL(Blob& aBlob, nsAString& aResult,
ErrorResult& aRv)
{
nsAutoString scratchResult;
scratchResult.AssignLiteral("data:");
nsString contentType;
aBlob.GetType(contentType);
if (contentType.IsEmpty()) {
scratchResult.AppendLiteral("application/octet-stream");
} else {
scratchResult.Append(contentType);
}
scratchResult.AppendLiteral(";base64,");
nsCOMPtr<nsIInputStream> stream;
aBlob.GetInternalStream(getter_AddRefs(stream), aRv);
if (NS_WARN_IF(aRv.Failed())){
return;
}
uint64_t size = aBlob.GetSize(aRv);
if (NS_WARN_IF(aRv.Failed())){
return;
}
nsCOMPtr<nsIInputStream> bufferedStream;
aRv = NS_NewBufferedInputStream(getter_AddRefs(bufferedStream), stream, size);
if (NS_WARN_IF(aRv.Failed())){
return;
}
nsAutoString encodedData;
aRv = Base64EncodeInputStream(bufferedStream, encodedData, size);
if (NS_WARN_IF(aRv.Failed())){
return;
}
scratchResult.Append(encodedData);
aResult = scratchResult;
}
nsresult
FileReaderSync::ConvertStream(nsIInputStream *aStream,
const char *aCharset,
nsAString &aResult)
{
nsCOMPtr<nsIConverterInputStream> converterStream =
do_CreateInstance("@mozilla.org/intl/converter-input-stream;1");
NS_ENSURE_TRUE(converterStream, NS_ERROR_FAILURE);
nsresult rv = converterStream->Init(aStream, aCharset, 8192,
nsIConverterInputStream::DEFAULT_REPLACEMENT_CHARACTER);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIUnicharInputStream> unicharStream =
do_QueryInterface(converterStream);
NS_ENSURE_TRUE(unicharStream, NS_ERROR_FAILURE);
uint32_t numChars;
nsString result;
while (NS_SUCCEEDED(unicharStream->ReadString(8192, result, &numChars)) &&
numChars > 0) {
uint32_t oldLength = aResult.Length();
aResult.Append(result);
if (aResult.Length() - oldLength != result.Length()) {
return NS_ERROR_OUT_OF_MEMORY;
}
}
return rv;
}