--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Helpviewer/FeaturePermissions/FeaturePermissionManager.py Thu Aug 06 19:01:39 2015 +0200 @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the feature permission manager object. +""" + +from __future__ import unicode_literals + +from PyQt5.QtCore import QObject +from PyQt5.QtWebKitWidgets import QWebPage + +import Globals +import Preferences + + +class FeaturePermissionManager(QObject): + """ + Class implementing the feature permission manager object. + """ + SettingsKeyFormat = "Help/FeaturePermissions/{0}" + + def __init__(self, parent=None): + """ + Constructor + + @param parent reference to the parent object + @type QObject + """ + super(FeaturePermissionManager, self).__init__(parent) + + self.__featurePermissions = { + QWebPage.Notifications: { + QWebPage.PermissionGrantedByUser: [], + QWebPage.PermissionDeniedByUser: [], + }, + QWebPage.Geolocation: { + QWebPage.PermissionGrantedByUser: [], + QWebPage.PermissionDeniedByUser: [], + }, + } + self.__featurePermissionsKeys = { + (QWebPage.Notifications, QWebPage.PermissionGrantedByUser): + "NotificationsGranted", + (QWebPage.Notifications, QWebPage.PermissionDeniedByUser): + "NotificationsDenied", + (QWebPage.Geolocation, QWebPage.PermissionGrantedByUser): + "GeolocationGranted", + (QWebPage.Geolocation, QWebPage.PermissionDeniedByUser): + "GeolocationDenied", + } + + self.__loaded = False + + def requestFeaturePermission(self, page, frame, feature): + """ + Private method to request a feature permission. + + @param page reference to the requesting web page + @type QWebPage + @param frame frame sending the request + @type QWebFrame + @param feature requested feature + @type QWebPage.Feature + """ + if page is None or frame is None: + return + + if not self.__loaded: + self.__loadSettings() + + host = page.url().host() + + if feature in self.__featurePermissions: + for permission in self.__featurePermissions[feature]: + if host in self.__featurePermissions[feature][permission]: + page.setFeaturePermission(frame, feature, permission) + return + + view = page.view() + if view is not None: + from .FeaturePermissionBar import FeaturePermissionBar + bar = FeaturePermissionBar(view, frame, feature) + bar.show() + + def rememberFeaturePermission(self, host, feature, permission): + """ + Public method to remember a user decision for a feature permission. + + @param host host name to remember the decision for + @type str + @param feature feature to be remembered + @type QWebPage.Feature + @param permission feature permission to be remembered + @type QWebPage.PermissionPolicy + """ + if feature in self.__featurePermissions: + if host not in self.__featurePermissions[feature][permission]: + self.__featurePermissions[feature][permission].append(host) + self.__saveSettings() + + def __loadSettings(self): + """ + Private method to load the remembered feature permissions. + """ + if self.__loaded: + # no reloading allowed + return + + for (feature, permission), key in \ + self.__featurePermissionsKeys.items(): + self.__featurePermissions[feature][permission] = \ + Globals.toList(Preferences.Prefs.settings.value( + FeaturePermissionManager.SettingsKeyFormat.format(key), + [] + )) + + self.__loaded = True + + def __saveSettings(self): + """ + Private method to save the remembered feature permissions. + """ + if not self.__loaded: + return + + for (feature, permission), key in \ + self.__featurePermissionsKeys.items(): + Preferences.Prefs.settings.setValue( + FeaturePermissionManager.SettingsKeyFormat.format(key), + self.__featurePermissions[feature][permission]) + + def showFeaturePermissionsDialog(self): + """ + Public method to show a dialog to manage the remembered feature + permissions. + """ + # TODO: implement this + pass