diff options
Diffstat (limited to 'Source/WebKit/android/jni')
-rw-r--r-- | Source/WebKit/android/jni/AndroidHitTestResult.cpp | 31 | ||||
-rw-r--r-- | Source/WebKit/android/jni/AndroidHitTestResult.h | 3 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.cpp | 3 |
3 files changed, 34 insertions, 3 deletions
diff --git a/Source/WebKit/android/jni/AndroidHitTestResult.cpp b/Source/WebKit/android/jni/AndroidHitTestResult.cpp index 6f94488..bd3f458 100644 --- a/Source/WebKit/android/jni/AndroidHitTestResult.cpp +++ b/Source/WebKit/android/jni/AndroidHitTestResult.cpp @@ -28,6 +28,8 @@ #include "config.h" #include "AndroidHitTestResult.h" +#include "content/address_detector.h" +#include "android/WebHitTestInfo.h" #include "Document.h" #include "Element.h" #include "Frame.h" @@ -63,6 +65,7 @@ static struct { jfieldID m_TapHighlightColor; jfieldID m_EnclosingParentRects; jfieldID m_HasFocus; + jfieldID m_IntentUrl; } gHitTestGlue; struct field { @@ -89,6 +92,7 @@ static void InitJni(JNIEnv* env) { hitTestClass, "mTouchRects", "[Landroid/graphics/Rect;", &gHitTestGlue.m_TouchRects }, { hitTestClass, "mEditable", "Z", &gHitTestGlue.m_Editable }, { hitTestClass, "mLinkUrl", "Ljava/lang/String;", &gHitTestGlue.m_LinkUrl }, + { hitTestClass, "mIntentUrl", "Ljava/lang/String;", &gHitTestGlue.m_IntentUrl }, { hitTestClass, "mAnchorText", "Ljava/lang/String;", &gHitTestGlue.m_AnchorText }, { hitTestClass, "mImageUrl", "Ljava/lang/String;", &gHitTestGlue.m_ImageUrl }, { hitTestClass, "mAltDisplayString", "Ljava/lang/String;", &gHitTestGlue.m_AltDisplayString }, @@ -135,13 +139,25 @@ void AndroidHitTestResult::buildHighlightRects() RenderObject* renderer = node->renderer(); Vector<FloatQuad> quads; renderer->absoluteFocusRingQuads(quads); - for (int i = 0; i < quads.size(); i++) { + for (size_t i = 0; i < quads.size(); i++) { IntRect boundingBox = quads[i].enclosingBoundingBox(); boundingBox.move(-frameOffset.x(), -frameOffset.y()); m_highlightRects.append(boundingBox); } } +void AndroidHitTestResult::searchContentDetectors() +{ + AddressDetector address; + WebKit::WebHitTestInfo webHitTest(m_hitTestResult); + m_searchResult = address.FindTappedContent(webHitTest); + if (m_searchResult.valid) { + m_highlightRects.clear(); + RefPtr<Range> range = (PassRefPtr<Range>) m_searchResult.range; + range->textRects(m_highlightRects, true); + } +} + void setStringField(JNIEnv* env, jobject obj, jfieldID field, const String& str) { jstring jstr = wtfStringToJstring(env, str, false); @@ -149,6 +165,13 @@ void setStringField(JNIEnv* env, jobject obj, jfieldID field, const String& str) env->DeleteLocalRef(jstr); } +void setStringField(JNIEnv* env, jobject obj, jfieldID field, const GURL& url) +{ + jstring jstr = stdStringToJstring(env, url.spec(), false); + env->SetObjectField(obj, field, jstr); + env->DeleteLocalRef(jstr); +} + void setRectArray(JNIEnv* env, jobject obj, jfieldID field, Vector<IntRect> &rects) { jobjectArray array = intRectVectorToRectArray(env, rects); @@ -176,6 +199,8 @@ jobject AndroidHitTestResult::createJavaObject(JNIEnv* env) SET_BOOL(Editable, m_hitTestResult.isContentEditable()); SET_STRING(LinkUrl, m_hitTestResult.absoluteLinkURL().string()); + if (m_searchResult.valid) + SET_STRING(IntentUrl, m_searchResult.intent_url); SET_STRING(ImageUrl, m_hitTestResult.absoluteImageURL().string()); SET_STRING(AltDisplayString, m_hitTestResult.altDisplayString()); TextDirection titleTextDirection; @@ -201,8 +226,8 @@ jobject AndroidHitTestResult::createJavaObject(JNIEnv* env) Vector<IntRect> AndroidHitTestResult::enclosingParentRects(Node* node) { - int lastX; int count = 0; + int lastX = 0; Vector<IntRect> rects; while (node && count < 5) { @@ -214,7 +239,7 @@ Vector<IntRect> AndroidHitTestResult::enclosingParentRects(Node* node) node->document()->frame()); IntRect rect = render->absoluteBoundingBoxRect(); rect.move(-frameOffset.x(), -frameOffset.y()); - if (rect.x() != lastX) { + if (count == 0 || rect.x() != lastX) { rects.append(rect); lastX = rect.x(); count++; diff --git a/Source/WebKit/android/jni/AndroidHitTestResult.h b/Source/WebKit/android/jni/AndroidHitTestResult.h index f9709ac..5bbfc6b 100644 --- a/Source/WebKit/android/jni/AndroidHitTestResult.h +++ b/Source/WebKit/android/jni/AndroidHitTestResult.h @@ -26,6 +26,7 @@ #ifndef AndroidHitTestResult_h #define AndroidHitTestResult_h +#include "content/content_detector.h" #include "Element.h" #include "HitTestResult.h" #include "IntRect.h" @@ -48,6 +49,7 @@ public: void setURLElement(WebCore::Element* element); void buildHighlightRects(); + void searchContentDetectors(); jobject createJavaObject(JNIEnv*); @@ -57,6 +59,7 @@ private: WebViewCore* m_webViewCore; WebCore::HitTestResult m_hitTestResult; Vector<WebCore::IntRect> m_highlightRects; + ContentDetector::Result m_searchResult; }; } // namespace android diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp index 0030621..08ad3b6 100644 --- a/Source/WebKit/android/jni/WebViewCore.cpp +++ b/Source/WebKit/android/jni/WebViewCore.cpp @@ -2014,6 +2014,7 @@ AndroidHitTestResult WebViewCore::hitTestAtPoint(int x, int y, int slop, bool do } } if (!nodeDataList.size()) { + androidHitResult.searchContentDetectors(); return androidHitResult; } // finally select the node with the largest overlap with the fat point @@ -2061,6 +2062,8 @@ AndroidHitTestResult WebViewCore::hitTestAtPoint(int x, int y, int slop, bool do m_scrollOffsetX, m_scrollOffsetY); } } + } else { + androidHitResult.searchContentDetectors(); } return androidHitResult; } |