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 ## |
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"), |
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()) |
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 """ |
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) |