WebBrowser/WebBrowserView.py

branch
QtWebEngine
changeset 4741
f9e1adc69076
parent 4735
84e78ee0f361
child 4744
ad3f6c1caf8d
equal deleted inserted replaced
4735:84e78ee0f361 4741:f9e1adc69076
20 from PyQt5.QtGui import QDesktopServices, QClipboard, QMouseEvent, QColor, \ 20 from PyQt5.QtGui import QDesktopServices, QClipboard, QMouseEvent, QColor, \
21 QPalette, QIcon, QContextMenuEvent 21 QPalette, QIcon, QContextMenuEvent
22 from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication, QInputDialog, \ 22 from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication, QInputDialog, \
23 QLineEdit, QLabel, QToolTip, QFrame, QDialog 23 QLineEdit, QLabel, QToolTip, QFrame, QDialog
24 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog 24 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog
25 from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest 25 from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest, QHostInfo
26 from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage 26 from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
27 27
28 from E5Gui import E5MessageBox, E5FileDialog 28 from E5Gui import E5MessageBox, E5FileDialog
29 29
30 import WebBrowser 30 import WebBrowser
31 from .WebBrowserPage import WebBrowserPage 31 from .WebBrowserPage import WebBrowserPage
32 32
33 from .Tools.WebIconLoader import WebIconLoader 33 from .Tools.WebIconLoader import WebIconLoader
34 from .Tools import WebBrowserTools, Scripts
35
36 from .Network.LoadRequest import LoadRequest, LoadRequestOperations
34 37
35 import Preferences 38 import Preferences
36 import UI.PixmapCache 39 import UI.PixmapCache
37 import Globals 40 import Globals
38 41
126 ## self.page().frameCreated.connect(self.__addExternalBinding) 129 ## self.page().frameCreated.connect(self.__addExternalBinding)
127 ## self.__addExternalBinding(self.page().mainFrame()) 130 ## self.__addExternalBinding(self.page().mainFrame())
128 131
129 ## self.page().databaseQuotaExceeded.connect(self.__databaseQuotaExceeded) 132 ## self.page().databaseQuotaExceeded.connect(self.__databaseQuotaExceeded)
130 133
131 # TODO: Open Search 134 self.__mw.openSearchManager().currentEngineChanged.connect(
132 ## self.__mw.openSearchManager().currentEngineChanged.connect( 135 self.__currentEngineChanged)
133 ## self.__currentEngineChanged)
134 136
135 self.setAcceptDrops(True) 137 self.setAcceptDrops(True)
136 138
137 # TODO: Access Keys 139 # TODO: Access Keys
138 ## self.__enableAccessKeys = Preferences.getWebBrowser("AccessKeysEnabled") 140 ## self.__enableAccessKeys = Preferences.getWebBrowser("AccessKeysEnabled")
188 ## # called from QWebPage.frameCreated 190 ## # called from QWebPage.frameCreated
189 ## frame.javaScriptWindowObjectCleared.connect( 191 ## frame.javaScriptWindowObjectCleared.connect(
190 ## self.__addExternalBinding) 192 ## self.__addExternalBinding)
191 ## frame.addToJavaScriptWindowObject("external", self.__javaScriptBinding) 193 ## frame.addToJavaScriptWindowObject("external", self.__javaScriptBinding)
192 ## 194 ##
193 ## def linkedResources(self, relation=""): 195 def __currentEngineChanged(self):
194 ## """ 196 """
195 ## Public method to extract linked resources. 197 Private slot to track a change of the current search engine.
196 ## 198 """
197 ## @param relation relation to extract (string) 199 if self.url().toString() == "eric:home":
198 ## @return list of linked resources (list of LinkedResource) 200 self.reload()
199 ## """
200 ## resources = []
201 ##
202 ## baseUrl = self.page().mainFrame().baseUrl()
203 ##
204 ## linkElements = self.page().mainFrame().findAllElements(
205 ## "html > head > link")
206 ##
207 ## for linkElement in linkElements.toList():
208 ## rel = linkElement.attribute("rel")
209 ## href = linkElement.attribute("href")
210 ## type_ = linkElement.attribute("type")
211 ## title = linkElement.attribute("title")
212 ##
213 ## if href == "" or type_ == "":
214 ## continue
215 ## if relation and rel != relation:
216 ## continue
217 ##
218 ## resource = LinkedResource()
219 ## resource.rel = rel
220 ## resource.type_ = type_
221 ## resource.href = baseUrl.resolved(
222 ## QUrl.fromEncoded(href.encode("utf-8")))
223 ## resource.title = title
224 ##
225 ## resources.append(resource)
226 ##
227 ## return resources
228 ##
229 ## def __currentEngineChanged(self):
230 ## """
231 ## Private slot to track a change of the current search engine.
232 ## """
233 ## if self.url().toString() == "eric:home":
234 ## self.reload()
235 201
236 def mainWindow(self): 202 def mainWindow(self):
237 """ 203 """
238 Public method to get a reference to the main window. 204 Public method to get a reference to the main window.
239 205
240 @return reference to the main window 206 @return reference to the main window
241 @rtype WebBrowserWindow 207 @rtype WebBrowserWindow
242 """ 208 """
243 return self.__mw 209 return self.__mw
210
211 def load(self, urlOrRequest):
212 """
213 Public method to load a web site.
214
215 @param urlOrRequest URL or request object
216 @type QUrl or LoadRequest
217 """
218 if isinstance(urlOrRequest, QUrl):
219 super(WebBrowserView, self).load(urlOrRequest)
220 elif isinstance(urlOrRequest, LoadRequest):
221 reqUrl = urlOrRequest.url()
222 if reqUrl.isEmpty():
223 return
224
225 if reqUrl.scheme() == "javascript":
226 script = reqUrl.toString()[11:]
227 # check if the javascript script is percent encode
228 # i.e. it contains '%' characters
229 if '%' in script:
230 script = QUrl.fromPercentEncoding(
231 QByteArray(script.encode("utf-8")))
232 self.page().runJavaScript(script)
233 return
234
235 if self.__isUrlValid(reqUrl):
236 self.loadRequest(urlOrRequest)
237 return
238
239 # ensure proper loading of hosts without a '.'
240 if not reqUrl.isEmpty() and \
241 reqUrl.scheme() and \
242 not WebBrowserTools.containsSpace(reqUrl.path()) and \
243 '.' not in reqUrl.path():
244 u = QUrl("http://" + reqUrl.path())
245 if u.isValid():
246 info = QHostInfo.fromName(u.path())
247 if info.error() == QHostInfo.NoError:
248 req = LoadRequest(urlOrRequest)
249 req.setUrl(u)
250 self.loadRequest(req)
251 return
252
253 def loadRequest(self, req):
254 """
255 Public method to load a page via a load request object.
256
257 @param req loaf request object
258 @type LoadRequest
259 """
260 if req.Operation == LoadRequestOperations.GetOperation:
261 self.load(req.url())
262 else:
263 self.page().runJavaScript(
264 Scripts.sendPostData(req.url(), req.data()))
244 265
245 # TODO: eliminate requestData, add param to get rid of __ctrlPressed 266 # TODO: eliminate requestData, add param to get rid of __ctrlPressed
246 def setSource(self, name, requestData=None): 267 def setSource(self, name, requestData=None):
247 """ 268 """
248 Public method used to set the source to be displayed. 269 Public method used to set the source to be displayed.
784 menu.addSeparator() 805 menu.addSeparator()
785 menu.addAction( 806 menu.addAction(
786 UI.PixmapCache.getIcon("mailSend.png"), 807 UI.PixmapCache.getIcon("mailSend.png"),
787 self.tr("Send Text"), 808 self.tr("Send Text"),
788 self.__sendLink).setData(self.selectedText()) 809 self.__sendLink).setData(self.selectedText())
789 # TODO: OpenSearch
790 # TODO: OpenSearch: add a search entry using the current engine 810 # TODO: OpenSearch: add a search entry using the current engine
791 ## self.__searchMenu = menu.addMenu(self.tr("Search with...")) 811 self.__searchMenu = menu.addMenu(self.tr("Search with..."))
792 ## 812
793 ## from .OpenSearch.OpenSearchEngineAction import \ 813 from .OpenSearch.OpenSearchEngineAction import \
794 ## OpenSearchEngineAction 814 OpenSearchEngineAction
795 ## engineNames = self.__mw.openSearchManager().allEnginesNames() 815 engineNames = self.__mw.openSearchManager().allEnginesNames()
796 ## for engineName in engineNames: 816 for engineName in engineNames:
797 ## engine = self.__mw.openSearchManager().engine(engineName) 817 engine = self.__mw.openSearchManager().engine(engineName)
798 ## act = OpenSearchEngineAction(engine, self.__searchMenu) 818 act = OpenSearchEngineAction(engine, self.__searchMenu)
799 ## act.setData(engineName) 819 act.setData(engineName)
800 ## self.__searchMenu.addAction(act) 820 self.__searchMenu.addAction(act)
801 ## self.__searchMenu.triggered.connect(self.__searchRequested) 821 self.__searchMenu.triggered.connect(self.__searchRequested)
802 ## 822
803 ## menu.addSeparator() 823 menu.addSeparator()
804 824
805 # TODO: Languages Dialog 825 # TODO: Languages Dialog
806 ## from .HelpLanguagesDialog import HelpLanguagesDialog 826 ## from .HelpLanguagesDialog import HelpLanguagesDialog
807 ## languages = Preferences.toList( 827 ## languages = Preferences.toList(
808 ## Preferences.Prefs.settings.value( 828 ## Preferences.Prefs.settings.value(
1072 """ 1092 """
1073 Private slot to add a new search engine. 1093 Private slot to add a new search engine.
1074 """ 1094 """
1075 from .Tools import Scripts 1095 from .Tools import Scripts
1076 script = Scripts.getFormData(self.__clickedPos) 1096 script = Scripts.getFormData(self.__clickedPos)
1077 # TODO: OpenSearch: add ew method 1097 self.page().runJavaScript(
1078 ## self.page().runJavaScript( 1098 script,
1079 ## script, 1099 lambda res: self.__mw.openSearchManager().addEngineFromForm(
1080 ## lambda res: self.__mw.openSearchManager().addEngineFromForm( 1100 res, self))
1081 ## res, self))
1082 1101
1083 # TODO: WebInspector 1102 # TODO: WebInspector
1084 ## def __webInspector(self): 1103 ## def __webInspector(self):
1085 ## """ 1104 ## """
1086 ## Private slot to show the web inspector window. 1105 ## Private slot to show the web inspector window.

eric ide

mercurial