WebBrowser/WebBrowserView.py

branch
QtWebEngine
changeset 4731
67d861d9e492
parent 4729
fc8d00860717
child 4732
5ac4fc1dfc20
equal deleted inserted replaced
4729:fc8d00860717 4731:67d861d9e492
81 super(WebBrowserView, self).__init__(parent) 81 super(WebBrowserView, self).__init__(parent)
82 self.setObjectName(name) 82 self.setObjectName(name)
83 83
84 self.__rwhvqt = None 84 self.__rwhvqt = None
85 self.installEventFilter(self) 85 self.installEventFilter(self)
86 ## 86
87 # TODO: Speeddial
87 ## import Helpviewer.HelpWindow 88 ## import Helpviewer.HelpWindow
88 ## self.__speedDial = Helpviewer.HelpWindow.HelpWindow.speedDial() 89 ## self.__speedDial = Helpviewer.HelpWindow.HelpWindow.speedDial()
89 90
90 self.__page = WebBrowserPage(self) 91 self.__page = WebBrowserPage(self)
91 self.setPage(self.__page) 92 self.setPage(self.__page)
367 368
368 def home(self): 369 def home(self):
369 """ 370 """
370 Public slot to move to the first page loaded. 371 Public slot to move to the first page loaded.
371 """ 372 """
372 ## homeUrl = QUrl("http://localhost")
373 ## # TODO: eric: scheme or Configuration page
374 homeUrl = QUrl(Preferences.getWebBrowser("HomePage")) 373 homeUrl = QUrl(Preferences.getWebBrowser("HomePage"))
375 self.setSource(homeUrl) 374 self.setSource(homeUrl)
376 self.__urlChanged(self.history().currentItem().url()) 375 self.__urlChanged(self.history().currentItem().url())
377 376
378 def reload(self): 377 def reload(self):
544 if callback is None: 543 if callback is None:
545 self.findText(txt, findFlags) 544 self.findText(txt, findFlags)
546 else: 545 else:
547 self.findText(txt, findFlags, callback) 546 self.findText(txt, findFlags, callback)
548 547
549 # TODO: WebBrowserWebElement
550 ## def __isMediaElement(self, element):
551 ## """
552 ## Private method to check, if the given element is a media element.
553 ##
554 ## @param element element to be checked (QWebElement)
555 ## @return flag indicating a media element (boolean)
556 ## """
557 ## return element.tagName().lower() in ["video", "audio"]
558
559 def contextMenuEvent(self, evt): 548 def contextMenuEvent(self, evt):
560 """ 549 """
561 Public method called to create a context menu. 550 Public method called to create a context menu.
562 551
563 This method is overridden from QWebEngineView. 552 This method is overridden from QWebEngineView.
571 0, 560 0,
572 lambda: self._contextMenuEvent(QContextMenuEvent(reason, pos))) 561 lambda: self._contextMenuEvent(QContextMenuEvent(reason, pos)))
573 # needs to be done this way because contextMenuEvent is blocking 562 # needs to be done this way because contextMenuEvent is blocking
574 # the main loop 563 # the main loop
575 564
576 # TODO: re-arrange the menu creation stuff to better adjust to the current situation
577 def _contextMenuEvent(self, evt): 565 def _contextMenuEvent(self, evt):
578 """ 566 """
579 Protected method called to create a context menu. 567 Protected method called to create a context menu.
580 568
581 This method is overridden from QWebEngineView. 569 This method is overridden from QWebEngineView.
631 menu.addAction(self.__mw.pasteAct) 619 menu.addAction(self.__mw.pasteAct)
632 # TODO: PIM 620 # TODO: PIM
633 ## menu.addSeparator() 621 ## menu.addSeparator()
634 ## self.__mw.personalInformationManager().createSubMenu(menu, self, hit) 622 ## self.__mw.personalInformationManager().createSubMenu(menu, self, hit)
635 623
636 # TODO: complete this context menu action 624 if hitTest.tagName() == "input":
637 ## if hitTest.tagName() == "input": 625 menu.addSeparator()
638 ## act = menu.addAction("") 626 act = menu.addAction("")
639 ## act.setVisible(False) 627 act.setVisible(False)
640 ## self.__checkForForm(act, hitTest.pos()) 628 self.__checkForForm(act, hitTest.pos())
641 629
642 if self.selectedText(): 630 if self.selectedText():
643 self.__createSelectedTextContextMenu(menu, hitTest) 631 self.__createSelectedTextContextMenu(menu, hitTest)
644 632
645 if self.__menu.isEmpty(): 633 if self.__menu.isEmpty():
890 menu.addAction(self.__mw.zoomOutAct) 878 menu.addAction(self.__mw.zoomOutAct)
891 menu.addSeparator() 879 menu.addSeparator()
892 menu.addAction(self.__mw.selectAllAct) 880 menu.addAction(self.__mw.selectAllAct)
893 menu.addSeparator() 881 menu.addSeparator()
894 menu.addAction(self.__mw.findAct) 882 menu.addAction(self.__mw.findAct)
895 883 menu.addSeparator()
896 # TODO: OpenSearch 884 menu.addAction(self.__mw.pageSourceAct)
897 ## 885 # TODO: Site Info
898 ## element = hit.element() 886 ## menu.addSeparator()
899 ## if not element.isNull() and \ 887 ## menu.addAction(self.__mw.siteInfoAct)
900 ## element.tagName().lower() == "input" and \ 888
901 ## element.attribute("type", "text") == "text": 889 def __checkForForm(self, act, pos):
902 ## menu.addAction(self.tr("Add to web search toolbar"), 890 """
903 ## self.__addSearchEngine).setData(element) 891 Private method to check the given position for an open search form.
904 ## menu.addSeparator() 892
893 @param act reference to the action to be populated upon success
894 @type QAction
895 @param pos position to be tested
896 @type QPoint
897 """
898 self.__clickedPos = pos
899
900 from .Tools import Scripts
901 script = Scripts.getFormData(pos)
902 self.page().runJavaScript(
903 script, lambda res: self.__checkForFormCallback(res, act))
904
905 def __checkForFormCallback(self, res, act):
906 """
907 Private method handling the __checkForForm result.
908
909 @param res result dictionary generated by JavaScript
910 @type dict
911 @param act reference to the action to be populated upon success
912 @type QAction
913 """
914 if act is None or not bool(res):
915 return
916
917 url = QUrl(res["action"])
918 method = res["method"]
919
920 if not url.isEmpty() and method in ["get", "post"]:
921 act.setVisible(True)
922 act.setText(self.tr("Add to web search toolbar"))
923 act.triggered.connect(self.__addSearchEngine)
905 924
906 def __isUrlValid(self, url): 925 def __isUrlValid(self, url):
907 """ 926 """
908 Private method to check a URL for validity. 927 Private method to check a URL for validity.
909 928
1049 ## 1068 ##
1050 ## engineName = act.data() 1069 ## engineName = act.data()
1051 ## if engineName: 1070 ## if engineName:
1052 ## engine = self.__mw.openSearchManager().engine(engineName) 1071 ## engine = self.__mw.openSearchManager().engine(engineName)
1053 ## self.search.emit(engine.searchUrl(searchText)) 1072 ## self.search.emit(engine.searchUrl(searchText))
1054 ## 1073
1055 ## def __addSearchEngine(self): 1074 def __addSearchEngine(self):
1056 ## """ 1075 """
1057 ## Private slot to add a new search engine. 1076 Private slot to add a new search engine.
1058 ## """ 1077 """
1059 ## act = self.sender() 1078 from .Tools import Scripts
1060 ## if act is None: 1079 script = Scripts.getFormData(self.__clickedPos)
1061 ## return 1080 # TODO: OpenSearch: add ew method
1062 ## 1081 ## self.page().runJavaScript(
1063 ## element = act.data() 1082 ## script,
1064 ## elementName = element.attribute("name") 1083 ## lambda res: self.__mw.openSearchManager().addEngineFromForm(
1065 ## formElement = QWebElement(element) 1084 ## res, self))
1066 ## while formElement.tagName().lower() != "form":
1067 ## formElement = formElement.parent()
1068 ##
1069 ## if formElement.isNull() or \
1070 ## formElement.attribute("action") == "":
1071 ## return
1072 ##
1073 ## method = formElement.attribute("method", "get").lower()
1074 ## if method != "get":
1075 ## E5MessageBox.warning(
1076 ## self,
1077 ## self.tr("Method not supported"),
1078 ## self.tr(
1079 ## """{0} method is not supported.""").format(method.upper()))
1080 ## return
1081 ##
1082 ## searchUrl = QUrl(self.page().mainFrame().baseUrl().resolved(
1083 ## QUrl(formElement.attribute("action"))))
1084 ## if searchUrl.scheme() != "http":
1085 ## return
1086 ##
1087 ## if qVersion() >= "5.0.0":
1088 ## from PyQt5.QtCore import QUrlQuery
1089 ## searchUrlQuery = QUrlQuery(searchUrl)
1090 ## searchEngines = {}
1091 ## inputFields = formElement.findAll("input")
1092 ## for inputField in inputFields.toList():
1093 ## type_ = inputField.attribute("type", "text")
1094 ## name = inputField.attribute("name")
1095 ## value = inputField.evaluateJavaScript("this.value")
1096 ##
1097 ## if type_ == "submit":
1098 ## searchEngines[value] = name
1099 ## elif type_ == "text":
1100 ## if inputField == element:
1101 ## value = "{searchTerms}"
1102 ## if qVersion() >= "5.0.0":
1103 ## searchUrlQuery.addQueryItem(name, value)
1104 ## else:
1105 ## searchUrl.addQueryItem(name, value)
1106 ## elif type_ == "checkbox" or type_ == "radio":
1107 ## if inputField.evaluateJavaScript("this.checked"):
1108 ## if qVersion() >= "5.0.0":
1109 ## searchUrlQuery.addQueryItem(name, value)
1110 ## else:
1111 ## searchUrl.addQueryItem(name, value)
1112 ## elif type_ == "hidden":
1113 ## if qVersion() >= "5.0.0":
1114 ## searchUrlQuery.addQueryItem(name, value)
1115 ## else:
1116 ## searchUrl.addQueryItem(name, value)
1117 ##
1118 ## selectFields = formElement.findAll("select")
1119 ## for selectField in selectFields.toList():
1120 ## name = selectField.attribute("name")
1121 ## selectedIndex = selectField.evaluateJavaScript(
1122 ## "this.selectedIndex")
1123 ## if selectedIndex == -1:
1124 ## continue
1125 ##
1126 ## options = selectField.findAll("option")
1127 ## value = options.at(selectedIndex).toPlainText()
1128 ## if qVersion() >= "5.0.0":
1129 ## searchUrlQuery.addQueryItem(name, value)
1130 ## else:
1131 ## searchUrl.addQueryItem(name, value)
1132 ##
1133 ## ok = True
1134 ## if len(searchEngines) > 1:
1135 ## searchEngine, ok = QInputDialog.getItem(
1136 ## self,
1137 ## self.tr("Search engine"),
1138 ## self.tr("Choose the desired search engine"),
1139 ## sorted(searchEngines.keys()), 0, False)
1140 ##
1141 ## if not ok:
1142 ## return
1143 ##
1144 ## if searchEngines[searchEngine] != "":
1145 ## if qVersion() >= "5.0.0":
1146 ## searchUrlQuery.addQueryItem(
1147 ## searchEngines[searchEngine], searchEngine)
1148 ## else:
1149 ## searchUrl.addQueryItem(
1150 ## searchEngines[searchEngine], searchEngine)
1151 ## engineName = ""
1152 ## labels = formElement.findAll('label[for="{0}"]'.format(elementName))
1153 ## if labels.count() > 0:
1154 ## engineName = labels.at(0).toPlainText()
1155 ##
1156 ## engineName, ok = QInputDialog.getText(
1157 ## self,
1158 ## self.tr("Engine name"),
1159 ## self.tr("Enter a name for the engine"),
1160 ## QLineEdit.Normal,
1161 ## engineName)
1162 ## if not ok:
1163 ## return
1164 ##
1165 ## if qVersion() >= "5.0.0":
1166 ## searchUrl.setQuery(searchUrlQuery)
1167 ##
1168 ## from .OpenSearch.OpenSearchEngine import OpenSearchEngine
1169 ## engine = OpenSearchEngine()
1170 ## engine.setName(engineName)
1171 ## engine.setDescription(engineName)
1172 ## engine.setSearchUrlTemplate(searchUrl.toString())
1173 ## engine.setImage(self.icon().pixmap(16, 16).toImage())
1174 ##
1175 ## self.__mw.openSearchManager().addEngine(engine)
1176 1085
1177 # TODO: WebInspector 1086 # TODO: WebInspector
1178 ## def __webInspector(self): 1087 ## def __webInspector(self):
1179 ## """ 1088 ## """
1180 ## Private slot to show the web inspector window. 1089 ## Private slot to show the web inspector window.
1369 ## self.__hideAccessKeys() 1278 ## self.__hideAccessKeys()
1370 ## self.__accessKeysPressed = False 1279 ## self.__accessKeysPressed = False
1371 1280
1372 super(WebBrowserView, self).focusOutEvent(evt) 1281 super(WebBrowserView, self).focusOutEvent(evt)
1373 1282
1374 # TODO: Obsoleted by eventFilter() (?) 1283 # TODO: Gestures: Obsoleted by eventFilter() (?)
1375 ## def event(self, evt): 1284 ## def event(self, evt):
1376 ## """ 1285 ## """
1377 ## Public method handling events. 1286 ## Public method handling events.
1378 ## 1287 ##
1379 ## @param evt reference to the event (QEvent) 1288 ## @param evt reference to the event (QEvent)
1569 zoomValue = ZoomManager.instance().zoomValue(self.url()) 1478 zoomValue = ZoomManager.instance().zoomValue(self.url())
1570 self.setZoomValue(zoomValue) 1479 self.setZoomValue(zoomValue)
1571 1480
1572 if ok: 1481 if ok:
1573 pass 1482 pass
1483 # TODO: History
1484 ## self.__mw.historyManager().addHistoryEntry(self.url())
1574 # TODO: AdBlock 1485 # TODO: AdBlock
1575 ## self.__mw.adBlockManager().page().hideBlockedPageEntries(self.page()) 1486 ## self.__mw.adBlockManager().page().hideBlockedPageEntries(self.page())
1576 # TODO: Password Manager 1487 # TODO: Password Manager
1577 ## self.__mw.passwordManager().fill(self.page()) 1488 ## self.__mw.passwordManager().fill(self.page())
1578 1489

eric ide

mercurial