Skip to content

4. WebView→Java JS Bridge 消息格式

4.1 消息发送机制 (三种 IDE)

IDEA (JCEF)

javascript
// JS → Java
window.myObject.sendMessage(JSON.stringify({ type, value }))

// Java → JS
CefBrowser.executeJavaScript("window.receiveData(" + json + ")")

VSCode

javascript
// JS → Java
vscode.postMessage({ type, value: JSON.stringify(value) })

// Java → JS
window.addEventListener("message", (event) => {
  handlerReceivedMsg(event.data.type, event.data.value)
})

Eclipse

javascript
// JS → Java
window.sendMessage(JSON.stringify({ type, value: JSON.stringify(value) }))

// Java → JS
window.receiveData = function(data) {
  handlerReceivedMsg(JSON.parse(data).type, JSON.parse(data).value)
}

4.2 JS→Java 消息完整映射表

从 WebView 源码提取的所有 JS→Java 消息类型:

CHAT 模块 (14 条)

消息类型value 格式敏感数据文件来源
CHAT:SEND_MSG{inputText, type, intelligent, sessionId, knowledge, relatedFiles, code}用户输入, 代码sendMsgMode
CHAT:RESEND{id, sessionId, type}sendMsgMode
CHAT:STOP_RESPONSE{sessionId}sendMsgMode
CHAT:SET_MODELmodelCodesendMsgMode
CHAT:REFRESH_MODELsendMsgMode
CHAT:DELETE_MSG{messageId}sendMsgMode
CHAT:DELETE_HISTORY_ITEM{sessionId}index-f0296668
CHAT:DELETE_HISTORY_ITEM_ALL{}index-f0296668
CHAT:GET_HISTORY_LISTindex-f0296668
CHAT:CHOOSE_HISTORY_ITEMsessionIdindex-df569310
CHAT:NEW_CHATindex-f0296668
CHAT:GET_IDE_FILE_STATE{isRecommend?, isGetData?}sendMsgMode
CHAT:GET_CODE_KNOWLEDGE_LISTsendMsgMode
CHAT:GET_DOC_KNOWLEDGE_LISTsendMsgMode
CHAT:CHOOSE_FILEsendMsgMode
CHAT:GET_OPEN_DIR_LISTsendMsgMode
CHAT:VALID_WEBSITEurlURLsendMsgMode
CHAT:AGENT_REFRESHindex-df569310

SQL_CHAT 模块 (8 条)

消息类型value 格式敏感数据文件来源
SQL_CHAT:SEND_MSG{intelligent, params: {sqlInfo}}SQL 查询sendMsgMode
SQL_CHAT:SQL_LINK_TEST{client, host, port, user, password, database}数据库密码index-3c7ef179
SQL_CHAT:SQL_SAVE{sourceId, client, host, port, user, password, database}数据库密码index-3c7ef179
SQL_CHAT:SOURCE_LIST{sourceId?, refreshFlag?}index-3c7ef179
SQL_CHAT:TABLE_LIST{sourceId, database}index-3c7ef179
SQL_CHAT:REQUEST_SOURCE_TYPESindex-3c7ef179
SQL_CHAT:SOURCE_DELETEsourceIdindex-3c7ef179
SQL_CHAT:NEW_CHATindex-3c7ef179
SQL_CHAT:STOP_RESPONSEsendMsgMode

CODE_CHECK 模块 (2 条)

消息类型value 格式敏感数据
CODE_CHECK:REQUEST_CODE_CHECK_LIST
CODE_CHECK:FIX{issueId, fixCode}修复代码

CODE_REVIEW 模块 (4 条)

消息类型value 格式敏感数据
CODE_REVIEW:PAGE_READY
CODE_REVIEW:GET_CODEREVIEW_LIST{path}
CODE_REVIEW:GET_CHANGE_RESULT{filePath, changeId}
CODE_REVIEW:GET_CHANGE_RESULT_ENDtrue

CODE_SEARCH 模块 (3 条)

消息类型value 格式敏感数据
CODE_SEARCH:REQUEST_CODESEARCH_CODE_LIST{query, repo, language}
CODE_SEARCH:REQUEST_CODESEARCH_REPOSITORY_LIST
CODE_SEARCH:REQUEST_CODESEARCH_LANGUAGE_LIST

UNIT_TEST 模块 (7 条)

