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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.h

Issue 2840163002: DOM: NodeIterator.filter and TreeWalker.filter should return values which were specified to createN… (Closed)
Patch Set: Move ToV8() to ToV8ForCore.h, etc. 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.h
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.h b/third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.h
index 8a99b8c99ea183f7c585af9ac01e7c90bccdefe6..c2f16752a547b8f7cc6ea6d078ba82d8743e92ef 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.h
+++ b/third_party/WebKit/Source/bindings/core/v8/V8NodeFilterCondition.h
@@ -31,10 +31,10 @@
#ifndef V8NodeFilterCondition_h
#define V8NodeFilterCondition_h
-#include "bindings/core/v8/ScopedPersistent.h"
+#include "bindings/core/v8/ScriptWrappable.h"
+#include "bindings/core/v8/TraceWrapperV8Reference.h"
#include "core/dom/NodeFilterCondition.h"
#include "platform/heap/Handle.h"
-#include "platform/wtf/PassRefPtr.h"
#include "v8/include/v8.h"
namespace blink {
@@ -44,44 +44,33 @@ class Node;
class ScriptState;
// V8NodeFilterCondition maintains a Javascript implemented callback for
-// filtering Node returned by NodeIterator/TreeWalker.
-// A NodeFilterCondition is referenced by a NodeFilter, and A NodeFilter is
-// referenced by a NodeIterator/TreeWalker. As V8NodeFilterCondition maintains
-// a Javascript callback which may reference Document, we need to avoid circular
-// reference spanning V8/Blink object space.
-// To address this issue, V8NodeFilterCondition holds a weak reference to
-// |m_filter|, the Javascript value, and the whole reference is exposed to V8 to
-// let V8 GC handle collection of |m_filter|.
-// (DOM)
-// NodeIterator ----RefPtr----> NodeFilter ----RefPtr----> NodeFilterCondition
-// | ^ | ^ |
-// weak | weak | ScopedPersistent(weak)
-// | RefPtr | RefPtr |
-// v | v | v
-// NodeIterator --HiddenValue--> NodeFilter --HiddenValue--> JS Callback
-// (V8)
-class V8NodeFilterCondition final : public NodeFilterCondition {
+// filtering Node returned by NodeIterator/TreeWalker. A V8NodeFilterCondition
+// is referenced by a NodeIterator/TreeWalker.
+//
+// Binding generator should generate this code. See crbug.com/630986.
+class V8NodeFilterCondition final : public NodeFilterCondition,
+ public TraceWrapperBase {
public:
- static V8NodeFilterCondition* Create(v8::Local<v8::Value> filter,
- v8::Local<v8::Object> owner,
- ScriptState* script_state) {
- return new V8NodeFilterCondition(filter, owner, script_state);
+ static V8NodeFilterCondition* CreateOrNull(v8::Local<v8::Value> filter,
+ ScriptState* script_state) {
+ return filter->IsNull() ? nullptr
+ : new V8NodeFilterCondition(filter, script_state);
}
~V8NodeFilterCondition() override;
+ DECLARE_TRACE_WRAPPERS();
- unsigned AcceptNode(Node*, ExceptionState&) const override;
+ unsigned acceptNode(Node*, ExceptionState&) const override;
+ v8::Local<v8::Value> Callback(v8::Isolate* isolate) const {
+ return filter_.NewLocal(isolate);
+ }
private:
- // As the value |filter| is maintained by V8GC, the |owner| which references
- // V8NodeFilterCondition, usually a wrapper of NodeFilter, is specified here
- // to hold a strong reference to |filter|.
V8NodeFilterCondition(v8::Local<v8::Value> filter,
- v8::Local<v8::Object> owner,
ScriptState*);
RefPtr<ScriptState> script_state_;
- ScopedPersistent<v8::Value> filter_;
+ TraceWrapperV8Reference<v8::Object> filter_;
};
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698