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

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

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

 

# Copyright 2015-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/>. 

 

"""Utilities related to QWebHistory.""" 

 

 

from PyQt5.QtCore import QByteArray, QDataStream, QIODevice, QUrl 

 

from qutebrowser.utils import qtutils 

 

 

def _serialize_items(items, current_idx, stream): 

# {'currentItemIndex': 0, 

# 'history': [{'children': [], 

# 'documentSequenceNumber': 1485030525573123, 

# 'documentState': [], 

# 'formContentType': '', 

# 'itemSequenceNumber': 1485030525573122, 

# 'originalURLString': 'about:blank', 

# 'pageScaleFactor': 0.0, 

# 'referrer': '', 

# 'scrollPosition': {'x': 0, 'y': 0}, 

# 'target': '', 

# 'title': '', 

# 'urlString': 'about:blank'}]} 

data = {'currentItemIndex': current_idx, 'history': []} 

for item in items: 

data['history'].append(_serialize_item(item)) 

 

stream.writeInt(3) # history stream version 

stream.writeQVariantMap(data) 

 

 

def _serialize_item(item): 

data = { 

'originalURLString': item.original_url.toString(QUrl.FullyEncoded), 

'scrollPosition': {'x': 0, 'y': 0}, 

'title': item.title, 

'urlString': item.url.toString(QUrl.FullyEncoded), 

} 

try: 

data['scrollPosition']['x'] = item.user_data['scroll-pos'].x() 

data['scrollPosition']['y'] = item.user_data['scroll-pos'].y() 

except (KeyError, TypeError): 

pass 

return data 

 

 

def serialize(items): 

"""Serialize a list of QWebHistoryItems to a data stream. 

 

Args: 

items: An iterable of WebHistoryItems. 

 

Return: 

A (stream, data, user_data) tuple. 

stream: The reset QDataStream. 

data: The QByteArray with the raw data. 

user_data: A list with each item's user data. 

 

Warning: 

If 'data' goes out of scope, reading from 'stream' will result in a 

segfault! 

""" 

data = QByteArray() 

stream = QDataStream(data, QIODevice.ReadWrite) 

user_data = [] 

 

current_idx = None 

 

for i, item in enumerate(items): 

if item.active: 

if current_idx is not None: 

raise ValueError("Multiple active items ({} and {}) " 

"found!".format(current_idx, i)) 

else: 

current_idx = i 

 

95 ↛ 99line 95 didn't jump to line 99, because the condition on line 95 was never false if items: 

96 ↛ 101line 96 didn't jump to line 101, because the condition on line 96 was never false if current_idx is None: 

raise ValueError("No active item found!") 

else: 

current_idx = 0 

 

_serialize_items(items, current_idx, stream) 

 

user_data += [item.user_data for item in items] 

 

stream.device().reset() 

qtutils.check_qdatastream(stream) 

return stream, data, user_data