From 210e5100c0ce7d015bd03d605bd099b1876346ea Mon Sep 17 00:00:00 2001 From: Carlos Cordoba Date: Sat, 14 Jan 2017 18:11:32 -0500 Subject: [PATCH 1/4] Add a widget to do DOM manipulations using Javascript --- spyder_notebook/widgets/dom.py | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 spyder_notebook/widgets/dom.py diff --git a/spyder_notebook/widgets/dom.py b/spyder_notebook/widgets/dom.py new file mode 100644 index 00000000..911ffc63 --- /dev/null +++ b/spyder_notebook/widgets/dom.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) Spyder Project Contributors +# Licensed under the terms of the MIT License + +""" +Widget to do DOM manipulations using Javascript + +Some code here comes from the Ghost.py project: +https://github.com/jeanphix/Ghost.py +""" + +from qtpy.QtWebEngineWidgets import WEBENGINE +from spyder.widgets.browser import WebView + + +class DOMWidget(WebView): + + def __init__(self, parent): + super(DOMWidget, self).__init__(parent) + if WEBENGINE: + self.page = self.page() + else: + self.page = self.page().mainFrame() + + def evaluate(self, script): + """Evaluates script in page frame. + :param script: The script to evaluate. + """ + if WEBENGINE: + return self.page.runJavaScript("%s" % script) + else: + return self.page.evaluateJavaScript("%s" % script) + + def click(self, selector, btn=0): + """Click the targeted element. + :param selector: A CSS3 selector to targeted element. + :param btn: The number of mouse button. + 0 - left button, + 1 - middle button, + 2 - right button + """ + return self.evaluate(""" + (function () { + var element = document.querySelector(%s); + var evt = document.createEvent("MouseEvents"); + evt.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, + false, false, false, false, %s, element); + return element.dispatchEvent(evt); + })(); + """ % (repr(selector), str(btn))) + + def set_input_value(self, selector, value): + """Sets the value of the input matched by given selector.""" + script = 'document.querySelector("%s").setAttribute("value", "%s")' + script = script % (selector, value) + self.evaluate(script) From f2d81cf3ef1b65a49e2f367716b171e6c7a9bc84 Mon Sep 17 00:00:00 2001 From: Carlos Cordoba Date: Sat, 14 Jan 2017 18:15:11 -0500 Subject: [PATCH 2/4] Make NotebookWidget to inherit from DOMWidget --- spyder_notebook/widgets/client.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spyder_notebook/widgets/client.py b/spyder_notebook/widgets/client.py index f6a20d11..d59cfc22 100644 --- a/spyder_notebook/widgets/client.py +++ b/spyder_notebook/widgets/client.py @@ -24,9 +24,11 @@ from spyder.py3compat import is_text_string from spyder.utils.qthelpers import add_actions from spyder.utils import sourcecode -from spyder.widgets.browser import WebView from spyder.widgets.findreplace import FindReplace +# Local imports +from ..widgets.dom import DOMWidget + #----------------------------------------------------------------------------- # Templates @@ -45,7 +47,7 @@ #----------------------------------------------------------------------------- # Widgets #----------------------------------------------------------------------------- -class NotebookWidget(WebView): +class NotebookWidget(DOMWidget): """WebView widget for notebooks.""" def contextMenuEvent(self, event): From c3dee6a9380aa15407717fc9571c57282b041cc6 Mon Sep 17 00:00:00 2001 From: Carlos Cordoba Date: Sat, 14 Jan 2017 18:17:04 -0500 Subject: [PATCH 3/4] Add a method to save notebooks from our clients --- spyder_notebook/widgets/client.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spyder_notebook/widgets/client.py b/spyder_notebook/widgets/client.py index d59cfc22..c8abad27 100644 --- a/spyder_notebook/widgets/client.py +++ b/spyder_notebook/widgets/client.py @@ -161,6 +161,10 @@ def get_short_name(self): sname = osp.basename(self.name) return sname + def save(self): + """Save current notebook.""" + self.notebookwidget.click('#save-notbook button') + #----------------------------------------------------------------------------- # Tests From d5032d70bf11e67332646e510857026a752bae2e Mon Sep 17 00:00:00 2001 From: Carlos Cordoba Date: Sat, 14 Jan 2017 18:19:24 -0500 Subject: [PATCH 4/4] Fix get_clients --- spyder_notebook/notebookplugin.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spyder_notebook/notebookplugin.py b/spyder_notebook/notebookplugin.py index e46b6069..9ee4d70b 100644 --- a/spyder_notebook/notebookplugin.py +++ b/spyder_notebook/notebookplugin.py @@ -26,7 +26,6 @@ from spyder.utils.qthelpers import create_action, create_toolbutton from spyder.widgets.tabs import Tabs from spyder.plugins import SpyderPluginWidget -from spyder.py3compat import to_text_string # Local imports from .utils.nbopen import nbopen, NBServerError @@ -146,7 +145,7 @@ def register_plugin(self): #------ Public API (for clients) ------------------------------------------ def get_clients(self): """Return notebooks list""" - return [cl for cl in self.clients if isinstance(nb, NotebookClient)] + return [cl for cl in self.clients if isinstance(cl, NotebookClient)] def get_focus_client(self): """Return current notebook with focus, if any"""