X Tutup
Skip to content

Commit 6d65467

Browse files
committed
Implemented [RequestHandler].OnResourceResponse(), example added to cefadvanced.py
1 parent 750eece commit 6d65467

File tree

10 files changed

+166
-23
lines changed

10 files changed

+166
-23
lines changed

_code cleanup.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
- Get rid of mutable arguments:
2+
PyBrowser.__init__
3+
Initialize()
4+
5+
- Global variables should not use "__" prefix, as it is not
6+
allowed to use such variables from inside classes.
7+
Use g_ prefix or capitalize, so that "__applicationSettings"
8+
becomes "ApplicationSettings" or "g_applicationSettings".

_get rid of mutable arguments.txt

Lines changed: 0 additions & 2 deletions
This file was deleted.

cefexample/_changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Version 0.42 not yet released.
33
* en-US locale was outdated, came from revision `607`, locales/ directory contains all locales now, the default one is "en-US", others are optional and do not need to be distributed.
44
* !OnConsoleMessage example added to cefadvanced.py
55
* You can now get javascript stack trace, see: [cefpython].!GetJavascriptStackTrace() and [cefpython].!GetJavascriptStackTraceFormatted().
6+
* Implemented [RequestHandler].OnResourceResponse(), example added to cefadvanced.py
67

78
Version 0.41 released on 2012-09-14.
89
* New options in [ApplicationSettings]: auto_detect_proxy_settings_enabled, pack_loading_disabled.

cefexample/cefadvanced.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def CefAdvanced():
6262
handlers["OnLoadError"] = clientHandler.OnLoadError
6363
handlers["OnKeyEvent"] = (clientHandler.OnKeyEvent, None, clientHandler.OnKeyEvent)
6464
handlers["OnConsoleMessage"] = clientHandler.OnConsoleMessage
65+
handlers["OnResourceResponse"] = clientHandler.OnResourceResponse
6566

6667
cefBindings = cefpython.JavascriptBindings(bindToFrames=False, bindToPopups=False)
6768
browser = cefpython.CreateBrowser(windowID, browserSettings, "cefadvanced.html", handlers, cefBindings)
@@ -140,8 +141,8 @@ def HandleJavascriptError(errorMessage, url, lineNumber):
140141
url = re.sub(r"[/\\]+", re.escape(os.sep), url)
141142
url = re.sub(r"%s" % re.escape(cefpython.GetRealPath()), "", url, flags=re.IGNORECASE)
142143
url = re.sub(r"^%s" % re.escape(os.sep), "", url)
143-
stackTrace = cefpython.GetJavascriptStackTraceFormatted()
144-
raise Exception("%s\n in %s on line %s\n\n%s" % (errorMessage, url, lineNumber, stackTrace))
144+
# stackTrace = cefpython.GetJavascriptStackTraceFormatted() # Getting stack trace from window.onerror context doesn't work.
145+
raise Exception("%s\n in %s on line %s\n\n" % (errorMessage, url, lineNumber))
145146

146147
class Python:
147148

@@ -292,12 +293,17 @@ def OnConsoleMessage(self, browser, message, source, line):
292293
appdir = appdir[0].upper() + appdir[1:]
293294
source = source.replace("file:///", "")
294295
source = source.replace(appdir, "")
295-
#if (message.lower().find("error") != -1): # DOESN'T WORK, stack trace is empty in this context.
296+
#if (message.lower().find("error") != -1): # Doesn't work, stack trace is empty in this context.
296297
#stackTrace = cefpython.GetJavascriptStackTraceFormatted()
297298
#raise Exception("%s\n in %s on line %s\n\n%s" % (message, source, line, stackTrace))
298299
print("Console message: %s (%s:%s)\n" % (message, source, line));
299300
return False
300301

302+
def OnResourceResponse(self, browser, url, response, filter):
303+
304+
# This function does not get called for local disk sources (file:///).
305+
print("Resource: %s (status=%s)" % (url, response.GetStatus()))
306+
301307

302308
if __name__ == "__main__":
303309

