1323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)// found in the LICENSE file.
4323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
5197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#ifndef PostMessage_h
6197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#define PostMessage_h
7323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/SerializedScriptValue.h"
10197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8Binding.h"
11197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8BindingMacros.h"
12323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/dom/MessagePort.h"
13323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "wtf/ArrayBuffer.h"
14197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include <v8.h>
15323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
16c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
17323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
18197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass ExecutionContext;
19197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
20197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// FIXME: This should be auto-generated by a code generator template.
21197021e6b966cfb06891637935ef33fff06433d1Ben Murdochtemplate <class Type>
22197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid postMessageMethodCommon(const char* interfaceName, Type* instance, const v8::FunctionCallbackInfo<v8::Value>& info)
23323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
24197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ExceptionState exceptionState(ExceptionState::ExecutionContext, "postMessage", interfaceName, info.Holder(), info.GetIsolate());
25323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    MessagePortArray ports;
26323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    ArrayBufferArray arrayBuffers;
27323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (info.Length() > 1) {
28323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        const int transferablesArgIndex = 1;
29323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (!SerializedScriptValue::extractTransferables(info[transferablesArgIndex], transferablesArgIndex, ports, arrayBuffers, exceptionState, info.GetIsolate())) {
30323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            exceptionState.throwIfNeeded();
31323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return;
32323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        }
33323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
34323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(info[0], &ports, &arrayBuffers, exceptionState, info.GetIsolate());
35323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (exceptionState.throwIfNeeded())
36323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return;
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // FIXME: Only pass context/exceptionState if instance really requires it.
38323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    ExecutionContext* context = currentExecutionContext(info.GetIsolate());
39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    instance->postMessage(context, message.release(), &ports, exceptionState);
40323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    exceptionState.throwIfNeeded();
41323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
42323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
43c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif // PostMessage_h
46