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

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h

Issue 1944363002: Use a new type of weak phantom handle for ScriptWrappable. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Unindent Created 4 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
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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 // to the existing wrapper. 98 // to the existing wrapper.
99 bool setWrapper(v8::Isolate* isolate, const WrapperTypeInfo* wrapperTypeInfo , v8::Local<v8::Object>& wrapper) WARN_UNUSED_RETURN 99 bool setWrapper(v8::Isolate* isolate, const WrapperTypeInfo* wrapperTypeInfo , v8::Local<v8::Object>& wrapper) WARN_UNUSED_RETURN
100 { 100 {
101 ASSERT(!wrapper.IsEmpty()); 101 ASSERT(!wrapper.IsEmpty());
102 if (UNLIKELY(containsWrapper())) { 102 if (UNLIKELY(containsWrapper())) {
103 wrapper = newLocalWrapper(isolate); 103 wrapper = newLocalWrapper(isolate);
104 return false; 104 return false;
105 } 105 }
106 m_wrapper.Reset(isolate, wrapper); 106 m_wrapper.Reset(isolate, wrapper);
107 wrapperTypeInfo->configureWrapper(&m_wrapper); 107 wrapperTypeInfo->configureWrapper(&m_wrapper);
108 m_wrapper.SetWeak(this, &firstWeakCallback, v8::WeakCallbackType::kInter nalFields); 108 m_wrapper.SetWeak();
109 ASSERT(containsWrapper()); 109 ASSERT(containsWrapper());
110 return true; 110 return true;
111 } 111 }
112 112
113 v8::Local<v8::Object> newLocalWrapper(v8::Isolate* isolate) const 113 v8::Local<v8::Object> newLocalWrapper(v8::Isolate* isolate) const
114 { 114 {
115 return v8::Local<v8::Object>::New(isolate, m_wrapper); 115 return v8::Local<v8::Object>::New(isolate, m_wrapper);
116 } 116 }
117 117
118 bool isEqualTo(const v8::Local<v8::Object>& other) const 118 bool isEqualTo(const v8::Local<v8::Object>& other) const
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 // With Oilpan we don't need a ScriptWrappable destructor. 162 // With Oilpan we don't need a ScriptWrappable destructor.
163 // 163 //
164 // 'RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(!containsWrapper())' is not nee ded 164 // 'RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(!containsWrapper())' is not nee ded
165 // because Oilpan is not using reference counting at all. If containsWrapper () is true, 165 // because Oilpan is not using reference counting at all. If containsWrapper () is true,
166 // it means that ScriptWrappable still has a wrapper. In this case, the dest ructor 166 // it means that ScriptWrappable still has a wrapper. In this case, the dest ructor
167 // must not be called since the wrapper has a persistent handle back to this ScriptWrappable object. 167 // must not be called since the wrapper has a persistent handle back to this ScriptWrappable object.
168 // Assuming that Oilpan's GC is correct (If we cannot assume this, a lot of more things are 168 // Assuming that Oilpan's GC is correct (If we cannot assume this, a lot of more things are
169 // already broken), we must not hit the RELEASE_ASSERT. 169 // already broken), we must not hit the RELEASE_ASSERT.
170 170
171 private: 171 private:
172 void disposeWrapper(const v8::WeakCallbackInfo<ScriptWrappable>& data)
173 {
174 auto scriptWrappable = reinterpret_cast<ScriptWrappable*>(data.GetIntern alField(v8DOMWrapperObjectIndex));
175 SECURITY_CHECK(scriptWrappable == this);
176 RELEASE_ASSERT(containsWrapper());
177 m_wrapper.Reset();
178 }
179
180 static void firstWeakCallback(const v8::WeakCallbackInfo<ScriptWrappable>& d ata)
181 {
182 auto scriptWrappable = data.GetParameter();
183 scriptWrappable->disposeWrapper(data);
184
185 auto wrapperTypeInfo = reinterpret_cast<WrapperTypeInfo*>(data.GetIntern alField(v8DOMWrapperTypeIndex));
186 wrapperTypeInfo->wrapperDestroyed();
187 }
188
189 v8::Persistent<v8::Object> m_wrapper; 172 v8::Persistent<v8::Object> m_wrapper;
190 }; 173 };
191 174
192 // Defines 'wrapperTypeInfo' virtual method which returns the WrapperTypeInfo of 175 // Defines 'wrapperTypeInfo' virtual method which returns the WrapperTypeInfo of
193 // the instance. Also declares a static member of type WrapperTypeInfo, of which 176 // the instance. Also declares a static member of type WrapperTypeInfo, of which
194 // the definition is given by the IDL code generator. 177 // the definition is given by the IDL code generator.
195 // 178 //
196 // All the derived classes of ScriptWrappable, regardless of directly or 179 // All the derived classes of ScriptWrappable, regardless of directly or
197 // indirectly, must write this macro in the class definition as long as the 180 // indirectly, must write this macro in the class definition as long as the
198 // class has a corresponding .idl file. 181 // class has a corresponding .idl file.
(...skipping 18 matching lines...) Expand all
217 // in X's cpp code, and instantiate X, i.e. "template class X;". 200 // in X's cpp code, and instantiate X, i.e. "template class X;".
218 #define DECLARE_WRAPPERTYPEINFO() \ 201 #define DECLARE_WRAPPERTYPEINFO() \
219 public: \ 202 public: \
220 const WrapperTypeInfo* wrapperTypeInfo() const override; \ 203 const WrapperTypeInfo* wrapperTypeInfo() const override; \
221 private: \ 204 private: \
222 typedef void end_of_define_wrappertypeinfo_not_reached_t 205 typedef void end_of_define_wrappertypeinfo_not_reached_t
223 206
224 } // namespace blink 207 } // namespace blink
225 208
226 #endif // ScriptWrappable_h 209 #endif // ScriptWrappable_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698