|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2015 - 2016 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a QWebEngineView to load the web inspector in. |
|
8 """ |
|
9 |
|
10 from __future__ import unicode_literals |
|
11 try: |
|
12 str = unicode # __IGNORE_EXCEPTION__ |
|
13 except NameError: |
|
14 pass |
|
15 |
|
16 import json |
|
17 |
|
18 from PyQt5.QtCore import QSize, QUrl |
|
19 from PyQt5.QtNetwork import QNetworkRequest |
|
20 from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage |
|
21 |
|
22 import Preferences |
|
23 |
|
24 _VIEWS = [] |
|
25 |
|
26 |
|
27 class WebInspector(QWebEngineView): |
|
28 """ |
|
29 Class implementing a QWebEngineView to load the web inspector in. |
|
30 """ |
|
31 def __init__(self, parent=None): |
|
32 """ |
|
33 Constructor |
|
34 |
|
35 @param parent reference to the parent widget |
|
36 @type QWidget |
|
37 """ |
|
38 super(WebInspector, self).__init__(parent) |
|
39 |
|
40 self.__view = None |
|
41 self.__inspectElement = False |
|
42 |
|
43 self.__reloadGeometry() |
|
44 |
|
45 registerView(self) |
|
46 |
|
47 self.page().windowCloseRequested.connect(self.close) |
|
48 self.page().loadFinished.connect(self.__loadFinished) |
|
49 |
|
50 def __del__(self): |
|
51 """ |
|
52 Special method doing some cleanup stuff. |
|
53 """ |
|
54 unregisterView(self) |
|
55 |
|
56 def closeEvent(self, evt): |
|
57 """ |
|
58 Protected method to save the geometry when closed. |
|
59 |
|
60 @param evt event object |
|
61 @type QCloseEvent |
|
62 """ |
|
63 Preferences.setGeometry("WebInspectorGeometry", self.saveGeometry()) |
|
64 super(WebInspector, self).closeEvent(evt) |
|
65 |
|
66 def __reloadGeometry(self): |
|
67 """ |
|
68 Private method to restore the geometry. |
|
69 """ |
|
70 geom = Preferences.getGeometry("WebInspectorGeometry") |
|
71 if geom.isEmpty(): |
|
72 s = QSize(600, 600) |
|
73 self.resize(s) |
|
74 else: |
|
75 self.restoreGeometry(geom) |
|
76 |
|
77 def setView(self, view, inspectElement=False): |
|
78 """ |
|
79 Public method to connect a view to this inspector. |
|
80 |
|
81 @param view reference to the view object |
|
82 @type WebBrowserView |
|
83 @param inspectElement flag indicating to start a web inspection |
|
84 @type bool |
|
85 """ |
|
86 self.__view = view |
|
87 if not self.isEnabled(): |
|
88 return |
|
89 |
|
90 self.__inspectElement = inspectElement |
|
91 |
|
92 port = Preferences.getWebBrowser("WebInspectorPort") |
|
93 inspectorUrl = QUrl("http://localhost:{0}".format(port)) |
|
94 |
|
95 from WebBrowser.WebBrowserWindow import WebBrowserWindow |
|
96 self.__reply = WebBrowserWindow.networkManager().get( |
|
97 QNetworkRequest(inspectorUrl.resolved(QUrl("json/list")))) |
|
98 self.__reply.finished.connect(self.__inspectorReplyFinished) |
|
99 |
|
100 def __inspectorReplyFinished(self): |
|
101 """ |
|
102 Private slot handling the reply. |
|
103 """ |
|
104 result = str(self.__reply.readAll(), encoding="utf8") |
|
105 clients = json.loads(result) |
|
106 |
|
107 self.__reply.deleteLater() |
|
108 self.__replay = None |
|
109 |
|
110 pageUrl = QUrl() |
|
111 try: |
|
112 index = _VIEWS.index(self.__view) |
|
113 except ValueError: |
|
114 index = -1 |
|
115 if len(clients) > index: |
|
116 port = Preferences.getWebBrowser("WebInspectorPort") |
|
117 inspectorUrl = QUrl("http://localhost:{0}".format(port)) |
|
118 |
|
119 client = clients[index] |
|
120 pageUrl = inspectorUrl.resolved( |
|
121 QUrl(client["devtoolsFrontendUrl"])) |
|
122 self.load(pageUrl) |
|
123 pushView(self) |
|
124 self.show() |
|
125 |
|
126 def inspectElement(self): |
|
127 """ |
|
128 Public method to inspect an element. |
|
129 """ |
|
130 self.__inspectElement = True |
|
131 |
|
132 def isEnabled(self): |
|
133 """ |
|
134 Public method to check, if the web inspector is enabled. |
|
135 |
|
136 @return flag indicating the enabled state |
|
137 @rtype bool |
|
138 """ |
|
139 return Preferences.getWebBrowser("WebInspectorEnabled") |
|
140 |
|
141 def __loadFinished(self): |
|
142 """ |
|
143 Private slot handling the finished signal. |
|
144 """ |
|
145 if self.__inspectElement: |
|
146 # TODO: Qt 5.6 |
|
147 ## self.__view.triggerPageAction(QWebEnginePage.InspectElement) |
|
148 self.__inspectElement = False |
|
149 |
|
150 |
|
151 def registerView(view): |
|
152 """ |
|
153 Function to register a view. |
|
154 |
|
155 @param view reference to the view |
|
156 @type WebBrowserView |
|
157 """ |
|
158 _VIEWS.insert(0, view) |
|
159 |
|
160 |
|
161 def unregisterView(view): |
|
162 """ |
|
163 Function to unregister a view. |
|
164 |
|
165 @param view reference to the view |
|
166 @type WebBrowserView |
|
167 """ |
|
168 if view in _VIEWS: |
|
169 _VIEWS.remove(view) |
|
170 |
|
171 |
|
172 def pushView(view): |
|
173 """ |
|
174 Function to push a view to the front of the list. |
|
175 |
|
176 @param view reference to the view |
|
177 @type WebBrowserView |
|
178 """ |
|
179 if view in _VIEWS: |
|
180 _VIEWS.remove(view) |
|
181 _VIEWS.insert(0, view) |