Helpviewer/FeaturePermissions/FeaturePermissionManager.py

changeset 4355
40ec6bef4c22
child 4356
975993ebd7fb
equal deleted inserted replaced
4354:bc2b247a75df 4355:40ec6bef4c22
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2015 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the feature permission manager object.
8 """
9
10 from __future__ import unicode_literals
11
12 from PyQt5.QtCore import QObject
13 from PyQt5.QtWebKitWidgets import QWebPage
14
15 import Globals
16 import Preferences
17
18
19 class FeaturePermissionManager(QObject):
20 """
21 Class implementing the feature permission manager object.
22 """
23 SettingsKeyFormat = "Help/FeaturePermissions/{0}"
24
25 def __init__(self, parent=None):
26 """
27 Constructor
28
29 @param parent reference to the parent object
30 @type QObject
31 """
32 super(FeaturePermissionManager, self).__init__(parent)
33
34 self.__featurePermissions = {
35 QWebPage.Notifications: {
36 QWebPage.PermissionGrantedByUser: [],
37 QWebPage.PermissionDeniedByUser: [],
38 },
39 QWebPage.Geolocation: {
40 QWebPage.PermissionGrantedByUser: [],
41 QWebPage.PermissionDeniedByUser: [],
42 },
43 }
44 self.__featurePermissionsKeys = {
45 (QWebPage.Notifications, QWebPage.PermissionGrantedByUser):
46 "NotificationsGranted",
47 (QWebPage.Notifications, QWebPage.PermissionDeniedByUser):
48 "NotificationsDenied",
49 (QWebPage.Geolocation, QWebPage.PermissionGrantedByUser):
50 "GeolocationGranted",
51 (QWebPage.Geolocation, QWebPage.PermissionDeniedByUser):
52 "GeolocationDenied",
53 }
54
55 self.__loaded = False
56
57 def requestFeaturePermission(self, page, frame, feature):
58 """
59 Private method to request a feature permission.
60
61 @param page reference to the requesting web page
62 @type QWebPage
63 @param frame frame sending the request
64 @type QWebFrame
65 @param feature requested feature
66 @type QWebPage.Feature
67 """
68 if page is None or frame is None:
69 return
70
71 if not self.__loaded:
72 self.__loadSettings()
73
74 host = page.url().host()
75
76 if feature in self.__featurePermissions:
77 for permission in self.__featurePermissions[feature]:
78 if host in self.__featurePermissions[feature][permission]:
79 page.setFeaturePermission(frame, feature, permission)
80 return
81
82 view = page.view()
83 if view is not None:
84 from .FeaturePermissionBar import FeaturePermissionBar
85 bar = FeaturePermissionBar(view, frame, feature)
86 bar.show()
87
88 def rememberFeaturePermission(self, host, feature, permission):
89 """
90 Public method to remember a user decision for a feature permission.
91
92 @param host host name to remember the decision for
93 @type str
94 @param feature feature to be remembered
95 @type QWebPage.Feature
96 @param permission feature permission to be remembered
97 @type QWebPage.PermissionPolicy
98 """
99 if feature in self.__featurePermissions:
100 if host not in self.__featurePermissions[feature][permission]:
101 self.__featurePermissions[feature][permission].append(host)
102 self.__saveSettings()
103
104 def __loadSettings(self):
105 """
106 Private method to load the remembered feature permissions.
107 """
108 if self.__loaded:
109 # no reloading allowed
110 return
111
112 for (feature, permission), key in \
113 self.__featurePermissionsKeys.items():
114 self.__featurePermissions[feature][permission] = \
115 Globals.toList(Preferences.Prefs.settings.value(
116 FeaturePermissionManager.SettingsKeyFormat.format(key),
117 []
118 ))
119
120 self.__loaded = True
121
122 def __saveSettings(self):
123 """
124 Private method to save the remembered feature permissions.
125 """
126 if not self.__loaded:
127 return
128
129 for (feature, permission), key in \
130 self.__featurePermissionsKeys.items():
131 Preferences.Prefs.settings.setValue(
132 FeaturePermissionManager.SettingsKeyFormat.format(key),
133 self.__featurePermissions[feature][permission])
134
135 def showFeaturePermissionsDialog(self):
136 """
137 Public method to show a dialog to manage the remembered feature
138 permissions.
139 """
140 # TODO: implement this
141 pass

eric ide

mercurial