@@ -7,6 +7,10 @@ include "browser.pyx"
77
88cdef dict g_pyFrames = {}
99
10+ # If a frame was unreferenced (browser closed or OnContextReleased)
11+ # it shouldn't be kept global anymore.
12+ cdef list g_unreferenced_frames = [] # [str unique identifier, ..]
13+
1014cdef object GetUniqueFrameId(int browserId, object frameId):
1115 return str (browserId) + " #" + str (frameId)
1216
@@ -24,6 +28,11 @@ cdef PyFrame GetPyFrame(CefRefPtr[CefFrame] cefFrame):
2428
2529 cdef PyFrame pyFrame
2630 cdef object frameId = cefFrame.get().GetIdentifier() # int64
31+ if frameId < 0 :
32+ # Underlying frame does not yet exist.
33+ Debug(" GetPyFrame(): underlying frame does not yet exist"
34+ " , frameId = {0}" .format(frameId))
35+ return None
2736 cdef int browserId = cefFrame.get().GetBrowser().get().GetIdentifier()
2837 assert (frameId and browserId), " frameId or browserId empty"
2938 cdef object uniqueFrameId = GetUniqueFrameId(browserId, frameId)
@@ -46,9 +55,12 @@ cdef PyFrame GetPyFrame(CefRefPtr[CefFrame] cefFrame):
4655 pyFrame = PyFrame(browserId, frameId)
4756 pyFrame.cefFrame = cefFrame
4857
49- if browserId in g_unreferenced_browsers:
58+ if uniqueFrameId in g_unreferenced_frames \
59+ or browserId in g_unreferenced_browsers \
60+ or browserId in g_closed_browsers:
5061 # Browser was already globally unreferenced in OnBeforeClose,
51- # thus all frames are globally unreferenced too. Create a new
62+ # thus all frames are globally unreferenced too, or frame
63+ # was unreferenced in OnContextReleased. Create a new
5264 # incomplete instance of PyFrame object. Read comments in
5365 # browser.pyx > GetPyBrowser and in Browser.md for what
5466 # "incomplete" means.
@@ -60,17 +72,22 @@ cdef PyFrame GetPyFrame(CefRefPtr[CefFrame] cefFrame):
6072 # SIDE EFFECT: two calls to GetPyFrame for the same frame object
6173 # may return two different PyFrame objects. Compare
6274 # frame objects always using GetIdentifier().
63- # Debug("GetPyFrame(): create new PyFrame, frameId=%s" % frameId)
75+ Debug(" GetPyFrame(): create new PyFrame, frameId=%s " % frameId)
6476 g_pyFrames[uniqueFrameId] = pyFrame
6577 return pyFrame
6678
6779cdef void RemovePyFrame(int browserId, object frameId) except * :
6880 # Called from V8ContextHandler_OnContextReleased().
6981 global g_pyFrames
82+ cdef PyFrame pyFrame
7083 cdef object uniqueFrameId = GetUniqueFrameId(browserId, frameId)
7184 if uniqueFrameId in g_pyFrames:
7285 Debug(" del g_pyFrames[%s ]" % uniqueFrameId)
86+ pyFrame = g_pyFrames[uniqueFrameId]
87+ pyFrame.cefFrame.Assign(NULL )
88+ del pyFrame
7389 del g_pyFrames[uniqueFrameId]
90+ g_unreferenced_frames.append(uniqueFrameId)
7491 else :
7592 Debug(" RemovePyFrame() FAILED: uniqueFrameId = %s " % uniqueFrameId)
7693
@@ -85,7 +102,11 @@ cdef void RemovePyFramesForBrowser(int browserId) except *:
85102 toRemove.append(uniqueFrameId)
86103 for uniqueFrameId in toRemove:
87104 Debug(" del g_pyFrames[%s ]" % uniqueFrameId)
105+ pyFrame = g_pyFrames[uniqueFrameId]
106+ pyFrame.cefFrame.Assign(NULL )
107+ del pyFrame
88108 del g_pyFrames[uniqueFrameId]
109+ g_unreferenced_frames.append(uniqueFrameId)
89110
90111cdef class PyFrame:
91112 cdef CefRefPtr[CefFrame] cefFrame
0 commit comments