Home | History | Annotate | Download | only in custom
      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 #include "config.h"
      6 #include "bindings/modules/v8/V8Client.h"
      7 
      8 #include "bindings/v8/ExceptionMessages.h"
      9 #include "bindings/v8/ExceptionState.h"
     10 #include "bindings/v8/SerializedScriptValue.h"
     11 #include "bindings/v8/V8Binding.h"
     12 #include "core/dom/MessagePort.h"
     13 #include "modules/serviceworkers/ServiceWorker.h"
     14 #include "wtf/ArrayBuffer.h"
     15 
     16 namespace WebCore {
     17 
     18 void V8Client::postMessageMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info)
     19 {
     20     ExceptionState exceptionState(ExceptionState::ExecutionContext, "postMessage", "ServiceWorker", info.Holder(), info.GetIsolate());
     21     Client* client = V8Client::toNative(info.Holder());
     22     MessagePortArray ports;
     23     ArrayBufferArray arrayBuffers;
     24     if (info.Length() > 1) {
     25         const int transferablesArgIndex = 1;
     26         if (!SerializedScriptValue::extractTransferables(info[transferablesArgIndex], transferablesArgIndex, ports, arrayBuffers, exceptionState, info.GetIsolate())) {
     27             exceptionState.throwIfNeeded();
     28             return;
     29         }
     30     }
     31     RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(info[0], &ports, &arrayBuffers, exceptionState, info.GetIsolate());
     32     if (exceptionState.throwIfNeeded())
     33         return;
     34     ExecutionContext* context = currentExecutionContext(info.GetIsolate());
     35     client->postMessage(context, message.release(), &ports, exceptionState);
     36     exceptionState.throwIfNeeded();
     37 }
     38 
     39 } // namespace WebCore
     40