def show_inspector(self): """ Show web inspector bound to QmxGraph page. """ if not self._inspector_dialog: from PyQt5.QtWebKit import QWebSettings QWebSettings.globalSettings().setAttribute( QWebSettings.DeveloperExtrasEnabled, True) dialog = self._inspector_dialog = QDialog(self) dialog.setWindowTitle("Web Inspector") dialog.setWindowFlags(dialog.windowFlags() | Qt.WindowMaximizeButtonHint) dialog.resize(800, 600) layout = QGridLayout(dialog) layout.setContentsMargins(0, 0, 0, 0) # no margin to web view from PyQt5.QtWebKitWidgets import QWebInspector inspector = QWebInspector(dialog) inspector.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) inspector.setPage(self.inner_web_view().page()) inspector.setVisible(True) layout.addWidget(inspector) self._inspector_dialog.show()
class WebViewPlus(QWebView): """ WebView 커스터마이징 - inspector 추가 - jsconsole 로그 추가 - webview에서 document로 이벤트를 발생함. """ customEvent = """ var event = document.createEvent("CustomEvent"); event.initCustomEvent("{type}", true, true, {detail} ); document.dispatchEvent(event); """ def __init__(self): super().__init__() self.setPage(WebPagePlus()) self._setupInspector() def _setupInspector(self): """ F12키를 누르면 "개발자 도구"가 노출됨 """ # webinspector self.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True) self.webInspector = QWebInspector(self) self.webInspector.setPage(self.page()) #Keyboard shortcuts shortcut = {} shortcut['F12'] = QShortcut(self) shortcut['F12'].setContext(Qt.ApplicationShortcut) shortcut['F12'].setKey(Qt.Key_F12) shortcut['F12'].activated.connect(self._toggleInspector) #F5 - Page reloading shortcut['F5'] = QShortcut(self) shortcut['F5'].setKey(Qt.Key_F5) shortcut['F5'].activated.connect(self.reload) # Devtools self.webInspector.setVisible(True) self.devTool = QDialog(self) self.devTool.setWindowTitle("Development Tool") self.devTool.resize(950, 400) layout = QGridLayout() layout.setContentsMargins(0,0,0,0) layout.addWidget(self.webInspector) self.devTool.setLayout(layout) def _toggleInspector(self): """ F12키를 다시 누르면 "개발자 도구"가 사라짐 """ # self.webInspector.setVisible(not self.webInspector.isVisible()) self.devTool.setVisible(not self.devTool.isVisible()) # webview의 document에 이벤트를 발생함. def fireEvent(self, type, detail): self.page().mainFrame().evaluateJavaScript(WebViewPlus.customEvent.format(type=type, detail=detail))
def setupUi(self): self.view = webview.WebView() self.view.setAcceptHoverEvents(True) scene = QGraphicsScene() scene.addItem(self.view) scene.setActiveWindow(self.view) self.gview = QGraphicsView(scene, self) self.gview.setFrameShape(QFrame.NoFrame) self.gview.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.gview.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) mainLayout = QVBoxLayout() mainLayout.addWidget(self.gview) mainLayout.setContentsMargins(0, 0, 0, 0) mainLayout.setSpacing(0) self.setLayout(mainLayout) if "dev" in sys.argv: print("Dev mode") inspector = QWebInspector() inspector.setPage(self.view.page()) inspector.setVisible(True) inspector.show() self.setWindowIcon(QIcon("python.png"))
class WebInspector(QWidget): """WebInspector widget class""" def __init__(self, parent): super(WebInspector, self).__init__(parent) vbox = QVBoxLayout(self) self._webInspector = QWebInspector(self) vbox.addWidget(self._webInspector) self.btnDock = QPushButton(translations.TR_UNDOCK) vbox.addWidget(self.btnDock) ExplorerContainer.register_tab(translations.TR_TAB_WEB_INSPECTOR, self) IDE.register_service('web_inspector', self) def refresh_inspector(self): """Refresh WebInspector widget by hiding and showing""" self._webInspector.hide() self._webInspector.show() def set_inspection_page(self, page): """Method to load an argument page object on the WebInspector""" self._webInspector.setPage(page) self._webInspector.setVisible(True)
class Window(QWidget): session = dict() def __init__(self, config): super(Window, self).__init__() self.config = config self.base_uri = QUrl.fromLocalFile(os.path.dirname(__file__)).toString() # initial web view add handle all link and form submitted self.web_view = QWebView(self) self.web_view.setPage(WebPage()) self.web_view.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.web_view.page().linkClicked.connect(self.link_clicked) # self.web_view.page().urlChanged.connect(self.url_changed) self.web_view.page().loadFinished.connect(self.load_finished) self.web_view.page().loadStarted.connect(self.load_started) self.web_view.page().form_submitted.connect(self.handle_form_submitted) self.web_view.page().request_reload.connect(self.handle_reload) # initial template lookup self.tempalte_lookup = TemplateLookup( directories=[self.config.settings.get("mako.directories")], module_directory=self.config.settings.get("mako.module_directory"), input_encoding="utf-8", ) # layout attribute layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) # add debug inspector if self.config.settings.get("debug", False): self.setup_inspector() self.splitter = QSplitter(self) self.splitter.setOrientation(Qt.Vertical) layout.addWidget(self.splitter) self.splitter.addWidget(self.web_view) self.splitter.addWidget(self.web_inspector) else: layout.addWidget(self.web_view) def setup_inspector(self): """ This code from http://agateau.com/2012/02/03/pyqtwebkit-experiments-part-2-debugging/ """ page = self.web_view.page() page.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True) self.web_inspector = QWebInspector(self) self.web_inspector.setPage(page) shortcut = QShortcut(self) shortcut.setKey(Qt.Key_F12) shortcut.activated.connect(self.toggle_inspector) self.web_inspector.setVisible(False) def toggle_inspector(self): self.web_inspector.setVisible(not self.web_inspector.isVisible()) def handle_form_submitted(self, qurl, elements=dict()): # print("\n\ngot url: ", qurl) qqurl = QUrlQuery(qurl) for key, value in qqurl.queryItems(): elements[key] = value self.render(qurl.path(), elements) # do stuff with elements... # for item in elements.items(): # print ("got: ", item) def handle_reload(self, qurl): self.render(qurl.path()) def load_started(self): """""" # print("load_started ->: ", self.web_view.url()) def load_finished(self, finished): """""" # print("load_finished ->: ", finished) # if finished: # self.web_view.setUrl(QUrl('/login')) # def url_changed(self, qurl): # '''''' # print("url_changed ->: ", qurl) def link_clicked(self, qurl): # print("link_clicked ->: ", qurl) qqurl = QUrlQuery(qurl) elements = {} # print("got link_clicked url: ", qurl) for key, value in qqurl.queryItems(): elements[key] = value self.render(qurl.path(), elements) # self.render(qurl.path()) def render(self, url, args=None): self.config.current_route_path = url print("current_route_path: ", self.config.current_route_path) logger.debug("url: %s" % url) route = self.config.get_route(url) logger.debug("view: %s" % route) if route is not None: view = route.get("view") context_obj = context.ResourceContext(self.config, self.session) context_obj.add_args(args) try: response = view(context_obj) except Exception as e: if e.args[0] == "Request Exit": self.close() return logger.exception(e) # need error page return self.link_clicked("/home") if not isinstance(response, dict): if isinstance(response, QUrl): return self.link_clicked(response) # url = response.path() # print('window url', url) # return self.render(url) # else: # # need error page # return self.render('/login') logger.debug("response: %s" % response) template = self.tempalte_lookup.get_template(self.config.get_route(url).get("renderer")) response["request"] = context_obj response["base_uri"] = self.base_uri html = template.render(**response) self.web_view.setHtml(html, QUrl("file://" + url)) # self.web_view.setHtml(html) # self.web_view.load(a) def welcome(self): context_obj = context.ResourceContext(self.config, self.session) return self.link_clicked(context_obj.redirect_url("login"))
class WebViewPlus(QWebView): """ WebView 커스터마이징 - inspector 추가 - jsconsole 로그 추가 - webview에서 document로 이벤트를 발생함. """ customEvent = """ var event = document.createEvent("CustomEvent"); event.initCustomEvent("{type}", true, true, {detail} ); document.dispatchEvent(event); """ def __init__(self): super().__init__() self.setPage(WebPagePlus()) self._setupWebview() def _setupWebview(self): settings = self.settings() currentPath = QDir.currentPath() settings.setAttribute(QWebSettings.LocalStorageEnabled, True) settings.setAttribute(QWebSettings.OfflineStorageDatabaseEnabled, True) settings.setAttribute(QWebSettings.OfflineWebApplicationCacheEnabled, True) settings.setAttribute(QWebSettings.DnsPrefetchEnabled, True) settings.setAttribute(QWebSettings.CSSGridLayoutEnabled, True) settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, True) settings.setAttribute(QWebSettings.JavascriptCanCloseWindows, True) settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, True) settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True) settings.setOfflineStoragePath(currentPath + "/storage/offline") settings.setOfflineWebApplicationCachePath(currentPath + "/storage/webcache") settings.setLocalStoragePath(currentPath + "/storage/local") settings.setOfflineStorageDefaultQuota(5 * 1024 * 1024) settings.setOfflineWebApplicationCacheQuota(5 * 1024 * 1024) settings.enablePersistentStorage() """ F12키를 누르면 "개발자 도구"가 노출됨 """ # webinspector self.webInspector = QWebInspector(self) self.webInspector.setPage(self.page()) #Keyboard shortcuts shortcut = {} shortcut['F4'] = QShortcut(self) shortcut['F4'].setContext(Qt.ApplicationShortcut) shortcut['F4'].setKey(Qt.Key_F4) shortcut['F4'].activated.connect(self._toggleInspector) #F5 - Page reloading shortcut['F5'] = QShortcut(self) shortcut['F5'].setKey(Qt.Key_F5) shortcut['F5'].activated.connect(self.reload) # Devtools self.webInspector.setVisible(True) self.devTool = QDialog(self) self.devTool.setWindowTitle("Development Tool") self.devTool.resize(950, 400) layout = QGridLayout() layout.setContentsMargins(0,0,0,0) layout.addWidget(self.webInspector) self.devTool.setLayout(layout) def _toggleInspector(self): """ F4키를 다시 누르면 "개발자 도구"가 토글됨. """ self.devTool.setVisible(not self.devTool.isVisible()) # webview의 document에 이벤트를 발생함. def fireEvent(self, type, detail): self.page().mainFrame().evaluateJavaScript(WebViewPlus.customEvent.format(type=type, detail=detail))
class Window(QWidget): session = dict() def __init__(self, config): super(Window, self).__init__() self.config = config self.base_uri = QUrl.fromLocalFile( os.path.dirname(__file__)).toString() # initial web view add handle all link and form submitted self.web_view = QWebView(self) self.web_view.setPage(WebPage()) self.web_view.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.web_view.page().linkClicked.connect(self.link_clicked) #self.web_view.page().urlChanged.connect(self.url_changed) self.web_view.page().loadFinished.connect(self.load_finished) self.web_view.page().loadStarted.connect(self.load_started) self.web_view.page().form_submitted.connect(self.handle_form_submitted) self.web_view.page().request_reload.connect(self.handle_reload) # initial template lookup self.tempalte_lookup = TemplateLookup( directories=[self.config.settings.get("mako.directories")], module_directory=self.config.settings.get("mako.module_directory"), input_encoding='utf-8', ) # layout attribute layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) # add debug inspector if self.config.settings.get("debug", False): self.setup_inspector() self.splitter = QSplitter(self) self.splitter.setOrientation(Qt.Vertical) layout.addWidget(self.splitter) self.splitter.addWidget(self.web_view) self.splitter.addWidget(self.web_inspector) else: layout.addWidget(self.web_view) def setup_inspector(self): ''' This code from http://agateau.com/2012/02/03/pyqtwebkit-experiments-part-2-debugging/ ''' page = self.web_view.page() page.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True) self.web_inspector = QWebInspector(self) self.web_inspector.setPage(page) shortcut = QShortcut(self) shortcut.setKey(Qt.Key_F12) shortcut.activated.connect(self.toggle_inspector) self.web_inspector.setVisible(False) def toggle_inspector(self): self.web_inspector.setVisible(not self.web_inspector.isVisible()) def handle_form_submitted(self, qurl, elements=dict()): # print("\n\ngot url: ", qurl) qqurl = QUrlQuery(qurl) for key, value in qqurl.queryItems(): elements[key] = value self.render(qurl.path(), elements) # do stuff with elements... # for item in elements.items(): # print ("got: ", item) def handle_reload(self, qurl): self.render(qurl.path()) def load_started(self): '''''' # print("load_started ->: ", self.web_view.url()) def load_finished(self, finished): '''''' # print("load_finished ->: ", finished) # if finished: # self.web_view.setUrl(QUrl('/login')) # def url_changed(self, qurl): # '''''' # print("url_changed ->: ", qurl) def link_clicked(self, qurl): # print("link_clicked ->: ", qurl) qqurl = QUrlQuery(qurl) elements = {} # print("got link_clicked url: ", qurl) for key, value in qqurl.queryItems(): elements[key] = value self.render(qurl.path(), elements) #self.render(qurl.path()) def render(self, url, args=None): self.config.current_route_path = url print("current_route_path: ", self.config.current_route_path) logger.debug("url: %s" % url) route = self.config.get_route(url) logger.debug("view: %s" % route) if route is not None: view = route.get('view') context_obj = context.ResourceContext(self.config, self.session) context_obj.add_args(args) try: response = view(context_obj) except Exception as e: if e.args[0] == 'Request Exit': self.close() return logger.exception(e) #need error page return self.link_clicked('/home') if not isinstance(response, dict): if isinstance(response, QUrl): return self.link_clicked(response) # url = response.path() # print('window url', url) # return self.render(url) # else: # # need error page # return self.render('/login') logger.debug("response: %s" % response) template = self.tempalte_lookup.get_template( self.config.get_route(url).get('renderer')) response['request'] = context_obj response['base_uri'] = self.base_uri html = template.render(**response) self.web_view.setHtml(html, QUrl("file://" + url)) # self.web_view.setHtml(html) #self.web_view.load(a) def welcome(self): context_obj = context.ResourceContext(self.config, self.session) return self.link_clicked(context_obj.redirect_url('login'))
class WebViewPlus(QWebView): """ WebView 커스터마이징 - inspector 추가 - jsconsole 로그 추가 - webview에서 document로 이벤트를 발생함. """ customEvent = """ var event = document.createEvent("CustomEvent"); event.initCustomEvent("{type}", true, true, {detail} ); document.dispatchEvent(event); """ def __init__(self): super().__init__() self.setPage(WebPagePlus()) self._setupWebview() def _setupWebview(self): settings = self.settings() currentPath = QDir.currentPath() settings.setAttribute(QWebSettings.LocalStorageEnabled, True) settings.setAttribute(QWebSettings.OfflineStorageDatabaseEnabled, True) settings.setAttribute(QWebSettings.OfflineWebApplicationCacheEnabled, True) settings.setAttribute(QWebSettings.DnsPrefetchEnabled, True) settings.setAttribute(QWebSettings.CSSGridLayoutEnabled, True) settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, True) settings.setAttribute(QWebSettings.JavascriptCanCloseWindows, True) settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, True) settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True) settings.setOfflineStoragePath(currentPath + "/storage/offline") settings.setOfflineWebApplicationCachePath(currentPath + "/storage/webcache") settings.setLocalStoragePath(currentPath + "/storage/local") settings.setOfflineStorageDefaultQuota(5 * 1024 * 1024) settings.setOfflineWebApplicationCacheQuota(5 * 1024 * 1024) settings.enablePersistentStorage() """ F12키를 누르면 "개발자 도구"가 노출됨 """ # webinspector self.webInspector = QWebInspector(self) self.webInspector.setPage(self.page()) #Keyboard shortcuts shortcut = {} shortcut['F4'] = QShortcut(self) shortcut['F4'].setContext(Qt.ApplicationShortcut) shortcut['F4'].setKey(Qt.Key_F4) shortcut['F4'].activated.connect(self._toggleInspector) #F5 - Page reloading shortcut['F5'] = QShortcut(self) shortcut['F5'].setKey(Qt.Key_F5) shortcut['F5'].activated.connect(self.reload) # Devtools self.webInspector.setVisible(True) self.devTool = QDialog(self) self.devTool.setWindowTitle("Development Tool") self.devTool.resize(950, 400) layout = QGridLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.webInspector) self.devTool.setLayout(layout) def _toggleInspector(self): """ F4키를 다시 누르면 "개발자 도구"가 토글됨. """ self.devTool.setVisible(not self.devTool.isVisible()) # webview의 document에 이벤트를 발생함. def fireEvent(self, type, detail): self.page().mainFrame().evaluateJavaScript( WebViewPlus.customEvent.format(type=type, detail=detail))