| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 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 are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * 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 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #ifndef WrapperTypeInfo_h | 31 // This file has been moved to platform/bindings/WrapperTypeInfo.h. |
| 32 #define WrapperTypeInfo_h | 32 // TODO(adithyas): Remove this file. |
| 33 | 33 #include "platform/bindings/WrapperTypeInfo.h" |
| 34 #include "bindings/core/v8/ActiveScriptWrappable.h" | |
| 35 #include "gin/public/wrapper_info.h" | |
| 36 #include "platform/heap/Handle.h" | |
| 37 #include "platform/wtf/Allocator.h" | |
| 38 #include "platform/wtf/Assertions.h" | |
| 39 #include "v8/include/v8.h" | |
| 40 | |
| 41 namespace blink { | |
| 42 | |
| 43 class DOMWrapperWorld; | |
| 44 class ScriptWrappable; | |
| 45 | |
| 46 ScriptWrappable* ToScriptWrappable( | |
| 47 const v8::PersistentBase<v8::Object>& wrapper); | |
| 48 ScriptWrappable* ToScriptWrappable(v8::Local<v8::Object> wrapper); | |
| 49 | |
| 50 static const int kV8DOMWrapperTypeIndex = | |
| 51 static_cast<int>(gin::kWrapperInfoIndex); | |
| 52 static const int kV8DOMWrapperObjectIndex = | |
| 53 static_cast<int>(gin::kEncodedValueIndex); | |
| 54 static const int kV8DefaultWrapperInternalFieldCount = | |
| 55 static_cast<int>(gin::kNumberOfInternalFields); | |
| 56 static const int kV8PrototypeTypeIndex = 0; | |
| 57 static const int kV8PrototypeInternalFieldcount = 1; | |
| 58 | |
| 59 typedef v8::Local<v8::FunctionTemplate> ( | |
| 60 *DomTemplateFunction)(v8::Isolate*, const DOMWrapperWorld&); | |
| 61 typedef void (*TraceFunction)(Visitor*, ScriptWrappable*); | |
| 62 typedef void (*TraceWrappersFunction)(WrapperVisitor*, ScriptWrappable*); | |
| 63 typedef ActiveScriptWrappableBase* (*ToActiveScriptWrappableFunction)( | |
| 64 v8::Local<v8::Object>); | |
| 65 typedef void (*ResolveWrapperReachabilityFunction)( | |
| 66 v8::Isolate*, | |
| 67 ScriptWrappable*, | |
| 68 const v8::Persistent<v8::Object>&); | |
| 69 typedef void (*PreparePrototypeAndInterfaceObjectFunction)( | |
| 70 v8::Local<v8::Context>, | |
| 71 const DOMWrapperWorld&, | |
| 72 v8::Local<v8::Object>, | |
| 73 v8::Local<v8::Function>, | |
| 74 v8::Local<v8::FunctionTemplate>); | |
| 75 | |
| 76 // This struct provides a way to store a bunch of information that is helpful | |
| 77 // when unwrapping v8 objects. Each v8 bindings class has exactly one static | |
| 78 // WrapperTypeInfo member, so comparing pointers is a safe way to determine if | |
| 79 // types match. | |
| 80 struct WrapperTypeInfo { | |
| 81 DISALLOW_NEW(); | |
| 82 | |
| 83 enum WrapperTypePrototype { | |
| 84 kWrapperTypeObjectPrototype, | |
| 85 kWrapperTypeExceptionPrototype, | |
| 86 }; | |
| 87 | |
| 88 enum WrapperClassId { | |
| 89 kNodeClassId = 1, // NodeClassId must be smaller than ObjectClassId. | |
| 90 kObjectClassId, | |
| 91 }; | |
| 92 | |
| 93 enum ActiveScriptWrappableInheritance { | |
| 94 kNotInheritFromActiveScriptWrappable, | |
| 95 kInheritFromActiveScriptWrappable, | |
| 96 }; | |
| 97 | |
| 98 enum Lifetime { | |
| 99 kDependent, | |
| 100 kIndependent, | |
| 101 }; | |
| 102 | |
| 103 static const WrapperTypeInfo* Unwrap(v8::Local<v8::Value> type_info_wrapper) { | |
| 104 return reinterpret_cast<const WrapperTypeInfo*>( | |
| 105 v8::External::Cast(*type_info_wrapper)->Value()); | |
| 106 } | |
| 107 | |
| 108 static void WrapperCreated() { | |
| 109 ThreadState::Current()->Heap().HeapStats().IncreaseWrapperCount(1); | |
| 110 } | |
| 111 | |
| 112 static void WrapperDestroyed() { | |
| 113 ThreadHeapStats& heap_stats = ThreadState::Current()->Heap().HeapStats(); | |
| 114 heap_stats.DecreaseWrapperCount(1); | |
| 115 heap_stats.IncreaseCollectedWrapperCount(1); | |
| 116 } | |
| 117 | |
| 118 bool Equals(const WrapperTypeInfo* that) const { return this == that; } | |
| 119 | |
| 120 bool IsSubclass(const WrapperTypeInfo* that) const { | |
| 121 for (const WrapperTypeInfo* current = this; current; | |
| 122 current = current->parent_class) { | |
| 123 if (current == that) | |
| 124 return true; | |
| 125 } | |
| 126 | |
| 127 return false; | |
| 128 } | |
| 129 | |
| 130 void ConfigureWrapper(v8::PersistentBase<v8::Object>* wrapper) const { | |
| 131 wrapper->SetWrapperClassId(wrapper_class_id); | |
| 132 if (lifetime == kIndependent) | |
| 133 wrapper->MarkIndependent(); | |
| 134 } | |
| 135 | |
| 136 v8::Local<v8::FunctionTemplate> domTemplate( | |
| 137 v8::Isolate* isolate, | |
| 138 const DOMWrapperWorld& world) const { | |
| 139 return dom_template_function(isolate, world); | |
| 140 } | |
| 141 | |
| 142 void Trace(Visitor* visitor, ScriptWrappable* script_wrappable) const { | |
| 143 DCHECK(trace_function); | |
| 144 return trace_function(visitor, script_wrappable); | |
| 145 } | |
| 146 | |
| 147 void TraceWrappers(WrapperVisitor* visitor, | |
| 148 ScriptWrappable* script_wrappable) const { | |
| 149 DCHECK(trace_wrappers_function); | |
| 150 return trace_wrappers_function(visitor, script_wrappable); | |
| 151 } | |
| 152 | |
| 153 void PreparePrototypeAndInterfaceObject( | |
| 154 v8::Local<v8::Context> context, | |
| 155 const DOMWrapperWorld& world, | |
| 156 v8::Local<v8::Object> prototype_object, | |
| 157 v8::Local<v8::Function> interface_object, | |
| 158 v8::Local<v8::FunctionTemplate> interface_template) const { | |
| 159 if (prepare_prototype_and_interface_object_function) | |
| 160 prepare_prototype_and_interface_object_function( | |
| 161 context, world, prototype_object, interface_object, | |
| 162 interface_template); | |
| 163 } | |
| 164 | |
| 165 bool IsActiveScriptWrappable() const { | |
| 166 return active_script_wrappable_inheritance == | |
| 167 kInheritFromActiveScriptWrappable; | |
| 168 } | |
| 169 | |
| 170 // This field must be the first member of the struct WrapperTypeInfo. | |
| 171 // See also static_assert() in .cpp file. | |
| 172 const gin::GinEmbedder gin_embedder; | |
| 173 | |
| 174 DomTemplateFunction dom_template_function; | |
| 175 const TraceFunction trace_function; | |
| 176 const TraceWrappersFunction trace_wrappers_function; | |
| 177 PreparePrototypeAndInterfaceObjectFunction | |
| 178 prepare_prototype_and_interface_object_function; | |
| 179 const char* const interface_name; | |
| 180 const WrapperTypeInfo* parent_class; | |
| 181 const unsigned wrapper_type_prototype : 1; // WrapperTypePrototype | |
| 182 const unsigned wrapper_class_id : 2; // WrapperClassId | |
| 183 const unsigned // ActiveScriptWrappableInheritance | |
| 184 active_script_wrappable_inheritance : 1; | |
| 185 const unsigned lifetime : 1; // Lifetime | |
| 186 }; | |
| 187 | |
| 188 template <typename T, int offset> | |
| 189 inline T* GetInternalField(const v8::PersistentBase<v8::Object>& persistent) { | |
| 190 DCHECK_LT(offset, v8::Object::InternalFieldCount(persistent)); | |
| 191 return reinterpret_cast<T*>( | |
| 192 v8::Object::GetAlignedPointerFromInternalField(persistent, offset)); | |
| 193 } | |
| 194 | |
| 195 template <typename T, int offset> | |
| 196 inline T* GetInternalField(v8::Local<v8::Object> wrapper) { | |
| 197 DCHECK_LT(offset, wrapper->InternalFieldCount()); | |
| 198 return reinterpret_cast<T*>( | |
| 199 wrapper->GetAlignedPointerFromInternalField(offset)); | |
| 200 } | |
| 201 | |
| 202 // The return value can be null if |wrapper| is a global proxy, which points to | |
| 203 // nothing while a navigation. | |
| 204 inline ScriptWrappable* ToScriptWrappable( | |
| 205 const v8::PersistentBase<v8::Object>& wrapper) { | |
| 206 return GetInternalField<ScriptWrappable, kV8DOMWrapperObjectIndex>(wrapper); | |
| 207 } | |
| 208 | |
| 209 inline ScriptWrappable* ToScriptWrappable(v8::Local<v8::Object> wrapper) { | |
| 210 return GetInternalField<ScriptWrappable, kV8DOMWrapperObjectIndex>(wrapper); | |
| 211 } | |
| 212 | |
| 213 inline const WrapperTypeInfo* ToWrapperTypeInfo( | |
| 214 const v8::PersistentBase<v8::Object>& wrapper) { | |
| 215 return GetInternalField<WrapperTypeInfo, kV8DOMWrapperTypeIndex>(wrapper); | |
| 216 } | |
| 217 | |
| 218 inline const WrapperTypeInfo* ToWrapperTypeInfo(v8::Local<v8::Object> wrapper) { | |
| 219 return GetInternalField<WrapperTypeInfo, kV8DOMWrapperTypeIndex>(wrapper); | |
| 220 } | |
| 221 | |
| 222 } // namespace blink | |
| 223 | |
| 224 #endif // WrapperTypeInfo_h | |
| OLD | NEW |