WebBrowser/WebBrowserView.py

branch
QtWebEngine
changeset 4715
79009bc4acd5
parent 4713
8dca047daf4b
child 4717
5841f229baf7
equal deleted inserted replaced
4713:8dca047daf4b 4715:79009bc4acd5
8 Module implementing the web browser using QWebEngineView. 8 Module implementing the web browser using QWebEngineView.
9 """ 9 """
10 10
11 from __future__ import unicode_literals 11 from __future__ import unicode_literals
12 try: 12 try:
13 str = unicode 13 str = unicode # __IGNORE_EXCEPTION__
14 except NameError: 14 except NameError:
15 pass 15 pass
16 16
17 from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject, QT_TRANSLATE_NOOP, \ 17 from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject, QT_TRANSLATE_NOOP, \
18 QUrl, QBuffer, QIODevice, QFileInfo, Qt, QTimer, QEvent, \ 18 QUrl, QBuffer, QIODevice, QFileInfo, Qt, QTimer, QEvent, \
226 ## self.page().frameCreated.connect(self.__addExternalBinding) 226 ## self.page().frameCreated.connect(self.__addExternalBinding)
227 ## self.__addExternalBinding(self.page().mainFrame()) 227 ## self.__addExternalBinding(self.page().mainFrame())
228 228
229 ## self.page().databaseQuotaExceeded.connect(self.__databaseQuotaExceeded) 229 ## self.page().databaseQuotaExceeded.connect(self.__databaseQuotaExceeded)
230 230
231 # TODO: re-enable onece Open Search is done 231 # TODO: Open Search
232 ## self.__mw.openSearchManager().currentEngineChanged.connect( 232 ## self.__mw.openSearchManager().currentEngineChanged.connect(
233 ## self.__currentEngineChanged) 233 ## self.__currentEngineChanged)
234 234
235 self.__rwhvqt = None
236 # TODO: eventFilter (see below)
237 ## self.installEventFilter(self)
235 self.setAcceptDrops(True) 238 self.setAcceptDrops(True)
236 239
237 # TODO: re-enable for Access Keys 240 # TODO: Access Keys
238 ## self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled") 241 ## self.__enableAccessKeys = Preferences.getHelp("AccessKeysEnabled")
239 ## self.__accessKeysPressed = False 242 ## self.__accessKeysPressed = False
240 ## self.__accessKeyLabels = [] 243 ## self.__accessKeyLabels = []
241 ## self.__accessKeyNodes = {} 244 ## self.__accessKeyNodes = {}
242 ## 245 ##
245 248
246 self.__rss = [] 249 self.__rss = []
247 250
248 self.__clickedFrame = None 251 self.__clickedFrame = None
249 252
250 # TODO: re-enable once done 253 # TODO: PIM
251 ## self.__mw.personalInformationManager().connectPage(self.page()) 254 ## self.__mw.personalInformationManager().connectPage(self.page())
255 # TODO: GreaseMonkey
252 ## self.__mw.greaseMonkeyManager().connectPage(self.page()) 256 ## self.__mw.greaseMonkeyManager().connectPage(self.page())
253 ## 257 ##
254 ## self.__inspector = None 258 ## self.__inspector = None
255 259
256 self.grabGesture(Qt.PinchGesture) 260 self.grabGesture(Qt.PinchGesture)
457 461
458 def home(self): 462 def home(self):
459 """ 463 """
460 Public slot to move to the first page loaded. 464 Public slot to move to the first page loaded.
461 """ 465 """
466 ## homeUrl = QUrl("http://localhost")
467 ## # TODO: eric: scheme or Configuration page
462 homeUrl = QUrl(Preferences.getWebBrowser("HomePage")) 468 homeUrl = QUrl(Preferences.getWebBrowser("HomePage"))
463 self.setSource(homeUrl) 469 self.setSource(homeUrl)
464 self.__urlChanged(self.history().currentItem().url()) 470 self.__urlChanged(self.history().currentItem().url())
465 471
466 def reload(self): 472 def reload(self):
522 @type bool 528 @type bool
523 """ 529 """
524 if value != self.zoomValue(): 530 if value != self.zoomValue():
525 self.setZoomFactor(value / 100.0) 531 self.setZoomFactor(value / 100.0)
526 self.__currentZoom = value 532 self.__currentZoom = value
527 # TODO: re-enable this when Zoom Manager is done 533 # TODO: Zoom Manager
528 ## if saveValue: 534 ## if saveValue:
529 ## Helpviewer.HelpWindow.HelpWindow.zoomManager().setZoomValue( 535 ## Helpviewer.HelpWindow.HelpWindow.zoomManager().setZoomValue(
530 ## self.url(), value) 536 ## self.url(), value)
531 self.zoomValueChanged.emit(value) 537 self.zoomValueChanged.emit(value)
532 538
604 if callback is None: 610 if callback is None:
605 self.findText(txt, findFlags) 611 self.findText(txt, findFlags)
606 else: 612 else:
607 self.findText(txt, findFlags, callback) 613 self.findText(txt, findFlags, callback)
608 614
609 # TODO: re-enable once WebBrowserWebElement is done 615 # TODO: WebBrowserWebElement
610 ## def __isMediaElement(self, element): 616 ## def __isMediaElement(self, element):
611 ## """ 617 ## """
612 ## Private method to check, if the given element is a media element. 618 ## Private method to check, if the given element is a media element.
613 ## 619 ##
614 ## @param element element to be checked (QWebElement) 620 ## @param element element to be checked (QWebElement)
623 This method is overridden from QWebEngineView. 629 This method is overridden from QWebEngineView.
624 630
625 @param evt reference to the context menu event object 631 @param evt reference to the context menu event object
626 (QContextMenuEvent) 632 (QContextMenuEvent)
627 """ 633 """
628 # TODO: re-enable once User Agent is done 634 # TODO: User Agent
629 ## from .UserAgent.UserAgentMenu import UserAgentMenu 635 ## from .UserAgent.UserAgentMenu import UserAgentMenu
630 menu = QMenu(self) 636 menu = QMenu(self)
631 637
632 ## frameAtPos = self.page().frameAt(evt.pos()) 638 ## frameAtPos = self.page().frameAt(evt.pos())
633 # TODO: re-enable once WebHitTestResult is done 639 # TODO: WebHitTestResult
634 ## hit = self.page().hitTestContent(evt.pos()) 640 ## hit = self.page().hitTestContent(evt.pos())
635 ## if not hit.linkUrl().isEmpty(): 641 ## if not hit.linkUrl().isEmpty():
636 ## menu.addAction( 642 ## menu.addAction(
637 ## UI.PixmapCache.getIcon("openNewTab.png"), 643 ## UI.PixmapCache.getIcon("openNewTab.png"),
638 ## self.tr("Open Link in New Tab\tCtrl+LMB"), 644 ## self.tr("Open Link in New Tab\tCtrl+LMB"),
761 ## pageMenu = None 767 ## pageMenu = None
762 768
763 if not menu.isEmpty(): 769 if not menu.isEmpty():
764 menu.addSeparator() 770 menu.addSeparator()
765 771
766 # TODO: re-enable once PIM is done 772 # TODO: PIM
767 ## self.__mw.personalInformationManager().createSubMenu(menu, self, hit) 773 ## self.__mw.personalInformationManager().createSubMenu(menu, self, hit)
768 774
769 menu.addAction(self.__mw.newTabAct) 775 menu.addAction(self.__mw.newTabAct)
770 menu.addAction(self.__mw.newAct) 776 menu.addAction(self.__mw.newAct)
771 menu.addSeparator() 777 menu.addSeparator()
810 ## self.__showClickedFrameSource) 816 ## self.__showClickedFrameSource)
811 ## 817 ##
812 ## menu.addMenu(fmenu) 818 ## menu.addMenu(fmenu)
813 ## menu.addSeparator() 819 ## menu.addSeparator()
814 820
815 menu.addAction( 821 # TODO: Bookmarks
816 UI.PixmapCache.getIcon("bookmark22.png"), 822 ## menu.addAction(
817 self.tr("Bookmark this Page"), self.addBookmark) 823 ## UI.PixmapCache.getIcon("bookmark22.png"),
824 ## self.tr("Bookmark this Page"), self.addBookmark)
818 menu.addAction( 825 menu.addAction(
819 UI.PixmapCache.getIcon("mailSend.png"), 826 UI.PixmapCache.getIcon("mailSend.png"),
820 self.tr("Send Page Link"), self.__sendLink).setData(self.url()) 827 self.tr("Send Page Link"), self.__sendLink).setData(self.url())
821 menu.addSeparator() 828 menu.addSeparator()
822 # TODO: re-enable once User Agent is done 829 # TODO: User Agent
823 ## self.__userAgentMenu = UserAgentMenu(self.tr("User Agent"), 830 ## self.__userAgentMenu = UserAgentMenu(self.tr("User Agent"),
824 ## url=self.url()) 831 ## url=self.url())
825 ## menu.addMenu(self.__userAgentMenu) 832 ## menu.addMenu(self.__userAgentMenu)
826 ## menu.addSeparator() 833 ## menu.addSeparator()
827 menu.addAction(self.__mw.backAct) 834 menu.addAction(self.__mw.backAct)
839 self.tr("Send Text"), 846 self.tr("Send Text"),
840 self.__sendLink).setData(self.selectedText()) 847 self.__sendLink).setData(self.selectedText())
841 menu.addAction(self.__mw.findAct) 848 menu.addAction(self.__mw.findAct)
842 menu.addSeparator() 849 menu.addSeparator()
843 if self.selectedText(): 850 if self.selectedText():
844 # TODO: re-enable once Open Search is done 851 # TODO: Open Search
845 ## self.__searchMenu = menu.addMenu(self.tr("Search with...")) 852 ## self.__searchMenu = menu.addMenu(self.tr("Search with..."))
846 ## 853 ##
847 ## from .OpenSearch.OpenSearchEngineAction import \ 854 ## from .OpenSearch.OpenSearchEngineAction import \
848 ## OpenSearchEngineAction 855 ## OpenSearchEngineAction
849 ## engineNames = self.__mw.openSearchManager().allEnginesNames() 856 ## engineNames = self.__mw.openSearchManager().allEnginesNames()
854 ## self.__searchMenu.addAction(act) 861 ## self.__searchMenu.addAction(act)
855 ## self.__searchMenu.triggered.connect(self.__searchRequested) 862 ## self.__searchMenu.triggered.connect(self.__searchRequested)
856 ## 863 ##
857 ## menu.addSeparator() 864 ## menu.addSeparator()
858 865
859 # TODO: re-enable once Languages Dialog is done 866 # TODO: Languages Dialog
860 ## from .HelpLanguagesDialog import HelpLanguagesDialog 867 ## from .HelpLanguagesDialog import HelpLanguagesDialog
861 ## languages = Preferences.toList( 868 ## languages = Preferences.toList(
862 ## Preferences.Prefs.settings.value( 869 ## Preferences.Prefs.settings.value(
863 ## "Help/AcceptLanguages", 870 ## "Help/AcceptLanguages",
864 ## HelpLanguagesDialog.defaultAcceptLanguages())) 871 ## HelpLanguagesDialog.defaultAcceptLanguages()))
894 ## element.attribute("type", "text") == "text": 901 ## element.attribute("type", "text") == "text":
895 ## menu.addAction(self.tr("Add to web search toolbar"), 902 ## menu.addAction(self.tr("Add to web search toolbar"),
896 ## self.__addSearchEngine).setData(element) 903 ## self.__addSearchEngine).setData(element)
897 ## menu.addSeparator() 904 ## menu.addSeparator()
898 905
899 # TODO: re-enable once Web Inspector is done 906 # TODO: Web Inspector
900 ## menu.addAction( 907 ## menu.addAction(
901 ## UI.PixmapCache.getIcon("webInspector.png"), 908 ## UI.PixmapCache.getIcon("webInspector.png"),
902 ## self.tr("Web Inspector..."), self.__webInspector) 909 ## self.tr("Web Inspector..."), self.__webInspector)
903 910
904 menu.exec_(evt.globalPos()) 911 menu.exec_(evt.globalPos())
1304 """ 1311 """
1305 Protected method to handle wheel events. 1312 Protected method to handle wheel events.
1306 1313
1307 @param evt reference to the wheel event (QWheelEvent) 1314 @param evt reference to the wheel event (QWheelEvent)
1308 """ 1315 """
1309 if qVersion() >= "5.0.0": 1316 delta = evt.angleDelta().y()
1310 delta = evt.angleDelta().y()
1311 else:
1312 delta = evt.delta()
1313 if evt.modifiers() & Qt.ControlModifier: 1317 if evt.modifiers() & Qt.ControlModifier:
1314 if delta < 0: 1318 if delta < 0:
1315 self.zoomOut() 1319 self.zoomOut()
1316 else: 1320 else:
1317 self.zoomIn() 1321 self.zoomIn()
1326 evt.accept() 1330 evt.accept()
1327 return 1331 return
1328 1332
1329 super(WebBrowserView, self).wheelEvent(evt) 1333 super(WebBrowserView, self).wheelEvent(evt)
1330 1334
1331 def keyPressEvent(self, evt): 1335 ## def keyPressEvent(self, evt):
1332 """ 1336 ## """
1333 Protected method called by a key press. 1337 ## Protected method called by a key press.
1334 1338 ##
1335 @param evt reference to the key event (QKeyEvent) 1339 ## @param evt reference to the key event (QKeyEvent)
1336 """ 1340 ## """
1337 # TODO: PIM 1341 ## # TODO: PIM
1338 ## if self.__mw.personalInformationManager().viewKeyPressEvent(self, evt): 1342 #### if self.__mw.personalInformationManager().viewKeyPressEvent(self, evt):
1339 ## return 1343 #### return
1340 1344 ##
1341 # TODO: Access Keys 1345 ## # TODO: Access Keys
1342 ## if self.__enableAccessKeys: 1346 #### if self.__enableAccessKeys:
1343 ## self.__accessKeysPressed = ( 1347 #### self.__accessKeysPressed = (
1344 ## evt.modifiers() == Qt.ControlModifier and 1348 #### evt.modifiers() == Qt.ControlModifier and
1345 ## evt.key() == Qt.Key_Control) 1349 #### evt.key() == Qt.Key_Control)
1346 ## if not self.__accessKeysPressed: 1350 #### if not self.__accessKeysPressed:
1347 ## if self.__checkForAccessKey(evt): 1351 #### if self.__checkForAccessKey(evt):
1348 ## self.__hideAccessKeys() 1352 #### self.__hideAccessKeys()
1349 ## evt.accept() 1353 #### evt.accept()
1350 ## return 1354 #### return
1351 ## self.__hideAccessKeys() 1355 #### self.__hideAccessKeys()
1352 ## else: 1356 #### else:
1353 ## QTimer.singleShot(300, self.__accessKeyShortcut) 1357 #### QTimer.singleShot(300, self.__accessKeyShortcut)
1354 1358 ##
1355 self.__ctrlPressed = (evt.key() == Qt.Key_Control) 1359 ## self.__ctrlPressed = (evt.key() == Qt.Key_Control)
1356 super(WebBrowserView, self).keyPressEvent(evt) 1360 ## super(WebBrowserView, self).keyPressEvent(evt)
1357 1361 ##
1358 def keyReleaseEvent(self, evt): 1362 ## def keyReleaseEvent(self, evt):
1359 """ 1363 ## """
1360 Protected method called by a key release. 1364 ## Protected method called by a key release.
1361 1365 ##
1362 @param evt reference to the key event (QKeyEvent) 1366 ## @param evt reference to the key event (QKeyEvent)
1363 """ 1367 ## """
1364 # TODO: Access Keys 1368 ## # TODO: Access Keys
1365 ## if self.__enableAccessKeys: 1369 #### if self.__enableAccessKeys:
1366 ## self.__accessKeysPressed = evt.key() == Qt.Key_Control 1370 #### self.__accessKeysPressed = evt.key() == Qt.Key_Control
1367 1371 ##
1368 self.__ctrlPressed = False 1372 ## self.__ctrlPressed = False
1369 super(WebBrowserView, self).keyReleaseEvent(evt) 1373 ## super(WebBrowserView, self).keyReleaseEvent(evt)
1370 1374
1371 def focusOutEvent(self, evt): 1375 def focusOutEvent(self, evt):
1372 """ 1376 """
1373 Protected method called by a focus out event. 1377 Protected method called by a focus out event.
1374 1378
1407 else: 1411 else:
1408 scaleFactor = pinch.scaleFactor() 1412 scaleFactor = pinch.scaleFactor()
1409 self.__currentZoom = int(scaleFactor * 100) 1413 self.__currentZoom = int(scaleFactor * 100)
1410 self.__applyZoom() 1414 self.__applyZoom()
1411 evt.accept() 1415 evt.accept()
1416 ##bool WebView::eventFilter(QObject *obj, QEvent *event)
1417 ##{
1418 ## // Hack to find widget that receives input events
1419 ## if (obj == this && event->type() == QEvent::ChildAdded) {
1420 ## QWidget *child = qobject_cast<QWidget*>(static_cast<QChildEvent*>(event)->child());
1421 ## if (child && child->inherits("QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget")) {
1422 ## m_rwhvqt = child;
1423 ## m_rwhvqt->installEventFilter(this);
1424 ## }
1425 ## }
1426 ##
1427 ## // Forward events to WebView
1428 ## if (obj == m_rwhvqt) {
1429 ###define HANDLE_EVENT(f, t) \
1430 ## { \
1431 ## bool wasAccepted = event->isAccepted(); \
1432 ## event->setAccepted(false); \
1433 ## f(static_cast<t*>(event)); \
1434 ## bool ret = event->isAccepted(); \
1435 ## event->setAccepted(wasAccepted); \
1436 ## return ret; \
1437 ## }
1438 ##
1439 ## switch (event->type()) {
1440 ## case QEvent::KeyPress:
1441 ## HANDLE_EVENT(_keyPressEvent, QKeyEvent);
1442 ##
1443 ## case QEvent::KeyRelease:
1444 ## HANDLE_EVENT(_keyReleaseEvent, QKeyEvent);
1445 ##
1446 ## case QEvent::MouseButtonPress:
1447 ## HANDLE_EVENT(_mousePressEvent, QMouseEvent);
1448 ##
1449 ## case QEvent::MouseButtonRelease:
1450 ## HANDLE_EVENT(_mouseReleaseEvent, QMouseEvent);
1451 ##
1452 ## case QEvent::MouseMove:
1453 ## HANDLE_EVENT(_mouseMoveEvent, QMouseEvent);
1454 ##
1455 ## case QEvent::Wheel:
1456 ## HANDLE_EVENT(_wheelEvent, QWheelEvent);
1457 ##
1458 ## default:
1459 ## break;
1460 ## }
1461 ##
1462 ###undef HANDLE_EVENT
1463 ## }
1464 ##
1465 ## // Block already handled events
1466 ## if (obj == this) {
1467 ## switch (event->type()) {
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 ##}
1412 1483
1413 def clearHistory(self): 1484 def clearHistory(self):
1414 """ 1485 """
1415 Public slot to clear the history. 1486 Public slot to clear the history.
1416 """ 1487 """
1479 if Preferences.getHelp("ClickToFlashEnabled"): 1550 if Preferences.getHelp("ClickToFlashEnabled"):
1480 # this is a hack to make the ClickToFlash button appear 1551 # this is a hack to make the ClickToFlash button appear
1481 self.zoomIn() 1552 self.zoomIn()
1482 self.zoomOut() 1553 self.zoomOut()
1483 1554
1484 # TODO: ZoomManager 1555 # TODO: Zoom Manager
1485 ## zoomValue = Helpviewer.HelpWindow.HelpWindow.zoomManager()\ 1556 ## zoomValue = Helpviewer.HelpWindow.HelpWindow.zoomManager()\
1486 ## .zoomValue(self.url()) 1557 ## .zoomValue(self.url())
1487 ## self.setZoomValue(zoomValue) 1558 ## self.setZoomValue(zoomValue)
1488 1559
1489 if ok: 1560 if ok:
1865 1936
1866 ########################################################################### 1937 ###########################################################################
1867 ## RSS related methods below 1938 ## RSS related methods below
1868 ########################################################################### 1939 ###########################################################################
1869 1940
1870 # TODO: extract links from page to implement RSS stuff 1941 # TODO: RSS, extract links from page to implement RSS stuff
1871 ## def checkRSS(self): 1942 ## def checkRSS(self):
1872 ## """ 1943 ## """
1873 ## Public method to check, if the loaded page contains feed links. 1944 ## Public method to check, if the loaded page contains feed links.
1874 ## 1945 ##
1875 ## @return flag indicating the existence of feed links (boolean) 1946 ## @return flag indicating the existence of feed links (boolean)

eric ide

mercurial