diff options
author | Mangesh Ghiware <mghiware@google.com> | 2012-02-06 15:27:57 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-02-06 15:27:57 -0800 |
commit | af22837a4a9e6f93222ff1c589fccc172814c32d (patch) | |
tree | 967d8ac25063b47512eaa7890c49b98841711cb7 /Source/WebKit/android | |
parent | faf2b5dab67cbe9c5a9244f3912e916d0184f765 (diff) | |
parent | 3e70ba631b58e6013759049bad6eaa484a876801 (diff) | |
download | external_webkit-af22837a4a9e6f93222ff1c589fccc172814c32d.zip external_webkit-af22837a4a9e6f93222ff1c589fccc172814c32d.tar.gz external_webkit-af22837a4a9e6f93222ff1c589fccc172814c32d.tar.bz2 |
Merge "Add enclosing parent rects to hit test object."
Diffstat (limited to 'Source/WebKit/android')
-rw-r--r-- | Source/WebKit/android/jni/AndroidHitTestResult.cpp | 37 | ||||
-rw-r--r-- | Source/WebKit/android/jni/AndroidHitTestResult.h | 7 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.cpp | 7 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.h | 2 |
4 files changed, 46 insertions, 7 deletions
diff --git a/Source/WebKit/android/jni/AndroidHitTestResult.cpp b/Source/WebKit/android/jni/AndroidHitTestResult.cpp index fd2fc25..0a69007 100644 --- a/Source/WebKit/android/jni/AndroidHitTestResult.cpp +++ b/Source/WebKit/android/jni/AndroidHitTestResult.cpp @@ -59,6 +59,7 @@ static struct JavaGlue { jfieldID m_hitTestEditable; jfieldID m_hitTestTouchRects; jfieldID m_hitTestTapHighlightColor; + jfieldID m_hitTestEnclosingParentRects; } gJavaGlue; struct field { @@ -90,6 +91,7 @@ static void InitJni(JNIEnv* env) { hitTestClass, "mAltDisplayString", "Ljava/lang/String;", &gJavaGlue.m_hitTestAltDisplayString }, { hitTestClass, "mTitle", "Ljava/lang/String;", &gJavaGlue.m_hitTestTitle }, { hitTestClass, "mTapHighlightColor", "I", &gJavaGlue.m_hitTestTapHighlightColor }, + { hitTestClass, "mEnclosingParentRects", "[Landroid/graphics/Rect;", &gJavaGlue.m_hitTestEnclosingParentRects }, {0, 0, 0, 0}, }; @@ -103,8 +105,9 @@ static void InitJni(JNIEnv* env) gJniInitialized = true; } -AndroidHitTestResult::AndroidHitTestResult(WebCore::HitTestResult& hitTestResult) - : m_hitTestResult(hitTestResult) +AndroidHitTestResult::AndroidHitTestResult(WebViewCore* webViewCore, WebCore::HitTestResult& hitTestResult) + : m_webViewCore(webViewCore) + , m_hitTestResult(hitTestResult) { } @@ -137,6 +140,9 @@ jobject AndroidHitTestResult::createJavaObject(JNIEnv* env) jobject hitTest = env->NewObject(hitTestClass, gJavaGlue.m_hitTestInit); setRectArray(env, hitTest, gJavaGlue.m_hitTestTouchRects, m_highlightRects); + Vector<IntRect> rects = enclosingParentRects(m_hitTestResult.innerNode()); + setRectArray(env, hitTest, gJavaGlue.m_hitTestEnclosingParentRects, rects); + SET_BOOL(Editable, m_hitTestResult.isContentEditable()); SET_STRING(LinkUrl, m_hitTestResult.absoluteLinkURL().string()); SET_STRING(ImageUrl, m_hitTestResult.absoluteImageURL().string()); @@ -157,4 +163,31 @@ jobject AndroidHitTestResult::createJavaObject(JNIEnv* env) return hitTest; } +Vector<IntRect> AndroidHitTestResult::enclosingParentRects(Node* node) +{ + int lastX; + int count = 0; + Vector<IntRect> rects; + + while (node && count < 5) { + RenderObject* render = node->renderer(); + if (!render || render->isBody()) + break; + + IntPoint frameOffset = m_webViewCore->convertGlobalContentToFrameContent(IntPoint(), + node->document()->frame()); + IntRect rect = render->absoluteBoundingBoxRect(); + rect.move(-frameOffset.x(), -frameOffset.y()); + if (rect.x() != lastX) { + rects.append(rect); + lastX = rect.x(); + count++; + } + + node = node->parentNode(); + } + + return rects; +} + } /* namespace android */ diff --git a/Source/WebKit/android/jni/AndroidHitTestResult.h b/Source/WebKit/android/jni/AndroidHitTestResult.h index 28a9ee3..e4233fd 100644 --- a/Source/WebKit/android/jni/AndroidHitTestResult.h +++ b/Source/WebKit/android/jni/AndroidHitTestResult.h @@ -34,10 +34,12 @@ namespace android { +class WebViewCore; + class AndroidHitTestResult { public: - AndroidHitTestResult(WebCore::HitTestResult&); + AndroidHitTestResult(WebViewCore*, WebCore::HitTestResult&); ~AndroidHitTestResult() {} WebCore::HitTestResult& hitTestResult() { return m_hitTestResult; } @@ -46,6 +48,9 @@ public: jobject createJavaObject(JNIEnv*); private: + Vector<WebCore::IntRect> enclosingParentRects(WebCore::Node* node); + + WebViewCore* m_webViewCore; WebCore::HitTestResult m_hitTestResult; Vector<WebCore::IntRect> m_highlightRects; }; diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp index 1fb3c75..dab5ed5 100644 --- a/Source/WebKit/android/jni/WebViewCore.cpp +++ b/Source/WebKit/android/jni/WebViewCore.cpp @@ -1830,10 +1830,11 @@ SelectText* WebViewCore::createSelectText(const VisibleSelection& selection) return selectTextContainer; } -IntPoint WebViewCore::convertGlobalContentToFrameContent(const IntPoint& point) +IntPoint WebViewCore::convertGlobalContentToFrameContent(const IntPoint& point, WebCore::Frame* frame) { + if (!frame) frame = focusedFrame(); IntPoint frameOffset(-m_scrollOffsetX, -m_scrollOffsetY); - frameOffset = focusedFrame()->view()->windowToContents(frameOffset); + frameOffset = frame->view()->windowToContents(frameOffset); return IntPoint(point.x() + frameOffset.x(), point.y() + frameOffset.y()); } @@ -1885,7 +1886,7 @@ AndroidHitTestResult WebViewCore::hitTestAtPoint(int x, int y, int slop, bool do moveMouse(m_mainFrame, x, y); HitTestResult hitTestResult = m_mainFrame->eventHandler()->hitTestResultAtPoint(IntPoint(x, y), false, false, DontHitTestScrollbars, HitTestRequest::Active | HitTestRequest::ReadOnly, IntSize(slop, slop)); - AndroidHitTestResult androidHitResult(hitTestResult); + AndroidHitTestResult androidHitResult(this, hitTestResult); if (!hitTestResult.innerNode() || !hitTestResult.innerNode()->inDocument()) { ALOGE("Should not happen: no in document Node found"); return androidHitResult; diff --git a/Source/WebKit/android/jni/WebViewCore.h b/Source/WebKit/android/jni/WebViewCore.h index 034229d..956ffed 100644 --- a/Source/WebKit/android/jni/WebViewCore.h +++ b/Source/WebKit/android/jni/WebViewCore.h @@ -610,7 +610,7 @@ namespace android { // Converts from the global content coordinates that WebView sends // to frame-local content coordinates using the focused frame - IntPoint convertGlobalContentToFrameContent(const IntPoint& point); + IntPoint convertGlobalContentToFrameContent(const IntPoint& point, WebCore::Frame* frame = 0); static void layerToAbsoluteOffset(const LayerAndroid* layer, IntPoint& offset); /** |