| Index: Source/bindings/modules/v8/custom/V8ServiceWorkerMessageEventCustom.cpp
|
| diff --git a/Source/bindings/modules/v8/custom/V8ServiceWorkerMessageEventCustom.cpp b/Source/bindings/modules/v8/custom/V8ServiceWorkerMessageEventCustom.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3db1e7514d69d6d0051a198a5005c99837e8dc40
|
| --- /dev/null
|
| +++ b/Source/bindings/modules/v8/custom/V8ServiceWorkerMessageEventCustom.cpp
|
| @@ -0,0 +1,87 @@
|
| +// Copyright 2015 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.
|
| +
|
| +#include "config.h"
|
| +#include "bindings/modules/v8/V8ServiceWorkerMessageEvent.h"
|
| +
|
| +#include "bindings/core/v8/Dictionary.h"
|
| +#include "bindings/core/v8/SerializedScriptValue.h"
|
| +#include "bindings/core/v8/SerializedScriptValueFactory.h"
|
| +#include "bindings/core/v8/V8Binding.h"
|
| +#include "bindings/core/v8/V8DOMWrapper.h"
|
| +#include "bindings/core/v8/V8Event.h"
|
| +#include "bindings/core/v8/V8HiddenValue.h"
|
| +#include "bindings/core/v8/V8MessagePort.h"
|
| +
|
| +namespace blink {
|
| +
|
| +static v8::Local<v8::Value> cacheState(v8::Isolate* isolate, v8::Local<v8::Object> event, v8::Local<v8::Value> data)
|
| +{
|
| + V8HiddenValue::setHiddenValue(isolate, event, V8HiddenValue::data(isolate), data);
|
| + return data;
|
| +}
|
| +
|
| +void V8ServiceWorkerMessageEvent::dataAttributeGetterCustom(const v8::PropertyCallbackInfo<v8::Value>& info)
|
| +{
|
| + ServiceWorkerMessageEvent* event = V8ServiceWorkerMessageEvent::toImpl(info.Holder());
|
| +
|
| + v8::Local<v8::Value> result = V8HiddenValue::getHiddenValue(info.GetIsolate(), info.Holder(), V8HiddenValue::detail(info.GetIsolate()));
|
| +
|
| + if (!result.IsEmpty()) {
|
| + v8SetReturnValue(info, result);
|
| + return;
|
| + }
|
| +
|
| + if (!event->serializedData()) {
|
| + // If we're in an isolated world and the event was created in the main world,
|
| + // we need to find the 'detail' property on the main world wrapper and clone it.
|
| + v8::Local<v8::Value> mainWorldData = V8HiddenValue::getHiddenValueFromMainWorldWrapper(info.GetIsolate(), event, V8HiddenValue::data(info.GetIsolate()));
|
| + if (!mainWorldData.IsEmpty())
|
| + event->setSerializedData(SerializedScriptValueFactory::instance().createAndSwallowExceptions(info.GetIsolate(), mainWorldData));
|
| + }
|
| +
|
| + if (event->serializedData()) {
|
| + result = event->serializedData()->deserialize();
|
| + v8SetReturnValue(info, cacheState(info.GetIsolate(), info.Holder(), result));
|
| + return;
|
| + }
|
| +
|
| + v8SetReturnValue(info, cacheState(info.GetIsolate(), info.Holder(), v8::Null(info.GetIsolate())));
|
| +}
|
| +
|
| +void V8ServiceWorkerMessageEvent::initServiceWorkerMessageEventMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info)
|
| +{
|
| + ExceptionState exceptionState(ExceptionState::ExecutionContext, "initServiceWorkerMessageEvent", "ServiceWorkerMessageEvent", info.Holder(), info.GetIsolate());
|
| + ServiceWorkerMessageEvent* event = V8ServiceWorkerMessageEvent::toImpl(info.Holder());
|
| + TOSTRING_VOID(V8StringResource<>, typeArg, info[0]);
|
| + bool canBubbleArg;
|
| + bool cancelableArg;
|
| + if (!v8Call(info[1]->BooleanValue(info.GetIsolate()->GetCurrentContext()), canBubbleArg)
|
| + || !v8Call(info[2]->BooleanValue(info.GetIsolate()->GetCurrentContext()), cancelableArg))
|
| + return;
|
| + v8::Local<v8::Value> dataArg = info[3];
|
| + TOSTRING_VOID(V8StringResource<>, originArg, info[4]);
|
| + TOSTRING_VOID(V8StringResource<>, lastEventIdArg, info[5]);
|
| + ServiceWorkerOrMessagePort sourceArg;
|
| + V8ServiceWorkerOrMessagePort::toImpl(info.GetIsolate(), info[6], sourceArg, exceptionState);
|
| + if (exceptionState.throwIfNeeded())
|
| + return;
|
| + OwnPtrWillBeRawPtr<MessagePortArray> portArray = nullptr;
|
| + const int portArrayIndex = 7;
|
| + if (!isUndefinedOrNull(info[portArrayIndex])) {
|
| + portArray = adoptPtrWillBeNoop(new MessagePortArray);
|
| + *portArray = toRefPtrWillBeMemberNativeArray<MessagePort, V8MessagePort>(info[portArrayIndex], portArrayIndex + 1, info.GetIsolate(), exceptionState);
|
| + if (exceptionState.throwIfNeeded())
|
| + return;
|
| + }
|
| + event->initServiceWorkerMessageEvent(typeArg, canBubbleArg, cancelableArg, originArg, lastEventIdArg, sourceArg, portArray.release());
|
| +
|
| + if (!dataArg.IsEmpty()) {
|
| + V8HiddenValue::setHiddenValue(info.GetIsolate(), info.Holder(), V8HiddenValue::data(info.GetIsolate()), dataArg);
|
| + if (DOMWrapperWorld::current(info.GetIsolate()).isIsolatedWorld())
|
| + event->setSerializedData(SerializedScriptValueFactory::instance().createAndSwallowExceptions(info.GetIsolate(), dataArg));
|
| + }
|
| +}
|
| +
|
| +} // namespace blink
|
|
|