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