~oif-team/ubuntu/natty/qt4-x11/xi2.1

« back to all changes in this revision

Viewing changes to src/3rdparty/webkit/WebCore/bindings/js/JSMessagePortCustom.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Alessandro Ghersi
  • Date: 2009-11-02 18:30:08 UTC
  • mfrom: (1.2.2 upstream)
  • mto: (15.2.5 experimental)
  • mto: This revision was merged to the branch mainline in revision 88.
  • Revision ID: james.westby@ubuntu.com-20091102183008-b6a4gcs128mvfb3m
Tags: upstream-4.6.0~beta1
ImportĀ upstreamĀ versionĀ 4.6.0~beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
 
2
 * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved.
3
3
 *
4
4
 * Redistribution and use in source and binary forms, with or without
5
5
 * modification, are permitted provided that the following conditions
28
28
 
29
29
#include "AtomicString.h"
30
30
#include "Event.h"
 
31
#include "ExceptionCode.h"
31
32
#include "Frame.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>
36
39
 
37
40
using namespace JSC;
38
41
 
39
42
namespace WebCore {
40
43
 
41
 
void JSMessagePort::mark()
 
44
void JSMessagePort::markChildren(MarkStack& markStack)
42
45
{
43
 
    DOMObject::mark();
44
 
 
45
 
    if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onmessage()))
46
 
        listener->mark();
47
 
 
48
 
    if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onclose()))
49
 
        listener->mark();
50
 
 
51
 
    if (MessagePort* entangledPort = m_impl->entangledPort()) {
 
46
    Base::markChildren(markStack);
 
47
 
 
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())
54
 
            wrapper->mark();
55
 
    }
56
 
 
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());
63
 
            listener->mark();
64
 
        }
65
 
    }
66
 
}
67
 
 
68
 
JSValuePtr JSMessagePort::startConversation(ExecState* exec, const ArgList& args)
69
 
{
70
 
    JSDOMGlobalObject* globalObject = static_cast<JSDOMGlobalObject*>(exec->lexicalGlobalObject());
71
 
    const UString& message = args.at(exec, 0)->toString(exec);
72
 
 
73
 
    return toJS(exec, impl()->startConversation(globalObject->scriptExecutionContext(), message).get());
74
 
}
75
 
 
76
 
JSValuePtr JSMessagePort::addEventListener(ExecState* exec, const ArgList& args)
77
 
{
78
 
    JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
79
 
    if (!globalObject)
80
 
        return jsUndefined();
81
 
    RefPtr<JSUnprotectedEventListener> listener = globalObject->findOrCreateJSUnprotectedEventListener(exec, args.at(exec, 1));
82
 
    if (!listener)
83
 
        return jsUndefined();
84
 
    impl()->addEventListener(args.at(exec, 0)->toString(exec), listener.release(), args.at(exec, 2)->toBoolean(exec));
85
 
    return jsUndefined();
86
 
}
87
 
 
88
 
JSValuePtr JSMessagePort::removeEventListener(ExecState* exec, const ArgList& args)
89
 
{
90
 
    JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
91
 
    if (!globalObject)
92
 
        return jsUndefined();
93
 
    JSUnprotectedEventListener* listener = globalObject->findJSUnprotectedEventListener(exec, args.at(exec, 1));
94
 
    if (!listener)
95
 
        return jsUndefined();
96
 
    impl()->removeEventListener(args.at(exec, 0)->toString(exec), listener, args.at(exec, 2)->toBoolean(exec));
97
 
    return jsUndefined();
 
51
        if (wrapper)
 
52
            markStack.append(wrapper);
 
53
    }
 
54
 
 
55
    m_impl->markEventListeners(markStack);
 
56
}
 
57
 
 
58
JSValue JSMessagePort::addEventListener(ExecState* exec, const ArgList& args)
 
59
{
 
60
    JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
 
61
    if (!globalObject)
 
62
        return jsUndefined();
 
63
 
 
64
    JSValue listener = args.at(1);
 
65
    if (!listener.isObject())
 
66
        return jsUndefined();
 
67
 
 
68
    impl()->addEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false).get(), args.at(2).toBoolean(exec));
 
69
    return jsUndefined();
 
70
}
 
71
 
 
72
JSValue JSMessagePort::removeEventListener(ExecState* exec, const ArgList& args)
 
73
{
 
74
    JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(impl()->scriptExecutionContext());
 
75
    if (!globalObject)
 
76
        return jsUndefined();
 
77
 
 
78
    JSValue listener = args.at(1);
 
79
    if (!listener.isObject())
 
80
        return jsUndefined();
 
81
 
 
82
    impl()->removeEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false).get(), args.at(2).toBoolean(exec));
 
83
    return jsUndefined();
 
84
}
 
85
 
 
86
JSC::JSValue JSMessagePort::postMessage(JSC::ExecState* exec, const JSC::ArgList& args)
 
87
{
 
88
    return handlePostMessage(exec, args, impl());
 
89
}
 
90
 
 
91
void fillMessagePortArray(JSC::ExecState* exec, JSC::JSValue value, MessagePortArray& portArray)
 
92
{
 
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()) {
 
96
        portArray.resize(0);
 
97
        return;
 
98
    }
 
99
 
 
100
    // Validation of sequence types, per WebIDL spec 4.1.13.
 
101
    unsigned length;
 
102
    JSObject* object = toJSSequence(exec, value, length);
 
103
    if (exec->hadException())
 
104
        return;
 
105
 
 
106
    portArray.resize(length);
 
107
    for (unsigned i = 0 ; i < length; ++i) {
 
108
        JSValue value = object->get(exec, i);
 
109
        if (exec->hadException())
 
110
            return;
 
111
        // Validation of non-null objects, per HTML5 spec 8.3.3.
 
112
        if (value.isUndefinedOrNull()) {
 
113
            setDOMException(exec, INVALID_STATE_ERR);
 
114
            return;
 
115
        }
 
116
 
 
117
        // Validation of Objects implementing an interface, per WebIDL spec 4.1.15.
 
118
        RefPtr<MessagePort> port = toMessagePort(value);
 
119
        if (!port) {
 
120
            throwError(exec, TypeError);
 
121
            return;
 
122
        }
 
123
        portArray[i] = port.release();
 
124
    }
98
125
}
99
126
 
100
127
} // namespace WebCore