diff options
author | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-13 23:26:36 +0000 |
---|---|---|
committer | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-13 23:26:36 +0000 |
commit | 1e08a04f2c28be4c5bb9afa95055722c43a25fc0 (patch) | |
tree | eb1d7ac5b1ded9636df693805d01aed0772cb435 /android_webview | |
parent | cd4a2d2b69b7e37dcbee4db9814a4496e365907f (diff) | |
download | chromium_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')
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)); |