Index: third_party/WebKit/Source/core/dom/MessagePort.cpp |
diff --git a/third_party/WebKit/Source/core/dom/MessagePort.cpp b/third_party/WebKit/Source/core/dom/MessagePort.cpp |
index 56ba47890cf0f6703713c2acd4eb206008959419..92769beeabaf5aa04f7f95dd3a1e6c23bdf6fa6e 100644 |
--- a/third_party/WebKit/Source/core/dom/MessagePort.cpp |
+++ b/third_party/WebKit/Source/core/dom/MessagePort.cpp |
@@ -66,7 +66,7 @@ MessagePort::~MessagePort() |
m_scriptStateForConversion->disposePerContextData(); |
} |
-void MessagePort::postMessage(ExecutionContext* context, PassRefPtr<SerializedScriptValue> message, const MessagePortArray* ports, ExceptionState& exceptionState) |
+void MessagePort::postMessage(ExecutionContext* context, PassRefPtr<SerializedScriptValue> message, const MessagePortArray& ports, ExceptionState& exceptionState) |
{ |
if (!isEntangled()) |
return; |
@@ -75,18 +75,15 @@ void MessagePort::postMessage(ExecutionContext* context, PassRefPtr<SerializedSc |
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]; |
- if (dataPort == this) { |
- exceptionState.throwDOMException(DataCloneError, "Port at index " + String::number(i) + " contains the source port."); |
- return; |
- } |
- } |
- channels = MessagePort::disentanglePorts(context, ports, exceptionState); |
- if (exceptionState.hadException()) |
+ 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; |
+ } |
} |
+ 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")); |
@@ -223,18 +220,17 @@ bool MessagePort::hasPendingActivity() const |
return m_started && isEntangled(); |
} |
-PassOwnPtr<MessagePortChannelArray> MessagePort::disentanglePorts(ExecutionContext* context, const MessagePortArray* ports, ExceptionState& exceptionState) |
+PassOwnPtr<MessagePortChannelArray> MessagePort::disentanglePorts(ExecutionContext* context, const MessagePortArray& ports, ExceptionState& exceptionState) |
{ |
- if (!ports || !ports->size()) |
+ if (!ports.size()) |
return nullptr; |
- // HeapHashSet used to efficiently check for duplicates in the passed-in array. |
- HeapHashSet<Member<MessagePort>> portSet; |
+ HeapHashSet<Member<MessagePort>> visited; |
// Walk the incoming array - if there are any duplicate ports, or null ports or cloned ports, throw an error (per section 8.3.3 of the HTML5 spec). |
- for (unsigned i = 0; i < ports->size(); ++i) { |
- MessagePort* port = (*ports)[i]; |
- if (!port || port->isNeutered() || portSet.contains(port)) { |
+ for (unsigned i = 0; i < ports.size(); ++i) { |
+ MessagePort* port = ports[i]; |
+ if (!port || port->isNeutered() || visited.contains(port)) { |
String type; |
if (!port) |
type = "null"; |
@@ -245,15 +241,15 @@ PassOwnPtr<MessagePortChannelArray> MessagePort::disentanglePorts(ExecutionConte |
exceptionState.throwDOMException(DataCloneError, "Port at index " + String::number(i) + " is " + type + "."); |
return nullptr; |
} |
- portSet.add(port); |
+ visited.add(port); |
} |
UseCounter::count(context, UseCounter::MessagePortsTransferred); |
// Passed-in ports passed validity checks, so we can disentangle them. |
- OwnPtr<MessagePortChannelArray> portArray = adoptPtr(new MessagePortChannelArray(ports->size())); |
- for (unsigned i = 0; i < ports->size(); ++i) |
- (*portArray)[i] = (*ports)[i]->disentangle(); |
+ OwnPtr<MessagePortChannelArray> portArray = adoptPtr(new MessagePortChannelArray(ports.size())); |
+ for (unsigned i = 0; i < ports.size(); ++i) |
+ (*portArray)[i] = ports[i]->disentangle(); |
return portArray.release(); |
} |