Chromium Code Reviews| 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 BlobHandleCallback final : public BodyStreamBuffer::BlobHandleCreatorClien t { | |
|
yhirano
2014/12/12 12:42:33
How about BlobHandleCreatorClient?
horo
2014/12/15 02:12:24
Done.
| |
| 45 public: | |
| 46 BlobHandleCallback() | |
| 47 { | |
| 48 } | |
| 49 ~BlobHandleCallback() 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, BodyStreamBuffer* buffer, bool hasN onInternalStream) | |
|
yhirano
2014/12/12 12:42:33
Do you need to pass buffer? Isn't just using respo
yhirano
2014/12/12 12:42:33
hasNonInternalBodyStreamBuffer
yhirano
2014/12/12 12:42:33
checkResponseBodyStreamBuffer
horo
2014/12/15 02:12:24
Done.
horo
2014/12/15 02:12:24
We need |buffer| to write the data (l.296) on it a
yhirano
2014/12/15 04:03:06
Yes, we need the buffer object, but it always equa
horo
2014/12/15 04:26:08
I see.
Done.
| |
| 262 { | |
| 263 EXPECT_FALSE(response->internalBlobDataHandle()); | |
| 264 EXPECT_FALSE(response->blobDataHandle()); | |
| 265 EXPECT_EQ(response->internalBuffer(), buffer); | |
| 266 if (hasNonInternalStream) { | |
| 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 (hasNonInternalStream) { | |
| 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 BlobHandleCallback* callback1 = new BlobHandleCallback(); | |
| 293 BlobHandleCallback* callback2 = new BlobHandleCallback(); | |
| 294 EXPECT_TRUE(response->internalBuffer()->readAllAndCreateBlobHandle(response- >internalContentType(), callback1)); | |
| 295 EXPECT_TRUE(clonedResponse->internalBuffer()->readAllAndCreateBlobHandle(clo nedResponse->internalContentType(), callback2)); | |
| 296 buffer->write(DOMArrayBuffer::create("foobar", 6)); | |
| 297 buffer->write(DOMArrayBuffer::create("piyo", 4)); | |
| 298 EXPECT_FALSE(callback1->blobHandle()); | |
| 299 EXPECT_FALSE(callback2->blobHandle()); | |
| 300 buffer->close(); | |
| 301 EXPECT_TRUE(callback1->blobHandle()); | |
| 302 EXPECT_TRUE(callback2->blobHandle()); | |
| 303 EXPECT_EQ(10u, callback1->blobHandle()->size()); | |
| 304 EXPECT_EQ(10u, callback2->blobHandle()->size()); | |
| 305 } | |
| 306 | |
| 307 TEST_F(ServiceWorkerResponseTest, StreamCloneDefault) | |
|
yhirano
2014/12/12 12:42:33
s/Stream/BodyStreamBuffer/
Same for the below test
horo
2014/12/15 02:12:24
Done.
| |
| 308 { | |
| 309 BodyStreamBuffer* buffer = new BodyStreamBuffer(); | |
| 310 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); | |
| 311 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); | |
| 312 checkResponseStream(Response::create(executionContext(), fetchResponseData), buffer, true); | |
| 313 } | |
| 314 | |
| 315 TEST_F(ServiceWorkerResponseTest, StreamCloneBasic) | |
| 316 { | |
| 317 BodyStreamBuffer* buffer = new BodyStreamBuffer(); | |
| 318 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); | |
| 319 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); | |
| 320 fetchResponseData = fetchResponseData->createBasicFilteredResponse(); | |
| 321 checkResponseStream(Response::create(executionContext(), fetchResponseData), buffer, true); | |
| 322 } | |
| 323 | |
| 324 TEST_F(ServiceWorkerResponseTest, StreamCloneCORS) | |
| 325 { | |
| 326 BodyStreamBuffer* buffer = new BodyStreamBuffer(); | |
| 327 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); | |
| 328 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); | |
| 329 fetchResponseData = fetchResponseData->createCORSFilteredResponse(); | |
| 330 checkResponseStream(Response::create(executionContext(), fetchResponseData), buffer, true); | |
| 331 } | |
| 332 | |
| 333 TEST_F(ServiceWorkerResponseTest, StreamCloneOpaque) | |
| 334 { | |
| 335 BodyStreamBuffer* buffer = new BodyStreamBuffer(); | |
| 336 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); | |
| 337 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); | |
| 338 fetchResponseData = fetchResponseData->createOpaqueFilteredResponse(); | |
| 339 checkResponseStream(Response::create(executionContext(), fetchResponseData), buffer, false); | |
| 340 } | |
| 341 | |
| 342 TEST_F(ServiceWorkerResponseTest, StreamCloneError) | |
| 343 { | |
| 344 BodyStreamBuffer* buffer = new BodyStreamBuffer(); | |
| 345 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); | |
| 346 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); | |
| 347 Response* response = Response::create(executionContext(), fetchResponseData) ; | |
| 348 TrackExceptionState exceptionState; | |
| 349 Response* clonedResponse = response->clone(exceptionState); | |
| 350 EXPECT_FALSE(exceptionState.hadException()); | |
| 351 BlobHandleCallback* callback1 = new BlobHandleCallback(); | |
| 352 BlobHandleCallback* callback2 = new BlobHandleCallback(); | |
| 353 EXPECT_TRUE(response->internalBuffer()->readAllAndCreateBlobHandle(response- >internalContentType(), callback1)); | |
| 354 EXPECT_TRUE(clonedResponse->internalBuffer()->readAllAndCreateBlobHandle(clo nedResponse->internalContentType(), callback2)); | |
| 355 buffer->write(DOMArrayBuffer::create("foobar", 6)); | |
| 356 buffer->write(DOMArrayBuffer::create("piyo", 4)); | |
| 357 EXPECT_FALSE(callback1->blobHandle()); | |
| 358 EXPECT_FALSE(callback2->blobHandle()); | |
| 359 buffer->error(DOMException::create(NetworkError, "Error Message")); | |
| 360 EXPECT_EQ("NetworkError", callback1->exception()->name()); | |
| 361 EXPECT_EQ("Error Message", callback1->exception()->message()); | |
| 362 EXPECT_EQ("NetworkError", callback2->exception()->name()); | |
| 363 EXPECT_EQ("Error Message", callback2->exception()->message()); | |
| 364 } | |
| 365 | |
| 142 } // namespace | 366 } // namespace |
| 143 } // namespace blink | 367 } // namespace blink |
| OLD | NEW |