nav to container if it wants key events

When a text field or text area (or plugin) has another navable
element completely overlaying it, allow the trackball to move
from that inner element to the outer one.

Also, allow this to get a 'second chance' -- treat the case
when one element overlays another as a spacial nav and allow
it to retry in nav find algorithms.

fixes http://b/2266756
diff --git a/WebKit/android/nav/CachedFrame.cpp b/WebKit/android/nav/CachedFrame.cpp
index 54c295d..8a05cd6 100644
--- a/WebKit/android/nav/CachedFrame.cpp
+++ b/WebKit/android/nav/CachedFrame.cpp
@@ -753,7 +753,7 @@
 int CachedFrame::framePartCommon(BestData& testData,
     const CachedNode* test, BestData* bestData, const CachedNode* cursor) const
 {
-    if (cursor && testData.mNodeBounds.contains(cursor->bounds())) {
+    if (cursor && testData.mNodeBounds.contains(cursor->bounds()) && !test->wantsKeyEvents()) {
         testData.mNode->setCondition(CachedNode::NOT_ENCLOSING_CURSOR);
         return REJECT_TEST;
     }
@@ -1144,7 +1144,7 @@
     int inNavBottom = navBounds.bottom() - mNodeBounds.bottom();
     setNavInclusion(testRight - navBounds.right(), navBounds.x() - testX);
     bool subsumes = navBounds.height() > 0 && inOrSubsumesNav();
-    if (inNavTop <= 0 && inNavBottom <= 0 && subsumes) {
+    if (inNavTop <= 0 && inNavBottom <= 0 && subsumes && !mNode->wantsKeyEvents()) {
         mNode->setCondition(CachedNode::NOT_ENCLOSING_CURSOR);
         return REJECT_TEST;
     }
@@ -1184,7 +1184,7 @@
     int inNavLeft = mNodeBounds.x() - navBounds.x();
     setNavInclusion(navBounds.y() - testY, testBottom - navBounds.bottom());
     bool subsumes = navBounds.width() > 0 && inOrSubsumesNav();
-    if (inNavLeft <= 0 && inNavRight <= 0 && subsumes) {
+    if (inNavLeft <= 0 && inNavRight <= 0 && subsumes && !mNode->wantsKeyEvents()) {
         mNode->setCondition(CachedNode::NOT_ENCLOSING_CURSOR);
         return REJECT_TEST;
     }
@@ -1224,7 +1224,7 @@
     int inNavRight = navBounds.right() - mNodeBounds.right();
     setNavInclusion(testBottom - navBounds.bottom(), navBounds.y() - testY);
     bool subsumes = navBounds.width() > 0 && inOrSubsumesNav();
-    if (inNavLeft <= 0 && inNavRight <= 0 && subsumes) {
+    if (inNavLeft <= 0 && inNavRight <= 0 && subsumes && !mNode->wantsKeyEvents()) {
         mNode->setCondition(CachedNode::NOT_ENCLOSING_CURSOR);
         return REJECT_TEST;
     }
@@ -1264,7 +1264,7 @@
     int inNavTop = mNodeBounds.y() - navBounds.y();
     setNavInclusion(navBounds.x() - testX, testRight - navBounds.right());
     bool subsumes = navBounds.height() > 0 && inOrSubsumesNav();
-    if (inNavTop <= 0 && inNavBottom <= 0 && subsumes) {
+    if (inNavTop <= 0 && inNavBottom <= 0 && subsumes && !mNode->wantsKeyEvents()) {
         mNode->setCondition(CachedNode::NOT_ENCLOSING_CURSOR);
         return REJECT_TEST;
     }
diff --git a/WebKit/android/nav/CachedNode.h b/WebKit/android/nav/CachedNode.h
index 7374080..bfc2107 100644
--- a/WebKit/android/nav/CachedNode.h
+++ b/WebKit/android/nav/CachedNode.h
@@ -62,6 +62,7 @@
         IN_UMBRA,
         IN_WORKING,
         LEFTMOST,
+        NOT_ENCLOSING_CURSOR,
         OVERLAP_OR_EDGE_FURTHER,
         PREFERRED, // better overlap measure
         SECOND_CHANCE_END = PREFERRED, // must be last in list
@@ -73,7 +74,6 @@
         HIGHER_TAB_INDEX,
         IN_CURSOR,
         IN_CURSOR_CHILDREN,
-        NOT_ENCLOSING_CURSOR,
         NOT_CURSOR_NODE,
         OUTSIDE_OF_BEST, // containership
         OUTSIDE_OF_ORIGINAL, // containership