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