diff --git a/bridge/core/frame/window.cc b/bridge/core/frame/window.cc index ab952f66c6..5a83e1fa18 100644 --- a/bridge/core/frame/window.cc +++ b/bridge/core/frame/window.cc @@ -34,26 +34,32 @@ AtomicString Window::btoa(const AtomicString& source, ExceptionState& exception_ return AtomicString::Empty(); size_t encode_len = modp_b64_encode_data_len(source.length()); std::vector buffer; - buffer.resize(encode_len); + buffer.resize(encode_len + 1); + + std::string source_string = source.ToStdString(ctx()); + + const size_t output_size = modp_b64_encode(reinterpret_cast(buffer.data()), + source_string.c_str(), source.length()); + const char* encode_str = buffer.data(); + const size_t encode_str_len = strlen(encode_str); - const size_t output_size = modp_b64_encode_data(reinterpret_cast(buffer.data()), - reinterpret_cast(source.Character8()), source.length()); assert(output_size == encode_len); - if (output_size != encode_len || buffer.empty()) { + if (output_size != encode_len || encode_str_len == 0) { exception_state.ThrowException(ctx(), ErrorType::TypeError, "The string encode failed."); return AtomicString::Empty(); } - - return {ctx(), buffer.data(), buffer.size()}; + return {ctx(), encode_str, encode_str_len}; } // Invokes modp_b64 without stripping whitespace. -bool Base64DecodeRaw(const AtomicString& in, std::vector& out, ModpDecodePolicy policy) { +bool Base64DecodeRaw(JSContext* ctx, const AtomicString& in, std::vector& out, ModpDecodePolicy policy) { size_t decode_len = modp_b64_decode_len(in.length()); out.resize(decode_len); + std::string in_string = in.ToStdString(ctx); + const size_t output_size = modp_b64_decode(reinterpret_cast(out.data()), - reinterpret_cast(in.Character8()), in.length(), policy); + in_string.c_str(), in.length(), policy); if (output_size == MODP_B64_ERROR) return false; out.resize(output_size); @@ -72,11 +78,11 @@ bool Base64Decode(JSContext* ctx, AtomicString in, std::vector& out, Mo // TODO(csharrison): Most callers use String inputs so ToString() should // be fast. Still, we should add a RemoveCharacters method to StringView // to avoid a double allocation for non-String-backed StringViews. - return Base64DecodeRaw(in, out, policy) || - Base64DecodeRaw(in.RemoveCharacters(ctx, &IsAsciiWhitespace), out, policy); + return Base64DecodeRaw(ctx, in, out, policy) || + Base64DecodeRaw(ctx, in.RemoveCharacters(ctx, &IsAsciiWhitespace), out, policy); } case ModpDecodePolicy::kNoPaddingValidation: { - return Base64DecodeRaw(in, out, policy); + return Base64DecodeRaw(ctx, in, out, policy); } case ModpDecodePolicy::kStrict: return false;