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. |