diff options
Diffstat (limited to '')
-rw-r--r-- | dom/xhr/XMLHttpRequestString.h | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/dom/xhr/XMLHttpRequestString.h b/dom/xhr/XMLHttpRequestString.h new file mode 100644 index 0000000000..76e072d78b --- /dev/null +++ b/dom/xhr/XMLHttpRequestString.h @@ -0,0 +1,151 @@ +/* -*- 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/. */ + +#ifndef mozilla_dom_XMLHttpRequestString_h +#define mozilla_dom_XMLHttpRequestString_h + +#include "mozilla/Mutex.h" +#include "nsString.h" + +namespace mozilla::dom { + +class ArrayBufferBuilder; +class BlobImpl; +class DOMString; +class XMLHttpRequestStringBuffer; +class XMLHttpRequestStringSnapshot; +class XMLHttpRequestStringWriterHelper; +class XMLHttpRequestStringSnapshotReaderHelper; + +// We want to avoid the dup of strings when XHR in workers has access to +// responseText for events dispatched during the loading state. For this reason +// we use this class, able to create snapshots of the current size of itself +// without making extra copies. +class XMLHttpRequestString final { + friend class XMLHttpRequestStringWriterHelper; + + public: + XMLHttpRequestString(); + ~XMLHttpRequestString(); + + void Truncate(); + + uint32_t Length() const; + + void Append(const nsAString& aString); + + // This method should be called only when the string is really needed because + // it can cause the duplication of the strings in case the loading of the XHR + // is not completed yet. + [[nodiscard]] bool GetAsString(nsAString& aString) const; + + size_t SizeOfThis(MallocSizeOf aMallocSizeOf) const; + + const char16_t* Data() const; + + bool IsEmpty() const; + + void CreateSnapshot(XMLHttpRequestStringSnapshot& aSnapshot); + + private: + XMLHttpRequestString(const XMLHttpRequestString&) = delete; + XMLHttpRequestString& operator=(const XMLHttpRequestString&) = delete; + XMLHttpRequestString& operator=(const XMLHttpRequestString&&) = delete; + + RefPtr<XMLHttpRequestStringBuffer> mBuffer; +}; + +// This class locks the buffer and allows the callee to write data into it. +class MOZ_STACK_CLASS XMLHttpRequestStringWriterHelper final { + public: + explicit XMLHttpRequestStringWriterHelper(XMLHttpRequestString& aString); + ~XMLHttpRequestStringWriterHelper(); + + /** + * The existing length of the string. Do not call during BulkWrite(). + */ + uint32_t Length() const; + + mozilla::Result<mozilla::BulkWriteHandle<char16_t>, nsresult> BulkWrite( + uint32_t aCapacity); + + private: + XMLHttpRequestStringWriterHelper(const XMLHttpRequestStringWriterHelper&) = + delete; + XMLHttpRequestStringWriterHelper& operator=( + const XMLHttpRequestStringWriterHelper&) = delete; + XMLHttpRequestStringWriterHelper& operator=( + const XMLHttpRequestStringWriterHelper&&) = delete; + + RefPtr<XMLHttpRequestStringBuffer> mBuffer; + MutexAutoLock mLock; +}; + +// This class is the internal XMLHttpRequestStringBuffer of the +// XMLHttpRequestString plus the current length. GetAsString will return the +// string with that particular length also if the XMLHttpRequestStringBuffer is +// grown in the meantime. +class XMLHttpRequestStringSnapshot final { + friend class XMLHttpRequestStringBuffer; + friend class XMLHttpRequestStringSnapshotReaderHelper; + + public: + XMLHttpRequestStringSnapshot(); + ~XMLHttpRequestStringSnapshot(); + + XMLHttpRequestStringSnapshot& operator=(const XMLHttpRequestStringSnapshot&) = + delete; + + void Reset() { ResetInternal(false /* isVoid */); } + + void SetVoid() { ResetInternal(true /* isVoid */); } + + bool IsVoid() const { return mVoid; } + + bool IsEmpty() const { return !mLength; } + + [[nodiscard]] bool GetAsString(DOMString& aString) const; + + private: + XMLHttpRequestStringSnapshot(const XMLHttpRequestStringSnapshot&) = delete; + XMLHttpRequestStringSnapshot& operator=( + const XMLHttpRequestStringSnapshot&&) = delete; + + void Set(XMLHttpRequestStringBuffer* aBuffer, uint32_t aLength); + + void ResetInternal(bool aIsVoid); + + RefPtr<XMLHttpRequestStringBuffer> mBuffer; + uint32_t mLength; + bool mVoid; +}; + +// This class locks the buffer and allows the callee to read data from it. +class MOZ_STACK_CLASS XMLHttpRequestStringSnapshotReaderHelper final { + public: + explicit XMLHttpRequestStringSnapshotReaderHelper( + XMLHttpRequestStringSnapshot& aSnapshot); + ~XMLHttpRequestStringSnapshotReaderHelper(); + + const char16_t* Buffer() const; + + uint32_t Length() const; + + private: + XMLHttpRequestStringSnapshotReaderHelper( + const XMLHttpRequestStringSnapshotReaderHelper&) = delete; + XMLHttpRequestStringSnapshotReaderHelper& operator=( + const XMLHttpRequestStringSnapshotReaderHelper&) = delete; + XMLHttpRequestStringSnapshotReaderHelper& operator=( + const XMLHttpRequestStringSnapshotReaderHelper&&) = delete; + + RefPtr<XMLHttpRequestStringBuffer> mBuffer; + MutexAutoLock mLock; +}; + +} // namespace mozilla::dom + +#endif // mozilla_dom_XMLHttpRequestString_h |