OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009 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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 // There are two kinds of event listeners: HTML or non-HMTL. onload, | 46 // There are two kinds of event listeners: HTML or non-HMTL. onload, |
47 // onfocus, etc (attributes) are always HTML event handler type; Event | 47 // onfocus, etc (attributes) are always HTML event handler type; Event |
48 // listeners added by Window.addEventListener or | 48 // listeners added by Window.addEventListener or |
49 // EventTargetNode::addEventListener are non-HTML type. | 49 // EventTargetNode::addEventListener are non-HTML type. |
50 // | 50 // |
51 // Why does this matter? | 51 // Why does this matter? |
52 // WebKit does not allow duplicated HTML event handlers of the same type, | 52 // WebKit does not allow duplicated HTML event handlers of the same type, |
53 // but ALLOWs duplicated non-HTML event handlers. | 53 // but ALLOWs duplicated non-HTML event handlers. |
54 class CORE_EXPORT V8AbstractEventListener : public EventListener { | 54 class CORE_EXPORT V8AbstractEventListener : public EventListener { |
55 public: | 55 public: |
56 virtual ~V8AbstractEventListener(); | 56 ~V8AbstractEventListener() override; |
57 | 57 |
58 static const V8AbstractEventListener* cast(const EventListener* listener) | 58 static const V8AbstractEventListener* cast(const EventListener* listener) |
59 { | 59 { |
60 return listener->type() == JSEventListenerType | 60 return listener->type() == JSEventListenerType |
61 ? static_cast<const V8AbstractEventListener*>(listener) | 61 ? static_cast<const V8AbstractEventListener*>(listener) |
62 : 0; | 62 : 0; |
63 } | 63 } |
64 | 64 |
65 static V8AbstractEventListener* cast(EventListener* listener) | 65 static V8AbstractEventListener* cast(EventListener* listener) |
66 { | 66 { |
67 return const_cast<V8AbstractEventListener*>(cast(const_cast<const EventL
istener*>(listener))); | 67 return const_cast<V8AbstractEventListener*>(cast(const_cast<const EventL
istener*>(listener))); |
68 } | 68 } |
69 | 69 |
70 // Implementation of EventListener interface. | 70 // Implementation of EventListener interface. |
71 | 71 |
72 virtual bool operator==(const EventListener& other) override { return this =
= &other; } | 72 bool operator==(const EventListener& other) override { return this == &other
; } |
73 | 73 |
74 virtual void handleEvent(ExecutionContext*, Event*) override final; | 74 void handleEvent(ExecutionContext*, Event*) final; |
75 virtual void handleEvent(ScriptState*, Event*); | 75 virtual void handleEvent(ScriptState*, Event*); |
76 | 76 |
77 // Returns the listener object, either a function or an object. | 77 // Returns the listener object, either a function or an object. |
78 v8::Local<v8::Object> getListenerObject(ExecutionContext* executionContext) | 78 v8::Local<v8::Object> getListenerObject(ExecutionContext* executionContext) |
79 { | 79 { |
80 // prepareListenerObject can potentially deref this event listener | 80 // prepareListenerObject can potentially deref this event listener |
81 // as it may attempt to compile a function (lazy event listener), get an
error | 81 // as it may attempt to compile a function (lazy event listener), get an
error |
82 // and invoke onerror callback which can execute arbitrary JS code. | 82 // and invoke onerror callback which can execute arbitrary JS code. |
83 // Protect this event listener to keep it alive. | 83 // Protect this event listener to keep it alive. |
84 RefPtr<V8AbstractEventListener> guard(this); | 84 RefPtr<V8AbstractEventListener> guard(this); |
(...skipping 16 matching lines...) Expand all Loading... |
101 bool hasExistingListenerObject() | 101 bool hasExistingListenerObject() |
102 { | 102 { |
103 return !m_listener.isEmpty(); | 103 return !m_listener.isEmpty(); |
104 } | 104 } |
105 | 105 |
106 void clearListenerObject() | 106 void clearListenerObject() |
107 { | 107 { |
108 m_listener.clear(); | 108 m_listener.clear(); |
109 } | 109 } |
110 | 110 |
111 virtual bool belongsToTheCurrentWorld() const override final; | 111 bool belongsToTheCurrentWorld() const final; |
112 v8::Isolate* isolate() const { return m_isolate; } | 112 v8::Isolate* isolate() const { return m_isolate; } |
113 DOMWrapperWorld& world() const { return *m_world; } | 113 DOMWrapperWorld& world() const { return *m_world; } |
114 | 114 |
115 protected: | 115 protected: |
116 V8AbstractEventListener(bool isAttribute, DOMWrapperWorld&, v8::Isolate*); | 116 V8AbstractEventListener(bool isAttribute, DOMWrapperWorld&, v8::Isolate*); |
117 | 117 |
118 virtual void prepareListenerObject(ExecutionContext*) { } | 118 virtual void prepareListenerObject(ExecutionContext*) { } |
119 | 119 |
120 void setListenerObject(v8::Local<v8::Object>); | 120 void setListenerObject(v8::Local<v8::Object>); |
121 | 121 |
122 void invokeEventHandler(ScriptState*, Event*, v8::Local<v8::Value>); | 122 void invokeEventHandler(ScriptState*, Event*, v8::Local<v8::Value>); |
123 | 123 |
124 // Get the receiver object to use for event listener call. | 124 // Get the receiver object to use for event listener call. |
125 v8::Local<v8::Object> getReceiverObject(ScriptState*, Event*); | 125 v8::Local<v8::Object> getReceiverObject(ScriptState*, Event*); |
126 | 126 |
127 private: | 127 private: |
128 // Implementation of EventListener function. | 128 // Implementation of EventListener function. |
129 virtual bool virtualisAttribute() const override { return m_isAttribute; } | 129 bool virtualisAttribute() const override { return m_isAttribute; } |
130 | 130 |
131 // This could return an empty handle and callers need to check return value. | 131 // This could return an empty handle and callers need to check return value. |
132 // We don't use v8::MaybeLocal because it can fail without exception. | 132 // We don't use v8::MaybeLocal because it can fail without exception. |
133 virtual v8::Local<v8::Value> callListenerFunction(ScriptState*, v8::Local<v8
::Value> jsevent, Event*) = 0; | 133 virtual v8::Local<v8::Value> callListenerFunction(ScriptState*, v8::Local<v8
::Value> jsevent, Event*) = 0; |
134 | 134 |
135 virtual bool shouldPreventDefault(v8::Local<v8::Value> returnValue); | 135 virtual bool shouldPreventDefault(v8::Local<v8::Value> returnValue); |
136 | 136 |
137 static void setWeakCallback(const v8::WeakCallbackInfo<V8AbstractEventListen
er>&); | 137 static void setWeakCallback(const v8::WeakCallbackInfo<V8AbstractEventListen
er>&); |
138 | 138 |
139 ScopedPersistent<v8::Object> m_listener; | 139 ScopedPersistent<v8::Object> m_listener; |
140 | 140 |
141 // Indicates if this is an HTML type listener. | 141 // Indicates if this is an HTML type listener. |
142 bool m_isAttribute; | 142 bool m_isAttribute; |
143 | 143 |
144 RefPtr<DOMWrapperWorld> m_world; | 144 RefPtr<DOMWrapperWorld> m_world; |
145 v8::Isolate* m_isolate; | 145 v8::Isolate* m_isolate; |
146 }; | 146 }; |
147 | 147 |
148 } // namespace blink | 148 } // namespace blink |
149 | 149 |
150 #endif // V8AbstractEventListener_h | 150 #endif // V8AbstractEventListener_h |
OLD | NEW |