summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/android
diff options
context:
space:
mode:
authorMangesh Ghiware <mghiware@google.com>2012-02-06 15:27:57 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-02-06 15:27:57 -0800
commitaf22837a4a9e6f93222ff1c589fccc172814c32d (patch)
tree967d8ac25063b47512eaa7890c49b98841711cb7 /Source/WebKit/android
parentfaf2b5dab67cbe9c5a9244f3912e916d0184f765 (diff)
parent3e70ba631b58e6013759049bad6eaa484a876801 (diff)
downloadexternal_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.cpp37
-rw-r--r--Source/WebKit/android/jni/AndroidHitTestResult.h7
-rw-r--r--Source/WebKit/android/jni/WebViewCore.cpp7
-rw-r--r--Source/WebKit/android/jni/WebViewCore.h2
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);
/**