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)

CefBrowser文档 帮助文档

修改请求头

实现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 代码