Przeglądaj źródła

LibWeb: Let LoadRequest::set_body() take by value

This changes the signature of LoadRequest::set_body() to take by value
and then use move semantics to move the contents of the ByteBuffer.

This is done to avoid the fallible copy constructor of ByteBuffer.
Kenneth Myhra 2 lat temu
rodzic
commit
f09e256328

+ 1 - 1
Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp

@@ -128,7 +128,7 @@ void HTMLFormElement::submit_form(JS::GCPtr<HTMLElement> submitter, bool from_su
         auto body = url_encode(parameters, AK::URL::PercentEncodeSet::ApplicationXWWWFormUrlencoded).to_byte_buffer();
         request.set_method("POST");
         request.set_header("Content-Type", "application/x-www-form-urlencoded");
-        request.set_body(body);
+        request.set_body(move(body));
     }
 
     if (auto* page = document().page())

+ 1 - 1
Userland/Libraries/LibWeb/Loader/LoadRequest.h

@@ -33,7 +33,7 @@ public:
     void set_method(String const& method) { m_method = method; }
 
     ByteBuffer const& body() const { return m_body; }
-    void set_body(ByteBuffer const& body) { m_body = body; }
+    void set_body(ByteBuffer body) { m_body = move(body); }
 
     void start_timer() { m_load_timer.start(); };
     Time load_time() const { return m_load_timer.elapsed_time(); }

+ 4 - 3
Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp

@@ -440,16 +440,17 @@ WebIDL::ExceptionOr<void> XMLHttpRequest::send(Optional<Variant<JS::Handle<DOM::
     auto request = LoadRequest::create_for_url_on_page(request_url, m_window->page());
     request.set_method(m_method);
     if (serialized_document.has_value()) {
-        request.set_body(serialized_document.value());
+        request.set_body(serialized_document.release_value());
     } else if (body_with_type.has_value()) {
         TRY(body_with_type->body.source().visit(
             [&](ByteBuffer const& buffer) -> WebIDL::ExceptionOr<void> {
-                request.set_body(buffer);
+                auto byte_buffer = TRY_OR_RETURN_OOM(realm, ByteBuffer::copy(buffer));
+                request.set_body(move(byte_buffer));
                 return {};
             },
             [&](JS::Handle<FileAPI::Blob> const& blob) -> WebIDL::ExceptionOr<void> {
                 auto byte_buffer = TRY_OR_RETURN_OOM(realm, ByteBuffer::copy(blob->bytes()));
-                request.set_body(byte_buffer);
+                request.set_body(move(byte_buffer));
                 return {};
             },
             [](auto&) -> WebIDL::ExceptionOr<void> {