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

Side by Side Diff: third_party/WebKit/WebCore/dom/Node.cpp

Issue 21165: Revert the merge. Mac build is mysteriously broken. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « third_party/WebKit/WebCore/dom/Node.h ('k') | third_party/WebKit/WebCore/dom/Node.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed. 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed.
6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 21 matching lines...) Expand all
32 #include "CSSStyleRule.h" 32 #include "CSSStyleRule.h"
33 #include "CSSStyleSelector.h" 33 #include "CSSStyleSelector.h"
34 #include "CSSStyleSheet.h" 34 #include "CSSStyleSheet.h"
35 #include "CString.h" 35 #include "CString.h"
36 #include "ChildNodeList.h" 36 #include "ChildNodeList.h"
37 #include "ClassNodeList.h" 37 #include "ClassNodeList.h"
38 #include "DOMImplementation.h" 38 #include "DOMImplementation.h"
39 #include "Document.h" 39 #include "Document.h"
40 #include "DynamicNodeList.h" 40 #include "DynamicNodeList.h"
41 #include "Element.h" 41 #include "Element.h"
42 #include "Event.h"
43 #include "EventException.h"
44 #include "EventHandler.h"
45 #include "EventListener.h"
46 #include "EventNames.h"
47 #include "ExceptionCode.h" 42 #include "ExceptionCode.h"
48 #include "Frame.h" 43 #include "Frame.h"
49 #include "FrameView.h"
50 #include "HTMLNames.h" 44 #include "HTMLNames.h"
51 #include "JSDOMBinding.h" 45 #include "JSDOMBinding.h"
52 #include "KeyboardEvent.h"
53 #include "Logging.h" 46 #include "Logging.h"
54 #include "MouseEvent.h"
55 #include "MutationEvent.h"
56 #include "NameNodeList.h" 47 #include "NameNodeList.h"
57 #include "NamedAttrMap.h" 48 #include "NamedAttrMap.h"
58 #include "NodeRareData.h" 49 #include "NodeRareData.h"
59 #include "Page.h"
60 #include "PlatformMouseEvent.h"
61 #include "PlatformWheelEvent.h"
62 #include "ProcessingInstruction.h" 50 #include "ProcessingInstruction.h"
63 #include "ProgressEvent.h"
64 #include "RegisteredEventListener.h"
65 #include "RenderObject.h" 51 #include "RenderObject.h"
66 #include "ScriptController.h" 52 #include "ScriptController.h"
67 #include "SelectorNodeList.h" 53 #include "SelectorNodeList.h"
68 #include "StringBuilder.h" 54 #include "StringBuilder.h"
69 #include "TagNodeList.h" 55 #include "TagNodeList.h"
70 #include "Text.h" 56 #include "Text.h"
71 #include "TextEvent.h"
72 #include "UIEvent.h"
73 #include "UIEventWithKeyState.h"
74 #include "WebKitAnimationEvent.h"
75 #include "WebKitTransitionEvent.h"
76 #include "WheelEvent.h"
77 #include "XMLNames.h" 57 #include "XMLNames.h"
78 #include "htmlediting.h" 58 #include "htmlediting.h"
79 #include <wtf/HashSet.h>
80 #include <wtf/RefCountedLeakCounter.h> 59 #include <wtf/RefCountedLeakCounter.h>
81 60
82 #if ENABLE(DOM_STORAGE)
83 #include "StorageEvent.h"
84 #endif
85
86 #if ENABLE(SVG)
87 #include "SVGElementInstance.h"
88 #include "SVGUseElement.h"
89 #endif
90
91 #define DUMP_NODE_STATISTICS 0 61 #define DUMP_NODE_STATISTICS 0
92 62
93 using namespace std; 63 using namespace std;
94 64
95 namespace WebCore { 65 namespace WebCore {
96 66
97 using namespace HTMLNames; 67 using namespace HTMLNames;
98 68
99 static HashSet<Node*>* gNodesDispatchingSimulatedClicks = 0;
100
101 bool Node::isSupported(const String& feature, const String& version) 69 bool Node::isSupported(const String& feature, const String& version)
102 { 70 {
103 return DOMImplementation::hasFeature(feature, version); 71 return DOMImplementation::hasFeature(feature, version);
104 } 72 }
105 73
106 #if DUMP_NODE_STATISTICS 74 #if DUMP_NODE_STATISTICS
107 static HashSet<Node*> liveNodeSet; 75 static HashSet<Node*> liveNodeSet;
108 #endif 76 #endif
109 77
110 void Node::dumpStatistics() 78 void Node::dumpStatistics()
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 if (it != ignoreSet.end()) 336 if (it != ignoreSet.end())
369 ignoreSet.remove(it); 337 ignoreSet.remove(it);
370 else 338 else
371 nodeCounter.decrement(); 339 nodeCounter.decrement();
372 #endif 340 #endif
373 341
374 #if DUMP_NODE_STATISTICS 342 #if DUMP_NODE_STATISTICS
375 liveNodeSet.remove(this); 343 liveNodeSet.remove(this);
376 #endif 344 #endif
377 345
378 if (!eventListeners().isEmpty() && !inDocument())
379 document()->unregisterDisconnectedNodeWithEventListeners(this);
380
381 if (!hasRareData()) 346 if (!hasRareData())
382 ASSERT(!NodeRareData::rareDataMap().contains(this)); 347 ASSERT(!NodeRareData::rareDataMap().contains(this));
383 else { 348 else {
384 if (m_document && rareData()->nodeLists()) 349 if (m_document && rareData()->nodeLists())
385 m_document->removeNodeListCache(); 350 m_document->removeNodeListCache();
386 351
387 NodeRareData::NodeRareDataMap& dataMap = NodeRareData::rareDataMap(); 352 NodeRareData::NodeRareDataMap& dataMap = NodeRareData::rareDataMap();
388 NodeRareData::NodeRareDataMap::iterator it = dataMap.find(this); 353 NodeRareData::NodeRareDataMap::iterator it = dataMap.find(this);
389 ASSERT(it != dataMap.end()); 354 ASSERT(it != dataMap.end());
390 delete it->second; 355 delete it->second;
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 if (m_inActiveChain) 1069 if (m_inActiveChain)
1105 doc->activeChainNodeDetached(this); 1070 doc->activeChainNodeDetached(this);
1106 1071
1107 m_active = false; 1072 m_active = false;
1108 m_hovered = false; 1073 m_hovered = false;
1109 m_inActiveChain = false; 1074 m_inActiveChain = false;
1110 m_attached = false; 1075 m_attached = false;
1111 m_inDetach = false; 1076 m_inDetach = false;
1112 } 1077 }
1113 1078
1079 void Node::insertedIntoDocument()
1080 {
1081 // Note: EventTargetNode::insertedIntoDocument does not call through here, s o if you
1082 // change this function, change that one as well.
1083 setInDocument(true);
1084 }
1085
1086 void Node::removedFromDocument()
1087 {
1088 // Note: EventTargetNode::insertedIntoDocument does not call through here, s o if you
1089 // change this function, change that one as well.
1090 setInDocument(false);
1091 }
1092
1114 Node *Node::previousEditable() const 1093 Node *Node::previousEditable() const
1115 { 1094 {
1116 Node *node = previousLeafNode(); 1095 Node *node = previousLeafNode();
1117 while (node) { 1096 while (node) {
1118 if (node->isContentEditable()) 1097 if (node->isContentEditable())
1119 return node; 1098 return node;
1120 node = node->previousLeafNode(); 1099 node = node->previousLeafNode();
1121 } 1100 }
1122 return 0; 1101 return 0;
1123 } 1102 }
(...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after
2128 2107
2129 ContainerNode* Node::eventParentNode() 2108 ContainerNode* Node::eventParentNode()
2130 { 2109 {
2131 Node* parent = parentNode(); 2110 Node* parent = parentNode();
2132 ASSERT(!parent || parent->isContainerNode()); 2111 ASSERT(!parent || parent->isContainerNode());
2133 return static_cast<ContainerNode*>(parent); 2112 return static_cast<ContainerNode*>(parent);
2134 } 2113 }
2135 2114
2136 // -------- 2115 // --------
2137 2116
2138 ScriptExecutionContext* Node::scriptExecutionContext() const
2139 {
2140 return document();
2141 }
2142
2143 const RegisteredEventListenerVector& Node::eventListeners() const
2144 {
2145 if (hasRareData()) {
2146 if (RegisteredEventListenerVector* listeners = rareData()->listeners())
2147 return *listeners;
2148 }
2149 static const RegisteredEventListenerVector* emptyListenersVector = new Regis teredEventListenerVector;
2150 return *emptyListenersVector;
2151 }
2152
2153 void Node::insertedIntoDocument()
2154 {
2155 if (!eventListeners().isEmpty())
2156 document()->unregisterDisconnectedNodeWithEventListeners(this);
2157
2158 setInDocument(true);
2159 }
2160
2161 void Node::removedFromDocument()
2162 {
2163 if (!eventListeners().isEmpty())
2164 document()->registerDisconnectedNodeWithEventListeners(this);
2165
2166 setInDocument(false);
2167 }
2168
2169 void Node::willMoveToNewOwnerDocument()
2170 {
2171 if (!eventListeners().isEmpty())
2172 document()->unregisterDisconnectedNodeWithEventListeners(this);
2173 }
2174
2175 void Node::didMoveToNewOwnerDocument()
2176 {
2177 if (!eventListeners().isEmpty())
2178 document()->registerDisconnectedNodeWithEventListeners(this);
2179 }
2180
2181 static inline void updateSVGElementInstancesAfterEventListenerChange(Node* refer enceNode)
2182 {
2183 ASSERT(referenceNode);
2184
2185 #if ENABLE(SVG)
2186 if (!referenceNode->isSVGElement())
2187 return;
2188
2189 // Elements living inside a <use> shadow tree, never cause any updates!
2190 if (referenceNode->shadowTreeRootNode())
2191 return;
2192
2193 // We're possibly (a child of) an element that is referenced by a <use> clie nt
2194 // If an event listeners changes on a referenced element, update all instanc es.
2195 for (Node* node = referenceNode; node; node = node->parentNode()) {
2196 if (!node->hasID() || !node->isSVGElement())
2197 continue;
2198
2199 SVGElementInstance::invalidateAllInstancesOfElement(static_cast<SVGEleme nt*>(node));
2200 break;
2201 }
2202 #endif
2203 }
2204
2205 void Node::addEventListener(const AtomicString& eventType, PassRefPtr<EventListe ner> listener, bool useCapture)
2206 {
2207 Document* document = this->document();
2208 if (!document->attached())
2209 return;
2210
2211 document->addListenerTypeIfNeeded(eventType);
2212
2213 RegisteredEventListenerVector& listeners = ensureRareData()->ensureListeners ();
2214
2215 // Remove existing identical listener set with identical arguments.
2216 // The DOM2 spec says that "duplicate instances are discarded" in this case.
2217 removeEventListener(eventType, listener.get(), useCapture);
2218
2219 // adding the first one
2220 if (listeners.isEmpty() && !inDocument())
2221 document->registerDisconnectedNodeWithEventListeners(this);
2222
2223 listeners.append(RegisteredEventListener::create(eventType, listener, useCap ture));
2224 updateSVGElementInstancesAfterEventListenerChange(this);
2225 }
2226
2227 void Node::removeEventListener(const AtomicString& eventType, EventListener* lis tener, bool useCapture)
2228 {
2229 if (!hasRareData())
2230 return;
2231
2232 RegisteredEventListenerVector* listeners = rareData()->listeners();
2233 if (!listeners)
2234 return;
2235
2236 size_t size = listeners->size();
2237 for (size_t i = 0; i < size; ++i) {
2238 RegisteredEventListener& r = *listeners->at(i);
2239 if (r.eventType() == eventType && r.listener() == listener && r.useCaptu re() == useCapture) {
2240 r.setRemoved(true);
2241 listeners->remove(i);
2242
2243 // removed last
2244 if (listeners->isEmpty() && !inDocument())
2245 document()->unregisterDisconnectedNodeWithEventListeners(this);
2246
2247 updateSVGElementInstancesAfterEventListenerChange(this);
2248 return;
2249 }
2250 }
2251 }
2252
2253 void Node::removeAllEventListenersSlowCase()
2254 {
2255 ASSERT(hasRareData());
2256
2257 RegisteredEventListenerVector* listeners = rareData()->listeners();
2258 if (!listeners)
2259 return;
2260
2261 size_t size = listeners->size();
2262 for (size_t i = 0; i < size; ++i)
2263 listeners->at(i)->setRemoved(true);
2264 listeners->clear();
2265 }
2266
2267 void Node::handleLocalEvents(Event* event, bool useCapture)
2268 {
2269 if (disabled() && event->isMouseEvent())
2270 return;
2271
2272 RegisteredEventListenerVector listenersCopy = eventListeners();
2273 size_t size = listenersCopy.size();
2274 for (size_t i = 0; i < size; ++i) {
2275 const RegisteredEventListener& r = *listenersCopy[i];
2276 if (r.eventType() == event->type() && r.useCapture() == useCapture && !r .removed())
2277 r.listener()->handleEvent(event, false);
2278 }
2279 }
2280
2281 #if ENABLE(SVG)
2282 static inline SVGElementInstance* eventTargetAsSVGElementInstance(Node* referenc eNode)
2283 {
2284 ASSERT(referenceNode);
2285 if (!referenceNode->isSVGElement())
2286 return 0;
2287
2288 // Spec: The event handling for the non-exposed tree works as if the referen ced element had been textually included
2289 // as a deeply cloned child of the 'use' element, except that events are dis patched to the SVGElementInstance objects
2290 for (Node* n = referenceNode; n; n = n->parentNode()) {
2291 if (!n->isShadowNode() || !n->isSVGElement())
2292 continue;
2293
2294 Node* shadowTreeParentElement = n->shadowParentNode();
2295 ASSERT(shadowTreeParentElement->hasTagName(SVGNames::useTag));
2296
2297 if (SVGElementInstance* instance = static_cast<SVGUseElement*>(shadowTre eParentElement)->instanceForShadowTreeElement(referenceNode))
2298 return instance;
2299 }
2300
2301 return 0;
2302 }
2303 #endif
2304
2305 static inline EventTarget* eventTargetRespectingSVGTargetRules(Node* referenceNo de)
2306 {
2307 ASSERT(referenceNode);
2308
2309 #if ENABLE(SVG)
2310 if (SVGElementInstance* instance = eventTargetAsSVGElementInstance(reference Node)) {
2311 ASSERT(instance->shadowTreeElement() == referenceNode);
2312 return instance;
2313 }
2314 #endif
2315
2316 return referenceNode;
2317 }
2318
2319 bool Node::dispatchEvent(PassRefPtr<Event> e, ExceptionCode& ec)
2320 {
2321 RefPtr<Event> evt(e);
2322 ASSERT(!eventDispatchForbidden());
2323 if (!evt || evt->type().isEmpty()) {
2324 ec = EventException::UNSPECIFIED_EVENT_TYPE_ERR;
2325 return false;
2326 }
2327
2328 evt->setTarget(eventTargetRespectingSVGTargetRules(this));
2329
2330 RefPtr<FrameView> view = document()->view();
2331 return dispatchGenericEvent(evt.release());
2332 }
2333
2334 bool Node::dispatchGenericEvent(PassRefPtr<Event> prpEvent)
2335 {
2336 RefPtr<Event> event(prpEvent);
2337
2338 ASSERT(!eventDispatchForbidden());
2339 ASSERT(event->target());
2340 ASSERT(!event->type().isNull()); // JavaScript code can create an event with an empty name, but not null.
2341
2342 // Make a vector of ancestors to send the event to.
2343 // If the node is not in a document just send the event to it.
2344 // Be sure to ref all of nodes since event handlers could result in the last reference going away.
2345 RefPtr<Node> thisNode(this);
2346 Vector<RefPtr<ContainerNode> > ancestors;
2347 if (inDocument()) {
2348 for (ContainerNode* ancestor = eventParentNode(); ancestor; ancestor = a ncestor->eventParentNode()) {
2349 #if ENABLE(SVG)
2350 // Skip <use> shadow tree elements.
2351 if (ancestor->isSVGElement() && ancestor->isShadowNode())
2352 continue;
2353 #endif
2354 ancestors.append(ancestor);
2355 }
2356 }
2357
2358 // Set up a pointer to indicate whether to dispatch window events.
2359 // We don't dispatch load events to the window. That quirk was originally
2360 // added because Mozilla doesn't propagate load events to the window object.
2361 Document* documentForWindowEvents = 0;
2362 if (event->type() != eventNames().loadEvent) {
2363 Node* topLevelContainer = ancestors.isEmpty() ? this : ancestors.last(). get();
2364 if (topLevelContainer->isDocumentNode())
2365 documentForWindowEvents = static_cast<Document*>(topLevelContainer);
2366 }
2367
2368 // Give the target node a chance to do some work before DOM event handlers g et a crack.
2369 void* data = preDispatchEventHandler(event.get());
2370 if (event->propagationStopped())
2371 goto doneDispatching;
2372
2373 // Trigger capturing event handlers, starting at the top and working our way down.
2374 event->setEventPhase(Event::CAPTURING_PHASE);
2375
2376 if (documentForWindowEvents) {
2377 event->setCurrentTarget(documentForWindowEvents);
2378 documentForWindowEvents->handleWindowEvent(event.get(), true);
2379 if (event->propagationStopped())
2380 goto doneDispatching;
2381 }
2382 for (size_t i = ancestors.size(); i; --i) {
2383 ContainerNode* ancestor = ancestors[i - 1].get();
2384 event->setCurrentTarget(eventTargetRespectingSVGTargetRules(ancestor));
2385 ancestor->handleLocalEvents(event.get(), true);
2386 if (event->propagationStopped())
2387 goto doneDispatching;
2388 }
2389
2390 event->setEventPhase(Event::AT_TARGET);
2391
2392 // We do want capturing event listeners to be invoked here, even though
2393 // that violates some versions of the DOM specification; Mozilla does it.
2394 event->setCurrentTarget(eventTargetRespectingSVGTargetRules(this));
2395 handleLocalEvents(event.get(), true);
2396 if (event->propagationStopped())
2397 goto doneDispatching;
2398 handleLocalEvents(event.get(), false);
2399 if (event->propagationStopped())
2400 goto doneDispatching;
2401
2402 if (event->bubbles() && !event->cancelBubble()) {
2403 // Trigger bubbling event handlers, starting at the bottom and working o ur way up.
2404 event->setEventPhase(Event::BUBBLING_PHASE);
2405
2406 size_t size = ancestors.size();
2407 for (size_t i = 0; i < size; ++i) {
2408 ContainerNode* ancestor = ancestors[i].get();
2409 event->setCurrentTarget(eventTargetRespectingSVGTargetRules(ancestor ));
2410 ancestor->handleLocalEvents(event.get(), false);
2411 if (event->propagationStopped() || event->cancelBubble())
2412 goto doneDispatching;
2413 }
2414 if (documentForWindowEvents) {
2415 event->setCurrentTarget(documentForWindowEvents);
2416 documentForWindowEvents->handleWindowEvent(event.get(), false);
2417 if (event->propagationStopped() || event->cancelBubble())
2418 goto doneDispatching;
2419 }
2420 }
2421
2422 doneDispatching:
2423 event->setCurrentTarget(0);
2424 event->setEventPhase(0);
2425
2426 // Pass the data from the preDispatchEventHandler to the postDispatchEventHa ndler.
2427 postDispatchEventHandler(event.get(), data);
2428
2429 // Call default event handlers. While the DOM does have a concept of prevent ing
2430 // default handling, the detail of which handlers are called is an internal
2431 // implementation detail and not part of the DOM.
2432 if (!event->defaultPrevented() && !event->defaultHandled()) {
2433 // Non-bubbling events call only one default event handler, the one for the target.
2434 defaultEventHandler(event.get());
2435 ASSERT(!event->defaultPrevented());
2436 if (event->defaultHandled())
2437 goto doneWithDefault;
2438 // For bubbling events, call default event handlers on the same targets in the
2439 // same order as the bubbling phase.
2440 if (event->bubbles()) {
2441 size_t size = ancestors.size();
2442 for (size_t i = 0; i < size; ++i) {
2443 ContainerNode* ancestor = ancestors[i].get();
2444 ancestor->defaultEventHandler(event.get());
2445 ASSERT(!event->defaultPrevented());
2446 if (event->defaultHandled())
2447 goto doneWithDefault;
2448 }
2449 }
2450 }
2451
2452 doneWithDefault:
2453 Document::updateDocumentsRendering();
2454
2455 return !event->defaultPrevented();
2456 }
2457
2458 bool Node::dispatchSubtreeModifiedEvent()
2459 {
2460 ASSERT(!eventDispatchForbidden());
2461
2462 document()->incDOMTreeVersion();
2463
2464 notifyNodeListsAttributeChanged(); // FIXME: Can do better some day. Really only care about the name attribute changing.
2465
2466 if (!document()->hasListenerType(Document::DOMSUBTREEMODIFIED_LISTENER))
2467 return false;
2468 ExceptionCode ec = 0;
2469 return dispatchEvent(MutationEvent::create(eventNames().DOMSubtreeModifiedEv ent, true, false, 0, String(), String(), String(), 0), ec);
2470 }
2471
2472 void Node::dispatchWindowEvent(PassRefPtr<Event> e)
2473 {
2474 ASSERT(!eventDispatchForbidden());
2475 RefPtr<Event> evt(e);
2476 RefPtr<Document> doc = document();
2477 evt->setTarget(doc);
2478 doc->handleWindowEvent(evt.get(), true);
2479 doc->handleWindowEvent(evt.get(), false);
2480 }
2481
2482 void Node::dispatchWindowEvent(const AtomicString& eventType, bool canBubbleArg, bool cancelableArg)
2483 {
2484 ASSERT(!eventDispatchForbidden());
2485 RefPtr<Document> doc = document();
2486 dispatchWindowEvent(Event::create(eventType, canBubbleArg, cancelableArg));
2487
2488 if (eventType == eventNames().loadEvent) {
2489 // For onload events, send a separate load event to the enclosing frame only.
2490 // This is a DOM extension and is independent of bubbling/capturing rule s of
2491 // the DOM.
2492 Element* ownerElement = doc->ownerElement();
2493 if (ownerElement) {
2494 RefPtr<Event> ownerEvent = Event::create(eventType, false, cancelabl eArg);
2495 ownerEvent->setTarget(ownerElement);
2496 ownerElement->dispatchGenericEvent(ownerEvent.release());
2497 }
2498 }
2499 }
2500
2501 bool Node::dispatchUIEvent(const AtomicString& eventType, int detail, PassRefPtr <Event> underlyingEvent)
2502 {
2503 ASSERT(!eventDispatchForbidden());
2504 ASSERT(eventType == eventNames().DOMFocusInEvent || eventType == eventNames( ).DOMFocusOutEvent || eventType == eventNames().DOMActivateEvent);
2505
2506 bool cancelable = eventType == eventNames().DOMActivateEvent;
2507
2508 ExceptionCode ec = 0;
2509 RefPtr<UIEvent> evt = UIEvent::create(eventType, true, cancelable, document( )->defaultView(), detail);
2510 evt->setUnderlyingEvent(underlyingEvent);
2511 return dispatchEvent(evt.release(), ec);
2512 }
2513
2514 bool Node::dispatchKeyEvent(const PlatformKeyboardEvent& key)
2515 {
2516 ASSERT(!eventDispatchForbidden());
2517 ExceptionCode ec = 0;
2518 RefPtr<KeyboardEvent> keyboardEvent = KeyboardEvent::create(key, document()- >defaultView());
2519 bool r = dispatchEvent(keyboardEvent, ec);
2520
2521 // we want to return false if default is prevented (already taken care of)
2522 // or if the element is default-handled by the DOM. Otherwise we let it just
2523 // let it get handled by AppKit
2524 if (keyboardEvent->defaultHandled())
2525 r = false;
2526
2527 return r;
2528 }
2529
2530 bool Node::dispatchMouseEvent(const PlatformMouseEvent& event, const AtomicStrin g& eventType,
2531 int detail, Node* relatedTarget)
2532 {
2533 ASSERT(!eventDispatchForbidden());
2534
2535 IntPoint contentsPos;
2536 if (FrameView* view = document()->view())
2537 contentsPos = view->windowToContents(event.pos());
2538
2539 short button = event.button();
2540
2541 ASSERT(event.eventType() == MouseEventMoved || button != NoButton);
2542
2543 return dispatchMouseEvent(eventType, button, detail,
2544 contentsPos.x(), contentsPos.y(), event.globalX(), event.globalY(),
2545 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(),
2546 false, relatedTarget);
2547 }
2548
2549 void Node::dispatchSimulatedMouseEvent(const AtomicString& eventType,
2550 PassRefPtr<Event> underlyingEvent)
2551 {
2552 ASSERT(!eventDispatchForbidden());
2553
2554 bool ctrlKey = false;
2555 bool altKey = false;
2556 bool shiftKey = false;
2557 bool metaKey = false;
2558 if (UIEventWithKeyState* keyStateEvent = findEventWithKeyState(underlyingEve nt.get())) {
2559 ctrlKey = keyStateEvent->ctrlKey();
2560 altKey = keyStateEvent->altKey();
2561 shiftKey = keyStateEvent->shiftKey();
2562 metaKey = keyStateEvent->metaKey();
2563 }
2564
2565 // Like Gecko, we just pass 0 for everything when we make a fake mouse event .
2566 // Internet Explorer instead gives the current mouse position and state.
2567 dispatchMouseEvent(eventType, 0, 0, 0, 0, 0, 0,
2568 ctrlKey, altKey, shiftKey, metaKey, true, 0, underlyingEvent);
2569 }
2570
2571 void Node::dispatchSimulatedClick(PassRefPtr<Event> event, bool sendMouseEvents, bool showPressedLook)
2572 {
2573 if (!gNodesDispatchingSimulatedClicks)
2574 gNodesDispatchingSimulatedClicks = new HashSet<Node*>;
2575 else if (gNodesDispatchingSimulatedClicks->contains(this))
2576 return;
2577
2578 gNodesDispatchingSimulatedClicks->add(this);
2579
2580 // send mousedown and mouseup before the click, if requested
2581 if (sendMouseEvents)
2582 dispatchSimulatedMouseEvent(eventNames().mousedownEvent, event.get());
2583 setActive(true, showPressedLook);
2584 if (sendMouseEvents)
2585 dispatchSimulatedMouseEvent(eventNames().mouseupEvent, event.get());
2586 setActive(false);
2587
2588 // always send click
2589 dispatchSimulatedMouseEvent(eventNames().clickEvent, event);
2590
2591 gNodesDispatchingSimulatedClicks->remove(this);
2592 }
2593
2594 bool Node::dispatchMouseEvent(const AtomicString& eventType, int button, int det ail,
2595 int pageX, int pageY, int screenX, int screenY,
2596 bool ctrlKey, bool altKey, bool shiftKey, bool metaKey,
2597 bool isSimulated, Node* relatedTargetArg, PassRefPtr<Event> underlyingEvent)
2598 {
2599 ASSERT(!eventDispatchForbidden());
2600 if (disabled()) // Don't even send DOM events for disabled controls..
2601 return true;
2602
2603 if (eventType.isEmpty())
2604 return false; // Shouldn't happen.
2605
2606 // Dispatching the first event can easily result in this node being destroye d.
2607 // Since we dispatch up to three events here, we need to make sure we're ref erenced
2608 // so the pointer will be good for the two subsequent ones.
2609 RefPtr<Node> protect(this);
2610
2611 bool cancelable = eventType != eventNames().mousemoveEvent;
2612
2613 ExceptionCode ec = 0;
2614
2615 bool swallowEvent = false;
2616
2617 // Attempting to dispatch with a non-EventTarget relatedTarget causes the re latedTarget to be silently ignored.
2618 RefPtr<Node> relatedTarget = relatedTargetArg;
2619
2620 if (Frame* frame = document()->frame()) {
2621 float pageZoom = frame->pageZoomFactor();
2622 if (pageZoom != 1.0f) {
2623 // Adjust our pageX and pageY to account for the page zoom.
2624 pageX = lroundf(pageX / pageZoom);
2625 pageY = lroundf(pageY / pageZoom);
2626 }
2627 }
2628
2629 RefPtr<Event> mouseEvent = MouseEvent::create(eventType,
2630 true, cancelable, document()->defaultView(),
2631 detail, screenX, screenY, pageX, pageY,
2632 ctrlKey, altKey, shiftKey, metaKey, button,
2633 relatedTarget, 0, isSimulated);
2634 mouseEvent->setUnderlyingEvent(underlyingEvent.get());
2635
2636 dispatchEvent(mouseEvent, ec);
2637 bool defaultHandled = mouseEvent->defaultHandled();
2638 bool defaultPrevented = mouseEvent->defaultPrevented();
2639 if (defaultHandled || defaultPrevented)
2640 swallowEvent = true;
2641
2642 // Special case: If it's a double click event, we also send the dblclick eve nt. This is not part
2643 // of the DOM specs, but is used for compatibility with the ondblclick="" at tribute. This is treated
2644 // as a separate event in other DOM-compliant browsers like Firefox, and so we do the same.
2645 if (eventType == eventNames().clickEvent && detail == 2) {
2646 RefPtr<Event> doubleClickEvent = MouseEvent::create(eventNames().dblclic kEvent,
2647 true, cancelable, document()->defaultView(),
2648 detail, screenX, screenY, pageX, pageY,
2649 ctrlKey, altKey, shiftKey, metaKey, button,
2650 relatedTarget, 0, isSimulated);
2651 doubleClickEvent->setUnderlyingEvent(underlyingEvent.get());
2652 if (defaultHandled)
2653 doubleClickEvent->setDefaultHandled();
2654 dispatchEvent(doubleClickEvent, ec);
2655 if (doubleClickEvent->defaultHandled() || doubleClickEvent->defaultPreve nted())
2656 swallowEvent = true;
2657 }
2658
2659 return swallowEvent;
2660 }
2661
2662 void Node::dispatchWheelEvent(PlatformWheelEvent& e)
2663 {
2664 ASSERT(!eventDispatchForbidden());
2665 if (e.deltaX() == 0 && e.deltaY() == 0)
2666 return;
2667
2668 FrameView* view = document()->view();
2669 if (!view)
2670 return;
2671
2672 IntPoint pos = view->windowToContents(e.pos());
2673
2674 // Convert the deltas from pixels to lines if we have a pixel scroll event.
2675 float deltaX = e.deltaX();
2676 float deltaY = e.deltaY();
2677
2678 // FIXME: Should we do anything with a ScrollByPageWheelEvent here?
2679 // It will be treated like a line scroll of 1 right now.
2680 if (e.granularity() == ScrollByPixelWheelEvent) {
2681 deltaX /= cMouseWheelPixelsPerLineStep;
2682 deltaY /= cMouseWheelPixelsPerLineStep;
2683 }
2684
2685 RefPtr<WheelEvent> we = WheelEvent::create(e.deltaX(), e.deltaY(),
2686 document()->defaultView(), e.globalX(), e.globalY(), pos.x(), pos.y(),
2687 e.ctrlKey(), e.altKey(), e.shiftKey(), e.metaKey());
2688 ExceptionCode ec = 0;
2689 if (!dispatchEvent(we.release(), ec))
2690 e.accept();
2691 }
2692
2693 bool Node::dispatchWebKitAnimationEvent(const AtomicString& eventType, const Str ing& animationName, double elapsedTime)
2694 {
2695 ASSERT(!eventDispatchForbidden());
2696
2697 ExceptionCode ec = 0;
2698 return dispatchEvent(WebKitAnimationEvent::create(eventType, animationName, elapsedTime), ec);
2699 }
2700
2701 bool Node::dispatchWebKitTransitionEvent(const AtomicString& eventType, const St ring& propertyName, double elapsedTime)
2702 {
2703 ASSERT(!eventDispatchForbidden());
2704
2705 ExceptionCode ec = 0;
2706 return dispatchEvent(WebKitTransitionEvent::create(eventType, propertyName, elapsedTime), ec);
2707 }
2708
2709 void Node::dispatchFocusEvent()
2710 {
2711 dispatchEventForType(eventNames().focusEvent, false, false);
2712 }
2713
2714 void Node::dispatchBlurEvent()
2715 {
2716 dispatchEventForType(eventNames().blurEvent, false, false);
2717 }
2718
2719 bool Node::dispatchEventForType(const AtomicString& eventType, bool canBubbleArg , bool cancelableArg)
2720 {
2721 ASSERT(!eventDispatchForbidden());
2722 ExceptionCode ec = 0;
2723 return dispatchEvent(Event::create(eventType, canBubbleArg, cancelableArg), ec);
2724 }
2725
2726 bool Node::dispatchProgressEvent(const AtomicString &eventType, bool lengthCompu tableArg, unsigned loadedArg, unsigned totalArg)
2727 {
2728 ASSERT(!eventDispatchForbidden());
2729 ExceptionCode ec = 0;
2730 return dispatchEvent(ProgressEvent::create(eventType, lengthComputableArg, l oadedArg, totalArg), ec);
2731 }
2732
2733 void Node::dispatchStorageEvent(const AtomicString &eventType, const String& key , const String& oldValue, const String& newValue, Frame* source)
2734 {
2735 #if ENABLE(DOM_STORAGE)
2736 ASSERT(!eventDispatchForbidden());
2737 ExceptionCode ec = 0;
2738 dispatchEvent(StorageEvent::create(eventType, key, oldValue, newValue, sourc e->document()->documentURI(), source->domWindow()), ec);
2739 #endif
2740 }
2741
2742 void Node::removeInlineEventListenerForType(const AtomicString& eventType)
2743 {
2744 if (!hasRareData())
2745 return;
2746
2747 RegisteredEventListenerVector* listeners = rareData()->listeners();
2748 if (!listeners)
2749 return;
2750
2751 size_t size = listeners->size();
2752 for (size_t i = 0; i < size; ++i) {
2753 RegisteredEventListener& r = *listeners->at(i);
2754 if (r.eventType() != eventType || !r.listener()->isInline())
2755 continue;
2756
2757 r.setRemoved(true);
2758 listeners->remove(i);
2759
2760 // removed last
2761 if (listeners->isEmpty() && !inDocument())
2762 document()->unregisterDisconnectedNodeWithEventListeners(this);
2763
2764 updateSVGElementInstancesAfterEventListenerChange(this);
2765 return;
2766 }
2767 }
2768
2769 void Node::setInlineEventListenerForType(const AtomicString& eventType, PassRefP tr<EventListener> listener)
2770 {
2771 // In case we are the only one holding a reference to it, we don't want remo veInlineEventListenerForType to destroy it.
2772 removeInlineEventListenerForType(eventType);
2773 if (listener)
2774 addEventListener(eventType, listener, false);
2775 }
2776
2777 void Node::setInlineEventListenerForTypeAndAttribute(const AtomicString& eventTy pe, Attribute* attr)
2778 {
2779 setInlineEventListenerForType(eventType, document()->createEventListener(att r->localName().string(), attr->value(), this));
2780 }
2781
2782 EventListener* Node::inlineEventListenerForType(const AtomicString& eventType) c onst
2783 {
2784 const RegisteredEventListenerVector& listeners = eventListeners();
2785 size_t size = listeners.size();
2786 for (size_t i = 0; i < size; ++i) {
2787 const RegisteredEventListener& r = *listeners[i];
2788 if (r.eventType() == eventType && r.listener()->isInline())
2789 return r.listener();
2790 }
2791 return 0;
2792 }
2793
2794 bool Node::disabled() const
2795 {
2796 return false;
2797 }
2798
2799 void Node::defaultEventHandler(Event* event)
2800 {
2801 if (event->target() != this)
2802 return;
2803 const AtomicString& eventType = event->type();
2804 if (eventType == eventNames().keydownEvent || eventType == eventNames().keyp ressEvent) {
2805 if (event->isKeyboardEvent())
2806 if (Frame* frame = document()->frame())
2807 frame->eventHandler()->defaultKeyboardEventHandler(static_cast<K eyboardEvent*>(event));
2808 } else if (eventType == eventNames().clickEvent) {
2809 int detail = event->isUIEvent() ? static_cast<UIEvent*>(event)->detail() : 0;
2810 dispatchUIEvent(eventNames().DOMActivateEvent, detail, event);
2811 } else if (eventType == eventNames().contextmenuEvent) {
2812 if (Frame* frame = document()->frame())
2813 if (Page* page = frame->page())
2814 page->contextMenuController()->handleContextMenuEvent(event);
2815 } else if (eventType == eventNames().textInputEvent) {
2816 if (event->isTextEvent())
2817 if (Frame* frame = document()->frame())
2818 frame->eventHandler()->defaultTextInputEventHandler(static_cast< TextEvent*>(event));
2819 }
2820 }
2821
2822 EventListener* Node::onabort() const
2823 {
2824 return inlineEventListenerForType(eventNames().abortEvent);
2825 }
2826
2827 void Node::setOnabort(PassRefPtr<EventListener> eventListener)
2828 {
2829 setInlineEventListenerForType(eventNames().abortEvent, eventListener);
2830 }
2831
2832 EventListener* Node::onblur() const
2833 {
2834 return inlineEventListenerForType(eventNames().blurEvent);
2835 }
2836
2837 void Node::setOnblur(PassRefPtr<EventListener> eventListener)
2838 {
2839 setInlineEventListenerForType(eventNames().blurEvent, eventListener);
2840 }
2841
2842 EventListener* Node::onchange() const
2843 {
2844 return inlineEventListenerForType(eventNames().changeEvent);
2845 }
2846
2847 void Node::setOnchange(PassRefPtr<EventListener> eventListener)
2848 {
2849 setInlineEventListenerForType(eventNames().changeEvent, eventListener);
2850 }
2851
2852 EventListener* Node::onclick() const
2853 {
2854 return inlineEventListenerForType(eventNames().clickEvent);
2855 }
2856
2857 void Node::setOnclick(PassRefPtr<EventListener> eventListener)
2858 {
2859 setInlineEventListenerForType(eventNames().clickEvent, eventListener);
2860 }
2861
2862 EventListener* Node::oncontextmenu() const
2863 {
2864 return inlineEventListenerForType(eventNames().contextmenuEvent);
2865 }
2866
2867 void Node::setOncontextmenu(PassRefPtr<EventListener> eventListener)
2868 {
2869 setInlineEventListenerForType(eventNames().contextmenuEvent, eventListener);
2870 }
2871
2872 EventListener* Node::ondblclick() const
2873 {
2874 return inlineEventListenerForType(eventNames().dblclickEvent);
2875 }
2876
2877 void Node::setOndblclick(PassRefPtr<EventListener> eventListener)
2878 {
2879 setInlineEventListenerForType(eventNames().dblclickEvent, eventListener);
2880 }
2881
2882 EventListener* Node::onerror() const
2883 {
2884 return inlineEventListenerForType(eventNames().errorEvent);
2885 }
2886
2887 void Node::setOnerror(PassRefPtr<EventListener> eventListener)
2888 {
2889 setInlineEventListenerForType(eventNames().errorEvent, eventListener);
2890 }
2891
2892 EventListener* Node::onfocus() const
2893 {
2894 return inlineEventListenerForType(eventNames().focusEvent);
2895 }
2896
2897 void Node::setOnfocus(PassRefPtr<EventListener> eventListener)
2898 {
2899 setInlineEventListenerForType(eventNames().focusEvent, eventListener);
2900 }
2901
2902 EventListener* Node::oninput() const
2903 {
2904 return inlineEventListenerForType(eventNames().inputEvent);
2905 }
2906
2907 void Node::setOninput(PassRefPtr<EventListener> eventListener)
2908 {
2909 setInlineEventListenerForType(eventNames().inputEvent, eventListener);
2910 }
2911
2912 EventListener* Node::onkeydown() const
2913 {
2914 return inlineEventListenerForType(eventNames().keydownEvent);
2915 }
2916
2917 void Node::setOnkeydown(PassRefPtr<EventListener> eventListener)
2918 {
2919 setInlineEventListenerForType(eventNames().keydownEvent, eventListener);
2920 }
2921
2922 EventListener* Node::onkeypress() const
2923 {
2924 return inlineEventListenerForType(eventNames().keypressEvent);
2925 }
2926
2927 void Node::setOnkeypress(PassRefPtr<EventListener> eventListener)
2928 {
2929 setInlineEventListenerForType(eventNames().keypressEvent, eventListener);
2930 }
2931
2932 EventListener* Node::onkeyup() const
2933 {
2934 return inlineEventListenerForType(eventNames().keyupEvent);
2935 }
2936
2937 void Node::setOnkeyup(PassRefPtr<EventListener> eventListener)
2938 {
2939 setInlineEventListenerForType(eventNames().keyupEvent, eventListener);
2940 }
2941
2942 EventListener* Node::onload() const
2943 {
2944 return inlineEventListenerForType(eventNames().loadEvent);
2945 }
2946
2947 void Node::setOnload(PassRefPtr<EventListener> eventListener)
2948 {
2949 setInlineEventListenerForType(eventNames().loadEvent, eventListener);
2950 }
2951
2952 EventListener* Node::onmousedown() const
2953 {
2954 return inlineEventListenerForType(eventNames().mousedownEvent);
2955 }
2956
2957 void Node::setOnmousedown(PassRefPtr<EventListener> eventListener)
2958 {
2959 setInlineEventListenerForType(eventNames().mousedownEvent, eventListener);
2960 }
2961
2962 EventListener* Node::onmousemove() const
2963 {
2964 return inlineEventListenerForType(eventNames().mousemoveEvent);
2965 }
2966
2967 void Node::setOnmousemove(PassRefPtr<EventListener> eventListener)
2968 {
2969 setInlineEventListenerForType(eventNames().mousemoveEvent, eventListener);
2970 }
2971
2972 EventListener* Node::onmouseout() const
2973 {
2974 return inlineEventListenerForType(eventNames().mouseoutEvent);
2975 }
2976
2977 void Node::setOnmouseout(PassRefPtr<EventListener> eventListener)
2978 {
2979 setInlineEventListenerForType(eventNames().mouseoutEvent, eventListener);
2980 }
2981
2982 EventListener* Node::onmouseover() const
2983 {
2984 return inlineEventListenerForType(eventNames().mouseoverEvent);
2985 }
2986
2987 void Node::setOnmouseover(PassRefPtr<EventListener> eventListener)
2988 {
2989 setInlineEventListenerForType(eventNames().mouseoverEvent, eventListener);
2990 }
2991
2992 EventListener* Node::onmouseup() const
2993 {
2994 return inlineEventListenerForType(eventNames().mouseupEvent);
2995 }
2996
2997 void Node::setOnmouseup(PassRefPtr<EventListener> eventListener)
2998 {
2999 setInlineEventListenerForType(eventNames().mouseupEvent, eventListener);
3000 }
3001
3002 EventListener* Node::onmousewheel() const
3003 {
3004 return inlineEventListenerForType(eventNames().mousewheelEvent);
3005 }
3006
3007 void Node::setOnmousewheel(PassRefPtr<EventListener> eventListener)
3008 {
3009 setInlineEventListenerForType(eventNames().mousewheelEvent, eventListener);
3010 }
3011
3012 EventListener* Node::onbeforecut() const
3013 {
3014 return inlineEventListenerForType(eventNames().beforecutEvent);
3015 }
3016
3017 void Node::setOnbeforecut(PassRefPtr<EventListener> eventListener)
3018 {
3019 setInlineEventListenerForType(eventNames().beforecutEvent, eventListener);
3020 }
3021
3022 EventListener* Node::oncut() const
3023 {
3024 return inlineEventListenerForType(eventNames().cutEvent);
3025 }
3026
3027 void Node::setOncut(PassRefPtr<EventListener> eventListener)
3028 {
3029 setInlineEventListenerForType(eventNames().cutEvent, eventListener);
3030 }
3031
3032 EventListener* Node::onbeforecopy() const
3033 {
3034 return inlineEventListenerForType(eventNames().beforecopyEvent);
3035 }
3036
3037 void Node::setOnbeforecopy(PassRefPtr<EventListener> eventListener)
3038 {
3039 setInlineEventListenerForType(eventNames().beforecopyEvent, eventListener);
3040 }
3041
3042 EventListener* Node::oncopy() const
3043 {
3044 return inlineEventListenerForType(eventNames().copyEvent);
3045 }
3046
3047 void Node::setOncopy(PassRefPtr<EventListener> eventListener)
3048 {
3049 setInlineEventListenerForType(eventNames().copyEvent, eventListener);
3050 }
3051
3052 EventListener* Node::onbeforepaste() const
3053 {
3054 return inlineEventListenerForType(eventNames().beforepasteEvent);
3055 }
3056
3057 void Node::setOnbeforepaste(PassRefPtr<EventListener> eventListener)
3058 {
3059 setInlineEventListenerForType(eventNames().beforepasteEvent, eventListener);
3060 }
3061
3062 EventListener* Node::onpaste() const
3063 {
3064 return inlineEventListenerForType(eventNames().pasteEvent);
3065 }
3066
3067 void Node::setOnpaste(PassRefPtr<EventListener> eventListener)
3068 {
3069 setInlineEventListenerForType(eventNames().pasteEvent, eventListener);
3070 }
3071
3072 EventListener* Node::ondragenter() const
3073 {
3074 return inlineEventListenerForType(eventNames().dragenterEvent);
3075 }
3076
3077 void Node::setOndragenter(PassRefPtr<EventListener> eventListener)
3078 {
3079 setInlineEventListenerForType(eventNames().dragenterEvent, eventListener);
3080 }
3081
3082 EventListener* Node::ondragover() const
3083 {
3084 return inlineEventListenerForType(eventNames().dragoverEvent);
3085 }
3086
3087 void Node::setOndragover(PassRefPtr<EventListener> eventListener)
3088 {
3089 setInlineEventListenerForType(eventNames().dragoverEvent, eventListener);
3090 }
3091
3092 EventListener* Node::ondragleave() const
3093 {
3094 return inlineEventListenerForType(eventNames().dragleaveEvent);
3095 }
3096
3097 void Node::setOndragleave(PassRefPtr<EventListener> eventListener)
3098 {
3099 setInlineEventListenerForType(eventNames().dragleaveEvent, eventListener);
3100 }
3101
3102 EventListener* Node::ondrop() const
3103 {
3104 return inlineEventListenerForType(eventNames().dropEvent);
3105 }
3106
3107 void Node::setOndrop(PassRefPtr<EventListener> eventListener)
3108 {
3109 setInlineEventListenerForType(eventNames().dropEvent, eventListener);
3110 }
3111
3112 EventListener* Node::ondragstart() const
3113 {
3114 return inlineEventListenerForType(eventNames().dragstartEvent);
3115 }
3116
3117 void Node::setOndragstart(PassRefPtr<EventListener> eventListener)
3118 {
3119 setInlineEventListenerForType(eventNames().dragstartEvent, eventListener);
3120 }
3121
3122 EventListener* Node::ondrag() const
3123 {
3124 return inlineEventListenerForType(eventNames().dragEvent);
3125 }
3126
3127 void Node::setOndrag(PassRefPtr<EventListener> eventListener)
3128 {
3129 setInlineEventListenerForType(eventNames().dragEvent, eventListener);
3130 }
3131
3132 EventListener* Node::ondragend() const
3133 {
3134 return inlineEventListenerForType(eventNames().dragendEvent);
3135 }
3136
3137 void Node::setOndragend(PassRefPtr<EventListener> eventListener)
3138 {
3139 setInlineEventListenerForType(eventNames().dragendEvent, eventListener);
3140 }
3141
3142 EventListener* Node::onreset() const
3143 {
3144 return inlineEventListenerForType(eventNames().resetEvent);
3145 }
3146
3147 void Node::setOnreset(PassRefPtr<EventListener> eventListener)
3148 {
3149 setInlineEventListenerForType(eventNames().resetEvent, eventListener);
3150 }
3151
3152 EventListener* Node::onresize() const
3153 {
3154 return inlineEventListenerForType(eventNames().resizeEvent);
3155 }
3156
3157 void Node::setOnresize(PassRefPtr<EventListener> eventListener)
3158 {
3159 setInlineEventListenerForType(eventNames().resizeEvent, eventListener);
3160 }
3161
3162 EventListener* Node::onscroll() const
3163 {
3164 return inlineEventListenerForType(eventNames().scrollEvent);
3165 }
3166
3167 void Node::setOnscroll(PassRefPtr<EventListener> eventListener)
3168 {
3169 setInlineEventListenerForType(eventNames().scrollEvent, eventListener);
3170 }
3171
3172 EventListener* Node::onsearch() const
3173 {
3174 return inlineEventListenerForType(eventNames().searchEvent);
3175 }
3176
3177 void Node::setOnsearch(PassRefPtr<EventListener> eventListener)
3178 {
3179 setInlineEventListenerForType(eventNames().searchEvent, eventListener);
3180 }
3181
3182 EventListener* Node::onselect() const
3183 {
3184 return inlineEventListenerForType(eventNames().selectEvent);
3185 }
3186
3187 void Node::setOnselect(PassRefPtr<EventListener> eventListener)
3188 {
3189 setInlineEventListenerForType(eventNames().selectEvent, eventListener);
3190 }
3191
3192 EventListener* Node::onselectstart() const
3193 {
3194 return inlineEventListenerForType(eventNames().selectstartEvent);
3195 }
3196
3197 void Node::setOnselectstart(PassRefPtr<EventListener> eventListener)
3198 {
3199 setInlineEventListenerForType(eventNames().selectstartEvent, eventListener);
3200 }
3201
3202 EventListener* Node::onsubmit() const
3203 {
3204 return inlineEventListenerForType(eventNames().submitEvent);
3205 }
3206
3207 void Node::setOnsubmit(PassRefPtr<EventListener> eventListener)
3208 {
3209 setInlineEventListenerForType(eventNames().submitEvent, eventListener);
3210 }
3211
3212 EventListener* Node::onunload() const
3213 {
3214 return inlineEventListenerForType(eventNames().unloadEvent);
3215 }
3216
3217 void Node::setOnunload(PassRefPtr<EventListener> eventListener)
3218 {
3219 setInlineEventListenerForType(eventNames().unloadEvent, eventListener);
3220 }
3221
3222 } // namespace WebCore 2117 } // namespace WebCore
3223 2118
3224 #ifndef NDEBUG 2119 #ifndef NDEBUG
3225 2120
3226 void showTree(const WebCore::Node* node) 2121 void showTree(const WebCore::Node* node)
3227 { 2122 {
3228 if (node) 2123 if (node)
3229 node->showTreeForThis(); 2124 node->showTreeForThis();
3230 } 2125 }
3231 2126
3232 #endif 2127 #endif
3233 2128
OLDNEW
« no previous file with comments | « third_party/WebKit/WebCore/dom/Node.h ('k') | third_party/WebKit/WebCore/dom/Node.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698