diff -r 1b7cd7409170 -r bc68f24d5658 Helpviewer/WebPlugins/ClickToFlash/ClickToFlashPlugin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Helpviewer/WebPlugins/ClickToFlash/ClickToFlashPlugin.py Wed Feb 22 09:20:53 2012 +0100 @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the Flash blocker plug-in. +""" + +from PyQt4.QtGui import QDialog +from PyQt4.QtWebKit import QWebPluginFactory + +from ..WebPluginInterface import WebPluginInterface + +from .ClickToFlash import ClickToFlash +from .ClickToFlashWhitelistDialog import ClickToFlashWhitelistDialog + +import Preferences + + +class ClickToFlashPlugin(WebPluginInterface): + """ + Class implementing the flash blocker plug-in. + """ + ClickToFlashData = { + "application/x-shockwave-flash" : { + "extensions": ["swf"], + "icon": "flashBlock-flash.png" + }, + "application/futuresplash" : { + "extensions": ["spl"], + "icon": "flashBlock-flash.png" + }, + "application/x-director" : { + "extensions": ["dir", "dcr", "dxr"], + "icon": "flashBlock-director.png" + }, + "application/x-authorware-map" : { + "extensions": ["aam"], + "icon": "flashBlock-authorware.png" + }, + "application/x-authorware-seg" : { + "extensions": ["aas"], + "icon": "flashBlock-authorware.png" + }, + "application/x-authorware-bin" : { + "extensions": ["aab", "x32", "u32", "vox"], + "icon": "flashBlock-authorware.png" + }, + "image/x-freehand" : { + "extensions": ["fh4", "fh7", "fh5", "fhc", "fh"], + "icon": "flashBlock-freehand.png" + }, + "application/x-silverlight-app" : { + "extensions": ["xap"], + "icon": "flashBlock-silverlight.png" + }, + "application/xaml+xml" : { + "extensions": ["xaml"], + "icon": "flashBlock-silverlight.png" + }, + "application/x-ms-xbap" : { + "extensions": ["xbap"], + "icon": "flashBlock-silverlight.png" + }, + "application/x-java-applet" : { + "extensions": [], + "icon": "flashBlock-java.png" + }, + } + + def __init__(self): + """ + Constructor + """ + self.__loaded = False + self.__whitelist = [] + + def metaPlugin(self): + """ + Public method to create a meta plug-in object containing plug-in info. + + @return meta plug-in object (QWebPluginFactory.Plugin) + """ + plugin = QWebPluginFactory.Plugin() + plugin.name = "ClickToFlashPlugin" + mimeTypes = plugin.mimeTypes + for mime, value in ClickToFlashPlugin.ClickToFlashData.items(): + mimeType = QWebPluginFactory.MimeType() + mimeType.name = mime + extensions = value["extensions"] + if extensions: + fileExtensions = mimeType.fileExtensions + for extension in extensions: + fileExtensions.append(extension) + mimeType.fileExtensions = fileExtensions + mimeTypes.append(mimeType) + plugin.mimeTypes = mimeTypes + + return plugin + + def create(self, mimeType, url, argumentNames, argumentValues): + """ + Public method to create a plug-in instance for the given data. + + @param mimeType MIME type for the plug-in (string) + @param url URL for the plug-in (QUrl) + @param argumentNames list of argument names (list of strings) + @param argumentValues list of argument values (list of strings) + @return reference to the created object (QWidget) + """ + self.__load() + if not self.__enabled(): + return None + + if self.onWhitelist(url.host()): + return None + + if ClickToFlash.isAlreadyAccepted(url, argumentNames, argumentValues): + return None + + ctf = ClickToFlash(self, mimeType, url, argumentNames, argumentValues) + return ctf + + def configure(self): + """ + Public method to configure the plug-in. + """ + self.__load() + dlg = ClickToFlashWhitelistDialog(self.__whitelist) + if dlg.exec_() == QDialog.Accepted: + self.__whitelist = dlg.getWhitelist() + self.__save() + + def isAnonymous(self): + """ + Public method to indicate an anonymous plug-in. + """ + return True + + def onWhitelist(self, host): + """ + Public method to check, if a host is on the whitelist. + + @param host host to check for (string) + @return flag indicating presence in the whitelist (boolean) + """ + return host in self.__whitelist or \ + "www." + host in self.__whitelist or \ + host.replace("www.", "") in self.__whitelist + + def addToWhitelist(self, host): + """ + Public method to add a host to the whitelist. + + @param host host to be added (string) + """ + if not self.onWhitelist(host): + self.__whitelist.append(host) + self.__save() + + def removeFromWhitelist(self, host): + """ + Public method to remove a host from the whitelist. + + @param host host to be removed (string) + """ + if self.onWhitelist(host): + if host in self.__whitelist: + self.__whitelist.remove(host) + elif "www." + host in self.__whitelist: + self.__whitelist.remove("www." + host) + elif host.replace("www.", "") in self.__whitelist: + self.__whitelist.remove(host.replace("www.", "")) + self.__save() + + def __load(self): + """ + Private method to load the configuration. + """ + if self.__loaded: + return + + self.__loaded = True + self.__whitelist = Preferences.getHelp("ClickToFlashWhitelist") + + def __save(self): + """ + Private method to save the configuration. + """ + Preferences.setHelp("ClickToFlashWhitelist", self.__whitelist) + + def __enabled(self): + """ + Private method to check, if the plug-in is enabled. + + @return enabled status (boolean) + """ + return Preferences.getHelp("ClickToFlashEnabled") + + @classmethod + def getIconName(cls, mimeType): + """ + Class method to get the icon name for the mime type. + + @param mimeType mime type to get the icon for (string) + @return name of the icon file (string) + """ + if mimeType in cls.ClickToFlashData: + return cls.ClickToFlashData[mimeType]["icon"] + + return ""