| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "modules/serviceworkers/Response.h" | 6 #include "modules/serviceworkers/Response.h" |
| 7 | 7 |
| 8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
| 9 #include "bindings/core/v8/ScriptState.h" | 9 #include "bindings/core/v8/ScriptState.h" |
| 10 #include "core/dom/Document.h" | 10 #include "core/dom/Document.h" |
| 11 #include "core/frame/Frame.h" | 11 #include "core/frame/Frame.h" |
| 12 #include "core/testing/DummyPageHolder.h" | 12 #include "core/testing/DummyPageHolder.h" |
| 13 #include "modules/serviceworkers/BodyStreamBuffer.h" |
| 13 #include "modules/serviceworkers/FetchResponseData.h" | 14 #include "modules/serviceworkers/FetchResponseData.h" |
| 15 #include "platform/blob/BlobData.h" |
| 14 #include "public/platform/WebServiceWorkerResponse.h" | 16 #include "public/platform/WebServiceWorkerResponse.h" |
| 15 #include <gtest/gtest.h> | 17 #include <gtest/gtest.h> |
| 16 | 18 |
| 17 namespace blink { | 19 namespace blink { |
| 18 namespace { | 20 namespace { |
| 19 | 21 |
| 22 const char kTestData[] = "Here is sample text for the blob."; |
| 23 |
| 20 PassOwnPtr<WebServiceWorkerResponse> createTestWebServiceWorkerResponse() | 24 PassOwnPtr<WebServiceWorkerResponse> createTestWebServiceWorkerResponse() |
| 21 { | 25 { |
| 22 const KURL url(ParsedURLString, "http://www.webresponse.com/"); | 26 const KURL url(ParsedURLString, "http://www.webresponse.com/"); |
| 23 const unsigned short status = 200; | 27 const unsigned short status = 200; |
| 24 const String statusText = "the best status text"; | 28 const String statusText = "the best status text"; |
| 25 struct { | 29 struct { |
| 26 const char* key; | 30 const char* key; |
| 27 const char* value; | 31 const char* value; |
| 28 } headers[] = { { "cache-control", "no-cache" }, { "set-cookie", "foop" }, {
"foo", "bar" }, { 0, 0 } }; | 32 } headers[] = { { "cache-control", "no-cache" }, { "set-cookie", "foop" }, {
"foo", "bar" }, { 0, 0 } }; |
| 29 | 33 |
| 30 OwnPtr<WebServiceWorkerResponse> webResponse = adoptPtr(new WebServiceWorker
Response()); | 34 OwnPtr<WebServiceWorkerResponse> webResponse = adoptPtr(new WebServiceWorker
Response()); |
| 31 webResponse->setURL(url); | 35 webResponse->setURL(url); |
| 32 webResponse->setStatus(status); | 36 webResponse->setStatus(status); |
| 33 webResponse->setStatusText(statusText); | 37 webResponse->setStatusText(statusText); |
| 34 webResponse->setResponseType(WebServiceWorkerResponseTypeDefault); | 38 webResponse->setResponseType(WebServiceWorkerResponseTypeDefault); |
| 35 for (int i = 0; headers[i].key; ++i) | 39 for (int i = 0; headers[i].key; ++i) |
| 36 webResponse->setHeader(WebString::fromUTF8(headers[i].key), WebString::f
romUTF8(headers[i].value)); | 40 webResponse->setHeader(WebString::fromUTF8(headers[i].key), WebString::f
romUTF8(headers[i].value)); |
| 37 return webResponse.release(); | 41 return webResponse.release(); |
| 38 } | 42 } |
| 39 | 43 |
| 44 class BlobHandleCreatorClient final : public BodyStreamBuffer::BlobHandleCreator
Client { |
| 45 public: |
| 46 BlobHandleCreatorClient() |
| 47 { |
| 48 } |
| 49 ~BlobHandleCreatorClient() override { } |
| 50 void trace(Visitor* visitor) override |
| 51 { |
| 52 visitor->trace(m_exception); |
| 53 BodyStreamBuffer::BlobHandleCreatorClient::trace(visitor); |
| 54 } |
| 55 void didCreateBlobHandle(PassRefPtr<BlobDataHandle> blobHandle) override |
| 56 { |
| 57 m_blobHandle = blobHandle; |
| 58 } |
| 59 void didFail(PassRefPtrWillBeRawPtr<DOMException> exception) override |
| 60 { |
| 61 m_exception = exception; |
| 62 } |
| 63 PassRefPtr<BlobDataHandle> blobHandle() |
| 64 { |
| 65 return m_blobHandle; |
| 66 } |
| 67 PassRefPtrWillBeRawPtr<DOMException> exception() |
| 68 { |
| 69 return m_exception; |
| 70 } |
| 71 |
| 72 private: |
| 73 RefPtr<BlobDataHandle> m_blobHandle; |
| 74 RefPtrWillBeMember<DOMException> m_exception; |
| 75 }; |
| 76 |
| 77 |
| 40 class ServiceWorkerResponseTest : public ::testing::Test { | 78 class ServiceWorkerResponseTest : public ::testing::Test { |
| 41 public: | 79 public: |
| 42 ServiceWorkerResponseTest() | 80 ServiceWorkerResponseTest() |
| 43 : m_page(DummyPageHolder::create(IntSize(1, 1))) { } | 81 : m_page(DummyPageHolder::create(IntSize(1, 1))) { } |
| 44 | 82 |
| 45 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume
nt().frame()); } | 83 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume
nt().frame()); } |
| 46 ExecutionContext* executionContext() { return scriptState()->executionContex
t(); } | 84 ExecutionContext* executionContext() { return scriptState()->executionContex
t(); } |
| 47 | 85 |
| 48 private: | 86 private: |
| 49 OwnPtr<DummyPageHolder> m_page; | 87 OwnPtr<DummyPageHolder> m_page; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 Response* response = Response::create(executionContext(), *webResponse); | 170 Response* response = Response::create(executionContext(), *webResponse); |
| 133 | 171 |
| 134 Headers* responseHeaders = response->headers(); | 172 Headers* responseHeaders = response->headers(); |
| 135 TrackExceptionState exceptionState; | 173 TrackExceptionState exceptionState; |
| 136 EXPECT_STREQ("", responseHeaders->get("set-cookie", exceptionState).utf8().d
ata()); | 174 EXPECT_STREQ("", responseHeaders->get("set-cookie", exceptionState).utf8().d
ata()); |
| 137 EXPECT_STREQ("", responseHeaders->get("foo", exceptionState).utf8().data()); | 175 EXPECT_STREQ("", responseHeaders->get("foo", exceptionState).utf8().data()); |
| 138 EXPECT_STREQ("", responseHeaders->get("cache-control", exceptionState).utf8(
).data()); | 176 EXPECT_STREQ("", responseHeaders->get("cache-control", exceptionState).utf8(
).data()); |
| 139 EXPECT_FALSE(exceptionState.hadException()); | 177 EXPECT_FALSE(exceptionState.hadException()); |
| 140 } | 178 } |
| 141 | 179 |
| 180 void checkResponseBlobHandle(Response* response, bool hasNonInternalBlobHandle,
const unsigned long long blobSize) |
| 181 { |
| 182 EXPECT_TRUE(response->internalBlobDataHandle()); |
| 183 EXPECT_EQ(blobSize, response->internalBlobDataHandle()->size()); |
| 184 EXPECT_FALSE(response->internalBuffer()); |
| 185 if (hasNonInternalBlobHandle) { |
| 186 EXPECT_TRUE(response->blobDataHandle()); |
| 187 EXPECT_EQ(response->blobDataHandle(), response->internalBlobDataHandle()
); |
| 188 EXPECT_EQ(blobSize, response->blobDataHandle()->size()); |
| 189 } else { |
| 190 EXPECT_FALSE(response->blobDataHandle()); |
| 191 } |
| 192 EXPECT_FALSE(response->buffer()); |
| 193 |
| 194 TrackExceptionState exceptionState; |
| 195 Response* clonedResponse = response->clone(exceptionState); |
| 196 EXPECT_FALSE(exceptionState.hadException()); |
| 197 |
| 198 EXPECT_TRUE(response->internalBlobDataHandle()); |
| 199 EXPECT_EQ(blobSize, clonedResponse->internalBlobDataHandle()->size()); |
| 200 EXPECT_EQ(response->internalBlobDataHandle(), clonedResponse->internalBlobDa
taHandle()); |
| 201 EXPECT_FALSE(response->internalBuffer()); |
| 202 EXPECT_FALSE(clonedResponse->internalBuffer()); |
| 203 if (hasNonInternalBlobHandle) { |
| 204 EXPECT_EQ(response->internalBlobDataHandle(), response->blobDataHandle()
); |
| 205 EXPECT_EQ(clonedResponse->internalBlobDataHandle(), clonedResponse->blob
DataHandle()); |
| 206 } else { |
| 207 EXPECT_FALSE(response->blobDataHandle()); |
| 208 EXPECT_FALSE(clonedResponse->blobDataHandle()); |
| 209 } |
| 210 EXPECT_FALSE(response->buffer()); |
| 211 EXPECT_FALSE(clonedResponse->buffer()); |
| 212 } |
| 213 |
| 214 TEST_F(ServiceWorkerResponseTest, BlobHandleCloneDefault) |
| 215 { |
| 216 FetchResponseData* fetchResponseData = FetchResponseData::create(); |
| 217 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); |
| 218 OwnPtr<BlobData> blobData(BlobData::create()); |
| 219 blobData->appendBytes(kTestData, sizeof(kTestData) - 1); |
| 220 const unsigned long long size = blobData->length(); |
| 221 fetchResponseData->setBlobDataHandle(BlobDataHandle::create(blobData.release
(), size)); |
| 222 checkResponseBlobHandle(Response::create(executionContext(), fetchResponseDa
ta), true, size); |
| 223 } |
| 224 |
| 225 TEST_F(ServiceWorkerResponseTest, BlobHandleCloneBasic) |
| 226 { |
| 227 FetchResponseData* fetchResponseData = FetchResponseData::create(); |
| 228 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); |
| 229 OwnPtr<BlobData> blobData(BlobData::create()); |
| 230 blobData->appendBytes(kTestData, sizeof(kTestData) - 1); |
| 231 const unsigned long long size = blobData->length(); |
| 232 fetchResponseData->setBlobDataHandle(BlobDataHandle::create(blobData.release
(), size)); |
| 233 fetchResponseData = fetchResponseData->createBasicFilteredResponse(); |
| 234 checkResponseBlobHandle(Response::create(executionContext(), fetchResponseDa
ta), true, size); |
| 235 } |
| 236 |
| 237 TEST_F(ServiceWorkerResponseTest, BlobHandleCloneCORS) |
| 238 { |
| 239 FetchResponseData* fetchResponseData = FetchResponseData::create(); |
| 240 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); |
| 241 OwnPtr<BlobData> blobData(BlobData::create()); |
| 242 blobData->appendBytes(kTestData, sizeof(kTestData) - 1); |
| 243 const unsigned long long size = blobData->length(); |
| 244 fetchResponseData->setBlobDataHandle(BlobDataHandle::create(blobData.release
(), size)); |
| 245 fetchResponseData = fetchResponseData->createCORSFilteredResponse(); |
| 246 checkResponseBlobHandle(Response::create(executionContext(), fetchResponseDa
ta), true, size); |
| 247 } |
| 248 |
| 249 TEST_F(ServiceWorkerResponseTest, BlobHandleCloneOpaque) |
| 250 { |
| 251 FetchResponseData* fetchResponseData = FetchResponseData::create(); |
| 252 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); |
| 253 OwnPtr<BlobData> blobData(BlobData::create()); |
| 254 blobData->appendBytes(kTestData, sizeof(kTestData) - 1); |
| 255 const unsigned long long size = blobData->length(); |
| 256 fetchResponseData->setBlobDataHandle(BlobDataHandle::create(blobData.release
(), size)); |
| 257 fetchResponseData = fetchResponseData->createOpaqueFilteredResponse(); |
| 258 checkResponseBlobHandle(Response::create(executionContext(), fetchResponseDa
ta), false, size); |
| 259 } |
| 260 |
| 261 void checkResponseStream(Response* response, bool checkResponseBodyStreamBuffer) |
| 262 { |
| 263 BodyStreamBuffer* buffer = response->internalBuffer(); |
| 264 EXPECT_FALSE(response->internalBlobDataHandle()); |
| 265 EXPECT_FALSE(response->blobDataHandle()); |
| 266 if (checkResponseBodyStreamBuffer) { |
| 267 EXPECT_EQ(response->buffer(), buffer); |
| 268 } else { |
| 269 EXPECT_FALSE(response->buffer()); |
| 270 } |
| 271 |
| 272 TrackExceptionState exceptionState; |
| 273 Response* clonedResponse = response->clone(exceptionState); |
| 274 EXPECT_FALSE(exceptionState.hadException()); |
| 275 EXPECT_FALSE(response->internalBlobDataHandle()); |
| 276 EXPECT_FALSE(response->blobDataHandle()); |
| 277 EXPECT_FALSE(clonedResponse->internalBlobDataHandle()); |
| 278 EXPECT_FALSE(clonedResponse->blobDataHandle()); |
| 279 |
| 280 EXPECT_TRUE(response->internalBuffer()); |
| 281 EXPECT_TRUE(clonedResponse->internalBuffer()); |
| 282 EXPECT_NE(response->internalBuffer(), buffer); |
| 283 EXPECT_NE(clonedResponse->internalBuffer(), buffer); |
| 284 EXPECT_NE(response->internalBuffer(), clonedResponse->internalBuffer()); |
| 285 if (checkResponseBodyStreamBuffer) { |
| 286 EXPECT_EQ(response->buffer(), response->internalBuffer()); |
| 287 EXPECT_EQ(clonedResponse->buffer(), clonedResponse->internalBuffer()); |
| 288 } else { |
| 289 EXPECT_FALSE(response->buffer()); |
| 290 EXPECT_FALSE(clonedResponse->buffer()); |
| 291 } |
| 292 BlobHandleCreatorClient* client1 = new BlobHandleCreatorClient(); |
| 293 BlobHandleCreatorClient* client2 = new BlobHandleCreatorClient(); |
| 294 EXPECT_TRUE(response->internalBuffer()->readAllAndCreateBlobHandle(response-
>internalContentTypeForBuffer(), client1)); |
| 295 EXPECT_TRUE(clonedResponse->internalBuffer()->readAllAndCreateBlobHandle(clo
nedResponse->internalContentTypeForBuffer(), client2)); |
| 296 buffer->write(DOMArrayBuffer::create("foobar", 6)); |
| 297 buffer->write(DOMArrayBuffer::create("piyo", 4)); |
| 298 EXPECT_FALSE(client1->blobHandle()); |
| 299 EXPECT_FALSE(client2->blobHandle()); |
| 300 buffer->close(); |
| 301 EXPECT_TRUE(client1->blobHandle()); |
| 302 EXPECT_TRUE(client2->blobHandle()); |
| 303 EXPECT_EQ(10u, client1->blobHandle()->size()); |
| 304 EXPECT_EQ(10u, client2->blobHandle()->size()); |
| 305 } |
| 306 |
| 307 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneDefault) |
| 308 { |
| 309 BodyStreamBuffer* buffer = new BodyStreamBuffer(); |
| 310 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b
uffer); |
| 311 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); |
| 312 Response* response = Response::create(executionContext(), fetchResponseData)
; |
| 313 EXPECT_EQ(response->internalBuffer(), buffer); |
| 314 checkResponseStream(response, true); |
| 315 } |
| 316 |
| 317 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneBasic) |
| 318 { |
| 319 BodyStreamBuffer* buffer = new BodyStreamBuffer(); |
| 320 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b
uffer); |
| 321 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); |
| 322 fetchResponseData = fetchResponseData->createBasicFilteredResponse(); |
| 323 Response* response = Response::create(executionContext(), fetchResponseData)
; |
| 324 EXPECT_EQ(response->internalBuffer(), buffer); |
| 325 checkResponseStream(response, true); |
| 326 } |
| 327 |
| 328 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneCORS) |
| 329 { |
| 330 BodyStreamBuffer* buffer = new BodyStreamBuffer(); |
| 331 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b
uffer); |
| 332 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); |
| 333 fetchResponseData = fetchResponseData->createCORSFilteredResponse(); |
| 334 Response* response = Response::create(executionContext(), fetchResponseData)
; |
| 335 EXPECT_EQ(response->internalBuffer(), buffer); |
| 336 checkResponseStream(response, true); |
| 337 } |
| 338 |
| 339 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneOpaque) |
| 340 { |
| 341 BodyStreamBuffer* buffer = new BodyStreamBuffer(); |
| 342 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b
uffer); |
| 343 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); |
| 344 fetchResponseData = fetchResponseData->createOpaqueFilteredResponse(); |
| 345 Response* response = Response::create(executionContext(), fetchResponseData)
; |
| 346 EXPECT_EQ(response->internalBuffer(), buffer); |
| 347 checkResponseStream(response, false); |
| 348 } |
| 349 |
| 350 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneError) |
| 351 { |
| 352 BodyStreamBuffer* buffer = new BodyStreamBuffer(); |
| 353 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b
uffer); |
| 354 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); |
| 355 Response* response = Response::create(executionContext(), fetchResponseData)
; |
| 356 TrackExceptionState exceptionState; |
| 357 Response* clonedResponse = response->clone(exceptionState); |
| 358 EXPECT_FALSE(exceptionState.hadException()); |
| 359 BlobHandleCreatorClient* client1 = new BlobHandleCreatorClient(); |
| 360 BlobHandleCreatorClient* client2 = new BlobHandleCreatorClient(); |
| 361 EXPECT_TRUE(response->internalBuffer()->readAllAndCreateBlobHandle(response-
>internalContentTypeForBuffer(), client1)); |
| 362 EXPECT_TRUE(clonedResponse->internalBuffer()->readAllAndCreateBlobHandle(clo
nedResponse->internalContentTypeForBuffer(), client2)); |
| 363 buffer->write(DOMArrayBuffer::create("foobar", 6)); |
| 364 buffer->write(DOMArrayBuffer::create("piyo", 4)); |
| 365 EXPECT_FALSE(client1->blobHandle()); |
| 366 EXPECT_FALSE(client2->blobHandle()); |
| 367 buffer->error(DOMException::create(NetworkError, "Error Message")); |
| 368 EXPECT_EQ("NetworkError", client1->exception()->name()); |
| 369 EXPECT_EQ("Error Message", client1->exception()->message()); |
| 370 EXPECT_EQ("NetworkError", client2->exception()->name()); |
| 371 EXPECT_EQ("Error Message", client2->exception()->message()); |
| 372 } |
| 373 |
| 142 } // namespace | 374 } // namespace |
| 143 } // namespace blink | 375 } // namespace blink |
| OLD | NEW |