src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyDownloader.py

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

eric ide

mercurial