2023-05-31 17:41:14 +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 (
|
2023-06-11 00:10:55 +08:00
|
|
|
"github.com/energye/energy/v2/cef/internal/def"
|
2023-05-31 18:00:34 +08:00
|
|
|
"github.com/energye/energy/v2/common/imports"
|
|
|
|
"github.com/energye/energy/v2/consts"
|
2023-05-31 17:41:14 +08:00
|
|
|
"github.com/energye/golcl/lcl"
|
|
|
|
"github.com/energye/golcl/lcl/api"
|
|
|
|
"unsafe"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ExtensionHandlerRef -> TCustomExtensionHandler
|
|
|
|
var ExtensionHandlerRef extensionHandler
|
|
|
|
|
|
|
|
type extensionHandler uintptr
|
|
|
|
|
|
|
|
func (*extensionHandler) NewForChromium(chromium IChromium) *TCustomExtensionHandler {
|
|
|
|
if chromium == nil || chromium.Instance() == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
var result uintptr
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandlerRef_CreateForChromium).Call(chromium.Instance(), uintptr(unsafe.Pointer(&result)))
|
2023-05-31 17:41:14 +08:00
|
|
|
if result != 0 {
|
2023-07-03 17:23:26 +08:00
|
|
|
return &TCustomExtensionHandler{instance: unsafe.Pointer(result), ct: consts.CtOther}
|
2023-05-31 17:41:14 +08:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (*extensionHandler) New() *ICefExtensionHandler {
|
|
|
|
var result uintptr
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandlerRef_Create).Call(uintptr(unsafe.Pointer(&result)))
|
2023-05-31 17:41:14 +08:00
|
|
|
if result != 0 {
|
|
|
|
return &ICefExtensionHandler{instance: unsafe.Pointer(result)}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Instance 实例
|
|
|
|
func (m *TCustomExtensionHandler) Instance() uintptr {
|
|
|
|
if m == nil {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
return uintptr(m.instance)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *TCustomExtensionHandler) Free() {
|
|
|
|
if m.instance != nil {
|
|
|
|
m.base.Free(m.Instance())
|
|
|
|
m.instance = nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func (m *TCustomExtensionHandler) IsValid() bool {
|
|
|
|
if m == nil || m.instance == nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return m.instance != nil
|
|
|
|
}
|
|
|
|
|
2023-07-03 17:23:26 +08:00
|
|
|
func (m *TCustomExtensionHandler) IsSelfOwnEvent() bool {
|
|
|
|
return m.ct == consts.CtSelfOwn
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *TCustomExtensionHandler) IsOtherEvent() bool {
|
|
|
|
return m.ct == consts.CtOther
|
|
|
|
}
|
|
|
|
|
2023-05-31 17:41:14 +08:00
|
|
|
// Instance 实例
|
|
|
|
func (m *ICefExtensionHandler) Instance() uintptr {
|
|
|
|
if m == nil {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
return uintptr(m.instance)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *ICefExtensionHandler) Free() {
|
|
|
|
if m.instance != nil {
|
|
|
|
m.base.Free(m.Instance())
|
|
|
|
m.instance = nil
|
|
|
|
}
|
|
|
|
}
|
2023-07-03 17:23:26 +08:00
|
|
|
|
2023-05-31 17:41:14 +08:00
|
|
|
func (m *ICefExtensionHandler) IsValid() bool {
|
|
|
|
if m == nil || m.instance == nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return m.instance != nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *ICefExtensionHandler) SetOnExtensionLoadFailed(fn onExtensionLoadFailed) {
|
|
|
|
if !m.IsValid() {
|
|
|
|
return
|
|
|
|
}
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandler_OnExtensionLoadFailed).Call(m.Instance(), api.MakeEventDataPtr(fn))
|
2023-05-31 17:41:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (m *ICefExtensionHandler) SetOnExtensionLoaded(fn onExtensionLoaded) {
|
|
|
|
if !m.IsValid() {
|
|
|
|
return
|
|
|
|
}
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandler_OnExtensionLoaded).Call(m.Instance(), api.MakeEventDataPtr(fn))
|
2023-05-31 17:41:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (m *ICefExtensionHandler) SetOnExtensionUnloaded(fn onExtensionUnloaded) {
|
|
|
|
if !m.IsValid() {
|
|
|
|
return
|
|
|
|
}
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandler_OnExtensionUnloaded).Call(m.Instance(), api.MakeEventDataPtr(fn))
|
2023-05-31 17:41:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (m *ICefExtensionHandler) SetOnBeforeBackgroundBrowser(fn onBeforeBackgroundBrowser) {
|
|
|
|
if !m.IsValid() {
|
|
|
|
return
|
|
|
|
}
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandler_OnBeforeBackgroundBrowser).Call(m.Instance(), api.MakeEventDataPtr(fn))
|
2023-05-31 17:41:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (m *ICefExtensionHandler) SetOnBeforeBrowser(fn onBeforeBrowser) {
|
|
|
|
if !m.IsValid() {
|
|
|
|
return
|
|
|
|
}
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandler_OnBeforeBrowser).Call(m.Instance(), api.MakeEventDataPtr(fn))
|
2023-05-31 17:41:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (m *ICefExtensionHandler) SetGetActiveBrowser(fn getActiveBrowser) {
|
|
|
|
if !m.IsValid() {
|
|
|
|
return
|
|
|
|
}
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandler_GetActiveBrowser).Call(m.Instance(), api.MakeEventDataPtr(fn))
|
2023-05-31 17:41:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (m *ICefExtensionHandler) SetCanAccessBrowser(fn canAccessBrowser) {
|
|
|
|
if !m.IsValid() {
|
|
|
|
return
|
|
|
|
}
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandler_CanAccessBrowser).Call(m.Instance(), api.MakeEventDataPtr(fn))
|
2023-05-31 17:41:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (m *ICefExtensionHandler) SetGetExtensionResource(fn getExtensionResource) {
|
|
|
|
if !m.IsValid() {
|
|
|
|
return
|
|
|
|
}
|
2023-06-11 00:10:55 +08:00
|
|
|
imports.Proc(def.CefExtensionHandler_GetExtensionResource).Call(m.Instance(), api.MakeEventDataPtr(fn))
|
2023-05-31 17:41:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type onExtensionLoadFailed func(result consts.TCefErrorCode)
|
|
|
|
type onExtensionLoaded func(extension *ICefExtension)
|
|
|
|
type onExtensionUnloaded func(extension *ICefExtension)
|
|
|
|
type onBeforeBackgroundBrowser func(extension *ICefExtension, url string) (resultClient *ICefClient, resultSettings *TCefBrowserSettings, result bool)
|
|
|
|
type onBeforeBrowser func(extension *ICefExtension, browser, activeBrowser *ICefBrowser, index int32, url string, active bool, resultClient *ICefClient, resultSettings *TCefBrowserSettings) bool
|
|
|
|
type getActiveBrowser func(extension *ICefExtension, browser *ICefBrowser, includeIncognito bool, resultBrowser *ICefBrowser)
|
|
|
|
type canAccessBrowser func(extension *ICefExtension, browser *ICefBrowser, includeIncognito bool, targetBrowser *ICefBrowser) bool
|
|
|
|
type getExtensionResource func(extension *ICefExtension, browser *ICefBrowser, file string, callback *ICefGetExtensionResourceCallback) bool
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
lcl.RegisterExtEventCallback(func(fn interface{}, getVal func(idx int) uintptr) bool {
|
|
|
|
switch fn.(type) {
|
|
|
|
case onExtensionLoadFailed:
|
|
|
|
fn.(onExtensionLoadFailed)(consts.TCefErrorCode(getVal(0)))
|
|
|
|
case onExtensionLoaded:
|
|
|
|
fn.(onExtensionLoaded)(&ICefExtension{instance: unsafe.Pointer(getVal(0))})
|
|
|
|
case onExtensionUnloaded:
|
|
|
|
fn.(onExtensionUnloaded)(&ICefExtension{instance: unsafe.Pointer(getVal(0))})
|
|
|
|
case onBeforeBackgroundBrowser:
|
|
|
|
extension := &ICefExtension{instance: unsafe.Pointer(getVal(0))}
|
|
|
|
url := api.GoStr(getVal(1))
|
|
|
|
clientPtr := (*uintptr)(unsafe.Pointer(getVal(2)))
|
|
|
|
// TODO TCefBrowserSettings
|
|
|
|
//resultSettingsPtr := (*uintptr)(unsafe.Pointer(getVal(3)))
|
|
|
|
resultPtr := (*bool)(unsafe.Pointer(getVal(4)))
|
|
|
|
client, resultSettings, result := fn.(onBeforeBackgroundBrowser)(extension, url)
|
|
|
|
if client.instance != nil && client.IsValid() {
|
|
|
|
*clientPtr = client.Instance()
|
|
|
|
}
|
|
|
|
if resultSettings != nil {
|
|
|
|
//*resultSettingsPtr = resultSettings
|
|
|
|
}
|
|
|
|
*resultPtr = result
|
|
|
|
//*resultSettingsPtr = resultSettings.ToPtr()
|
|
|
|
case onBeforeBrowser:
|
|
|
|
extension := &ICefExtension{instance: unsafe.Pointer(getVal(0))}
|
|
|
|
browse, activeBrowser := &ICefBrowser{instance: unsafe.Pointer(getVal(1))}, &ICefBrowser{instance: unsafe.Pointer(getVal(2))}
|
|
|
|
index := int32(getVal(3))
|
|
|
|
url := api.GoStr(getVal(4))
|
|
|
|
active := api.GoBool(getVal(5))
|
|
|
|
//windowInfoPtr:=(*uintptr)(unsafe.Pointer(getVal(6)))
|
|
|
|
resultClientPtr := (*uintptr)(unsafe.Pointer(getVal(7)))
|
|
|
|
resultClient := &ICefClient{}
|
|
|
|
// TODO TCefBrowserSettings
|
|
|
|
//resultSettingsPtr := (*uintptr)(unsafe.Pointer(getVal(8)))
|
|
|
|
resultSettings := &TCefBrowserSettings{}
|
|
|
|
result := (*bool)(unsafe.Pointer(getVal(9)))
|
|
|
|
*result = fn.(onBeforeBrowser)(extension, browse, activeBrowser, index, url, active, resultClient, resultSettings)
|
|
|
|
if resultClient.instance != nil {
|
|
|
|
*resultClientPtr = resultClient.Instance()
|
|
|
|
}
|
|
|
|
//*resultSettingsPtr = resultSettings.ToPtr()
|
|
|
|
case getActiveBrowser:
|
|
|
|
extension := &ICefExtension{instance: unsafe.Pointer(getVal(0))}
|
|
|
|
browse := &ICefBrowser{instance: unsafe.Pointer(getVal(1))}
|
|
|
|
includeIncognito := api.GoBool(getVal(2))
|
|
|
|
resultBrowserPtr := (*uintptr)(unsafe.Pointer(getVal(3)))
|
|
|
|
resultBrowser := &ICefBrowser{}
|
|
|
|
fn.(getActiveBrowser)(extension, browse, includeIncognito, resultBrowser)
|
|
|
|
if resultBrowser.instance != nil {
|
|
|
|
*resultBrowserPtr = resultBrowser.Instance()
|
|
|
|
}
|
|
|
|
case canAccessBrowser:
|
|
|
|
extension := &ICefExtension{instance: unsafe.Pointer(getVal(0))}
|
|
|
|
browse := &ICefBrowser{instance: unsafe.Pointer(getVal(1))}
|
|
|
|
includeIncognito := api.GoBool(getVal(2))
|
|
|
|
targetBrowser := &ICefBrowser{instance: unsafe.Pointer(getVal(3))}
|
|
|
|
result := (*bool)(unsafe.Pointer(getVal(4)))
|
|
|
|
*result = fn.(canAccessBrowser)(extension, browse, includeIncognito, targetBrowser)
|
|
|
|
case getExtensionResource:
|
|
|
|
extension := &ICefExtension{instance: unsafe.Pointer(getVal(0))}
|
|
|
|
browse := &ICefBrowser{instance: unsafe.Pointer(getVal(1))}
|
|
|
|
file := api.GoStr(getVal(2))
|
|
|
|
callback := &ICefGetExtensionResourceCallback{instance: unsafe.Pointer(getVal(3))}
|
|
|
|
result := (*bool)(unsafe.Pointer(getVal(4)))
|
|
|
|
*result = fn.(getExtensionResource)(extension, browse, file, callback)
|
|
|
|
default:
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
})
|
|
|
|
}
|