Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: third_party/WebKit/Source/bindings/modules/v8/V8ServiceWorkerMessageEventInternal.h

Issue 2837353003: Remove remaining traces of ServiceWorkerMessageEvent (Closed)
Patch Set: include V8PrivateProperty.h Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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 V8ServiceWorkerMessageEventInternal_h
6 #define V8ServiceWorkerMessageEventInternal_h
7
8 #include "bindings/core/v8/SerializedScriptValue.h"
9 #include "bindings/core/v8/SerializedScriptValueFactory.h"
10 #include "bindings/core/v8/V8PrivateProperty.h"
11
12 namespace blink {
13
14 class V8ServiceWorkerMessageEventInternal {
15 public:
16 template <typename EventType, typename DictType>
17 static void ConstructorCustom(const v8::FunctionCallbackInfo<v8::Value>&);
18
19 template <typename EventType>
20 static void DataAttributeGetterCustom(
21 const v8::FunctionCallbackInfo<v8::Value>&);
22 };
23
24 template <typename EventType, typename DictType>
25 void V8ServiceWorkerMessageEventInternal::ConstructorCustom(
26 const v8::FunctionCallbackInfo<v8::Value>& info) {
27 v8::Isolate* isolate = info.GetIsolate();
28 ExceptionState exception_state(
29 isolate, ExceptionState::kConstructionContext,
30 V8TypeOf<EventType>::Type::wrapperTypeInfo.interface_name);
31 if (UNLIKELY(info.Length() < 1)) {
32 exception_state.ThrowTypeError(
33 ExceptionMessages::NotEnoughArguments(1, info.Length()));
34 return;
35 }
36
37 V8StringResource<> type = info[0];
38 if (!type.Prepare())
39 return;
40
41 DictType event_init_dict;
42 if (!IsUndefinedOrNull(info[1])) {
43 if (!info[1]->IsObject()) {
44 exception_state.ThrowTypeError(
45 "parameter 2 ('eventInitDict') is not an object.");
46 return;
47 }
48 V8TypeOf<DictType>::Type::toImpl(isolate, info[1], event_init_dict,
49 exception_state);
50 if (exception_state.HadException())
51 return;
52 }
53
54 EventType* impl = EventType::Create(type, event_init_dict);
55 v8::Local<v8::Object> wrapper = info.Holder();
56 wrapper = impl->AssociateWithWrapper(
57 isolate, &V8TypeOf<EventType>::Type::wrapperTypeInfo, wrapper);
58
59 // TODO(bashi): Workaround for http://crbug.com/529941. We need to store
60 // |data| as a private value to avoid cyclic references.
61 if (event_init_dict.hasData()) {
62 v8::Local<v8::Value> v8_data = event_init_dict.data().V8Value();
63 V8PrivateProperty::GetMessageEventCachedData(isolate).Set(wrapper, v8_data);
64 if (DOMWrapperWorld::Current(isolate).IsIsolatedWorld()) {
65 impl->SetSerializedData(
66 SerializedScriptValue::SerializeAndSwallowExceptions(isolate,
67 v8_data));
68 }
69 }
70 V8SetReturnValue(info, wrapper);
71 }
72
73 template <typename EventType>
74 void V8ServiceWorkerMessageEventInternal::DataAttributeGetterCustom(
75 const v8::FunctionCallbackInfo<v8::Value>& info) {
76 EventType* event = V8TypeOf<EventType>::Type::toImpl(info.Holder());
77 v8::Isolate* isolate = info.GetIsolate();
78 auto private_cached_data =
79 V8PrivateProperty::GetMessageEventCachedData(isolate);
80 v8::Local<v8::Value> result = private_cached_data.GetOrEmpty(info.Holder());
81 if (!result.IsEmpty()) {
82 V8SetReturnValue(info, result);
83 return;
84 }
85
86 v8::Local<v8::Value> data;
87 if (SerializedScriptValue* serialized_value = event->SerializedData()) {
88 MessagePortArray ports = event->ports();
89 SerializedScriptValue::DeserializeOptions options;
90 options.message_ports = &ports;
91 data = serialized_value->Deserialize(isolate, options);
92 } else if (DOMWrapperWorld::Current(isolate).IsIsolatedWorld()) {
93 v8::Local<v8::Value> main_world_data =
94 private_cached_data.GetFromMainWorld(event);
95 if (!main_world_data.IsEmpty()) {
96 // TODO(bashi): Enter the main world's ScriptState::Scope while
97 // serializing the main world's value.
98 event->SetSerializedData(
99 SerializedScriptValue::SerializeAndSwallowExceptions(
100 info.GetIsolate(), main_world_data));
101 data = event->SerializedData()->Deserialize(isolate);
102 }
103 }
104 if (data.IsEmpty())
105 data = v8::Null(isolate);
106 private_cached_data.Set(info.Holder(), data);
107 V8SetReturnValue(info, data);
108 }
109
110 } // namespace blink
111
112 #endif // V8ServiceWorkerMessageEventInternal_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698