WebBrowser/WebBrowserView.py

branch
QtWebEngine
changeset 4717
5841f229baf7
parent 4715
79009bc4acd5
child 4725
b19ff70ba509
equal deleted inserted replaced
4715:79009bc4acd5 4717:5841f229baf7
38 from PyQt5.QtNetwork import QSslCertificate 38 from PyQt5.QtNetwork import QSslCertificate
39 SSL_AVAILABLE = True 39 SSL_AVAILABLE = True
40 except ImportError: 40 except ImportError:
41 SSL_AVAILABLE = False 41 SSL_AVAILABLE = False
42 42
43 ###############################################################################
44 ##
45 ##
46 ##class JavaScriptExternalObject(QObject):
47 ## """
48 ## Class implementing an external javascript object to add search providers.
49 ## """
50 ## def __init__(self, mw, parent=None):
51 ## """
52 ## Constructor
53 ##
54 ## @param mw reference to the main window 8HelpWindow)
55 ## @param parent reference to the parent object (QObject)
56 ## """
57 ## super(JavaScriptExternalObject, self).__init__(parent)
58 ##
59 ## self.__mw = mw
60 ##
61 ## @pyqtSlot(str)
62 ## def AddSearchProvider(self, url):
63 ## """
64 ## Public slot to add a search provider.
65 ##
66 ## @param url url of the XML file defining the search provider (string)
67 ## """
68 ## self.__mw.openSearchManager().addEngine(QUrl(url))
69 ##
70 ##
71 ##class LinkedResource(object):
72 ## """
73 ## Class defining a data structure for linked resources.
74 ## """
75 ## def __init__(self):
76 ## """
77 ## Constructor
78 ## """
79 ## self.rel = ""
80 ## self.type_ = ""
81 ## self.href = ""
82 ## self.title = ""
83 ##
84 ###############################################################################
85 ##
86 ##
87 ##class JavaScriptEricObject(QObject):
88 ## """
89 ## Class implementing an external javascript object to search via the
90 ## startpage.
91 ## """
92 ## # these must be in line with the strings used by the javascript part of
93 ## # the start page
94 ## translations = [
95 ## QT_TRANSLATE_NOOP("JavaScriptEricObject",
96 ## "Welcome to eric6 Web Browser!"),
97 ## QT_TRANSLATE_NOOP("JavaScriptEricObject", "eric6 Web Browser"),
98 ## QT_TRANSLATE_NOOP("JavaScriptEricObject", "Search!"),
99 ## QT_TRANSLATE_NOOP("JavaScriptEricObject", "About eric6"),
100 ## ]
101 ##
102 ## def __init__(self, mw, parent=None):
103 ## """
104 ## Constructor
105 ##
106 ## @param mw reference to the main window 8HelpWindow)
107 ## @param parent reference to the parent object (QObject)
108 ## """
109 ## super(JavaScriptEricObject, self).__init__(parent)
110 ##
111 ## self.__mw = mw
112 ##
113 ## @pyqtSlot(str, result=str)
114 ## def translate(self, trans):
115 ## """
116 ## Public method to translate the given string.
117 ##
118 ## @param trans string to be translated (string)
119 ## @return translation (string)
120 ## """
121 ## if trans == "QT_LAYOUT_DIRECTION":
122 ## # special handling to detect layout direction
123 ## if qApp.isLeftToRight():
124 ## return "LTR"
125 ## else:
126 ## return "RTL"
127 ##
128 ## return self.tr(trans)
129 ##
130 ## @pyqtSlot(result=str)
131 ## def providerString(self):
132 ## """
133 ## Public method to get a string for the search provider.
134 ##
135 ## @return string for the search provider (string)
136 ## """
137 ## return self.tr("Search results provided by {0}")\
138 ## .format(self.__mw.openSearchManager().currentEngineName())
139 ##
140 ## @pyqtSlot(str, result=str)
141 ## def searchUrl(self, searchStr):
142 ## """
143 ## Public method to get the search URL for the given search term.
144 ##
145 ## @param searchStr search term (string)
146 ## @return search URL (string)
147 ## """
148 ## return bytes(
149 ## self.__mw.openSearchManager().currentEngine()
150 ## .searchUrl(searchStr).toEncoded()).decode()
151 ##
152 ###############################################################################
153
154 43
155 class WebBrowserView(QWebEngineView): 44 class WebBrowserView(QWebEngineView):
156 """ 45 """
157 Class implementing the web browser view widget. 46 Class implementing the web browser view widget.
158 47
185 @param parent parent widget of this window (QWidget) 74 @param parent parent widget of this window (QWidget)
186 @param name name of this window (string) 75 @param name name of this window (string)
187 """ 76 """
188 super(WebBrowserView, self).__init__(parent) 77 super(WebBrowserView, self).__init__(parent)
189 self.setObjectName(name) 78 self.setObjectName(name)
79
80 self.__rwhvqt = None
81 self.installEventFilter(self)
190 ## 82 ##
191 ## import Helpviewer.HelpWindow 83 ## import Helpviewer.HelpWindow
192 ## self.__speedDial = Helpviewer.HelpWindow.HelpWindow.speedDial() 84 ## self.__speedDial = Helpviewer.HelpWindow.HelpWindow.speedDial()
193 85
194 self.__page = WebBrowserPage(self) 86 self.__page = WebBrowserPage(self)
230 122
231 # TODO: Open Search 123 # TODO: Open Search
232 ## self.__mw.openSearchManager().currentEngineChanged.connect( 124 ## self.__mw.openSearchManager().currentEngineChanged.connect(
233 ## self.__currentEngineChanged) 125 ## self.__currentEngineChanged)
234 126
235 self.__rwhvqt = None
236 # TODO: eventFilter (see below)
237 ## self.installEventFilter(self)
238 self.setAcceptDrops(True) 127 self.setAcceptDrops(True)
239 128
240 # TODO: Access Keys 129 # TODO: Access Keys
241 ## self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled") 130 ## self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled")
242 ## self.__accessKeysPressed = False 131 ## self.__accessKeysPressed = False
252 141
253 # TODO: PIM 142 # TODO: PIM
254 ## self.__mw.personalInformationManager().connectPage(self.page()) 143 ## self.__mw.personalInformationManager().connectPage(self.page())
255 # TODO: GreaseMonkey 144 # TODO: GreaseMonkey
256 ## self.__mw.greaseMonkeyManager().connectPage(self.page()) 145 ## self.__mw.greaseMonkeyManager().connectPage(self.page())
257 ## 146
147 # TODO: WebInspector
258 ## self.__inspector = None 148 ## self.__inspector = None
259 149
260 self.grabGesture(Qt.PinchGesture) 150 self.grabGesture(Qt.PinchGesture)
261 151
262 ## def __addExternalBinding(self, frame=None): 152 ## def __addExternalBinding(self, frame=None):
1270 url = QUrl(evt.mimeData().text()) 1160 url = QUrl(evt.mimeData().text())
1271 if url.isValid(): 1161 if url.isValid():
1272 self.setSource(url) 1162 self.setSource(url)
1273 evt.acceptProposedAction() 1163 evt.acceptProposedAction()
1274 1164
1275 def mousePressEvent(self, evt): 1165 def _mousePressEvent(self, evt):
1276 """ 1166 """
1277 Protected method called by a mouse press event. 1167 Protected method called by a mouse press event.
1278 1168
1279 @param evt reference to the mouse event (QMouseEvent) 1169 @param evt reference to the mouse event (QMouseEvent)
1280 """ 1170 """
1286 elif evt.button() == Qt.XButton2: 1176 elif evt.button() == Qt.XButton2:
1287 self.pageAction(QWebEnginePage.Forward).trigger() 1177 self.pageAction(QWebEnginePage.Forward).trigger()
1288 else: 1178 else:
1289 super(WebBrowserView, self).mousePressEvent(evt) 1179 super(WebBrowserView, self).mousePressEvent(evt)
1290 1180
1291 def mouseReleaseEvent(self, evt): 1181 def _mouseReleaseEvent(self, evt):
1292 """ 1182 """
1293 Protected method called by a mouse release event. 1183 Protected method called by a mouse release event.
1294 1184
1295 @param evt reference to the mouse event (QMouseEvent) 1185 @param evt reference to the mouse event (QMouseEvent)
1296 """ 1186 """
1305 self.__mw.setEventMouseButtons(Qt.NoButton) 1195 self.__mw.setEventMouseButtons(Qt.NoButton)
1306 self.__mw.setEventKeyboardModifiers(Qt.NoModifier) 1196 self.__mw.setEventKeyboardModifiers(Qt.NoModifier)
1307 self.setSource(url) 1197 self.setSource(url)
1308 evt.setAccepted(accepted) 1198 evt.setAccepted(accepted)
1309 1199
1310 def wheelEvent(self, evt): 1200 def _wheelEvent(self, evt):
1311 """ 1201 """
1312 Protected method to handle wheel events. 1202 Protected method to handle wheel events.
1313 1203
1314 @param evt reference to the wheel event (QWheelEvent) 1204 @param evt reference to the wheel event (QWheelEvent)
1315 """ 1205 """
1330 evt.accept() 1220 evt.accept()
1331 return 1221 return
1332 1222
1333 super(WebBrowserView, self).wheelEvent(evt) 1223 super(WebBrowserView, self).wheelEvent(evt)
1334 1224
1335 ## def keyPressEvent(self, evt): 1225 def _keyPressEvent(self, evt):
1336 ## """ 1226 """
1337 ## Protected method called by a key press. 1227 Protected method called by a key press.
1338 ## 1228
1339 ## @param evt reference to the key event (QKeyEvent) 1229 @param evt reference to the key event (QKeyEvent)
1340 ## """ 1230 """
1341 ## # TODO: PIM 1231 # TODO: PIM
1342 #### if self.__mw.personalInformationManager().viewKeyPressEvent(self, evt): 1232 ## if self.__mw.personalInformationManager().viewKeyPressEvent(self, evt):
1343 #### return 1233 ## return
1344 ## 1234
1345 ## # TODO: Access Keys 1235 # TODO: Access Keys
1346 #### if self.__enableAccessKeys: 1236 ## if self.__enableAccessKeys:
1347 #### self.__accessKeysPressed = ( 1237 ## self.__accessKeysPressed = (
1348 #### evt.modifiers() == Qt.ControlModifier and 1238 ## evt.modifiers() == Qt.ControlModifier and
1349 #### evt.key() == Qt.Key_Control) 1239 ## evt.key() == Qt.Key_Control)
1350 #### if not self.__accessKeysPressed: 1240 ## if not self.__accessKeysPressed:
1351 #### if self.__checkForAccessKey(evt): 1241 ## if self.__checkForAccessKey(evt):
1352 #### self.__hideAccessKeys() 1242 ## self.__hideAccessKeys()
1353 #### evt.accept() 1243 ## evt.accept()
1354 #### return 1244 ## return
1355 #### self.__hideAccessKeys() 1245 ## self.__hideAccessKeys()
1356 #### else: 1246 ## else:
1357 #### QTimer.singleShot(300, self.__accessKeyShortcut) 1247 ## QTimer.singleShot(300, self.__accessKeyShortcut)
1358 ## 1248
1359 ## self.__ctrlPressed = (evt.key() == Qt.Key_Control) 1249 self.__ctrlPressed = (evt.key() == Qt.Key_Control)
1360 ## super(WebBrowserView, self).keyPressEvent(evt) 1250 super(WebBrowserView, self).keyPressEvent(evt)
1361 ## 1251
1362 ## def keyReleaseEvent(self, evt): 1252 def _keyReleaseEvent(self, evt):
1363 ## """ 1253 """
1364 ## Protected method called by a key release. 1254 Protected method called by a key release.
1365 ## 1255
1366 ## @param evt reference to the key event (QKeyEvent) 1256 @param evt reference to the key event (QKeyEvent)
1367 ## """ 1257 """
1368 ## # TODO: Access Keys 1258 # TODO: Access Keys
1369 #### if self.__enableAccessKeys: 1259 ## if self.__enableAccessKeys:
1370 #### self.__accessKeysPressed = evt.key() == Qt.Key_Control 1260 ## self.__accessKeysPressed = evt.key() == Qt.Key_Control
1371 ## 1261
1372 ## self.__ctrlPressed = False 1262 self.__ctrlPressed = False
1373 ## super(WebBrowserView, self).keyReleaseEvent(evt) 1263 super(WebBrowserView, self).keyReleaseEvent(evt)
1374 1264
1375 def focusOutEvent(self, evt): 1265 def focusOutEvent(self, evt):
1376 """ 1266 """
1377 Protected method called by a focus out event. 1267 Protected method called by a focus out event.
1378 1268
1383 ## self.__hideAccessKeys() 1273 ## self.__hideAccessKeys()
1384 ## self.__accessKeysPressed = False 1274 ## self.__accessKeysPressed = False
1385 1275
1386 super(WebBrowserView, self).focusOutEvent(evt) 1276 super(WebBrowserView, self).focusOutEvent(evt)
1387 1277
1388 def event(self, evt): 1278 # TODO: Obsoleted by eventFilter() (?)
1389 """ 1279 ## def event(self, evt):
1390 Public method handling events. 1280 ## """
1391 1281 ## Public method handling events.
1392 @param evt reference to the event (QEvent) 1282 ##
1393 @return flag indicating, if the event was handled (boolean) 1283 ## @param evt reference to the event (QEvent)
1394 """ 1284 ## @return flag indicating, if the event was handled (boolean)
1395 if evt.type() == QEvent.Gesture: 1285 ## """
1396 self.gestureEvent(evt) 1286 ## if evt.type() == QEvent.Gesture:
1397 return True 1287 ## self.gestureEvent(evt)
1398 1288 ## return True
1399 return super(WebBrowserView, self).event(evt) 1289 ##
1400 1290 ## return super(WebBrowserView, self).event(evt)
1401 def gestureEvent(self, evt): 1291
1292 def _gestureEvent(self, evt):
1402 """ 1293 """
1403 Protected method handling gesture events. 1294 Protected method handling gesture events.
1404 1295
1405 @param evt reference to the gesture event (QGestureEvent 1296 @param evt reference to the gesture event (QGestureEvent
1406 """ 1297 """
1411 else: 1302 else:
1412 scaleFactor = pinch.scaleFactor() 1303 scaleFactor = pinch.scaleFactor()
1413 self.__currentZoom = int(scaleFactor * 100) 1304 self.__currentZoom = int(scaleFactor * 100)
1414 self.__applyZoom() 1305 self.__applyZoom()
1415 evt.accept() 1306 evt.accept()
1416 ##bool WebView::eventFilter(QObject *obj, QEvent *event) 1307
1417 ##{ 1308 def eventFilter(self, obj, evt):
1418 ## // Hack to find widget that receives input events 1309 """
1419 ## if (obj == this && event->type() == QEvent::ChildAdded) { 1310 Protected method to process event for other objects.
1420 ## QWidget *child = qobject_cast<QWidget*>(static_cast<QChildEvent*>(event)->child()); 1311
1421 ## if (child && child->inherits("QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget")) { 1312 @param obj reference to object to process events for
1422 ## m_rwhvqt = child; 1313 @type QObject
1423 ## m_rwhvqt->installEventFilter(this); 1314 @param evt reference to event to be processed
1424 ## } 1315 @type QEvent
1425 ## } 1316 @return flag indicating that the event should be filtered out
1426 ## 1317 @rtype bool
1427 ## // Forward events to WebView 1318 """
1428 ## if (obj == m_rwhvqt) { 1319 # find the render widget receiving events for the web page
1429 ###define HANDLE_EVENT(f, t) \ 1320 if obj is self and evt.type() == QEvent.ChildAdded:
1430 ## { \ 1321 child = evt.child()
1431 ## bool wasAccepted = event->isAccepted(); \ 1322 if child and child.inherits(
1432 ## event->setAccepted(false); \ 1323 "QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget"):
1433 ## f(static_cast<t*>(event)); \ 1324 self.__rwhvqt = child
1434 ## bool ret = event->isAccepted(); \ 1325 self.__rwhvqt.installEventFilter(self)
1435 ## event->setAccepted(wasAccepted); \ 1326
1436 ## return ret; \ 1327 # forward events to WebBrowserView
1437 ## } 1328 if obj is self.__rwhvqt:
1438 ## 1329 wasAccepted = evt.isAccepted()
1439 ## switch (event->type()) { 1330 evt.setAccepted(False)
1440 ## case QEvent::KeyPress: 1331 if evt.type() == QEvent.KeyPress:
1441 ## HANDLE_EVENT(_keyPressEvent, QKeyEvent); 1332 self._keyPressEvent(evt)
1442 ## 1333 elif evt.type() == QEvent.KeyRelease:
1443 ## case QEvent::KeyRelease: 1334 self._keyReleaseEvent(evt)
1444 ## HANDLE_EVENT(_keyReleaseEvent, QKeyEvent); 1335 elif evt.type() == QEvent.MouseButtonPress:
1445 ## 1336 self._mousePressEvent(evt)
1446 ## case QEvent::MouseButtonPress: 1337 elif evt.type() == QEvent.MouseButtonRelease:
1447 ## HANDLE_EVENT(_mousePressEvent, QMouseEvent); 1338 self._mouseReleaseEvent(evt)
1448 ## 1339 ## elif evt.type() == QEvent.MouseMove:
1449 ## case QEvent::MouseButtonRelease: 1340 ## self.__mouseMoveEvent(evt)
1450 ## HANDLE_EVENT(_mouseReleaseEvent, QMouseEvent); 1341 elif evt.type() == QEvent.Wheel:
1451 ## 1342 self._wheelEvent(evt)
1452 ## case QEvent::MouseMove: 1343 elif evt.type() == QEvent.Gesture:
1453 ## HANDLE_EVENT(_mouseMoveEvent, QMouseEvent); 1344 self._gestureEvent(evt)
1454 ## 1345 ret = evt.isAccepted()
1455 ## case QEvent::Wheel: 1346 evt.setAccepted(wasAccepted)
1456 ## HANDLE_EVENT(_wheelEvent, QWheelEvent); 1347 return ret
1457 ## 1348
1458 ## default: 1349 # block already handled events
1459 ## break; 1350 if obj is self:
1460 ## } 1351 if evt.type() in [QEvent.KeyPress, QEvent.KeyRelease,
1461 ## 1352 QEvent.MouseButtonPress,
1462 ###undef HANDLE_EVENT 1353 QEvent.MouseButtonRelease,
1463 ## } 1354 ## QEvent.MouseMove,
1464 ## 1355 QEvent.Wheel, QEvent.Gesture]:
1465 ## // Block already handled events 1356 return True
1466 ## if (obj == this) { 1357
1467 ## switch (event->type()) { 1358 return super(WebBrowserView, self).eventFilter(obj, evt)
1468 ## case QEvent::KeyPress:
1469 ## case QEvent::KeyRelease:
1470 ## case QEvent::MouseButtonPress:
1471 ## case QEvent::MouseButtonRelease:
1472 ## case QEvent::MouseMove:
1473 ## case QEvent::Wheel:
1474 ## return true;
1475 ##
1476 ## default:
1477 ## break;
1478 ## }
1479 ## }
1480 ##
1481 ## return QWebEngineView::eventFilter(obj, event);
1482 ##}
1483 1359
1484 def clearHistory(self): 1360 def clearHistory(self):
1485 """ 1361 """
1486 Public slot to clear the history. 1362 Public slot to clear the history.
1487 """ 1363 """
1545 @param ok flag indicating the result (boolean) 1421 @param ok flag indicating the result (boolean)
1546 """ 1422 """
1547 self.__isLoading = False 1423 self.__isLoading = False
1548 self.__progress = 0 1424 self.__progress = 0
1549 1425
1550 if Preferences.getHelp("ClickToFlashEnabled"): 1426 # TODO: ClickToFlash (?)
1551 # this is a hack to make the ClickToFlash button appear 1427 ## if Preferences.getHelp("ClickToFlashEnabled"):
1552 self.zoomIn() 1428 ## # this is a hack to make the ClickToFlash button appear
1553 self.zoomOut() 1429 ## self.zoomIn()
1430 ## self.zoomOut()
1554 1431
1555 # TODO: Zoom Manager 1432 # TODO: Zoom Manager
1556 ## zoomValue = Helpviewer.HelpWindow.HelpWindow.zoomManager()\ 1433 ## zoomValue = Helpviewer.HelpWindow.HelpWindow.zoomManager()\
1557 ## .zoomValue(self.url()) 1434 ## .zoomValue(self.url())
1558 ## self.setZoomValue(zoomValue) 1435 ## self.setZoomValue(zoomValue)

eric ide

mercurial