jbcef修改请求头和js交互
- 作者:
- 淡白
- 创建时间:
- 2021-11-29 19:59:09
- 插件开发 jcef
摘要:该文档介绍了如何使用CefBrowser类来修改请求头和实现和JavaScript的交互。首先,在实现CefContextMenuHandler接口的类中,可以通过onBeforeContextMenu方法清除默认的菜单项,并添加自定义菜单项。然后,可以在onContextMenuCommand方法中根据菜单项的ID执行相应的操作。接下来,在初始化时,可以通过addRequestHandler方法添加实现的处理方法。另外,在加载网页后,可以使用executeJavaScript方法加载JavaScript代码,并将方法注册到window对象中,以实现与JavaScript的交互。最后,可以通过JBCefJSQuery类的相关方法来处理JavaScript方法的调用,并在回调中返回调用结果。 参考链接:[CefBrowser文档](http://www.xuanyimao.com/doc/jcef/202011/org/cef/browser/CefBrowser.html) [帮助文档](http://www.xuanyimao.com/jcef/index.html)
修改请求头
实现CefContextMenuHandler
package com.github.danbai225.pwlchat.handler
import com.github.danbai225.pwlchat.component.WebChat
import org.cef.browser.CefBrowser
import org.cef.browser.CefFrame
import org.cef.callback.CefContextMenuParams
import org.cef.callback.CefMenuModel
import org.cef.handler.CefContextMenuHandler
class PwlContextMenuHandler() : CefContextMenuHandler {
private var wb :WebChat?=null
constructor(w:WebChat) : this() {
wb=w
}
override fun onBeforeContextMenu(p0: CefBrowser?, p1: CefFrame?, p2: CefContextMenuParams?, p3: CefMenuModel?) {
p3?.clear();//清除默认的菜单项
p3?.addItem(CefMenuModel.MenuId.MENU_ID_USER_LAST, "Open DevTools")
p3?.addItem(RefreshEmptyID, "RefreshEmpty")
}
override fun onContextMenuCommand(
p0: CefBrowser?,
p1: CefFrame?,
p2: CefContextMenuParams?,
p3: Int,
p4: Int
): Boolean {
when(p3){
CefMenuModel.MenuId.MENU_ID_USER_LAST->{
wb?.openDevtools()
return true
}
RefreshEmptyID->{
wb?.loadChatPage()
return true
}
}
return false
}
override fun onContextMenuDismissed(p0: CefBrowser?, p1: CefFrame?) {
}
companion object {
private const val RefreshEmptyID=29101
}
}
我是继承了JBCefBrowser类来实现功能的。
在初始化时通过addRequestHandler
添加刚才实现的处理方法
jbCefClient.addRequestHandler(PwlCefResourceRequestHandler(), cefBrowser)
和js交互
在加载之后加载js代码
val openRedPacket=JBCefJSQuery.create(this)
openRedPacket.addHandler { args: String ->
clientApi?.openPacket(args)
JBCefJSQuery.Response("ok")
}
jbCefClient.addLoadHandler(object : CefLoadHandlerAdapter() {
override fun onLoadEnd(browser: CefBrowser, frame: CefFrame, httpStatusCode: Int) {
clientApi?.more(1)
browser.executeJavaScript(
"window.openRedPacket = function(arg) {${openRedPacket.inject(
"arg",
"response => console.log('调用成功', response)",
"(error_code, error_message) => console.log('调用失败', error_code, error_message)"
)}};",
"https://exp.com/js/openRedPacket.js", 0
)
}
}, cefBrowser)
把js方法注册到window.openRedPacket
调用这个方法就会调用到上面添加的Handler
在回掉中通过JBCefJSQuery.Response("ok")
返回调用结果。
executeJavaScript
中的第二个参数是虚拟一个加载url
代码