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