29
29
#include "AtomicString.h"
31
#include "ExceptionCode.h"
32
33
#include "JSDOMGlobalObject.h"
33
34
#include "JSEvent.h"
34
35
#include "JSEventListener.h"
36
#include "JSMessagePortCustom.h"
35
37
#include "MessagePort.h"
38
#include <runtime/Error.h>
37
40
using namespace JSC;
39
42
namespace WebCore {
41
void JSMessagePort::mark()
44
void JSMessagePort::markChildren(MarkStack& markStack)
45
if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onmessage()))
48
if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onclose()))
51
if (MessagePort* entangledPort = m_impl->entangledPort()) {
46
Base::markChildren(markStack);
48
// If we have a locally entangled port, we can directly mark it as reachable. Ports that are remotely entangled are marked in-use by markActiveObjectsForContext().
49
if (MessagePort* entangledPort = m_impl->locallyEntangledPort()) {
52
50
DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), entangledPort);
53
if (wrapper && !wrapper->marked())
57
typedef MessagePort::EventListenersMap EventListenersMap;
58
typedef MessagePort::ListenerVector ListenerVector;
59
EventListenersMap& eventListeners = m_impl->eventListeners();
60
for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) {
61
for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter) {
62
JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(vecIter->get());
68
JSValuePtr JSMessagePort::startConversation(ExecState* exec, const ArgList& args)
70
JSDOMGlobalObject* globalObject = static_cast<JSDOMGlobalObject*>(exec->lexicalGlobalObject());
71
const UString& message = args.at(exec, 0)->toString(exec);
73
return toJS(exec, impl()->startConversation(globalObject->scriptExecutionContext(), message).get());
76
JSValuePtr JSMessagePort::addEventListener(ExecState* exec, const ArgList& args)
78
JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
81
RefPtr<JSUnprotectedEventListener> listener = globalObject->findOrCreateJSUnprotectedEventListener(exec, args.at(exec, 1));
84
impl()->addEventListener(args.at(exec, 0)->toString(exec), listener.release(), args.at(exec, 2)->toBoolean(exec));
88
JSValuePtr JSMessagePort::removeEventListener(ExecState* exec, const ArgList& args)
90
JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
93
JSUnprotectedEventListener* listener = globalObject->findJSUnprotectedEventListener(exec, args.at(exec, 1));
96
impl()->removeEventListener(args.at(exec, 0)->toString(exec), listener, args.at(exec, 2)->toBoolean(exec));
52
markStack.append(wrapper);
55
m_impl->markEventListeners(markStack);
58
JSValue JSMessagePort::addEventListener(ExecState* exec, const ArgList& args)
60
JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
64
JSValue listener = args.at(1);
65
if (!listener.isObject())
68
impl()->addEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false).get(), args.at(2).toBoolean(exec));
72
JSValue JSMessagePort::removeEventListener(ExecState* exec, const ArgList& args)
74
JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
78
JSValue listener = args.at(1);
79
if (!listener.isObject())
82
impl()->removeEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false).get(), args.at(2).toBoolean(exec));
86
JSC::JSValue JSMessagePort::postMessage(JSC::ExecState* exec, const JSC::ArgList& args)
88
return handlePostMessage(exec, args, impl());
91
void fillMessagePortArray(JSC::ExecState* exec, JSC::JSValue value, MessagePortArray& portArray)
93
// Convert from the passed-in JS array-like object to a MessagePortArray.
94
// Also validates the elements per sections 4.1.13 and 4.1.15 of the WebIDL spec and section 8.3.3 of the HTML5 spec.
95
if (value.isUndefinedOrNull()) {
100
// Validation of sequence types, per WebIDL spec 4.1.13.
102
JSObject* object = toJSSequence(exec, value, length);
103
if (exec->hadException())
106
portArray.resize(length);
107
for (unsigned i = 0 ; i < length; ++i) {
108
JSValue value = object->get(exec, i);
109
if (exec->hadException())
111
// Validation of non-null objects, per HTML5 spec 8.3.3.
112
if (value.isUndefinedOrNull()) {
113
setDOMException(exec, INVALID_STATE_ERR);
117
// Validation of Objects implementing an interface, per WebIDL spec 4.1.15.
118
RefPtr<MessagePort> port = toMessagePort(value);
120
throwError(exec, TypeError);
123
portArray[i] = port.release();
100
127
} // namespace WebCore