--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebBrowser/Network/EricSchemeHandler.py Sun Mar 13 20:54:42 2016 +0100 @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2016 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a scheme handler for the eric: scheme. +""" + +from __future__ import unicode_literals + +from PyQt5.QtCore import QByteArray, QBuffer, QIODevice, QTextStream, \ + QUrlQuery +from PyQt5.QtWebEngineCore import QWebEngineUrlSchemeHandler + +from ..Tools.WebBrowserTools import readAllFileContents + +class EricSchemeHandler(QWebEngineUrlSchemeHandler): + """ + Class implementing a scheme handler for the eric: scheme. + """ + SupportedPages = [ + "adblock", # error page for URLs blocked by AdBlock + ] + + def __init__(self, parent=None): + """ + Constructor + + @param parent reference to the parent object + @type QObject + """ + super(EricSchemeHandler, self).__init__(parent) + + def requestStarted(self, job): + """ + Public method handling the URL request. + + @param job URL request job + @type QWebEngineUrlRequestJob + """ + if job.requestUrl().path() in self.SupportedPages: + job.reply(b"text/html", EricSchemeReply(job)) + else: + job.reply(QByteArray(), QBuffer()) + # job.fail(QWebEngineUrlRequestJob.UrlNotFound) + + +class EricSchemeReply(QIODevice): + """ + Class implementing a reply for a requested eric: page. + """ + # TODO: SchemeHandler: debug this further + def __init__(self, job, parent=None): + """ + Constructor + + @param job reference to the URL request + @type QWebEngineUrlRequestJob + @param parent reference to the parent object + @type QObject + """ + super(EricSchemeReply, self).__init__(parent) + + self.__loaded = False + self.__job = job + + self.__pageName = self.__job.requestUrl().path() + self.__buffer = QBuffer() + + self.open(QIODevice.ReadOnly) + self.__buffer.open(QIODevice.ReadWrite) + self.__loadPage() + + def __loadPage(self): + """ + Private method to load the requested page. + """ + if self.__loaded: + return + + stream = QTextStream(self.__buffer) + stream.setCodec("utf-8") + + if self.__pageName == "adblock": + stream << self.__adBlockPage() + + stream.flush() + self.__buffer.reset() + self.__loaded = True + + def bytesAvailable(self): + """ + Public method to get the number of available bytes. + + @return number of available bytes + @rtype int + """ + print("bytesAvailable", self.__buffer.bytesAvailable()) + return self.__buffer.bytesAvailable() + + def readData(self, maxlen): + """ + Public method to retrieve data from the reply object. + + @param maxlen maximum number of bytes to read (integer) + @return string containing the data (bytes) + """ + print("readData") + self.__loadPage() + return self.__buffer.read(maxlen) + + def writeData(self, data, len): + return 0 + + def __adBlockPage(self): + """ + Private method to build the AdBlock page. + + @return built AdBlock page + @rtype str + """ + query = QUrlQuery(self.__job.requestUrl()) + rule = query.queryItemValue("rule") + subscription = query.queryItemValue("subscription") + title = self.tr("Content blocked by AdBlock Plus") + message = self.tr( + "Blocked by rule: <i>{0} ({1})</i>").format(rule, subscription) + + page = readAllFileContents(":/html/adblockPage.html") + page = page.replace( + "@FAVICON@", "qrc:icons/adBlockPlus16.png") + page = page.replace( + "@IMAGE@", "qrc:icons/adBlockPlus64.png") + page = page.replace("@TITLE@", title) + page = page.replace("@MESSAGE@", message) + + return page