diff options
-rw-r--r-- | webkit/glue/multipart_response_delegate.cc | 12 | ||||
-rw-r--r-- | webkit/glue/multipart_response_delegate_unittest.cc | 22 | ||||
-rw-r--r-- | webkit/glue/plugins/webplugin_impl.cc | 1 |
3 files changed, 24 insertions, 11 deletions
diff --git a/webkit/glue/multipart_response_delegate.cc b/webkit/glue/multipart_response_delegate.cc index 8de6469..1b68064 100644 --- a/webkit/glue/multipart_response_delegate.cc +++ b/webkit/glue/multipart_response_delegate.cc @@ -149,6 +149,18 @@ void MultipartResponseDelegate::OnReceivedData(const char* data, break; } } + + // At this point, we should send over any data we have, but keep enough data + // buffered to handle a boundary that may have been truncated. + if (!processing_headers_ && data_.length() > boundary_.length()) { + // If the last character is a new line character, go ahead and just send + // everything we have buffered. This matches an optimization in Gecko. + int send_length = data_.length() - boundary_.length(); + if (data_[data_.length() - 1] == '\n') + send_length = data_.length(); + client_->didReceiveData(loader_, data_.data(), send_length); + data_ = data_.substr(send_length); + } } void MultipartResponseDelegate::OnCompletedRequest() { diff --git a/webkit/glue/multipart_response_delegate_unittest.cc b/webkit/glue/multipart_response_delegate_unittest.cc index 7e3cc32..84d1e05 100644 --- a/webkit/glue/multipart_response_delegate_unittest.cc +++ b/webkit/glue/multipart_response_delegate_unittest.cc @@ -237,8 +237,8 @@ TEST(MultipartResponseTest, MissingBoundaries) { delegate2.OnReceivedData(no_end_boundary.c_str(), static_cast<int>(no_end_boundary.length())); EXPECT_EQ(1, client.received_response_); - EXPECT_EQ(0, client.received_data_); - EXPECT_EQ(string(), client.data_); + EXPECT_EQ(1, client.received_data_); + EXPECT_EQ("This is a sample response\n", client.data_); delegate2.OnCompletedRequest(); EXPECT_EQ(1, client.received_response_); @@ -255,8 +255,8 @@ TEST(MultipartResponseTest, MissingBoundaries) { delegate3.OnReceivedData(no_boundaries.c_str(), static_cast<int>(no_boundaries.length())); EXPECT_EQ(1, client.received_response_); - EXPECT_EQ(0, client.received_data_); - EXPECT_EQ(string(), client.data_); + EXPECT_EQ(1, client.received_data_); + EXPECT_EQ("This is a sample response\n", client.data_); delegate3.OnCompletedRequest(); EXPECT_EQ(1, client.received_response_); @@ -355,20 +355,20 @@ TEST(MultipartResponseTest, BreakInBoundary) { // Break in first and second const TestChunk bound2[] = { { 0, 4, 0, 0, ""}, - { 4, 55, 1, 0, "" }, - { 55, 65, 1, 1, "datadatadatadatadata" }, - { 65, 110, 2, 2, "foofoofoofoofoo" }, + { 4, 55, 1, 1, "datadatadatadat" }, + { 55, 65, 1, 2, "datadatadatadatadata" }, + { 65, 110, 2, 3, "foofoofoofoofoo" }, }; VariousChunkSizesTest(bound2, arraysize(bound2), - 2, 2, "foofoofoofoofoo"); + 2, 3, "foofoofoofoofoo"); // Break in second only const TestChunk bound3[] = { - { 0, 55, 1, 0, "" }, - { 55, 110, 2, 2, "foofoofoofoofoo" }, + { 0, 55, 1, 1, "datadatadatadat" }, + { 55, 110, 2, 3, "foofoofoofoofoo" }, }; VariousChunkSizesTest(bound3, arraysize(bound3), - 2, 2, "foofoofoofoofoo"); + 2, 3, "foofoofoofoofoo"); } TEST(MultipartResponseTest, BreakInHeaders) { diff --git a/webkit/glue/plugins/webplugin_impl.cc b/webkit/glue/plugins/webplugin_impl.cc index b2c793e..c4b9434 100644 --- a/webkit/glue/plugins/webplugin_impl.cc +++ b/webkit/glue/plugins/webplugin_impl.cc @@ -109,6 +109,7 @@ class MultiPartResponseClient : public WebURLLoaderClient { // as regular resources requested by plugins to prevent reentrancy. resource_client_->DidReceiveData( data, data_size, byte_range_lower_bound_); + byte_range_lower_bound_ += data_size; } virtual void didFinishLoading(WebURLLoader*) {} |