1/* 2 * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved. 3 * Copyright (C) 2011 Google Inc. All Rights Reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include "config.h" 28#include "JSMessagePort.h" 29 30#include "Event.h" 31#include "ExceptionCode.h" 32#include "Frame.h" 33#include "JSDOMBinding.h" 34#include "JSDOMGlobalObject.h" 35#include "JSEvent.h" 36#include "JSEventListener.h" 37#include "JSMessagePortCustom.h" 38#include "MessagePort.h" 39#include <heap/SlotVisitorInlines.h> 40#include <runtime/Error.h> 41#include <runtime/JSArrayBuffer.h> 42#include <wtf/text/AtomicString.h> 43 44using namespace JSC; 45 46namespace WebCore { 47 48void JSMessagePort::visitAdditionalChildren(SlotVisitor& visitor) 49{ 50 // If we have a locally entangled port, we can directly mark it as reachable. Ports that are remotely entangled are marked in-use by markActiveObjectsForContext(). 51 if (MessagePort* port = impl().locallyEntangledPort()) 52 visitor.addOpaqueRoot(port); 53} 54 55JSC::JSValue JSMessagePort::postMessage(JSC::ExecState* exec) 56{ 57 return handlePostMessage(exec, &impl()); 58} 59 60void fillMessagePortArray(JSC::ExecState* exec, JSC::JSValue value, MessagePortArray& portArray, ArrayBufferArray& arrayBuffers) 61{ 62 // Convert from the passed-in JS array-like object to a MessagePortArray. 63 // Also validates the elements per sections 4.1.13 and 4.1.15 of the WebIDL spec and section 8.3.3 of the HTML5 spec. 64 if (value.isUndefinedOrNull()) { 65 portArray.resize(0); 66 arrayBuffers.resize(0); 67 return; 68 } 69 70 // Validation of sequence types, per WebIDL spec 4.1.13. 71 unsigned length = 0; 72 JSObject* object = toJSSequence(exec, value, length); 73 if (exec->hadException()) 74 return; 75 76 for (unsigned i = 0 ; i < length; ++i) { 77 JSValue value = object->get(exec, i); 78 if (exec->hadException()) 79 return; 80 // Validation of non-null objects, per HTML5 spec 10.3.3. 81 if (value.isUndefinedOrNull()) { 82 setDOMException(exec, INVALID_STATE_ERR); 83 return; 84 } 85 86 // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. 87 RefPtr<MessagePort> port = toMessagePort(value); 88 if (port) { 89 // Check for duplicate ports. 90 if (portArray.contains(port)) { 91 setDOMException(exec, INVALID_STATE_ERR); 92 return; 93 } 94 portArray.append(port.release()); 95 } else { 96 RefPtr<ArrayBuffer> arrayBuffer = toArrayBuffer(value); 97 if (arrayBuffer) 98 arrayBuffers.append(arrayBuffer); 99 else { 100 throwTypeError(exec); 101 return; 102 } 103 } 104 } 105} 106 107} // namespace WebCore 108