Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: 

 

# Copyright 2016-2018 Florian Bruhin (The Compiler) <mail@qutebrowser.org> 

# 

# This file is part of qutebrowser. 

# 

# qutebrowser is free software: you can redistribute it and/or modify 

# it under the terms of the GNU General Public License as published by 

# the Free Software Foundation, either version 3 of the License, or 

# (at your option) any later version. 

# 

# qutebrowser is distributed in the hope that it will be useful, 

# but WITHOUT ANY WARRANTY; without even the implied warranty of 

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

# GNU General Public License for more details. 

# 

# You should have received a copy of the GNU General Public License 

# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>. 

 

"""QtWebEngine specific qute://* handlers and glue code.""" 

 

from PyQt5.QtCore import QBuffer, QIODevice 

from PyQt5.QtWebEngineCore import (QWebEngineUrlSchemeHandler, 

QWebEngineUrlRequestJob) 

 

from qutebrowser.browser import qutescheme 

from qutebrowser.utils import log, qtutils 

 

 

class QuteSchemeHandler(QWebEngineUrlSchemeHandler): 

 

"""Handle qute://* requests on QtWebEngine.""" 

 

def install(self, profile): 

"""Install the handler for qute:// URLs on the given profile.""" 

profile.installUrlSchemeHandler(b'qute', self) 

 

def requestStarted(self, job): 

"""Handle a request for a qute: scheme. 

 

This method must be reimplemented by all custom URL scheme handlers. 

The request is asynchronous and does not need to be handled right away. 

 

Args: 

job: QWebEngineUrlRequestJob 

""" 

url = job.requestUrl() 

assert job.requestMethod() == b'GET' 

assert url.scheme() == 'qute' 

log.misc.debug("Got request for {}".format(url.toDisplayString())) 

try: 

mimetype, data = qutescheme.data_for_url(url) 

except qutescheme.NoHandlerFound: 

log.misc.debug("No handler found for {}".format( 

url.toDisplayString())) 

job.fail(QWebEngineUrlRequestJob.UrlNotFound) 

except qutescheme.QuteSchemeOSError: 

# FIXME:qtwebengine how do we show a better error here? 

log.misc.exception("OSError while handling qute://* URL") 

job.fail(QWebEngineUrlRequestJob.UrlNotFound) 

except qutescheme.QuteSchemeError: 

# FIXME:qtwebengine how do we show a better error here? 

log.misc.exception("Error while handling qute://* URL") 

job.fail(QWebEngineUrlRequestJob.RequestFailed) 

except qutescheme.Redirect as e: 

qtutils.ensure_valid(e.url) 

job.redirect(e.url) 

else: 

log.misc.debug("Returning {} data".format(mimetype)) 

 

# We can't just use the QBuffer constructor taking a QByteArray, 

# because that somehow segfaults... 

# https://www.riverbankcomputing.com/pipermail/pyqt/2016-September/038075.html 

buf = QBuffer(parent=self) 

buf.open(QIODevice.WriteOnly) 

buf.write(data) 

buf.seek(0) 

buf.close() 

job.reply(mimetype.encode('ascii'), buf)