WebBrowser/Network/EricSchemeHandler.py

Sun, 13 Mar 2016 20:54:42 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 13 Mar 2016 20:54:42 +0100
branch
QtWebEngine
changeset 4858
19dff9c9cf26
child 4859
36c4b21c9f7b
permissions
-rw-r--r--

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

eric ide

mercurial