void MessagePort::postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray* ports, ExceptionState& exceptionState) { if (!isEntangled()) return; ASSERT(executionContext()); ASSERT(m_entangledChannel); OwnPtr<MessagePortChannelArray> channels; // Make sure we aren't connected to any of the passed-in ports. if (ports) { for (unsigned i = 0; i < ports->size(); ++i) { MessagePort* dataPort = (*ports)[i].get(); if (dataPort == this) { exceptionState.throwDOMException(DataCloneError, "Port at index " + String::number(i) + " contains the source port."); return; } } channels = MessagePort::disentanglePorts(ports, exceptionState); if (exceptionState.hadException()) return; } blink::WebString messageString = message->toWireString(); OwnPtr<blink::WebMessagePortChannelArray> webChannels = toWebMessagePortChannelArray(channels.release()); m_entangledChannel->postMessage(messageString, webChannels.leakPtr()); }
void MessagePort::postMessage(ExecutionContext* context, PassRefPtr<SerializedScriptValue> message, const MessagePortArray& ports, ExceptionState& exceptionState) { if (!isEntangled()) return; DCHECK(getExecutionContext()); DCHECK(m_entangledChannel); // Make sure we aren't connected to any of the passed-in ports. for (unsigned i = 0; i < ports.size(); ++i) { if (ports[i] == this) { exceptionState.throwDOMException( DataCloneError, "Port at index " + String::number(i) + " contains the source port."); return; } } std::unique_ptr<MessagePortChannelArray> channels = MessagePort::disentanglePorts(context, ports, exceptionState); if (exceptionState.hadException()) return; if (message->containsTransferableArrayBuffer()) getExecutionContext()->addConsoleMessage(ConsoleMessage::create( JSMessageSource, WarningMessageLevel, "MessagePort cannot send an ArrayBuffer as a transferable object yet. " "See http://crbug.com/334408")); WebString messageString = message->toWireString(); std::unique_ptr<WebMessagePortChannelArray> webChannels = toWebMessagePortChannelArray(std::move(channels)); m_entangledChannel->postMessage(messageString, webChannels.release()); }