Sun, 13 Mar 2016 20:54:42 +0100
Continued porting the web browser.
- continued porting the AdBlock code
# -*- 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