| 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 "modules/fetch/BodyStreamBuffer.h" | 5 #include "modules/fetch/BodyStreamBuffer.h" |
| 6 | 6 |
| 7 #include "core/html/FormData.h" | 7 #include "core/html/FormData.h" |
| 8 #include "core/testing/DummyPageHolder.h" | 8 #include "core/testing/DummyPageHolder.h" |
| 9 #include "modules/fetch/DataConsumerHandleTestUtil.h" | 9 #include "modules/fetch/DataConsumerHandleTestUtil.h" |
| 10 #include "modules/fetch/FetchBlobDataConsumerHandle.h" | 10 #include "modules/fetch/FetchBlobDataConsumerHandle.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 | 31 |
| 32 class FakeLoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory { | 32 class FakeLoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory { |
| 33 public: | 33 public: |
| 34 PassOwnPtr<ThreadableLoader> create(ExecutionContext&, ThreadableLoaderClien
t*, const ThreadableLoaderOptions&, const ResourceLoaderOptions&) override | 34 PassOwnPtr<ThreadableLoader> create(ExecutionContext&, ThreadableLoaderClien
t*, const ThreadableLoaderOptions&, const ResourceLoaderOptions&) override |
| 35 { | 35 { |
| 36 ASSERT_NOT_REACHED(); | 36 ASSERT_NOT_REACHED(); |
| 37 return nullptr; | 37 return nullptr; |
| 38 } | 38 } |
| 39 }; | 39 }; |
| 40 | 40 |
| 41 class EmptyClient : public FetchDataConsumerHandle::Client { |
| 42 public: |
| 43 void didGetReadable() override {} |
| 44 }; |
| 45 |
| 41 class BodyStreamBufferTest : public ::testing::Test { | 46 class BodyStreamBufferTest : public ::testing::Test { |
| 42 public: | 47 public: |
| 43 BodyStreamBufferTest() | 48 BodyStreamBufferTest() |
| 44 { | 49 { |
| 45 m_page = DummyPageHolder::create(IntSize(1, 1)); | 50 m_page = DummyPageHolder::create(IntSize(1, 1)); |
| 46 } | 51 } |
| 47 ~BodyStreamBufferTest() override {} | 52 ~BodyStreamBufferTest() override {} |
| 48 | 53 |
| 49 protected: | 54 protected: |
| 50 ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->doc
ument().frame()); } | 55 ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->doc
ument().frame()); } |
| 51 ExecutionContext* getExecutionContext() { return &m_page->document(); } | 56 ExecutionContext* getExecutionContext() { return &m_page->document(); } |
| 52 | 57 |
| 53 OwnPtr<DummyPageHolder> m_page; | 58 OwnPtr<DummyPageHolder> m_page; |
| 59 |
| 60 ScriptValue eval(const char* s) |
| 61 { |
| 62 v8::Local<v8::String> source; |
| 63 v8::Local<v8::Script> script; |
| 64 v8::MicrotasksScope microtasks(getScriptState()->isolate(), v8::Microtas
ksScope::kDoNotRunMicrotasks); |
| 65 if (!v8Call(v8::String::NewFromUtf8(getScriptState()->isolate(), s, v8::
NewStringType::kNormal), source)) { |
| 66 ADD_FAILURE(); |
| 67 return ScriptValue(); |
| 68 } |
| 69 if (!v8Call(v8::Script::Compile(getScriptState()->context(), source), sc
ript)) { |
| 70 ADD_FAILURE() << "Compilation fails"; |
| 71 return ScriptValue(); |
| 72 } |
| 73 return ScriptValue(getScriptState(), script->Run(getScriptState()->conte
xt())); |
| 74 } |
| 75 ScriptValue evalWithPrintingError(const char* s) |
| 76 { |
| 77 v8::TryCatch block(getScriptState()->isolate()); |
| 78 ScriptValue r = eval(s); |
| 79 if (block.HasCaught()) { |
| 80 ADD_FAILURE() << toCoreString(block.Exception()->ToString(getScriptS
tate()->isolate())).utf8().data(); |
| 81 block.ReThrow(); |
| 82 } |
| 83 return r; |
| 84 } |
| 54 }; | 85 }; |
| 55 | 86 |
| 56 TEST_F(BodyStreamBufferTest, ReleaseHandle) | 87 TEST_F(BodyStreamBufferTest, ReleaseHandle) |
| 57 { | 88 { |
| 58 OwnPtr<FetchDataConsumerHandle> handle = createFetchDataConsumerHandleFromWe
bHandle(createWaitingDataConsumerHandle()); | 89 OwnPtr<FetchDataConsumerHandle> handle = createFetchDataConsumerHandleFromWe
bHandle(createWaitingDataConsumerHandle()); |
| 59 FetchDataConsumerHandle* rawHandle = handle.get(); | 90 FetchDataConsumerHandle* rawHandle = handle.get(); |
| 60 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), handle.rel
ease()); | 91 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), handle.rel
ease()); |
| 61 | 92 |
| 62 EXPECT_FALSE(buffer->hasPendingActivity()); | 93 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 63 EXPECT_FALSE(buffer->isStreamLocked()); | 94 EXPECT_FALSE(buffer->isStreamLocked()); |
| 64 EXPECT_FALSE(buffer->isStreamDisturbed()); | 95 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 65 EXPECT_TRUE(buffer->isStreamReadable()); | 96 EXPECT_TRUE(buffer->isStreamReadable()); |
| 66 | 97 |
| 67 OwnPtr<FetchDataConsumerHandle> handle2 = buffer->releaseHandle(); | 98 OwnPtr<FetchDataConsumerHandle> handle2 = buffer->releaseHandle(); |
| 68 | 99 |
| 69 ASSERT_EQ(rawHandle, handle2.get()); | 100 ASSERT_EQ(rawHandle, handle2.get()); |
| 70 EXPECT_TRUE(buffer->isStreamLocked()); | 101 EXPECT_TRUE(buffer->isStreamLocked()); |
| 71 EXPECT_TRUE(buffer->isStreamDisturbed()); | 102 EXPECT_TRUE(buffer->isStreamDisturbed()); |
| 72 EXPECT_TRUE(buffer->isStreamClosed()); | 103 EXPECT_TRUE(buffer->isStreamClosed()); |
| 73 } | 104 } |
| 74 | 105 |
| 106 TEST_F(BodyStreamBufferTest, RealeaseHandleFromBufferMadeFromStream) |
| 107 { |
| 108 ScriptState::Scope scope(getScriptState()); |
| 109 ScriptValue stream = evalWithPrintingError("new ReadableStream()"); |
| 110 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream); |
| 111 |
| 112 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 113 EXPECT_FALSE(buffer->isStreamLocked()); |
| 114 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 115 EXPECT_TRUE(buffer->isStreamReadable()); |
| 116 |
| 117 OwnPtr<FetchDataConsumerHandle> handle = buffer->releaseHandle(); |
| 118 |
| 119 EXPECT_TRUE(handle); |
| 120 EXPECT_TRUE(buffer->isStreamLocked()); |
| 121 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 122 |
| 123 EmptyClient client; |
| 124 size_t size = 0; |
| 125 handle->obtainReader(&client)->read(nullptr, 0, WebDataConsumerHandle::FlagN
one, &size); |
| 126 |
| 127 EXPECT_TRUE(buffer->isStreamLocked()); |
| 128 EXPECT_TRUE(buffer->isStreamDisturbed()); |
| 129 } |
| 130 |
| 75 TEST_F(BodyStreamBufferTest, DrainAsBlobDataHandle) | 131 TEST_F(BodyStreamBufferTest, DrainAsBlobDataHandle) |
| 76 { | 132 { |
| 77 OwnPtr<BlobData> data = BlobData::create(); | 133 OwnPtr<BlobData> data = BlobData::create(); |
| 78 data->appendText("hello", false); | 134 data->appendText("hello", false); |
| 79 auto size = data->length(); | 135 auto size = data->length(); |
| 80 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(data.release(
), size); | 136 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(data.release(
), size); |
| 81 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), FetchBlobD
ataConsumerHandle::create(getExecutionContext(), blobDataHandle, new FakeLoaderF
actory)); | 137 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), FetchBlobD
ataConsumerHandle::create(getExecutionContext(), blobDataHandle, new FakeLoaderF
actory)); |
| 82 | 138 |
| 83 EXPECT_FALSE(buffer->isStreamLocked()); | 139 EXPECT_FALSE(buffer->isStreamLocked()); |
| 84 EXPECT_FALSE(buffer->isStreamDisturbed()); | 140 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 101 EXPECT_FALSE(buffer->isStreamDisturbed()); | 157 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 102 EXPECT_FALSE(buffer->hasPendingActivity()); | 158 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 103 | 159 |
| 104 EXPECT_FALSE(buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::
AllowBlobWithInvalidSize)); | 160 EXPECT_FALSE(buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::
AllowBlobWithInvalidSize)); |
| 105 | 161 |
| 106 EXPECT_FALSE(buffer->isStreamLocked()); | 162 EXPECT_FALSE(buffer->isStreamLocked()); |
| 107 EXPECT_FALSE(buffer->isStreamDisturbed()); | 163 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 108 EXPECT_FALSE(buffer->hasPendingActivity()); | 164 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 109 } | 165 } |
| 110 | 166 |
| 167 TEST_F(BodyStreamBufferTest, DrainAsBlobFromBufferMadeFromBufferMadeFromStream) |
| 168 { |
| 169 ScriptState::Scope scope(getScriptState()); |
| 170 ScriptValue stream = evalWithPrintingError("new ReadableStream()"); |
| 171 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream); |
| 172 |
| 173 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 174 EXPECT_FALSE(buffer->isStreamLocked()); |
| 175 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 176 EXPECT_TRUE(buffer->isStreamReadable()); |
| 177 |
| 178 EXPECT_FALSE(buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::
AllowBlobWithInvalidSize)); |
| 179 |
| 180 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 181 EXPECT_FALSE(buffer->isStreamLocked()); |
| 182 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 183 EXPECT_TRUE(buffer->isStreamReadable()); |
| 184 } |
| 185 |
| 111 TEST_F(BodyStreamBufferTest, DrainAsFormData) | 186 TEST_F(BodyStreamBufferTest, DrainAsFormData) |
| 112 { | 187 { |
| 113 FormData* data = FormData::create(UTF8Encoding()); | 188 FormData* data = FormData::create(UTF8Encoding()); |
| 114 data->append("name1", "value1"); | 189 data->append("name1", "value1"); |
| 115 data->append("name2", "value2"); | 190 data->append("name2", "value2"); |
| 116 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData(); | 191 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData(); |
| 117 | 192 |
| 118 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), FetchFormD
ataConsumerHandle::create(getExecutionContext(), inputFormData)); | 193 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), FetchFormD
ataConsumerHandle::create(getExecutionContext(), inputFormData)); |
| 119 | 194 |
| 120 EXPECT_FALSE(buffer->isStreamLocked()); | 195 EXPECT_FALSE(buffer->isStreamLocked()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 138 EXPECT_FALSE(buffer->isStreamDisturbed()); | 213 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 139 EXPECT_FALSE(buffer->hasPendingActivity()); | 214 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 140 | 215 |
| 141 EXPECT_FALSE(buffer->drainAsFormData()); | 216 EXPECT_FALSE(buffer->drainAsFormData()); |
| 142 | 217 |
| 143 EXPECT_FALSE(buffer->isStreamLocked()); | 218 EXPECT_FALSE(buffer->isStreamLocked()); |
| 144 EXPECT_FALSE(buffer->isStreamDisturbed()); | 219 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 145 EXPECT_FALSE(buffer->hasPendingActivity()); | 220 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 146 } | 221 } |
| 147 | 222 |
| 223 TEST_F(BodyStreamBufferTest, DrainAsFormDataFromBufferMadeFromBufferMadeFromStre
am) |
| 224 { |
| 225 ScriptState::Scope scope(getScriptState()); |
| 226 ScriptValue stream = evalWithPrintingError("new ReadableStream()"); |
| 227 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream); |
| 228 |
| 229 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 230 EXPECT_FALSE(buffer->isStreamLocked()); |
| 231 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 232 EXPECT_TRUE(buffer->isStreamReadable()); |
| 233 |
| 234 EXPECT_FALSE(buffer->drainAsFormData()); |
| 235 |
| 236 EXPECT_FALSE(buffer->hasPendingActivity()); |
| 237 EXPECT_FALSE(buffer->isStreamLocked()); |
| 238 EXPECT_FALSE(buffer->isStreamDisturbed()); |
| 239 EXPECT_TRUE(buffer->isStreamReadable()); |
| 240 } |
| 241 |
| 148 TEST_F(BodyStreamBufferTest, LoadBodyStreamBufferAsArrayBuffer) | 242 TEST_F(BodyStreamBufferTest, LoadBodyStreamBufferAsArrayBuffer) |
| 149 { | 243 { |
| 150 Checkpoint checkpoint; | 244 Checkpoint checkpoint; |
| 151 MockFetchDataLoaderClient* client = MockFetchDataLoaderClient::create(); | 245 MockFetchDataLoaderClient* client = MockFetchDataLoaderClient::create(); |
| 152 DOMArrayBuffer* arrayBuffer = nullptr; | 246 DOMArrayBuffer* arrayBuffer = nullptr; |
| 153 | 247 |
| 154 InSequence s; | 248 InSequence s; |
| 155 EXPECT_CALL(checkpoint, Call(1)); | 249 EXPECT_CALL(checkpoint, Call(1)); |
| 156 EXPECT_CALL(*client, didFetchDataLoadedArrayBufferMock(_)).WillOnce(SaveArg<
0>(&arrayBuffer)); | 250 EXPECT_CALL(*client, didFetchDataLoadedArrayBufferMock(_)).WillOnce(SaveArg<
0>(&arrayBuffer)); |
| 157 EXPECT_CALL(checkpoint, Call(2)); | 251 EXPECT_CALL(checkpoint, Call(2)); |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), handle.rel
ease()); | 493 BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), handle.rel
ease()); |
| 400 checkpoint.Call(1); | 494 checkpoint.Call(1); |
| 401 ScriptValue reason(getScriptState(), v8String(getScriptState()->isolate(), "
reason")); | 495 ScriptValue reason(getScriptState(), v8String(getScriptState()->isolate(), "
reason")); |
| 402 buffer->cancelSource(getScriptState(), reason); | 496 buffer->cancelSource(getScriptState(), reason); |
| 403 checkpoint.Call(2); | 497 checkpoint.Call(2); |
| 404 } | 498 } |
| 405 | 499 |
| 406 } // namespace | 500 } // namespace |
| 407 | 501 |
| 408 } // namespace blink | 502 } // namespace blink |
| OLD | NEW |