# Copyright (c) 2012-2014 The CEF Python authors. All rights reserved.
# License: New BSD License.
# Website: http://code.google.com/p/cefpython/
NAVTYPE_LINKCLICKED = cef_types.NAVTYPE_LINKCLICKED
NAVTYPE_FORMSUBMITTED = cef_types.NAVTYPE_FORMSUBMITTED
NAVTYPE_BACKFORWARD = cef_types.NAVTYPE_BACKFORWARD
NAVTYPE_RELOAD = cef_types.NAVTYPE_RELOAD
NAVTYPE_FORMRESUBMITTED = cef_types.NAVTYPE_FORMRESUBMITTED
NAVTYPE_OTHER = cef_types.NAVTYPE_OTHER
NAVTYPE_LINKDROPPED = cef_types.NAVTYPE_LINKDROPPED
cdef public cpp_bool RequestHandler_OnBeforeBrowse(
CefRefPtr[CefBrowser] cefBrowser,
CefRefPtr[CefFrame] cefFrame,
CefRefPtr[CefRequest] cefRequest,
cef_types.cef_handler_navtype_t navType,
cpp_bool isRedirect
) except * with gil:
cdef PyBrowser pyBrowser
cdef PyFrame pyFrame
cdef PyRequest pyRequest
cdef object callback
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyFrame = GetPyFrame(cefFrame)
pyRequest = CreatePyRequest(cefRequest)
callback = pyBrowser.GetClientCallback("OnBeforeBrowse")
if callback:
return bool(callback(
pyBrowser, pyFrame, pyRequest, navType, isRedirect))
else:
return False
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public cpp_bool RequestHandler_OnBeforeResourceLoad(
CefRefPtr[CefBrowser] cefBrowser,
CefRefPtr[CefRequest] cefRequest,
CefString& cefRedirectUrl,
CefRefPtr[CefStreamReader]& cefStreamReader,
CefRefPtr[CefResponse] cefResponse,
int loadFlags
) except * with gil:
cdef PyBrowser pyBrowser
cdef PyRequest pyRequest
cdef list pyRedirectUrl
cdef PyStreamReader pyStreamReader
cdef PyResponse pyResponse
cdef object callback
cdef py_bool ret
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyRequest = CreatePyRequest(cefRequest)
pyRedirectUrl = [""]
pyStreamReader = PyStreamReader()
pyResponse = CreatePyResponse(cefResponse)
callback = pyBrowser.GetClientCallback("OnBeforeResourceLoad")
if callback:
ret = callback(pyBrowser, pyRequest, pyRedirectUrl,
pyStreamReader, pyResponse, loadFlags)
assert type(pyRedirectUrl) == list
assert type(pyRedirectUrl[0]) == str
if pyRedirectUrl[0]:
PyToCefString(pyRedirectUrl[0], cefRedirectUrl)
if pyStreamReader.HasCefStreamReader():
cefStreamReader.swap(pyStreamReader.GetCefStreamReader())
return bool(ret)
else:
return False
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public void RequestHandler_OnResourceRedirect(
CefRefPtr[CefBrowser] cefBrowser,
CefString& cefOldUrl,
CefString& cefNewUrl
) except * with gil:
cdef PyBrowser pyBrowser
cdef str pyOldUrl
cdef list pyNewUrl # = [""] pass by reference (out).
cdef object callback
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyOldUrl = CefToPyString(cefOldUrl)
pyNewUrl = [CefToPyString(cefNewUrl)]
callback = pyBrowser.GetClientCallback("OnResourceRedirect")
if callback:
callback(pyBrowser, pyOldUrl, pyNewUrl)
if pyNewUrl[0]:
PyToCefString(pyNewUrl[0], cefNewUrl)
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public void RequestHandler_OnResourceResponse(
CefRefPtr[CefBrowser] cefBrowser,
CefString& cefUrl,
CefRefPtr[CefResponse] cefResponse,
CefRefPtr[CefContentFilter]& cefContentFilter
) except * with gil:
cdef PyBrowser pyBrowser
cdef str pyUrl
cdef PyResponse pyResponse
cdef PyContentFilter pyContentFilter
cdef object callback
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyUrl = CefToPyString(cefUrl)
pyResponse = CreatePyResponse(cefResponse)
pyContentFilter = PyContentFilter()
callback = pyBrowser.GetClientCallback("OnResourceResponse")
if callback:
callback(pyBrowser, pyUrl, pyResponse, pyContentFilter)
if pyContentFilter.HasHandler():
cefContentFilter.swap(pyContentFilter.GetCefContentFilter())
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public cpp_bool RequestHandler_OnProtocolExecution(
CefRefPtr[CefBrowser] cefBrowser,
CefString& cefUrl,
cpp_bool& cefAllowOSExecution
) except * with gil:
# TODO: needs testing.
cdef PyBrowser pyBrowser
cdef str pyUrl
cdef list pyAllowOSExecution # = [True] pass by reference (out).
cdef object callback
cdef py_bool ret
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyUrl = CefToPyString(cefUrl)
pyAllowOSExecution = [bool(cefAllowOSExecution)]
callback = pyBrowser.GetClientCallback("OnProtocolExecution")
if callback:
ret = callback(
pyBrowser, pyUrl, pyAllowOSExecution)
# Since Cython 0.17.4 assigning a value to an argument
# passed by reference will throw an error, the fix is to
# to use "(&arg)[0] =" instead of "arg =", see this topic:
# https://groups.google.com/forum/#!msg/cython-users/j58Sp3QMrD4/y9vJy9YBi_kJ
# For CefRefPtr you should use swap() method instead.
(&cefAllowOSExecution)[0] = bool(pyAllowOSExecution[0])
return bool(ret)
else:
return False
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public cpp_bool RequestHandler_GetDownloadHandler(
CefRefPtr[CefBrowser] cefBrowser,
const CefString& cefMimeType,
const CefString& cefFilename,
cef_types.int64 cefContentLength,
CefRefPtr[CefDownloadHandler]& cefDownloadHandler
) except * with gil:
cdef PyBrowser pyBrowser
cdef str pyMimeType
cdef str pyFilename
cdef long pyContentLength
cdef object callback
cdef object userDownloadHandler
cdef CefRefPtr[CefDownloadHandler] downloadHandler
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyMimeType = CefToPyString(cefMimeType)
pyFilename = CefToPyString(cefFilename)
pyContentLength = cefContentLength
callback = pyBrowser.GetClientCallback("GetDownloadHandler")
if callback:
userDownloadHandler = callback(pyBrowser, pyMimeType, pyFilename,
pyContentLength)
if userDownloadHandler:
downloadHandler = StoreUserDownloadHandler(userDownloadHandler)
cefDownloadHandler.swap(downloadHandler)
return True
else:
return False
else:
return False
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public cpp_bool RequestHandler_GetAuthCredentials(
CefRefPtr[CefBrowser] cefBrowser,
cpp_bool cefIsProxy,
CefString& cefHost,
int cefPort,
CefString& cefRealm,
CefString& cefScheme,
CefString& cefUsername,
CefString& cefPassword
) except * with gil:
cdef PyBrowser pyBrowser
cdef py_bool pyIsProxy
cdef str pyHost
cdef int pyPort
cdef str pyRealm
cdef str pyScheme
cdef list pyUsername # = [""] pass by reference (out).
cdef list pyPassword
cdef object callback
cdef py_bool ret
try:
pyBrowser = GetPyBrowser(cefBrowser)
pyIsProxy = bool(cefIsProxy)
pyHost = CefToPyString(cefHost)
pyPort = int(cefPort)
pyRealm = CefToPyString(cefRealm)
pyScheme = CefToPyString(cefScheme)
pyUsername = [""]
pyPassword = [""]
callback = pyBrowser.GetClientCallback("GetAuthCredentials")
if callback:
ret = callback(
pyBrowser,
pyIsProxy, pyHost, pyPort, pyRealm, pyScheme,
pyUsername, pyPassword)
if ret:
PyToCefString(pyUsername[0], cefUsername)
PyToCefString(pyPassword[0], cefPassword)
return bool(ret)
else:
# Default implementation.
IF UNAME_SYSNAME == "Windows":
ret = HttpAuthenticationDialog(
pyBrowser,
pyIsProxy, pyHost, pyPort, pyRealm, pyScheme,
pyUsername, pyPassword)
if ret:
PyToCefString(pyUsername[0], cefUsername)
PyToCefString(pyPassword[0], cefPassword)
return bool(ret)
ELSE:
return False
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public CefRefPtr[CefCookieManager] RequestHandler_GetCookieManager(
CefRefPtr[CefBrowser] cefBrowser,
CefString& mainUrl
) except * with gil:
cdef PyBrowser pyBrowser
cdef str pyMainUrl
cdef object callback
cdef PyCookieManager ret
try:
assert IsThread(TID_IO), "Must be called on the IO thread"
pyBrowser = GetPyBrowser(cefBrowser)
pyMainUrl = CefToPyString(mainUrl)
callback = pyBrowser.GetClientCallback("GetCookieManager")
if callback:
ret = callback(pyBrowser, pyMainUrl)
if ret:
if isinstance(ret, PyCookieManager):
return ret.cefCookieManager
else:
raise Exception("Expected CookieManager object")
return NULL
else:
return NULL
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)