OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 static_cast<v8::PropertyAttribute>(attribute.attribute)); | 152 static_cast<v8::PropertyAttribute>(attribute.attribute)); |
153 } | 153 } |
154 if (attribute.propertyLocationConfiguration & V8DOMConfiguration::OnInterface) | 154 if (attribute.propertyLocationConfiguration & V8DOMConfiguration::OnInterface) |
155 NOTREACHED(); | 155 NOTREACHED(); |
156 } | 156 } |
157 | 157 |
158 template <class FunctionOrTemplate> | 158 template <class FunctionOrTemplate> |
159 v8::Local<FunctionOrTemplate> createAccessorFunctionOrTemplate( | 159 v8::Local<FunctionOrTemplate> createAccessorFunctionOrTemplate( |
160 v8::Isolate*, | 160 v8::Isolate*, |
161 v8::FunctionCallback, | 161 v8::FunctionCallback, |
162 V8DOMConfiguration::CachedAccessorCallback, | 162 V8DOMConfiguration::CachedPropertyKey, |
163 v8::Local<v8::Value> data, | 163 v8::Local<v8::Value> data, |
164 v8::Local<v8::Signature>, | 164 v8::Local<v8::Signature>, |
165 int length); | 165 int length); |
166 | 166 |
167 template <> | 167 template <> |
168 v8::Local<v8::FunctionTemplate> | 168 v8::Local<v8::FunctionTemplate> |
169 createAccessorFunctionOrTemplate<v8::FunctionTemplate>( | 169 createAccessorFunctionOrTemplate<v8::FunctionTemplate>( |
170 v8::Isolate* isolate, | 170 v8::Isolate* isolate, |
171 v8::FunctionCallback callback, | 171 v8::FunctionCallback callback, |
172 V8DOMConfiguration::CachedAccessorCallback cachedAccessorCallback, | 172 V8DOMConfiguration::CachedPropertyKey cachedPropertyKey, |
173 v8::Local<v8::Value> data, | 173 v8::Local<v8::Value> data, |
174 v8::Local<v8::Signature> signature, | 174 v8::Local<v8::Signature> signature, |
175 int length) { | 175 int length) { |
176 v8::Local<v8::FunctionTemplate> functionTemplate; | 176 v8::Local<v8::FunctionTemplate> functionTemplate; |
177 if (callback) { | 177 if (callback) { |
178 if (cachedAccessorCallback) { | 178 if (cachedPropertyKey) { |
179 functionTemplate = v8::FunctionTemplate::NewWithCache( | 179 functionTemplate = v8::FunctionTemplate::NewWithCache( |
180 isolate, callback, cachedAccessorCallback(isolate), data, signature, | 180 isolate, callback, cachedPropertyKey(isolate), data, signature, |
181 length); | 181 length); |
182 } else { | 182 } else { |
183 functionTemplate = | 183 functionTemplate = |
184 v8::FunctionTemplate::New(isolate, callback, data, signature, length); | 184 v8::FunctionTemplate::New(isolate, callback, data, signature, length); |
185 } | 185 } |
186 | 186 |
187 if (!functionTemplate.IsEmpty()) { | 187 if (!functionTemplate.IsEmpty()) { |
188 functionTemplate->RemovePrototype(); | 188 functionTemplate->RemovePrototype(); |
189 functionTemplate->SetAcceptAnyReceiver(false); | 189 functionTemplate->SetAcceptAnyReceiver(false); |
190 } | 190 } |
191 } | 191 } |
192 return functionTemplate; | 192 return functionTemplate; |
193 } | 193 } |
194 | 194 |
195 template <> | 195 template <> |
196 v8::Local<v8::Function> createAccessorFunctionOrTemplate<v8::Function>( | 196 v8::Local<v8::Function> createAccessorFunctionOrTemplate<v8::Function>( |
197 v8::Isolate* isolate, | 197 v8::Isolate* isolate, |
198 v8::FunctionCallback callback, | 198 v8::FunctionCallback callback, |
199 V8DOMConfiguration::CachedAccessorCallback, | 199 V8DOMConfiguration::CachedPropertyKey, |
200 v8::Local<v8::Value> data, | 200 v8::Local<v8::Value> data, |
201 v8::Local<v8::Signature> signature, | 201 v8::Local<v8::Signature> signature, |
202 int length) { | 202 int length) { |
203 if (!callback) | 203 if (!callback) |
204 return v8::Local<v8::Function>(); | 204 return v8::Local<v8::Function>(); |
205 | 205 |
206 v8::Local<v8::FunctionTemplate> functionTemplate = | 206 v8::Local<v8::FunctionTemplate> functionTemplate = |
207 createAccessorFunctionOrTemplate<v8::FunctionTemplate>( | 207 createAccessorFunctionOrTemplate<v8::FunctionTemplate>( |
208 isolate, callback, nullptr, data, signature, length); | 208 isolate, callback, nullptr, data, signature, length); |
209 if (functionTemplate.IsEmpty()) | 209 if (functionTemplate.IsEmpty()) |
(...skipping 13 matching lines...) Expand all Loading... |
223 v8::Local<ObjectOrTemplate> prototypeOrTemplate, | 223 v8::Local<ObjectOrTemplate> prototypeOrTemplate, |
224 v8::Local<FunctionOrTemplate> interfaceOrTemplate, | 224 v8::Local<FunctionOrTemplate> interfaceOrTemplate, |
225 v8::Local<v8::Signature> signature, | 225 v8::Local<v8::Signature> signature, |
226 const V8DOMConfiguration::AccessorConfiguration& accessor, | 226 const V8DOMConfiguration::AccessorConfiguration& accessor, |
227 const DOMWrapperWorld& world) { | 227 const DOMWrapperWorld& world) { |
228 if (!worldConfigurationApplies(accessor, world)) | 228 if (!worldConfigurationApplies(accessor, world)) |
229 return; | 229 return; |
230 v8::Local<v8::Name> name = v8AtomicString(isolate, accessor.name); | 230 v8::Local<v8::Name> name = v8AtomicString(isolate, accessor.name); |
231 v8::FunctionCallback getterCallback = accessor.getter; | 231 v8::FunctionCallback getterCallback = accessor.getter; |
232 v8::FunctionCallback setterCallback = accessor.setter; | 232 v8::FunctionCallback setterCallback = accessor.setter; |
233 V8DOMConfiguration::CachedAccessorCallback cachedAccessorCallback = nullptr; | 233 V8DOMConfiguration::CachedPropertyKey cachedPropertyKey = nullptr; |
234 if (world.isMainWorld()) { | 234 if (world.isMainWorld()) { |
235 cachedAccessorCallback = accessor.cachedAccessorCallback; | 235 cachedPropertyKey = accessor.cachedPropertyKey; |
236 } | 236 } |
237 | 237 |
238 // Support [LenientThis] by not specifying the signature. V8 does not do | 238 // Support [LenientThis] by not specifying the signature. V8 does not do |
239 // the type checking against holder if no signature is specified. Note that | 239 // the type checking against holder if no signature is specified. Note that |
240 // info.Holder() passed to callbacks will be *unsafe*. | 240 // info.Holder() passed to callbacks will be *unsafe*. |
241 if (accessor.holderCheckConfiguration == V8DOMConfiguration::DoNotCheckHolder) | 241 if (accessor.holderCheckConfiguration == V8DOMConfiguration::DoNotCheckHolder) |
242 signature = v8::Local<v8::Signature>(); | 242 signature = v8::Local<v8::Signature>(); |
243 v8::Local<v8::Value> data = | 243 v8::Local<v8::Value> data = |
244 v8::External::New(isolate, const_cast<WrapperTypeInfo*>(accessor.data)); | 244 v8::External::New(isolate, const_cast<WrapperTypeInfo*>(accessor.data)); |
245 | 245 |
246 DCHECK(accessor.propertyLocationConfiguration); | 246 DCHECK(accessor.propertyLocationConfiguration); |
247 if (accessor.propertyLocationConfiguration & | 247 if (accessor.propertyLocationConfiguration & |
248 (V8DOMConfiguration::OnInstance | V8DOMConfiguration::OnPrototype)) { | 248 (V8DOMConfiguration::OnInstance | V8DOMConfiguration::OnPrototype)) { |
249 v8::Local<FunctionOrTemplate> getter = | 249 v8::Local<FunctionOrTemplate> getter = |
250 createAccessorFunctionOrTemplate<FunctionOrTemplate>( | 250 createAccessorFunctionOrTemplate<FunctionOrTemplate>( |
251 isolate, getterCallback, cachedAccessorCallback, data, signature, | 251 isolate, getterCallback, cachedPropertyKey, data, signature, 0); |
252 0); | |
253 v8::Local<FunctionOrTemplate> setter = | 252 v8::Local<FunctionOrTemplate> setter = |
254 createAccessorFunctionOrTemplate<FunctionOrTemplate>( | 253 createAccessorFunctionOrTemplate<FunctionOrTemplate>( |
255 isolate, setterCallback, nullptr, data, signature, 1); | 254 isolate, setterCallback, nullptr, data, signature, 1); |
256 if (accessor.propertyLocationConfiguration & | 255 if (accessor.propertyLocationConfiguration & |
257 V8DOMConfiguration::OnInstance) { | 256 V8DOMConfiguration::OnInstance) { |
258 instanceOrTemplate->SetAccessorProperty( | 257 instanceOrTemplate->SetAccessorProperty( |
259 name, getter, setter, | 258 name, getter, setter, |
260 static_cast<v8::PropertyAttribute>(accessor.attribute), v8::DEFAULT); | 259 static_cast<v8::PropertyAttribute>(accessor.attribute), v8::DEFAULT); |
261 } | 260 } |
262 if (accessor.propertyLocationConfiguration & | 261 if (accessor.propertyLocationConfiguration & |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 void V8DOMConfiguration::setClassString( | 687 void V8DOMConfiguration::setClassString( |
689 v8::Isolate* isolate, | 688 v8::Isolate* isolate, |
690 v8::Local<v8::ObjectTemplate> objectTemplate, | 689 v8::Local<v8::ObjectTemplate> objectTemplate, |
691 const char* classString) { | 690 const char* classString) { |
692 objectTemplate->Set( | 691 objectTemplate->Set( |
693 v8::Symbol::GetToStringTag(isolate), v8AtomicString(isolate, classString), | 692 v8::Symbol::GetToStringTag(isolate), v8AtomicString(isolate, classString), |
694 static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontEnum)); | 693 static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontEnum)); |
695 } | 694 } |
696 | 695 |
697 } // namespace blink | 696 } // namespace blink |
OLD | NEW |