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