C++调用JS函数
如图所示,在browser里,通过IPC,让render去调用webkit中相关函数来执行js代码,然后将执行结果通过IPC,从render返回给browser,这个过程就是chromium中c++调用js函数的一个粗略的过程吧,下面通过代码来看下是如何执行的吧。
c++调用js函数调用的是CallJavascriptFunction方法,在src/content/public/browser/web_ui.h里面定义了一系列的方法,如下所示:
具体的实现在src/content/browser/webui/web_ui_impl中,例如最简单的调用无参数的js函数的实现如下:
可以看出,该方法只是简单对函数名进行了处理,添加了一个圆括号,丢给ExecuteJavascript函数去执行,再继续深入代码可以看到,在src/content/browser/frame_host/render_frame_host_impl中有该方法的具体实现,如下:
可以看到是通过消息来进行通讯的,将需要执行的函数通过消息发送,在src/content/render/render_frame_impl中查看消息的响应函数,如下:
可以看到,处理过程是从browser到render,最后到webkit,这个就是一个单向的执行js过程,上面函数标红部分则是回调过程,当webkit里面执行完js函数后,然后通过IPC返回给browser来告知执行结果,在src/content/browser/frame_host/render_frame_host_impl中如下:
executeScriptAndReturnValue方法在src/third_party/Webkit/Source/web/WebLocalFrameImpl中,v8是如何去执行js代码的,感兴趣的同学可以自己扒一下相关代码吧。
JS函数调用C++代码
JS通过chrome.send函数来调用在C++中注册过的函数,大致过程跟C++调用JS函数类似吧,只不过是从webkit发起的,通过IPC从render到browser去执行对应的函数。直接上代码吧,在src/content/render/web_ui_extension.cc中:
在install函数中为chrome.send绑定Send方法,在Send方法中,则通过消息来通知browser,接下来看下browser这边的处理吧,在src/content/browser/webui/web_ui_impl中:
browser接受到消息后,通过ProcessWebUIMessage函数,在一个消息map中找到绑定的函数,然后执行其对应的函数,ProcessWebUIMessage函数如下: