eric7/WebBrowser/UserAgent/UserAgentMenu.py

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

eric ide

mercurial