eric7/WebBrowser/UserAgent/UserAgentMenu.py

branch
eric7
changeset 8312
800c432b34c8
parent 8218
7c09585bd960
child 8318
962bce857696
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/WebBrowser/UserAgent/UserAgentMenu.py	Sat May 15 18:45:04 2021 +0200
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a menu to select the user agent string.
+"""
+
+import os
+import functools
+
+from PyQt5.QtCore import QXmlStreamReader, QFile, QIODevice
+from PyQt5.QtWidgets import (
+    QMenu, QAction, QActionGroup, QInputDialog, QLineEdit
+)
+
+from E5Gui import E5MessageBox
+
+
+class UserAgentMenu(QMenu):
+    """
+    Class implementing a menu to select the user agent string.
+    """
+    def __init__(self, title, url=None, parent=None):
+        """
+        Constructor
+        
+        @param title title of the menu (string)
+        @param url URL to set user agent for (QUrl)
+        @param parent reference to the parent widget (QWidget)
+        """
+        super().__init__(title, parent)
+        
+        self.__manager = None
+        self.__url = url
+        if self.__url:
+            if self.__url.isValid():
+                from WebBrowser.WebBrowserWindow import WebBrowserWindow
+                self.__manager = WebBrowserWindow.userAgentsManager()
+            else:
+                self.__url = None
+        
+        self.aboutToShow.connect(self.__populateMenu)
+    
+    def __populateMenu(self):
+        """
+        Private slot to populate the menu.
+        """
+        self.aboutToShow.disconnect(self.__populateMenu)
+        
+        self.__actionGroup = QActionGroup(self)
+        
+        # add default action
+        self.__defaultUserAgent = QAction(self)
+        self.__defaultUserAgent.setText(self.tr("Default"))
+        self.__defaultUserAgent.setCheckable(True)
+        self.__defaultUserAgent.triggered.connect(
+            self.__switchToDefaultUserAgent)
+        if self.__url:
+            self.__defaultUserAgent.setChecked(
+                self.__manager.userAgentForUrl(self.__url) == "")
+        else:
+            from WebBrowser.WebBrowserPage import WebBrowserPage
+            self.__defaultUserAgent.setChecked(
+                WebBrowserPage.userAgent() == "")
+        self.addAction(self.__defaultUserAgent)
+        self.__actionGroup.addAction(self.__defaultUserAgent)
+        isChecked = self.__defaultUserAgent.isChecked()
+        
+        # add default extra user agents
+        isChecked = self.__addDefaultActions() or isChecked
+        
+        # add other action
+        self.addSeparator()
+        self.__otherUserAgent = QAction(self)
+        self.__otherUserAgent.setText(self.tr("Other..."))
+        self.__otherUserAgent.setCheckable(True)
+        self.__otherUserAgent.triggered.connect(
+            self.__switchToOtherUserAgent)
+        self.addAction(self.__otherUserAgent)
+        self.__actionGroup.addAction(self.__otherUserAgent)
+        self.__otherUserAgent.setChecked(not isChecked)
+    
+    def __switchToDefaultUserAgent(self):
+        """
+        Private slot to set the default user agent.
+        """
+        if self.__url:
+            self.__manager.removeUserAgent(self.__url.host())
+        else:
+            from WebBrowser.WebBrowserPage import WebBrowserPage
+            WebBrowserPage.setUserAgent("")
+    
+    def __switchToOtherUserAgent(self):
+        """
+        Private slot to set a custom user agent string.
+        """
+        from WebBrowser.WebBrowserPage import WebBrowserPage
+        userAgent, ok = QInputDialog.getText(
+            self,
+            self.tr("Custom user agent"),
+            self.tr("User agent:"),
+            QLineEdit.EchoMode.Normal,
+            WebBrowserPage.userAgent(resolveEmpty=True))
+        if ok:
+            if self.__url:
+                self.__manager.setUserAgentForUrl(self.__url, userAgent)
+            else:
+                WebBrowserPage.setUserAgent(userAgent)
+    
+    def __changeUserAgent(self, act):
+        """
+        Private slot to change the user agent.
+        
+        @param act reference to the action that triggered
+        @type QAction
+        """
+        if self.__url:
+            self.__manager.setUserAgentForUrl(self.__url, act.data())
+        else:
+            from WebBrowser.WebBrowserPage import WebBrowserPage
+            WebBrowserPage.setUserAgent(act.data())
+    
+    def __addDefaultActions(self):
+        """
+        Private slot to add the default user agent entries.
+        
+        @return flag indicating that a user agent entry is checked (boolean)
+        """
+        defaultUserAgents = QFile(os.path.join(
+            os.path.dirname(__file__), "UserAgentDefaults.xml"))
+        defaultUserAgents.open(QIODevice.OpenModeFlag.ReadOnly)
+        
+        menuStack = []
+        isChecked = False
+        
+        if self.__url:
+            currentUserAgentString = self.__manager.userAgentForUrl(self.__url)
+        else:
+            from WebBrowser.WebBrowserPage import WebBrowserPage
+            currentUserAgentString = WebBrowserPage.userAgent()
+        xml = QXmlStreamReader(defaultUserAgents)
+        while not xml.atEnd():
+            xml.readNext()
+            if xml.isStartElement() and xml.name() == "separator":
+                if menuStack:
+                    menuStack[-1].addSeparator()
+                else:
+                    self.addSeparator()
+                continue
+            
+            if xml.isStartElement() and xml.name() == "useragent":
+                attributes = xml.attributes()
+                title = attributes.value("description")
+                userAgent = attributes.value("useragent")
+                
+                act = QAction(self)
+                act.setText(title)
+                act.setData(userAgent)
+                act.setToolTip(userAgent)
+                act.setCheckable(True)
+                act.setChecked(userAgent == currentUserAgentString)
+                act.triggered.connect(
+                    functools.partial(self.__changeUserAgent, act))
+                if menuStack:
+                    menuStack[-1].addAction(act)
+                else:
+                    self.addAction(act)
+                self.__actionGroup.addAction(act)
+                isChecked = isChecked or act.isChecked()
+            
+            if xml.isStartElement() and xml.name() == "useragentmenu":
+                attributes = xml.attributes()
+                title = attributes.value("title")
+                if title == "v_a_r_i_o_u_s":
+                    title = self.tr("Various")
+                
+                menu = QMenu(self)
+                menu.setTitle(title)
+                self.addMenu(menu)
+                menuStack.append(menu)
+            
+            if xml.isEndElement() and xml.name() == "useragentmenu":
+                menuStack.pop()
+        
+        if xml.hasError():
+            E5MessageBox.critical(
+                self,
+                self.tr("Parsing default user agents"),
+                self.tr(
+                    """<p>Error parsing default user agents.</p><p>{0}</p>""")
+                .format(xml.errorString()))
+        
+        return isChecked

eric ide

mercurial