diff options
Diffstat (limited to 'WebKit/android/nav')
-rw-r--r-- | WebKit/android/nav/CacheBuilder.cpp | 147 | ||||
-rw-r--r-- | WebKit/android/nav/CacheBuilder.h | 4 |
2 files changed, 91 insertions, 60 deletions
diff --git a/WebKit/android/nav/CacheBuilder.cpp b/WebKit/android/nav/CacheBuilder.cpp index b042ec7..44beffc 100644 --- a/WebKit/android/nav/CacheBuilder.cpp +++ b/WebKit/android/nav/CacheBuilder.cpp @@ -27,8 +27,8 @@ #include "CachedNode.h" #include "CachedRoot.h" #include "Document.h" +#include "EventListener.h" #include "EventNames.h" -#include "EventTargetNode.h" #include "Frame.h" #include "FrameLoader.h" #include "FrameLoaderClientAndroid.h" @@ -45,6 +45,7 @@ #include "InlineTextBox.h" #include "KURL.h" #include "PluginView.h" +#include "RegisteredEventListener.h" #include "RenderImage.h" #include "RenderInline.h" #include "RenderListBox.h" @@ -88,8 +89,20 @@ Frame* CacheBuilder::FrameAnd(const CacheBuilder* cacheBuilder) { return loader->getFrame(); } + #if DUMP_NAV_CACHE +static bool hasEventListener(Node* node, const AtomicString& eventType) { + const RegisteredEventListenerVector& listeners = node->eventListeners(); + size_t size = listeners.size(); + for (size_t i = 0; i < size; ++i) { + const RegisteredEventListener& r = *listeners[i]; + if (r.eventType() == eventType) + return true; + } + return false; +} + #define DEBUG_BUFFER_SIZE 256 #define DEBUG_WRAP_SIZE 150 #define DEBUG_WRAP_MAX 170 @@ -345,24 +358,20 @@ void CacheBuilder::Debug::groups() { DUMP_NAV_LOGD("static DebugTestNode TEST%s_RECTS[] = {\n", name); do { String properties; - EventTargetNode* elementTarget = node->isEventTargetNode() ? - (EventTargetNode*) node : NULL; - if (elementTarget) { - if (elementTarget->getEventListener(eventNames().clickEvent)) - properties.append("ONCLICK | "); - if (elementTarget->getEventListener(eventNames().mousedownEvent)) - properties.append("MOUSEDOWN | "); - if (elementTarget->getEventListener(eventNames().mouseupEvent)) - properties.append("MOUSEUP | "); - if (elementTarget->getEventListener(eventNames().mouseoverEvent)) - properties.append("MOUSEOVER | "); - if (elementTarget->getEventListener(eventNames().mouseoutEvent)) - properties.append("MOUSEOUT | "); - if (elementTarget->getEventListener(eventNames().keydownEvent)) - properties.append("KEYDOWN | "); - if (elementTarget->getEventListener(eventNames().keyupEvent)) - properties.append("KEYUP | "); - } + if (hasEventListener(node, eventNames().clickEvent)) + properties.append("ONCLICK | "); + if (hasEventListener(node, eventNames().mousedownEvent)) + properties.append("MOUSEDOWN | "); + if (hasEventListener(node, eventNames().mouseupEvent)) + properties.append("MOUSEUP | "); + if (hasEventListener(node, eventNames().mouseoverEvent)) + properties.append("MOUSEOVER | "); + if (hasEventListener(node, eventNames().mouseoutEvent)) + properties.append("MOUSEOUT | "); + if (hasEventListener(node, eventNames().keydownEvent)) + properties.append("KEYDOWN | "); + if (hasEventListener(node, eventNames().keyupEvent)) + properties.append("KEYUP | "); if (CacheBuilder::HasFrame(node)) properties.append("FRAME | "); if (focus == node) { @@ -553,8 +562,6 @@ bool CacheBuilder::Debug::isFocusable(Node* node) { return true; if (node->isFocusable()) return true; - if (node->isEventTargetNode()) - return true; if (CacheBuilder::AnyIsClick(node)) return false; if (CacheBuilder::HasTriggerEvent(node)) @@ -807,20 +814,35 @@ void CacheBuilder::adjustForColumns(const ClipColumnTracker& track, } } +// Checks if a node has one of event listener types. +bool CacheBuilder::NodeHasEventListeners(Node* node, AtomicString* eventTypes, int length) { + const RegisteredEventListenerVector& listeners = node->eventListeners(); + size_t size = listeners.size(); + for (size_t i = 0; i < size; ++i) { + const RegisteredEventListener& r = *listeners[i]; + for (int j = 0; j < length; ++j) { + if (r.eventType() == eventTypes[j]) + return true; + } + } + return false; +} + bool CacheBuilder::AnyChildIsClick(Node* node) { + AtomicString eventTypes[5] = { + eventNames().clickEvent, + eventNames().mousedownEvent, + eventNames().mouseupEvent, + eventNames().keydownEvent, + eventNames().keyupEvent + }; + Node* child = node->firstChild(); while (child != NULL) { - if (child->isEventTargetNode()) { - EventTargetNode* target = (EventTargetNode*) child; - if (target->isFocusable() || - target->getEventListener(eventNames().clickEvent) || - target->getEventListener(eventNames().mousedownEvent) || - target->getEventListener(eventNames().mouseupEvent) || - target->getEventListener(eventNames().keydownEvent) || - target->getEventListener(eventNames().keyupEvent)) + if (child->isFocusable() || + NodeHasEventListeners(child, eventTypes, 5)) return true; - } if (AnyChildIsClick(child)) return true; child = child->nextSibling(); @@ -832,18 +854,26 @@ bool CacheBuilder::AnyIsClick(Node* node) { if (node->hasTagName(HTMLNames::bodyTag)) return AnyChildIsClick(node); - EventTargetNode* target = (EventTargetNode*) node; - if (target->getEventListener(eventNames().mouseoverEvent) == NULL && - target->getEventListener(eventNames().mouseoutEvent) == NULL && - target->getEventListener(eventNames().keydownEvent) == NULL && - target->getEventListener(eventNames().keyupEvent) == NULL) - return false; - if (target->getEventListener(eventNames().clickEvent)) - return false; - if (target->getEventListener(eventNames().mousedownEvent)) + + AtomicString eventTypeSetOne[4] = { + eventNames().mouseoverEvent, + eventNames().mouseoutEvent, + eventNames().keydownEvent, + eventNames().keyupEvent + }; + + if (!NodeHasEventListeners(node, eventTypeSetOne, 4)) return false; - if (target->getEventListener(eventNames().mouseupEvent)) + + AtomicString eventTypeSetTwo[3] = { + eventNames().clickEvent, + eventNames().mousedownEvent, + eventNames().mouseupEvent + }; + + if (NodeHasEventListeners(node, eventTypeSetTwo, 3)) return false; + return AnyChildIsClick(node); } @@ -1162,10 +1192,9 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame, (const HTMLAnchorElement*) node; if (!anchorNode->isFocusable() && !HasTriggerEvent(node)) continue; - EventTargetNode* target = (EventTargetNode*) node; - if (target->disabled()) + if (node->disabled()) continue; - hasMouseOver = target->getEventListener(eventNames().mouseoverEvent); + hasMouseOver = NodeHasEventListeners(node, &eventNames().mouseoverEvent, 1); isAnchor = true; KURL href = anchorNode->href(); if (!href.isEmpty() && !href.protocolIs("javascript")) @@ -1198,10 +1227,7 @@ void CacheBuilder::BuildFrame(Frame* root, Frame* frame, bool isFocusable = node->isKeyboardFocusable(NULL) || node->isMouseFocusable() || node->isFocusable(); if (isFocusable == false) { - if (node->isEventTargetNode() == false) - continue; - EventTargetNode* eventTargetNode = (EventTargetNode*) node; - if (eventTargetNode->disabled()) + if (node->disabled()) continue; bool overOrOut = HasOverOrOut(node); bool hasTrigger = HasTriggerEvent(node); @@ -1345,7 +1371,6 @@ bool CacheBuilder::CleanUpContainedNodes(CachedFrame* cachedFrame, lastNode->isKeyboardFocusable(NULL) == false && lastNode->isMouseFocusable() == false && lastNode->isFocusable() == false && - lastNode->isEventTargetNode() == true && HasOverOrOut(lastNode) == true && HasTriggerEvent(lastNode) == false; if (cachedFrame->focusIndex() == lastChildIndex) @@ -2432,20 +2457,26 @@ Frame* CacheBuilder::HasFrame(Node* node) bool CacheBuilder::HasOverOrOut(Node* node) { - EventTargetNode* target = (EventTargetNode*) node; - return target->getEventListener(eventNames().mouseoverEvent) || - target->getEventListener(eventNames().mouseoutEvent); + // eventNames are thread-local data, I avoid using 'static' variable here. + AtomicString eventTypes[2] = { + eventNames().mouseoverEvent, + eventNames().mouseoutEvent + }; + return NodeHasEventListeners(node, eventTypes, 2); } bool CacheBuilder::HasTriggerEvent(Node* node) { - EventTargetNode* target = (EventTargetNode*) node; - return target->getEventListener(eventNames().clickEvent) || - target->getEventListener(eventNames().mousedownEvent) || - target->getEventListener(eventNames().mouseupEvent) || - target->getEventListener(eventNames().keydownEvent) || - target->getEventListener(eventNames().keyupEvent); + AtomicString eventTypes[5] = { + eventNames().clickEvent, + eventNames().mousedownEvent, + eventNames().mouseupEvent, + eventNames().keydownEvent, + eventNames().keyupEvent + }; + + return NodeHasEventListeners(node, eventTypes, 5); } // #define EMAIL_PATTERN "x@y.d" // where 'x' is letters, numbers, and '-', '.', '_' ; 'y' is 'x' without the underscore, and 'd' is a valid domain @@ -2504,8 +2535,6 @@ Node* CacheBuilder::findByCenter(int x, int y) const return node; if (node->isFocusable()) return node; - if (node->isEventTargetNode() == false) - continue; if (AnyIsClick(node)) continue; if (HasTriggerEvent(node) == false) diff --git a/WebKit/android/nav/CacheBuilder.h b/WebKit/android/nav/CacheBuilder.h index 32ae0af..dbed6e8 100644 --- a/WebKit/android/nav/CacheBuilder.h +++ b/WebKit/android/nav/CacheBuilder.h @@ -39,7 +39,8 @@ using namespace WebCore; namespace WebCore { - + +class AtomicString; class Document; class Frame; class HTMLAreaElement; @@ -194,6 +195,7 @@ private: WTF::Vector<IntRect>* result, IntRect* focusBounds); static bool AnyIsClick(Node* node); static bool AnyChildIsClick(Node* node); + static bool NodeHasEventListeners(Node* node, AtomicString* eventTypes, int length); void BuildFrame(Frame* root, Frame* frame, CachedRoot* cachedRoot, CachedFrame* cachedFrame); bool CleanUpContainedNodes(CachedFrame* cachedFrame, |