WebBrowser/FeaturePermissions/FeaturePermissionBar.py

branch
QtWebEngine
changeset 4742
f9d1090f6ab9
parent 4631
5c1a96925da4
child 4904
ea8f13f76d26
equal deleted inserted replaced
4741:f9e1adc69076 4742:f9d1090f6ab9
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2015 - 2016 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the feature permission bar widget.
8 """
9
10 from __future__ import unicode_literals
11
12 from PyQt5.QtCore import pyqtSlot, QUrl
13 from PyQt5.QtWidgets import QLabel, QHBoxLayout, QPushButton
14 from PyQt5.QtWebEngineWidgets import QWebEnginePage
15
16 from E5Gui.E5AnimatedWidget import E5AnimatedWidget
17
18 import UI.PixmapCache
19
20
21 class FeaturePermissionBar(E5AnimatedWidget):
22 """
23 Class implementing the feature permission bar widget.
24 """
25 DefaultHeight = 30
26
27 def __init__(self, page, origin, feature, manager):
28 """
29 Constructor
30
31 @param page reference to the web page
32 @type QWebView
33 @param origin security origin requesting the feature
34 @type QUrl
35 @param feature requested feature
36 @type QWebPage.Feature
37 @param manager reference to the feature permissions manager
38 @type FeaturePermissionManager
39 """
40 super(FeaturePermissionBar, self).__init__(parent=page.view())
41
42 self.__origin = QUrl(origin)
43 self.__feature = feature
44 self.__page = page
45 self.__manager = manager
46
47 self.__permissionFeatureTexts = {
48 # TODO: Qt 5.6
49 ## QWebEnginePage.Notifications:
50 ## self.tr("{0} wants to use desktop notifications."),
51 QWebEnginePage.Geolocation:
52 self.tr("{0} wants to use your position."),
53 QWebEnginePage.MediaAudioCapture:
54 self.tr("{0} wants to use your microphone."),
55 QWebEnginePage.MediaVideoCapture:
56 self.tr("{0} wants to use your camera."),
57 QWebEnginePage.MediaAudioVideoCapture:
58 self.tr("{0} wants to use your microphone and camera."),
59 }
60 self.__permissionFeatureIconNames = {
61 # TODO: Qt 5.6
62 ## QWebEnginePage.Notifications: "notification.png",
63 QWebEnginePage.Geolocation: "geolocation.png",
64 QWebEnginePage.MediaAudioCapture: "audiocapture.png",
65 QWebEnginePage.MediaVideoCapture: "camera.png",
66 QWebEnginePage.MediaAudioVideoCapture: "audio-video.png",
67 }
68
69 self.setAutoFillBackground(True)
70 self.__layout = QHBoxLayout()
71 self.setLayout(self.__layout)
72 self.__layout.setContentsMargins(9, 0, 0, 0)
73 self.__iconLabel = QLabel(self)
74 self.__layout.addWidget(self.__iconLabel)
75 self.__messageLabel = QLabel(self)
76 self.__layout.addWidget(self.__messageLabel)
77 self.__layout.addStretch()
78 self.__rememberButton = QPushButton(self.tr("Remember"), self)
79 self.__rememberButton.setCheckable(True)
80 self.__allowButton = QPushButton(self.tr("Allow"), self)
81 self.__denyButton = QPushButton(self.tr("Deny"), self)
82 self.__discardButton = QPushButton(UI.PixmapCache.getIcon("close.png"),
83 "", self)
84 self.__allowButton.clicked.connect(self.__permissionGranted)
85 self.__denyButton.clicked.connect(self.__permissionDenied)
86 self.__discardButton.clicked.connect(self.__permissionUnknown)
87 self.__layout.addWidget(self.__rememberButton)
88 self.__layout.addWidget(self.__allowButton)
89 self.__layout.addWidget(self.__denyButton)
90 self.__layout.addWidget(self.__discardButton)
91
92 try:
93 self.__iconLabel.setPixmap(UI.PixmapCache.getPixmap(
94 self.__permissionFeatureIconNames[self.__feature]))
95 except KeyError:
96 pass
97
98 try:
99 self.__messageLabel.setText(
100 self.__permissionFeatureTexts[self.__feature].format(
101 self.__origin.host()))
102 except KeyError:
103 self.__messageLabel.setText(
104 self.tr("{0} wants to use an unknown feature.").format(
105 self.__origin.host()))
106
107 self.__page.loadStarted.connect(self.hide)
108
109 self.resize(self.__page.view().width(), self.height())
110 self.startAnimation()
111
112 @pyqtSlot()
113 def hide(self):
114 """
115 Public slot to hide the animated widget.
116 """
117 self.__page.loadStarted.disconnect(self.hide)
118 super(FeaturePermissionBar, self).hide()
119
120 def __permissionDenied(self):
121 """
122 Private slot handling the user pressing the deny button.
123 """
124 if self.__page is None or self.__manager is None:
125 return
126
127 self.__page.setFeaturePermission(
128 self.__origin, self.__feature,
129 QWebEnginePage.PermissionDeniedByUser)
130
131 if self.__rememberButton.isChecked():
132 self.__manager.rememberFeaturePermission(
133 self.__page.url().host(), self.__feature,
134 QWebEnginePage.PermissionDeniedByUser)
135
136 self.hide()
137
138 def __permissionGranted(self):
139 """
140 Private slot handling the user pressing the allow button.
141 """
142 if self.__page is None or self.__manager is None:
143 return
144
145 self.__page.setFeaturePermission(
146 self.__origin, self.__feature,
147 QWebEnginePage.PermissionGrantedByUser)
148
149 if self.__rememberButton.isChecked():
150 self.__manager.rememberFeaturePermission(
151 self.__page.url().host(), self.__feature,
152 QWebEnginePage.PermissionGrantedByUser)
153
154 self.hide()
155
156 def __permissionUnknown(self):
157 """
158 Private slot handling the user closing the dialog without.
159 """
160 if self.__page is None or self.__manager is None:
161 return
162
163 self.__page.setFeaturePermission(
164 self.__origin, self.__feature,
165 QWebEnginePage.PermissionUnknown)
166
167 self.hide()

eric ide

mercurial