energy/cef/cef-events.go

584 lines
24 KiB
Go

//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under GNU General Public License v3.0
//
//----------------------------------------
package cef
import (
"github.com/energye/energy/common"
"github.com/energye/energy/consts"
"github.com/energye/energy/ipc"
t "github.com/energye/energy/types"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/api"
"github.com/energye/golcl/lcl/types"
"unsafe"
)
func init() {
var resourceEventGet = func(fn interface{}, getVal func(idx int) uintptr, resp bool) (sender lcl.IObject, browser *ICefBrowser, frame *ICefFrame, request *ICefRequest, response *ICefResponse) {
var (
instance unsafe.Pointer
)
// 指针
getPtr := func(i int) unsafe.Pointer {
return unsafe.Pointer(getVal(i))
}
senderPtr := getPtr(0)
browser = &ICefBrowser{browseId: int32(getVal(1)), chromium: senderPtr}
tempFrame := (*cefFrame)(getPtr(2))
frame = &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
cefRequest := (*rICefRequest)(getPtr(3))
instance = common.GetInstancePtr(cefRequest.Instance)
request = &ICefRequest{
instance: instance,
Url: api.GoStr(cefRequest.Url),
Method: api.GoStr(cefRequest.Method),
ReferrerUrl: api.GoStr(cefRequest.ReferrerUrl),
ReferrerPolicy: consts.TCefReferrerPolicy(cefRequest.ReferrerPolicy),
Flags: consts.TCefUrlRequestFlags(cefRequest.Flags),
FirstPartyForCookies: api.GoStr(cefRequest.FirstPartyForCookies),
ResourceType: consts.TCefResourceType(cefRequest.ResourceType),
TransitionType: consts.TCefTransitionType(cefRequest.TransitionType),
Identifier: *(*uint64)(common.GetParamPtr(cefRequest.Identifier, 0)),
}
if resp {
cefResponse := (*iCefResponse)(getPtr(4))
instance = common.GetInstancePtr(cefResponse.Instance)
response = &ICefResponse{
instance: instance,
Status: int32(cefResponse.Status),
StatusText: api.GoStr(cefResponse.StatusText),
MimeType: api.GoStr(cefResponse.MimeType),
Charset: api.GoStr(cefResponse.Charset),
Error: consts.TCefErrorCode(cefResponse.Error),
URL: api.GoStr(cefResponse.URL),
}
}
return lcl.AsObject(senderPtr), browser, frame, request, response
}
lcl.RegisterExtEventCallback(func(fn interface{}, getVal func(idx int) uintptr) bool {
//defer func() {
// if err := recover(); err != nil {
// logger.Error("CEF Events Error:", err)
// }
//}()
var (
instance unsafe.Pointer
)
// 指针
getPtr := func(i int) unsafe.Pointer {
return unsafe.Pointer(getVal(i))
}
switch fn.(type) {
case ChromiumEventOnFindResult:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
cefRectPtr := (*tCefRectPtr)(getPtr(4))
cefRect := &TCefRect{
X: int32(cefRectPtr.X),
Y: int32(cefRectPtr.Y),
Width: int32(cefRectPtr.Width),
Height: int32(cefRectPtr.Height),
}
fn.(ChromiumEventOnFindResult)(lcl.AsObject(sender), browser, int32(getVal(2)), int32(getVal(3)), cefRect, int32(getVal(5)), api.GoBool(getVal(6)))
case BrowseProcessMessageReceived:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
cefProcMsg := (*ipc.CefProcessMessagePtr)(getPtr(4))
args := ipc.NewArgumentList()
args.UnPackageBytePtr(cefProcMsg.Data, int32(cefProcMsg.DataLen))
processMessage := &ipc.ICefProcessMessage{
Name: api.GoStr(cefProcMsg.Name),
ArgumentList: args,
}
var result = (*bool)(getPtr(5))
*result = fn.(BrowseProcessMessageReceived)(lcl.AsObject(sender), browser, frame, consts.CefProcessId(getVal(3)), processMessage)
args.Clear()
cefProcMsg.Data = 0
cefProcMsg.DataLen = 0
cefProcMsg.Name = 0
cefProcMsg = nil
args = nil
case ChromiumEventOnResourceLoadComplete:
sender, browse, frame, request, response := resourceEventGet(fn, getVal, true)
fn.(ChromiumEventOnResourceLoadComplete)(sender, browse, frame, request, response, *(*consts.TCefUrlRequestStatus)(getPtr(5)), *(*int64)(getPtr(6)))
case ChromiumEventOnResourceRedirect:
sender, browse, frame, request, response := resourceEventGet(fn, getVal, true)
var newStr = new(t.TString)
var newStrPtr = (*uintptr)(getPtr(5))
fn.(ChromiumEventOnResourceRedirect)(sender, browse, frame, request, response, newStr)
*newStrPtr = newStr.ToPtr()
case ChromiumEventOnResourceResponse:
sender, browse, frame, request, response := resourceEventGet(fn, getVal, true)
fn.(ChromiumEventOnResourceResponse)(sender, browse, frame, request, response, (*bool)(getPtr(5)))
case ChromiumEventOnBeforeResourceLoad:
sender, browse, frame, request, _ := resourceEventGet(fn, getVal, false)
instance = getInstance(getVal(4))
callback := &ICefCallback{instance: instance}
fn.(ChromiumEventOnBeforeResourceLoad)(sender, browse, frame, request, callback, (*consts.TCefReturnValue)(getPtr(5)))
//menu begin
case ChromiumEventOnBeforeContextMenu:
sender := getPtr(0)
instance = getInstance(getVal(1))
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
cefParams := (*iCefContextMenuParams)(getPtr(3))
params := &ICefContextMenuParams{
XCoord: int32(cefParams.XCoord),
YCoord: int32(cefParams.YCoord),
TypeFlags: consts.TCefContextMenuTypeFlags(cefParams.TypeFlags),
LinkUrl: api.GoStr(cefParams.LinkUrl),
UnfilteredLinkUrl: api.GoStr(cefParams.UnfilteredLinkUrl),
SourceUrl: api.GoStr(cefParams.SourceUrl),
TitleText: api.GoStr(cefParams.TitleText),
PageUrl: api.GoStr(cefParams.PageUrl),
FrameUrl: api.GoStr(cefParams.FrameUrl),
FrameCharset: api.GoStr(cefParams.FrameCharset),
MediaType: consts.TCefContextMenuMediaType(cefParams.MediaType),
MediaStateFlags: consts.TCefContextMenuMediaStateFlags(cefParams.MediaStateFlags),
SelectionText: api.GoStr(cefParams.SelectionText),
EditStateFlags: consts.TCefContextMenuEditStateFlags(cefParams.EditStateFlags),
}
instance = getInstance(getVal(4))
KeyAccelerator.clear()
model := &ICefMenuModel{instance: instance, CefMis: KeyAccelerator}
fn.(ChromiumEventOnBeforeContextMenu)(lcl.AsObject(sender), browser, frame, params, model)
case ChromiumEventOnContextMenuCommand:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
cefParams := (*iCefContextMenuParams)(getPtr(3))
params := &ICefContextMenuParams{
XCoord: int32(cefParams.XCoord),
YCoord: int32(cefParams.YCoord),
TypeFlags: consts.TCefContextMenuTypeFlags(cefParams.TypeFlags),
LinkUrl: api.GoStr(cefParams.LinkUrl),
UnfilteredLinkUrl: api.GoStr(cefParams.UnfilteredLinkUrl),
SourceUrl: api.GoStr(cefParams.SourceUrl),
TitleText: api.GoStr(cefParams.TitleText),
PageUrl: api.GoStr(cefParams.PageUrl),
FrameUrl: api.GoStr(cefParams.FrameUrl),
FrameCharset: api.GoStr(cefParams.FrameCharset),
MediaType: consts.TCefContextMenuMediaType(cefParams.MediaType),
MediaStateFlags: consts.TCefContextMenuMediaStateFlags(cefParams.MediaStateFlags),
SelectionText: api.GoStr(cefParams.SelectionText),
EditStateFlags: consts.TCefContextMenuEditStateFlags(cefParams.EditStateFlags),
}
commandId := consts.MenuId(getVal(4))
eventFlags := uint32(getVal(5))
if !KeyAccelerator.commandIdEventCallback(browser, commandId, params, eventFlags, (*bool)(getPtr(5))) {
fn.(ChromiumEventOnContextMenuCommand)(lcl.AsObject(sender), browser, frame, params, commandId, eventFlags, (*bool)(getPtr(6)))
}
case ChromiumEventOnContextMenuDismissed:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
fn.(ChromiumEventOnContextMenuDismissed)(lcl.AsObject(sender), browser, frame)
//menu end
//---
//cookie begin
case ChromiumEventOnCookieSet:
success := api.GoBool(getVal(1))
ID := int32(getVal(2))
fn.(ChromiumEventOnCookieSet)(lcl.AsObject(getVal(0)), success, ID)
case ChromiumEventOnCookiesDeleted:
numDeleted := int32(getVal(1))
fn.(ChromiumEventOnCookiesDeleted)(lcl.AsObject(getVal(0)), numDeleted)
case ChromiumEventOnCookiesFlushed:
fn.(ChromiumEventOnCookiesFlushed)(lcl.AsObject(getVal(0)))
case ChromiumEventOnCookiesVisited:
cookie := *(*iCefCookiePtr)(getPtr(1))
creation := *(*float64)(common.GetParamPtr(cookie.creation, 0))
lastAccess := *(*float64)(common.GetParamPtr(cookie.lastAccess, 0))
expires := *(*float64)(common.GetParamPtr(cookie.expires, 0))
iCookie := &ICefCookie{
Url: api.GoStr(cookie.url),
Name: api.GoStr(cookie.name),
Value: api.GoStr(cookie.value),
Domain: api.GoStr(cookie.domain),
Path: api.GoStr(cookie.path),
Secure: *(*bool)(common.GetParamPtr(cookie.secure, 0)),
Httponly: *(*bool)(common.GetParamPtr(cookie.httponly, 0)),
HasExpires: *(*bool)(common.GetParamPtr(cookie.hasExpires, 0)),
Creation: common.DDateTimeToGoDateTime(creation),
LastAccess: common.DDateTimeToGoDateTime(lastAccess),
Expires: common.DDateTimeToGoDateTime(expires),
Count: int32(cookie.count),
Total: int32(cookie.total),
ID: int32(cookie.aID),
SameSite: consts.TCefCookieSameSite(cookie.sameSite),
Priority: consts.TCefCookiePriority(cookie.priority),
SetImmediately: *(*bool)(common.GetParamPtr(cookie.aSetImmediately, 0)),
DeleteCookie: *(*bool)(common.GetParamPtr(cookie.aDeleteCookie, 0)),
Result: *(*bool)(common.GetParamPtr(cookie.aResult, 0)),
}
fn.(ChromiumEventOnCookiesVisited)(lcl.AsObject(getVal(0)), iCookie)
case ChromiumEventOnCookieVisitorDestroyed:
id := int32(getVal(1))
fn.(ChromiumEventOnCookieVisitorDestroyed)(lcl.AsObject(getVal(0)), id)
//cookie end
//--- other
case ChromiumEventOnScrollOffsetChanged:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnScrollOffsetChanged)(lcl.AsObject(sender), browser, float64(getVal(2)), float64(getVal(2)))
case ChromiumEventOnRenderProcessTerminated:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnRenderProcessTerminated)(lcl.AsObject(sender), browser, consts.TCefTerminationStatus(getVal(2)))
case ChromiumEventOnCompMsg:
message := (*types.TMessage)(getPtr(1))
lResultPtr := (*types.LRESULT)(getPtr(2))
fn.(ChromiumEventOnCompMsg)(lcl.AsObject(getVal(0)), message, lResultPtr, (*bool)(getPtr(3)))
case ChromiumEventOnCefBrowser:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnCefBrowser)(lcl.AsObject(sender), browser)
case ChromiumEventOnTitleChange:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnTitleChange)(lcl.AsObject(sender), browser, api.GoStr(getVal(2)))
case ChromiumEventOnKeyEvent:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
keyEvent := (*TCefKeyEvent)(getPtr(2))
fn.(ChromiumEventOnKeyEvent)(lcl.AsObject(sender), browser, keyEvent, (*bool)(getPtr(3)))
case ChromiumEventOnFullScreenModeChange:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnFullScreenModeChange)(lcl.AsObject(sender), browser, api.GoBool(getVal(2)))
case ChromiumEventOnBeforeBrowser: //创建浏览器之前
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
var result = (*bool)(getPtr(3))
*result = fn.(ChromiumEventOnBeforeBrowser)(lcl.AsObject(sender), browser, frame)
case ChromiumEventOnAddressChange: //创建浏览器之前
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
fn.(ChromiumEventOnAddressChange)(lcl.AsObject(sender), browser, frame, api.GoStr(getVal(3)))
case ChromiumEventOnAfterCreated: //创建浏览器之后
sender := getPtr(0)
//事件处理函数返回true将不继续执行
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnAfterCreated)(lcl.AsObject(sender), browser)
case ChromiumEventOnBeforeClose: //关闭浏览器之前
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnBeforeClose)(lcl.AsObject(sender), browser)
case ChromiumEventOnClose:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnClose)(lcl.AsObject(sender), browser, (*TCefCloseBrowsesAction)(getPtr(2)))
case ChromiumEventOnResult: //通用Result bool事件
fn.(ChromiumEventOnResult)(lcl.AsObject(getVal(0)), api.GoBool(getVal(1)))
case ChromiumEventOnResultFloat: //通用Result float事件
fn.(ChromiumEventOnResultFloat)(lcl.AsObject(getVal(0)), *(*float64)(getPtr(1)))
case ChromiumEventOnLoadStart:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
fn.(ChromiumEventOnLoadStart)(lcl.AsObject(sender), browser, frame)
case ChromiumEventOnLoadingStateChange:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnLoadingStateChange)(lcl.AsObject(sender), browser, api.GoBool(getVal(2)), api.GoBool(getVal(3)), api.GoBool(getVal(4)))
case ChromiumEventOnLoadingProgressChange:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
fn.(ChromiumEventOnLoadingProgressChange)(lcl.AsObject(sender), browser, *(*float64)(getPtr(2)))
case ChromiumEventOnLoadError:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
fn.(ChromiumEventOnLoadError)(lcl.AsObject(sender), browser, frame, consts.CEF_NET_ERROR(getVal(3)), api.GoStr(getVal(4)), api.GoStr(getVal(5)))
case ChromiumEventOnLoadEnd:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
fn.(ChromiumEventOnLoadEnd)(lcl.AsObject(sender), browser, frame, int32(getVal(3)))
case ChromiumEventOnBeforeDownload: //下载之前
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
item := (*downloadItem)(getPtr(2))
downItem := &DownloadItem{
Id: int32(item.Id),
CurrentSpeed: int64(item.CurrentSpeed),
PercentComplete: int32(item.PercentComplete),
TotalBytes: int64(item.TotalBytes),
ReceivedBytes: int64(item.ReceivedBytes),
StartTime: common.DDateTimeToGoDateTime(*(*float64)(common.GetParamPtr(item.StartTime, 0))),
EndTime: common.DDateTimeToGoDateTime(*(*float64)(common.GetParamPtr(item.EndTime, 0))),
FullPath: api.GoStr(item.FullPath),
Url: api.GoStr(item.Url),
OriginalUrl: api.GoStr(item.OriginalUrl),
SuggestedFileName: api.GoStr(item.SuggestedFileName),
ContentDisposition: api.GoStr(item.ContentDisposition),
MimeType: api.GoStr(item.MimeType),
IsValid: *(*bool)(unsafe.Pointer(item.IsValid)),
State: int32(item.State),
}
suggestedName := api.GoStr(getVal(3))
instance = getInstance(getVal(4))
callback := &ICefBeforeDownloadCallback{
instance: instance,
browseId: browser.Identifier(),
downId: downItem.Id,
}
fn.(ChromiumEventOnBeforeDownload)(lcl.AsObject(sender), browser, downItem, suggestedName, callback)
case ChromiumEventOnDownloadUpdated: //下载更新
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
item := *(*downloadItem)(getPtr(2))
downItem := &DownloadItem{
Id: int32(item.Id),
CurrentSpeed: int64(item.CurrentSpeed),
PercentComplete: int32(item.PercentComplete),
TotalBytes: int64(item.TotalBytes),
ReceivedBytes: int64(item.ReceivedBytes),
StartTime: common.DDateTimeToGoDateTime(*(*float64)(common.GetParamPtr(item.StartTime, 0))),
EndTime: common.DDateTimeToGoDateTime(*(*float64)(common.GetParamPtr(item.EndTime, 0))),
FullPath: api.GoStr(item.FullPath),
Url: api.GoStr(item.Url),
OriginalUrl: api.GoStr(item.OriginalUrl),
SuggestedFileName: api.GoStr(item.SuggestedFileName),
ContentDisposition: api.GoStr(item.ContentDisposition),
MimeType: api.GoStr(item.MimeType),
IsValid: *(*bool)(unsafe.Pointer(item.IsValid)),
State: int32(item.State),
}
instance = getInstance(getVal(3))
callback := &ICefDownloadItemCallback{
instance: instance,
browseId: browser.Identifier(),
downId: downItem.Id,
}
fn.(ChromiumEventOnDownloadUpdated)(lcl.AsObject(sender), browser, downItem, callback)
//frame
case ChromiumEventOnFrameAttached:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
fn.(ChromiumEventOnFrameAttached)(lcl.AsObject(sender), browser, frame, api.GoBool(getVal(3)))
case ChromiumEventOnFrameCreated:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
}
fn.(ChromiumEventOnFrameCreated)(lcl.AsObject(sender), browser, frame)
case ChromiumEventOnFrameDetached:
sender := getVal(0)
browser := &ICefBrowser{browseId: int32(getVal(1))}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
fn.(ChromiumEventOnFrameDetached)(lcl.AsObject(sender), browser, frame)
case ChromiumEventOnMainFrameChanged:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
var (
oldFrame *ICefFrame = nil
newFrame *ICefFrame = nil
)
tempOldFrame := (*cefFrame)(getPtr(2))
if tempOldFrame != nil {
oldFrame = &ICefFrame{
Browser: browser,
Name: api.GoStr(tempOldFrame.Name),
Url: api.GoStr(tempOldFrame.Url),
Id: common.StrToInt64(api.GoStr(tempOldFrame.Identifier)),
}
}
tempNewFrame := (*cefFrame)(getPtr(3))
if tempNewFrame != nil {
newFrame = &ICefFrame{
Browser: browser,
Name: api.GoStr(tempNewFrame.Name),
Url: api.GoStr(tempNewFrame.Url),
Id: common.StrToInt64(api.GoStr(tempNewFrame.Identifier)),
}
}
fn.(ChromiumEventOnMainFrameChanged)(lcl.AsObject(sender), browser, oldFrame, newFrame)
//windowParent popup
case ChromiumEventOnBeforePopup:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
beforePInfoPtr := (*beforePopupInfoPtr)(getPtr(3))
beforePInfo := &BeforePopupInfo{
TargetUrl: api.GoStr(beforePInfoPtr.TargetUrl),
TargetFrameName: api.GoStr(beforePInfoPtr.TargetFrameName),
TargetDisposition: consts.TCefWindowOpenDisposition(beforePInfoPtr.TargetDisposition),
UserGesture: api.GoBool(beforePInfoPtr.UserGesture),
}
var (
client = &ICefClient{instance: getPtr(5)}
noJavascriptAccess = (*bool)(getPtr(6))
result = (*bool)(getPtr(7))
)
//callback
*result = fn.(ChromiumEventOnBeforePopup)(lcl.AsObject(sender), browser, frame, beforePInfo, client, noJavascriptAccess)
//windowParent open url from tab
case ChromiumEventOnOpenUrlFromTab:
//no impl
case ChromiumEventOnDragEnter:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
dragData := &ICefDragData{instance: getPtr(2)}
mask := consts.TCefDragOperations(getVal(3))
result := (*bool)(getPtr(4))
fn.(ChromiumEventOnDragEnter)(lcl.AsObject(sender), browser, dragData, mask, result)
case ChromiumEventOnDraggableRegionsChanged:
sender := getPtr(0)
browser := &ICefBrowser{browseId: int32(getVal(1)), chromium: sender}
tempFrame := (*cefFrame)(getPtr(2))
frame := &ICefFrame{
Browser: browser,
Name: api.GoStr(tempFrame.Name),
Url: api.GoStr(tempFrame.Url),
Id: common.StrToInt64(api.GoStr(tempFrame.Identifier)),
}
regionsCount := int32(getVal(3))
regions := NewCefDraggableRegions()
var region TCefDraggableRegion
for i := 0; i < int(regionsCount); i++ {
region = *(*TCefDraggableRegion)(common.GetParamPtr(getVal(4), i*int(unsafe.Sizeof(TCefDraggableRegion{}))))
regions.Append(region)
}
fn.(ChromiumEventOnDraggableRegionsChanged)(lcl.AsObject(sender), browser, frame, regions)
default:
return false
}
return true
})
}
func getInstance(value interface{}) unsafe.Pointer {
var ptr uintptr
switch value.(type) {
case uintptr:
ptr = value.(uintptr)
case unsafe.Pointer:
ptr = uintptr(value.(unsafe.Pointer))
case lcl.IObject:
ptr = lcl.CheckPtr(value)
default:
ptr = getUIntPtr(value)
}
return unsafe.Pointer(ptr)
}
func getUIntPtr(v interface{}) uintptr {
switch v.(type) {
case int:
return uintptr(v.(int))
case uint:
return uintptr(v.(uint))
case int8:
return uintptr(v.(int8))
case uint8:
return uintptr(v.(uint8))
case int16:
return uintptr(v.(int16))
case uint16:
return uintptr(v.(uint16))
case int32:
return uintptr(v.(int32))
case uint32:
return uintptr(v.(uint32))
case int64:
return uintptr(v.(int64))
case uint64:
return uintptr(v.(uint64))
}
return 0
}