summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--webkit/glue/multipart_response_delegate.cc12
-rw-r--r--webkit/glue/multipart_response_delegate_unittest.cc22
-rw-r--r--webkit/glue/plugins/webplugin_impl.cc1
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*) {}