detached 902c404

chore(deps): bump purego-cef to v0.14.1

v0.14.0 pinned the CEF API 15000 contract and fixed the struct ABI
corruption that made BrowserSettings.BackgroundColor land on
chrome_status_bubble (transparent windowless canvas). v0.14.1 restores
the global function bindings dropped by that regeneration
(DictionaryValueCreate, V8ContextGetCurrentContext, all *Create
factories) and fixes global factory ownership so created objects are
adopted without a leaked reference.

This makes the white-canvas fix in this branch effective: the opaque
white BrowserSettings.BackgroundColor now actually reaches libcef.
commit
902c404508da47722a324d2f14b2a4cfc04a2812
author
brice · · 2026-07-21 19:07 UTC
parent
1dc7dd4
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
75 files · +1836 -1983
M go.mod +1 -1
@@ -6,7 +6,7 @@ require (
66 github.com/a-h/templ v0.3.1020
77 github.com/andybalholm/brotli v1.2.2
88 github.com/bnema/purego v0.11.0-bnema.4
9- github.com/bnema/purego-cef v0.13.4
9+ github.com/bnema/purego-cef v0.14.1
1010 github.com/bnema/purego-cef2gtk v0.8.5
1111 github.com/bnema/purego-pipewire v0.1.5
1212 github.com/bnema/purego-sqlite v0.1.4
@@ -6,7 +6,7 @@ require (
6 github.com/a-h/templ v0.3.10206 github.com/a-h/templ v0.3.1020
7 github.com/andybalholm/brotli v1.2.27 github.com/andybalholm/brotli v1.2.2
8 github.com/bnema/purego v0.11.0-bnema.48 github.com/bnema/purego v0.11.0-bnema.4
9- github.com/bnema/purego-cef v0.13.49+ github.com/bnema/purego-cef v0.14.1
10 github.com/bnema/purego-cef2gtk v0.8.510 github.com/bnema/purego-cef2gtk v0.8.5
11 github.com/bnema/purego-pipewire v0.1.511 github.com/bnema/purego-pipewire v0.1.5
12 github.com/bnema/purego-sqlite v0.1.412 github.com/bnema/purego-sqlite v0.1.4
M go.sum +2 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_browser_gen.go +15 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_command_line_gen.go +15 -2 generated file: collapsed
A vendor/github.com/bnema/purego-cef/cef/cef_component_updater_gen.go +323 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_cookie_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_drag_data_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_image_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_media_router_gen.go +24 -41 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_menu_model_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_parser_gen.go +10 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_preference_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_print_settings_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_process_message_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_request_context_gen.go +16 -3 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_request_gen.go +42 -3 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_resource_bundle_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_response_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_shared_memory_region_gen.go +3 -3 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_shared_process_message_builder_gen.go +20 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_stream_gen.go +34 -5 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_task_gen.go +15 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_task_manager_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_thread_gen.go +14 -1 generated file: collapsed
A vendor/github.com/bnema/purego-cef/cef/cef_types_component_gen.go +45 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_types_content_settings_gen.go +72 -79 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_types_gen.go +59 -52 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_urlrequest_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_v8_gen.go +166 -19
@@ -156,6 +156,19 @@ func wrapV8Context(ptr unsafe.Pointer) V8Context {
156156 return impl
157157 }
158158
159+// takeV8Context adopts a CEF V8Context pointer whose reference is already owned by
160+// the caller (as returned by a global factory function). Unlike wrapV8Context it
161+// does NOT call AddRef, because the C API already transferred one reference to us.
162+func takeV8Context(ptr unsafe.Pointer) V8Context {
163+ if ptr == nil {
164+ return nil
165+ }
166+ r := (*capi.CEFV8ContextT)(ptr)
167+ impl := &v8ContextImpl{rawPtr: r}
168+ runtime.SetFinalizer(impl, (*v8ContextImpl).Release)
169+ return impl
170+}
171+
159172 // V8Handler Structure that should be implemented to handle V8 function calls. The functions of this structure will be called on the thread associated with the V8 function.
160173 type V8Handler = portin.V8Handler
161174
@@ -818,6 +831,93 @@ func wrapV8ArrayBufferReleaseCallback(ptr unsafe.Pointer) V8ArrayBufferReleaseCa
818831 return impl
819832 }
820833
834+// V8BackingStore Structure representing a V8 ArrayBuffer backing store. The backing store holds the memory that backs an ArrayBuffer. It must be created on a thread with a valid V8 isolate (renderer main thread or WebWorker thread). Once created, the data() pointer can be safely read/written from any thread. This allows expensive operations like memcpy to be performed on a background thread before creating the ArrayBuffer on the V8 thread. The backing store is consumed when passed to cef_v8_value_t::cef_v8_value_create_array_buffer_from_backing_store(), after which is_valid() returns false (0).
835+type V8BackingStore = portin.V8BackingStore
836+
837+// v8BackingStoreImpl is a reverse wrapper for a CEF-owned V8BackingStore pointer.
838+// Release is idempotent, but callers must externally synchronize Release with
839+// concurrent method calls and must not use the wrapper after Release returns.
840+type v8BackingStoreImpl struct {
841+ rawPtr *capi.CEFV8BackingStoreT
842+ releaseOnce sync.Once
843+}
844+
845+func (obj *v8BackingStoreImpl) Data() uintptr {
846+ if obj == nil || obj.rawPtr == nil {
847+ return 0
848+ }
849+ rawPtr := obj.rawPtr
850+ ret := rawPtr.CallData()
851+ return uintptr(ret)
852+}
853+
854+func (obj *v8BackingStoreImpl) ByteLength() int {
855+ if obj == nil || obj.rawPtr == nil {
856+ return 0
857+ }
858+ rawPtr := obj.rawPtr
859+ ret := rawPtr.CallByteLength()
860+ return int(ret)
861+}
862+
863+func (obj *v8BackingStoreImpl) IsValid() bool {
864+ if obj == nil || obj.rawPtr == nil {
865+ return false
866+ }
867+ rawPtr := obj.rawPtr
868+ ret := rawPtr.CallIsValid()
869+ return ret != 0
870+}
871+
872+func (obj *v8BackingStoreImpl) RawPointer() unsafe.Pointer {
873+ if obj == nil || obj.rawPtr == nil {
874+ return nil
875+ }
876+ return unsafe.Pointer(obj.rawPtr)
877+}
878+
879+// Release releases the underlying CEF object.
880+func (obj *v8BackingStoreImpl) Release() {
881+ if obj == nil {
882+ return
883+ }
884+ obj.releaseOnce.Do(func() {
885+ if obj.rawPtr == nil {
886+ return
887+ }
888+ rawPtr := obj.rawPtr
889+ obj.rawPtr = nil
890+ runtime.SetFinalizer(obj, nil)
891+ base := (*capi.CEFBaseRefCountedT)(unsafe.Pointer(rawPtr))
892+ base.CallRelease()
893+ })
894+}
895+
896+func wrapV8BackingStore(ptr unsafe.Pointer) V8BackingStore {
897+ if ptr == nil {
898+ return nil
899+ }
900+ r := (*capi.CEFV8BackingStoreT)(ptr)
901+ base := (*capi.CEFBaseRefCountedT)(ptr)
902+ base.CallAddRef()
903+ impl := &v8BackingStoreImpl{rawPtr: r}
904+ runtime.SetFinalizer(impl, (*v8BackingStoreImpl).Release)
905+ return impl
906+}
907+
908+// takeV8BackingStore adopts a CEF V8BackingStore pointer whose reference is already owned by
909+// the caller (as returned by a global factory function). Unlike wrapV8BackingStore it
910+// does NOT call AddRef, because the C API already transferred one reference to us.
911+func takeV8BackingStore(ptr unsafe.Pointer) V8BackingStore {
912+ if ptr == nil {
913+ return nil
914+ }
915+ r := (*capi.CEFV8BackingStoreT)(ptr)
916+ impl := &v8BackingStoreImpl{rawPtr: r}
917+ runtime.SetFinalizer(impl, (*v8BackingStoreImpl).Release)
918+ return impl
919+}
920+
821921 // V8Value Structure representing a V8 value handle. V8 handles can only be accessed from the thread on which they are created. Valid threads for creating a V8 handle include the render process main thread (TID_RENDERER) and WebWorker threads. A task runner for posting tasks on the associated thread can be retrieved via the cef_v8_context_t::get_task_runner() function.
822922 type V8Value = portin.V8Value
823923
@@ -1249,13 +1349,13 @@ func (obj *v8ValueImpl) GetArrayBufferByteLength() int {
12491349 return int(ret)
12501350 }
12511351
1252-func (obj *v8ValueImpl) GetArrayBufferData() unsafe.Pointer {
1352+func (obj *v8ValueImpl) GetArrayBufferData() uintptr {
12531353 if obj == nil || obj.rawPtr == nil {
1254- return nil
1354+ return 0
12551355 }
12561356 rawPtr := obj.rawPtr
12571357 ret := rawPtr.CallGetArrayBufferData()
1258- return unsafe.Pointer(ret)
1358+ return uintptr(ret)
12591359 }
12601360
12611361 func (obj *v8ValueImpl) GetFunctionName() string {
@@ -1368,6 +1468,19 @@ func wrapV8Value(ptr unsafe.Pointer) V8Value {
13681468 return impl
13691469 }
13701470
1471+// takeV8Value adopts a CEF V8Value pointer whose reference is already owned by
1472+// the caller (as returned by a global factory function). Unlike wrapV8Value it
1473+// does NOT call AddRef, because the C API already transferred one reference to us.
1474+func takeV8Value(ptr unsafe.Pointer) V8Value {
1475+ if ptr == nil {
1476+ return nil
1477+ }
1478+ r := (*capi.CEFV8ValueT)(ptr)
1479+ impl := &v8ValueImpl{rawPtr: r}
1480+ runtime.SetFinalizer(impl, (*v8ValueImpl).Release)
1481+ return impl
1482+}
1483+
13711484 // V8StackTrace Structure representing a V8 stack trace handle. V8 handles can only be accessed from the thread on which they are created. Valid threads for creating a V8 handle include the render process main thread (TID_RENDERER) and WebWorker threads. A task runner for posting tasks on the associated thread can be retrieved via the cef_v8_context_t::get_task_runner() function.
13721485 type V8StackTrace = portin.V8StackTrace
13731486
@@ -1442,6 +1555,19 @@ func wrapV8StackTrace(ptr unsafe.Pointer) V8StackTrace {
14421555 return impl
14431556 }
14441557
1558+// takeV8StackTrace adopts a CEF V8StackTrace pointer whose reference is already owned by
1559+// the caller (as returned by a global factory function). Unlike wrapV8StackTrace it
1560+// does NOT call AddRef, because the C API already transferred one reference to us.
1561+func takeV8StackTrace(ptr unsafe.Pointer) V8StackTrace {
1562+ if ptr == nil {
1563+ return nil
1564+ }
1565+ r := (*capi.CEFV8StackTraceT)(ptr)
1566+ impl := &v8StackTraceImpl{rawPtr: r}
1567+ runtime.SetFinalizer(impl, (*v8StackTraceImpl).Release)
1568+ return impl
1569+}
1570+
14451571 // V8StackFrame Structure representing a V8 stack frame handle. V8 handles can only be accessed from the thread on which they are created. Valid threads for creating a V8 handle include the render process main thread (TID_RENDERER) and WebWorker threads. A task runner for posting tasks on the associated thread can be retrieved via the cef_v8_context_t::get_task_runner() function.
14461572 type V8StackFrame = portin.V8StackFrame
14471573
@@ -1564,13 +1690,13 @@ func wrapV8StackFrame(ptr unsafe.Pointer) V8StackFrame {
15641690 // V8ContextGetCurrentContext Returns the current (top) context object in the V8 context stack.
15651691 func V8ContextGetCurrentContext() V8Context {
15661692 ret := capi.CEFV8ContextGetCurrentContext()
1567- return wrapV8Context(ret)
1693+ return takeV8Context(ret)
15681694 }
15691695
15701696 // V8ContextGetEnteredContext Returns the entered (bottom) context object in the V8 context stack.
15711697 func V8ContextGetEnteredContext() V8Context {
15721698 ret := capi.CEFV8ContextGetEnteredContext()
1573- return wrapV8Context(ret)
1699+ return takeV8Context(ret)
15741700 }
15751701
15761702 // V8ContextInContext Returns true (1) if V8 is currently inside a context.
@@ -1579,40 +1705,49 @@ func V8ContextInContext() int32 {
15791705 return int32(ret)
15801706 }
15811707
1708+// V8BackingStoreCreate Create a new backing store with allocated memory of |byte_length| bytes. The memory is uninitialized. This function must be called on a thread with a valid V8 isolate. The returned object can safely be passed to other threads. Returns nullptr on failure.
1709+func V8BackingStoreCreate(byteLength int) V8BackingStore {
1710+ if byteLength < 0 {
1711+ return nil
1712+ }
1713+ ret := capi.CEFV8BackingStoreCreate(uintptr(byteLength))
1714+ return takeV8BackingStore(ret)
1715+}
1716+
15821717 // V8ValueCreateUndefined Create a new cef_v8_value_t object of type undefined.
15831718 func V8ValueCreateUndefined() V8Value {
15841719 ret := capi.CEFV8ValueCreateUndefined()
1585- return wrapV8Value(ret)
1720+ return takeV8Value(ret)
15861721 }
15871722
15881723 // V8ValueCreateNull Create a new cef_v8_value_t object of type null.
15891724 func V8ValueCreateNull() V8Value {
15901725 ret := capi.CEFV8ValueCreateNull()
1591- return wrapV8Value(ret)
1726+ return takeV8Value(ret)
15921727 }
15931728
15941729 // V8ValueCreateBool Create a new cef_v8_value_t object of type bool.
15951730 func V8ValueCreateBool(value int32) V8Value {
15961731 ret := capi.CEFV8ValueCreateBool(value)
1597- return wrapV8Value(ret)
1732+ return takeV8Value(ret)
15981733 }
15991734
16001735 // V8ValueCreateInt Create a new cef_v8_value_t object of type int.
16011736 func V8ValueCreateInt(value int32) V8Value {
16021737 ret := capi.CEFV8ValueCreateInt(value)
1603- return wrapV8Value(ret)
1738+ return takeV8Value(ret)
16041739 }
16051740
16061741 // V8ValueCreateUint Create a new cef_v8_value_t object of type unsigned int.
16071742 func V8ValueCreateUint(value uint32) V8Value {
16081743 ret := capi.CEFV8ValueCreateUint(value)
1609- return wrapV8Value(ret)
1744+ return takeV8Value(ret)
16101745 }
16111746
16121747 // V8ValueCreateDouble Create a new cef_v8_value_t object of type double.
16131748 func V8ValueCreateDouble(value float64) V8Value {
16141749 ret := capi.CEFV8ValueCreateDouble(value)
1615- return wrapV8Value(ret)
1750+ return takeV8Value(ret)
16161751 }
16171752
16181753 // V8ValueCreateString Create a new cef_v8_value_t object of type string.
@@ -1620,31 +1755,43 @@ func V8ValueCreateString(value string) V8Value {
16201755 valueStr := cefString(value)
16211756 defer freeCefString(&valueStr)
16221757 ret := capi.CEFV8ValueCreateString(unsafe.Pointer(&valueStr))
1623- return wrapV8Value(ret)
1758+ return takeV8Value(ret)
16241759 }
16251760
16261761 // V8ValueCreateObject wraps the CEF CEFV8ValueCreateObject function.
16271762 func V8ValueCreateObject(accessor V8Accessor, interceptor V8Interceptor) V8Value {
16281763 ret := capi.CEFV8ValueCreateObject(extractOrWrapRawPointer(accessor, func() any { return NewV8Accessor(accessor) }), extractOrWrapRawPointer(interceptor, func() any { return NewV8Interceptor(interceptor) }))
1629- return wrapV8Value(ret)
1764+ return takeV8Value(ret)
16301765 }
16311766
16321767 // V8ValueCreateArray Create a new cef_v8_value_t object of type array with the specified |length|. If |length| is negative the returned array will have length 0. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.
16331768 func V8ValueCreateArray(length int32) V8Value {
16341769 ret := capi.CEFV8ValueCreateArray(length)
1635- return wrapV8Value(ret)
1770+ return takeV8Value(ret)
16361771 }
16371772
16381773 // V8ValueCreateArrayBuffer Create a new cef_v8_value_t object of type ArrayBuffer which wraps the provided |buffer| of size |length| bytes. The ArrayBuffer is externalized, meaning that it does not own |buffer|. The caller is responsible for freeing |buffer| when requested via a call to cef_v8_array_buffer_release_callback_t::ReleaseBuffer. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference. NOTE: Always returns nullptr when V8 sandbox is enabled.
16391774 func V8ValueCreateArrayBuffer(buffer unsafe.Pointer, length int, releaseCallback V8ArrayBufferReleaseCallback) V8Value {
1775+ if length < 0 {
1776+ return nil
1777+ }
16401778 ret := capi.CEFV8ValueCreateArrayBuffer(buffer, uintptr(length), extractOrWrapRawPointer(releaseCallback, func() any { return NewV8ArrayBufferReleaseCallback(releaseCallback) }))
1641- return wrapV8Value(ret)
1779+ return takeV8Value(ret)
16421780 }
16431781
16441782 // V8ValueCreateArrayBufferWithCopy Create a new cef_v8_value_t object of type ArrayBuffer which copies the provided |buffer| of size |length| bytes. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.
16451783 func V8ValueCreateArrayBufferWithCopy(buffer unsafe.Pointer, length int) V8Value {
1784+ if length < 0 {
1785+ return nil
1786+ }
16461787 ret := capi.CEFV8ValueCreateArrayBufferWithCopy(buffer, uintptr(length))
1647- return wrapV8Value(ret)
1788+ return takeV8Value(ret)
1789+}
1790+
1791+// V8ValueCreateArrayBufferFromBackingStore wraps the CEF CEFV8ValueCreateArrayBufferFromBackingStore function.
1792+func V8ValueCreateArrayBufferFromBackingStore(backingStore V8BackingStore) V8Value {
1793+ ret := capi.CEFV8ValueCreateArrayBufferFromBackingStore(extractRawPointer(backingStore))
1794+ return takeV8Value(ret)
16481795 }
16491796
16501797 // V8ValueCreateFunction Create a new cef_v8_value_t object of type function. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.
@@ -1652,19 +1799,19 @@ func V8ValueCreateFunction(name string, handler V8Handler) V8Value {
16521799 nameStr := cefString(name)
16531800 defer freeCefString(&nameStr)
16541801 ret := capi.CEFV8ValueCreateFunction(unsafe.Pointer(&nameStr), extractOrWrapRawPointer(handler, func() any { return NewV8Handler(handler) }))
1655- return wrapV8Value(ret)
1802+ return takeV8Value(ret)
16561803 }
16571804
16581805 // V8ValueCreatePromise Create a new cef_v8_value_t object of type Promise. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.
16591806 func V8ValueCreatePromise() V8Value {
16601807 ret := capi.CEFV8ValueCreatePromise()
1661- return wrapV8Value(ret)
1808+ return takeV8Value(ret)
16621809 }
16631810
16641811 // V8StackTraceGetCurrent Returns the stack trace for the currently active context. |frame_limit| is the maximum number of frames that will be captured.
16651812 func V8StackTraceGetCurrent(frameLimit int32) V8StackTrace {
16661813 ret := capi.CEFV8StackTraceGetCurrent(frameLimit)
1667- return wrapV8StackTrace(ret)
1814+ return takeV8StackTrace(ret)
16681815 }
16691816
16701817 // RegisterExtension Register a new V8 extension with the specified JavaScript extension code and handler. Functions implemented by the handler are prototyped using the keyword 'native'. The calling of a native function is restricted to the scope in which the prototype of the native function is defined. This function may only be called on the render process main thread. Example JavaScript extension code: <pre> // create the 'example' global object if it doesn't already exist. if (!example) example = {}; // create the 'example.test' global object if it doesn't already exist. if (!example.test) example.test = {}; (function() { // Define the function 'example.test.myfunction'. example.test.myfunction = function() { // Call CefV8Handler::Execute() with the function name 'MyFunction' // and no arguments. native function MyFunction(); return MyFunction(); }; // Define the getter function for parameter 'example.test.myparam'. example.test.__defineGetter__('myparam', function() { // Call CefV8Handler::Execute() with the function name 'GetMyParam' // and no arguments. native function GetMyParam(); return GetMyParam(); }); // Define the setter function for parameter 'example.test.myparam'. example.test.__defineSetter__('myparam', function(b) { // Call CefV8Handler::Execute() with the function name 'SetMyParam' // and a single argument. native function SetMyParam(); if(b) SetMyParam(b); }); // Extension definitions can also contain normal JavaScript variables // and functions. var myint = 0; example.test.increment = function() { myint += 1; return myint; }; })(); </pre> Example usage in the page: <pre> // Call the function. example.test.myfunction(); // Set the parameter. example.test.myparam = value; // Get the parameter. value = example.test.myparam; // Call another function. example.test.increment(); </pre>
@@ -156,6 +156,19 @@ func wrapV8Context(ptr unsafe.Pointer) V8Context {
156 return impl156 return impl
157 }157 }
158 158
159+// takeV8Context adopts a CEF V8Context pointer whose reference is already owned by
160+// the caller (as returned by a global factory function). Unlike wrapV8Context it
161+// does NOT call AddRef, because the C API already transferred one reference to us.
162+func takeV8Context(ptr unsafe.Pointer) V8Context {
163+ if ptr == nil {
164+ return nil
165+ }
166+ r := (*capi.CEFV8ContextT)(ptr)
167+ impl := &v8ContextImpl{rawPtr: r}
168+ runtime.SetFinalizer(impl, (*v8ContextImpl).Release)
169+ return impl
170+}
171+
159 // V8Handler Structure that should be implemented to handle V8 function calls. The functions of this structure will be called on the thread associated with the V8 function.172 // V8Handler Structure that should be implemented to handle V8 function calls. The functions of this structure will be called on the thread associated with the V8 function.
160 type V8Handler = portin.V8Handler173 type V8Handler = portin.V8Handler
161 174
@@ -818,6 +831,93 @@ func wrapV8ArrayBufferReleaseCallback(ptr unsafe.Pointer) V8ArrayBufferReleaseCa
818 return impl831 return impl
819 }832 }
820 833
834+// V8BackingStore Structure representing a V8 ArrayBuffer backing store. The backing store holds the memory that backs an ArrayBuffer. It must be created on a thread with a valid V8 isolate (renderer main thread or WebWorker thread). Once created, the data() pointer can be safely read/written from any thread. This allows expensive operations like memcpy to be performed on a background thread before creating the ArrayBuffer on the V8 thread. The backing store is consumed when passed to cef_v8_value_t::cef_v8_value_create_array_buffer_from_backing_store(), after which is_valid() returns false (0).
835+type V8BackingStore = portin.V8BackingStore
836+
837+// v8BackingStoreImpl is a reverse wrapper for a CEF-owned V8BackingStore pointer.
838+// Release is idempotent, but callers must externally synchronize Release with
839+// concurrent method calls and must not use the wrapper after Release returns.
840+type v8BackingStoreImpl struct {
841+ rawPtr *capi.CEFV8BackingStoreT
842+ releaseOnce sync.Once
843+}
844+
845+func (obj *v8BackingStoreImpl) Data() uintptr {
846+ if obj == nil || obj.rawPtr == nil {
847+ return 0
848+ }
849+ rawPtr := obj.rawPtr
850+ ret := rawPtr.CallData()
851+ return uintptr(ret)
852+}
853+
854+func (obj *v8BackingStoreImpl) ByteLength() int {
855+ if obj == nil || obj.rawPtr == nil {
856+ return 0
857+ }
858+ rawPtr := obj.rawPtr
859+ ret := rawPtr.CallByteLength()
860+ return int(ret)
861+}
862+
863+func (obj *v8BackingStoreImpl) IsValid() bool {
864+ if obj == nil || obj.rawPtr == nil {
865+ return false
866+ }
867+ rawPtr := obj.rawPtr
868+ ret := rawPtr.CallIsValid()
869+ return ret != 0
870+}
871+
872+func (obj *v8BackingStoreImpl) RawPointer() unsafe.Pointer {
873+ if obj == nil || obj.rawPtr == nil {
874+ return nil
875+ }
876+ return unsafe.Pointer(obj.rawPtr)
877+}
878+
879+// Release releases the underlying CEF object.
880+func (obj *v8BackingStoreImpl) Release() {
881+ if obj == nil {
882+ return
883+ }
884+ obj.releaseOnce.Do(func() {
885+ if obj.rawPtr == nil {
886+ return
887+ }
888+ rawPtr := obj.rawPtr
889+ obj.rawPtr = nil
890+ runtime.SetFinalizer(obj, nil)
891+ base := (*capi.CEFBaseRefCountedT)(unsafe.Pointer(rawPtr))
892+ base.CallRelease()
893+ })
894+}
895+
896+func wrapV8BackingStore(ptr unsafe.Pointer) V8BackingStore {
897+ if ptr == nil {
898+ return nil
899+ }
900+ r := (*capi.CEFV8BackingStoreT)(ptr)
901+ base := (*capi.CEFBaseRefCountedT)(ptr)
902+ base.CallAddRef()
903+ impl := &v8BackingStoreImpl{rawPtr: r}
904+ runtime.SetFinalizer(impl, (*v8BackingStoreImpl).Release)
905+ return impl
906+}
907+
908+// takeV8BackingStore adopts a CEF V8BackingStore pointer whose reference is already owned by
909+// the caller (as returned by a global factory function). Unlike wrapV8BackingStore it
910+// does NOT call AddRef, because the C API already transferred one reference to us.
911+func takeV8BackingStore(ptr unsafe.Pointer) V8BackingStore {
912+ if ptr == nil {
913+ return nil
914+ }
915+ r := (*capi.CEFV8BackingStoreT)(ptr)
916+ impl := &v8BackingStoreImpl{rawPtr: r}
917+ runtime.SetFinalizer(impl, (*v8BackingStoreImpl).Release)
918+ return impl
919+}
920+
821 // V8Value Structure representing a V8 value handle. V8 handles can only be accessed from the thread on which they are created. Valid threads for creating a V8 handle include the render process main thread (TID_RENDERER) and WebWorker threads. A task runner for posting tasks on the associated thread can be retrieved via the cef_v8_context_t::get_task_runner() function.921 // V8Value Structure representing a V8 value handle. V8 handles can only be accessed from the thread on which they are created. Valid threads for creating a V8 handle include the render process main thread (TID_RENDERER) and WebWorker threads. A task runner for posting tasks on the associated thread can be retrieved via the cef_v8_context_t::get_task_runner() function.
822 type V8Value = portin.V8Value922 type V8Value = portin.V8Value
823 923
@@ -1249,13 +1349,13 @@ func (obj *v8ValueImpl) GetArrayBufferByteLength() int {
1249 return int(ret)1349 return int(ret)
1250 }1350 }
1251 1351
1252-func (obj *v8ValueImpl) GetArrayBufferData() unsafe.Pointer {1352+func (obj *v8ValueImpl) GetArrayBufferData() uintptr {
1253 if obj == nil || obj.rawPtr == nil {1353 if obj == nil || obj.rawPtr == nil {
1254- return nil1354+ return 0
1255 }1355 }
1256 rawPtr := obj.rawPtr1356 rawPtr := obj.rawPtr
1257 ret := rawPtr.CallGetArrayBufferData()1357 ret := rawPtr.CallGetArrayBufferData()
1258- return unsafe.Pointer(ret)1358+ return uintptr(ret)
1259 }1359 }
1260 1360
1261 func (obj *v8ValueImpl) GetFunctionName() string {1361 func (obj *v8ValueImpl) GetFunctionName() string {
@@ -1368,6 +1468,19 @@ func wrapV8Value(ptr unsafe.Pointer) V8Value {
1368 return impl1468 return impl
1369 }1469 }
1370 1470
1471+// takeV8Value adopts a CEF V8Value pointer whose reference is already owned by
1472+// the caller (as returned by a global factory function). Unlike wrapV8Value it
1473+// does NOT call AddRef, because the C API already transferred one reference to us.
1474+func takeV8Value(ptr unsafe.Pointer) V8Value {
1475+ if ptr == nil {
1476+ return nil
1477+ }
1478+ r := (*capi.CEFV8ValueT)(ptr)
1479+ impl := &v8ValueImpl{rawPtr: r}
1480+ runtime.SetFinalizer(impl, (*v8ValueImpl).Release)
1481+ return impl
1482+}
1483+
1371 // V8StackTrace Structure representing a V8 stack trace handle. V8 handles can only be accessed from the thread on which they are created. Valid threads for creating a V8 handle include the render process main thread (TID_RENDERER) and WebWorker threads. A task runner for posting tasks on the associated thread can be retrieved via the cef_v8_context_t::get_task_runner() function.1484 // V8StackTrace Structure representing a V8 stack trace handle. V8 handles can only be accessed from the thread on which they are created. Valid threads for creating a V8 handle include the render process main thread (TID_RENDERER) and WebWorker threads. A task runner for posting tasks on the associated thread can be retrieved via the cef_v8_context_t::get_task_runner() function.
1372 type V8StackTrace = portin.V8StackTrace1485 type V8StackTrace = portin.V8StackTrace
1373 1486
@@ -1442,6 +1555,19 @@ func wrapV8StackTrace(ptr unsafe.Pointer) V8StackTrace {
1442 return impl1555 return impl
1443 }1556 }
1444 1557
1558+// takeV8StackTrace adopts a CEF V8StackTrace pointer whose reference is already owned by
1559+// the caller (as returned by a global factory function). Unlike wrapV8StackTrace it
1560+// does NOT call AddRef, because the C API already transferred one reference to us.
1561+func takeV8StackTrace(ptr unsafe.Pointer) V8StackTrace {
1562+ if ptr == nil {
1563+ return nil
1564+ }
1565+ r := (*capi.CEFV8StackTraceT)(ptr)
1566+ impl := &v8StackTraceImpl{rawPtr: r}
1567+ runtime.SetFinalizer(impl, (*v8StackTraceImpl).Release)
1568+ return impl
1569+}
1570+
1445 // V8StackFrame Structure representing a V8 stack frame handle. V8 handles can only be accessed from the thread on which they are created. Valid threads for creating a V8 handle include the render process main thread (TID_RENDERER) and WebWorker threads. A task runner for posting tasks on the associated thread can be retrieved via the cef_v8_context_t::get_task_runner() function.1571 // V8StackFrame Structure representing a V8 stack frame handle. V8 handles can only be accessed from the thread on which they are created. Valid threads for creating a V8 handle include the render process main thread (TID_RENDERER) and WebWorker threads. A task runner for posting tasks on the associated thread can be retrieved via the cef_v8_context_t::get_task_runner() function.
1446 type V8StackFrame = portin.V8StackFrame1572 type V8StackFrame = portin.V8StackFrame
1447 1573
@@ -1564,13 +1690,13 @@ func wrapV8StackFrame(ptr unsafe.Pointer) V8StackFrame {
1564 // V8ContextGetCurrentContext Returns the current (top) context object in the V8 context stack.1690 // V8ContextGetCurrentContext Returns the current (top) context object in the V8 context stack.
1565 func V8ContextGetCurrentContext() V8Context {1691 func V8ContextGetCurrentContext() V8Context {
1566 ret := capi.CEFV8ContextGetCurrentContext()1692 ret := capi.CEFV8ContextGetCurrentContext()
1567- return wrapV8Context(ret)1693+ return takeV8Context(ret)
1568 }1694 }
1569 1695
1570 // V8ContextGetEnteredContext Returns the entered (bottom) context object in the V8 context stack.1696 // V8ContextGetEnteredContext Returns the entered (bottom) context object in the V8 context stack.
1571 func V8ContextGetEnteredContext() V8Context {1697 func V8ContextGetEnteredContext() V8Context {
1572 ret := capi.CEFV8ContextGetEnteredContext()1698 ret := capi.CEFV8ContextGetEnteredContext()
1573- return wrapV8Context(ret)1699+ return takeV8Context(ret)
1574 }1700 }
1575 1701
1576 // V8ContextInContext Returns true (1) if V8 is currently inside a context.1702 // V8ContextInContext Returns true (1) if V8 is currently inside a context.
@@ -1579,40 +1705,49 @@ func V8ContextInContext() int32 {
1579 return int32(ret)1705 return int32(ret)
1580 }1706 }
1581 1707
1708+// V8BackingStoreCreate Create a new backing store with allocated memory of |byte_length| bytes. The memory is uninitialized. This function must be called on a thread with a valid V8 isolate. The returned object can safely be passed to other threads. Returns nullptr on failure.
1709+func V8BackingStoreCreate(byteLength int) V8BackingStore {
1710+ if byteLength < 0 {
1711+ return nil
1712+ }
1713+ ret := capi.CEFV8BackingStoreCreate(uintptr(byteLength))
1714+ return takeV8BackingStore(ret)
1715+}
1716+
1582 // V8ValueCreateUndefined Create a new cef_v8_value_t object of type undefined.1717 // V8ValueCreateUndefined Create a new cef_v8_value_t object of type undefined.
1583 func V8ValueCreateUndefined() V8Value {1718 func V8ValueCreateUndefined() V8Value {
1584 ret := capi.CEFV8ValueCreateUndefined()1719 ret := capi.CEFV8ValueCreateUndefined()
1585- return wrapV8Value(ret)1720+ return takeV8Value(ret)
1586 }1721 }
1587 1722
1588 // V8ValueCreateNull Create a new cef_v8_value_t object of type null.1723 // V8ValueCreateNull Create a new cef_v8_value_t object of type null.
1589 func V8ValueCreateNull() V8Value {1724 func V8ValueCreateNull() V8Value {
1590 ret := capi.CEFV8ValueCreateNull()1725 ret := capi.CEFV8ValueCreateNull()
1591- return wrapV8Value(ret)1726+ return takeV8Value(ret)
1592 }1727 }
1593 1728
1594 // V8ValueCreateBool Create a new cef_v8_value_t object of type bool.1729 // V8ValueCreateBool Create a new cef_v8_value_t object of type bool.
1595 func V8ValueCreateBool(value int32) V8Value {1730 func V8ValueCreateBool(value int32) V8Value {
1596 ret := capi.CEFV8ValueCreateBool(value)1731 ret := capi.CEFV8ValueCreateBool(value)
1597- return wrapV8Value(ret)1732+ return takeV8Value(ret)
1598 }1733 }
1599 1734
1600 // V8ValueCreateInt Create a new cef_v8_value_t object of type int.1735 // V8ValueCreateInt Create a new cef_v8_value_t object of type int.
1601 func V8ValueCreateInt(value int32) V8Value {1736 func V8ValueCreateInt(value int32) V8Value {
1602 ret := capi.CEFV8ValueCreateInt(value)1737 ret := capi.CEFV8ValueCreateInt(value)
1603- return wrapV8Value(ret)1738+ return takeV8Value(ret)
1604 }1739 }
1605 1740
1606 // V8ValueCreateUint Create a new cef_v8_value_t object of type unsigned int.1741 // V8ValueCreateUint Create a new cef_v8_value_t object of type unsigned int.
1607 func V8ValueCreateUint(value uint32) V8Value {1742 func V8ValueCreateUint(value uint32) V8Value {
1608 ret := capi.CEFV8ValueCreateUint(value)1743 ret := capi.CEFV8ValueCreateUint(value)
1609- return wrapV8Value(ret)1744+ return takeV8Value(ret)
1610 }1745 }
1611 1746
1612 // V8ValueCreateDouble Create a new cef_v8_value_t object of type double.1747 // V8ValueCreateDouble Create a new cef_v8_value_t object of type double.
1613 func V8ValueCreateDouble(value float64) V8Value {1748 func V8ValueCreateDouble(value float64) V8Value {
1614 ret := capi.CEFV8ValueCreateDouble(value)1749 ret := capi.CEFV8ValueCreateDouble(value)
1615- return wrapV8Value(ret)1750+ return takeV8Value(ret)
1616 }1751 }
1617 1752
1618 // V8ValueCreateString Create a new cef_v8_value_t object of type string.1753 // V8ValueCreateString Create a new cef_v8_value_t object of type string.
@@ -1620,31 +1755,43 @@ func V8ValueCreateString(value string) V8Value {
1620 valueStr := cefString(value)1755 valueStr := cefString(value)
1621 defer freeCefString(&valueStr)1756 defer freeCefString(&valueStr)
1622 ret := capi.CEFV8ValueCreateString(unsafe.Pointer(&valueStr))1757 ret := capi.CEFV8ValueCreateString(unsafe.Pointer(&valueStr))
1623- return wrapV8Value(ret)1758+ return takeV8Value(ret)
1624 }1759 }
1625 1760
1626 // V8ValueCreateObject wraps the CEF CEFV8ValueCreateObject function.1761 // V8ValueCreateObject wraps the CEF CEFV8ValueCreateObject function.
1627 func V8ValueCreateObject(accessor V8Accessor, interceptor V8Interceptor) V8Value {1762 func V8ValueCreateObject(accessor V8Accessor, interceptor V8Interceptor) V8Value {
1628 ret := capi.CEFV8ValueCreateObject(extractOrWrapRawPointer(accessor, func() any { return NewV8Accessor(accessor) }), extractOrWrapRawPointer(interceptor, func() any { return NewV8Interceptor(interceptor) }))1763 ret := capi.CEFV8ValueCreateObject(extractOrWrapRawPointer(accessor, func() any { return NewV8Accessor(accessor) }), extractOrWrapRawPointer(interceptor, func() any { return NewV8Interceptor(interceptor) }))
1629- return wrapV8Value(ret)1764+ return takeV8Value(ret)
1630 }1765 }
1631 1766
1632 // V8ValueCreateArray Create a new cef_v8_value_t object of type array with the specified |length|. If |length| is negative the returned array will have length 0. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.1767 // V8ValueCreateArray Create a new cef_v8_value_t object of type array with the specified |length|. If |length| is negative the returned array will have length 0. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.
1633 func V8ValueCreateArray(length int32) V8Value {1768 func V8ValueCreateArray(length int32) V8Value {
1634 ret := capi.CEFV8ValueCreateArray(length)1769 ret := capi.CEFV8ValueCreateArray(length)
1635- return wrapV8Value(ret)1770+ return takeV8Value(ret)
1636 }1771 }
1637 1772
1638 // V8ValueCreateArrayBuffer Create a new cef_v8_value_t object of type ArrayBuffer which wraps the provided |buffer| of size |length| bytes. The ArrayBuffer is externalized, meaning that it does not own |buffer|. The caller is responsible for freeing |buffer| when requested via a call to cef_v8_array_buffer_release_callback_t::ReleaseBuffer. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference. NOTE: Always returns nullptr when V8 sandbox is enabled.1773 // V8ValueCreateArrayBuffer Create a new cef_v8_value_t object of type ArrayBuffer which wraps the provided |buffer| of size |length| bytes. The ArrayBuffer is externalized, meaning that it does not own |buffer|. The caller is responsible for freeing |buffer| when requested via a call to cef_v8_array_buffer_release_callback_t::ReleaseBuffer. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference. NOTE: Always returns nullptr when V8 sandbox is enabled.
1639 func V8ValueCreateArrayBuffer(buffer unsafe.Pointer, length int, releaseCallback V8ArrayBufferReleaseCallback) V8Value {1774 func V8ValueCreateArrayBuffer(buffer unsafe.Pointer, length int, releaseCallback V8ArrayBufferReleaseCallback) V8Value {
1775+ if length < 0 {
1776+ return nil
1777+ }
1640 ret := capi.CEFV8ValueCreateArrayBuffer(buffer, uintptr(length), extractOrWrapRawPointer(releaseCallback, func() any { return NewV8ArrayBufferReleaseCallback(releaseCallback) }))1778 ret := capi.CEFV8ValueCreateArrayBuffer(buffer, uintptr(length), extractOrWrapRawPointer(releaseCallback, func() any { return NewV8ArrayBufferReleaseCallback(releaseCallback) }))
1641- return wrapV8Value(ret)1779+ return takeV8Value(ret)
1642 }1780 }
1643 1781
1644 // V8ValueCreateArrayBufferWithCopy Create a new cef_v8_value_t object of type ArrayBuffer which copies the provided |buffer| of size |length| bytes. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.1782 // V8ValueCreateArrayBufferWithCopy Create a new cef_v8_value_t object of type ArrayBuffer which copies the provided |buffer| of size |length| bytes. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.
1645 func V8ValueCreateArrayBufferWithCopy(buffer unsafe.Pointer, length int) V8Value {1783 func V8ValueCreateArrayBufferWithCopy(buffer unsafe.Pointer, length int) V8Value {
1784+ if length < 0 {
1785+ return nil
1786+ }
1646 ret := capi.CEFV8ValueCreateArrayBufferWithCopy(buffer, uintptr(length))1787 ret := capi.CEFV8ValueCreateArrayBufferWithCopy(buffer, uintptr(length))
1647- return wrapV8Value(ret)1788+ return takeV8Value(ret)
1789+}
1790+
1791+// V8ValueCreateArrayBufferFromBackingStore wraps the CEF CEFV8ValueCreateArrayBufferFromBackingStore function.
1792+func V8ValueCreateArrayBufferFromBackingStore(backingStore V8BackingStore) V8Value {
1793+ ret := capi.CEFV8ValueCreateArrayBufferFromBackingStore(extractRawPointer(backingStore))
1794+ return takeV8Value(ret)
1648 }1795 }
1649 1796
1650 // V8ValueCreateFunction Create a new cef_v8_value_t object of type function. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.1797 // V8ValueCreateFunction Create a new cef_v8_value_t object of type function. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.
@@ -1652,19 +1799,19 @@ func V8ValueCreateFunction(name string, handler V8Handler) V8Value {
1652 nameStr := cefString(name)1799 nameStr := cefString(name)
1653 defer freeCefString(&nameStr)1800 defer freeCefString(&nameStr)
1654 ret := capi.CEFV8ValueCreateFunction(unsafe.Pointer(&nameStr), extractOrWrapRawPointer(handler, func() any { return NewV8Handler(handler) }))1801 ret := capi.CEFV8ValueCreateFunction(unsafe.Pointer(&nameStr), extractOrWrapRawPointer(handler, func() any { return NewV8Handler(handler) }))
1655- return wrapV8Value(ret)1802+ return takeV8Value(ret)
1656 }1803 }
1657 1804
1658 // V8ValueCreatePromise Create a new cef_v8_value_t object of type Promise. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.1805 // V8ValueCreatePromise Create a new cef_v8_value_t object of type Promise. This function should only be called from within the scope of a cef_render_process_handler_t, cef_v8_handler_t or cef_v8_accessor_t callback, or in combination with calling enter() and exit() on a stored cef_v8_context_t reference.
1659 func V8ValueCreatePromise() V8Value {1806 func V8ValueCreatePromise() V8Value {
1660 ret := capi.CEFV8ValueCreatePromise()1807 ret := capi.CEFV8ValueCreatePromise()
1661- return wrapV8Value(ret)1808+ return takeV8Value(ret)
1662 }1809 }
1663 1810
1664 // V8StackTraceGetCurrent Returns the stack trace for the currently active context. |frame_limit| is the maximum number of frames that will be captured.1811 // V8StackTraceGetCurrent Returns the stack trace for the currently active context. |frame_limit| is the maximum number of frames that will be captured.
1665 func V8StackTraceGetCurrent(frameLimit int32) V8StackTrace {1812 func V8StackTraceGetCurrent(frameLimit int32) V8StackTrace {
1666 ret := capi.CEFV8StackTraceGetCurrent(frameLimit)1813 ret := capi.CEFV8StackTraceGetCurrent(frameLimit)
1667- return wrapV8StackTrace(ret)1814+ return takeV8StackTrace(ret)
1668 }1815 }
1669 1816
1670 // RegisterExtension Register a new V8 extension with the specified JavaScript extension code and handler. Functions implemented by the handler are prototyped using the keyword 'native'. The calling of a native function is restricted to the scope in which the prototype of the native function is defined. This function may only be called on the render process main thread. Example JavaScript extension code: <pre> // create the 'example' global object if it doesn't already exist. if (!example) example = {}; // create the 'example.test' global object if it doesn't already exist. if (!example.test) example.test = {}; (function() { // Define the function 'example.test.myfunction'. example.test.myfunction = function() { // Call CefV8Handler::Execute() with the function name 'MyFunction' // and no arguments. native function MyFunction(); return MyFunction(); }; // Define the getter function for parameter 'example.test.myparam'. example.test.__defineGetter__('myparam', function() { // Call CefV8Handler::Execute() with the function name 'GetMyParam' // and no arguments. native function GetMyParam(); return GetMyParam(); }); // Define the setter function for parameter 'example.test.myparam'. example.test.__defineSetter__('myparam', function(b) { // Call CefV8Handler::Execute() with the function name 'SetMyParam' // and a single argument. native function SetMyParam(); if(b) SetMyParam(b); }); // Extension definitions can also contain normal JavaScript variables // and functions. var myint = 0; example.test.increment = function() { myint += 1; return myint; }; })(); </pre> Example usage in the page: <pre> // Call the function. example.test.myfunction(); // Set the parameter. example.test.myparam = value; // Get the parameter. value = example.test.myparam; // Call another function. example.test.increment(); </pre>1817 // RegisterExtension Register a new V8 extension with the specified JavaScript extension code and handler. Functions implemented by the handler are prototyped using the keyword 'native'. The calling of a native function is restricted to the scope in which the prototype of the native function is defined. This function may only be called on the render process main thread. Example JavaScript extension code: <pre> // create the 'example' global object if it doesn't already exist. if (!example) example = {}; // create the 'example.test' global object if it doesn't already exist. if (!example.test) example.test = {}; (function() { // Define the function 'example.test.myfunction'. example.test.myfunction = function() { // Call CefV8Handler::Execute() with the function name 'MyFunction' // and no arguments. native function MyFunction(); return MyFunction(); }; // Define the getter function for parameter 'example.test.myparam'. example.test.__defineGetter__('myparam', function() { // Call CefV8Handler::Execute() with the function name 'GetMyParam' // and no arguments. native function GetMyParam(); return GetMyParam(); }); // Define the setter function for parameter 'example.test.myparam'. example.test.__defineSetter__('myparam', function(b) { // Call CefV8Handler::Execute() with the function name 'SetMyParam' // and a single argument. native function SetMyParam(); if(b) SetMyParam(b); }); // Extension definitions can also contain normal JavaScript variables // and functions. var myint = 0; example.test.increment = function() { myint += 1; return myint; }; })(); </pre> Example usage in the page: <pre> // Call the function. example.test.myfunction(); // Set the parameter. example.test.myparam = value; // Get the parameter. value = example.test.myparam; // Call another function. example.test.increment(); </pre>
M vendor/github.com/bnema/purego-cef/cef/cef_values_gen.go +62 -7 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_waitable_event_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_xml_reader_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/cef_zip_reader_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/test_cef_api_version_test__gen.go +86 -871 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/test_cef_test_server_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/test_cef_translator_test__gen.go +92 -50 generated file: collapsed
A vendor/github.com/bnema/purego-cef/cef/v8_helpers.go +19 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_browser_view_gen.go +15 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_display_gen.go +17 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_label_button_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_menu_button_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_panel_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_scroll_view_gen.go +14 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_textfield_gen.go +14 -60 generated file: collapsed
M vendor/github.com/bnema/purego-cef/cef/views_cef_window_gen.go +14 -1 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/capi/cef_component_updater_gen.go +130 -0 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/capi/cef_types_component_gen.go +11 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/cef_types_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/cef_v8_gen.go +44 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/register_gen.go +2 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/test_cef_api_version_test__gen.go +0 -459 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/capi/views_cef_textfield_gen.go +33 -107 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/cefapi/contract.go +11 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/loader/loader.go +23 -18 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/ports/in/cef_component_updater_gen.go +24 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_media_router_gen.go +2 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_shared_memory_region_gen.go +1 -5 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_shared_process_message_builder_gen.go +1 -5 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/ports/in/cef_types_component_gen.go +9 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_v8_gen.go +8 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/cef_values_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/test_cef_api_version_test__gen.go +8 -63 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/test_cef_translator_test__gen.go +8 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/in/views_cef_textfield_gen.go +0 -7 generated file: collapsed
A vendor/github.com/bnema/purego-cef/internal/ports/out/cef_component_updater_gen.go +29 -0 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_parser_gen.go +3 -3 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_preference_gen.go +2 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_shared_process_message_builder_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_stream_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_v8_gen.go +11 -2 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/cef_values_gen.go +1 -1 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/test_cef_api_version_test__gen.go +4 -51 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/test_cef_translator_test__gen.go +4 -4 generated file: collapsed
M vendor/github.com/bnema/purego-cef/internal/ports/out/views_cef_textfield_gen.go +0 -7 generated file: collapsed
M vendor/modules.txt +2 -1 generated file: collapsed

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close