2023-03-13 17:30:13 +08:00
|
|
|
//----------------------------------------
|
|
|
|
//
|
|
|
|
// Copyright © yanghy. All Rights Reserved.
|
|
|
|
//
|
|
|
|
// Licensed under Apache License Version 2.0, January 2004
|
|
|
|
//
|
|
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
//----------------------------------------
|
|
|
|
|
|
|
|
package cef
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/energye/energy/common"
|
2023-03-25 12:09:00 +08:00
|
|
|
"github.com/energye/energy/pkgs/json"
|
2023-03-13 17:30:13 +08:00
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
2023-03-22 11:46:21 +08:00
|
|
|
// ipc bind event name
|
2023-03-13 17:30:13 +08:00
|
|
|
const (
|
2023-03-22 13:22:31 +08:00
|
|
|
internalIPC = "ipc" // JavaScript -> ipc 事件驱动, 根对象名
|
|
|
|
internalIPCEmit = "emit" // JavaScript -> ipc.emit 在 JavaScript 触发 GO 监听事件函数名, 异步
|
|
|
|
internalIPCEmitSync = "emitSync" // JavaScript -> ipc.emitSync 在 JavaScript 触发 GO 监听事件函数名, 同步
|
|
|
|
internalIPCOn = "on" // JavaScript -> ipc.on 在 JavaScript 监听事件, 提供给 GO 调用
|
2023-03-13 17:30:13 +08:00
|
|
|
)
|
2023-03-22 11:46:21 +08:00
|
|
|
|
|
|
|
// ipc message name
|
2023-03-13 17:30:13 +08:00
|
|
|
const (
|
2023-03-22 11:46:21 +08:00
|
|
|
internalIPCJSExecuteGoEvent = "JSEmitGo" // JS 触发 GO事件异步
|
|
|
|
internalIPCJSExecuteGoEventReplay = "JSEmitGoReplay" // JS 触发 GO事件异步 - 返回结果
|
|
|
|
internalIPCJSExecuteGoSyncEvent = "JSEmitSyncGo" // JS 触发 GO事件同步
|
|
|
|
internalIPCJSExecuteGoSyncEventReplay = "JSEmitSyncGoReplay" // JS 触发 GO事件同步 - 返回结果
|
|
|
|
internalIPCGoExecuteJSEvent = "GoEmitJS" // GO 触发 JS事件
|
|
|
|
internalIPCGoExecuteJSEventReplay = "GoEmitJSReplay" // GO 触发 JS事件 - 返回结果
|
2023-03-13 17:30:13 +08:00
|
|
|
)
|
|
|
|
|
2023-03-22 11:46:21 +08:00
|
|
|
// ipc process message key
|
2023-03-16 22:58:31 +08:00
|
|
|
const (
|
2023-03-23 17:33:33 +08:00
|
|
|
ipc_id = "id" // 消息ID
|
|
|
|
ipc_event = "event" // 事件名
|
|
|
|
ipc_name = "name" // 消息名
|
|
|
|
ipc_browser_id = "browserId" //
|
|
|
|
ipc_argumentList = "argumentList" //
|
2023-03-16 22:58:31 +08:00
|
|
|
)
|
|
|
|
|
2023-03-25 12:09:00 +08:00
|
|
|
// NewIPCProcessMessage 创建IPC进程消息
|
|
|
|
//
|
|
|
|
// 参数:
|
|
|
|
// messageId: 消息ID
|
|
|
|
// browserId: 消息所属浏览器ID, 非必传
|
|
|
|
// name: 消息名称, 非必传
|
|
|
|
// eventName: 事件名称, 非必传
|
|
|
|
// data: JSONArray类型的[]byte, 非必传
|
|
|
|
func NewIPCProcessMessage(messageId, browserId int32, name, eventName string, data []byte) json.JSONObject {
|
|
|
|
message := json.NewJSONObject(nil)
|
|
|
|
message.Set(ipc_id, messageId)
|
|
|
|
if browserId > 0 {
|
|
|
|
message.Set(ipc_browser_id, browserId)
|
|
|
|
}
|
|
|
|
if name != "" {
|
|
|
|
message.Set(ipc_name, name)
|
|
|
|
}
|
|
|
|
if eventName != "" {
|
|
|
|
message.Set(ipc_event, eventName)
|
|
|
|
}
|
|
|
|
if data != nil {
|
|
|
|
message.Set(ipc_argumentList, json.NewJSONArray(data).Data())
|
|
|
|
} else {
|
|
|
|
message.Set(ipc_argumentList, nil)
|
|
|
|
}
|
|
|
|
return message
|
|
|
|
}
|
|
|
|
|
2023-03-23 10:42:02 +08:00
|
|
|
// js execute go 返回类型
|
|
|
|
type result_type int8
|
|
|
|
|
|
|
|
const (
|
|
|
|
rt_function result_type = iota //回调函数
|
|
|
|
rt_variable //变量接收
|
|
|
|
)
|
|
|
|
|
2023-03-13 17:30:13 +08:00
|
|
|
var (
|
|
|
|
internalObjectRootName = "energy" // GO 和 V8Value 绑定根对象名
|
2023-03-20 10:09:54 +08:00
|
|
|
ipcRender *ipcRenderProcess // 渲染进程 IPC
|
|
|
|
ipcBrowser *ipcBrowserProcess // 主进程 IPC
|
2023-03-13 17:30:13 +08:00
|
|
|
)
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
// ipcEmitHandler ipc.emit 处理器
|
2023-03-13 17:30:13 +08:00
|
|
|
type ipcEmitHandler struct {
|
|
|
|
handler *ICefV8Handler // ipc.emit handler
|
2023-03-22 11:54:15 +08:00
|
|
|
handlerSync *ICefV8Handler // ipc.emitSync handler
|
2023-03-13 17:30:13 +08:00
|
|
|
callbackList map[int32]*ipcCallback // ipc.emit callbackList *list.List
|
|
|
|
callbackMessageId int32 // ipc.emit messageId
|
|
|
|
callbackLock sync.Mutex // ipc.emit lock
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
// ipcOnHandler ipc.on 处理器
|
2023-03-13 17:30:13 +08:00
|
|
|
type ipcOnHandler struct {
|
2023-03-23 16:03:20 +08:00
|
|
|
handler *ICefV8Handler // ipc.on handler
|
|
|
|
callbackList map[string]*ipcCallback // ipc.on callbackList
|
|
|
|
callbackLock sync.Mutex // ipc.emit lock
|
2023-03-13 17:30:13 +08:00
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
// ipcCallback ipc.emit 回调结果
|
2023-03-13 17:30:13 +08:00
|
|
|
type ipcCallback struct {
|
2023-03-23 18:13:23 +08:00
|
|
|
isSync bool //同否同步 true:同步 false:异步, 默认false
|
|
|
|
resultType result_type //返回值类型 0:function 1:variable 默认:0
|
|
|
|
variable *ICefV8Value //回调函数, 根据 resultType
|
|
|
|
function *ICefV8Value //回调函数, 根据 resultType
|
2023-03-13 17:30:13 +08:00
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
// isIPCInternalKey IPC 内部定义使用 key 不允许使用
|
2023-03-22 11:46:21 +08:00
|
|
|
func isIPCInternalKey(key string) bool {
|
2023-03-22 13:22:31 +08:00
|
|
|
return key == internalIPC || key == internalIPCEmit || key == internalIPCOn || key == internalIPCEmitSync ||
|
2023-03-22 11:46:21 +08:00
|
|
|
key == internalIPCJSExecuteGoEvent || key == internalIPCJSExecuteGoEventReplay ||
|
2023-03-22 11:54:15 +08:00
|
|
|
key == internalIPCGoExecuteJSEvent || key == internalIPCGoExecuteJSEventReplay ||
|
|
|
|
key == internalIPCJSExecuteGoSyncEvent || key == internalIPCJSExecuteGoSyncEventReplay
|
2023-03-22 11:46:21 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-03-13 17:43:22 +08:00
|
|
|
// ipcInit 初始化
|
|
|
|
func ipcInit() {
|
2023-03-13 17:54:22 +08:00
|
|
|
isSingleProcess := application.SingleProcess()
|
|
|
|
if isSingleProcess {
|
2023-03-24 15:20:26 +08:00
|
|
|
ipcBrowser = &ipcBrowserProcess{}
|
2023-03-13 17:43:22 +08:00
|
|
|
ipcRender = &ipcRenderProcess{
|
2023-03-23 18:13:23 +08:00
|
|
|
syncChan: &ipcSyncChan{},
|
2023-03-13 22:40:20 +08:00
|
|
|
emitHandler: &ipcEmitHandler{callbackList: make(map[int32]*ipcCallback)},
|
|
|
|
onHandler: &ipcOnHandler{callbackList: make(map[string]*ipcCallback)},
|
2023-03-13 17:43:22 +08:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if common.Args.IsMain() {
|
|
|
|
ipcBrowser = &ipcBrowserProcess{}
|
|
|
|
} else if common.Args.IsRender() {
|
|
|
|
ipcRender = &ipcRenderProcess{
|
2023-03-23 18:13:23 +08:00
|
|
|
syncChan: &ipcSyncChan{},
|
2023-03-13 22:40:20 +08:00
|
|
|
emitHandler: &ipcEmitHandler{callbackList: make(map[int32]*ipcCallback)},
|
|
|
|
onHandler: &ipcOnHandler{callbackList: make(map[string]*ipcCallback)},
|
2023-03-13 17:43:22 +08:00
|
|
|
}
|
|
|
|
}
|
2023-03-13 17:30:13 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// addCallback
|
|
|
|
func (m *ipcEmitHandler) addCallback(callback *ipcCallback) int32 {
|
|
|
|
//return uintptr(unsafe.Pointer(m.callbackList.PushBack(callback)))
|
|
|
|
m.callbackLock.Lock()
|
|
|
|
defer m.callbackLock.Unlock()
|
2023-03-23 09:16:27 +08:00
|
|
|
m.callbackList[m.nextMessageId()] = callback
|
|
|
|
return m.callbackMessageId
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
// nextMessageId 获取下一个消息ID
|
2023-03-23 09:16:27 +08:00
|
|
|
func (m *ipcEmitHandler) nextMessageId() int32 {
|
|
|
|
m.callbackMessageId++
|
2023-03-13 17:30:13 +08:00
|
|
|
if m.callbackMessageId == -1 {
|
|
|
|
m.callbackMessageId = 1
|
|
|
|
}
|
|
|
|
return m.callbackMessageId
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
// getCallback 返回回调函数
|
2023-03-13 17:30:13 +08:00
|
|
|
func (m *ipcEmitHandler) getCallback(messageId int32) *ipcCallback {
|
|
|
|
//return (*list.Element)(unsafe.Pointer(ptr)).Value.(*ipcCallback)
|
|
|
|
m.callbackLock.Lock()
|
|
|
|
defer m.callbackLock.Unlock()
|
2023-03-15 14:29:45 +08:00
|
|
|
if callback, ok := m.callbackList[messageId]; ok {
|
|
|
|
delete(m.callbackList, messageId)
|
|
|
|
return callback
|
|
|
|
}
|
|
|
|
return nil
|
2023-03-13 17:30:13 +08:00
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
//clear 清空所有回调函数
|
2023-03-13 22:40:20 +08:00
|
|
|
func (m *ipcEmitHandler) clear() {
|
|
|
|
for _, v := range m.callbackList {
|
|
|
|
v.free()
|
|
|
|
}
|
2023-03-23 16:03:20 +08:00
|
|
|
m.callbackMessageId = 0
|
2023-03-13 22:40:20 +08:00
|
|
|
m.callbackList = make(map[int32]*ipcCallback)
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
// addCallback 根据事件名添加回调函数
|
|
|
|
func (m *ipcOnHandler) addCallback(eventName string, callback *ipcCallback) {
|
2023-03-13 17:30:13 +08:00
|
|
|
//return uintptr(unsafe.Pointer(m.callbackList.PushBack(callback)))
|
|
|
|
m.callbackLock.Lock()
|
|
|
|
defer m.callbackLock.Unlock()
|
|
|
|
m.callbackList[eventName] = callback
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
// removeCallback 根据事件名移除回调函数
|
2023-03-13 17:30:13 +08:00
|
|
|
func (m *ipcOnHandler) removeCallback(eventName string) {
|
|
|
|
//m.callbackList.Remove((*list.Element)(unsafe.Pointer(ptr)))
|
|
|
|
m.callbackLock.Lock()
|
|
|
|
defer m.callbackLock.Unlock()
|
|
|
|
delete(m.callbackList, eventName)
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
// getCallback 根据事件名返回回调函数
|
2023-03-13 17:30:13 +08:00
|
|
|
func (m *ipcOnHandler) getCallback(eventName string) *ipcCallback {
|
|
|
|
//return (*list.Element)(unsafe.Pointer(ptr)).Value.(*ipcCallback)
|
|
|
|
m.callbackLock.Lock()
|
|
|
|
defer m.callbackLock.Unlock()
|
|
|
|
return m.callbackList[eventName]
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
//clear 清空所有回调函数
|
2023-03-13 22:40:20 +08:00
|
|
|
func (m *ipcOnHandler) clear() {
|
|
|
|
for _, v := range m.callbackList {
|
|
|
|
v.free()
|
|
|
|
}
|
|
|
|
m.callbackList = make(map[string]*ipcCallback)
|
|
|
|
}
|
|
|
|
|
2023-03-23 16:03:20 +08:00
|
|
|
//free 清空所有回调函数
|
2023-03-13 17:30:13 +08:00
|
|
|
func (m *ipcCallback) free() {
|
|
|
|
if m.function != nil {
|
|
|
|
m.function.Free()
|
|
|
|
m.function = nil
|
|
|
|
}
|
|
|
|
}
|