| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef PostMessage_h |
| #define PostMessage_h |
| |
| #include "bindings/core/v8/ExceptionState.h" |
| #include "bindings/core/v8/SerializedScriptValue.h" |
| #include "bindings/core/v8/V8Binding.h" |
| #include "bindings/core/v8/V8BindingMacros.h" |
| #include "core/dom/DOMArrayBuffer.h" |
| #include "core/dom/MessagePort.h" |
| #include <v8.h> |
| |
| namespace blink { |
| |
| class ExecutionContext; |
| |
| // FIXME: This should be auto-generated by a code generator template. |
| template <class Type> |
| void postMessageMethodCommon(const char* interfaceName, Type* instance, const v8::FunctionCallbackInfo<v8::Value>& info) |
| { |
| ExceptionState exceptionState(ExceptionState::ExecutionContext, "postMessage", interfaceName, info.Holder(), info.GetIsolate()); |
| MessagePortArray ports; |
| ArrayBufferArray arrayBuffers; |
| if (info.Length() > 1) { |
| const int transferablesArgIndex = 1; |
| if (!SerializedScriptValue::extractTransferables(info.GetIsolate(), info[transferablesArgIndex], transferablesArgIndex, ports, arrayBuffers, exceptionState)) { |
| exceptionState.throwIfNeeded(); |
| return; |
| } |
| } |
| RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(info[0], &ports, &arrayBuffers, exceptionState, info.GetIsolate()); |
| if (exceptionState.throwIfNeeded()) |
| return; |
| // FIXME: Only pass context/exceptionState if instance really requires it. |
| ExecutionContext* context = currentExecutionContext(info.GetIsolate()); |
| instance->postMessage(context, message.release(), &ports, exceptionState); |
| exceptionState.throwIfNeeded(); |
| } |
| |
| } // namespace blink |
| |
| #endif // PostMessage_h |