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

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

Issue 2785943002: [Bindings] Simplify V8PrivateProperty::Symbol methods (Closed)
Patch Set: work for comments Created 3 years, 8 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8ServiceWorkerMessageEventInternal_h 5 #ifndef V8ServiceWorkerMessageEventInternal_h
6 #define V8ServiceWorkerMessageEventInternal_h 6 #define V8ServiceWorkerMessageEventInternal_h
7 7
8 #include "bindings/core/v8/SerializedScriptValue.h" 8 #include "bindings/core/v8/SerializedScriptValue.h"
9 #include "bindings/core/v8/SerializedScriptValueFactory.h" 9 #include "bindings/core/v8/SerializedScriptValueFactory.h"
10 #include "bindings/core/v8/V8PrivateProperty.h" 10 #include "bindings/core/v8/V8PrivateProperty.h"
11 11
12 namespace blink { 12 namespace blink {
13 13
14 class V8ServiceWorkerMessageEventInternal { 14 class V8ServiceWorkerMessageEventInternal {
15 public: 15 public:
16 template <typename EventType, typename DictType> 16 template <typename EventType, typename DictType>
17 static void constructorCustom(const v8::FunctionCallbackInfo<v8::Value>&); 17 static void constructorCustom(const v8::FunctionCallbackInfo<v8::Value>&);
18 18
19 template <typename EventType> 19 template <typename EventType>
20 static void dataAttributeGetterCustom( 20 static void dataAttributeGetterCustom(
21 const v8::FunctionCallbackInfo<v8::Value>&); 21 const v8::FunctionCallbackInfo<v8::Value>&);
22 }; 22 };
23 23
24 template <typename EventType, typename DictType> 24 template <typename EventType, typename DictType>
25 void V8ServiceWorkerMessageEventInternal::constructorCustom( 25 void V8ServiceWorkerMessageEventInternal::constructorCustom(
26 const v8::FunctionCallbackInfo<v8::Value>& info) { 26 const v8::FunctionCallbackInfo<v8::Value>& info) {
27 v8::Isolate* isolate = info.GetIsolate();
27 ExceptionState exceptionState( 28 ExceptionState exceptionState(
28 info.GetIsolate(), ExceptionState::ConstructionContext, 29 isolate, ExceptionState::ConstructionContext,
29 V8TypeOf<EventType>::Type::wrapperTypeInfo.interfaceName); 30 V8TypeOf<EventType>::Type::wrapperTypeInfo.interfaceName);
30 if (UNLIKELY(info.Length() < 1)) { 31 if (UNLIKELY(info.Length() < 1)) {
31 exceptionState.throwTypeError( 32 exceptionState.throwTypeError(
32 ExceptionMessages::notEnoughArguments(1, info.Length())); 33 ExceptionMessages::notEnoughArguments(1, info.Length()));
33 return; 34 return;
34 } 35 }
35 36
36 V8StringResource<> type = info[0]; 37 V8StringResource<> type = info[0];
37 if (!type.prepare()) 38 if (!type.prepare())
38 return; 39 return;
39 40
40 DictType eventInitDict; 41 DictType eventInitDict;
41 if (!isUndefinedOrNull(info[1])) { 42 if (!isUndefinedOrNull(info[1])) {
42 if (!info[1]->IsObject()) { 43 if (!info[1]->IsObject()) {
43 exceptionState.throwTypeError( 44 exceptionState.throwTypeError(
44 "parameter 2 ('eventInitDict') is not an object."); 45 "parameter 2 ('eventInitDict') is not an object.");
45 return; 46 return;
46 } 47 }
47 V8TypeOf<DictType>::Type::toImpl(info.GetIsolate(), info[1], eventInitDict, 48 V8TypeOf<DictType>::Type::toImpl(isolate, info[1], eventInitDict,
48 exceptionState); 49 exceptionState);
49 if (exceptionState.hadException()) 50 if (exceptionState.hadException())
50 return; 51 return;
51 } 52 }
52 53
53 EventType* impl = EventType::create(type, eventInitDict); 54 EventType* impl = EventType::create(type, eventInitDict);
54 v8::Local<v8::Object> wrapper = info.Holder(); 55 v8::Local<v8::Object> wrapper = info.Holder();
55 wrapper = impl->associateWithWrapper( 56 wrapper = impl->associateWithWrapper(
56 info.GetIsolate(), &V8TypeOf<EventType>::Type::wrapperTypeInfo, wrapper); 57 isolate, &V8TypeOf<EventType>::Type::wrapperTypeInfo, wrapper);
57 58
58 // TODO(bashi): Workaround for http://crbug.com/529941. We need to store 59 // TODO(bashi): Workaround for http://crbug.com/529941. We need to store
59 // |data| as a private value to avoid cyclic references. 60 // |data| as a private value to avoid cyclic references.
60 if (eventInitDict.hasData()) { 61 if (eventInitDict.hasData()) {
61 v8::Local<v8::Value> v8Data = eventInitDict.data().v8Value(); 62 v8::Local<v8::Value> v8Data = eventInitDict.data().v8Value();
62 V8PrivateProperty::getMessageEventCachedData(info.GetIsolate()) 63 V8PrivateProperty::getMessageEventCachedData(isolate).set(wrapper, v8Data);
63 .set(info.GetIsolate()->GetCurrentContext(), wrapper, v8Data); 64 if (DOMWrapperWorld::current(isolate).isIsolatedWorld()) {
64 if (DOMWrapperWorld::current(info.GetIsolate()).isIsolatedWorld())
65 impl->setSerializedData( 65 impl->setSerializedData(
66 SerializedScriptValue::serializeAndSwallowExceptions( 66 SerializedScriptValue::serializeAndSwallowExceptions(isolate,
67 info.GetIsolate(), v8Data)); 67 v8Data));
68 }
68 } 69 }
69 v8SetReturnValue(info, wrapper); 70 v8SetReturnValue(info, wrapper);
70 } 71 }
71 72
72 template <typename EventType> 73 template <typename EventType>
73 void V8ServiceWorkerMessageEventInternal::dataAttributeGetterCustom( 74 void V8ServiceWorkerMessageEventInternal::dataAttributeGetterCustom(
74 const v8::FunctionCallbackInfo<v8::Value>& info) { 75 const v8::FunctionCallbackInfo<v8::Value>& info) {
75 EventType* event = V8TypeOf<EventType>::Type::toImpl(info.Holder()); 76 EventType* event = V8TypeOf<EventType>::Type::toImpl(info.Holder());
76 v8::Isolate* isolate = info.GetIsolate(); 77 v8::Isolate* isolate = info.GetIsolate();
77 ScriptState* scriptState = ScriptState::current(isolate);
78 auto privateCachedData = 78 auto privateCachedData =
79 V8PrivateProperty::getMessageEventCachedData(isolate); 79 V8PrivateProperty::getMessageEventCachedData(isolate);
80 v8::Local<v8::Value> result = 80 v8::Local<v8::Value> result = privateCachedData.getOrEmpty(info.Holder());
81 privateCachedData.get(scriptState->context(), info.Holder());
82 if (!result.IsEmpty()) { 81 if (!result.IsEmpty()) {
83 v8SetReturnValue(info, result); 82 v8SetReturnValue(info, result);
84 return; 83 return;
85 } 84 }
86 85
87 v8::Local<v8::Value> data; 86 v8::Local<v8::Value> data;
88 if (SerializedScriptValue* serializedValue = event->serializedData()) { 87 if (SerializedScriptValue* serializedValue = event->serializedData()) {
89 MessagePortArray ports = event->ports(); 88 MessagePortArray ports = event->ports();
90 SerializedScriptValue::DeserializeOptions options; 89 SerializedScriptValue::DeserializeOptions options;
91 options.messagePorts = &ports; 90 options.messagePorts = &ports;
92 data = serializedValue->deserialize(isolate, options); 91 data = serializedValue->deserialize(isolate, options);
93 } else if (DOMWrapperWorld::current(isolate).isIsolatedWorld()) { 92 } else if (DOMWrapperWorld::current(isolate).isIsolatedWorld()) {
94 v8::Local<v8::Value> mainWorldData = 93 v8::Local<v8::Value> mainWorldData =
95 privateCachedData.getFromMainWorld(scriptState, event); 94 privateCachedData.getFromMainWorld(event);
96 if (!mainWorldData.IsEmpty()) { 95 if (!mainWorldData.IsEmpty()) {
97 // TODO(bashi): Enter the main world's ScriptState::Scope while 96 // TODO(bashi): Enter the main world's ScriptState::Scope while
98 // serializing the main world's value. 97 // serializing the main world's value.
99 event->setSerializedData( 98 event->setSerializedData(
100 SerializedScriptValue::serializeAndSwallowExceptions( 99 SerializedScriptValue::serializeAndSwallowExceptions(
101 info.GetIsolate(), mainWorldData)); 100 info.GetIsolate(), mainWorldData));
102 data = event->serializedData()->deserialize(isolate); 101 data = event->serializedData()->deserialize(isolate);
103 } 102 }
104 } 103 }
105 if (data.IsEmpty()) 104 if (data.IsEmpty())
106 data = v8::Null(isolate); 105 data = v8::Null(isolate);
107 privateCachedData.set(scriptState->context(), info.Holder(), data); 106 privateCachedData.set(info.Holder(), data);
108 v8SetReturnValue(info, data); 107 v8SetReturnValue(info, data);
109 } 108 }
110 109
111 } // namespace blink 110 } // namespace blink
112 111
113 #endif // V8ServiceWorkerMessageEventInternal_h 112 #endif // V8ServiceWorkerMessageEventInternal_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698