diff options
author | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-08 18:34:05 +0000 |
---|---|---|
committer | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-08 18:34:05 +0000 |
commit | a7198a1f23bd0fa70e1486e4deb71c1812572e26 (patch) | |
tree | ef9457229bb64e328d7602559c479101b0a11f6b /android_webview/common | |
parent | 72bd37ea59cc9b056dda7005e761aaba958e9eca (diff) | |
download | chromium_src-a7198a1f23bd0fa70e1486e4deb71c1812572e26.zip chromium_src-a7198a1f23bd0fa70e1486e4deb71c1812572e26.tar.gz chromium_src-a7198a1f23bd0fa70e1486e4deb71c1812572e26.tar.bz2 |
Implement hit test related methods in Android WebView
The public Android WebView APIs are WebView.getHitTestResult,
WebView.requestFocusNodeHref, and WebView.requestImageRef.
These APIs are mostly used for creating context menus but have
become broken APIs as the Android evolved from the single
threaded initial version of WebView.
* The names are misleading since the value retrieved is based both on
a combination of touch events and FocusedNodeChanged callback
from WebKit.
* The methods are synchronous and there are inherently racy. This is
the case with with the latest version of Android WebView as well.
However this may become more of a problem as Chromium is
multi-processed.
* The methods are inefficient since work needs to be done even if the
client application never call these methods.
This is the first part of largely replicating the broken code with tests
and extensive comments. The goal is to replicate existing logic but
there are probably corner cases that are not matched.
Overall flow is on a touch event or focused node changed event, perform
a WebKit hit test, get the relevant result data and save it in the browser.
The return what is saved when apps query for the data.
Work still needs to be done after this:
* Implement updating hit test data after tab-ing to a link
* Hook up content detection code in content/
* Implement focus highlighting with DPAD controls.
BUG=
All bots are green except unrelated instrumentation tests.
AndroidWebView instrumentation tests are green.
NOTRY=true
Review URL: https://chromiumcodereview.appspot.com/11360037
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@166712 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview/common')
-rw-r--r-- | android_webview/common/aw_hit_test_data.cc | 13 | ||||
-rw-r--r-- | android_webview/common/aw_hit_test_data.h | 76 | ||||
-rw-r--r-- | android_webview/common/render_view_messages.h | 23 |
3 files changed, 110 insertions, 2 deletions
diff --git a/android_webview/common/aw_hit_test_data.cc b/android_webview/common/aw_hit_test_data.cc new file mode 100644 index 0000000..997b606 --- /dev/null +++ b/android_webview/common/aw_hit_test_data.cc @@ -0,0 +1,13 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "android_webview/common/aw_hit_test_data.h" + +namespace android_webview { + +AwHitTestData::AwHitTestData() : type(UNKNOWN_TYPE) {} + +AwHitTestData::~AwHitTestData() {} + +} // namespace android_webview diff --git a/android_webview/common/aw_hit_test_data.h b/android_webview/common/aw_hit_test_data.h new file mode 100644 index 0000000..a05ea2e --- /dev/null +++ b/android_webview/common/aw_hit_test_data.h @@ -0,0 +1,76 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ANDROID_WEBVIEW_COMMON_AW_HIT_TEST_DATA_H_ +#define ANDROID_WEBVIEW_COMMON_AW_HIT_TEST_DATA_H_ + +#include "base/string16.h" +#include "googleurl/src/gurl.h" + +namespace android_webview { + +// Holdes all hit test data needed by public WebView APIs. +// The Java counter part to this is AwContents.HitTestData. +struct AwHitTestData { + + // Matches exactly with constants in WebView.HitTestResult, with deprecated + // values removed. + enum Type { + // Default type where nothing we are interested in is hit. + // |extra_data_for_type| will be empty. All other values should be emtpy + // except the special case described below. + // For special case of invalid or javascript scheme url that would + // otherwise be type an LINK type, |href|, |anchor_text|, |img_src| contain + // their normal values for the respective type. + UNKNOWN_TYPE = 0, + + // Content detection types. Not used yet. + // TODO(boliu): Hook up content detection. + PHONE_TYPE = 2, + GEO_TYPE = 3, + EMAIL_TYPE = 4, + + // Hit on a pure image (without links). |extra_data_for_type|, |href|, + // and |anchor_text| will be empty. |img_src| will contain the absolute + // source url of the image. + IMAGE_TYPE = 5, + + // Hit on a link with valid and non-javascript url and without embedded + // image. |extra_data_for_type| is the valid absolute url of the link. + // |href| will contain the exact href attribute string. |anchor_text| will + // contain the anchor text if the link is an anchor tag. |img_src| will be + // empty. + // Note 1: If the link url is invalid or javascript scheme, then the type + // will be UNKNOWN_TYPE. + // Note 2: Note that this matches SRC_ANCHOR_TYPE in the public WebView + // Java API, but the actual tag can be something other than <a>, such as + // <link> or <area>. + SRC_LINK_TYPE = 7, + + // Same as SRC_LINK_TYPE except the link contains an image. |img_src| and + // |extra_data_for_type| will contain the absolute valid url of the image + // source. |href| will contain the (possibly invalid or javascript-scheme) + // link href attribute. |anchor_text| will be empty. + // Both notes from SRC_LINK_TYPE apply. + SRC_IMAGE_LINK_TYPE = 8, + + // Hit on an editable text input element. All other values will be empty. + EDIT_TEXT_TYPE = 9, + }; + + // For all strings/GURLs, empty/invalid will become null upon conversion to + // Java. + int type; // Only values from enum Type above. + std::string extra_data_for_type; + string16 href; + string16 anchor_text; + GURL img_src; + + AwHitTestData(); + ~AwHitTestData(); +}; + +} // namespace android_webview + +#endif // ANDROID_WEBVIEW_COMMON_AW_HIT_TEST_DATA_H_ diff --git a/android_webview/common/render_view_messages.h b/android_webview/common/render_view_messages.h index 96978b1..76f8779 100644 --- a/android_webview/common/render_view_messages.h +++ b/android_webview/common/render_view_messages.h @@ -3,6 +3,8 @@ // found in the LICENSE file. // Multiply-included file, no traditional include guard. +#include "android_webview/common/aw_hit_test_data.h" +#include "content/public/common/common_param_traits.h" #include "ipc/ipc_channel_handle.h" #include "ipc/ipc_message_macros.h" #include "ipc/ipc_platform_file.h" @@ -11,7 +13,6 @@ #ifndef ANDROID_WEBVIEW_COMMON_RENDER_VIEW_MESSAGES_H_ #define ANDROID_WEBVIEW_COMMON_RENDER_VIEW_MESSAGES_H_ - namespace IPC { // TODO - add enums and custom IPC traits here when needed. @@ -20,6 +21,14 @@ namespace IPC { #endif // ANDROID_WEBVIEW_COMMON_RENDER_VIEW_MESSAGES_H_ +IPC_STRUCT_TRAITS_BEGIN(android_webview::AwHitTestData) + IPC_STRUCT_TRAITS_MEMBER(type) + IPC_STRUCT_TRAITS_MEMBER(extra_data_for_type) + IPC_STRUCT_TRAITS_MEMBER(href) + IPC_STRUCT_TRAITS_MEMBER(anchor_text) + IPC_STRUCT_TRAITS_MEMBER(img_src) +IPC_STRUCT_TRAITS_END() + #define IPC_MESSAGE_START AndroidWebViewMsgStart //----------------------------------------------------------------------------- @@ -27,7 +36,7 @@ namespace IPC { // These are messages sent from the browser to the renderer process. // Tells the renderer to drop all WebCore memory cache. -IPC_MESSAGE_CONTROL0(AwViewMsg_ClearCache); +IPC_MESSAGE_CONTROL0(AwViewMsg_ClearCache) // Request for the renderer to determine if the document contains any image // elements. The id should be passed in the response message so the response @@ -35,6 +44,13 @@ IPC_MESSAGE_CONTROL0(AwViewMsg_ClearCache); IPC_MESSAGE_ROUTED1(AwViewMsg_DocumentHasImages, int /* id */) +// Do hit test at the given webview coordinate. "Webview" coordinates are +// physical pixel values with the 0,0 at the top left of the current displayed +// view (ie 0,0 is not the top left of the page if the page is scrolled). +IPC_MESSAGE_ROUTED2(AwViewMsg_DoHitTest, + int /* view_x */, + int /* view_y */) + //----------------------------------------------------------------------------- // RenderView messages // These are messages sent from the renderer to the browser process. @@ -44,3 +60,6 @@ IPC_MESSAGE_ROUTED2(AwViewHostMsg_DocumentHasImagesResponse, int, /* id */ bool /* has_images */) +// Response to AwViewMsg_DoHitTest. +IPC_MESSAGE_ROUTED1(AwViewHostMsg_UpdateHitTestData, + android_webview::AwHitTestData) |