WebBrowser/FeaturePermissions/FeaturePermissionBar.py

branch
QtWebEngine
changeset 4742
f9d1090f6ab9
parent 4631
5c1a96925da4
child 4904
ea8f13f76d26
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/FeaturePermissions/FeaturePermissionBar.py	Sun Feb 14 19:34:05 2016 +0100
@@ -0,0 +1,167 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2015 - 2016 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the feature permission bar widget.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt5.QtCore import pyqtSlot, QUrl
+from PyQt5.QtWidgets import QLabel, QHBoxLayout, QPushButton
+from PyQt5.QtWebEngineWidgets import QWebEnginePage
+
+from E5Gui.E5AnimatedWidget import E5AnimatedWidget
+
+import UI.PixmapCache
+
+
+class FeaturePermissionBar(E5AnimatedWidget):
+    """
+    Class implementing the feature permission bar widget.
+    """
+    DefaultHeight = 30
+    
+    def __init__(self, page, origin, feature, manager):
+        """
+        Constructor
+        
+        @param page reference to the web page
+        @type QWebView
+        @param origin security origin requesting the feature
+        @type QUrl
+        @param feature requested feature
+        @type QWebPage.Feature
+        @param manager reference to the feature permissions manager
+        @type FeaturePermissionManager
+        """
+        super(FeaturePermissionBar, self).__init__(parent=page.view())
+        
+        self.__origin = QUrl(origin)
+        self.__feature = feature
+        self.__page = page
+        self.__manager = manager
+        
+        self.__permissionFeatureTexts = {
+            # TODO: Qt 5.6
+##            QWebEnginePage.Notifications:
+##                self.tr("{0} wants to use desktop notifications."),
+            QWebEnginePage.Geolocation:
+                self.tr("{0} wants to use your position."),
+            QWebEnginePage.MediaAudioCapture:
+                self.tr("{0} wants to use your microphone."),
+            QWebEnginePage.MediaVideoCapture:
+                self.tr("{0} wants to use your camera."),
+            QWebEnginePage.MediaAudioVideoCapture:
+                self.tr("{0} wants to use your microphone and camera."),
+        }
+        self.__permissionFeatureIconNames = {
+            # TODO: Qt 5.6
+##            QWebEnginePage.Notifications: "notification.png",
+            QWebEnginePage.Geolocation: "geolocation.png",
+            QWebEnginePage.MediaAudioCapture: "audiocapture.png",
+            QWebEnginePage.MediaVideoCapture: "camera.png",
+            QWebEnginePage.MediaAudioVideoCapture: "audio-video.png",
+        }
+        
+        self.setAutoFillBackground(True)
+        self.__layout = QHBoxLayout()
+        self.setLayout(self.__layout)
+        self.__layout.setContentsMargins(9, 0, 0, 0)
+        self.__iconLabel = QLabel(self)
+        self.__layout.addWidget(self.__iconLabel)
+        self.__messageLabel = QLabel(self)
+        self.__layout.addWidget(self.__messageLabel)
+        self.__layout.addStretch()
+        self.__rememberButton = QPushButton(self.tr("Remember"), self)
+        self.__rememberButton.setCheckable(True)
+        self.__allowButton = QPushButton(self.tr("Allow"), self)
+        self.__denyButton = QPushButton(self.tr("Deny"), self)
+        self.__discardButton = QPushButton(UI.PixmapCache.getIcon("close.png"),
+                                           "", self)
+        self.__allowButton.clicked.connect(self.__permissionGranted)
+        self.__denyButton.clicked.connect(self.__permissionDenied)
+        self.__discardButton.clicked.connect(self.__permissionUnknown)
+        self.__layout.addWidget(self.__rememberButton)
+        self.__layout.addWidget(self.__allowButton)
+        self.__layout.addWidget(self.__denyButton)
+        self.__layout.addWidget(self.__discardButton)
+        
+        try:
+            self.__iconLabel.setPixmap(UI.PixmapCache.getPixmap(
+                self.__permissionFeatureIconNames[self.__feature]))
+        except KeyError:
+            pass
+        
+        try:
+            self.__messageLabel.setText(
+                self.__permissionFeatureTexts[self.__feature].format(
+                    self.__origin.host()))
+        except KeyError:
+            self.__messageLabel.setText(
+                self.tr("{0} wants to use an unknown feature.").format(
+                    self.__origin.host()))
+        
+        self.__page.loadStarted.connect(self.hide)
+        
+        self.resize(self.__page.view().width(), self.height())
+        self.startAnimation()
+    
+    @pyqtSlot()
+    def hide(self):
+        """
+        Public slot to hide the animated widget.
+        """
+        self.__page.loadStarted.disconnect(self.hide)
+        super(FeaturePermissionBar, self).hide()
+    
+    def __permissionDenied(self):
+        """
+        Private slot handling the user pressing the deny button.
+        """
+        if self.__page is None or self.__manager is None:
+            return
+        
+        self.__page.setFeaturePermission(
+            self.__origin, self.__feature,
+            QWebEnginePage.PermissionDeniedByUser)
+        
+        if self.__rememberButton.isChecked():
+            self.__manager.rememberFeaturePermission(
+                self.__page.url().host(), self.__feature,
+                QWebEnginePage.PermissionDeniedByUser)
+        
+        self.hide()
+    
+    def __permissionGranted(self):
+        """
+        Private slot handling the user pressing the allow button.
+        """
+        if self.__page is None or self.__manager is None:
+            return
+        
+        self.__page.setFeaturePermission(
+            self.__origin, self.__feature,
+            QWebEnginePage.PermissionGrantedByUser)
+        
+        if self.__rememberButton.isChecked():
+            self.__manager.rememberFeaturePermission(
+                self.__page.url().host(), self.__feature,
+                QWebEnginePage.PermissionGrantedByUser)
+        
+        self.hide()
+    
+    def __permissionUnknown(self):
+        """
+        Private slot handling the user closing the dialog without.
+        """
+        if self.__page is None or self.__manager is None:
+            return
+        
+        self.__page.setFeaturePermission(
+            self.__origin, self.__feature,
+            QWebEnginePage.PermissionUnknown)
+        
+        self.hide()

eric ide

mercurial