diff --git a/cef/cef-frame.go b/cef/cef-frame.go index a27e2dd7f7be2bca08e7ea9388b3ae7664ad72f5..51bae4b6912b6ec2de1ae83b76287f41c9c7b7ae 100644 --- a/cef/cef-frame.go +++ b/cef/cef-frame.go @@ -22,93 +22,141 @@ import ( // Instance 实例 func (m *ICefFrame) Instance() uintptr { + if m == nil { + return 0 + } return uintptr(m.instance) } +// IsValid 该Frame是否有效 +func (m *ICefFrame) IsValid() bool { + if m == nil || m.instance == nil { + return false + } + r1, _, _ := imports.Proc(internale_CEFFrame_IsValid).Call(m.Instance()) + return api.GoBool(r1) +} + // Undo 撤销操作 func (m *ICefFrame) Undo() { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_Undo).Call(m.Instance()) } // Redo 恢复 func (m *ICefFrame) Redo() { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_Redo).Call(m.Instance()) } // Cut 剪切 func (m *ICefFrame) Cut() { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_Cut).Call(m.Instance()) } // Copy 复制 func (m *ICefFrame) Copy() { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_Copy).Call(m.Instance()) } // Paste 粘贴 func (m *ICefFrame) Paste() { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_Paste).Call(m.Instance()) } // Del 删除 func (m *ICefFrame) Del() { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_Del).Call(m.Instance()) } // SelectAll 选择所有 func (m *ICefFrame) SelectAll() { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_SelectAll).Call(m.Instance()) } // ViewSource 显示源码 func (m *ICefFrame) ViewSource() { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_ViewSource).Call(m.Instance()) } // LoadUrl 加载URL func (m *ICefFrame) LoadUrl(url string) { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_LoadUrl).Call(m.Instance(), api.PascalStr(url)) } // ExecuteJavaScript 执行JS func (m *ICefFrame) ExecuteJavaScript(code, scriptUrl string, startLine int32) { - imports.Proc(internale_CEFFrame_ExecuteJavaScript).Call(m.Instance(), api.PascalStr(code), api.PascalStr(scriptUrl), uintptr(startLine)) -} - -// IsValid 该Frame是否有效 -func (m *ICefFrame) IsValid() bool { - if m.instance == nil { - return false + if !m.IsValid() { + return } - r1, _, _ := imports.Proc(internale_CEFFrame_IsValid).Call(m.Instance()) - return api.GoBool(r1) + imports.Proc(internale_CEFFrame_ExecuteJavaScript).Call(m.Instance(), api.PascalStr(code), api.PascalStr(scriptUrl), uintptr(startLine)) } // IsMain 是否为主Frame func (m *ICefFrame) IsMain() bool { + if !m.IsValid() { + return false + } r1, _, _ := imports.Proc(internale_CEFFrame_IsMain).Call(m.Instance()) return api.GoBool(r1) } // IsFocused 是否已获取焦点 func (m *ICefFrame) IsFocused() bool { + if !m.IsValid() { + return false + } r1, _, _ := imports.Proc(internale_CEFFrame_IsFocused).Call(m.Instance()) return api.GoBool(r1) } // SendProcessMessage 发送进程消息 func (m *ICefFrame) SendProcessMessage(targetProcess CefProcessId, message *ICefProcessMessage) { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_SendProcessMessage).Call(m.Instance(), targetProcess.ToPtr(), message.Instance()) message.Free() } // SendProcessMessageForJSONBytes 发送进程消息 func (m *ICefFrame) SendProcessMessageForJSONBytes(messageName string, targetProcess CefProcessId, data []byte) { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_SendProcessMessageForJSONBytes).Call(m.Instance(), api.PascalStr(messageName), targetProcess.ToPtr(), uintptr(unsafe.Pointer(&data[0])), uintptr(uint32(len(data)))) } // SendProcessMessageForV8Value 发送进程消息 func (m *ICefFrame) SendProcessMessageForV8Value(messageName string, targetProcess CefProcessId, arguments *ICefV8Value) { + if !m.IsValid() { + return + } imports.Proc(internale_CEFFrame_SendProcessMessageForV8Value).Call(m.Instance(), api.PascalStr(messageName), targetProcess.ToPtr(), arguments.Instance()) } @@ -116,6 +164,9 @@ func (m *ICefFrame) SendProcessMessageForV8Value(messageName string, targetProce // // messageId != 0 是带有回调函数消息 func (m *ICefFrame) EmitRender(messageId int32, eventName string, target ipc.ITarget, data ...any) { + if !m.IsValid() { + return + } message := json.NewJSONObject(nil) message.Set(ipc_id, messageId) message.Set(ipc_event, eventName) @@ -138,47 +189,68 @@ func (m *ICefFrame) EmitRender(messageId int32, eventName string, target ipc.ITa } func (m *ICefFrame) LoadRequest(request *ICefRequest) { - if m == nil || request == nil { + if !m.IsValid() || request == nil { return } imports.Proc(internale_CEFFrame_LoadRequest).Call(m.Instance(), request.Instance()) } func (m *ICefFrame) Browser() *ICefBrowser { + if !m.IsValid() { + return nil + } var result uintptr imports.Proc(internale_CEFFrame_Browser).Call(m.Instance(), uintptr(unsafe.Pointer(&result))) return &ICefBrowser{instance: unsafe.Pointer(result)} } func (m *ICefFrame) V8Context() *ICefV8Context { + if !m.IsValid() { + return nil + } var result uintptr imports.Proc(internale_CEFFrame_GetV8Context).Call(m.Instance(), uintptr(unsafe.Pointer(&result))) return &ICefV8Context{instance: unsafe.Pointer(result)} } func (m *ICefFrame) Identifier() int64 { + if !m.IsValid() { + return 0 + } var result uintptr imports.Proc(internale_CEFFrame_Identifier).Call(m.Instance(), uintptr(unsafe.Pointer(&result))) return int64(result) } func (m *ICefFrame) Name() string { + if !m.IsValid() { + return "" + } r1, _, _ := imports.Proc(internale_CEFFrame_Name).Call(m.Instance()) return api.GoStr(r1) } func (m *ICefFrame) Url() string { + if !m.IsValid() { + return "" + } r1, _, _ := imports.Proc(internale_CEFFrame_Url).Call(m.Instance()) return api.GoStr(r1) } func (m *ICefFrame) Parent() *ICefFrame { + if !m.IsValid() { + return nil + } var result uintptr imports.Proc(internale_CEFFrame_Parent).Call(m.Instance(), uintptr(unsafe.Pointer(&result))) return &ICefFrame{instance: unsafe.Pointer(result)} } func (m *ICefFrame) Free() { + if !m.IsValid() { + return + } if m.instance != nil { m.base.Free(m.Instance()) m.instance = nil diff --git a/cef/cef-ipc-render.go b/cef/cef-ipc-render.go index c75e57030d7a2ecdc13c539662cc26a78dcbd4d4..400ae814fa3adc73c89add0c858eefa098760806 100644 --- a/cef/cef-ipc-render.go +++ b/cef/cef-ipc-render.go @@ -33,6 +33,7 @@ type ipcRenderProcess struct { } func (m *ipcRenderProcess) clear() { + fmt.Println(m.bind, m.ipcObject, m.v8Context) if m.bind != nil { m.bind.Free() m.bind = nil @@ -44,6 +45,10 @@ func (m *ipcRenderProcess) clear() { //if m.onHandler != nil { // m.onHandler.clear() //} + if m.v8Context != nil { + m.v8Context.Free() + m.v8Context = nil + } } func (m *ipcRenderProcess) ipcChannelRender(browser *ICefBrowser, frame *ICefFrame) { @@ -132,30 +137,30 @@ func (m *ipcRenderProcess) ipcGoExecuteJSEvent(browser *ICefBrowser, frame *ICef if argument != nil { argument.Free() } + if argumentList != nil { + argumentList.Free() + } }() if callback := ipcRender.onHandler.getCallback(emitName); callback != nil { var callbackArgsBytes []byte if m.v8Context.Enter() { - if m.v8Context.Enter() { - var ret *ICefV8Value - var argsArray *TCefV8ValueArray - argsArray, _ = ipcValueConvert.BytesToV8ArrayValue(argumentList.Bytes()) - if argsArray != nil { - ret = callback.function.ExecuteFunctionWithContext(m.v8Context, nil, argsArray) - argsArray.Free() - } else { - ret = callback.function.ExecuteFunctionWithContext(m.v8Context, nil, nil) - } - if ret != nil && ret.IsValid() && messageId != 0 { //callback func args - callbackArgsBytes = ipcValueConvert.V8ValueToProcessMessageBytes(ret) - ret.Free() - } else if ret != nil { - ret.Free() - } - m.v8Context.Exit() + var ret *ICefV8Value + var argsArray *TCefV8ValueArray + argsArray, _ = ipcValueConvert.BytesToV8ArrayValue(argumentList.Bytes()) + if argsArray != nil { + ret = callback.function.ExecuteFunctionWithContext(m.v8Context, nil, argsArray) + argsArray.Free() + } else { + ret = callback.function.ExecuteFunctionWithContext(m.v8Context, nil, nil) } - argumentList.Free() + if ret != nil && ret.IsValid() && messageId != 0 { //callback func args + callbackArgsBytes = ipcValueConvert.V8ValueToProcessMessageBytes(ret) + ret.Free() + } else if ret != nil { + ret.Free() + } + m.v8Context.Exit() } if messageId != 0 { //callback func callbackMessage := json.NewJSONObject(nil) @@ -165,7 +170,9 @@ func (m *ipcRenderProcess) ipcGoExecuteJSEvent(browser *ICefBrowser, frame *ICef } else { callbackMessage.Set(ipc_argumentList, nil) } - m.v8Context.Frame().SendProcessMessageForJSONBytes(internalIPCGoExecuteJSEventReplay, consts.PID_BROWSER, callbackMessage.Bytes()) + if m.v8Context.Frame() != nil { + m.v8Context.Frame().SendProcessMessageForJSONBytes(internalIPCGoExecuteJSEventReplay, consts.PID_BROWSER, callbackMessage.Bytes()) + } } result = true } diff --git a/example/dev-test/ipc-event/ipc-event.go b/example/dev-test/ipc-event/ipc-event.go index d3faddeded1337bffcf5e70467707326f9330e37..f2de44798e81d2a415a6b2156a5ed8589ab3780d 100644 --- a/example/dev-test/ipc-event/ipc-event.go +++ b/example/dev-test/ipc-event/ipc-event.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/energye/energy/cef" "github.com/energye/energy/common/assetserve" + "github.com/energye/energy/consts" "github.com/energye/energy/example/dev-test/ipc-event/src" "github.com/energye/energy/ipc" "github.com/energye/golcl/lcl" @@ -26,6 +27,7 @@ func main() { cef.GlobalInit(nil, &resources) //创建应用 cefApp = cef.NewApplication() + cefApp.SetLogSeverity(consts.LOGSEVERITY_DEBUG) //cefApp.SetSingleProcess(true) //指定一个URL地址,或本地html文件目录 cef.BrowserWindow.Config.Url = "http://localhost:22022/ipc-event.html" diff --git a/example/dev-test/ipc-event/resources/ipc-event.html b/example/dev-test/ipc-event/resources/ipc-event.html index dc4e087611698ed79f061d3d9c9b3bd0e9b17565..7cb9ea73515a5b7287b9f2556425b6bd6fd707cd 100644 --- a/example/dev-test/ipc-event/resources/ipc-event.html +++ b/example/dev-test/ipc-event/resources/ipc-event.html @@ -163,7 +163,7 @@ msg("R8:", r8, JSON.stringify(r8)); msg("R9:", r9, JSON.stringify(r9)); msg("R10:", r10, JSON.stringify(r10)); - return ["返回值", onTestName2Idx, 2222.22, true] + return ["返回值" + onTestName2Idx, onTestName2Idx, 2222.22 + onTestName2Idx, onTestName2Idx % 2 === 0] }); let tgesi = null @@ -217,6 +217,7 @@ } } } + function testGoEmitAndCallback() { ipc.emit("testGoEmitAndCallback"); }