# Copyright (c) 2012-2014 The CEF Python authors. All rights reserved.
# License: New BSD License.
# Website: http://code.google.com/p/cefpython/
V8_PROPERTY_ATTRIBUTE_NONE = cef_types.V8_PROPERTY_ATTRIBUTE_NONE
V8_PROPERTY_ATTRIBUTE_READONLY = cef_types.V8_PROPERTY_ATTRIBUTE_READONLY
V8_PROPERTY_ATTRIBUTE_DONTENUM = cef_types.V8_PROPERTY_ATTRIBUTE_DONTENUM
V8_PROPERTY_ATTRIBUTE_DONTDELETE = cef_types.V8_PROPERTY_ATTRIBUTE_DONTDELETE
cdef public void V8ContextHandler_OnContextCreated(
CefRefPtr[CefBrowser] cefBrowser,
CefRefPtr[CefFrame] cefFrame,
CefRefPtr[CefV8Context] cefContext
) except * with gil:
# This handler may also be called by JavascriptBindings.Rebind().
# This handler may be called multiple times for the same frame - rebinding.
cdef PyBrowser pyBrowser
cdef PyFrame pyFrame
cdef JavascriptBindings javascriptBindings
cdef dict javascriptFunctions
cdef dict javascriptProperties
cdef dict javascriptObjects
cdef CefRefPtr[V8FunctionHandler] functionHandler
cdef CefRefPtr[CefV8Handler] v8Handler
cdef CefRefPtr[CefV8Value] v8Window
cdef CefRefPtr[CefV8Value] v8Function
cdef CefRefPtr[CefV8Value] v8Object
cdef CefRefPtr[CefV8Value] v8Method
cdef CefString cefFunctionName
cdef CefString cefPropertyName
cdef CefString cefMethodName
cdef CefString cefObjectName
cdef object key
cdef object value
cdef py_string functionName
cdef py_string objectName
cdef object clientCallback
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyBrowser.SetUserData("__v8ContextCreated", True)
pyFrame = GetPyFrame(cefFrame)
javascriptBindings = pyBrowser.GetJavascriptBindings()
if not javascriptBindings:
return
javascriptFunctions = javascriptBindings.GetFunctions()
javascriptProperties = javascriptBindings.GetProperties()
javascriptObjects = javascriptBindings.GetObjects()
if not javascriptFunctions and not javascriptProperties and not javascriptObjects:
return
# This checks GetBindToFrames/GetBindToPopups must also be made in both:
# FunctionHandler_Execute() and OnContextCreated(), so that calling
# a non-existent property on window object throws an error.
if not pyFrame.IsMain() and not javascriptBindings.GetBindToFrames():
return
# This check is probably not needed, as GetPyBrowser() will already pass bindings=None,
# if this is a popup window and bindToPopups is False.
if pyBrowser.IsPopup() and not javascriptBindings.GetBindToPopups():
return
v8Window = cefContext.get().GetGlobal()
if javascriptProperties:
for key,value in javascriptProperties.items():
key = str(key)
PyToCefString(key, cefPropertyName)
v8Window.get().SetValue(
cefPropertyName,
PyToV8Value(value, cefContext),
V8_PROPERTY_ATTRIBUTE_NONE)
if javascriptFunctions or javascriptObjects:
functionHandler = new V8FunctionHandler()
functionHandler.get().SetContext(cefContext)
v8Handler = functionHandler.get()
if javascriptFunctions:
for functionName in javascriptFunctions:
functionName = str(functionName)
PyToCefString(functionName, cefFunctionName)
v8Function = cef_v8_static.CreateFunction(cefFunctionName, v8Handler)
v8Window.get().SetValue(cefFunctionName, v8Function, V8_PROPERTY_ATTRIBUTE_NONE)
if javascriptObjects:
for objectName in javascriptObjects:
v8Object = cef_v8_static.CreateObject(NULL)
PyToCefString(objectName, cefObjectName)
v8Window.get().SetValue(
cefObjectName, v8Object, V8_PROPERTY_ATTRIBUTE_NONE)
for methodName in javascriptObjects[objectName]:
methodName = str(methodName)
# cefMethodName = "myobject.someMethod"
PyToCefString(objectName+"."+methodName, cefMethodName)
v8Method = cef_v8_static.CreateFunction(cefMethodName, v8Handler)
# cefMethodName = "someMethod"
PyToCefString(methodName, cefMethodName)
v8Object.get().SetValue(
cefMethodName, v8Method, V8_PROPERTY_ATTRIBUTE_NONE)
# User defined callback.
clientCallback = pyBrowser.GetClientCallback("OnContextCreated")
if clientCallback:
clientCallback(pyBrowser, pyFrame)
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public void V8ContextHandler_OnContextReleased(
CefRefPtr[CefBrowser] cefBrowser,
CefRefPtr[CefFrame] cefFrame,
CefRefPtr[CefV8Context] cefContext
) except * with gil:
cdef PyBrowser pyBrowser
cdef PyFrame pyFrame
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyFrame = GetPyFrame(cefFrame)
# User defined callback.
clientCallback = pyBrowser.GetClientCallback("OnContextReleased")
if clientCallback:
clientCallback(pyBrowser, pyFrame)
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public void V8ContextHandler_OnUncaughtException(
CefRefPtr[CefBrowser] cefBrowser,
CefRefPtr[CefFrame] cefFrame,
CefRefPtr[CefV8Context] cefContext,
CefRefPtr[CefV8Exception] cefException,
CefRefPtr[CefV8StackTrace] cefStackTrace
) except * with gil:
cdef PyBrowser pyBrowser
cdef PyFrame pyFrame
cdef CefRefPtr[CefV8Exception] v8Exception
cdef CefV8Exception* v8ExceptionPointer
cdef object callback
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyFrame = GetPyFrame(cefFrame)
v8ExceptionPointer = cefException.get()
pyException = {}
pyException["lineNumber"] = v8ExceptionPointer.GetLineNumber()
pyException["message"] = CefToPyString(v8ExceptionPointer.GetMessage())
pyException["scriptResourceName"] = CefToPyString(
v8ExceptionPointer.GetScriptResourceName())
pyException["sourceLine"] = CefToPyString(v8ExceptionPointer.GetSourceLine())
pyStackTrace = CefV8StackTraceToPython(cefStackTrace)
callback = pyBrowser.GetClientCallback("OnUncaughtException")
if callback:
callback(pyBrowser, pyFrame, pyException, pyStackTrace)
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)