Skip to content

Commit 999f007

Browse files
CzarekCzarek
authored andcommitted
Fixed JavascriptBindings.Rebind(). Also from now on there is
a check whether the v8 context has been created when setting javascript bindings through Browser.SetJavascriptBindings(), if the context was already created (a possible race condition during browser creation) then the Rebind() method will be called automatically.
1 parent 0183a91 commit 999f007

File tree

6 files changed

+58
-54
lines changed

6 files changed

+58
-54
lines changed

cefpython/browser.pyx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,10 @@ cdef class PyBrowser:
214214

215215
cpdef py_void SetJavascriptBindings(self, JavascriptBindings bindings):
216216
self.javascriptBindings = bindings
217+
if self.GetUserData("__v8ContextCreated"):
218+
Debug("Browser.SetJavascriptBindings(): v8 context already"
219+
"created, calling Rebind()")
220+
self.javascriptBindings.Rebind()
217221

218222
cpdef JavascriptBindings GetJavascriptBindings(self):
219223
return self.javascriptBindings

cefpython/cefpython.pyx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646
# - Supporting operators that are not yet supported:
4747
# | CefRefPtr[T]& Assign "operator="(T* p)
4848
# | cefBrowser.Assign(CefBrowser*)
49+
# In the same way you can import function with a different name, this one
50+
# imports a static method Create() while adding a prefix "CefProcessMessage_":
51+
# | cdef extern from ".." namespace "CefProcessMessage":
52+
# | static CefRefPtr[CefProcessMessage] CefProcessMessage_Create(..) "Create()"(..)
4953
#
5054
# - Declaring C++ classes in Cython. Storing python callbacks
5155
# in a C++ class using Py_INCREF, Py_DECREF. Calling from
@@ -132,9 +136,9 @@ IF CEF_VERSION == 1:
132136
include "download_handler.pyx"
133137

134138
IF CEF_VERSION == 1:
135-
include "v8context_handler.pyx"
136-
include "v8function_handler.pyx"
137-
include "v8utils.pyx"
139+
include "v8context_handler_cef1.pyx"
140+
include "v8function_handler_cef1.pyx"
141+
include "v8utils_cef1.pyx"
138142
include "javascript_bindings.pyx"
139143
include "javascript_callback.pyx"
140144
include "python_callback.pyx"

cefpython/javascript_bindings.pyx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ cdef class JavascriptBindings:
9797
cdef PyBrowser pyBrowser
9898
cdef PyFrame pyFrame
9999

