Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(213)

Side by Side Diff: third_party/WebKit/Source/core/streams/ReadableStreamController.h

Issue 1167343002: Add methods for creating V8 extras-based ReadableStreams from C++ (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Trying blindly to resolve circular dependency Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef ReadableStreamController_h
6 #define ReadableStreamController_h
7
8 #include "bindings/core/v8/ScopedPersistent.h"
9 #include "bindings/core/v8/ScriptValue.h"
10 #include "bindings/core/v8/ToV8.h"
11 #include "bindings/core/v8/V8ScriptRunner.h"
12 #include "core/CoreExport.h"
13 #include "platform/heap/Handle.h"
14 #include "wtf/RefPtr.h"
15 #include <v8.h>
16
17 namespace blink {
18
19 class CORE_EXPORT ReadableStreamController final : public GarbageCollectedFinali zed<ReadableStreamController> {
20 public:
21 DEFINE_INLINE_TRACE() {}
22
23 explicit ReadableStreamController(ScriptValue stream)
24 : m_scriptState(stream.scriptState())
25 , m_stream(stream.isolate(), stream.v8Value())
26 {
27 m_stream.setWeak(&m_stream, ReadableStreamController::streamWeakCallback );
28 }
29
30 // Users of the ReadableStreamController can call this to note that the stre am has been canceled and thus they
31 // don't anticipate using the ReadableStreamController anymore. (close/desir edSize/enqueue/error will become no-ops
32 // afterward.)
33 void noteHasBeenCanceled()
34 {
35 m_stream.clear();
36 }
37
38 bool isActive() const
39 {
40 return !m_stream.isEmpty();
41 }
42
43 void close()
44 {
45 ScriptState* scriptState = m_scriptState.get();
46 ScriptState::Scope scope(scriptState); // will assert context is valid; do not call this method when the context is invalidated
47 v8::Isolate* isolate = scriptState->isolate();
48
49 v8::Local<v8::Value> stream = m_stream.newLocal(isolate);
50 if (stream.IsEmpty())
51 return;
52
53 v8::Local<v8::Value> args[] = { stream };
54 V8ScriptRunner::callExtraOrCrash(scriptState, "CloseReadableStream", arg s);
55
56 m_stream.clear();
57 }
58
59 double desiredSize() const
60 {
61 ScriptState* scriptState = m_scriptState.get();
62 ScriptState::Scope scope(scriptState); // will assert context is valid; do not call this method when the context is invalidated
63 v8::Isolate* isolate = scriptState->isolate();
64
65 v8::Local<v8::Value> stream = m_stream.newLocal(isolate);
66 if (stream.IsEmpty())
67 return 0;
68
69 v8::Local<v8::Value> args[] = { stream };
70 v8::Local<v8::Value> result = V8ScriptRunner::callExtraOrCrash(scriptSta te, "GetReadableStreamDesiredSize", args);
71
72 return result.As<v8::Number>()->Value();
73 }
74
75 template <typename ChunkType>
76 void enqueue(ChunkType chunk) const
77 {
78 ScriptState* scriptState = m_scriptState.get();
79 ScriptState::Scope scope(scriptState); // will assert context is valid; do not call this method when the context is invalidated
80 v8::Isolate* isolate = scriptState->isolate();
81
82 v8::Local<v8::Value> stream = m_stream.newLocal(isolate);
83 if (stream.IsEmpty())
84 return;
85
86 v8::Local<v8::Value> jsChunk = toV8(chunk, scriptState);
87 v8::Local<v8::Value> args[] = { stream, jsChunk };
88 V8ScriptRunner::callExtraOrCrash(scriptState, "EnqueueInReadableStream", args);
89 }
90
91 template <typename ErrorType>
92 void error(ErrorType error)
93 {
94 ScriptState* scriptState = m_scriptState.get();
95 ScriptState::Scope scope(scriptState); // will assert context is valid; do not call this method when the context is invalidated
96 v8::Isolate* isolate = scriptState->isolate();
97
98 v8::Local<v8::Value> stream = m_stream.newLocal(isolate);
99 if (stream.IsEmpty())
100 return;
101
102 v8::Local<v8::Value> jsError = toV8(error, scriptState);
103 v8::Local<v8::Value> args[] = { stream, jsError };
104 V8ScriptRunner::callExtraOrCrash(scriptState, "ErrorReadableStream", arg s);
105
106 m_stream.clear();
107 }
108
109 private:
110 static void streamWeakCallback(const v8::WeakCallbackInfo<ScopedPersistent<v 8::Value>>& weakInfo)
111 {
112 weakInfo.GetParameter()->clear();
113 }
114
115 RefPtr<ScriptState> m_scriptState;
116 ScopedPersistent<v8::Value> m_stream;
117 };
118
119 } // namespace blink
120
121 #endif // ReadableStreamController_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698