7afad52dd98f17e1a2c9b8e796e11dc81896285c
[WebKit-https.git] / Source / WebCore / bindings / js / ReadableStreamController.cpp
1 /*
2  * Copyright (C) 2016 Canon Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted, provided that the following conditions
6  * are required to be met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Canon Inc. nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY CANON INC. AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL CANON INC. AND ITS CONTRIBUTORS BE LIABLE FOR
21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29
30 #include "config.h"
31 #include "ReadableStreamController.h"
32
33 #if ENABLE(STREAMS_API)
34
35 #include "JSReadableStream.h"
36 #include "JSReadableStreamSource.h"
37 #include "WebCoreJSClientData.h"
38
39 namespace WebCore {
40
41 static inline JSC::JSValue callFunction(JSC::ExecState& state, JSC::JSValue jsFunction, JSC::JSValue thisValue, const JSC::ArgList& arguments)
42 {
43     JSC::CallData callData;
44     JSC::CallType callType = JSC::getCallData(jsFunction, callData);
45     return JSC::call(&state, jsFunction, callType, callData, thisValue, arguments);
46 }
47
48 JSC::JSValue ReadableStreamController::invoke(JSC::ExecState& state, JSC::JSObject& object, const char* propertyName, JSC::JSValue parameter)
49 {
50     JSC::JSLockHolder lock(&state);
51
52     JSC::JSValue function = getPropertyFromObject(state, object, propertyName);
53     if (state.hadException())
54         return JSC::jsUndefined();
55
56     if (!function.isFunction()) {
57         if (!function.isUndefined())
58             throwVMError(&state, createTypeError(&state, ASCIILiteral("ReadableStream trying to call a property that is not callable")));
59         return JSC::jsUndefined();
60     }
61
62     JSC::MarkedArgumentBuffer arguments;
63     arguments.append(parameter);
64
65     return callFunction(state, function, &object, arguments);
66 }
67
68 bool ReadableStreamController::isControlledReadableStreamLocked() const
69 {
70     JSC::ExecState& state = *globalObject()->globalExec();
71     JSC::JSLockHolder lock(&state);
72
73     JSVMClientData& clientData = *static_cast<JSVMClientData*>(state.vm().clientData);
74     JSC::JSValue readableStream = m_jsController->get(&state, clientData.builtinNames().controlledReadableStreamPrivateName());
75     ASSERT(!state.hadException());
76
77     JSC::JSValue isLocked = globalObject()->builtinInternalFunctions().readableStreamInternals().m_isReadableStreamLockedFunction.get();
78
79     JSC::MarkedArgumentBuffer arguments;
80     arguments.append(readableStream);
81     JSC::JSValue result = callFunction(state, isLocked, JSC::jsUndefined(), arguments);
82     ASSERT(!state.hadException());
83
84     return result.isTrue();
85 }
86
87 JSC::JSValue createReadableStream(JSC::ExecState& state, JSDOMGlobalObject* globalObject, ReadableStreamSource* source)
88 {
89     JSC::JSLockHolder lock(&state);
90
91     JSC::JSValue jsSource = source ? toJS(&state, globalObject, source) : JSC::jsUndefined();
92     JSC::Strong<JSC::Unknown> protect(state.vm(), jsSource);
93
94     JSC::MarkedArgumentBuffer arguments;
95     arguments.append(jsSource);
96
97     JSC::JSValue constructor = JSReadableStream::getConstructor(state.vm(), globalObject);
98
99     JSC::ConstructData constructData;
100     JSC::ConstructType constructType = JSC::getConstructData(constructor, constructData);
101     ASSERT(constructType != JSC::ConstructType::None);
102
103     return JSC::construct(&state, constructor, constructType, constructData, arguments);
104 }
105
106 JSC::JSValue getReadableStreamReader(JSC::ExecState& state, JSC::JSValue readableStream)
107 {
108     ASSERT(readableStream.isObject());
109
110     JSC::JSValue getReader = readableStream.getObject()->get(&state, JSC::Identifier::fromString(&state, "getReader"));
111     ASSERT(!state.hadException());
112
113     JSC::JSValue reader = callFunction(state, getReader, readableStream, JSC::MarkedArgumentBuffer());
114     ASSERT(!state.hadException());
115
116     return reader;
117 }
118
119 } // namespace WebCore
120
121 #endif // ENABLE(STREAMS_API)