eric6/WebBrowser/FeaturePermissions/FeaturePermissionManager.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7179
912bc70b5b01
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2015 - 2019 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.QtWidgets import QDialog
14 from PyQt5.QtWebEngineWidgets import QWebEnginePage
15
16 import Globals
17 import Preferences
18
19
20 class FeaturePermissionManager(QObject):
21 """
22 Class implementing the feature permission manager object.
23 """
24 SettingsKeyFormat = "WebBrowser/FeaturePermissions/{0}"
25
26 def __init__(self, parent=None):
27 """
28 Constructor
29
30 @param parent reference to the parent object
31 @type QObject
32 """
33 super(FeaturePermissionManager, self).__init__(parent)
34
35 self.__featurePermissions = {
36 QWebEnginePage.Geolocation: {
37 QWebEnginePage.PermissionGrantedByUser: [],
38 QWebEnginePage.PermissionDeniedByUser: [],
39 },
40 QWebEnginePage.MediaAudioCapture: {
41 QWebEnginePage.PermissionGrantedByUser: [],
42 QWebEnginePage.PermissionDeniedByUser: [],
43 },
44 QWebEnginePage.MediaVideoCapture: {
45 QWebEnginePage.PermissionGrantedByUser: [],
46 QWebEnginePage.PermissionDeniedByUser: [],
47 },
48 QWebEnginePage.MediaAudioVideoCapture: {
49 QWebEnginePage.PermissionGrantedByUser: [],
50 QWebEnginePage.PermissionDeniedByUser: [],
51 },
52 QWebEnginePage.MouseLock: {
53 QWebEnginePage.PermissionGrantedByUser: [],
54 QWebEnginePage.PermissionDeniedByUser: [],
55 },
56 }
57 try:
58 # these are defined as of Qt 5.10.0/PyQt 5.10.0
59 self.__featurePermissions.update({
60 QWebEnginePage.DesktopVideoCapture: {
61 QWebEnginePage.PermissionGrantedByUser: [],
62 QWebEnginePage.PermissionDeniedByUser: [],
63 },
64 QWebEnginePage.DesktopAudioVideoCapture: {
65 QWebEnginePage.PermissionGrantedByUser: [],
66 QWebEnginePage.PermissionDeniedByUser: [],
67 },
68 })
69 except AttributeError:
70 pass
71
72 self.__featurePermissionsKeys = {
73 (QWebEnginePage.Geolocation,
74 QWebEnginePage.PermissionGrantedByUser):
75 "GeolocationGranted",
76 (QWebEnginePage.Geolocation,
77 QWebEnginePage.PermissionDeniedByUser):
78 "GeolocationDenied",
79 (QWebEnginePage.MediaAudioCapture,
80 QWebEnginePage.PermissionGrantedByUser):
81 "MediaAudioCaptureGranted",
82 (QWebEnginePage.MediaAudioCapture,
83 QWebEnginePage.PermissionDeniedByUser):
84 "MediaAudioCaptureDenied",
85 (QWebEnginePage.MediaVideoCapture,
86 QWebEnginePage.PermissionGrantedByUser):
87 "MediaVideoCaptureGranted",
88 (QWebEnginePage.MediaVideoCapture,
89 QWebEnginePage.PermissionDeniedByUser):
90 "MediaVideoCaptureDenied",
91 (QWebEnginePage.MediaAudioVideoCapture,
92 QWebEnginePage.PermissionGrantedByUser):
93 "MediaAudioVideoCaptureGranted",
94 (QWebEnginePage.MediaAudioVideoCapture,
95 QWebEnginePage.PermissionDeniedByUser):
96 "MediaAudioVideoCaptureDenied",
97 (QWebEnginePage.MouseLock,
98 QWebEnginePage.PermissionGrantedByUser):
99 "MouseLockGranted",
100 (QWebEnginePage.MouseLock,
101 QWebEnginePage.PermissionDeniedByUser):
102 "MouseLockDenied",
103 }
104 try:
105 # these are defined as of Qt 5.10.0/PyQt 5.10.0
106 self.__featurePermissionsKeys.update({
107 (QWebEnginePage.DesktopVideoCapture,
108 QWebEnginePage.PermissionGrantedByUser):
109 "DesktopVideoCaptureGranted",
110 (QWebEnginePage.DesktopVideoCapture,
111 QWebEnginePage.PermissionDeniedByUser):
112 "DesktopVideoCaptureDenied",
113 (QWebEnginePage.DesktopAudioVideoCapture,
114 QWebEnginePage.PermissionGrantedByUser):
115 "DesktopAudioVideoCaptureGranted",
116 (QWebEnginePage.DesktopAudioVideoCapture,
117 QWebEnginePage.PermissionDeniedByUser):
118 "DesktopAudioVideoCaptureDenied",
119 })
120 except AttributeError:
121 pass
122
123 self.__loaded = False
124
125 def requestFeaturePermission(self, page, origin, feature):
126 """
127 Public method to request a feature permission.
128
129 @param page reference to the requesting web page
130 @type QWebEnginePage
131 @param origin security origin requesting the feature
132 @type QUrl
133 @param feature requested feature
134 @type QWebEnginePage.Feature
135 """
136 if origin is None or origin.isEmpty():
137 return
138
139 if not self.__loaded:
140 self.__loadSettings()
141
142 host = origin.host()
143
144 if feature in self.__featurePermissions:
145 for permission in self.__featurePermissions[feature]:
146 if host in self.__featurePermissions[feature][permission]:
147 page.setFeaturePermission(origin, feature, permission)
148 return
149
150 from .FeaturePermissionBar import FeaturePermissionBar
151 bar = FeaturePermissionBar(page, origin, feature, self)
152 bar.show()
153
154 def rememberFeaturePermission(self, host, feature, permission):
155 """
156 Public method to remember a user decision for a feature permission.
157
158 @param host host name to remember the decision for
159 @type str
160 @param feature feature to be remembered
161 @type QWebEnginePage.Feature
162 @param permission feature permission to be remembered
163 @type QWebEnginePage.PermissionPolicy
164 """
165 if feature in self.__featurePermissions:
166 if host not in self.__featurePermissions[feature][permission]:
167 self.__featurePermissions[feature][permission].append(host)
168 self.__saveSettings()
169
170 def __loadSettings(self):
171 """
172 Private method to load the remembered feature permissions.
173 """
174 if self.__loaded:
175 # no reloading allowed
176 return
177
178 for (feature, permission), key in \
179 self.__featurePermissionsKeys.items():
180 self.__featurePermissions[feature][permission] = \
181 Globals.toList(Preferences.Prefs.settings.value(
182 FeaturePermissionManager.SettingsKeyFormat.format(key),
183 []
184 ))
185
186 self.__loaded = True
187
188 def __saveSettings(self):
189 """
190 Private method to save the remembered feature permissions.
191 """
192 if not self.__loaded:
193 return
194
195 import WebBrowser.WebBrowserWindow
196 if WebBrowser.WebBrowserWindow.WebBrowserWindow.isPrivate():
197 return
198
199 for (feature, permission), key in \
200 self.__featurePermissionsKeys.items():
201 Preferences.Prefs.settings.setValue(
202 FeaturePermissionManager.SettingsKeyFormat.format(key),
203 self.__featurePermissions[feature][permission])
204
205 def showFeaturePermissionsDialog(self):
206 """
207 Public method to show a dialog to manage the remembered feature
208 permissions.
209 """
210 if not self.__loaded:
211 self.__loadSettings()
212
213 from .FeaturePermissionsDialog import FeaturePermissionsDialog
214 dlg = FeaturePermissionsDialog(self.__featurePermissions)
215 if dlg.exec_() == QDialog.Accepted:
216 newFeaturePermissions = dlg.getData()
217 self.__featurePermissions = newFeaturePermissions
218 self.__saveSettings()

eric ide

mercurial