10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Google Inc. All rights reserved.
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions are
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * met:
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *     * Redistributions of source code must retain the above copyright
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer.
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *     * Redistributions in binary form must reproduce the above
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * copyright notice, this list of conditions and the following disclaimer
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * in the documentation and/or other materials provided with the
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * distribution.
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *     * Neither the name of Google Inc. nor the names of its
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * contributors may be used to endorse or promote products derived from
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * this software without specific prior written permission.
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef MessagePortChannel_h
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define MessagePortChannel_h
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "PlatformString.h"
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "SerializedScriptValue.h"
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/OwnPtr.h>
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/PassOwnPtr.h>
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/PassRefPtr.h>
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/RefCounted.h>
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/RefPtr.h>
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore {
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class MessagePort;
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class MessagePortChannel;
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class PlatformMessagePortChannel;
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class ScriptExecutionContext;
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class SerializedScriptValue;
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class String;
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // The overwhelmingly common case is sending a single port, so handle that efficiently with an inline buffer of size 1.
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    typedef Vector<OwnPtr<MessagePortChannel>, 1> MessagePortChannelArray;
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // MessagePortChannel is a platform-independent interface to the remote side of a message channel.
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // It acts as a wrapper around the platform-dependent PlatformMessagePortChannel implementation which ensures that the platform-dependent close() method is invoked before destruction.
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class MessagePortChannel : public Noncopyable {
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    public:
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static void createChannel(PassRefPtr<MessagePort>, PassRefPtr<MessagePort>);
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Creates a new wrapper for the passed channel.
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static PassOwnPtr<MessagePortChannel> create(PassRefPtr<PlatformMessagePortChannel>);
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
65d0825bca7fe65beaee391d30da42e937db621564Steve Block        // Entangles the channel with a port (called when a port has been cloned, after the clone has been marshaled to its new owning thread and is ready to receive messages).
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Returns false if the entanglement failed because the port was closed.
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool entangleIfOpen(MessagePort*);
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Disentangles the channel from a given port so it no longer forwards messages to the port. Called when the port is being cloned and no new owning thread has yet been established.
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void disentangle();
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Closes the port (ensures that no further messages can be added to either queue).
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void close();
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Used by MessagePort.postMessage() to prevent callers from passing a port's own entangled port.
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool isConnectedTo(MessagePort*);
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Returns true if the proxy currently contains messages for this port.
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool hasPendingActivity();
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        class EventData : public Noncopyable {
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        public:
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            static PassOwnPtr<EventData> create(PassRefPtr<SerializedScriptValue>, PassOwnPtr<MessagePortChannelArray>);
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            SerializedScriptValue* message() { return m_message.get(); }
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            PassOwnPtr<MessagePortChannelArray> channels() { return m_channels.release(); }
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        private:
89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            EventData(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray>);
90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            RefPtr<SerializedScriptValue> m_message;
91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            OwnPtr<MessagePortChannelArray> m_channels;
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        };
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Sends a message and optional cloned port to the remote port.
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void postMessageToRemote(PassOwnPtr<EventData>);
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Extracts a message from the message queue for this port.
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool tryGetMessageFromRemote(OwnPtr<EventData>&);
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Returns the entangled port if run by the same thread (see MessagePort::locallyEntangledPort() for more details).
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        MessagePort* locallyEntangledPort(const ScriptExecutionContext*);
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ~MessagePortChannel();
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        PlatformMessagePortChannel* channel() const { return m_channel.get(); }
1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    private:
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        MessagePortChannel(PassRefPtr<PlatformMessagePortChannel>);
1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RefPtr<PlatformMessagePortChannel> m_channel;
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    };
1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif // MessagePortChannel_h
115