eric6/WebBrowser/WebInspector.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7192
a22eee00b052
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2015 - 2019 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 import os
18
19 from PyQt5.QtCore import pyqtSignal, QSize, QUrl
20 from PyQt5.QtNetwork import QNetworkRequest
21 from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage, \
22 QWebEngineSettings
23
24 from Globals import qVersionTuple
25
26 import Preferences
27
28 _VIEWS = []
29
30
31 class WebInspector(QWebEngineView):
32 """
33 Class implementing a QWebEngineView to load the web inspector in.
34
35 @signal inspectorClosed emitted to indicate the closing of the inspector
36 window
37 """
38 inspectorClosed = pyqtSignal()
39
40 def __init__(self, parent=None):
41 """
42 Constructor
43
44 @param parent reference to the parent widget
45 @type QWidget
46 """
47 super(WebInspector, self).__init__(parent)
48
49 self.__view = None
50 self.__inspectElement = False
51
52 self.__reloadGeometry()
53
54 registerView(self)
55
56 self.page().windowCloseRequested.connect(self.close)
57 self.page().loadFinished.connect(self.__loadFinished)
58
59 def closeEvent(self, evt):
60 """
61 Protected method to save the geometry when closed.
62
63 @param evt event object
64 @type QCloseEvent
65 """
66 Preferences.setGeometry("WebInspectorGeometry", self.saveGeometry())
67 super(WebInspector, self).closeEvent(evt)
68
69 if evt.isAccepted():
70 self.inspectorClosed.emit()
71
72 def __reloadGeometry(self):
73 """
74 Private method to restore the geometry.
75 """
76 geom = Preferences.getGeometry("WebInspectorGeometry")
77 if geom.isEmpty():
78 s = QSize(600, 600)
79 self.resize(s)
80 else:
81 self.restoreGeometry(geom)
82
83 def setView(self, view, inspectElement=False):
84 """
85 Public method to connect a view to this inspector.
86
87 @param view reference to the view object
88 @type WebBrowserView
89 @param inspectElement flag indicating to start a web inspection
90 @type bool
91 """
92 self.__view = view
93 if not self.isEnabled():
94 return
95
96 self.__inspectElement = inspectElement
97
98 try:
99 self.page().setInspectedPage(self.__view.page())
100 except AttributeError:
101 # pre Qt 5.11
102 port = Preferences.getWebBrowser("WebInspectorPort")
103 inspectorUrl = QUrl("http://localhost:{0}".format(port))
104
105 from WebBrowser.WebBrowserWindow import WebBrowserWindow
106 self.__reply = WebBrowserWindow.networkManager().get(
107 QNetworkRequest(inspectorUrl.resolved(QUrl("json/list"))))
108 self.__reply.finished.connect(self.__inspectorReplyFinished)
109
110 def __inspectorReplyFinished(self):
111 """
112 Private slot handling the reply.
113 """
114 # used for pre Qt 5.11
115 result = str(self.__reply.readAll(), encoding="utf8")
116
117 self.__reply.deleteLater()
118 self.__reply = None
119
120 pageUrl = QUrl()
121 try:
122 index = _VIEWS.index(self.__view)
123 except ValueError:
124 index = -1
125 try:
126 clients = json.loads(result)
127 if len(clients) > index:
128 port = Preferences.getWebBrowser("WebInspectorPort")
129 inspectorUrl = QUrl("http://localhost:{0}".format(port))
130
131 client = clients[index]
132 pageUrl = inspectorUrl.resolved(
133 QUrl(client["devtoolsFrontendUrl"]))
134 self.load(pageUrl)
135 pushView(self)
136 self.show()
137 except json.JSONDecodeError:
138 # ignore silently
139 pass
140
141 def inspectElement(self):
142 """
143 Public method to inspect an element.
144 """
145 self.__inspectElement = True
146
147 @classmethod
148 def isEnabled(cls):
149 """
150 Class method to check, if the web inspector is enabled.
151
152 @return flag indicating the enabled state
153 @rtype bool
154 """
155 if qVersionTuple() < (5, 11, 0):
156 if not os.getenv("QTWEBENGINE_REMOTE_DEBUGGING"):
157 return False
158
159 from WebBrowser.WebBrowserWindow import WebBrowserWindow
160 if not WebBrowserWindow.webSettings().testAttribute(
161 QWebEngineSettings.JavascriptEnabled):
162 return False
163
164 if qVersionTuple() < (5, 11, 0):
165 return Preferences.getWebBrowser("WebInspectorEnabled")
166 else:
167 return True
168
169 def __loadFinished(self):
170 """
171 Private slot handling the finished signal.
172 """
173 if self.__inspectElement:
174 self.__view.triggerPageAction(QWebEnginePage.InspectElement)
175 self.__inspectElement = False
176
177
178 def registerView(view):
179 """
180 Function to register a view.
181
182 @param view reference to the view
183 @type WebBrowserView
184 """
185 if _VIEWS is None:
186 return
187
188 _VIEWS.insert(0, view)
189
190
191 def unregisterView(view):
192 """
193 Function to unregister a view.
194
195 @param view reference to the view
196 @type WebBrowserView
197 """
198 if _VIEWS is None:
199 return
200
201 if view in _VIEWS:
202 _VIEWS.remove(view)
203
204
205 def pushView(view):
206 """
207 Function to push a view to the front of the list.
208
209 @param view reference to the view
210 @type WebBrowserView
211 """
212 if _VIEWS is None:
213 return
214
215 if view in _VIEWS:
216 _VIEWS.remove(view)
217 _VIEWS.insert(0, view)

eric ide

mercurial