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