eric6/WebBrowser/GreaseMonkey/GreaseMonkeyDownloader.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the downloader for GreaseMonkey scripts.
8 """
9
10 from __future__ import unicode_literals
11
12 import os
13
14 from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QSettings, QFileInfo
15 from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest
16
17 from WebBrowser.WebBrowserWindow import WebBrowserWindow
18
19
20 class GreaseMonkeyDownloader(QObject):
21 """
22 Class implementing the downloader for GreaseMonkey scripts.
23
24 @signal finished(fileName) emitted to indicate the end of a script download
25 (str)
26 @signal error() emitted to indicate a script download error
27 """
28 finished = pyqtSignal(str)
29 error = pyqtSignal()
30
31 DownloadMainScript = 1
32 DownloadRequireScript = 2
33
34 def __init__(self, url, manager, mode):
35 """
36 Constructor
37
38 @param url URL to download script from
39 @type QUrl
40 @param manager reference to the GreaseMonkey manager
41 @type GreaseMonkeyManager
42 @param mode download mode
43 @type int (one of DownloadMainScript, DownloadRequireScript)
44 """
45 super(GreaseMonkeyDownloader, self).__init__()
46
47 self.__manager = manager
48
49 self.__reply = WebBrowserWindow.networkManager().get(
50 QNetworkRequest(url))
51 if mode == GreaseMonkeyDownloader.DownloadMainScript:
52 self.__reply.finished.connect(self.__scriptDownloaded)
53 else:
54 self.__reply.finished.connect(self.__requireDownloaded)
55
56 self.__fileName = ""
57
58 def updateScript(self, fileName):
59 """
60 Public method to set the file name for the script to be downloaded.
61
62 @param fileName file name for the script
63 @type str
64 """
65 self.__fileName = fileName
66
67 @pyqtSlot()
68 def __scriptDownloaded(self):
69 """
70 Private slot to handle the finished download of a script.
71 """
72 self.deleteLater()
73 self.__reply.deleteLater()
74
75 if self.__reply.error() != QNetworkReply.NoError:
76 self.error.emit()
77 return
78
79 response = bytes(self.__reply.readAll()).decode()
80
81 if "// ==UserScript==" not in response:
82 self.error.emit()
83 return
84
85 if not self.__fileName:
86 from WebBrowser.Tools import WebBrowserTools
87 filePath = os.path.join(
88 self.__manager.scriptsDirectory(),
89 WebBrowserTools.getFileNameFromUrl(self.__reply.url()))
90 self.__fileName = WebBrowserTools.ensureUniqueFilename(filePath)
91
92 try:
93 f = open(self.__fileName, "w", encoding="utf-8")
94 except (IOError, OSError):
95 self.error.emit()
96 return
97 f.write(response)
98 f.close()
99
100 self.finished.emit(self.__fileName)
101
102 @pyqtSlot()
103 def __requireDownloaded(self):
104 """
105 Private slot to handle the finished download of a required script.
106 """
107 self.deleteLater()
108 self.__reply.deleteLater()
109
110 if self.__reply.error() != QNetworkReply.NoError:
111 self.error.emit()
112 return
113
114 response = bytes(self.__reply.readAll()).decode()
115
116 if not response:
117 self.error.emit()
118 return
119
120 settings = QSettings(
121 os.path.join(self.__manager.requireScriptsDirectory(),
122 "requires.ini"),
123 QSettings.IniFormat)
124 settings.beginGroup("Files")
125
126 if not self.__fileName:
127 self.__fileName = settings.value(
128 self.__reply.request().url().toString())
129 if not self.__fileName:
130 name = QFileInfo(self.__reply.request().url().path())\
131 .fileName()
132 if not name:
133 name = "require.js"
134 elif not name.endswith(".js"):
135 name += ".js"
136 filePath = os.path.join(
137 self.__manager.requireScriptsDirectory(), name)
138 from WebBrowser.Tools import WebBrowserTools
139 self.__fileName = WebBrowserTools.ensureUniqueFilename(
140 filePath, "{0}")
141 if not QFileInfo(self.__fileName).isAbsolute():
142 self.__fileName = os.path.join(
143 self.__manager.requireScriptsDirectory(),
144 self.__fileName)
145
146 try:
147 f = open(self.__fileName, "w", encoding="utf-8")
148 except (IOError, OSError):
149 self.error.emit()
150 return
151 f.write(response)
152 f.close()
153
154 settings.setValue(self.__reply.request().url().toString(),
155 QFileInfo(self.__fileName).fileName())
156
157 self.finished.emit(self.__fileName)

eric ide

mercurial