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>
39dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h>
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/PassOwnPtr.h>
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/PassRefPtr.h>
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/RefCounted.h>
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/RefPtr.h>
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore {
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class MessagePort;
48231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class MessagePortChannel;
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class PlatformMessagePortChannel;
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class ScriptExecutionContext;
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class SerializedScriptValue;
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.
58ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    class MessagePortChannel {
59ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        WTF_MAKE_NONCOPYABLE(MessagePortChannel); WTF_MAKE_FAST_ALLOCATED;
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    public:
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static void createChannel(PassRefPtr<MessagePort>, PassRefPtr<MessagePort>);
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Creates a new wrapper for the passed channel.
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static PassOwnPtr<MessagePortChannel> create(PassRefPtr<PlatformMessagePortChannel>);
650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
66d0825bca7fe65beaee391d30da42e937db621564Steve 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).
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Returns false if the entanglement failed because the port was closed.
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool entangleIfOpen(MessagePort*);
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben 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.
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void disentangle();
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Closes the port (ensures that no further messages can be added to either queue).
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void close();
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Used by MessagePort.postMessage() to prevent callers from passing a port's own entangled port.
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool isConnectedTo(MessagePort*);
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Returns true if the proxy currently contains messages for this port.
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool hasPendingActivity();
810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
82ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        class EventData {
83ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            WTF_MAKE_NONCOPYABLE(EventData); WTF_MAKE_FAST_ALLOCATED;
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        public:
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            static PassOwnPtr<EventData> create(PassRefPtr<SerializedScriptValue>, PassOwnPtr<MessagePortChannelArray>);
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            SerializedScriptValue* message() { return m_message.get(); }
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            PassOwnPtr<MessagePortChannelArray> channels() { return m_channels.release(); }
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        private:
91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            EventData(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray>);
92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            RefPtr<SerializedScriptValue> m_message;
93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            OwnPtr<MessagePortChannelArray> m_channels;
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        };
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Sends a message and optional cloned port to the remote port.
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void postMessageToRemote(PassOwnPtr<EventData>);
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Extracts a message from the message queue for this port.
1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool tryGetMessageFromRemote(OwnPtr<EventData>&);
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Returns the entangled port if run by the same thread (see MessagePort::locallyEntangledPort() for more details).
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        MessagePort* locallyEntangledPort(const ScriptExecutionContext*);
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ~MessagePortChannel();
1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        PlatformMessagePortChannel* channel() const { return m_channel.get(); }
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    private:
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        MessagePortChannel(PassRefPtr<PlatformMessagePortChannel>);
1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RefPtr<PlatformMessagePortChannel> m_channel;
1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    };
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore
1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif // MessagePortChannel_h
117