Skip to content

Addon Browser Backend

HoshinoYumeka edited this page Sep 7, 2026 · 1 revision

浏览器后端

首页附属接口文档 | 下一页:⚠ 非踩不可的坑

com.november.mcphone.feature.browser.client.IBrowser
com.november.mcphone.feature.browser.client.IBrowserBackend
com.november.mcphone.feature.browser.client.BrowserBackends

这三个类不在 api 包下,不受五条兼容承诺保护。 它们是为把 MCEF 从浏览器 App 中隔离出去而抽的一层,目前只有内建的 MCEF 后端一个实现,尚未经过第二个实现的检验。 待形状稳定后再挪进 api 包——按第四条,挪包等于换一次 API,因此宁可晚挪,不要挪两次。

这一层不含 MCEF / JCEF 类型:画面以 GL 纹理 id 交出,输入按鼠标键盘事件转发进去。


IBrowserBackend

方法 说明
boolean isAvailable() 此时此刻能不能建浏览器(MCEF 装了也可能还在下载原生库)
Component unavailableReason() 不可用的原因,界面直接显示
IBrowser create(String url, int width, int height) 宽高是真实像素;后端不可用时返回 null调用方必须判空

BrowserBackends

public final class BrowserBackends {
    public static final String MCEF_MODID = "mcef";
    public static final IBrowserBackend NONE;             // 永远不可用
    public static IBrowserBackend get();                  // 永不为 null
    public static boolean set(IBrowserBackend backend);   // true 表示接上了
    public static boolean isMcefLoaded();
    public static void installDefault();                  // 客户端启动时由 MCphone 调用
}

接入自定义实现:

BrowserBackends.set(new MyBackend());   // 须在 MCphone 装上默认后端之前
行为 说明
挂载点数量 全局一个,先接上的算数。已有人接管时 set 返回 false、保留原来那个并告警
传入 null 返回 false 并告警
无人接管 get() 返回 NONEisAvailable() 恒为 falsecreate 恒返回 null

isMcefLoaded() 回答的是"装没装",不是"此刻能不能用"。

installDefault() 把"装没装"的判断与"真去 new"分在两个方法里。写在同一个方法内,if 尚未执行、方法本身就先抛 NoClassDefFoundError。自定义后端引用第三方类型时同理。

IBrowser

一个已经打开的浏览器,共 19 个方法。方法签名中不允许出现 MCEF / JCEF 类型。

分组 方法
画面 int textureId()void resize(int width, int height)
鼠标 mouseMove(int,int)mousePress(int,int,int)mouseRelease(int,int,int)mouseWheel(int,int,double,int)
键盘 keyPress(int,long,int)keyRelease(int,long,int)charTyped(char,int)setFocus(boolean)
导航 loadUrl(String)currentUrl()canGoBack()goBack()canGoForward()goForward()reload()isLoading()
生命周期 close()
成员 约束
textureId() 每帧都可能变,每次绘制前重新取,不要缓存
resize 单位是真实像素,不是 GUI 缩放后的坐标;传错画面会糊
mouseWheelmodifiers GLFW 掩码(SHIFT=1 / CTRL=2 / ALT=4),必须传真值;写死 0 会让 Ctrl+滚轮缩放静默失效
charTyped keyPress 分开:字符输入要经过输入法与键盘布局
setFocus 没有焦点时网页里的输入框不会闪光标
currentUrl() 刚建好尚未加载时可能是空串
close() 必须调用:背后是真的 Chromium 渲染进程,不关会一直在后台活着

返回 GL 纹理 id 而不让后端自己绘制:贴四边形的写法随 Minecraft 版本变化,该留在界面层。

浏览器 App 的玩家侧说明见🌐 浏览器


首页附属接口文档 | 下一页:⚠ 非踩不可的坑

Clone this wiki locally