cefexample/cefpython.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,3 +705,33 @@ def VisitDOM(visitor):
705705
return None
706706
"""
707707

708+
class Response:
709+
710+
def GetStatus(self):
711+
return 0
712+
713+
def SetStatus(self, status):
714+
return None
715+
716+
def GetStatusText(self):
717+
return ""
718+
719+
def SetStatusText(self, statusText):
720+
return None
721+
722+
def GetMimeType(self):
723+
return ""
724+
725+
def SetMimeType(self, mimeType):
726+
return None
727+
728+
def GetHeader(self, name):
729+
return ""
730+
731+
"""
732+
def GetHeaderMap(self):
733+
return [("","")]
734+
735+
def SetHeaderMap(self, headerMap):
736+
return None
737+
"""

cefpython.pyx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ include "v8utils.pyx"
4747
include "javascriptcallback.pyx"
4848
include "pythoncallback.pyx"
4949
include "requesthandler.pyx"
50+
include "response.pyx"
5051
include "displayhandler.pyx"
5152

5253
# Client handler.

pyinclude/cef_response.pxd

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,23 @@
33
# Website: http://code.google.com/p/cefpython/
44

55
from cef_base cimport CefBase
6+
from cef_string cimport CefString
7+
from libcpp.map cimport map
68

79
cdef extern from "include/cef_response.h":
10+
11+
# TODO: create .pxd for std::multimap
12+
# ctypedef multimap[CefString, CefString] HeaderMap
813

914
cdef cppclass CefResponse(CefBase):
10-
pass
15+
16+
int GetStatus()
17+
void SetStatus(int status)
18+
CefString GetStatusText()
19+
void SetStatusText(CefString& statusText)
20+
CefString GetMimeType()
21+
void SetMimeType(CefString& mimeType)
22+
CefString GetHeader(CefString& name)
23+
# virtual void GetHeaderMap(HeaderMap& headerMap) =0;
24+
# virtual void SetHeaderMap(const HeaderMap& headerMap) =0;
25+

requesthandler.pyx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ cdef public cbool RequestHandler_OnBeforeResourceLoad(
5858
pyRequest = GetPyRequestByCefRequest(cefRequest)
5959
pyRedirectURL = [""]
6060
pyResourceStream = GetPyStreamReaderByCefStreamReader(cefResourceStream)
61-
pyResponse = GetPyResponseByCefResponse(cefResponse)
61+
pyResponse = None
6262

6363
handler = pyBrowser.GetClientHandler("OnBeforeResourceLoad")
6464
if handler:
@@ -102,13 +102,10 @@ cdef public void RequestHandler_OnResourceResponse(
102102
CefRefPtr[CefResponse] cefResponse,
103103
CefRefPtr[CefContentFilter]& cefFilter) except * with gil:
104104

105-
# TODO: not yet implemented.
106-
return
107-
108105
try:
109106
pyBrowser = GetPyBrowserByCefBrowser(cefBrowser)
110107
pyURL = CefStringToPyString(cefURL)
111-
pyResponse = GetPyResponseByCefResponse(cefResponse)
108+
pyResponse = CreatePyResponse(cefResponse)
112109
pyFilter = None # TODO.
113110

114111
handler = pyBrowser.GetClientHandler("OnResourceResponse")

response.pyx

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# Copyright (c) 2012 CefPython Authors. All rights reserved.
2+
# License: New BSD License.
3+
# Website: http://code.google.com/p/cefpython/
4+
5+
include "imports.pyx"
6+
7+
cdef object CreatePyResponse(CefRefPtr[CefResponse] cefResponse):
8+
9+
pyResponse = PyResponse()
10+
pyResponse.cefResponse = cefResponse
11+
return pyResponse
12+
13+
cdef class PyResponse:
14+
15+
cdef CefRefPtr[CefResponse] cefResponse
16+
17+
def CheckCefResponse(self):
18+
19+
if <void*>self.cefResponse != NULL and <CefResponse*>(self.cefResponse.get()):
20+
return True
21+
else:
22+
raise Exception("CefResponse was destroyed, you cannot use this object anymore")
23+
24+
def GetStatus(self):
25+
26+
self.CheckCefResponse()
27+
return (<CefResponse*>(self.cefResponse.get())).GetStatus()
28+
29+
def SetStatus(self, status):
30+
31+
self.CheckCefResponse()
32+
assert type(status) == int, "Response.SetStatus() failed: status param is not an int"
33+
(<CefResponse*>(self.cefResponse.get())).SetStatus(int(status))
34+
35+
def GetStatusText(self):
36+
37+
self.CheckCefResponse()
38+
return CefStringToPyString((<CefResponse*>(self.cefResponse.get())).GetStatusText())
39+
40+
def SetStatusText(self, statusText):
41+
42+
self.CheckCefResponse()
43+
assert type(statusText) in (str, unicode, bytes), "Response.SetStatusText() failed: statusText param is not a string"
44+
cdef CefString cefStatusText
45+
PyStringToCefString(statusText, cefStatusText)
46+
(<CefResponse*>(self.cefResponse.get())).SetStatusText(cefStatusText)
47+
48+
def GetMimeType(self):
49+
50+
self.CheckCefResponse()
51+
return CefStringToPyString((<CefResponse*>(self.cefResponse.get())).GetMimeType())
52+
53+
def SetMimeType(self, mimeType):
54+
55+
self.CheckCefResponse()
56+
assert type(mimeType) in (str, unicode, bytes), "Response.SetMimeType() failed: mimeType param is not a string"
57+
cdef CefString cefMimeType
58+
PyStringToCefString(mimeType, cefMimeType)
59+
(<CefResponse*>(self.cefResponse.get())).SetMimeType(cefMimeType)
60+
61+
def GetHeader(self, name):
62+
63+
# TODO: what is returned when you try to get a non-existent header?
64+
self.CheckCefResponse()
65+
assert type(name) in (str, unicode, bytes), "Response.GetHeader() failed: name param is not a string"
66+
cdef CefString cefName
67+
PyStringToCefString(name, cefName)
68+
return CefStringToPyString((<CefResponse*>(self.cefResponse.get())).GetHeader(cefName))
69+
70+
"""
71+
def GetHeaderMap(self):
72+
73+
pass # TODO.
74+
75+
def SetHeaderMap(self, headerMap):
76+
77+
pass # TODO.
78+
"""

utils.pyx

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,6 @@ cdef object GetPyStreamReaderByCefStreamReader(CefRefPtr[CefStreamReader] cefStr
116116
# TODO: not yet implemented.
117117
return None
118118

119-
cdef object GetPyResponseByCefResponse(CefRefPtr[CefResponse] cefResponse):
120-
121-
# TODO: not yet implemented.
122-
return None
123-
124119
cdef object GetPyContentFilterByCefContentFilter(CefRefPtr[CefContentFilter] cefContentFilter):
125120

126121
# TODO: not yet implemented.
@@ -255,18 +250,32 @@ cdef object CefStringToPyString(CefString& cefString):
255250

256251
cdef void PyStringToCefString(pyString, CefString& cefString) except *:
257252

258-
if bytes == str:
253+
if bytes == str:
254+
# Python 2.7
255+
if pyString == unicode:
256+
pyString = pyString.encode(__applicationSettings["unicode_to_bytes_encoding"])
259257
cefString.FromASCII(<char*>pyString) # Python 2.7
260-
else:
261-
# In python 3 bytes and str are different types.
262-
bytesString = pyString.encode("utf-8") # Python 3 requires bytes before converting to char*
258+
else:
259+
# Python 3
260+
# Python 3 requires bytes before converting to char*
261+
if pyString == bytes:
262+
bytesString = pyString
263+
else:
264+
bytesString = pyString.encode("utf-8")
263265
cefString.FromASCII(<char*>bytesString)
264266

265267
cdef void PyStringToCefStringPtr(pyString, CefString* cefString) except *:
266268

267269
if bytes == str:
268-
cefString.FromASCII(<char*>pyString) # Python 2.7
270+
# Python 2.7
271+
if pyString == unicode:
272+
pyString = pyString.encode(__applicationSettings["unicode_to_bytes_encoding"])
273+
cefString.FromASCII(<char*>pyString)
269274
else:
270-
# In python 3 bytes and str are different types.
271-
bytesString = pyString.encode("utf-8") # Python 3 requires bytes before converting to char*
275+
# Python 3
276+
# Python 3 requires bytes before converting to char*
277+
if pyString == bytes:
278+
bytesString = pyString
279+
else:
280+
bytesString = pyString.encode("utf-8")
272281
cefString.FromASCII(<char*>bytesString)

0 commit comments

Comments
 (0)
X Tutup