最开始做这个功能是在chromium34上面实现的,后来移植到39上面,调用的相关的系统和内核的底层的接口还都好用,从34到39版本变化,chromium内核对于事件的传递这块逻辑代码应该没有太大的变化。
首先说下webkit浏览器是如何实现长按网页弹出菜单的:
从最开始的说起,对于android使用原生webview的浏览器来讲,长按一个链接(当然也包括图片,网站,邮箱,手机号码等),都会弹出一个菜单供用户选择,当然用户点击长按的内容不同,菜单弹出来的内容也不一样。那么系统把判断用户点击的类别大致包括下面几类:WebView.HitTestResult.PHONE_TYPE,WebView.HitTestResult.EMAIL_TYPE,WebView.HitTestResult.GEO_TYPE,WebView.HitTestResult.IMAGE_TYPE,WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE,WebView.HitTestResult.SRC_ANCHOR_TYPE,WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE。
这些在一个android原生浏览器的代码中,都是可以看到的,上面也写出了类名,方便大家查找。
那么这些信息,在应用层是如何得到的呢?在webview依赖的activity中,有一个方法:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,