消息类型value 格式敏感数据
UNIT_TEST:PAGE_READY
UNIT_TEST:FUNCTION_CASE{filePath, className, methodName}
UNIT_TEST:FUNCTION_CASE_CODE{caseId}
UNIT_TEST:SAVE_CODE{filePath, testCode}测试代码
UNIT_TEST:REGENERATE{params}
UNIT_TESTING:MAPPING_FILE{params}
UNIT_TEST:SAVE{params}

BATCH_UNIT_TEST 模块 (4 条)

消息类型value 格式敏感数据
BATCH_UNIT_TEST:CREATE{filePaths, options}
BATCH_UNIT_TEST:GET_LIST
BATCH_UNIT_TEST:DOWNLOADtaskId
BATCH_UNIT_TEST:DELETEtaskId

UNIT_TEST_BANK 模块 (2 条)

消息类型value 格式敏感数据
UNIT_TEST_BANK:PAGE_READY
UNIT_TEST_BANK:SAVE{params}

GIT 模块 (4 条)

消息类型value 格式敏感数据
GIT:GET_STATUS{}
GIT:SAVE_TOKEN{token, repoType}Git Token
GIT:AUTHORIZE{token, repoType}Git Token
GIT:RE_INDEX{params}

LOGIN 模块 (4 条)

消息类型value 格式敏感数据
LOGIN:INIT{showInfo: true}
LOGIN:LOGIN_ABORT
LOGIN:LOGIN_CHECK
LOGIN:LOGOUT
LOGIN:CLOSE_QR_CODE

SETTING 模块 (4 条)

消息类型value 格式敏感数据
SETTING:UPDATE_CONFIG{key, value}可能含配置
SETTING:GET_CAN_OPEN_CODE_ENHANCE
SETTING:SAVE_SHOW_OPERATE_GUIDANCE{isShowOperateGuide}
SETTING:POPUP_KEYMAP_SETTINGS

COMMON 模块 (8 条)

消息类型value 格式敏感数据
COMMON:PAGE_READY
COMMON:OPEN_URL{url}URL
COMMON:FOCUS_FILE{filePath, line}
COMMON:FOCUS_FILE_LINE{filePath, line}
COMMON:CODE_CLICK_ACTION{type, content}代码内容
COMMON:OPEN_FILE_DIALOG{params}
COMMON:EVALUATION{messageId, type}
COMMON:FEEDBACK{messageId, type, content}
COMMON:DOWNLOAD_TABLE{params}

5. Java→WebView 回调格式

5.1 回调发送机制

java
// Java 端
void sendMessage2webView(String type, Object data) {
    String json = new Gson().toJson(Map.of("type", type, "data", data));
    browser.getCefBrowser().executeJavaScript(
        "window.receiveData(" + json + ")",
        browser.getCefBrowser().getURL(),
        0
    );
}

5.2 Java→JS 消息完整映射表

handlerReceivedMsg() switch/case 提取的所有 Java→JS 消息类型:

