diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index b00c80716..5752d974f 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -717,7 +717,10 @@ class CommandDispatcher: raise CommandError("No element focused!") if not webelem.is_editable(elem): raise CommandError("Focused element is not editable!") - text = elem.evaluateJavaScript('this.value') + if webelem.is_content_editable(elem): + text = elem.toPlainText() + else: + text = elem.evaluateJavaScript('this.value') self._editor = ExternalEditor(self._tabs) self._editor.editing_finished.connect( partial(self.on_editing_finished, elem)) @@ -734,5 +737,8 @@ class CommandDispatcher: """ if elem.isNull(): raise CommandError("Element vanished while editing!") - text = webelem.javascript_escape(text) - elem.evaluateJavaScript("this.value='{}'".format(text)) + if webelem.is_content_editable(elem): + elem.setPlainText(text) + else: + text = webelem.javascript_escape(text) + elem.evaluateJavaScript("this.value='{}'".format(text)) diff --git a/qutebrowser/utils/webelem.py b/qutebrowser/utils/webelem.py index 306372002..e81b89067 100644 --- a/qutebrowser/utils/webelem.py +++ b/qutebrowser/utils/webelem.py @@ -187,6 +187,21 @@ def _is_object_editable(elem): return False +def is_content_editable(elem): + """Check if an element hsa a contenteditable attribute. + + FIXME: Add tests. + + Args: + elem: The QWebElement to check. + + Return: + True if the element has a contenteditable attribute, False otherwise. + """ + return (elem.hasAttribute('contenteditable') and + elem.attribute('contenteditable') not in ('false', 'inherit')) + + def is_editable(elem): """Check whether we should switch to insert mode for this element. @@ -204,8 +219,8 @@ def is_editable(elem): div_classes = ('CodeMirror', # Javascript editor over a textarea 'kix-') # Google Docs editor roles = ('combobox', 'textbox') - if elem.hasAttribute('role') and elem.attribute('role') in roles: - return is_writable(elem) + if is_content_editable(elem) and is_writable(elem): + return True if (elem.hasAttribute('contenteditable') and elem.attribute('contenteditable') not in ('false', 'inherit')): return is_writable(elem)