Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / bindings / core / v8 / PostMessage.h
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef PostMessage_h
6 #define PostMessage_h
7
8 #include "bindings/core/v8/ExceptionState.h"
9 #include "bindings/core/v8/SerializedScriptValue.h"
10 #include "bindings/core/v8/V8Binding.h"
11 #include "bindings/core/v8/V8BindingMacros.h"
12 #include "core/dom/MessagePort.h"
13 #include "wtf/ArrayBuffer.h"
14 #include <v8.h>
15
16 namespace blink {
17
18 class ExecutionContext;
19
20 // FIXME: This should be auto-generated by a code generator template.
21 template <class Type>
22 void postMessageMethodCommon(const char* interfaceName, Type* instance, const v8::FunctionCallbackInfo<v8::Value>& info)
23 {
24     ExceptionState exceptionState(ExceptionState::ExecutionContext, "postMessage", interfaceName, info.Holder(), info.GetIsolate());
25     MessagePortArray ports;
26     ArrayBufferArray arrayBuffers;
27     if (info.Length() > 1) {
28         const int transferablesArgIndex = 1;
29         if (!SerializedScriptValue::extractTransferables(info[transferablesArgIndex], transferablesArgIndex, ports, arrayBuffers, exceptionState, info.GetIsolate())) {
30             exceptionState.throwIfNeeded();
31             return;
32         }
33     }
34     RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(info[0], &ports, &arrayBuffers, exceptionState, info.GetIsolate());
35     if (exceptionState.throwIfNeeded())
36         return;
37     // FIXME: Only pass context/exceptionState if instance really requires it.
38     ExecutionContext* context = currentExecutionContext(info.GetIsolate());
39     instance->postMessage(context, message.release(), &ports, exceptionState);
40     exceptionState.throwIfNeeded();
41 }
42
43 } // namespace blink
44
45 #endif // PostMessage_h