消息类型处理方法数据内容含加密数据
CHAT:AGENT_ERRORhanldeAgentError{error, message}
CHAT:GET_USER_INFOreceiveUserInfo{userName, avatar, ...}
CHAT:GET_CONVERSATIONgetConversation{messages: [...]}
CHAT:UPDATE_CONVERSATION_LISTupdateConversationList{conversation}
CHAT:UPDATE_SELECT_CODEupdateSelectCode{code, range}
CHAT:SET_SEND_MESSAGE_TYPEsetSendMessageType{type}
CHAT:GET_MODEL_LISTgetModelList{models: [...]}
CHAT:PREDICTupdatePredictList{predictions}
CHAT:RECEIVER_IDE_FILE_STATEgetIdeFileState{files, isRecommend}
CHAT:RECEIVER_DOC_KNOWLEDGE_LISTgetDocKnowledgeInfo{documents}
CHAT:RECEIVER_CODE_KNOWLEDGE_LISTgetCodeKnowledgeInfo{repositories}
CHAT:SEND_OPEN_DIR_LISTgetOpenDirListInfo{dirs}
CHAT:RECEIVER_HISTORY_LISTreceiveHistoryList{conversations}
CHAT:GET_FEEDBACK_LISTreceiveFeedBackCheckList{categories}
CHAT:CHOOSE_FILEreceiveUploadFile{filePath}
CHAT:SEND_VALID_WEBSITE_RESULTgetValidWebsiteResult{isValid, url}
CHAT_TALK:RECEIVER_RECOMMEND_GAMEPLAYreceiveRecommendList{recommendations}
LOGIN:RECEIVER_LOGIN_IFRAME_SRCreceiveLoginIframeSrc{url}
LOGIN:LOGIN_SUCCEEDreceiveLoginSuccess{token?, userInfo?}可能含 Token
LOGIN:GO_LOGINgoLoginClickPage
SETTING:GET_CONFIGgetSettingInfo{settings}
SETTING:CHANGE_THEMEchangeTheme{theme}
SETTING:GET_CAN_OPEN_CODE_ENHANCEchangeCodeEnhanceEnabled{enabled}
SETTING:RECEIVE_REPO_STATUSreceiveRepoStatus{status}
SETTING:SEND_SHOW_OPERATE_GUIDANCEreceiveOperateGuideData{isShow}
COMMON:OPEN_PAGEopenPage{page}
COMMON:SHOW_MESSAGE_IN_WEBshowMessageInWeb{message}
COMMON:PLUGIN_BASE_INFOgetPluginBaseInfo{version, ...}
CODE_CHECK:GET_CODE_CHECK_LISTgetCodeCheckList{issues}
CODE_CHECK:UPDATE_CODE_CHECKupdateCodeCheckList{issue}
CODE_REVIEW:RECEIVER_PAGE_INITreceiveCodeReviewInit{initData}
CODE_REVIEW:RECEIVER_CODE_REVIEWreceiveCodeReview{review}
CODE_REVIEW:RECEIVER_CHANGE_RESULTreceiveChangeResult{change}
CODE_SEARCH:GET_CODESEARCH_CODE_LISTgetCodeSearchCodeList{results}
CODE_SEARCH:GET_CODESEARCH_REPOSITORY_LISTgetCodeSearchRepositoryList{repos}
CODE_SEARCH:GET_CODESEARCH_LANGUAGE_LISTgetCodeSearchLanguageList{languages}
SQL_CHAT:RECEIVE_SOURCE_TYPESsqlReceiveSourceTypes{types}
SQL_CHAT:RECEIVE_LINK_TESTsqlReceiveLinkTest{success, message}
SQL_CHAT:RECEIVE_SAVEsqlReceiveSave{success}
SQL_CHAT:SOURCE_REFRESH_SAVEsqlSourceRefreshReceiveSave{success}
SQL_CHAT:RECEIVE_SOURCE_LISTsqlReceiveSourceList{sources}含连接信息
SQL_CHAT:RECEIVE_TABLE_LISTsqlReceiveTableList{tables}
SQL_CHAT:GET_CONVERSATIONsqlGetConversation{messages}
SQL_CHAT:UPDATE_CONVERSATION_LISTsqlUpdateConversationList{conversation}
UNIT_TEST:GET_UT_INFOaddUTContent{testInfo}
UNIT_TEST:GET_METHOD_CASEreceiveClassCaseData{cases}
UNIT_TEST:GET_CASE_CODEreceiveCaseCode{code}
UNIT_TEST:GET_ALL_CODE_FILEreceiveSaveMessage{files}
UNIT_TEST:FUNCTION_LISTunitTestFunctionList{functions}
UNIT_TEST:RECEIVE_FUNCTION_CASEunitTestFunctionCase{case}
UNIT_TEST:RECEIVE_FUNCTION_CASE_CODEunitTestFunctionCode{code}
BATCH_UNIT_TEST:GET_TASK_LISTgetMultiTestTaskList{tasks}
BATCH_UNIT_TEST:MESSAGEmultiTestMessage{message}
BATCH_UNIT_TEST:REFRESH_TASK_DOWNLOAD_STATUSmultiTestRefreshTaskDownloadStatus{status}
UNIT_TEST_BANK:RECEIVE_FUNCTIONreceiveTestBankFunctionData{functions}
UNIT_TEST_BANK:RECEIVE_DATAreceiveTestBankData{data}
UNIT_TEST_BANK:RESPONSE_SAVEreceiveTestBankSave{success}
UNIT_TEST_BANK:IDEA_STOPstopUnitTestBank
USER:PERMISSION_LISTgetPermissionCodeList{permissions}
GIT:STATUSupdateGitStatusList{status}

结论: 所有 Java→JS 回调均不包含加密数据。 数据以明文 JSON 推送到 WebView。


本项目仅供学习研究,逆向分析内容归原厂商所有。