JSC::JSValue JSMessageEvent::initMessageEvent(JSC::ExecState* exec) { const UString& typeArg = exec->argument(0).toString(exec); bool canBubbleArg = exec->argument(1).toBoolean(exec); bool cancelableArg = exec->argument(2).toBoolean(exec); RefPtr<SerializedScriptValue> dataArg = SerializedScriptValue::create(exec, exec->argument(3)); if (exec->hadException()) return jsUndefined(); const UString& originArg = exec->argument(4).toString(exec); const UString& lastEventIdArg = exec->argument(5).toString(exec); DOMWindow* sourceArg = toDOMWindow(exec->argument(6)); OwnPtr<MessagePortArray> messagePorts; if (!exec->argument(7).isUndefinedOrNull()) { messagePorts = adoptPtr(new MessagePortArray); fillMessagePortArray(exec, exec->argument(7), *messagePorts); if (exec->hadException()) return jsUndefined(); } MessageEvent* event = static_cast<MessageEvent*>(this->impl()); event->initMessageEvent(ustringToAtomicString(typeArg), canBubbleArg, cancelableArg, dataArg.release(), ustringToString(originArg), ustringToString(lastEventIdArg), sourceArg, messagePorts.release()); JSValue result; if (SerializedScriptValue* serializedValue = event->dataAsSerializedScriptValue()) result = serializedValue->deserialize(exec, globalObject(), NonThrowing); else result = jsNull(); m_data.set(exec->globalData(), this, result); return jsUndefined(); }
JSValue JSDOMWindow::postMessage(ExecState* exec) { DOMWindow* window = impl(); DOMWindow* source = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); PassRefPtr<SerializedScriptValue> message = SerializedScriptValue::create(exec, exec->argument(0)); if (exec->hadException()) return jsUndefined(); MessagePortArray messagePorts; if (exec->argumentCount() > 2) fillMessagePortArray(exec, exec->argument(1), messagePorts); if (exec->hadException()) return jsUndefined(); String targetOrigin = valueToStringWithUndefinedOrNullCheck(exec, exec->argument((exec->argumentCount() == 2) ? 1 : 2)); if (exec->hadException()) return jsUndefined(); ExceptionCode ec = 0; window->postMessage(message, &messagePorts, targetOrigin, source, ec); setDOMException(exec, ec); return jsUndefined(); }
static JSC::JSValue handleInitMessageEvent(JSMessageEvent* jsEvent, JSC::ExecState& state) { const String& typeArg = state.argument(0).toString(&state)->value(&state); bool canBubbleArg = state.argument(1).toBoolean(&state); bool cancelableArg = state.argument(2).toBoolean(&state); const String originArg = valueToUSVString(&state, state.argument(4)); const String lastEventIdArg = state.argument(5).toString(&state)->value(&state); DOMWindow* sourceArg = JSDOMWindow::toWrapped(state, state.argument(6)); std::unique_ptr<MessagePortArray> messagePorts; std::unique_ptr<ArrayBufferArray> arrayBuffers; if (!state.argument(7).isUndefinedOrNull()) { messagePorts = std::make_unique<MessagePortArray>(); arrayBuffers = std::make_unique<ArrayBufferArray>(); fillMessagePortArray(state, state.argument(7), *messagePorts, *arrayBuffers); if (state.hadException()) return jsUndefined(); } Deprecated::ScriptValue dataArg(state.vm(), state.argument(3)); if (state.hadException()) return jsUndefined(); MessageEvent& event = jsEvent->wrapped(); event.initMessageEvent(typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, WTFMove(messagePorts)); jsEvent->m_data.set(state.vm(), jsEvent, dataArg.jsValue()); return jsUndefined(); }
static JSC::JSValue handleInitMessageEvent(JSMessageEvent* jsEvent, JSC::ExecState* exec) { const String& typeArg = exec->argument(0).toString(exec)->value(exec); bool canBubbleArg = exec->argument(1).toBoolean(exec); bool cancelableArg = exec->argument(2).toBoolean(exec); const String originArg = exec->argument(4).toString(exec)->value(exec); const String lastEventIdArg = exec->argument(5).toString(exec)->value(exec); DOMWindow* sourceArg = toDOMWindow(exec->argument(6)); std::unique_ptr<MessagePortArray> messagePorts; OwnPtr<ArrayBufferArray> arrayBuffers; if (!exec->argument(7).isUndefinedOrNull()) { messagePorts = std::make_unique<MessagePortArray>(); arrayBuffers = adoptPtr(new ArrayBufferArray); fillMessagePortArray(exec, exec->argument(7), *messagePorts, *arrayBuffers); if (exec->hadException()) return jsUndefined(); } Deprecated::ScriptValue dataArg = Deprecated::ScriptValue(exec->vm(), exec->argument(3)); if (exec->hadException()) return jsUndefined(); MessageEvent& event = jsEvent->impl(); event.initMessageEvent(typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, WTF::move(messagePorts)); jsEvent->m_data.set(exec->vm(), jsEvent, dataArg.jsValue()); return jsUndefined(); }
JSC::JSValue JSMessageEvent::initMessageEvent(JSC::ExecState* exec, const JSC::ArgList& args) { const UString& typeArg = args.at(0).toString(exec); bool canBubbleArg = args.at(1).toBoolean(exec); bool cancelableArg = args.at(2).toBoolean(exec); PassRefPtr<SerializedScriptValue> dataArg = SerializedScriptValue::create(exec, args.at(3)); const UString& originArg = args.at(4).toString(exec); const UString& lastEventIdArg = args.at(5).toString(exec); DOMWindow* sourceArg = toDOMWindow(args.at(6)); OwnPtr<MessagePortArray> messagePorts; if (!args.at(7).isUndefinedOrNull()) { messagePorts = new MessagePortArray(); fillMessagePortArray(exec, args.at(7), *messagePorts); if (exec->hadException()) return jsUndefined(); } MessageEvent* event = static_cast<MessageEvent*>(this->impl()); event->initMessageEvent(ustringToAtomicString(typeArg), canBubbleArg, cancelableArg, dataArg, ustringToString(originArg), ustringToString(lastEventIdArg), sourceArg, messagePorts.release()); return jsUndefined(); }
static JSValue handlePostMessage(DOMWindow* impl, ExecState* exec) { MessagePortArray messagePorts; ArrayBufferArray arrayBuffers; // This function has variable arguments and can be: // Per current spec: // postMessage(message, targetOrigin) // postMessage(message, targetOrigin, {sequence of transferrables}) // Legacy non-standard implementations in webkit allowed: // postMessage(message, {sequence of transferrables}, targetOrigin); int targetOriginArgIndex = 1; if (exec->argumentCount() > 2) { int transferablesArgIndex = 2; if (exec->argument(2).isString()) { targetOriginArgIndex = 2; transferablesArgIndex = 1; } fillMessagePortArray(exec, exec->argument(transferablesArgIndex), messagePorts, arrayBuffers); } if (exec->hadException()) return jsUndefined(); RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(exec, exec->argument(0), &messagePorts, &arrayBuffers); if (exec->hadException()) return jsUndefined(); String targetOrigin = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(targetOriginArgIndex)); if (exec->hadException()) return jsUndefined(); ExceptionCode ec = 0; impl->postMessage(message.release(), &messagePorts, targetOrigin, activeDOMWindow(exec), ec); setDOMException(exec, ec); return jsUndefined(); }
static JSC::JSValue handleInitMessageEvent(JSMessageEvent* jsEvent, JSC::ExecState* exec) { const UString& typeArg = exec->argument(0).toString(exec); bool canBubbleArg = exec->argument(1).toBoolean(exec); bool cancelableArg = exec->argument(2).toBoolean(exec); const UString& originArg = exec->argument(4).toString(exec); const UString& lastEventIdArg = exec->argument(5).toString(exec); DOMWindow* sourceArg = toDOMWindow(exec->argument(6)); OwnPtr<MessagePortArray> messagePorts; if (!exec->argument(7).isUndefinedOrNull()) { messagePorts = adoptPtr(new MessagePortArray); fillMessagePortArray(exec, exec->argument(7), *messagePorts); if (exec->hadException()) return jsUndefined(); } ScriptValue dataArg = ScriptValue(exec->globalData(), exec->argument(3)); if (exec->hadException()) return jsUndefined(); MessageEvent* event = static_cast<MessageEvent*>(jsEvent->impl()); event->initMessageEvent(ustringToAtomicString(typeArg), canBubbleArg, cancelableArg, dataArg, ustringToString(originArg), ustringToString(lastEventIdArg), sourceArg, messagePorts.release()); jsEvent->m_data.set(exec->globalData(), jsEvent, dataArg.jsValue()); return jsUndefined(); }
void JSDictionary::convertValue(ExecState* exec, JSValue value, MessagePortArray& result) { ArrayBufferArray arrayBuffers; fillMessagePortArray(exec, value, result, arrayBuffers); }