TextEncoderStreamEncoder.cpp [plain text]
#include "config.h"
#include "TextEncoderStreamEncoder.h"
#include <JavaScriptCore/GenericTypedArrayViewInlines.h>
#include <JavaScriptCore/JSCInlines.h>
#include <JavaScriptCore/JSGenericTypedArrayViewInlines.h>
namespace WebCore {
RefPtr<Uint8Array> TextEncoderStreamEncoder::encode(const String& input)
{
StringView view(input);
if (!view.length())
return nullptr;
Vector<uint8_t> bytes(WTF::checkedProduct<size_t>(view.length() + 1, 3).unsafeGet());
size_t bytesWritten = 0;
for (size_t cptr = 0; cptr < view.length(); cptr++) {
auto token = view[cptr];
if (m_pendingHighSurrogate) {
auto highSurrogate = *m_pendingHighSurrogate;
m_pendingHighSurrogate = WTF::nullopt;
if (token >= 0xDC00 && token <= 0xDFFF) {
auto codePoint = 0x10000 + ((highSurrogate - 0xD800) << 10) + (token - 0xDC00);
U8_APPEND_UNSAFE(bytes.data(), bytesWritten, codePoint);
continue;
}
U8_APPEND_UNSAFE(bytes.data(), bytesWritten, 0XFFFD);
}
if (token >= 0xD800 && token <= 0xDBFF) {
m_pendingHighSurrogate = token;
continue;
}
if (token >= 0xDC00 && token <= 0xDFFF) {
U8_APPEND_UNSAFE(bytes.data(), bytesWritten, 0XFFFD);
continue;
}
U8_APPEND_UNSAFE(bytes.data(), bytesWritten, token);
}
if (!bytesWritten)
return nullptr;
bytes.shrink(bytesWritten);
return Uint8Array::tryCreate(reinterpret_cast<const uint8_t*>(bytes.data()), bytesWritten);
}
RefPtr<Uint8Array> TextEncoderStreamEncoder::flush()
{
if (!m_pendingHighSurrogate)
return nullptr;
auto byteSequence = "\xEF\xBF\xBD";
return Uint8Array::tryCreate(reinterpret_cast<const uint8_t*>(byteSequence), 3);
}
}