WebBrowser/UserAgent/UserAgentMenu.py

branch
QtWebEngine
changeset 4906
939ff20f712d
parent 4631
5c1a96925da4
child 5389
9b1c800daff3
equal deleted inserted replaced
4905:09f38f85a3af 4906:939ff20f712d
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 - 2016 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):
111 """
112 Private slot to change the user agent.
113 """
114 act = self.sender()
115 if self.__url:
116 self.__manager.setUserAgentForUrl(self.__url, act.data())
117 else:
118 from WebBrowser.WebBrowserPage import WebBrowserPage
119 WebBrowserPage.setUserAgent(act.data())
120
121 def __addDefaultActions(self):
122 """
123 Private slot to add the default user agent entries.
124
125 @return flag indicating that a user agent entry is checked (boolean)
126 """
127 from . import UserAgentDefaults_rc # __IGNORE_WARNING__
128 defaultUserAgents = QFile(":/UserAgentDefaults.xml")
129 defaultUserAgents.open(QIODevice.ReadOnly)
130
131 menuStack = []
132 isChecked = False
133
134 if self.__url:
135 currentUserAgentString = self.__manager.userAgentForUrl(self.__url)
136 else:
137 from WebBrowser.WebBrowserPage import WebBrowserPage
138 currentUserAgentString = WebBrowserPage.userAgent()
139 xml = QXmlStreamReader(defaultUserAgents)
140 while not xml.atEnd():
141 xml.readNext()
142 if xml.isStartElement() and xml.name() == "separator":
143 if menuStack:
144 menuStack[-1].addSeparator()
145 else:
146 self.addSeparator()
147 continue
148
149 if xml.isStartElement() and xml.name() == "useragent":
150 attributes = xml.attributes()
151 title = attributes.value("description")
152 userAgent = attributes.value("useragent")
153
154 act = QAction(self)
155 act.setText(title)
156 act.setData(userAgent)
157 act.setToolTip(userAgent)
158 act.setCheckable(True)
159 act.setChecked(userAgent == currentUserAgentString)
160 act.triggered.connect(self.__changeUserAgent)
161 if menuStack:
162 menuStack[-1].addAction(act)
163 else:
164 self.addAction(act)
165 self.__actionGroup.addAction(act)
166 isChecked = isChecked or act.isChecked()
167
168 if xml.isStartElement() and xml.name() == "useragentmenu":
169 attributes = xml.attributes()
170 title = attributes.value("title")
171 if title == "v_a_r_i_o_u_s":
172 title = self.tr("Various")
173
174 menu = QMenu(self)
175 menu.setTitle(title)
176 self.addMenu(menu)
177 menuStack.append(menu)
178
179 if xml.isEndElement() and xml.name() == "useragentmenu":
180 menuStack.pop()
181
182 if xml.hasError():
183 E5MessageBox.critical(
184 self,
185 self.tr("Parsing default user agents"),
186 self.tr(
187 """<p>Error parsing default user agents.</p><p>{0}</p>""")
188 .format(xml.errorString()))
189
190 return isChecked

eric ide

mercurial