Skip to content

Commit adb0e9a

Browse files
committed
Initial CEF 3 support, it's very limited as of the moment,
no javascript bindings, no client handlers, no developer tools. Minor code cleanup.
1 parent fd7fc4a commit adb0e9a

57 files changed

Lines changed: 3147 additions & 776 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cefpython/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
/.idea/
88
debug.log
99
error.log
10+
console.log
1011

1112
# WingIDE project files
1213
/wingide.wpr

cefpython/browser.pyx

Lines changed: 128 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,15 @@ m.cefBrowser = g_cefBrowsers[1]
3838
3939
'''
4040

41-
# PyBrowser.
41+
IF CEF_VERSION == 3:
42+
43+
cdef CefRefPtr[CefBrowserHost] GetCefBrowserHost(CefRefPtr[CefBrowser] cefBrowser):
44+
45+
cdef CefRefPtr[CefBrowserHost] cefBrowserHost = cefBrowser.get().GetHost()
46+
if <void*>cefBrowserHost != NULL and cefBrowserHost.get():
47+
return cefBrowserHost
48+
raise Exception("GetCefBrowserHostPtr() failed: this method of Browser object "
49+
"can only be called in the browser process.")
4250

4351
class PyBrowser:
4452

@@ -85,15 +93,18 @@ class PyBrowser:
8593
self.__checkClientHandlers(clientHandlers)
8694
self.__clientHandlers = clientHandlers
8795

88-
self.__checkJavascriptBindings(javascriptBindings)
89-
self.__javascriptBindings = javascriptBindings
96+
IF CEF_VERSION == 1:
97+
self.__checkJavascriptBindings(javascriptBindings)
98+
self.__javascriptBindings = javascriptBindings
99+
100+
IF CEF_VERSION == 1:
90101

91-
def __checkJavascriptBindings(self, bindings):
102+
def __checkJavascriptBindings(self, bindings):
92103

93-
if not bindings:
94-
return
95-
if not isinstance(bindings, JavascriptBindings):
96-
raise Exception("Creating PyBrowser() failed: javascriptBindings is not a JavascriptBindings class.")
104+
if not bindings:
105+
return
106+
if not isinstance(bindings, JavascriptBindings):
107+
raise Exception("Creating PyBrowser() failed: javascriptBindings is not a JavascriptBindings class.")
97108

98109
def __checkClientHandlers(self, handlers):
99110

@@ -151,32 +162,24 @@ class PyBrowser:
151162
# PUBLIC API.
152163
# --------------
153164

154-
def GetUserData(self, key):
155-
156-
if key in self.__userData:
157-
return self.__userData[key]
158-
return None
159-
160-
def SetUserData(self, key, value):
161-
162-
self.__userData[key] = value
163-
164165
def CanGoBack(self):
165166

166167
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
167-
cdef c_bool canGoBack = (<CefBrowser*>(cefBrowser.get())).CanGoBack()
168+
cdef c_bool canGoBack = cefBrowser.get().CanGoBack()
168169
return canGoBack
169170

170171
def CanGoForward(self):
171172

172173
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
173-
cdef c_bool canGoForward = (<CefBrowser*>(cefBrowser.get())).CanGoForward()
174+
cdef c_bool canGoForward = cefBrowser.get().CanGoForward()
174175
return canGoForward
175176

176-
def ClearHistory(self):
177+
IF CEF_VERSION == 1:
177178

178-
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
179-
(<CefBrowser*>(cefBrowser.get())).ClearHistory()
179+
def ClearHistory(self):
180+
181+
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
182+
cefBrowser.get().ClearHistory()
180183

181184
def CloseBrowser(self):
182185

@@ -199,33 +202,52 @@ class PyBrowser:
199202
self.__topWindowID = 0
200203
self.__innerWindowID = 0
201204

202-
# You do not need to call both, call ParentWindowWillClose for the main application window,
203-
# and CloseBrowser() for popup windows created by CEF. In cefclient/cefclient_win.cpp there
204-
# is only ParentWindowWillClose() called. CloseBrowser() is called only for popups.
205-
206-
(<CefBrowser*>(cefBrowser.get())).ParentWindowWillClose() # only for main window that was created explicitily
207-
# (<CefBrowser*>(cefBrowser.get())).CloseBrowser() # call this only for popups.
208-
209-
def CloseDevTools(self):
205+
# You do not need to call both ParentWindowWillClose & CloseBrowser,
206+
# call ParentWindowWillClose for the main application window,
207+
# and CloseBrowser() for popup windows created by CEF.
210208

211-
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
212-
(<CefBrowser*>(cefBrowser.get())).CloseDevTools()
209+
# In cefclient/cefclient_win.cpp there is only ParentWindowWillClose() called.
210+
# CloseBrowser() is called only for popups.
211+
212+
# Only for main window that was created explicitily:
213+
IF CEF_VERSION == 1:
214+
Debug("CefBrowser.ParentWindowWillClose()")
215+
cefBrowser.get().ParentWindowWillClose()
216+
ELIF CEF_VERSION == 3:
217+
Debug("CefBrowserHost.ParentWindowWillClose()")
218+
GetCefBrowserHost(cefBrowser).get().ParentWindowWillClose()
219+
220+
# Call this only for popups.
221+
if cefBrowser.get().IsPopup():
222+
IF CEF_VERSION == 1:
223+
Debug("CefBrowser.CloseBrowser()")
224+
cefBrowser.get().CloseBrowser()
225+
ELIF CEF_VERSION == 3:
226+
Debug("CefBrowserHost.CloseBrowser()")
227+
GetCefBrowserHost(cefBrowser).get().CloseBrowser()
228+
229+
IF CEF_VERSION == 1:
230+
231+
def CloseDevTools(self):
232+
233+
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
234+
cefBrowser.get().CloseDevTools()
213235

214-
def Find(self, searchID, searchText, forward, matchCase, findNext):
236+
def Find(self, searchID, searchText, forward, matchCase, findNext):
215237

216-
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
238+
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
217239

218-
cdef CefString cefSearchText
219-
PyStringToCefString(searchText, cefSearchText)
240+
cdef CefString cefSearchText
241+
PyStringToCefString(searchText, cefSearchText)
220242

221-
(<CefBrowser*>(cefBrowser.get())).Find(
222-
<int>searchID, cefSearchText, <c_bool>bool(forward), <c_bool>bool(matchCase), <c_bool>bool(findNext))
243+
cefBrowser.get().Find(
244+
<int>searchID, cefSearchText, bool(forward), bool(matchCase), bool(findNext))
223245

224246
def GetFocusedFrame(self):
225247

226248
assert IsCurrentThread(TID_UI), "Browser.GetFocusedFrame() may only be called on the UI thread"
227249
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
228-
cdef CefRefPtr[CefFrame] cefFrame = (<CefBrowser*>(cefBrowser.get())).GetFocusedFrame()
250+
cdef CefRefPtr[CefFrame] cefFrame = cefBrowser.get().GetFocusedFrame()
229251

230252
return GetPyFrameByCefFrame(cefFrame)
231253

@@ -236,7 +258,7 @@ class PyBrowser:
236258

237259
cdef CefString cefName
238260
PyStringToCefString(name, cefName)
239-
cdef CefRefPtr[CefFrame] cefFrame = (<CefBrowser*>(cefBrowser.get())).GetFrame(cefName)
261+
cdef CefRefPtr[CefFrame] cefFrame = cefBrowser.get().GetFrame(cefName)
240262

241263
return GetPyFrameByCefFrame(cefFrame) # may return None.
242264

@@ -246,7 +268,7 @@ class PyBrowser:
246268
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
247269

248270
cdef c_vector[CefString] cefNames
249-
(<CefBrowser*>(cefBrowser.get())).GetFrameNames(cefNames)
271+
cefBrowser.get().GetFrameNames(cefNames)
250272

251273
names = []
252274
cdef c_vector[CefString].iterator iterator = cefNames.begin()
@@ -261,14 +283,20 @@ class PyBrowser:
261283
def GetMainFrame(self):
262284

263285
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
264-
cdef CefRefPtr[CefFrame] cefFrame = (<CefBrowser*>(cefBrowser.get())).GetMainFrame()
286+
cdef CefRefPtr[CefFrame] cefFrame = cefBrowser.get().GetMainFrame()
265287

266288
return GetPyFrameByCefFrame(cefFrame)
267289

268290
def GetOpenerWindowID(self):
269291

270292
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
271-
cdef HWND hwnd = (<CefBrowser*>(cefBrowser.get())).GetOpenerWindowHandle()
293+
cdef HWND hwnd
294+
295+
IF CEF_VERSION == 1:
296+
hwnd = cefBrowser.get().GetOpenerWindowHandle()
297+
ELIF CEF_VERSION == 3:
298+
hwnd = GetCefBrowserHost(cefBrowser).get().GetOpenerWindowHandle()
299+
272300
openerID = <int>hwnd
273301

274302
if openerID:
@@ -277,6 +305,12 @@ class PyBrowser:
277305

278306
return None
279307

308+
def GetUserData(self, key):
309+
310+
if key in self.__userData:
311+
return self.__userData[key]
312+
return None
313+
280314
def GetWindowID(self):
281315

282316
# TODO: This function may be removed or modified in the future as its acting is confusing at the moment.
@@ -300,30 +334,37 @@ class PyBrowser:
300334

301335
def GetZoomLevel(self):
302336

303-
assert IsCurrentThread(TID_UI), "Browser.GetZoomLevel() may only be called on the UI thread"
337+
IF CEF_VERSION == 1:
338+
assert IsCurrentThread(TID_UI), "Browser.GetZoomLevel() may only be called on the UI thread"
304339
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
305-
cdef double zoomLevel = (<CefBrowser*>(cefBrowser.get())).GetZoomLevel()
340+
cdef double zoomLevel
341+
IF CEF_VERSION == 1:
342+
zoomLevel = cefBrowser.get().GetZoomLevel()
343+
ELIF CEF_VERSION == 3:
344+
zoomLevel = GetCefBrowserHost(cefBrowser).get().GetZoomLevel()
306345
return zoomLevel
307346

308347
def GoBack(self):
309348

310349
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
311-
(<CefBrowser*>(cefBrowser.get())).GoBack()
350+
cefBrowser.get().GoBack()
312351

313352
def GoForward(self):
314353

315354
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
316-
(<CefBrowser*>(cefBrowser.get())).GoForward()
355+
cefBrowser.get().GoForward()
317356

318357
def HasDocument(self):
319358

320359
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
321-
return (<CefBrowser*>(cefBrowser.get())).HasDocument()
360+
return cefBrowser.get().HasDocument()
322361

323-
def HidePopup(self):
362+
IF CEF_VERSION == 1:
324363

325-
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
326-
(<CefBrowser*>(cefBrowser.get())).HidePopup()
364+
def HidePopup(self):
365+
366+
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
367+
cefBrowser.get().HidePopup()
327368

328369
def IsFullscreen(self):
329370

@@ -332,54 +373,69 @@ class PyBrowser:
332373
def IsPopup(self):
333374

334375
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
335-
return (<CefBrowser*>(cefBrowser.get())).IsPopup()
376+
return cefBrowser.get().IsPopup()
336377

337-
def IsPopupVisible(self):
378+
IF CEF_VERSION == 1:
338379

339-
assert IsCurrentThread(TID_UI), "Browser.IsPopupVisible() may only be called on the UI thread"
340-
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
341-
return (<CefBrowser*>(cefBrowser.get())).IsPopupVisible()
380+
def IsPopupVisible(self):
342381

343-
def IsWindowRenderingDisabled(self):
382+
assert IsCurrentThread(TID_UI), "Browser.IsPopupVisible() may only be called on the UI thread"
383+
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
384+
return cefBrowser.get().IsPopupVisible()
344385

345-
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
346-
return (<CefBrowser*>(cefBrowser.get())).IsWindowRenderingDisabled()
386+
def IsWindowRenderingDisabled(self):
387+
388+
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
389+
return cefBrowser.get().IsWindowRenderingDisabled()
347390

348391
def Reload(self):
349392

350393
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
351-
(<CefBrowser*>(cefBrowser.get())).Reload()
394+
cefBrowser.get().Reload()
352395

353396
def ReloadIgnoreCache(self):
354397

355398
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
356-
(<CefBrowser*>(cefBrowser.get())).ReloadIgnoreCache()
399+
cefBrowser.get().ReloadIgnoreCache()
357400

358401
def SetFocus(self, enable):
359402

360403
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
361-
(<CefBrowser*>(cefBrowser.get())).SetFocus(<c_bool>bool(enable))
404+
IF CEF_VERSION == 1:
405+
cefBrowser.get().SetFocus(bool(enable))
406+
ELIF CEF_VERSION == 3:
407+
GetCefBrowserHost(cefBrowser).get().SetFocus(bool(enable))
408+
409+
def SetUserData(self, key, value):
410+
411+
self.__userData[key] = value
362412

363413
def SetZoomLevel(self, zoomLevel):
364414

365415
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
366-
(<CefBrowser*>(cefBrowser.get())).SetZoomLevel(<double>float(zoomLevel))
367-
416+
IF CEF_VERSION == 1:
417+
cefBrowser.get().SetZoomLevel(<double>float(zoomLevel))
418+
ELIF CEF_VERSION == 3:
419+
GetCefBrowserHost(cefBrowser).get().SetZoomLevel(<double>float(zoomLevel))
368420

369-
def ShowDevTools(self):
421+
IF CEF_VERSION == 1:
370422

371-
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
372-
(<CefBrowser*>(cefBrowser.get())).ShowDevTools()
423+
def ShowDevTools(self):
424+
425+
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
426+
cefBrowser.get().ShowDevTools()
373427

374428
def StopLoad(self):
375429

376430
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
377-
(<CefBrowser*>(cefBrowser.get())).StopLoad()
431+
cefBrowser.get().StopLoad()
378432

379-
def StopFinding(self, clearSelection):
433+
IF CEF_VERSION == 1:
380434

381-
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
382-
(<CefBrowser*>(cefBrowser.get())).StopFinding(<c_bool>bool(clearSelection))
435+
def StopFinding(self, clearSelection):
436+
437+
cdef CefRefPtr[CefBrowser] cefBrowser = GetCefBrowserByInnerWindowID(CheckInnerWindowID(self.__innerWindowID))
438+
cefBrowser.get().StopFinding(bool(clearSelection))
383439

384440
def ToggleFullscreen(self):
385441

cefpython/cef1/windows/binaries/cefadvanced.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
body { font: 13px Arial; }
88
pre { background: #ddd; }
99
</style>
10-
<script src=ceferror.js></script>
1110
</head>
1211
<body>
1312

cefpython/cef1/windows/binaries/cefadvanced.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# License: New BSD License.
33
# Website: http://code.google.com/p/cefpython/
44

5-
# Check whether python architecture and version are valid, otherwise an obfuscated error
5+
# Checking whether python architecture and version are valid, otherwise an obfuscated error
66
# will be thrown when trying to load cefpython.pyd with a message "DLL load failed".
77

88
import platform

cefpython/cef1/windows/binaries/pygtk_.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,9 @@ def OnExit(self, widget, data=None):
116116
version = '.'.join(map(str, list(gtk.gtk_version)))
117117
print('GTK version: %s' % version)
118118

119+
sys.excepthook = cefpython.ExceptHook
119120
settings = {"log_severity": cefpython.LOGSEVERITY_VERBOSE, "release_dcheck_enabled": True}
120-
cefpython.Initialize(settings)
121-
sys.excepthook = cefpython.ExceptHook
121+
cefpython.Initialize(settings)
122122

123123
gobject.threads_init() # timer for messageloop
124124
PyGTKExample()

cefpython/cef1/windows/binaries/pyqt.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ def stopTimer(self):
100100
print("PyQt version: %s" % QtCore.PYQT_VERSION_STR)
101101
print("QtCore version: %s" % QtCore.qVersion())
102102

103-
settings = {"log_severity": cefpython.LOGSEVERITY_VERBOSE, "release_dcheck_enabled": True}
104-
cefpython.Initialize(settings)
105103
sys.excepthook = cefpython.ExceptHook
104+
settings = {"log_severity": cefpython.LOGSEVERITY_VERBOSE, "release_dcheck_enabled": True}
105+
cefpython.Initialize(settings)
106106

107107
app = CefApplication(sys.argv)
108108
mainWindow = MainWindow()

0 commit comments

Comments
 (0)