本人现在有一个利用libcef的软件,想寻找网页链接点击事件的方法,又不想利用JS,因为页面太多。于是想到了这个方法,
记录下来,以便日后再需时查看,也方便有此需求的人。
前提是你已经编译了cef-chromium的源码,cefbuilds下载的只是已经编译好的libcef库和调用接口,
因此得真正的编译cef和chromium的源码,才能找到解决办法。
如果你还没编译成功,请看这篇:
当编译好cef-chromium的源码后,就可以开始找网页链接点击事件了。
因为是点击,所以chromium源码中应该包含click事件,本人不才,是通过click这个字符串搜索的,最后居然也找到了,
网页链接点击事件是在WebKit的html事件中处理的。
我的cef-chromium源码在E盘,具体目录为:
E:\cef-chromium\chromium\src\third_party\WebKit\Source\core\html\HTMLAnchorElement.cpp
在HTMLAnchorElement.cpp中有这么一个成员函数:
void HTMLAnchorElement::handleClick(Event* event)
{
event->setDefaultHandled();
LocalFrame* frame = document().frame();
if (!frame)
return;
StringBuilder url;
url.append(stripLeadingAndTrailingHTMLSpaces(fastGetAttribute(hrefAttr)));
appendServerMapMousePosition(url, event);
KURL completedURL = document().completeURL(url.toString());
...
这个handleClick成员函数便是处理网页超链接点击的方法,
KURL completedURL = document().completeURL(url.toString());
这个url.toString()就是点击的链接地址,在这句下面处理获取到的地址就可以了,如果不想让网页加载,直接在获取到链接地址后return即可。
这个url.toString()返回的是String类型,它是定义在chromium内的,想转换链接地址到char*可以用这个方法:
const char* sUtf8Data = url.toString().utf8().data();
有一点要注意,转换后的sUtf8Data是utf8类型的字符串。