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

eric ide

mercurial