src/eric7/WebBrowser/UserAgent/UserAgentMenu.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
equal deleted inserted replaced
9208:3fc8dfeb6ebe 9209:b99e7fd55fd3
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a menu to select the user agent string.
8 """
9
10 import os
11 import functools
12
13 from PyQt6.QtCore import QXmlStreamReader, QFile, QIODevice
14 from PyQt6.QtGui import QAction, QActionGroup
15 from PyQt6.QtWidgets import QMenu, QInputDialog, QLineEdit
16
17 from EricWidgets import EricMessageBox
18
19
20 class UserAgentMenu(QMenu):
21 """
22 Class implementing a menu to select the user agent string.
23 """
24 def __init__(self, title, url=None, parent=None):
25 """
26 Constructor
27
28 @param title title of the menu (string)
29 @param url URL to set user agent for (QUrl)
30 @param parent reference to the parent widget (QWidget)
31 """
32 super().__init__(title, parent)
33
34 self.__manager = None
35 self.__url = url
36 if self.__url:
37 if self.__url.isValid():
38 from WebBrowser.WebBrowserWindow import WebBrowserWindow
39 self.__manager = WebBrowserWindow.userAgentsManager()
40 else:
41 self.__url = None
42
43 self.aboutToShow.connect(self.__populateMenu)
44
45 def __populateMenu(self):
46 """
47 Private slot to populate the menu.
48 """
49 self.aboutToShow.disconnect(self.__populateMenu)
50
51 self.__actionGroup = QActionGroup(self)
52
53 # add default action
54 self.__defaultUserAgent = QAction(self)
55 self.__defaultUserAgent.setText(self.tr("Default"))
56 self.__defaultUserAgent.setCheckable(True)
57 self.__defaultUserAgent.triggered.connect(
58 self.__switchToDefaultUserAgent)
59 if self.__url:
60 self.__defaultUserAgent.setChecked(
61 self.__manager.userAgentForUrl(self.__url) == "")
62 else:
63 from WebBrowser.WebBrowserPage import WebBrowserPage
64 self.__defaultUserAgent.setChecked(
65 WebBrowserPage.userAgent() == "")
66 self.addAction(self.__defaultUserAgent)
67 self.__actionGroup.addAction(self.__defaultUserAgent)
68 isChecked = self.__defaultUserAgent.isChecked()
69
70 # add default extra user agents
71 isChecked = self.__addDefaultActions() or isChecked
72
73 # add other action
74 self.addSeparator()
75 self.__otherUserAgent = QAction(self)
76 self.__otherUserAgent.setText(self.tr("Other..."))
77 self.__otherUserAgent.setCheckable(True)
78 self.__otherUserAgent.triggered.connect(
79 self.__switchToOtherUserAgent)
80 self.addAction(self.__otherUserAgent)
81 self.__actionGroup.addAction(self.__otherUserAgent)
82 self.__otherUserAgent.setChecked(not isChecked)
83
84 def __switchToDefaultUserAgent(self):
85 """
86 Private slot to set the default user agent.
87 """
88 if self.__url:
89 self.__manager.removeUserAgent(self.__url.host())
90 else:
91 from WebBrowser.WebBrowserPage import WebBrowserPage
92 WebBrowserPage.setUserAgent("")
93
94 def __switchToOtherUserAgent(self):
95 """
96 Private slot to set a custom user agent string.
97 """
98 from WebBrowser.WebBrowserPage import WebBrowserPage
99 userAgent, ok = QInputDialog.getText(
100 self,
101 self.tr("Custom user agent"),
102 self.tr("User agent:"),
103 QLineEdit.EchoMode.Normal,
104 WebBrowserPage.userAgent(resolveEmpty=True))
105 if ok:
106 if self.__url:
107 self.__manager.setUserAgentForUrl(self.__url, userAgent)
108 else:
109 WebBrowserPage.setUserAgent(userAgent)
110
111 def __changeUserAgent(self, act):
112 """
113 Private slot to change the user agent.
114
115 @param act reference to the action that triggered
116 @type QAction
117 """
118 if self.__url:
119 self.__manager.setUserAgentForUrl(self.__url, act.data())
120 else:
121 from WebBrowser.WebBrowserPage import WebBrowserPage
122 WebBrowserPage.setUserAgent(act.data())
123
124 def __addDefaultActions(self):
125 """
126 Private slot to add the default user agent entries.
127
128 @return flag indicating that a user agent entry is checked (boolean)
129 """
130 defaultUserAgents = QFile(os.path.join(
131 os.path.dirname(__file__), "UserAgentDefaults.xml"))
132 defaultUserAgents.open(QIODevice.OpenModeFlag.ReadOnly)
133
134 menuStack = []
135 isChecked = False
136
137 if self.__url:
138 currentUserAgentString = self.__manager.userAgentForUrl(self.__url)
139 else:
140 from WebBrowser.WebBrowserPage import WebBrowserPage
141 currentUserAgentString = WebBrowserPage.userAgent()
142 xml = QXmlStreamReader(defaultUserAgents)
143 while not xml.atEnd():
144 xml.readNext()
145 if xml.isStartElement() and xml.name() == "separator":
146 if menuStack:
147 menuStack[-1].addSeparator()
148 else:
149 self.addSeparator()
150 continue
151
152 if xml.isStartElement() and xml.name() == "useragent":
153 attributes = xml.attributes()
154 title = attributes.value("description")
155 userAgent = attributes.value("useragent")
156
157 act = QAction(self)
158 act.setText(title)
159 act.setData(userAgent)
160 act.setToolTip(userAgent)
161 act.setCheckable(True)
162 act.setChecked(userAgent == currentUserAgentString)
163 act.triggered.connect(
164 functools.partial(self.__changeUserAgent, act))
165 if menuStack:
166 menuStack[-1].addAction(act)
167 else:
168 self.addAction(act)
169 self.__actionGroup.addAction(act)
170 isChecked = isChecked or act.isChecked()
171
172 if xml.isStartElement() and xml.name() == "useragentmenu":
173 attributes = xml.attributes()
174 title = attributes.value("title")
175 if title == "v_a_r_i_o_u_s":
176 title = self.tr("Various")
177
178 menu = QMenu(self)
179 menu.setTitle(title)
180 self.addMenu(menu)
181 menuStack.append(menu)
182
183 if xml.isEndElement() and xml.name() == "useragentmenu":
184 menuStack.pop()
185
186 if xml.hasError():
187 EricMessageBox.critical(
188 self,
189 self.tr("Parsing default user agents"),
190 self.tr(
191 """<p>Error parsing default user agents.</p><p>{0}</p>""")
192 .format(xml.errorString()))
193
194 return isChecked

eric ide

mercurial