100-
for frameId in self.__frames:
100+
for frameId in self.frames:
101101
pyBrowser = self.frames[frameId][0]
102102
pyFrame = self.frames[frameId][1]
103103
cefBrowser = pyBrowser.GetCefBrowser()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ cdef public void V8ContextHandler_OnContextCreated(
4242

4343
try:
4444
pyBrowser = GetPyBrowser(cefBrowser)
45+
pyBrowser.SetUserData("__v8ContextCreated", True)
4546
pyFrame = GetPyFrame(cefFrame)
4647

4748
javascriptBindings = pyBrowser.GetJavascriptBindings()
Lines changed: 45 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,57 +2,52 @@
22
# License: New BSD License.
33
# Website: http://code.google.com/p/cefpython/
44

5-
# CefV8 Objects, Arrays and Functions can be created only inside V8 context,
6-
# you need to call CefV8Context::Enter() and CefV8Context::Exit():
5+
# CefV8 Objects, Arrays and Functions can be created or modified only
6+
# inside V8 context, you need to call CefV8Context::Enter() and
7+
# CefV8Context::Exit(), see:
78
# http://code.google.com/p/chromiumembedded/issues/detail?id=203
8-
# Entering context should be done for Frame::CallFunction().
9-
10-
# Arrays, objects and functions may only be created, modified and,
11-
# in the case of functions, executed, if V8 is inside a context.
12-
13-
IF CEF_VERSION == 1:
14-
15-
cdef list CefV8StackTraceToPython(CefRefPtr[CefV8StackTrace] cefTrace):
16-
cdef int frameNumber
17-
cdef int frameCount = cefTrace.get().GetFrameCount()
18-
cdef CefRefPtr[CefV8StackFrame] cefFrame
19-
cdef CefV8StackFrame* framePtr
20-
cdef list pyTrace = []
21-
22-
for frameNumber in range(0, frameCount):
23-
cefFrame = cefTrace.get().GetFrame(frameNumber)
24-
framePtr = cefFrame.get()
25-
pyFrame = {}
26-
pyFrame["script"] = CefToPyString(framePtr.GetScriptName())
27-
pyFrame["scriptOrSourceUrl"] = CefToPyString(
28-
framePtr.GetScriptNameOrSourceURL())
29-
pyFrame["function"] = CefToPyString(framePtr.GetFunctionName())
30-
pyFrame["line"] = framePtr.GetLineNumber()
31-
pyFrame["column"] = framePtr.GetColumn()
32-
pyFrame["isEval"] = framePtr.IsEval()
33-
pyFrame["isConstructor"] = framePtr.IsConstructor()
34-
pyTrace.append(pyFrame)
35-
36-
return pyTrace
37-
38-
cpdef list GetJavascriptStackTrace(int frameLimit=100):
39-
assert IsThread(TID_UI), (
40-
"cefpython.GetJavascriptStackTrace() may only be called on the UI thread")
41-
cdef CefRefPtr[CefV8StackTrace] cefTrace = (
42-
cef_v8_stack_trace.GetCurrent(frameLimit))
43-
return CefV8StackTraceToPython(cefTrace)
44-
45-
cpdef str FormatJavascriptStackTrace(list stackTrace):
46-
cdef str formatted = ""
47-
cdef dict frame
48-
for frameNumber, frame in enumerate(stackTrace):
49-
formatted += "\t[%s] %s() in %s on line %s (col:%s)\n" % (
50-
frameNumber,
51-
frame["function"],
52-
frame["scriptOrSourceUrl"],
53-
frame["line"],
54-
frame["column"])
55-
return formatted
9+
10+
cdef list CefV8StackTraceToPython(CefRefPtr[CefV8StackTrace] cefTrace):
11+
cdef int frameNumber
12+
cdef int frameCount = cefTrace.get().GetFrameCount()
13+
cdef CefRefPtr[CefV8StackFrame] cefFrame
14+
cdef CefV8StackFrame* framePtr
15+
cdef list pyTrace = []
16+
17+
for frameNumber in range(0, frameCount):
18+
cefFrame = cefTrace.get().GetFrame(frameNumber)
19+
framePtr = cefFrame.get()
20+
pyFrame = {}
21+
pyFrame["script"] = CefToPyString(framePtr.GetScriptName())
22+
pyFrame["scriptOrSourceUrl"] = CefToPyString(
23+
framePtr.GetScriptNameOrSourceURL())
24+
pyFrame["function"] = CefToPyString(framePtr.GetFunctionName())
25+
pyFrame["line"] = framePtr.GetLineNumber()
26+
pyFrame["column"] = framePtr.GetColumn()
27+
pyFrame["isEval"] = framePtr.IsEval()
28+
pyFrame["isConstructor"] = framePtr.IsConstructor()
29+
pyTrace.append(pyFrame)
30+
31+
return pyTrace
32+
33+
cpdef list GetJavascriptStackTrace(int frameLimit=100):
34+
assert IsThread(TID_UI), (
35+
"cefpython.GetJavascriptStackTrace() may only be called on the UI thread")
36+
cdef CefRefPtr[CefV8StackTrace] cefTrace = (
37+
cef_v8_stack_trace.GetCurrent(frameLimit))
38+
return CefV8StackTraceToPython(cefTrace)
39+
40+
cpdef str FormatJavascriptStackTrace(list stackTrace):
41+
cdef str formatted = ""
42+
cdef dict frame
43+
for frameNumber, frame in enumerate(stackTrace):
44+
formatted += "\t[%s] %s() in %s on line %s (col:%s)\n" % (
45+
frameNumber,
46+
frame["function"],
47+
frame["scriptOrSourceUrl"],
48+
frame["line"],
49+
frame["column"])
50+
return formatted
5651

5752
cdef object V8ToPyValue(
5853
CefRefPtr[CefV8Value] v8Value,

0 commit comments

Comments
 (0)