Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
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))
Exemplo n.º 3
0
 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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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"))
Exemplo n.º 7
0
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))
Exemplo n.º 8
0
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'))
Exemplo n.º 9
0
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))