| Index: third_party/WebKit/Source/bindings/core/v8/ReadableStreamOperationsTest.cpp
|
| diff --git a/third_party/WebKit/Source/bindings/core/v8/ReadableStreamOperationsTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ReadableStreamOperationsTest.cpp
|
| index 97151473f77fa4024ab66ff8d688efa883df1554..a76e6d0a43763a02e789b044b78a306683b73063 100644
|
| --- a/third_party/WebKit/Source/bindings/core/v8/ReadableStreamOperationsTest.cpp
|
| +++ b/third_party/WebKit/Source/bindings/core/v8/ReadableStreamOperationsTest.cpp
|
| @@ -14,6 +14,8 @@
|
| #include "bindings/core/v8/V8IteratorResultValue.h"
|
| #include "bindings/core/v8/V8ThrowException.h"
|
| #include "core/dom/Document.h"
|
| +#include "core/streams/ReadableStreamController.h"
|
| +#include "core/streams/UnderlyingSourceBase.h"
|
| #include "platform/heap/Handle.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include <v8.h>
|
| @@ -110,6 +112,20 @@ private:
|
| Member<Iteration> m_iteration;
|
| };
|
|
|
| +class TestUnderlyingSource final : public UnderlyingSourceBase {
|
| +public:
|
| + explicit TestUnderlyingSource(ScriptState* scriptState)
|
| + : UnderlyingSourceBase(scriptState)
|
| + {
|
| + }
|
| +
|
| + // Just expose the controller methods for easy testing
|
| + void enqueue(ScriptValue value) { controller()->enqueue(value); }
|
| + void close() { controller()->close(); }
|
| + void error(ScriptValue value) { controller()->error(value); }
|
| + double desiredSize() { return controller()->desiredSize(); }
|
| +};
|
| +
|
| class ReadableStreamOperationsTest : public ::testing::Test {
|
| public:
|
| ReadableStreamOperationsTest()
|
| @@ -260,6 +276,63 @@ TEST_F(ReadableStreamOperationsTest, Read)
|
| EXPECT_TRUE(it2->isDone());
|
| }
|
|
|
| +TEST_F(ReadableStreamOperationsTest, CreateReadableStreamWithCustomUnderlyingSourceAndStrategy)
|
| +{
|
| + auto underlyingSource = new TestUnderlyingSource(scriptState());
|
| +
|
| + ScriptValue strategy = ReadableStreamOperations::createCountQueuingStrategy(scriptState(), 10);
|
| + ASSERT_FALSE(strategy.isEmpty());
|
| +
|
| + ScriptValue stream = ReadableStreamOperations::createReadableStream(scriptState(), underlyingSource, strategy);
|
| + ASSERT_FALSE(stream.isEmpty());
|
| +
|
| + EXPECT_EQ(10, underlyingSource->desiredSize());
|
| +
|
| + underlyingSource->enqueue(ScriptValue::from(scriptState(), "a"));
|
| + EXPECT_EQ(9, underlyingSource->desiredSize());
|
| +
|
| + underlyingSource->enqueue(ScriptValue::from(scriptState(), "b"));
|
| + EXPECT_EQ(8, underlyingSource->desiredSize());
|
| +
|
| + ScriptValue reader;
|
| + {
|
| + TrackExceptionState es;
|
| + reader = ReadableStreamOperations::getReader(scriptState(), stream, es);
|
| + ASSERT_FALSE(es.hadException());
|
| + }
|
| + ASSERT_FALSE(reader.isEmpty());
|
| +
|
| + Iteration* it1 = new Iteration();
|
| + Iteration* it2 = new Iteration();
|
| + Iteration* it3 = new Iteration();
|
| + ReadableStreamOperations::read(scriptState(), reader).then(Function::createFunction(scriptState(), it1), NotReached::createFunction(scriptState()));
|
| + ReadableStreamOperations::read(scriptState(), reader).then(Function::createFunction(scriptState(), it2), NotReached::createFunction(scriptState()));
|
| + ReadableStreamOperations::read(scriptState(), reader).then(Function::createFunction(scriptState(), it3), NotReached::createFunction(scriptState()));
|
| +
|
| + isolate()->RunMicrotasks();
|
| +
|
| + EXPECT_EQ(10, underlyingSource->desiredSize());
|
| +
|
| + EXPECT_TRUE(it1->isSet());
|
| + EXPECT_TRUE(it1->isValid());
|
| + EXPECT_FALSE(it1->isDone());
|
| + EXPECT_EQ("a", it1->value());
|
| +
|
| + EXPECT_TRUE(it2->isSet());
|
| + EXPECT_TRUE(it2->isValid());
|
| + EXPECT_FALSE(it2->isDone());
|
| + EXPECT_EQ("b", it2->value());
|
| +
|
| + EXPECT_FALSE(it3->isSet());
|
| +
|
| + underlyingSource->close();
|
| + isolate()->RunMicrotasks();
|
| +
|
| + EXPECT_TRUE(it3->isSet());
|
| + EXPECT_TRUE(it3->isValid());
|
| + EXPECT_TRUE(it3->isDone());
|
| +}
|
| +
|
| } // namespace
|
|
|
| } // namespace blink
|
|
|