From 76935291c0856a21c0e4266fd478ede3b4ef0d94 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Mon, 28 Mar 2016 13:15:22 +0200 Subject: [PATCH 01/16] Open links in current tab Fix for #676 It removes the target of the link, as to prevent the website to overrule the user. I guess the following things should be done: - add setting to enable/disable this behaviour - and/or add "hint all current" Only the first one would be easiest. The second one requires us to keep track of the original target. I should open a pull request for discussion. --- qutebrowser/browser/hints.py | 1 + qutebrowser/browser/webelem.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 26fd02fbc..4bc9941a8 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -463,6 +463,7 @@ class HintManager(QObject): QMouseEvent(QEvent.MouseButtonRelease, pos, Qt.LeftButton, Qt.NoButton, modifiers), ] + elem.remove_target() for evt in events: self.mouse_event.emit(evt) if elem.is_text_input() and elem.is_editable(): diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index 49f4bfc27..f18bea65a 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -285,6 +285,13 @@ class WebElementWrapper(collections.abc.MutableMapping): tag = self._elem.tagName().lower() return self.get('role', None) in roles or tag in ('input', 'textarea') + def remove_target(self): + """Remove target from link""" + if self._elem.tagName().lower() == 'a': + self._elem.removeAttribute('target') + elif self.parent().tagName().lower() == 'a': + self.parent().removeAttribute('target') + def debug_text(self): """Get a text based on an element suitable for debug output.""" self._check_vanished() From 201739a7e6211cb93efcb23c4c1c751341ac97bd Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Wed, 30 Mar 2016 15:51:03 +0200 Subject: [PATCH 02/16] Add current hint target --- qutebrowser/browser/hints.py | 19 ++++++++++++------- qutebrowser/browser/webelem.py | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 4bc9941a8..0c99387b5 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -42,10 +42,10 @@ from qutebrowser.misc import guiprocess ElemTuple = collections.namedtuple('ElemTuple', ['elem', 'label']) -Target = usertypes.enum('Target', ['normal', 'tab', 'tab_fg', 'tab_bg', - 'window', 'yank', 'yank_primary', 'run', - 'fill', 'hover', 'download', 'userscript', - 'spawn']) +Target = usertypes.enum('Target', ['normal', 'current', 'tab', 'tab_fg', + 'tab_bg', 'window', 'yank', 'yank_primary', + 'run', 'fill', 'hover', 'download', + 'userscript', 'spawn']) class WordHintingError(Exception): @@ -71,7 +71,7 @@ class HintContext: elems: A mapping from key strings to (elem, label) namedtuples. baseurl: The URL of the current page. target: What to do with the opened links. - normal/tab/tab_fg/tab_bg/window: Get passed to BrowserTab. + normal/current/tab/tab_fg/tab_bg/window: Get passed to BrowserTab. yank/yank_primary: Yank to clipboard/primary selection. run: Run a command. fill: Fill commandline with link. @@ -128,6 +128,7 @@ class HintManager(QObject): HINT_TEXTS = { Target.normal: "Follow hint", + Target.current: "Follow hint in current tab", Target.tab: "Follow hint in new tab", Target.tab_fg: "Follow hint in foreground tab", Target.tab_bg: "Follow hint in background tab", @@ -429,6 +430,7 @@ class HintManager(QObject): """ target_mapping = { Target.normal: usertypes.ClickTarget.normal, + Target.current: usertypes.ClickTarget.normal, Target.tab_fg: usertypes.ClickTarget.tab, Target.tab_bg: usertypes.ClickTarget.tab_bg, Target.window: usertypes.ClickTarget.window, @@ -463,7 +465,8 @@ class HintManager(QObject): QMouseEvent(QEvent.MouseButtonRelease, pos, Qt.LeftButton, Qt.NoButton, modifiers), ] - elem.remove_target() + if context.target == Target.current: + elem.remove_target() for evt in events: self.mouse_event.emit(evt) if elem.is_text_input() and elem.is_editable(): @@ -742,7 +745,8 @@ class HintManager(QObject): target: What to do with the selected element. - - `normal`: Open the link in the current tab. + - `normal`: Open the link. + - `current`: Open the link in the current tab. - `tab`: Open the link in a new tab (honoring the background-tabs setting). - `tab-fg`: Open the link in a new foreground tab. @@ -892,6 +896,7 @@ class HintManager(QObject): # Handlers which take a QWebElement elem_handlers = { Target.normal: self._click, + Target.current: self._click, Target.tab: self._click, Target.tab_fg: self._click, Target.tab_bg: self._click, diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index f18bea65a..0f6ae633d 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -286,7 +286,7 @@ class WebElementWrapper(collections.abc.MutableMapping): return self.get('role', None) in roles or tag in ('input', 'textarea') def remove_target(self): - """Remove target from link""" + """Remove target from link.""" if self._elem.tagName().lower() == 'a': self._elem.removeAttribute('target') elif self.parent().tagName().lower() == 'a': From 571d6519e9082976129ead7a5e81d07b3c0c8f63 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Wed, 30 Mar 2016 19:08:10 +0200 Subject: [PATCH 03/16] Handle frames --- qutebrowser/browser/hints.py | 2 +- qutebrowser/browser/webelem.py | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 0c99387b5..040d553c5 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -466,7 +466,7 @@ class HintManager(QObject): Qt.NoButton, modifiers), ] if context.target == Target.current: - elem.remove_target() + elem.remove_blank_target() for evt in events: self.mouse_event.emit(evt) if elem.is_text_input() and elem.is_editable(): diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index 0f6ae633d..6100cd1b3 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -285,12 +285,13 @@ class WebElementWrapper(collections.abc.MutableMapping): tag = self._elem.tagName().lower() return self.get('role', None) in roles or tag in ('input', 'textarea') - def remove_target(self): + def remove_blank_target(self): """Remove target from link.""" - if self._elem.tagName().lower() == 'a': - self._elem.removeAttribute('target') - elif self.parent().tagName().lower() == 'a': - self.parent().removeAttribute('target') + for elem in [self._elem, self.parent()]: + if elem.tagName().lower() == 'a': + if elem.attribute('target') == '_blank': + elem.setAttribute('target', '_top') + break def debug_text(self): """Get a text based on an element suitable for debug output.""" From a432102be02d4e6d0e81dc8436b5d72c677b78e3 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Wed, 30 Mar 2016 19:08:37 +0200 Subject: [PATCH 04/16] Add webelem tests for remove_blank_target --- tests/unit/browser/test_webelem.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/tests/unit/browser/test_webelem.py b/tests/unit/browser/test_webelem.py index 1457e08ef..b3567eed8 100644 --- a/tests/unit/browser/test_webelem.py +++ b/tests/unit/browser/test_webelem.py @@ -36,7 +36,8 @@ from qutebrowser.browser import webelem def get_webelem(geometry=None, frame=None, null=False, style=None, - display='', attributes=None, tagname=None, classes=None): + display='', attributes=None, tagname=None, classes=None, + parent=None): """Factory for WebElementWrapper objects based on a mock. Args: @@ -55,6 +56,7 @@ def get_webelem(geometry=None, frame=None, null=False, style=None, elem.tagName.return_value = tagname elem.toOuterXml.return_value = '' elem.toPlainText.return_value = 'text' + elem.parent.return_value = parent attribute_dict = {} if attributes is None: @@ -325,6 +327,26 @@ class TestWebElementWrapper: elem._elem.toOuterXml.return_value = xml assert elem.debug_text() == expected + def test_remove_blank_target(self): + elem = get_webelem(tagname='a', attributes={'target': '_blank'}) + elem.remove_blank_target() + assert elem._elem.attribute('target') == '_top' + + for target in ['_self', '_parent', '_top', '']: + elem = get_webelem(tagname='a', attributes={'target': target}) + elem.remove_blank_target() + assert elem._elem.attribute('target') == target + + elem = get_webelem(tagname='a') + elem.remove_blank_target() + assert elem._elem.attribute('target') == '' + + elem = get_webelem(tagname='a', attributes={'target': '_blank'}) + elem_child = get_webelem(tagname='img', attributes={'src':'test'}, parent=elem._elem) + elem_child._elem.encloseWith(elem._elem) + elem_child.remove_blank_target() + assert elem._elem.attribute('target') == '_top' + class TestIsVisible: From f4f926cdca2019aee9674070f8a34430f57937b1 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Wed, 30 Mar 2016 19:48:47 +0200 Subject: [PATCH 05/16] Add integration tests for current target hints --- tests/integration/data/hints/link_blank.html | 10 ++++++++++ tests/integration/features/hints.feature | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 tests/integration/data/hints/link_blank.html diff --git a/tests/integration/data/hints/link_blank.html b/tests/integration/data/hints/link_blank.html new file mode 100644 index 000000000..f738e61dc --- /dev/null +++ b/tests/integration/data/hints/link_blank.html @@ -0,0 +1,10 @@ + + + + + A link to use hints on + + + Follow me! + + diff --git a/tests/integration/features/hints.feature b/tests/integration/features/hints.feature index d95cdf868..982fb57ef 100644 --- a/tests/integration/features/hints.feature +++ b/tests/integration/features/hints.feature @@ -18,3 +18,20 @@ Feature: Using hints And I run :hint links normal And I run :follow-hint xyz Then the error "No hint xyz!" should be shown + + Scenario: Following a hint and force to open in current tab. + When I open data/hints/link.html + And I run :hint links current + And I run :follow-hint a + And I wait until data/hello.txt is loaded + Then the following tabs should be open: + - data/hello.txt (active) + + Scenario: Following a hint and allow to open in new tab. + When I open data/hints/link_blank.html + And I run :hint links normal + And I run :follow-hint a + And I wait until data/hello.txt is loaded + Then the following tabs should be open: + - data/hints/link_blank.html + - data/hello.txt (active) From dd4710d596108880f601a30adeccfa8037c206a8 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Wed, 30 Mar 2016 19:54:42 +0200 Subject: [PATCH 06/16] Fix test_remove_blank_target --- tests/unit/browser/test_webelem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/browser/test_webelem.py b/tests/unit/browser/test_webelem.py index b3567eed8..8fd4a9787 100644 --- a/tests/unit/browser/test_webelem.py +++ b/tests/unit/browser/test_webelem.py @@ -342,7 +342,7 @@ class TestWebElementWrapper: assert elem._elem.attribute('target') == '' elem = get_webelem(tagname='a', attributes={'target': '_blank'}) - elem_child = get_webelem(tagname='img', attributes={'src':'test'}, parent=elem._elem) + elem_child = get_webelem(tagname='img', parent=elem._elem) elem_child._elem.encloseWith(elem._elem) elem_child.remove_blank_target() assert elem._elem.attribute('target') == '_top' From a242ba28d9e0ea499ea347a172a9635a3e464d9c Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Wed, 30 Mar 2016 23:44:05 +0200 Subject: [PATCH 07/16] Support multiple levels when checking link target --- qutebrowser/browser/webelem.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index 6100cd1b3..1e0e4f186 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -287,11 +287,13 @@ class WebElementWrapper(collections.abc.MutableMapping): def remove_blank_target(self): """Remove target from link.""" - for elem in [self._elem, self.parent()]: + elem = self._elem + while elem is not None: if elem.tagName().lower() == 'a': if elem.attribute('target') == '_blank': elem.setAttribute('target', '_top') break + elem = elem.parent() def debug_text(self): """Get a text based on an element suitable for debug output.""" From 00f1e699d4a7d7ad09cbbe1e3d3e0ce7ebc4afc2 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Wed, 30 Mar 2016 23:46:02 +0200 Subject: [PATCH 08/16] Add extra test to test_remove_blank_target --- tests/unit/browser/test_webelem.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/unit/browser/test_webelem.py b/tests/unit/browser/test_webelem.py index 8fd4a9787..879a7830e 100644 --- a/tests/unit/browser/test_webelem.py +++ b/tests/unit/browser/test_webelem.py @@ -339,7 +339,7 @@ class TestWebElementWrapper: elem = get_webelem(tagname='a') elem.remove_blank_target() - assert elem._elem.attribute('target') == '' + assert 'target' not in elem elem = get_webelem(tagname='a', attributes={'target': '_blank'}) elem_child = get_webelem(tagname='img', parent=elem._elem) @@ -347,6 +347,13 @@ class TestWebElementWrapper: elem_child.remove_blank_target() assert elem._elem.attribute('target') == '_top' + elem = get_webelem(tagname='button') + elem_child = get_webelem(tagname='div', parent=elem._elem) + elem_child._elem.encloseWith(elem._elem) + elem_child.remove_blank_target() + assert 'target' not in elem_child + assert 'target' not in elem + class TestIsVisible: From 0432ba68c6431f058a96701515175ee1555b70a2 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Wed, 30 Mar 2016 23:53:18 +0200 Subject: [PATCH 09/16] Add hints integration test --- tests/integration/features/hints.feature | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/integration/features/hints.feature b/tests/integration/features/hints.feature index 982fb57ef..3f6fab924 100644 --- a/tests/integration/features/hints.feature +++ b/tests/integration/features/hints.feature @@ -20,7 +20,7 @@ Feature: Using hints Then the error "No hint xyz!" should be shown Scenario: Following a hint and force to open in current tab. - When I open data/hints/link.html + When I open data/hints/link_blank.html And I run :hint links current And I run :follow-hint a And I wait until data/hello.txt is loaded @@ -35,3 +35,12 @@ Feature: Using hints Then the following tabs should be open: - data/hints/link_blank.html - data/hello.txt (active) + + Scenario: Following a hint to link with sub-element and force to open in current tab. + When I open data/hints/link_span.html + And I run :tab-close + And I run :hint links current + And I run :follow-hint a + And I wait until data/hello.txt is loaded + Then the following tabs should be open: + - data/hello.txt (active) From 0fe0f8454699abaa7aa1fe2b5246114e6a3f8e9c Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Thu, 31 Mar 2016 00:58:19 +0200 Subject: [PATCH 10/16] Fix loop and support area tag It appears the output of qtwebkit has a cycle, so we end in an endless loop. This limits the loop to 5 steps. --- qutebrowser/browser/webelem.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index 1e0e4f186..f56f20a0b 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -288,8 +288,11 @@ class WebElementWrapper(collections.abc.MutableMapping): def remove_blank_target(self): """Remove target from link.""" elem = self._elem - while elem is not None: - if elem.tagName().lower() == 'a': + for i in range(5): + if elem is None: + break + tag = elem.tagName().lower() + if tag == 'a' or tag == 'area': if elem.attribute('target') == '_blank': elem.setAttribute('target', '_top') break From ef6ffd6a3ad9b4522b70e32bc57df9cbf46c6428 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Thu, 31 Mar 2016 09:36:13 +0200 Subject: [PATCH 11/16] Add link_span.html --- tests/integration/data/hints/link_span.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tests/integration/data/hints/link_span.html diff --git a/tests/integration/data/hints/link_span.html b/tests/integration/data/hints/link_span.html new file mode 100644 index 000000000..2a5bbfdfd --- /dev/null +++ b/tests/integration/data/hints/link_span.html @@ -0,0 +1,10 @@ + + + + + A link to use hints on + + + Follow me! + + From e90ad3d9c02117ad2dfe8d47306dd7fe3fdc9178 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Thu, 31 Mar 2016 10:25:44 +0200 Subject: [PATCH 12/16] Complete coverage for webelem --- qutebrowser/browser/webelem.py | 2 +- tests/unit/browser/test_webelem.py | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index f56f20a0b..df481b98c 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -288,7 +288,7 @@ class WebElementWrapper(collections.abc.MutableMapping): def remove_blank_target(self): """Remove target from link.""" elem = self._elem - for i in range(5): + for _ in range(5): if elem is None: break tag = elem.tagName().lower() diff --git a/tests/unit/browser/test_webelem.py b/tests/unit/browser/test_webelem.py index 879a7830e..d0e30f5bb 100644 --- a/tests/unit/browser/test_webelem.py +++ b/tests/unit/browser/test_webelem.py @@ -347,11 +347,16 @@ class TestWebElementWrapper: elem_child.remove_blank_target() assert elem._elem.attribute('target') == '_top' - elem = get_webelem(tagname='button') - elem_child = get_webelem(tagname='div', parent=elem._elem) - elem_child._elem.encloseWith(elem._elem) - elem_child.remove_blank_target() - assert 'target' not in elem_child + elem[0] = get_webelem(tagname='div') + for i in range(1, 5): + elem[i] = get_webelem(tagname='div', parent=elem[i-1]) + elem[i]._elem.encloseWith(elem[i-1]._elem) + elem[4].remove_blank_target() + for i in range(5): + assert 'target' not in elem[i] + + elem = get_webelem(tagname='div') + elem.remove_blank_target() assert 'target' not in elem From 7b4a3fc86749e0ac8b0b9348af3e8a267cc67148 Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Thu, 31 Mar 2016 10:53:05 +0200 Subject: [PATCH 13/16] Update docs --- README.asciidoc | 2 +- doc/help/commands.asciidoc | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index a9f5fb236..7a629d2ce 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -164,6 +164,7 @@ Contributors, sorted by the number of commits in descending order: * Nathan Isom * Thorsten Wißmann * Austin Anderson +* Kevin Velghe * Alexey "Averrin" Nabrodov * ZDarian * Milan Svoboda @@ -215,7 +216,6 @@ Contributors, sorted by the number of commits in descending order: * Samuel Loury * Matthias Lisin * Marcel Schilling -* Kevin Velghe * Jean-Christophe Petkovich * Helen Sherwood-Taylor * HalosGhost diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index 79e0549dd..8b0979f58 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -275,7 +275,8 @@ Start hinting. * +'target'+: What to do with the selected element. - - `normal`: Open the link in the current tab. + - `normal`: Open the link. + - `current`: Open the link in the current tab. - `tab`: Open the link in a new tab (honoring the background-tabs setting). - `tab-fg`: Open the link in a new foreground tab. From f4f98c54fad6859ad198fb00b8c91fb7f13f8add Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Thu, 31 Mar 2016 11:10:15 +0200 Subject: [PATCH 14/16] Keep pylint happy --- qutebrowser/browser/hints.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 040d553c5..3b71c0266 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -71,7 +71,8 @@ class HintContext: elems: A mapping from key strings to (elem, label) namedtuples. baseurl: The URL of the current page. target: What to do with the opened links. - normal/current/tab/tab_fg/tab_bg/window: Get passed to BrowserTab. + normal/current/tab/tab_fg/tab_bg/window: Get passed to + BrowserTab. yank/yank_primary: Yank to clipboard/primary selection. run: Run a command. fill: Fill commandline with link. From 0652637fbe08adb1c066a7e846be02e3c9ef025f Mon Sep 17 00:00:00 2001 From: Kevin Velghe Date: Fri, 1 Apr 2016 01:30:24 +0200 Subject: [PATCH 15/16] Refactor unit tests for remove_blank_target --- tests/unit/browser/test_webelem.py | 45 ++++++++++++++++++------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/tests/unit/browser/test_webelem.py b/tests/unit/browser/test_webelem.py index d0e30f5bb..459a8b1b1 100644 --- a/tests/unit/browser/test_webelem.py +++ b/tests/unit/browser/test_webelem.py @@ -327,38 +327,47 @@ class TestWebElementWrapper: elem._elem.toOuterXml.return_value = xml assert elem.debug_text() == expected - def test_remove_blank_target(self): - elem = get_webelem(tagname='a', attributes={'target': '_blank'}) + +class TestRemoveBlankTarget: + + @pytest.mark.parametrize('tagname', ['a', 'area']) + @pytest.mark.parametrize('target', ['_self', '_parent', '_top', '']) + def test_keep_target(self, tagname, target): + elem = get_webelem(tagname=tagname, attributes={'target': target}) elem.remove_blank_target() - assert elem._elem.attribute('target') == '_top' + assert elem['target'] == target - for target in ['_self', '_parent', '_top', '']: - elem = get_webelem(tagname='a', attributes={'target': target}) - elem.remove_blank_target() - assert elem._elem.attribute('target') == target - - elem = get_webelem(tagname='a') + @pytest.mark.parametrize('tagname', ['a', 'area']) + def test_no_target(self, tagname): + elem = get_webelem(tagname=tagname) elem.remove_blank_target() assert 'target' not in elem - elem = get_webelem(tagname='a', attributes={'target': '_blank'}) + @pytest.mark.parametrize('tagname', ['a', 'area']) + def test_blank_target(self, tagname): + elem = get_webelem(tagname=tagname, attributes={'target': '_blank'}) + elem.remove_blank_target() + assert elem['target'] == '_top' + + @pytest.mark.parametrize('tagname', ['a', 'area']) + def test_ancestor_blank_target(self, tagname): + elem = get_webelem(tagname=tagname, attributes={'target': '_blank'}) elem_child = get_webelem(tagname='img', parent=elem._elem) elem_child._elem.encloseWith(elem._elem) elem_child.remove_blank_target() - assert elem._elem.attribute('target') == '_top' + assert elem['target'] == '_top' + @pytest.mark.parametrize('depth', [1, 5, 10]) + def test_no_link(self, depth): + elem = [None] * depth elem[0] = get_webelem(tagname='div') - for i in range(1, 5): + for i in range(1, depth): elem[i] = get_webelem(tagname='div', parent=elem[i-1]) elem[i]._elem.encloseWith(elem[i-1]._elem) - elem[4].remove_blank_target() - for i in range(5): + elem[-1].remove_blank_target() + for i in range(depth): assert 'target' not in elem[i] - elem = get_webelem(tagname='div') - elem.remove_blank_target() - assert 'target' not in elem - class TestIsVisible: From b5636a35317730129618d36a1b486750e9954baf Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 1 Apr 2016 06:14:30 +0200 Subject: [PATCH 16/16] Update changelog --- CHANGELOG.asciidoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 385f42e97..4ee5b8d26 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -34,6 +34,8 @@ Added for hints instead of single characters. - New `--all` argument for `:download-cancel` to cancel all running downloads. - New `password_fill` userscript to fill passwords using the `pass` executable. +- New `current` hinting mode which forces opening hints in the current tab + (even with `target="_blank"`) Changed ~~~~~~~