diff -r 33079db9e5ba -r ceabb30155b8 src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py --- a/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py Wed Dec 18 16:51:10 2024 +0100 +++ b/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py Wed Dec 18 16:52:16 2024 +0100 @@ -7,11 +7,19 @@ Module implementing the feature permission dialog. """ +import contextlib + from PyQt6.QtCore import Qt, pyqtSlot -from PyQt6.QtWebEngineCore import QWebEnginePage from PyQt6.QtWidgets import QAbstractItemView, QDialog, QTreeWidget, QTreeWidgetItem +try: + # Qt 6.8+ + from PyQt6.QtWebEngineCore import QWebEnginePermission +except ImportError: + # Qt <6.8 + from PyQt6.QtWebEngineCore import QWebEnginePage from eric7.EricGui import EricPixmapCache +from eric7.SystemUtilities import QtUtilities from .Ui_FeaturePermissionsDialog import Ui_FeaturePermissionsDialog @@ -26,8 +34,8 @@ Constructor @param featurePermissions dictionary with remembered feature - permissions - @type dict of dict of list + permissions (Qt <6.8) or a list of permission objects (Qt 6.8+) + @type dict of dict of list or list of QWebEnginePermission @param parent reference to the parent widget @type QWidget """ @@ -166,6 +174,36 @@ self.tr("Desktop Audio && Video"), ) + if QtUtilities.qVersionTuple() >= (6, 8, 0): + # Qt 6.8+ + self.clipboardList = QTreeWidget() + self.clipboardList.setAlternatingRowColors(True) + self.clipboardList.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) + self.clipboardList.setRootIsDecorated(False) + self.clipboardList.setItemsExpandable(False) + self.clipboardList.setAllColumnsShowFocus(True) + self.clipboardList.setObjectName("camList") + self.clipboardList.setSortingEnabled(True) + self.clipboardList.headerItem().setText(0, self.tr("Host")) + self.clipboardList.headerItem().setText(1, self.tr("Permission")) + self.tabWidget.addTab( + self.clipboardList, EricPixmapCache.getIcon("clipboard"), self.tr("Clipboard") + ) + + self.localFontsList = QTreeWidget() + self.localFontsList.setAlternatingRowColors(True) + self.localFontsList.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) + self.localFontsList.setRootIsDecorated(False) + self.localFontsList.setItemsExpandable(False) + self.localFontsList.setAllColumnsShowFocus(True) + self.localFontsList.setObjectName("camList") + self.localFontsList.setSortingEnabled(True) + self.localFontsList.headerItem().setText(0, self.tr("Host")) + self.localFontsList.headerItem().setText(1, self.tr("Permission")) + self.tabWidget.addTab( + self.localFontsList, EricPixmapCache.getIcon("font"), self.tr("Local Fonts") + ) + self.setTabOrder(self.tabWidget, self.notifList) self.setTabOrder(self.notifList, self.geoList) self.setTabOrder(self.geoList, self.micList) @@ -174,33 +212,74 @@ self.setTabOrder(self.micCamList, self.mouseLockList) self.setTabOrder(self.mouseLockList, self.deskVidList) self.setTabOrder(self.deskVidList, self.deskAudVidList) - self.setTabOrder(self.deskAudVidList, self.removeButton) + if QtUtilities.qVersionTuple() >= (6, 8, 0): + # Qt 6.8+ + self.setTabOrder(self.deskAudVidList, self.clipboardList) + self.setTabOrder(self.clipboardList, self.localFontsList) + self.setTabOrder(self.localFontsList, self.removeButton) + else: + self.setTabOrder(self.deskAudVidList, self.removeButton) self.setTabOrder(self.removeButton, self.removeAllButton) - self.__permissionStrings = { - QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: self.tr("Allow"), - QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: self.tr("Deny"), - } + if QtUtilities.qVersionTuple() >= (6, 8, 0): + # Qt 6.8+ + self.__permissionStrings = { + QWebEnginePermission.State.Granted: self.tr("Allow"), + QWebEnginePermission.State.Denied: self.tr("Deny"), + QWebEnginePermission.State.Ask: self.tr("Always Ask"), + QWebEnginePermission.State.Invalid: self.tr("Invalid"), + } - self.__permissionsLists = { - QWebEnginePage.Feature.Geolocation: self.geoList, - QWebEnginePage.Feature.MediaAudioCapture: self.micList, - QWebEnginePage.Feature.MediaVideoCapture: self.camList, - QWebEnginePage.Feature.MediaAudioVideoCapture: self.micCamList, - QWebEnginePage.Feature.MouseLock: self.mouseLockList, - QWebEnginePage.Feature.DesktopVideoCapture: self.deskVidList, - QWebEnginePage.Feature.DesktopAudioVideoCapture: self.deskAudVidList, - QWebEnginePage.Feature.Notifications: self.notifList, - } + self.__permissionsLists = { + QWebEnginePermission.PermissionType.Geolocation: self.geoList, + QWebEnginePermission.PermissionType.MediaAudioCapture: self.micList, + QWebEnginePermission.PermissionType.MediaVideoCapture: self.camList, + QWebEnginePermission.PermissionType.MediaAudioVideoCapture: self.micCamList, + QWebEnginePermission.PermissionType.MouseLock: self.mouseLockList, + QWebEnginePermission.PermissionType.DesktopVideoCapture: self.deskVidList, + QWebEnginePermission.PermissionType.DesktopAudioVideoCapture: self.deskAudVidList, + QWebEnginePermission.PermissionType.Notifications: self.notifList, + QWebEnginePermission.PermissionType.ClipboardReadWrite: self.clipboardList, + QWebEnginePermission.PermissionType.LocalFontsAccess: self.localFontsList, + } - for feature, permissionsList in self.__permissionsLists.items(): - for permission in featurePermissions[feature]: - for host in featurePermissions[feature][permission]: + for permission in featurePermissions: + with contextlib.suppress(KeyError): + permissionsList = self.__permissionsLists[permission.permissionType()] itm = QTreeWidgetItem( - permissionsList, [host, self.__permissionStrings[permission]] + permissionsList, [ + permission.origin().toString(), + self.__permissionStrings[permission.state()], + ] ) itm.setData(0, Qt.ItemDataRole.UserRole, permission) + else: + # Qt <6.8 + self.__permissionStrings = { + QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: self.tr("Allow"), + QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: self.tr("Deny"), + } + self.__permissionsLists = { + QWebEnginePage.Feature.Geolocation: self.geoList, + QWebEnginePage.Feature.MediaAudioCapture: self.micList, + QWebEnginePage.Feature.MediaVideoCapture: self.camList, + QWebEnginePage.Feature.MediaAudioVideoCapture: self.micCamList, + QWebEnginePage.Feature.MouseLock: self.mouseLockList, + QWebEnginePage.Feature.DesktopVideoCapture: self.deskVidList, + QWebEnginePage.Feature.DesktopAudioVideoCapture: self.deskAudVidList, + QWebEnginePage.Feature.Notifications: self.notifList, + } + + for feature, permissionsList in self.__permissionsLists.items(): + for permission in featurePermissions[feature]: + for host in featurePermissions[feature][permission]: + itm = QTreeWidgetItem( + permissionsList, [host, self.__permissionStrings[permission]] + ) + itm.setData(0, Qt.ItemDataRole.UserRole, permission) + + self.__removedPermissions = [] self.__previousCurrent = -1 self.tabWidget.currentChanged.connect(self.__currentTabChanged) self.tabWidget.setCurrentIndex(0) @@ -247,6 +326,7 @@ for itm in currentList.selectedItems(): row = currentList.indexOfTopLevelItem(itm) itm = currentList.takeTopLevelItem(row) + self.__removedPermissions.append(itm.data(0, Qt.ItemDataRole.UserRole)) del itm self.__updateButtons() @@ -258,6 +338,7 @@ currentList = self.tabWidget.currentWidget() while currentList.topLevelItemCount() > 0: itm = currentList.takeTopLevelItem(0) # __IGNORE_WARNING__ + self.__removedPermissions.append(itm.data(0, Qt.ItemDataRole.UserRole)) del itm self.__updateButtons() @@ -268,6 +349,7 @@ @return new feature permission settings @rtype dict of dict of list """ + # Qt <6.8 featurePermissions = {} for feature, permissionsList in self.__permissionsLists.items(): featurePermissions[feature] = { @@ -281,3 +363,11 @@ featurePermissions[feature][permission].append(host) return featurePermissions + + def persistChanges(self): + """ + Public method to persist the removed permissions. + """ + # Qt 6.8+ + for permission in self.__removedPermissions: + permission.reset()