OSDN Git Service

pass the x and y to retrieve anchor data
authorCary Clark <cary@android.com>
Tue, 30 Nov 2010 20:51:10 +0000 (15:51 -0500)
committerCary Clark <cary@android.com>
Wed, 1 Dec 2010 13:17:11 +0000 (08:17 -0500)
During a long press, the original pointer to the
node and frame may change. Pass the location instead
to attempt to find the anchor.

companion change in frameworks/base

bug:3240869
Change-Id: Idf5eb67e2cb544dfa312e41f9224813c6ca80563

WebKit/android/jni/WebViewCore.cpp
WebKit/android/jni/WebViewCore.h

index d9f2836..9099bb6 100644 (file)
@@ -1306,24 +1306,36 @@ void WebViewCore::dumpNavTree()
 #endif
 }
 
-WebCore::HTMLAnchorElement* WebViewCore::retrieveAnchorElement(WebCore::Frame* frame, WebCore::Node* node)
+WebCore::HTMLAnchorElement* WebViewCore::retrieveAnchorElement(int x, int y)
 {
-    if (!CacheBuilder::validNode(m_mainFrame, frame, node))
+    HitTestResult hitTestResult = m_mainFrame->eventHandler()
+        ->hitTestResultAtPoint(IntPoint(x, y), false, false,
+        DontHitTestScrollbars, HitTestRequest::Active | HitTestRequest::ReadOnly,
+        IntSize(1, 1));
+    if (!hitTestResult.innerNode() || !hitTestResult.innerNode()->inDocument()) {
+        LOGE("Should not happen: no in document Node found");
+        return 0;
+    }
+    const ListHashSet<RefPtr<Node> >& list = hitTestResult.rectBasedTestResult();
+    if (list.isEmpty()) {
+        LOGE("Should not happen: no rect-based-test nodes found");
         return 0;
+    }
+    Node* node = hitTestResult.innerNode();
     if (!node->hasTagName(WebCore::HTMLNames::aTag))
         return 0;
     return static_cast<WebCore::HTMLAnchorElement*>(node);
 }
 
-WTF::String WebViewCore::retrieveHref(WebCore::Frame* frame, WebCore::Node* node)
+WTF::String WebViewCore::retrieveHref(int x, int y)
 {
-    WebCore::HTMLAnchorElement* anchor = retrieveAnchorElement(frame, node);
+    WebCore::HTMLAnchorElement* anchor = retrieveAnchorElement(x, y);
     return anchor ? anchor->href() : WTF::String();
 }
 
-WTF::String WebViewCore::retrieveAnchorText(WebCore::Frame* frame, WebCore::Node* node)
+WTF::String WebViewCore::retrieveAnchorText(int x, int y)
 {
-    WebCore::HTMLAnchorElement* anchor = retrieveAnchorElement(frame, node);
+    WebCore::HTMLAnchorElement* anchor = retrieveAnchorElement(x, y);
     return anchor ? anchor->text() : WTF::String();
 }
 
@@ -3633,31 +3645,27 @@ static void TouchUp(JNIEnv *env, jobject obj, jint touchGeneration,
         (WebCore::Frame*) frame, (WebCore::Node*) node, x, y);
 }
 
-static jstring RetrieveHref(JNIEnv *env, jobject obj, jint frame,
-        jint node)
+static jstring RetrieveHref(JNIEnv *env, jobject obj, jint x, jint y)
 {
 #ifdef ANDROID_INSTRUMENT
     TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
 #endif
     WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
     LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
-    WTF::String result = viewImpl->retrieveHref((WebCore::Frame*) frame,
-            (WebCore::Node*) node);
+    WTF::String result = viewImpl->retrieveHref(x, y);
     if (!result.isEmpty())
         return WtfStringToJstring(env, result);
     return 0;
 }
 
-static jstring RetrieveAnchorText(JNIEnv *env, jobject obj, jint frame,
-        jint node)
+static jstring RetrieveAnchorText(JNIEnv *env, jobject obj, jint x, jint y)
 {
 #ifdef ANDROID_INSTRUMENT
     TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
 #endif
     WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
     LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
-    WTF::String result = viewImpl->retrieveAnchorText((WebCore::Frame*) frame,
-            (WebCore::Node*) node);
+    WTF::String result = viewImpl->retrieveAnchorText(x, y);
     if (!result.isEmpty())
         return WtfStringToJstring(env, result);
     return 0;
index 1e2f130..53cca79 100644 (file)
@@ -286,8 +286,8 @@ namespace android {
         //
 
 
-        WTF::String retrieveHref(WebCore::Frame* frame, WebCore::Node* node);
-        WTF::String retrieveAnchorText(WebCore::Frame* frame, WebCore::Node* node);
+        WTF::String retrieveHref(int x, int y);
+        WTF::String retrieveAnchorText(int x, int y);
         WTF::String requestLabel(WebCore::Frame* , WebCore::Node* );
 
         // If the focus is a textfield (<input>), textarea, or contentEditable,
@@ -605,7 +605,7 @@ namespace android {
         void rebuildPictureSet(PictureSet* );
         void sendNotifyProgressFinished();
         bool handleMouseClick(WebCore::Frame* framePtr, WebCore::Node* nodePtr);
-        WebCore::HTMLAnchorElement* retrieveAnchorElement(WebCore::Frame* frame, WebCore::Node* node);
+        WebCore::HTMLAnchorElement* retrieveAnchorElement(int x, int y);
         // below are members responsible for accessibility support
         String modifySelectionTextNavigationAxis(DOMSelection* selection, int direction, int granularity);
         String modifySelectionDomNavigationAxis(DOMSelection* selection, int direction, int granularity);