Skip to content

Commit 7a4afc6

Browse files
committed
timeline-mixins: Enable WebEngine JS logging
1 parent e92ae96 commit 7a4afc6

File tree

1 file changed

+54
-20
lines changed

1 file changed

+54
-20
lines changed

src/windows/views/timeline_mixins.py

+54-20
Original file line numberDiff line numberDiff line change
@@ -26,39 +26,67 @@
2626
"""
2727

2828
import os
29+
import logging
2930
from classes import info
30-
from PyQt5.QtCore import QFileInfo, pyqtSlot, QUrl, Qt, QCoreApplication, QTimer
31-
from PyQt5.QtGui import QCursor, QKeySequence, QColor
32-
from PyQt5.QtWidgets import QMenu
31+
from PyQt5.QtCore import Qt, QObject, QFileInfo, QUrl, QTimer
32+
from PyQt5.QtGui import QColor
3333
from classes.logger import log
3434
from functools import partial
3535

3636

3737
try:
3838
# Attempt to import QtWebEngine
3939
from PyQt5.QtWebChannel import QWebChannel
40-
from PyQt5.QtWebEngineWidgets import QWebEngineView
40+
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
4141
IS_WEBENGINE_VALID = True
4242
except ImportError:
43-
QWebEngineView = object # Prevent inheritance errors
43+
QWebEngineView = QObject # Prevent inheritance errors
4444
IS_WEBENGINE_VALID = False
4545

4646
try:
4747
# Attempt to import QtWebKit
4848
from PyQt5.QtWebKitWidgets import QWebView, QWebPage
4949
IS_WEBKIT_VALID = True
5050
except ImportError:
51-
QWebView = object # Prevent inheritance errors
52-
QWebPage = object
51+
QWebView = QObject # Prevent inheritance errors
5352
IS_WEBKIT_VALID = False
5453

54+
if IS_WEBKIT_VALID:
55+
class LoggingWebKitPage(QWebPage):
56+
"""Override console.log message to display messages"""
57+
def javaScriptConsoleMessage(self, msg, line, source, *args):
58+
log.warning('%s@L%d: %s' % (os.path.basename(source), line, msg))
59+
60+
def __init__(self, parent=None):
61+
super().__init__(parent=parent)
62+
self.setObjectName("LoggingWebKitPage")
63+
else:
64+
LoggingWebKitPage = object
65+
66+
67+
if IS_WEBENGINE_VALID:
68+
class LoggingWebEnginePage(QWebEnginePage):
69+
"""Override console.log message to display messages"""
70+
def javaScriptConsoleMessage(self, level, msg, line, source):
71+
log.log(
72+
self.levels[level],
73+
'%s@%d: %s' % (os.path.basename(source), line, msg))
74+
75+
def __init__(self, parent=None):
76+
super().__init__(parent=parent)
77+
self.setObjectName("LoggingWebEnginePage")
78+
self.levels = [logging.INFO, logging.WARNING, logging.ERROR]
79+
80+
else:
81+
LoggingWebEnginePage = object
82+
5583

5684
class TimelineBaseMixin(object):
5785
"""OpenShot Timeline Base Mixin Class"""
58-
def __init__(self):
86+
def __init__(self, *args):
5987
"""Initialization code required for parent widget"""
6088
self.document_is_ready = False
61-
self.html_path = html_path = os.path.join(info.PATH, 'timeline', 'index.html')
89+
self.html_path = os.path.join(info.PATH, 'timeline', 'index.html')
6290

6391
def run_js(self, code, callback=None, retries=0):
6492
"""Run javascript code snippet"""
@@ -74,8 +102,14 @@ class TimelineQtWebEngineMixin(TimelineBaseMixin, QWebEngineView):
74102

75103
def __init__(self):
76104
"""Initialization code required for widget"""
105+
super(QWebEngineView, self).__init__()
77106
TimelineBaseMixin.__init__(self)
78-
QWebEngineView.__init__(self)
107+
self.setObjectName("TimelineQtWebEngineMixin")
108+
109+
# Connect logging web page (for console.log)
110+
if IS_WEBENGINE_VALID:
111+
self.new_page = LoggingWebEnginePage(self)
112+
self.setPage(self.new_page)
79113

80114
# Set background color of timeline
81115
self.page().setBackgroundColor(QColor("#363636"))
@@ -92,6 +126,7 @@ def __init__(self):
92126
self.page().setWebChannel(self.webchannel)
93127

94128
# Connect signal of javascript initialization to our javascript reference init function
129+
log.info("WebEngine backend initializing")
95130
self.page().loadStarted.connect(self.setup_js_data)
96131

97132
def run_js(self, code, callback=None, retries=0):
@@ -117,6 +152,7 @@ def run_js(self, code, callback=None, retries=0):
117152

118153
def setup_js_data(self):
119154
# Export self as a javascript object in webview
155+
log.info("Registering WebChannel connection with WebEngine")
120156
self.webchannel.registerObject('timeline', self)
121157

122158
def get_html(self):
@@ -143,25 +179,22 @@ def keyPressEvent(self, event):
143179
event.ignore()
144180

145181

146-
class LoggingWebPage(QWebPage):
147-
"""Override console.log message to display messages"""
148-
def javaScriptConsoleMessage(self, msg, line, source):
149-
log.warning('JS: %s line %d: %s' % (source, line, msg))
150-
151182
class TimelineQtWebKitMixin(TimelineBaseMixin, QWebView):
152183
"""QtWebKit Timeline Widget"""
153184

154185
def __init__(self):
155186
"""Initialization code required for widget"""
187+
super(QWebView, self).__init__()
156188
TimelineBaseMixin.__init__(self)
157-
QWebView.__init__(self)
189+
self.setObjectName("TimelineQtWebKitMixin")
158190

159191
# Delete the webview when closed
160192
self.setAttribute(Qt.WA_DeleteOnClose)
161193

162194
# Connect logging web page (for console.log)
163-
page = LoggingWebPage()
164-
self.setPage(page)
195+
if IS_WEBKIT_VALID:
196+
self.new_page = LoggingWebKitPage(self)
197+
self.setPage(self.new_page)
165198

166199
# Disable image caching on timeline
167200
self.settings().setObjectCacheCapacities(0, 0, 0)
@@ -170,6 +203,7 @@ def __init__(self):
170203
self.setHtml(self.get_html(), QUrl.fromLocalFile(QFileInfo(self.html_path).absoluteFilePath()))
171204

172205
# Connect signal of javascript initialization to our javascript reference init function
206+
log.info("WebKit backend initializing")
173207
self.page().mainFrame().javaScriptWindowObjectCleared.connect(self.setup_js_data)
174208

175209
def run_js(self, code, callback=None, retries=0):
@@ -196,6 +230,7 @@ def run_js(self, code, callback=None, retries=0):
196230

197231
def setup_js_data(self):
198232
# Export self as a javascript object in webview
233+
log.info("Registering objects with WebKit")
199234
self.page().mainFrame().addToJavaScriptWindowObject('timeline', self)
200235
self.page().mainFrame().addToJavaScriptWindowObject('mainWindow', self.window)
201236

@@ -213,14 +248,13 @@ def keyPressEvent(self, event):
213248
""" Keypress callback for timeline """
214249
key_value = event.key()
215250
if (key_value == Qt.Key_Shift or key_value == Qt.Key_Control):
216-
217251
# Only pass a few keystrokes to the webview (CTRL and SHIFT)
218252
return QWebView.keyPressEvent(self, event)
219-
220253
else:
221254
# Ignore most keypresses
222255
event.ignore()
223256

257+
224258
# Set correct Mixin (with QtWebEngine preference)
225259
if IS_WEBENGINE_VALID:
226260
TimelineMixin = TimelineQtWebEngineMixin

0 commit comments

Comments
 (0)