| OLD | NEW | 
|    1 // Copyright 2014 The Chromium Authors. All rights reserved. |    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 |    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 ToV8_h |    5 #ifndef ToV8_h | 
|    6 #define ToV8_h |    6 #define ToV8_h | 
|    7  |    7  | 
|    8 // toV8() provides C++ -> V8 conversion. Note that toV8() can return an empty |    8 // toV8() provides C++ -> V8 conversion. Note that toV8() can return an empty | 
|    9 // handle. Call sites must check IsEmpty() before using return value. |    9 // handle. Call sites must check IsEmpty() before using return value. | 
|   10  |   10  | 
|   11 #include "bindings/core/v8/DOMDataStore.h" |   11 #include "bindings/core/v8/DOMDataStore.h" | 
|   12 #include "bindings/core/v8/ScriptValue.h" |   12 #include "bindings/core/v8/ScriptValue.h" | 
|   13 #include "bindings/core/v8/ScriptWrappable.h" |   13 #include "bindings/core/v8/ScriptWrappable.h" | 
|   14 #include "bindings/core/v8/V8Binding.h" |   14 #include "bindings/core/v8/V8Binding.h" | 
|   15 #include "core/CoreExport.h" |   15 #include "core/CoreExport.h" | 
|   16 #include "platform/heap/Handle.h" |   16 #include "platform/heap/Handle.h" | 
|   17 #include "wtf/Forward.h" |   17 #include "wtf/Forward.h" | 
|   18 #include <v8.h> |   18 #include <v8.h> | 
|   19  |   19  | 
|   20 namespace blink { |   20 namespace blink { | 
|   21  |   21  | 
|   22 class DOMWindow; |   22 class DOMWindow; | 
|   23 class Dictionary; |   23 class Dictionary; | 
|   24 class EventTarget; |   24 class EventTarget; | 
|   25 class WorkerGlobalScope; |   25 class WorkerGlobalScope; | 
|   26  |   26  | 
|   27 // ScriptWrappable |   27 // ScriptWrappable | 
|   28  |   28  | 
|   29 inline v8::Handle<v8::Value> toV8(ScriptWrappable* impl, v8::Handle<v8::Object> 
     creationContext, v8::Isolate* isolate) |   29 inline v8::Local<v8::Value> toV8(ScriptWrappable* impl, v8::Local<v8::Object> cr
     eationContext, v8::Isolate* isolate) | 
|   30 { |   30 { | 
|   31     if (UNLIKELY(!impl)) |   31     if (UNLIKELY(!impl)) | 
|   32         return v8::Null(isolate); |   32         return v8::Null(isolate); | 
|   33     v8::Handle<v8::Value> wrapper = DOMDataStore::getWrapper(impl, isolate); |   33     v8::Local<v8::Value> wrapper = DOMDataStore::getWrapper(impl, isolate); | 
|   34     if (!wrapper.IsEmpty()) |   34     if (!wrapper.IsEmpty()) | 
|   35         return wrapper; |   35         return wrapper; | 
|   36  |   36  | 
|   37     return impl->wrap(creationContext, isolate); |   37     return impl->wrap(creationContext, isolate); | 
|   38 } |   38 } | 
|   39  |   39  | 
|   40 inline v8::Handle<v8::Value> toV8(Node* impl, v8::Handle<v8::Object> creationCon
     text, v8::Isolate* isolate) |   40 inline v8::Local<v8::Value> toV8(Node* impl, v8::Local<v8::Object> creationConte
     xt, v8::Isolate* isolate) | 
|   41 { |   41 { | 
|   42     if (UNLIKELY(!impl)) |   42     if (UNLIKELY(!impl)) | 
|   43         return v8::Null(isolate); |   43         return v8::Null(isolate); | 
|   44     v8::Handle<v8::Value> wrapper = DOMDataStore::getWrapper(impl, isolate); |   44     v8::Local<v8::Value> wrapper = DOMDataStore::getWrapper(impl, isolate); | 
|   45     if (!wrapper.IsEmpty()) |   45     if (!wrapper.IsEmpty()) | 
|   46         return wrapper; |   46         return wrapper; | 
|   47  |   47  | 
|   48     return ScriptWrappable::fromNode(impl)->wrap(creationContext, isolate); |   48     return ScriptWrappable::fromNode(impl)->wrap(creationContext, isolate); | 
|   49 } |   49 } | 
|   50  |   50  | 
|   51 // Special versions for DOMWindow, WorkerGlobalScope and EventTarget |   51 // Special versions for DOMWindow, WorkerGlobalScope and EventTarget | 
|   52  |   52  | 
|   53 CORE_EXPORT v8::Handle<v8::Value> toV8(DOMWindow*, v8::Handle<v8::Object> creati
     onContext, v8::Isolate*); |   53 CORE_EXPORT v8::Local<v8::Value> toV8(DOMWindow*, v8::Local<v8::Object> creation
     Context, v8::Isolate*); | 
|   54 CORE_EXPORT v8::Handle<v8::Value> toV8(EventTarget*, v8::Handle<v8::Object> crea
     tionContext, v8::Isolate*); |   54 CORE_EXPORT v8::Local<v8::Value> toV8(EventTarget*, v8::Local<v8::Object> creati
     onContext, v8::Isolate*); | 
|   55 v8::Handle<v8::Value> toV8(WorkerGlobalScope*, v8::Handle<v8::Object> creationCo
     ntext, v8::Isolate*); |   55 v8::Local<v8::Value> toV8(WorkerGlobalScope*, v8::Local<v8::Object> creationCont
     ext, v8::Isolate*); | 
|   56  |   56  | 
|   57 // PassRefPtr, RawPtr and RefPtr |   57 // PassRefPtr, RawPtr and RefPtr | 
|   58  |   58  | 
|   59 template<typename T> |   59 template<typename T> | 
|   60 inline v8::Handle<v8::Value> toV8(PassRefPtr<T> impl, v8::Handle<v8::Object> cre
     ationContext, v8::Isolate* isolate) |   60 inline v8::Local<v8::Value> toV8(PassRefPtr<T> impl, v8::Local<v8::Object> creat
     ionContext, v8::Isolate* isolate) | 
|   61 { |   61 { | 
|   62     return toV8(impl.get(), creationContext, isolate); |   62     return toV8(impl.get(), creationContext, isolate); | 
|   63 } |   63 } | 
|   64  |   64  | 
|   65 template<typename T> |   65 template<typename T> | 
|   66 inline v8::Handle<v8::Value> toV8(RawPtr<T> impl, v8::Handle<v8::Object> creatio
     nContext, v8::Isolate* isolate) |   66 inline v8::Local<v8::Value> toV8(RawPtr<T> impl, v8::Local<v8::Object> creationC
     ontext, v8::Isolate* isolate) | 
|   67 { |   67 { | 
|   68     return toV8(impl.get(), creationContext, isolate); |   68     return toV8(impl.get(), creationContext, isolate); | 
|   69 } |   69 } | 
|   70  |   70  | 
|   71 template<typename T> |   71 template<typename T> | 
|   72 inline v8::Handle<v8::Value> toV8(const RefPtr<T>& impl, v8::Handle<v8::Object> 
     creationContext, v8::Isolate* isolate) |   72 inline v8::Local<v8::Value> toV8(const RefPtr<T>& impl, v8::Local<v8::Object> cr
     eationContext, v8::Isolate* isolate) | 
|   73 { |   73 { | 
|   74     return toV8(impl.get(), creationContext, isolate); |   74     return toV8(impl.get(), creationContext, isolate); | 
|   75 } |   75 } | 
|   76  |   76  | 
|   77 // Primitives |   77 // Primitives | 
|   78  |   78  | 
|   79 inline v8::Handle<v8::Value> toV8(const String& value, v8::Handle<v8::Object> cr
     eationContext, v8::Isolate* isolate) |   79 inline v8::Local<v8::Value> toV8(const String& value, v8::Local<v8::Object> crea
     tionContext, v8::Isolate* isolate) | 
|   80 { |   80 { | 
|   81     return v8String(isolate, value); |   81     return v8String(isolate, value); | 
|   82 } |   82 } | 
|   83  |   83  | 
|   84 inline v8::Handle<v8::Value> toV8(const char* value, v8::Handle<v8::Object> crea
     tionContext, v8::Isolate* isolate) |   84 inline v8::Local<v8::Value> toV8(const char* value, v8::Local<v8::Object> creati
     onContext, v8::Isolate* isolate) | 
|   85 { |   85 { | 
|   86     return v8String(isolate, value); |   86     return v8String(isolate, value); | 
|   87 } |   87 } | 
|   88  |   88  | 
|   89 template<size_t sizeOfValue> |   89 template<size_t sizeOfValue> | 
|   90 inline v8::Handle<v8::Value> toV8SignedIntegerInternal(int64_t value, v8::Isolat
     e*); |   90 inline v8::Local<v8::Value> toV8SignedIntegerInternal(int64_t value, v8::Isolate
     *); | 
|   91  |   91  | 
|   92 template<> |   92 template<> | 
|   93 inline v8::Handle<v8::Value> toV8SignedIntegerInternal<4>(int64_t value, v8::Iso
     late* isolate) |   93 inline v8::Local<v8::Value> toV8SignedIntegerInternal<4>(int64_t value, v8::Isol
     ate* isolate) | 
|   94 { |   94 { | 
|   95     return v8::Integer::New(isolate, static_cast<int32_t>(value)); |   95     return v8::Integer::New(isolate, static_cast<int32_t>(value)); | 
|   96 } |   96 } | 
|   97  |   97  | 
|   98 template<> |   98 template<> | 
|   99 inline v8::Handle<v8::Value> toV8SignedIntegerInternal<8>(int64_t value, v8::Iso
     late* isolate) |   99 inline v8::Local<v8::Value> toV8SignedIntegerInternal<8>(int64_t value, v8::Isol
     ate* isolate) | 
|  100 { |  100 { | 
|  101     int32_t valueIn32Bit = static_cast<int32_t>(value); |  101     int32_t valueIn32Bit = static_cast<int32_t>(value); | 
|  102     if (valueIn32Bit == value) |  102     if (valueIn32Bit == value) | 
|  103         return v8::Integer::New(isolate, value); |  103         return v8::Integer::New(isolate, value); | 
|  104     // V8 doesn't have a 64-bit integer implementation. |  104     // V8 doesn't have a 64-bit integer implementation. | 
|  105     return v8::Number::New(isolate, value); |  105     return v8::Number::New(isolate, value); | 
|  106 } |  106 } | 
|  107  |  107  | 
|  108 template<size_t sizeOfValue> |  108 template<size_t sizeOfValue> | 
|  109 inline v8::Handle<v8::Value> toV8UnsignedIntegerInternal(uint64_t value, v8::Iso
     late*); |  109 inline v8::Local<v8::Value> toV8UnsignedIntegerInternal(uint64_t value, v8::Isol
     ate*); | 
|  110  |  110  | 
|  111 template<> |  111 template<> | 
|  112 inline v8::Handle<v8::Value> toV8UnsignedIntegerInternal<4>(uint64_t value, v8::
     Isolate* isolate) |  112 inline v8::Local<v8::Value> toV8UnsignedIntegerInternal<4>(uint64_t value, v8::I
     solate* isolate) | 
|  113 { |  113 { | 
|  114     return v8::Integer::NewFromUnsigned(isolate, static_cast<uint32_t>(value)); |  114     return v8::Integer::NewFromUnsigned(isolate, static_cast<uint32_t>(value)); | 
|  115 } |  115 } | 
|  116  |  116  | 
|  117 template<> |  117 template<> | 
|  118 inline v8::Handle<v8::Value> toV8UnsignedIntegerInternal<8>(uint64_t value, v8::
     Isolate* isolate) |  118 inline v8::Local<v8::Value> toV8UnsignedIntegerInternal<8>(uint64_t value, v8::I
     solate* isolate) | 
|  119 { |  119 { | 
|  120     uint32_t valueIn32Bit = static_cast<uint32_t>(value); |  120     uint32_t valueIn32Bit = static_cast<uint32_t>(value); | 
|  121     if (valueIn32Bit == value) |  121     if (valueIn32Bit == value) | 
|  122         return v8::Integer::NewFromUnsigned(isolate, value); |  122         return v8::Integer::NewFromUnsigned(isolate, value); | 
|  123     // V8 doesn't have a 64-bit integer implementation. |  123     // V8 doesn't have a 64-bit integer implementation. | 
|  124     return v8::Number::New(isolate, value); |  124     return v8::Number::New(isolate, value); | 
|  125 } |  125 } | 
|  126  |  126  | 
|  127 inline v8::Handle<v8::Value> toV8(int value, v8::Handle<v8::Object> creationCont
     ext, v8::Isolate* isolate) |  127 inline v8::Local<v8::Value> toV8(int value, v8::Local<v8::Object> creationContex
     t, v8::Isolate* isolate) | 
|  128 { |  128 { | 
|  129     return toV8SignedIntegerInternal<sizeof value>(value, isolate); |  129     return toV8SignedIntegerInternal<sizeof value>(value, isolate); | 
|  130 } |  130 } | 
|  131  |  131  | 
|  132 inline v8::Handle<v8::Value> toV8(long value, v8::Handle<v8::Object> creationCon
     text, v8::Isolate* isolate) |  132 inline v8::Local<v8::Value> toV8(long value, v8::Local<v8::Object> creationConte
     xt, v8::Isolate* isolate) | 
|  133 { |  133 { | 
|  134     return toV8SignedIntegerInternal<sizeof value>(value, isolate); |  134     return toV8SignedIntegerInternal<sizeof value>(value, isolate); | 
|  135 } |  135 } | 
|  136  |  136  | 
|  137 inline v8::Handle<v8::Value> toV8(long long value, v8::Handle<v8::Object> creati
     onContext, v8::Isolate* isolate) |  137 inline v8::Local<v8::Value> toV8(long long value, v8::Local<v8::Object> creation
     Context, v8::Isolate* isolate) | 
|  138 { |  138 { | 
|  139     return toV8SignedIntegerInternal<sizeof value>(value, isolate); |  139     return toV8SignedIntegerInternal<sizeof value>(value, isolate); | 
|  140 } |  140 } | 
|  141  |  141  | 
|  142 inline v8::Handle<v8::Value> toV8(unsigned value, v8::Handle<v8::Object> creatio
     nContext, v8::Isolate* isolate) |  142 inline v8::Local<v8::Value> toV8(unsigned value, v8::Local<v8::Object> creationC
     ontext, v8::Isolate* isolate) | 
|  143 { |  143 { | 
|  144     return toV8UnsignedIntegerInternal<sizeof value>(value, isolate); |  144     return toV8UnsignedIntegerInternal<sizeof value>(value, isolate); | 
|  145 } |  145 } | 
|  146  |  146  | 
|  147 inline v8::Handle<v8::Value> toV8(unsigned long value, v8::Handle<v8::Object> cr
     eationContext, v8::Isolate* isolate) |  147 inline v8::Local<v8::Value> toV8(unsigned long value, v8::Local<v8::Object> crea
     tionContext, v8::Isolate* isolate) | 
|  148 { |  148 { | 
|  149     return toV8UnsignedIntegerInternal<sizeof value>(value, isolate); |  149     return toV8UnsignedIntegerInternal<sizeof value>(value, isolate); | 
|  150 } |  150 } | 
|  151  |  151  | 
|  152 inline v8::Handle<v8::Value> toV8(unsigned long long value, v8::Handle<v8::Objec
     t> creationContext, v8::Isolate* isolate) |  152 inline v8::Local<v8::Value> toV8(unsigned long long value, v8::Local<v8::Object>
      creationContext, v8::Isolate* isolate) | 
|  153 { |  153 { | 
|  154     return toV8UnsignedIntegerInternal<sizeof value>(value, isolate); |  154     return toV8UnsignedIntegerInternal<sizeof value>(value, isolate); | 
|  155 } |  155 } | 
|  156  |  156  | 
|  157 inline v8::Handle<v8::Value> toV8(double value, v8::Handle<v8::Object> creationC
     ontext, v8::Isolate* isolate) |  157 inline v8::Local<v8::Value> toV8(double value, v8::Local<v8::Object> creationCon
     text, v8::Isolate* isolate) | 
|  158 { |  158 { | 
|  159     return v8::Number::New(isolate, value); |  159     return v8::Number::New(isolate, value); | 
|  160 } |  160 } | 
|  161  |  161  | 
|  162 inline v8::Handle<v8::Value> toV8(bool value, v8::Handle<v8::Object> creationCon
     text, v8::Isolate* isolate) |  162 inline v8::Local<v8::Value> toV8(bool value, v8::Local<v8::Object> creationConte
     xt, v8::Isolate* isolate) | 
|  163 { |  163 { | 
|  164     return v8::Boolean::New(isolate, value); |  164     return v8::Boolean::New(isolate, value); | 
|  165 } |  165 } | 
|  166  |  166  | 
|  167 // Identity operator |  167 // Identity operator | 
|  168  |  168  | 
|  169 inline v8::Handle<v8::Value> toV8(v8::Handle<v8::Value> value, v8::Handle<v8::Ob
     ject> creationContext, v8::Isolate*) |  169 inline v8::Local<v8::Value> toV8(v8::Local<v8::Value> value, v8::Local<v8::Objec
     t> creationContext, v8::Isolate*) | 
|  170 { |  170 { | 
|  171     return value; |  171     return value; | 
|  172 } |  172 } | 
|  173  |  173  | 
|  174 // Undefined |  174 // Undefined | 
|  175  |  175  | 
|  176 struct ToV8UndefinedGenerator { }; // Used only for having toV8 return v8::Undef
     ined. |  176 struct ToV8UndefinedGenerator { }; // Used only for having toV8 return v8::Undef
     ined. | 
|  177  |  177  | 
|  178 inline v8::Handle<v8::Value> toV8(const ToV8UndefinedGenerator&  value, v8::Hand
     le<v8::Object> creationContext, v8::Isolate* isolate) |  178 inline v8::Local<v8::Value> toV8(const ToV8UndefinedGenerator&  value, v8::Local
     <v8::Object> creationContext, v8::Isolate* isolate) | 
|  179 { |  179 { | 
|  180     return v8::Undefined(isolate); |  180     return v8::Undefined(isolate); | 
|  181 } |  181 } | 
|  182  |  182  | 
|  183 // ScriptValue |  183 // ScriptValue | 
|  184  |  184  | 
|  185 inline v8::Handle<v8::Value> toV8(const ScriptValue& value, v8::Handle<v8::Objec
     t> creationContext, v8::Isolate*) |  185 inline v8::Local<v8::Value> toV8(const ScriptValue& value, v8::Local<v8::Object>
      creationContext, v8::Isolate*) | 
|  186 { |  186 { | 
|  187     return value.v8Value(); |  187     return value.v8Value(); | 
|  188 } |  188 } | 
|  189  |  189  | 
|  190 // Dictionary |  190 // Dictionary | 
|  191  |  191  | 
|  192 inline v8::Handle<v8::Value> toV8(const Dictionary& value, v8::Handle<v8::Object
     > creationContext, v8::Isolate*) |  192 inline v8::Local<v8::Value> toV8(const Dictionary& value, v8::Local<v8::Object> 
     creationContext, v8::Isolate*) | 
|  193 { |  193 { | 
|  194     RELEASE_ASSERT_NOT_REACHED(); |  194     RELEASE_ASSERT_NOT_REACHED(); | 
|  195     return v8::Handle<v8::Value>(); |  195     return v8::Local<v8::Value>(); | 
|  196 } |  196 } | 
|  197  |  197  | 
|  198 // Array |  198 // Array | 
|  199  |  199  | 
|  200 template<typename Sequence> |  200 template<typename Sequence> | 
|  201 inline v8::Handle<v8::Value> toV8SequenceInternal(const Sequence& sequence, v8::
     Handle<v8::Object> creationContext, v8::Isolate* isolate) |  201 inline v8::Local<v8::Value> toV8SequenceInternal(const Sequence& sequence, v8::L
     ocal<v8::Object> creationContext, v8::Isolate* isolate) | 
|  202 { |  202 { | 
|  203     v8::Local<v8::Array> array = v8::Array::New(isolate, sequence.size()); |  203     v8::Local<v8::Array> array = v8::Array::New(isolate, sequence.size()); | 
|  204     uint32_t index = 0; |  204     uint32_t index = 0; | 
|  205     typename Sequence::const_iterator end = sequence.end(); |  205     typename Sequence::const_iterator end = sequence.end(); | 
|  206     for (typename Sequence::const_iterator iter = sequence.begin(); iter != end;
      ++iter) { |  206     for (typename Sequence::const_iterator iter = sequence.begin(); iter != end;
      ++iter) { | 
|  207         v8::Local<v8::Value> value = toV8(*iter, creationContext, isolate); |  207         v8::Local<v8::Value> value = toV8(*iter, creationContext, isolate); | 
|  208         if (value.IsEmpty()) |  208         if (value.IsEmpty()) | 
|  209             value = v8::Undefined(isolate); |  209             value = v8::Undefined(isolate); | 
|  210         array->Set(v8::Integer::New(isolate, index++), value); |  210         array->Set(v8::Integer::New(isolate, index++), value); | 
|  211     } |  211     } | 
|  212     return array; |  212     return array; | 
|  213 } |  213 } | 
|  214  |  214  | 
|  215 template<typename T, size_t inlineCapacity> |  215 template<typename T, size_t inlineCapacity> | 
|  216 inline v8::Handle<v8::Value> toV8(const Vector<T, inlineCapacity>& value, v8::Ha
     ndle<v8::Object> creationContext, v8::Isolate* isolate) |  216 inline v8::Local<v8::Value> toV8(const Vector<T, inlineCapacity>& value, v8::Loc
     al<v8::Object> creationContext, v8::Isolate* isolate) | 
|  217 { |  217 { | 
|  218     return toV8SequenceInternal(value, creationContext, isolate); |  218     return toV8SequenceInternal(value, creationContext, isolate); | 
|  219 } |  219 } | 
|  220  |  220  | 
|  221 template<typename T, size_t inlineCapacity> |  221 template<typename T, size_t inlineCapacity> | 
|  222 inline v8::Handle<v8::Value> toV8(const HeapVector<T, inlineCapacity>& value, v8
     ::Handle<v8::Object> creationContext, v8::Isolate* isolate) |  222 inline v8::Local<v8::Value> toV8(const HeapVector<T, inlineCapacity>& value, v8:
     :Local<v8::Object> creationContext, v8::Isolate* isolate) | 
|  223 { |  223 { | 
|  224     return toV8SequenceInternal(value, creationContext, isolate); |  224     return toV8SequenceInternal(value, creationContext, isolate); | 
|  225 } |  225 } | 
|  226  |  226  | 
|  227 template<typename T> |  227 template<typename T> | 
|  228 inline v8::Handle<v8::Value> toV8(const Vector<std::pair<String, T>>& value, v8:
     :Handle<v8::Object> creationContext, v8::Isolate* isolate) |  228 inline v8::Local<v8::Value> toV8(const Vector<std::pair<String, T>>& value, v8::
     Local<v8::Object> creationContext, v8::Isolate* isolate) | 
|  229 { |  229 { | 
|  230     v8::Local<v8::Object> object = v8::Object::New(isolate); |  230     v8::Local<v8::Object> object = v8::Object::New(isolate); | 
|  231     for (unsigned i = 0; i < value.size(); ++i) { |  231     for (unsigned i = 0; i < value.size(); ++i) { | 
|  232         v8::Local<v8::Value> v8Value = toV8(value[i].second, creationContext, is
     olate); |  232         v8::Local<v8::Value> v8Value = toV8(value[i].second, creationContext, is
     olate); | 
|  233         if (v8Value.IsEmpty()) |  233         if (v8Value.IsEmpty()) | 
|  234             v8Value = v8::Undefined(isolate); |  234             v8Value = v8::Undefined(isolate); | 
|  235         object->Set(v8String(isolate, value[i].first), v8Value); |  235         object->Set(v8String(isolate, value[i].first), v8Value); | 
|  236     } |  236     } | 
|  237     return object; |  237     return object; | 
|  238 } |  238 } | 
|  239  |  239  | 
|  240 } // namespace blink |  240 } // namespace blink | 
|  241  |  241  | 
|  242 #endif // ToV8_h |  242 #endif // ToV8_h | 
| OLD | NEW |