summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authorboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-13 23:26:36 +0000
committerboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-13 23:26:36 +0000
commit1e08a04f2c28be4c5bb9afa95055722c43a25fc0 (patch)
treeeb1d7ac5b1ded9636df693805d01aed0772cb435 /android_webview
parentcd4a2d2b69b7e37dcbee4db9814a4496e365907f (diff)
downloadchromium_src-1e08a04f2c28be4c5bb9afa95055722c43a25fc0.zip
chromium_src-1e08a04f2c28be4c5bb9afa95055722c43a25fc0.tar.gz
chromium_src-1e08a04f2c28be4c5bb9afa95055722c43a25fc0.tar.bz2
Add link content detection for Android WebView
Basic prefix matching for the content urls. New tests pass downstream BUG= Android only change. Some android bot failures are unrelated known issues. NOTRY=true Review URL: https://chromiumcodereview.appspot.com/11369161 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167516 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/common/aw_hit_test_data.h6
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/WebKitHitTestTest.java48
-rw-r--r--android_webview/renderer/aw_render_view_ext.cc44
3 files changed, 91 insertions, 7 deletions
diff --git a/android_webview/common/aw_hit_test_data.h b/android_webview/common/aw_hit_test_data.h
index a05ea2e..845aeb5 100644
--- a/android_webview/common/aw_hit_test_data.h
+++ b/android_webview/common/aw_hit_test_data.h
@@ -25,8 +25,10 @@ struct AwHitTestData {
// their normal values for the respective type.
UNKNOWN_TYPE = 0,
- // Content detection types. Not used yet.
- // TODO(boliu): Hook up content detection.
+ // Special case urls for SRC_LINK_TYPE below. Each type corresponds to a
+ // different prefix in content url_constants. |extra_data_for_type| will
+ // contain the url but with the prefix removed. Other fields are the same
+ // as SRC_LINK_TYPE.
PHONE_TYPE = 2,
GEO_TYPE = 3,
EMAIL_TYPE = 4,
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/WebKitHitTestTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/WebKitHitTestTest.java
index a71103a4..6ebab9f 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/WebKitHitTestTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/WebKitHitTestTest.java
@@ -164,6 +164,54 @@ public class WebKitHitTestTest extends AndroidWebViewTestBase {
* BUG=158284
*/
@FlakyTest
+ public void testSrcEmailType() throws Throwable {
+ String email = "foo@bar.com";
+ String prefix = "mailto:";
+ String page = fullPageLink(prefix + email, ANCHOR_TEXT);
+ setServerResponseAndLoad(page);
+ simulateTouchCenterOfWebViewOnUiThread();
+ assertTrue(pollForHitTestDataOnUiThread(HitTestResult.EMAIL_TYPE, email));
+ assertTrue(pollForHrefAndImageSrcOnUiThread(prefix+ email, ANCHOR_TEXT, null));
+ }
+
+ /*
+ * @SmallTest
+ * @Feature({"AndroidWebView", "WebKitHitTest"})
+ * BUG=158284
+ */
+ @FlakyTest
+ public void testSrcGeoType() throws Throwable {
+ String location = "Jilin";
+ String prefix = "geo:0,0?q=";
+ String page = fullPageLink(prefix + location, ANCHOR_TEXT);
+ setServerResponseAndLoad(page);
+ simulateTouchCenterOfWebViewOnUiThread();
+ assertTrue(pollForHitTestDataOnUiThread(HitTestResult.GEO_TYPE, location));
+ assertTrue(pollForHrefAndImageSrcOnUiThread(prefix + location, ANCHOR_TEXT, null));
+ }
+
+ /*
+ * @SmallTest
+ * @Feature({"AndroidWebView", "WebKitHitTest"})
+ * BUG=158284
+ */
+ @FlakyTest
+ public void testSrcPhoneType() throws Throwable {
+ String phone_num = "1234567890";
+ String prefix = "tel:";
+ String page = fullPageLink("tel:" + phone_num, ANCHOR_TEXT);
+ setServerResponseAndLoad(page);
+ simulateTouchCenterOfWebViewOnUiThread();
+ assertTrue(pollForHitTestDataOnUiThread(HitTestResult.PHONE_TYPE, phone_num));
+ assertTrue(pollForHrefAndImageSrcOnUiThread(prefix + phone_num, ANCHOR_TEXT, null));
+ }
+
+ /*
+ * @SmallTest
+ * @Feature({"AndroidWebView", "WebKitHitTest"})
+ * BUG=158284
+ */
+ @FlakyTest
public void testSrcImgeAnchorType() throws Throwable {
String relImageSrc = "/nonexistent.jpg";
String fullImageSrc = mWebServer.getResponseUrl(relImageSrc);
diff --git a/android_webview/renderer/aw_render_view_ext.cc b/android_webview/renderer/aw_render_view_ext.cc
index 3369379..f9fb960 100644
--- a/android_webview/renderer/aw_render_view_ext.cc
+++ b/android_webview/renderer/aw_render_view_ext.cc
@@ -4,10 +4,13 @@
#include "android_webview/renderer/aw_render_view_ext.h"
+#include <string>
+
#include "android_webview/common/aw_hit_test_data.h"
#include "android_webview/common/render_view_messages.h"
+#include "base/string_piece.h"
#include "content/public/common/url_constants.h"
-#include "content/public/common/url_constants.h"
+#include "content/public/renderer/android_content_detection_prefixes.h"
#include "content/public/renderer/document_state.h"
#include "content/public/renderer/render_view.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h"
@@ -24,6 +27,22 @@
namespace android_webview {
+namespace {
+
+bool RemovePrefixAndAssignIfMatches(const base::StringPiece& prefix,
+ const GURL& url,
+ std::string* dest) {
+ const base::StringPiece spec(url.spec());
+
+ if (spec.starts_with(prefix)) {
+ dest->assign(spec.begin() + prefix.length(), spec.end());
+ return true;
+ }
+ return false;
+}
+
+}
+
AwRenderViewExt::AwRenderViewExt(content::RenderView* render_view)
: content::RenderViewObserver(render_view) {
render_view->GetWebView()->setPermissionClient(this);
@@ -126,8 +145,25 @@ void AwRenderViewExt::OnDoHitTest(int view_x, int view_y) {
if (result.absoluteLinkURL().isValid() &&
!result.absoluteImageURL().isValid() &&
!is_javascript_scheme) {
- data.type = AwHitTestData::SRC_LINK_TYPE;
- data.extra_data_for_type = url.spec();
+ if (RemovePrefixAndAssignIfMatches(
+ content::kAddressPrefix,
+ url,
+ &data.extra_data_for_type)) {
+ data.type = AwHitTestData::GEO_TYPE;
+ } else if (RemovePrefixAndAssignIfMatches(
+ content::kPhoneNumberPrefix,
+ url,
+ &data.extra_data_for_type)) {
+ data.type = AwHitTestData::PHONE_TYPE;
+ } else if (RemovePrefixAndAssignIfMatches(
+ content::kEmailPrefix,
+ url,
+ &data.extra_data_for_type)) {
+ data.type = AwHitTestData::EMAIL_TYPE;
+ } else {
+ data.type = AwHitTestData::SRC_LINK_TYPE;
+ data.extra_data_for_type = url.spec();
+ }
} else if (result.absoluteLinkURL().isValid() &&
result.absoluteImageURL().isValid() &&
!is_javascript_scheme) {
@@ -140,8 +176,6 @@ void AwRenderViewExt::OnDoHitTest(int view_x, int view_y) {
} else if (result.isContentEditable()) {
data.type = AwHitTestData::EDIT_TEXT_TYPE;
DCHECK(data.extra_data_for_type.length() == 0);
- } else {
- // TODO(boliu): Do content detection here.
}
Send(new AwViewHostMsg_UpdateHitTestData(routing_id(), data));