From fad9c902c932c62e5c95fe117bffec22899f9474 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Fri, 12 Oct 2018 22:28:07 +0700 Subject: [PATCH 001/492] Fix _hint_scattered --- qutebrowser/browser/hints.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index b93155255..cfa435b3e 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -454,21 +454,13 @@ class HintManager(QObject): # Determine how many digits the link hints will require in the worst # case. Usually we do not need all of these digits for every link # single hint, so we can show shorter hints for a few of the links. - needed = max(min_chars, math.ceil(math.log(len(elems), len(chars)))) + needed = max(min_chars, math.ceil( + math.log(len(elems), len(chars))-1e-13)) # Short hints are the number of hints we can possibly show which are # (needed - 1) digits in length. - if needed > min_chars: + if needed > min_chars and needed > 1: total_space = len(chars) ** needed - # Calculate short_count naively, by finding the avaiable space and - # dividing by the number of spots we would loose by adding a - # short element - short_count = math.floor((total_space - len(elems)) / - len(chars)) - # Check if we double counted above to warrant another short_count - # https://github.com/qutebrowser/qutebrowser/issues/3242 - if total_space - (short_count * len(chars) + - (len(elems) - short_count)) >= len(chars) - 1: - short_count += 1 + short_count = (total_space - len(elems)) // (len(chars) - 1) else: short_count = 0 From 2403a0fd73f9a8cd75805ec0cab59cc9408e4533 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Fri, 12 Oct 2018 18:23:36 -0700 Subject: [PATCH 002/492] Cache hot config accesses in completion --- qutebrowser/completion/completiondelegate.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qutebrowser/completion/completiondelegate.py b/qutebrowser/completion/completiondelegate.py index e0e56e023..3ed5f0a64 100644 --- a/qutebrowser/completion/completiondelegate.py +++ b/qutebrowser/completion/completiondelegate.py @@ -166,11 +166,11 @@ class CompletionItemDelegate(QStyledItemDelegate): self._painter.save() if self._opt.state & QStyle.State_Selected: - color = config.val.colors.completion.item.selected.fg + color = config.cache['colors.completion.item.selected.fg'] elif not self._opt.state & QStyle.State_Enabled: - color = config.val.colors.completion.category.fg + color = config.cache['colors.completion.category.fg'] else: - colors = config.val.colors.completion.fg + colors = config.cache['colors.completion.fg'] # if multiple colors are set, use different colors per column color = colors[col % len(colors)] self._painter.setPen(color) From c2f027bf2be18936568f4e9173cf10f5b54156a4 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Fri, 12 Oct 2018 19:37:59 -0700 Subject: [PATCH 003/492] Add tests for rounding error --- tests/unit/browser/test_hints.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/tests/unit/browser/test_hints.py b/tests/unit/browser/test_hints.py index 69be5c420..4663aefd6 100644 --- a/tests/unit/browser/test_hints.py +++ b/tests/unit/browser/test_hints.py @@ -19,6 +19,7 @@ import string import functools +import itertools import operator import pytest @@ -27,8 +28,8 @@ import qutebrowser.browser.hints @pytest.mark.parametrize('min_len', [0, 3]) -@pytest.mark.parametrize('num_chars', [9]) -@pytest.mark.parametrize('num_elements', range(1, 26)) +@pytest.mark.parametrize('num_chars', [5, 9]) +@pytest.mark.parametrize('num_elements', itertools.chain(range(1, 26), [125])) def test_scattered_hints_count(win_registry, mode_manager, min_len, num_chars, num_elements): """Test scattered hints function. @@ -62,7 +63,9 @@ def test_scattered_hints_count(win_registry, mode_manager, min_len, # 'ab' and 'c' can assert abs(functools.reduce(operator.sub, hint_lens)) <= 1 - longest_hints = [x for x in hints if len(x) == max(hint_lens)] + longest_hint_len = max(hint_lens) + shortest_hint_len = min(hint_lens) + longest_hints = [x for x in hints if len(x) == longest_hint_len] if min_len < max(hint_lens) - 1: # Check if we have any unique prefixes. For example, 'la' @@ -72,3 +75,17 @@ def test_scattered_hints_count(win_registry, mode_manager, min_len, prefix = x[:-1] count_map[prefix] = count_map.get(prefix, 0) + 1 assert all(e != 1 for e in count_map.values()) + + # Check that the longest hint length isn't too long + if longest_hint_len > min_len and longest_hint_len > 1: + assert num_chars ** (longest_hint_len - 1) < num_elements + + # Check longest hint is not too short + assert num_chars ** longest_hint_len >= num_elements + + if longest_hint_len > min_len and longest_hint_len > 1: + # Check that the longest hint length isn't too long + assert num_chars ** (longest_hint_len - 1) < num_elements + if shortest_hint_len == longest_hint_len: + # Check that we really couldn't use any short links + assert (num_chars ** longest_hint_len) - num_elements < len(chars) - 1 From 622ef9294c62ab61c150343425e930c96018c1bc Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sat, 13 Oct 2018 13:49:08 +0700 Subject: [PATCH 004/492] Use integer arithmetic to compute ceil log --- qutebrowser/browser/hints.py | 6 ++---- qutebrowser/utils/utils.py | 13 +++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index cfa435b3e..c4b5f51af 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -21,7 +21,6 @@ import collections import functools -import math import os import re import html @@ -454,8 +453,7 @@ class HintManager(QObject): # Determine how many digits the link hints will require in the worst # case. Usually we do not need all of these digits for every link # single hint, so we can show shorter hints for a few of the links. - needed = max(min_chars, math.ceil( - math.log(len(elems), len(chars))-1e-13)) + needed = max(min_chars, utils.ceil_log(len(elems), len(chars))) # Short hints are the number of hints we can possibly show which are # (needed - 1) digits in length. if needed > min_chars and needed > 1: @@ -487,7 +485,7 @@ class HintManager(QObject): elems: The elements to generate labels for. """ strings = [] - needed = max(min_chars, math.ceil(math.log(len(elems), len(chars)))) + needed = max(min_chars, utils.ceil_log(len(elems), len(chars))) for i in range(len(elems)): strings.append(self._number_to_hint_str(i, chars, needed)) return strings diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py index f2e19a743..a6c8e866c 100644 --- a/qutebrowser/utils/utils.py +++ b/qutebrowser/utils/utils.py @@ -712,3 +712,16 @@ def guess_mimetype(filename, fallback=False): else: raise ValueError("Got None mimetype for {}".format(filename)) return mimetype + + +def ceil_log(number, base): + """Compute max(1, ceil(log(number, base))). + + Use only integer arithmetic in order to avoid numerical error. + """ + result = 1 + accum = base + while accum < number: + result += 1 + accum *= base + return result From 97bc4fa6a2f3d05b25f22268236b5fc627eae7e5 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sat, 13 Oct 2018 15:13:26 +0700 Subject: [PATCH 005/492] Add comment for explanation --- qutebrowser/browser/hints.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index c4b5f51af..cfd6f7c4e 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -454,10 +454,13 @@ class HintManager(QObject): # case. Usually we do not need all of these digits for every link # single hint, so we can show shorter hints for a few of the links. needed = max(min_chars, utils.ceil_log(len(elems), len(chars))) + # Short hints are the number of hints we can possibly show which are # (needed - 1) digits in length. if needed > min_chars and needed > 1: total_space = len(chars) ** needed + # For each 1 short link being added, len(chars) long links are + # removed, therefore the space removed is len(chars) - 1. short_count = (total_space - len(elems)) // (len(chars) - 1) else: short_count = 0 From 79f63b9e819ca2cd3696274d9b654ed21e3c9fd3 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Sat, 13 Oct 2018 08:55:55 -0700 Subject: [PATCH 006/492] Fix line length warning in hint scatter test --- tests/unit/browser/test_hints.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/browser/test_hints.py b/tests/unit/browser/test_hints.py index 4663aefd6..c89d11e92 100644 --- a/tests/unit/browser/test_hints.py +++ b/tests/unit/browser/test_hints.py @@ -88,4 +88,5 @@ def test_scattered_hints_count(win_registry, mode_manager, min_len, assert num_chars ** (longest_hint_len - 1) < num_elements if shortest_hint_len == longest_hint_len: # Check that we really couldn't use any short links - assert (num_chars ** longest_hint_len) - num_elements < len(chars) - 1 + assert ((num_chars ** longest_hint_len) - num_elements < + len(chars) - 1) From 77f3ca87277b8713afc183ee2ea01623a80eeef3 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Mon, 15 Oct 2018 22:43:54 +0700 Subject: [PATCH 007/492] Optimize HintLabel.update_text --- qutebrowser/browser/hints.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 0c95f5657..6ee048141 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -111,8 +111,11 @@ class HintLabel(QLabel): unmatched = html.escape(unmatched) match_color = html.escape(config.val.colors.hints.match.fg) - self.setText('{}{}'.format( - match_color, matched, unmatched)) + if matched: + self.setText('{}{}'.format( + match_color, matched, unmatched)) + else: + self.setText(unmatched) self.adjustSize() @pyqtSlot() From b6e38cddd852cc2b20d5be1db6a443393341e224 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 19:51:12 +0200 Subject: [PATCH 008/492] Update certifi from 2018.8.24 to 2018.10.15 --- misc/requirements/requirements-codecov.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-codecov.txt b/misc/requirements/requirements-codecov.txt index efd023ea6..478688da5 100644 --- a/misc/requirements/requirements-codecov.txt +++ b/misc/requirements/requirements-codecov.txt @@ -1,6 +1,6 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py -certifi==2018.8.24 +certifi==2018.10.15 chardet==3.0.4 codecov==2.0.15 coverage==4.5.1 From fb4a247e93887961d1d5e0efd5aa7de4978a3e6a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 19:51:13 +0200 Subject: [PATCH 009/492] Update certifi from 2018.8.24 to 2018.10.15 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index d4b56ae7c..f262418f7 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -2,7 +2,7 @@ asn1crypto==0.24.0 astroid==2.0.4 -certifi==2018.8.24 +certifi==2018.10.15 cffi==1.11.5 chardet==3.0.4 cryptography==2.3.1 From 712f75266b6c9aa24a145720f1151b329b306b17 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 19:51:15 +0200 Subject: [PATCH 010/492] Update flake8-copyright from 0.2.0 to 0.2.2 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index 8ae3ac64d..953adf2f3 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -5,7 +5,7 @@ flake8==3.5.0 flake8-bugbear==18.8.0 flake8-builtins==1.4.1 # rq.filter: != 1.4.0 flake8-comprehensions==1.4.1 -flake8-copyright==0.2.0 +flake8-copyright==0.2.2 flake8-debugger==3.1.0 flake8-deprecated==1.3 flake8-docstrings==1.3.0 From d647a9987fd4c3d6912a2ace1c68756d74cc4c83 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 19:51:16 +0200 Subject: [PATCH 011/492] Update pydocstyle from 2.1.1 to 3.0.0 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index 953adf2f3..f0132ecf8 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -20,7 +20,7 @@ mccabe==0.6.1 pathmatch==0.2.1 pep8-naming==0.7.0 pycodestyle==2.3.1 # rq.filter: < 2.4.0 -pydocstyle==2.1.1 +pydocstyle==3.0.0 pyflakes==2.0.0 six==1.11.0 snowballstemmer==1.2.1 From 232e917f5216e0654433ecc60a16d7f88e174aed Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 19:51:18 +0200 Subject: [PATCH 012/492] Update hypothesis from 3.74.3 to 3.76.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 04eb730aa..eeff113c6 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -13,7 +13,7 @@ fields==5.0.0 Flask==1.0.2 glob2==0.6 hunter==2.0.2 -hypothesis==3.74.3 +hypothesis==3.76.0 itsdangerous==0.24 # Jinja2==2.10 Mako==1.0.7 From b37613381fa100e8ba97c1dbcad0ce5e642ba0cf Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 19:51:19 +0200 Subject: [PATCH 013/492] Update py from 1.6.0 to 1.7.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index eeff113c6..5775a7820 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -22,7 +22,7 @@ more-itertools==4.3.0 parse==1.9.0 parse-type==0.4.2 pluggy==0.7.1 -py==1.6.0 +py==1.7.0 py-cpuinfo==4.0.0 pytest==3.6.4 # rq.filter: <3.7 pytest-bdd==2.21.0 From 70db07472646670d9fab77cdffaea438b0cbf8e8 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 19:51:21 +0200 Subject: [PATCH 014/492] Update py from 1.6.0 to 1.7.0 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index 28a3072e1..e46a7e25f 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py pluggy==0.7.1 -py==1.6.0 +py==1.7.0 six==1.11.0 toml==0.10.0 tox==3.5.1 From 82acfabb51d326ad80232fbfb1b55916687cae0d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 19:51:22 +0200 Subject: [PATCH 015/492] Update tox from 3.5.1 to 3.5.2 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index e46a7e25f..b79a4a312 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -4,5 +4,5 @@ pluggy==0.7.1 py==1.7.0 six==1.11.0 toml==0.10.0 -tox==3.5.1 +tox==3.5.2 virtualenv==16.0.0 From 394c263b7ecac6e6d666dc5e5980216023c23b48 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 15 Oct 2018 19:51:24 +0200 Subject: [PATCH 016/492] Update colorama from 0.3.9 to 0.4.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c54d143a6..3edd4314a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py attrs==18.2.0 -colorama==0.3.9 +colorama==0.4.0 cssutils==1.0.2 Jinja2==2.10 MarkupSafe==1.0 From b7c1d04c88628d7eb56c8543a4439c15b5f9b276 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 10:26:34 +0200 Subject: [PATCH 017/492] Load navigate page properly --- tests/end2end/features/navigate.feature | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/end2end/features/navigate.feature b/tests/end2end/features/navigate.feature index b5ad6ff54..a7cd7fbd4 100644 --- a/tests/end2end/features/navigate.feature +++ b/tests/end2end/features/navigate.feature @@ -76,7 +76,8 @@ Feature: Using :navigate Then data/navigate/next.html should be loaded Scenario: Navigating with invalid selector - When I set hints.selectors to {"links": ["@"]} + When I open data/navigate + And I set hints.selectors to {"links": ["@"]} And I run :navigate next Then the error "SyntaxError: Failed to execute 'querySelectorAll' on 'Document': '@' is not a valid selector." should be shown From 965a2e280651ea992148fff7b1ac87b0540fec96 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 10:59:37 +0200 Subject: [PATCH 018/492] Remove unneeded win_id argument for HintManager.start --- qutebrowser/browser/hints.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 0c95f5657..b04ec9bd4 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -639,9 +639,8 @@ class HintManager(QObject): @cmdutils.register(instance='hintmanager', scope='tab', name='hint', star_args_optional=True, maxsplit=2) - @cmdutils.argument('win_id', win_id=True) def start(self, # pylint: disable=keyword-arg-before-vararg - group='all', target=Target.normal, *args, win_id, mode=None, + group='all', target=Target.normal, *args, mode=None, add_history=False, rapid=False, first=False): """Start hinting. @@ -715,7 +714,7 @@ class HintManager(QObject): mode_manager = objreg.get('mode-manager', scope='window', window=self._win_id) if mode_manager.mode == usertypes.KeyMode.hint: - modeman.leave(win_id, usertypes.KeyMode.hint, 're-hinting') + modeman.leave(self._win_id, usertypes.KeyMode.hint, 're-hinting') if rapid: if target in [Target.tab_bg, Target.window, Target.run, From 552db64028a171dfdb433b2e302cac0c9f093bcc Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 10:59:55 +0200 Subject: [PATCH 019/492] Add message_bridge fixture --- tests/conftest.py | 2 +- tests/helpers/messagemock.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 7bf67fdae..f53a70054 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -35,7 +35,7 @@ pytest.register_assert_rewrite('helpers') from helpers import logfail from helpers.logfail import fail_on_logging -from helpers.messagemock import message_mock +from helpers.messagemock import message_mock, message_bridge from helpers.fixtures import * # noqa: F403 from qutebrowser.utils import qtutils, standarddir, usertypes, utils, version from qutebrowser.misc import objects diff --git a/tests/helpers/messagemock.py b/tests/helpers/messagemock.py index 39e653719..ee32819dd 100644 --- a/tests/helpers/messagemock.py +++ b/tests/helpers/messagemock.py @@ -24,7 +24,7 @@ import logging import attr import pytest -from qutebrowser.utils import usertypes, message +from qutebrowser.utils import usertypes, message, objreg @attr.s @@ -90,3 +90,12 @@ def message_mock(): mmock.patch() yield mmock mmock.unpatch() + + +@pytest.fixture +def message_bridge(win_registry): + """Fixture to get a MessageBridge.""" + bridge = message.MessageBridge() + objreg.register('message-bridge', bridge, scope='window', window=0) + yield bridge + objreg.delete('message-bridge', scope='window', window=0) From 52ceb81a73c310f023ae72d4c36d497a8828d529 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 11:00:05 +0200 Subject: [PATCH 020/492] Add TabbedBrowserStub.current_url() --- tests/helpers/stubs.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 7b81b8c64..9bf5b837d 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -502,6 +502,7 @@ class TabbedBrowserStub(QObject): self.widget = TabWidgetStub() self.shutting_down = False self.opened_url = None + self.cur_url = None def on_tab_close_requested(self, idx): del self.widget.tabs[idx] @@ -515,6 +516,11 @@ class TabbedBrowserStub(QObject): def openurl(self, url, *, newtab): self.opened_url = url + def current_url(self): + if self.current_url is None: + raise ValueError("current_url got called with cur_url None!") + return self.cur_url + class TabWidgetStub(QObject): From 767a1c102c6cee14b341d5c9a0167971f10a2d55 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 11:00:24 +0200 Subject: [PATCH 021/492] Add hint benchmark tests --- tests/end2end/data/hints/benchmark.html | 510 ++++++++++++++++++++++++ tests/unit/browser/test_hints.py | 64 ++- 2 files changed, 572 insertions(+), 2 deletions(-) create mode 100644 tests/end2end/data/hints/benchmark.html diff --git a/tests/end2end/data/hints/benchmark.html b/tests/end2end/data/hints/benchmark.html new file mode 100644 index 000000000..355284ec2 --- /dev/null +++ b/tests/end2end/data/hints/benchmark.html @@ -0,0 +1,510 @@ + + + + + + Hint benchmark + + + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + ! + + diff --git a/tests/unit/browser/test_hints.py b/tests/unit/browser/test_hints.py index 69be5c420..8aa74274a 100644 --- a/tests/unit/browser/test_hints.py +++ b/tests/unit/browser/test_hints.py @@ -22,15 +22,75 @@ import functools import operator import pytest +from PyQt5.QtCore import QUrl +from qutebrowser.utils import usertypes import qutebrowser.browser.hints +@pytest.fixture(autouse=True) +def setup(win_registry, mode_manager): + pass + + +@pytest.fixture +def tabbed_browser(tabbed_browser_stubs, web_tab): + tb = tabbed_browser_stubs[0] + tb.widget.tabs = [web_tab] + tb.widget.current_index = 1 + tb.widget.cur_url = QUrl('https://www.example.com/') + return tb + + +def test_show_benchmark(benchmark, tabbed_browser, qtbot, message_bridge, + mode_manager): + """Benchmark showing/drawing of hint labels.""" + tab = tabbed_browser.widget.tabs[0] + + with qtbot.wait_signal(tab.load_finished): + tab.openurl(QUrl('qute://testdata/data/hints/benchmark.html')) + + manager = qutebrowser.browser.hints.HintManager(0, 0) + + def bench(): + with qtbot.wait_signal(mode_manager.entered): + manager.start() + + with qtbot.wait_signal(mode_manager.left): + mode_manager.leave(usertypes.KeyMode.hint) + + benchmark(bench) + + +def test_match_benchmark(benchmark, tabbed_browser, qtbot, message_bridge, + mode_manager, qapp): + """Benchmark matching of hint labels.""" + tab = tabbed_browser.widget.tabs[0] + + with qtbot.wait_signal(tab.load_finished): + tab.openurl(QUrl('qute://testdata/data/hints/benchmark.html')) + + manager = qutebrowser.browser.hints.HintManager(0, 0) + + with qtbot.wait_signal(mode_manager.entered): + manager.start() + + def bench(): + manager.handle_partial_key('a') + qapp.processEvents() + manager.handle_partial_key('') + qapp.processEvents() + + benchmark(bench) + + with qtbot.wait_signal(mode_manager.left): + mode_manager.leave(usertypes.KeyMode.hint) + + @pytest.mark.parametrize('min_len', [0, 3]) @pytest.mark.parametrize('num_chars', [9]) @pytest.mark.parametrize('num_elements', range(1, 26)) -def test_scattered_hints_count(win_registry, mode_manager, min_len, - num_chars, num_elements): +def test_scattered_hints_count(min_len, num_chars, num_elements): """Test scattered hints function. Tests many properties from an invocation of _hint_scattered, including From fa489201ecb97ae40f71fac7a3b84290acdbca4a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 11:41:15 +0200 Subject: [PATCH 022/492] Update changelog --- doc/changelog.asciidoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index f3fc74e4d..32018b7ba 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -40,7 +40,7 @@ Changed (`:close`), while `:qa` quits (`:quit`). The behavior of `:wq` remains unchanged (`:quit --save`), as closing a window while saving the session doesn't make sense. -- Completion highlighting is now done differently (using QSyntaxHighlither), +- Completion highlighting is now done differently (using `QSyntaxHighlighter`), which should fix some highlighting corner-cases. - The `QtColor` config type now also understands colors like `rgb(...)`. - `:yank` now has a `--quiet` option which causes it to not display a message. @@ -48,6 +48,7 @@ Changed - The `content.host_blocking.enabled` setting now supports URL patterns, so the adblocker can be disabled on a given page. - Elements with a `tabindex` attribute now also get hints by default. +- Various small performance improvements for hints and the completion. Fixed ~~~~~ From ca7c53d4df874400125dc5c672d1cf8d36fa0198 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 12:29:43 +0200 Subject: [PATCH 023/492] Add tests for utils.ceil_log --- tests/unit/utils/test_utils.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/unit/utils/test_utils.py b/tests/unit/utils/test_utils.py index 3b580cd00..2b38aadc4 100644 --- a/tests/unit/utils/test_utils.py +++ b/tests/unit/utils/test_utils.py @@ -28,11 +28,14 @@ import functools import socket import re import shlex +import math import attr from PyQt5.QtCore import QUrl from PyQt5.QtGui import QColor, QClipboard import pytest +import hypothesis +from hypothesis import strategies import qutebrowser import qutebrowser.utils # for test_qualname @@ -837,3 +840,24 @@ def test_guess_mimetype(filename, expected): def test_guess_mimetype_no_fallback(): with pytest.raises(ValueError): utils.guess_mimetype('test.blabla') + + +@hypothesis.given(number=strategies.integers(min_value=1), + base=strategies.integers(min_value=2)) +@hypothesis.example(number=125, base=5) +def test_ceil_log_hypothesis(number, base): + exponent = utils.ceil_log(number, base) + assert base ** exponent >= number + # With base=2, number=1 we get exponent=1 + # 2**1 > 1, but 2**0 == 1. + if exponent > 1: + assert base ** (exponent - 1) < number + + +@pytest.mark.parametrize('number, base', [(64, 0), (0, 64), (64, -1), + (-1, 64), (1, 1)]) +def test_ceil_log_invalid(number, base): + with pytest.raises(Exception): # ValueError/ZeroDivisionError + math.log(number, base) + with pytest.raises(ValueError): + utils.ceil_log(number, base) From 5840b60967f54bcb5dc8fc3d12ed52c760b4298d Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 12:29:49 +0200 Subject: [PATCH 024/492] Fix utils.ceil_log with invalid log values --- qutebrowser/utils/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py index a6c8e866c..6119675ba 100644 --- a/qutebrowser/utils/utils.py +++ b/qutebrowser/utils/utils.py @@ -719,6 +719,8 @@ def ceil_log(number, base): Use only integer arithmetic in order to avoid numerical error. """ + if number < 1 or base < 2: + raise ValueError("math domain error") result = 1 accum = base while accum < number: From 8a622690180f2c338a8acd8d7bff44430dfac48a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 12:30:19 +0200 Subject: [PATCH 025/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 32018b7ba..662cada0d 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -56,6 +56,7 @@ Fixed - Invalid world IDs now get rejected for `:jseval` and GreaseMonkey scripts. - When websites suggest download filenames with invalid characters, those are now correctly replaced. +- Invalid hint length calculation in certain rare cases. v1.5.1 ------ From 6f505566b8857adef9fbed29da2defbe8ba47d41 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 17 Oct 2018 23:41:51 +0700 Subject: [PATCH 026/492] Fix docstring for HintManager.filter_hints --- qutebrowser/browser/hints.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 1e2b46be6..31f56602f 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -833,9 +833,10 @@ class HintManager(QObject): Args: filterstr: The string to filter with, or None to use the filter - from previous call (saved in `self._filterstr`). If - `filterstr` is an empty string or if both `filterstr` - and `self._filterstr` are None, all hints are shown. + from previous call (saved in `self._context.filterstr`). + If `filterstr` is an empty string or if both `filterstr` + and `self._context.filterstr` are None, all hints are + shown. """ if filterstr is None: filterstr = self._context.filterstr From 9727975914a338f3f57825e304955c33237bc7e8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 16 Oct 2018 15:10:32 +0200 Subject: [PATCH 027/492] Expose tab if needed --- tests/unit/browser/test_hints.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/unit/browser/test_hints.py b/tests/unit/browser/test_hints.py index 69612df64..9a8a024c9 100644 --- a/tests/unit/browser/test_hints.py +++ b/tests/unit/browser/test_hints.py @@ -25,7 +25,7 @@ import operator import pytest from PyQt5.QtCore import QUrl -from qutebrowser.utils import usertypes +from qutebrowser.utils import usertypes, qtutils import qutebrowser.browser.hints @@ -40,6 +40,11 @@ def tabbed_browser(tabbed_browser_stubs, web_tab): tb.widget.tabs = [web_tab] tb.widget.current_index = 1 tb.widget.cur_url = QUrl('https://www.example.com/') + + if not qtutils.version_check('5.11', compiled=False): + # No elements found if we don't do this. + web_tab.container.expose() + return tb From 8ca30df7d6be506ff7831ef960625c2ce9d182a2 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Wed, 17 Oct 2018 19:52:24 -0700 Subject: [PATCH 028/492] Cache hot config accesses for hints --- qutebrowser/browser/hints.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 31f56602f..d8d5a0624 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -101,7 +101,7 @@ class HintLabel(QLabel): matched: The part of the text which was typed. unmatched: The part of the text which was not typed yet. """ - if (config.val.hints.uppercase and + if (config.cache['hints.uppercase'] and self._context.hint_mode in ['letter', 'word']): matched = html.escape(matched.upper()) unmatched = html.escape(unmatched.upper()) @@ -109,7 +109,7 @@ class HintLabel(QLabel): matched = html.escape(matched) unmatched = html.escape(unmatched) - match_color = html.escape(config.val.colors.hints.match.fg) + match_color = html.escape(config.cache['colors.hints.match.fg']) if matched: self.setText('{}{}'.format( match_color, matched, unmatched)) @@ -125,7 +125,7 @@ class HintLabel(QLabel): log.hints.debug("Frame for {!r} vanished!".format(self)) self.hide() return - no_js = config.val.hints.find_implementation != 'javascript' + no_js = config.cache['hints.find_implementation'] != 'javascript' rect = self.elem.rect_on_view(no_js=no_js) self.move(rect.x(), rect.y()) From 1bcf57f6301c7c8402724fd738dbb025fadd2685 Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Thu, 18 Oct 2018 16:34:20 +0700 Subject: [PATCH 029/492] Simplify logic in HintKeyParser.handle --- qutebrowser/keyinput/modeparsers.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qutebrowser/keyinput/modeparsers.py b/qutebrowser/keyinput/modeparsers.py index 270590fff..ca7f7235e 100644 --- a/qutebrowser/keyinput/modeparsers.py +++ b/qutebrowser/keyinput/modeparsers.py @@ -259,9 +259,8 @@ class HintKeyParser(CommandKeyParser): Returns: True if the match has been handled, False otherwise. """ - dry_run_match = super().handle(e, dry_run=True) if dry_run: - return dry_run_match + return super().handle(e, dry_run=True) if keyutils.is_special(e.key(), e.modifiers()): log.keyboard.debug("Got special key, clearing keychain") From c5f4587d4e9710212b8e784cf19175655d596bbb Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Thu, 18 Oct 2018 18:20:45 +0700 Subject: [PATCH 030/492] Fix _partial_timer connection in modeparsers --- qutebrowser/keyinput/modeparsers.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/qutebrowser/keyinput/modeparsers.py b/qutebrowser/keyinput/modeparsers.py index 270590fff..6846c5a7a 100644 --- a/qutebrowser/keyinput/modeparsers.py +++ b/qutebrowser/keyinput/modeparsers.py @@ -71,6 +71,7 @@ class NormalKeyParser(CommandKeyParser): self._read_config('normal') self._partial_timer = usertypes.Timer(self, 'partial-match') self._partial_timer.setSingleShot(True) + self._partial_timer.timeout.connect(self._clear_partial_match) self._inhibited = False self._inhibited_timer = usertypes.Timer(self, 'normal-inhibited') self._inhibited_timer.setSingleShot(True) @@ -101,7 +102,6 @@ class NormalKeyParser(CommandKeyParser): timeout = config.val.input.partial_timeout if timeout != 0: self._partial_timer.setInterval(timeout) - self._partial_timer.timeout.connect(self._clear_partial_match) self._partial_timer.start() return match @@ -133,11 +133,7 @@ class NormalKeyParser(CommandKeyParser): def _stop_timers(self): super()._stop_timers() self._partial_timer.stop() - try: - self._partial_timer.timeout.disconnect(self._clear_partial_match) - except TypeError: - # no connections - pass + self._partial_timer.timeout.disconnect(self._clear_partial_match) self._inhibited_timer.stop() try: self._inhibited_timer.timeout.disconnect(self._clear_inhibited) From ac1b59a3113e339f16896e32d41a1e5d6178dade Mon Sep 17 00:00:00 2001 From: Christian Helbling Date: Thu, 18 Oct 2018 17:48:49 +0200 Subject: [PATCH 031/492] revert 559059d and cd20c32 to fix #4349 (Exiting video player exits fullscreen) --- qutebrowser/browser/commands.py | 13 +++++++++++-- qutebrowser/mainwindow/mainwindow.py | 13 ++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index a3f301ae5..8ea3c08a5 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -35,7 +35,7 @@ from qutebrowser.browser import (urlmarks, browsertab, inspector, navigate, webelem, downloads) from qutebrowser.keyinput import modeman, keyutils from qutebrowser.utils import (message, usertypes, log, qtutils, urlutils, - objreg, utils, standarddir) + objreg, utils, standarddir, debug) from qutebrowser.utils.usertypes import KeyMode from qutebrowser.misc import editor, guiprocess from qutebrowser.completion.models import urlmodel, miscmodels @@ -2234,7 +2234,16 @@ class CommandDispatcher: return window = self._tabbed_browser.widget.window() - window.setWindowState(window.windowState() ^ Qt.WindowFullScreen) + if window.isFullScreen(): + window.setWindowState( + window.state_before_fullscreen & ~Qt.WindowFullScreen) + else: + window.state_before_fullscreen = window.windowState() + window.setWindowState( + window.state_before_fullscreen | Qt.WindowFullScreen) + log.misc.debug('state before fullscreen: {}'.format( + debug.qflags_key(Qt, window.state_before_fullscreen))) + @cmdutils.register(instance='command-dispatcher', scope='window', name='tab-mute') diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index 3fdad13d1..249e6e81d 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -31,7 +31,7 @@ from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication, QSizePolicy from qutebrowser.commands import runners, cmdutils from qutebrowser.config import config, configfiles from qutebrowser.utils import (message, log, usertypes, qtutils, objreg, utils, - jinja) + jinja, debug) from qutebrowser.mainwindow import messageview, prompt from qutebrowser.completion import completionwidget, completer from qutebrowser.keyinput import modeman @@ -136,6 +136,7 @@ class MainWindow(QWidget): Attributes: status: The StatusBar widget. tabbed_browser: The TabbedBrowser widget. + state_before_fullscreen: window state before activation of fullscreen. _downloadview: The DownloadView widget. _vbox: The main QVBoxLayout. _commandrunner: The main CommandRunner instance. @@ -237,6 +238,8 @@ class MainWindow(QWidget): objreg.get("app").new_window.emit(self) self._set_decoration(config.val.window.hide_decoration) + self.state_before_fullscreen = self.windowState() + def _init_geometry(self, geometry): """Initialize the window geometry or load it from disk.""" if geometry is not None: @@ -516,9 +519,13 @@ class MainWindow(QWidget): def _on_fullscreen_requested(self, on): if not config.val.content.windowed_fullscreen: if on: - self.setWindowState(self.windowState() | Qt.WindowFullScreen) + self.state_before_fullscreen = self.windowState() + self.setWindowState( + Qt.WindowFullScreen | self.state_before_fullscreen) elif self.isFullScreen(): - self.setWindowState(self.windowState() & ~Qt.WindowFullScreen) + self.setWindowState(self.state_before_fullscreen) + log.misc.debug('on: {}, state before fullscreen: {}'.format( + on, debug.qflags_key(Qt, self.state_before_fullscreen))) @cmdutils.register(instance='main-window', scope='window') @pyqtSlot() From af0648dd597554307ac9a4cedb9b494c92b17a0a Mon Sep 17 00:00:00 2001 From: Christian Helbling Date: Fri, 19 Oct 2018 09:46:42 +0200 Subject: [PATCH 032/492] remove superfluous blank line --- qutebrowser/browser/commands.py | 1 - 1 file changed, 1 deletion(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 8ea3c08a5..b685c2c64 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -2244,7 +2244,6 @@ class CommandDispatcher: log.misc.debug('state before fullscreen: {}'.format( debug.qflags_key(Qt, window.state_before_fullscreen))) - @cmdutils.register(instance='command-dispatcher', scope='window', name='tab-mute') @cmdutils.argument('count', count=True) From 95e874fd265c8cd077e54b38b8dcd36c1978158b Mon Sep 17 00:00:00 2001 From: Christian Helbling Date: Sat, 20 Oct 2018 11:29:04 +0200 Subject: [PATCH 033/492] simplify and clearly separate the toggling code from the code to remember the state before fullscreen --- qutebrowser/browser/commands.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index b685c2c64..2760f18b6 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -2234,13 +2234,11 @@ class CommandDispatcher: return window = self._tabbed_browser.widget.window() - if window.isFullScreen(): - window.setWindowState( - window.state_before_fullscreen & ~Qt.WindowFullScreen) - else: + + if not window.isFullScreen(): window.state_before_fullscreen = window.windowState() - window.setWindowState( - window.state_before_fullscreen | Qt.WindowFullScreen) + window.setWindowState(window.windowState() ^ Qt.WindowFullScreen) + log.misc.debug('state before fullscreen: {}'.format( debug.qflags_key(Qt, window.state_before_fullscreen))) From ac679ae004cf978d07e405bcdc76adf0089711d6 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:13 +0200 Subject: [PATCH 034/492] Update requests from 2.19.1 to 2.20.0 --- misc/requirements/requirements-codecov.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-codecov.txt b/misc/requirements/requirements-codecov.txt index 478688da5..0497eb75c 100644 --- a/misc/requirements/requirements-codecov.txt +++ b/misc/requirements/requirements-codecov.txt @@ -5,5 +5,5 @@ chardet==3.0.4 codecov==2.0.15 coverage==4.5.1 idna==2.7 -requests==2.19.1 +requests==2.20.0 urllib3==1.23 From 7dd69589477f1f0541bc74c590f5885989176494 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:14 +0200 Subject: [PATCH 035/492] Update requests from 2.19.1 to 2.20.0 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index f262418f7..7d48bfaa4 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -16,7 +16,7 @@ pycparser==2.19 pylint==2.1.1 python-dateutil==2.7.3 ./scripts/dev/pylint_checkers -requests==2.19.1 +requests==2.20.0 six==1.11.0 uritemplate==3.0.0 urllib3==1.23 From 8bf5dcffe7cf8fc14746cae648a02125d6137270 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:16 +0200 Subject: [PATCH 036/492] Update urllib3 from 1.23 to 1.24 --- misc/requirements/requirements-codecov.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-codecov.txt b/misc/requirements/requirements-codecov.txt index 0497eb75c..32875fa96 100644 --- a/misc/requirements/requirements-codecov.txt +++ b/misc/requirements/requirements-codecov.txt @@ -6,4 +6,4 @@ codecov==2.0.15 coverage==4.5.1 idna==2.7 requests==2.20.0 -urllib3==1.23 +urllib3==1.24 From 7fa53d09c88ab00fef21614abd234c4fe358708a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:17 +0200 Subject: [PATCH 037/492] Update urllib3 from 1.23 to 1.24 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 7d48bfaa4..cbce32720 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -19,5 +19,5 @@ python-dateutil==2.7.3 requests==2.20.0 six==1.11.0 uritemplate==3.0.0 -urllib3==1.23 +urllib3==1.24 wrapt==1.10.11 From e401b4b9ab08c933bbb0e14748d1fe19075f8c91 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:20 +0200 Subject: [PATCH 038/492] Update wheel from 0.32.1 to 0.32.2 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index 29a24cd48..3ee692736 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -5,4 +5,4 @@ packaging==18.0 pyparsing==2.2.2 setuptools==40.4.3 six==1.11.0 -wheel==0.32.1 +wheel==0.32.2 From 0e7b43308319424fd0d1ba8b8713a16822135d53 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:21 +0200 Subject: [PATCH 039/492] Update hypothesis from 3.76.0 to 3.79.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 5775a7820..45bd88cf4 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -13,7 +13,7 @@ fields==5.0.0 Flask==1.0.2 glob2==0.6 hunter==2.0.2 -hypothesis==3.76.0 +hypothesis==3.79.0 itsdangerous==0.24 # Jinja2==2.10 Mako==1.0.7 From 1f04c2177ccf84ece76d2b5e89a2c2a5389519c4 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:23 +0200 Subject: [PATCH 040/492] Update itsdangerous from 0.24 to 1.0.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 45bd88cf4..8a3205aee 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -14,7 +14,7 @@ Flask==1.0.2 glob2==0.6 hunter==2.0.2 hypothesis==3.79.0 -itsdangerous==0.24 +itsdangerous==1.0.0 # Jinja2==2.10 Mako==1.0.7 # MarkupSafe==1.0 From 0cd4f69ff5c1ef8497136758e618e41c2e19f9b9 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:24 +0200 Subject: [PATCH 041/492] Update pluggy from 0.7.1 to 0.8.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 8a3205aee..48af70e8d 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -21,7 +21,7 @@ Mako==1.0.7 more-itertools==4.3.0 parse==1.9.0 parse-type==0.4.2 -pluggy==0.7.1 +pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 pytest==3.6.4 # rq.filter: <3.7 From b145e091c152a9054e89940372339df40d285020 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:26 +0200 Subject: [PATCH 042/492] Update pluggy from 0.7.1 to 0.8.0 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index b79a4a312..7ed4022bb 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -1,6 +1,6 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py -pluggy==0.7.1 +pluggy==0.8.0 py==1.7.0 six==1.11.0 toml==0.10.0 From ab1e12039a905e11989e01d52ec6c3e4e55db420 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 Oct 2018 19:55:27 +0200 Subject: [PATCH 043/492] Update pytest-bdd from 2.21.0 to 3.0.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 48af70e8d..f5b27cb97 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -25,7 +25,7 @@ pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 pytest==3.6.4 # rq.filter: <3.7 -pytest-bdd==2.21.0 +pytest-bdd==3.0.0 pytest-benchmark==3.1.1 pytest-cov==2.6.0 pytest-faulthandler==1.5.0 From 94c8d1b83eaf1cb75dd95b70e6b56e916f48c3c9 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 24 Oct 2018 08:05:00 +0200 Subject: [PATCH 044/492] Upgrade pytest --- misc/requirements/requirements-tests.txt | 2 +- misc/requirements/requirements-tests.txt-raw | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index f5b27cb97..5028ca550 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -24,7 +24,7 @@ parse-type==0.4.2 pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 -pytest==3.6.4 # rq.filter: <3.7 +pytest==3.9.2 pytest-bdd==3.0.0 pytest-benchmark==3.1.1 pytest-cov==2.6.0 diff --git a/misc/requirements/requirements-tests.txt-raw b/misc/requirements/requirements-tests.txt-raw index 26d840070..121689980 100644 --- a/misc/requirements/requirements-tests.txt-raw +++ b/misc/requirements/requirements-tests.txt-raw @@ -4,7 +4,7 @@ coverage Flask hunter hypothesis -pytest<3.7 +pytest pytest-bdd pytest-benchmark pytest-cov @@ -19,4 +19,3 @@ pytest-xvfb vulture #@ ignore: Jinja2, MarkupSafe, colorama -#@ filter: pytest <3.7 From f5380ea6817ed2a61a325edd44004ded616a7478 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 24 Oct 2018 08:38:45 +0200 Subject: [PATCH 045/492] Use utils.yaml_load where possible --- tests/end2end/fixtures/quteprocess.py | 2 +- tests/end2end/test_hints_html.py | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/end2end/fixtures/quteprocess.py b/tests/end2end/fixtures/quteprocess.py index 3cb3ee89a..f4e5d1486 100644 --- a/tests/end2end/fixtures/quteprocess.py +++ b/tests/end2end/fixtures/quteprocess.py @@ -778,7 +778,7 @@ class QuteProc(testprocess.Process): data = f.read() self._log('\nCurrent session data:\n' + data) - return yaml.load(data) + return utils.yaml_load(data) def get_content(self, plain=True): """Get the contents of the current page.""" diff --git a/tests/end2end/test_hints_html.py b/tests/end2end/test_hints_html.py index 9dee23c53..65502c7b7 100644 --- a/tests/end2end/test_hints_html.py +++ b/tests/end2end/test_hints_html.py @@ -24,10 +24,11 @@ import os.path import textwrap import attr -import yaml import pytest import bs4 +from qutebrowser.utils import utils + def collect_tests(): basedir = os.path.dirname(__file__) @@ -58,12 +59,13 @@ def _parse_file(test_name): with open(file_path, 'r', encoding='utf-8') as html: soup = bs4.BeautifulSoup(html, 'html.parser') - comment = soup.find(text=lambda text: isinstance(text, bs4.Comment)) + comment = str(soup.find(text=lambda text: isinstance(text, bs4.Comment))) if comment is None: raise InvalidFile(test_name, "no comment found") - data = yaml.load(comment) + data = utils.yaml_load(comment) + if not isinstance(data, dict): raise InvalidFile(test_name, "expected yaml dict but got {}".format( type(data).__name__)) From 185904070a6d8e044fce3f3521d9263f1e712deb Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 24 Oct 2018 09:06:07 +0200 Subject: [PATCH 046/492] Fix pytest warning precedence If we use filterwarnings with the commandline argument, the argument wins and all warnings are an error, even the collections DeprecationWarning. --- pytest.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index 1b5016321..4d45dad5e 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,6 +1,6 @@ [pytest] log_level = NOTSET -addopts = --strict -rfEw --faulthandler-timeout=90 --instafail --pythonwarnings error --benchmark-columns=Min,Max,Median +addopts = --strict -rfEw --faulthandler-timeout=90 --instafail --benchmark-columns=Min,Max,Median testpaths = tests markers = gui: Tests using the GUI (e.g. spawning widgets) @@ -66,5 +66,6 @@ qt_log_ignore = ^Error receiving trust for a CA certificate xfail_strict = true filterwarnings = + error # This happens in many qutebrowser dependencies... ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working:DeprecationWarning From 1c7667014a36a5e6ea44799fb528aba349e2cc4c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 24 Oct 2018 09:12:38 +0200 Subject: [PATCH 047/492] tests: Fix broken parametrization id functions --- tests/unit/misc/test_crashdialog.py | 2 +- tests/unit/misc/test_split.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/misc/test_crashdialog.py b/tests/unit/misc/test_crashdialog.py index ccaf6dac5..a34192b88 100644 --- a/tests/unit/misc/test_crashdialog.py +++ b/tests/unit/misc/test_crashdialog.py @@ -86,7 +86,7 @@ def test_parse_fatal_stacktrace(text, typ, func): ), ({'LANGUAGE': 'foo', 'LANG': 'en_US.UTF-8'}, "LANG = en_US.UTF-8"), ({'FOO': 'bar', 'QUTE_BLAH': '1'}, "QUTE_BLAH = 1"), -], ids=lambda e: e[1]) +]) def test_get_environment_vars(monkeypatch, env, expected): """Test for crashdialog._get_environment_vars.""" for key in os.environ.copy(): diff --git a/tests/unit/misc/test_split.py b/tests/unit/misc/test_split.py index fa26e94e8..d6d388f8b 100644 --- a/tests/unit/misc/test_split.py +++ b/tests/unit/misc/test_split.py @@ -131,7 +131,7 @@ class TestSplit: """Test split.""" @pytest.fixture(params=list(_parse_split_test_data_str()), - ids=lambda e: e.input) + ids=lambda e: e.inp) def split_test_case(self, request): """Fixture to automatically parametrize all depending tests. From d299e48960a8ae608bded9fde504ed3a5994240a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 24 Oct 2018 09:47:53 +0200 Subject: [PATCH 048/492] Work around pytest-bdd issues See https://github.com/ionelmc/pytest-benchmark/issues/124 and https://github.com/ionelmc/pytest-benchmark/issues/125 --- pytest.ini | 2 ++ tests/unit/browser/test_hints.py | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pytest.ini b/pytest.ini index 4d45dad5e..c907173e0 100644 --- a/pytest.ini +++ b/pytest.ini @@ -69,3 +69,5 @@ filterwarnings = error # This happens in many qutebrowser dependencies... ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working:DeprecationWarning + # WORKAROUND for https://github.com/ionelmc/pytest-benchmark/issues/124 + ignore:Node\.warn\(code, message\) form has been deprecated, use Node\.warn\(warning_instance\) instead:pytest.PytestDeprecationWarning diff --git a/tests/unit/browser/test_hints.py b/tests/unit/browser/test_hints.py index 9a8a024c9..5c2758d84 100644 --- a/tests/unit/browser/test_hints.py +++ b/tests/unit/browser/test_hints.py @@ -30,8 +30,10 @@ import qutebrowser.browser.hints @pytest.fixture(autouse=True) -def setup(win_registry, mode_manager): - pass +def setup(benchmark, win_registry, mode_manager): + yield + # WORKAROUND for https://github.com/ionelmc/pytest-benchmark/issues/125 + benchmark._mode = 'WORKAROUND' # pylint: disable=protected-access @pytest.fixture From 77c53707ac46b145a747d7b7dd454cfcf24658c0 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 24 Oct 2018 10:10:13 +0200 Subject: [PATCH 049/492] Add missing str() --- tests/unit/utils/test_standarddir.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/utils/test_standarddir.py b/tests/unit/utils/test_standarddir.py index b9777f670..d337b39de 100644 --- a/tests/unit/utils/test_standarddir.py +++ b/tests/unit/utils/test_standarddir.py @@ -186,7 +186,7 @@ class TestStandardDir: tmpdir_env = tmpdir / 'temp' tmpdir_env.ensure(dir=True) monkeypatch.setenv('XDG_RUNTIME_DIR', str(tmpdir / 'does-not-exist')) - monkeypatch.setenv('TMPDIR', tmpdir_env) + monkeypatch.setenv('TMPDIR', str(tmpdir_env)) standarddir._init_dirs() assert standarddir.runtime() == str(tmpdir_env / APPNAME) From 3b8964183ee7a12f0680f4c57ac9ac1248c75dde Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 24 Oct 2018 10:49:26 +0200 Subject: [PATCH 050/492] Use caplog.messages --- tests/unit/browser/test_adblock.py | 4 +- tests/unit/browser/test_pdfjs.py | 8 ++-- tests/unit/browser/test_qutescheme.py | 2 +- tests/unit/browser/test_signalfilter.py | 2 +- tests/unit/browser/webengine/test_spell.py | 3 +- .../browser/webengine/test_webenginetab.py | 4 +- tests/unit/commands/test_cmdutils.py | 3 +- tests/unit/commands/test_userscripts.py | 4 +- tests/unit/config/test_config.py | 6 +-- tests/unit/keyinput/test_basekeyparser.py | 3 +- tests/unit/misc/test_editor.py | 4 +- tests/unit/misc/test_guiprocess.py | 9 ++-- tests/unit/misc/test_ipc.py | 42 ++++++++----------- tests/unit/misc/test_sessions.py | 2 +- tests/unit/misc/test_sql.py | 3 +- tests/unit/test_app.py | 3 +- tests/unit/utils/test_debug.py | 10 ++--- tests/unit/utils/test_error.py | 2 +- tests/unit/utils/test_jinja.py | 4 +- tests/unit/utils/test_log.py | 6 +-- tests/unit/utils/test_standarddir.py | 12 +++--- tests/unit/utils/test_urlutils.py | 2 +- tests/unit/utils/test_utils.py | 13 +++--- tests/unit/utils/test_version.py | 4 +- 24 files changed, 70 insertions(+), 85 deletions(-) diff --git a/tests/unit/browser/test_adblock.py b/tests/unit/browser/test_adblock.py index aaa36d20b..906ac5aba 100644 --- a/tests/unit/browser/test_adblock.py +++ b/tests/unit/browser/test_adblock.py @@ -366,7 +366,7 @@ def test_invalid_utf8(config_stub, download_stub, tmpdir, data_tmpdir, current_download.finished.emit() expected = (r"Failed to decode: " r"b'https://www.example.org/\xa0localhost") - assert caplog.records[-2].message.startswith(expected) + assert caplog.messages[-2].startswith(expected) else: current_download.successful = True current_download.finished.emit() @@ -391,7 +391,7 @@ def test_invalid_utf8_compiled(config_stub, config_tmpdir, data_tmpdir, host_blocker = adblock.HostBlocker() with caplog.at_level(logging.ERROR): host_blocker.read_hosts() - assert caplog.records[-1].message == "Failed to read host blocklist!" + assert caplog.messages[-1] == "Failed to read host blocklist!" def test_blocking_with_whitelist(config_stub, basedir, download_stub, diff --git a/tests/unit/browser/test_pdfjs.py b/tests/unit/browser/test_pdfjs.py index 768180e11..884ba159b 100644 --- a/tests/unit/browser/test_pdfjs.py +++ b/tests/unit/browser/test_pdfjs.py @@ -155,8 +155,8 @@ class TestResources: pdfjs.get_pdfjs_res_and_path('web/test') assert len(caplog.records) == 1 - rec = caplog.records[0] - assert rec.message == 'OSError while reading PDF.js file: Message' + msg = caplog.messages[0] + assert msg == 'OSError while reading PDF.js file: Message' @pytest.mark.parametrize('path, expected', [ @@ -204,8 +204,8 @@ def test_read_from_system_oserror(tmpdir, caplog): assert pdfjs._read_from_system(str(tmpdir), ['unreadable']) == expected assert len(caplog.records) == 1 - rec = caplog.records[0] - assert rec.message.startswith('OSError while reading PDF.js file:') + message = caplog.messages[0] + assert message.startswith('OSError while reading PDF.js file:') @pytest.mark.parametrize('available', [True, False]) diff --git a/tests/unit/browser/test_qutescheme.py b/tests/unit/browser/test_qutescheme.py index 64d525367..d8353d7ae 100644 --- a/tests/unit/browser/test_qutescheme.py +++ b/tests/unit/browser/test_qutescheme.py @@ -204,7 +204,7 @@ class TestPDFJSHandler: with pytest.raises(qutescheme.NotFoundError): qutescheme.data_for_url(QUrl('qute://pdfjs/no/file.html')) assert len(caplog.records) == 1 - assert (caplog.records[0].message == + assert (caplog.messages[0] == 'pdfjs resource requested but not found: /no/file.html') def test_viewer_page(self, data_tmpdir): diff --git a/tests/unit/browser/test_signalfilter.py b/tests/unit/browser/test_signalfilter.py index 957b85943..e98207f15 100644 --- a/tests/unit/browser/test_signalfilter.py +++ b/tests/unit/browser/test_signalfilter.py @@ -88,7 +88,7 @@ def test_logging(caplog, objects, tabbed_browser_stubs, index_of, verb): assert len(caplog.records) == 1 expected_msg = "{}: filtered_signal('foo') (tab {})".format(verb, index_of) - assert caplog.records[0].msg == expected_msg + assert caplog.messages[0] == expected_msg @pytest.mark.parametrize('index_of', [0, 1]) diff --git a/tests/unit/browser/webengine/test_spell.py b/tests/unit/browser/webengine/test_spell.py index 14b343df5..2fe6ad8ac 100644 --- a/tests/unit/browser/webengine/test_spell.py +++ b/tests/unit/browser/webengine/test_spell.py @@ -141,8 +141,7 @@ class TestInit: with caplog.at_level(logging.ERROR): spell.init() - record = caplog.records[0] - assert record.message == 'Failed to copy old dictionaries' + assert caplog.messages[0] == 'Failed to copy old dictionaries' def test_moving_existing_destdir(self, old_dict_dir, dict_dir, patch_new_qt): diff --git a/tests/unit/browser/webengine/test_webenginetab.py b/tests/unit/browser/webengine/test_webenginetab.py index 093ae85fa..50bbdf716 100644 --- a/tests/unit/browser/webengine/test_webenginetab.py +++ b/tests/unit/browser/webengine/test_webenginetab.py @@ -50,7 +50,7 @@ class TestWebengineScripts: webengine_scripts._inject_greasemonkey_scripts(scripts) assert len(caplog.records) == 1 - msg = caplog.records[0].message + msg = caplog.messages[0] assert "has invalid value for '@qute-js-world': Mars" in msg collection = webengine_scripts._widget.page().scripts().toList() assert not any(script.name().startswith('GM-') @@ -69,7 +69,7 @@ class TestWebengineScripts: webengine_scripts._inject_greasemonkey_scripts(scripts) assert len(caplog.records) == 1 - msg = caplog.records[0].message + msg = caplog.messages[0] assert "has invalid value for '@qute-js-world': " in msg assert "should be between 0 and" in msg collection = webengine_scripts._widget.page().scripts().toList() diff --git a/tests/unit/commands/test_cmdutils.py b/tests/unit/commands/test_cmdutils.py index 66233c052..fc68fa920 100644 --- a/tests/unit/commands/test_cmdutils.py +++ b/tests/unit/commands/test_cmdutils.py @@ -389,8 +389,7 @@ class TestArgument: # no docstring pass assert len(caplog.records) == 1 - msg = caplog.records[0].message - assert msg.endswith('test_cmdutils.py has no docstring') + assert caplog.messages[0].endswith('test_cmdutils.py has no docstring') def test_no_docstring_with_optimize(self, monkeypatch): """With -OO we'd get a warning on start, but no warning afterwards.""" diff --git a/tests/unit/commands/test_userscripts.py b/tests/unit/commands/test_userscripts.py index 1e4aadbdd..ff6b9a558 100644 --- a/tests/unit/commands/test_userscripts.py +++ b/tests/unit/commands/test_userscripts.py @@ -227,7 +227,7 @@ def test_temporary_files_failed_cleanup(caplog, qtbot, py_proc, runner): assert len(caplog.records) == 1 expected = "Failed to delete tempfile" - assert caplog.records[0].message.startswith(expected) + assert caplog.messages[0].startswith(expected) def test_unicode_error(caplog, qtbot, py_proc, runner): @@ -244,7 +244,7 @@ def test_unicode_error(caplog, qtbot, py_proc, runner): assert len(caplog.records) == 1 expected = "Invalid unicode in userscript output: " - assert caplog.records[0].message.startswith(expected) + assert caplog.messages[0].startswith(expected) @pytest.mark.fake_os('unknown') diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index 6cef14130..6438f8b98 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -390,7 +390,7 @@ class TestConfig: assert blocker.args == ['tabs.show'] assert len(caplog.records) == 1 expected_message = 'Config option changed: tabs.show = never' - assert caplog.records[0].message == expected_message + assert caplog.messages[0] == expected_message def test_set_value_no_backend(self, monkeypatch, conf): """Make sure setting values when the backend is still unknown works.""" @@ -569,7 +569,7 @@ class TestConfig: conf.update_mutables() expected_log = '{} was mutated, updating'.format(option) - assert caplog.records[-2].message == expected_log + assert caplog.messages[-2] == expected_log else: with qtbot.assert_not_emitted(conf.changed): conf.update_mutables() @@ -791,7 +791,7 @@ def test_set_register_stylesheet(delete, stylesheet_param, update, qtbot, obj = StyleObj(stylesheet) config.set_register_stylesheet(obj, update=update) - assert caplog.records[-1].message == 'stylesheet for StyleObj: magenta' + assert caplog.messages[-1] == 'stylesheet for StyleObj: magenta' assert obj.rendered_stylesheet == 'magenta' diff --git a/tests/unit/keyinput/test_basekeyparser.py b/tests/unit/keyinput/test_basekeyparser.py index 135033ecd..25b470040 100644 --- a/tests/unit/keyinput/test_basekeyparser.py +++ b/tests/unit/keyinput/test_basekeyparser.py @@ -61,8 +61,7 @@ class TestDebugLog: def test_log(self, keyparser, caplog): keyparser._debug_log('foo') assert len(caplog.records) == 1 - record = caplog.records[0] - assert record.message == 'foo' + assert caplog.messages[0] == 'foo' def test_no_log(self, keyparser, caplog): keyparser.do_log = False diff --git a/tests/unit/misc/test_editor.py b/tests/unit/misc/test_editor.py index 94021484a..7c13691e7 100644 --- a/tests/unit/misc/test_editor.py +++ b/tests/unit/misc/test_editor.py @@ -269,7 +269,7 @@ def test_failing_watch(qtbot, caplog, monkeypatch): assert blocker.args == ['bar'] message = 'Failed to watch path: {}'.format(editor._filename) - assert caplog.records[0].msg == message + assert caplog.messages[0] == message def test_failing_unwatch(qtbot, caplog, monkeypatch): @@ -285,7 +285,7 @@ def test_failing_unwatch(qtbot, caplog, monkeypatch): editor._proc.finished.emit(0, QProcess.NormalExit) message = 'Failed to unwatch paths: [{!r}]'.format(editor._filename) - assert caplog.records[-1].msg == message + assert caplog.messages[-1] == message @pytest.mark.parametrize('text, caret_position, result', [ diff --git a/tests/unit/misc/test_guiprocess.py b/tests/unit/misc/test_guiprocess.py index 329dc2ae0..cfedab9fe 100644 --- a/tests/unit/misc/test_guiprocess.py +++ b/tests/unit/misc/test_guiprocess.py @@ -171,9 +171,10 @@ def test_start_logging(fake_proc, caplog): args = ['arg', 'arg with spaces'] with caplog.at_level(logging.DEBUG): fake_proc.start(cmd, args) - msgs = [e.msg for e in caplog.records] - assert msgs == ["Starting process.", - "Executing: does_not_exist arg 'arg with spaces'"] + assert caplog.messages == [ + "Starting process.", + "Executing: does_not_exist arg 'arg with spaces'" + ] def test_error(qtbot, proc, caplog, message_mock): @@ -208,7 +209,7 @@ def test_exit_unsuccessful_output(qtbot, proc, caplog, py_proc, stream): print("test", file=sys.{}) sys.exit(1) """.format(stream))) - assert caplog.records[-1].msg == 'Process {}:\ntest'.format(stream) + assert caplog.messages[-1] == 'Process {}:\ntest'.format(stream) @pytest.mark.parametrize('stream', ['stdout', 'stderr']) diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py index 73a9b4f12..ce4698c7d 100644 --- a/tests/unit/misc/test_ipc.py +++ b/tests/unit/misc/test_ipc.py @@ -338,7 +338,7 @@ class TestListen: with caplog.at_level(logging.ERROR): ipc_server.update_atime() - assert caplog.records[-1].msg == "In update_atime with no server path!" + assert caplog.messages[-1] == "In update_atime with no server path!" @pytest.mark.posix def test_atime_shutdown_typeerror(self, qtbot, ipc_server): @@ -381,22 +381,20 @@ class TestHandleConnection: def test_no_connection(self, ipc_server, caplog): ipc_server.handle_connection() - assert caplog.records[-1].message == "No new connection to handle." + assert caplog.messages[-1] == "No new connection to handle." def test_double_connection(self, qlocalsocket, ipc_server, caplog): ipc_server._socket = qlocalsocket ipc_server.handle_connection() msg = ("Got new connection but ignoring it because we're still " "handling another one") - assert any(rec.message.startswith(msg) for rec in caplog.records) + assert any(message.startswith(msg) for message in caplog.messages) def test_disconnected_immediately(self, ipc_server, caplog): socket = FakeSocket(state=QLocalSocket.UnconnectedState) ipc_server._server = FakeServer(socket) ipc_server.handle_connection() - msg = "Socket was disconnected immediately." - all_msgs = [r.message for r in caplog.records] - assert msg in all_msgs + assert "Socket was disconnected immediately." in caplog.messages def test_error_immediately(self, ipc_server, caplog): socket = FakeSocket(error=QLocalSocket.ConnectionError) @@ -406,9 +404,7 @@ class TestHandleConnection: r"connection: Error string \(error 7\)"): ipc_server.handle_connection() - msg = "We got an error immediately." - all_msgs = [r.message for r in caplog.records] - assert msg in all_msgs + assert "We got an error immediately." in caplog.messages def test_read_line_immediately(self, qtbot, ipc_server, caplog): data = ('{{"args": ["foo"], "target_arg": "tab", ' @@ -421,8 +417,7 @@ class TestHandleConnection: ipc_server.handle_connection() assert blocker.args == [['foo'], 'tab', ''] - all_msgs = [r.message for r in caplog.records] - assert "We can read a line immediately." in all_msgs + assert "We can read a line immediately." in caplog.messages @pytest.fixture @@ -475,9 +470,9 @@ def test_invalid_data(qtbot, ipc_server, connected_socket, caplog, data, msg): with qtbot.waitSignals(signals, order='strict'): connected_socket.write(data) - messages = [r.message for r in caplog.records] - assert messages[-1].startswith('Ignoring invalid IPC data from socket ') - assert messages[-2].startswith(msg) + invalid_msg = 'Ignoring invalid IPC data from socket ' + assert caplog.messages[-1].startswith(invalid_msg) + assert caplog.messages[-2].startswith(msg) def test_multiline(qtbot, ipc_server, connected_socket): @@ -504,8 +499,7 @@ class TestSendToRunningInstance: def test_no_server(self, caplog): sent = ipc.send_to_running_instance('qute-test', [], None) assert not sent - msg = caplog.records[-1].message - assert msg == "No existing instance present (error 2)" + assert caplog.messages[-1] == "No existing instance present (error 2)" @pytest.mark.parametrize('has_cwd', [True, False]) @pytest.mark.linux(reason="Causes random trouble on Windows and macOS") @@ -571,7 +565,7 @@ def test_timeout(qtbot, caplog, qlocalsocket, ipc_server): with qtbot.waitSignal(qlocalsocket.disconnected, timeout=5000): pass - assert caplog.records[-1].message.startswith("IPC connection timed out") + assert caplog.messages[-1].startswith("IPC connection timed out") def test_ipcserver_socket_none_readyread(ipc_server, caplog): @@ -580,7 +574,7 @@ def test_ipcserver_socket_none_readyread(ipc_server, caplog): with caplog.at_level(logging.WARNING): ipc_server.on_ready_read() msg = "In on_ready_read with None socket and old_socket!" - assert msg in [r.message for r in caplog.records] + assert msg in caplog.messages @pytest.mark.posix @@ -588,7 +582,7 @@ def test_ipcserver_socket_none_error(ipc_server, caplog): assert ipc_server._socket is None ipc_server.on_error(0) msg = "In on_error with None socket!" - assert msg in [r.message for r in caplog.records] + assert msg in caplog.messages class TestSendOrListen: @@ -627,8 +621,7 @@ class TestSendOrListen: def test_normal_connection(self, caplog, qtbot, args): ret_server = ipc.send_or_listen(args) assert isinstance(ret_server, ipc.IPCServer) - msgs = [e.message for e in caplog.records] - assert "Starting IPC server..." in msgs + assert "Starting IPC server..." in caplog.messages assert ret_server is ipc.server with qtbot.waitSignal(ret_server.got_args): @@ -667,8 +660,7 @@ class TestSendOrListen: ret = ipc.send_or_listen(args) assert ret is None - msgs = [e.message for e in caplog.records] - assert "Got AddressInUseError, trying again." in msgs + assert "Got AddressInUseError, trying again." in caplog.messages @pytest.mark.parametrize('has_error, exc_name, exc_msg', [ (True, 'SocketError', @@ -717,7 +709,7 @@ class TestSendOrListen: 'post_text: Maybe another instance is running but frozen?', 'exception text: {}'.format(exc_msg), ] - assert caplog.records[0].msg == '\n'.join(error_msgs) + assert caplog.messages[0] == '\n'.join(error_msgs) @pytest.mark.posix(reason="Flaky on Windows") def test_error_while_listening(self, qlocalserver_mock, caplog, args): @@ -739,7 +731,7 @@ class TestSendOrListen: ('exception text: Error while listening to IPC server: Error ' 'string (error 4)'), ] - assert caplog.records[-1].msg == '\n'.join(error_msgs) + assert caplog.messages[-1] == '\n'.join(error_msgs) @pytest.mark.windows diff --git a/tests/unit/misc/test_sessions.py b/tests/unit/misc/test_sessions.py index b9fcaf571..6c6ea669b 100644 --- a/tests/unit/misc/test_sessions.py +++ b/tests/unit/misc/test_sessions.py @@ -217,7 +217,7 @@ class TestSave: assert len(caplog.records) == 1 msg = "last_window_session is None while saving!" - assert caplog.records[0].msg == msg + assert caplog.messages[0] == msg assert not session_path.exists() def test_last_window_session(self, sess_man, tmpdir): diff --git a/tests/unit/misc/test_sql.py b/tests/unit/misc/test_sql.py index 54c785286..dff6144cc 100644 --- a/tests/unit/misc/test_sql.py +++ b/tests/unit/misc/test_sql.py @@ -68,14 +68,13 @@ class TestSqlError: with pytest.raises(sql.SqlBugError): sql.raise_sqlite_error("Message", sql_err) - lines = [r.message for r in caplog.records] expected = ['SQL error:', 'type: UnknownError', 'database text: db text', 'driver text: driver text', 'error code: 23'] - assert lines == expected + assert caplog.messages == expected @pytest.mark.parametrize('klass', [sql.SqlEnvironmentError, sql.SqlBugError]) diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 1c2341d2b..a4f78a5ab 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -36,6 +36,5 @@ def test_on_focus_changed_issue1484(monkeypatch, qapp, caplog): app.on_focus_changed(buf, buf) assert len(caplog.records) == 1 - record = caplog.records[0] expected = "on_focus_changed called with non-QWidget {!r}".format(buf) - assert record.message == expected + assert caplog.messages[0] == expected diff --git a/tests/unit/utils/test_debug.py b/tests/unit/utils/test_debug.py index 518bf9b4a..2a78c5cba 100644 --- a/tests/unit/utils/test_debug.py +++ b/tests/unit/utils/test_debug.py @@ -42,7 +42,7 @@ def test_log_events(qapp, caplog): qapp.sendEvent(obj, QEvent(QEvent.User)) qapp.processEvents() assert len(caplog.records) == 1 - assert caplog.records[0].msg == 'Event in test_debug.EventObject: User' + assert caplog.messages[0] == 'Event in test_debug.EventObject: User' class SignalObject(QObject): @@ -75,8 +75,8 @@ def test_log_signals(caplog, signal_obj): signal_obj.signal2.emit('foo', 'bar') assert len(caplog.records) == 2 - assert caplog.records[0].msg == 'Signal in : signal1()' - assert caplog.records[1].msg == "Signal in : signal2('foo', 'bar')" + assert caplog.messages[0] == 'Signal in : signal1()' + assert caplog.messages[1] == "Signal in : signal2('foo', 'bar')" class TestLogTime: @@ -91,7 +91,7 @@ class TestLogTime: assert len(caplog.records) == 1 pattern = re.compile(r'Foobar took ([\d.]*) seconds\.') - match = pattern.fullmatch(caplog.records[0].msg) + match = pattern.fullmatch(caplog.messages[0]) assert match duration = float(match.group(1)) @@ -119,7 +119,7 @@ class TestLogTime: func(1, kwarg=2) assert len(caplog.records) == 1 - assert caplog.records[0].msg.startswith('Foo took') + assert caplog.messages[0].startswith('Foo took') class TestQEnumKey: diff --git a/tests/unit/utils/test_error.py b/tests/unit/utils/test_error.py index 951aa21f6..6b0679d35 100644 --- a/tests/unit/utils/test_error.py +++ b/tests/unit/utils/test_error.py @@ -61,7 +61,7 @@ def test_no_err_windows(caplog, exc, name, exc_text, fake_args): 'post_text: post', 'exception text: {}'.format(exc_text), ] - assert caplog.records[0].msg == '\n'.join(expected) + assert caplog.messages[0] == '\n'.join(expected) # This happens on Xvfb for some reason diff --git a/tests/unit/utils/test_jinja.py b/tests/unit/utils/test_jinja.py index b1a50772e..34b821dcd 100644 --- a/tests/unit/utils/test_jinja.py +++ b/tests/unit/utils/test_jinja.py @@ -109,8 +109,8 @@ def test_not_found(caplog): data = jinja.render('does_not_exist.html') assert "The does_not_exist.html template could not be found!" in data - assert caplog.records[0].msg.startswith("The does_not_exist.html template" - " could not be loaded from") + assert caplog.messages[0].startswith("The does_not_exist.html template" + " could not be loaded from") def test_utf8(): diff --git a/tests/unit/utils/test_log.py b/tests/unit/utils/test_log.py index 04e14a708..cefeda62e 100644 --- a/tests/unit/utils/test_log.py +++ b/tests/unit/utils/test_log.py @@ -271,7 +271,7 @@ def test_stub(caplog, suffix, expected): with caplog.at_level(logging.WARNING, 'misc'): log.stub(suffix) assert len(caplog.records) == 1 - assert caplog.records[0].message == expected + assert caplog.messages[0] == expected def test_ignore_py_warnings(caplog): @@ -281,7 +281,7 @@ def test_ignore_py_warnings(caplog): with caplog.at_level(logging.WARNING): warnings.warn("not hidden", UserWarning) assert len(caplog.records) == 1 - msg = caplog.records[0].message.splitlines()[0] + msg = caplog.messages[0].splitlines()[0] assert msg.endswith("UserWarning: not hidden") @@ -301,4 +301,4 @@ class TestQtMessageHandler: """Make sure there's no crash with an empty message.""" log.qt_message_handler(QtCore.QtDebugMsg, self.Context(), "") assert len(caplog.records) == 1 - assert caplog.records[0].msg == "Logged empty message!" + assert caplog.messages[0] == "Logged empty message!" diff --git a/tests/unit/utils/test_standarddir.py b/tests/unit/utils/test_standarddir.py index d337b39de..8edcf41b8 100644 --- a/tests/unit/utils/test_standarddir.py +++ b/tests/unit/utils/test_standarddir.py @@ -289,7 +289,7 @@ class TestInitCacheDirTag: with caplog.at_level(logging.ERROR, 'init'): standarddir._init_cachedir_tag() assert len(caplog.records) == 1 - assert caplog.records[0].message == 'Failed to create CACHEDIR.TAG' + assert caplog.messages[0] == 'Failed to create CACHEDIR.TAG' assert not tmpdir.listdir() @@ -455,8 +455,8 @@ class TestMove: def test_no_old_dir(self, dirs, caplog): """Nothing should happen without any old directory.""" standarddir._move_data(str(dirs.old), str(dirs.new)) - assert not any(rec.message.startswith('Migrating data from') - for rec in caplog.records) + assert not any(message.startswith('Migrating data from') + for message in caplog.messages) @pytest.mark.parametrize('empty_dest', [True, False]) def test_moving_data(self, dirs, empty_dest): @@ -475,10 +475,9 @@ class TestMove: with caplog.at_level(logging.ERROR): standarddir._move_data(str(dirs.old), str(dirs.new)) - record = caplog.records[-1] expected = "Failed to move data from {} as {} is non-empty!".format( dirs.old, dirs.new) - assert record.message == expected + assert caplog.messages[-1] == expected def test_deleting_error(self, dirs, monkeypatch, mocker, caplog): """When there was an error it should be logged.""" @@ -489,10 +488,9 @@ class TestMove: with caplog.at_level(logging.ERROR): standarddir._move_data(str(dirs.old), str(dirs.new)) - record = caplog.records[-1] expected = "Failed to move data from {} to {}: error".format( dirs.old, dirs.new) - assert record.message == expected + assert caplog.messages[-1] == expected @pytest.mark.parametrize('args_kind', ['basedir', 'normal', 'none']) diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index 9df7ed0d0..e77d33783 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -263,7 +263,7 @@ class TestFuzzyUrl: msg = ("URL contains characters which are not present in the current " "locale") - assert caplog.records[-1].message == msg + assert caplog.messages[-1] == msg @pytest.mark.parametrize('url, special', [ diff --git a/tests/unit/utils/test_utils.py b/tests/unit/utils/test_utils.py index 2b38aadc4..5359dc675 100644 --- a/tests/unit/utils/test_utils.py +++ b/tests/unit/utils/test_utils.py @@ -471,8 +471,7 @@ class TestPreventExceptions: assert ret == 42 assert len(caplog.records) == 1 expected = 'Error in test_utils.TestPreventExceptions.func_raising' - actual = caplog.records[0].message - assert actual == expected + assert caplog.messages[0] == expected @utils.prevent_exceptions(42) def func_not_raising(self): @@ -691,7 +690,7 @@ class TestGetSetClipboard: utils.set_clipboard(text, selection=selection) assert not clipboard_mock.setText.called expected = 'Setting fake {}: "{}"'.format(what, expected) - assert caplog.records[0].message == expected + assert caplog.messages[0] == expected def test_get(self): assert utils.get_clipboard() == 'mocked clipboard text' @@ -742,7 +741,7 @@ class TestOpenFile: executable = shlex.quote(sys.executable) cmdline = '{} -c pass'.format(executable) utils.open_file('/foo/bar', cmdline) - result = caplog.records[0].message + result = caplog.messages[0] assert re.fullmatch( r'Opening /foo/bar with \[.*python.*/foo/bar.*\]', result) @@ -751,7 +750,7 @@ class TestOpenFile: executable = shlex.quote(sys.executable) cmdline = '{} -c pass {{}} raboof'.format(executable) utils.open_file('/foo/bar', cmdline) - result = caplog.records[0].message + result = caplog.messages[0] assert re.fullmatch( r"Opening /foo/bar with \[.*python.*/foo/bar.*'raboof'\]", result) @@ -761,7 +760,7 @@ class TestOpenFile: cmdline = '{} -c pass'.format(executable) config_stub.val.downloads.open_dispatcher = cmdline utils.open_file('/foo/bar') - result = caplog.records[1].message + result = caplog.messages[1] assert re.fullmatch( r"Opening /foo/bar with \[.*python.*/foo/bar.*\]", result) @@ -769,7 +768,7 @@ class TestOpenFile: m = mocker.patch('PyQt5.QtGui.QDesktopServices.openUrl', spec={}, new_callable=mocker.Mock) utils.open_file('/foo/bar') - result = caplog.records[0].message + result = caplog.messages[0] assert re.fullmatch( r"Opening /foo/bar with the system application", result) m.assert_called_with(QUrl('file:///foo/bar')) diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index 2120a4b97..60d8c4590 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -295,7 +295,7 @@ class TestGitStr: with caplog.at_level(logging.ERROR, 'misc'): assert version._git_str() == '0deadcode' assert len(caplog.records) == 1 - assert caplog.records[0].message == "Error while getting git path" + assert caplog.messages[0] == "Error while getting git path" def _has_git(): @@ -457,7 +457,7 @@ def test_release_info(files, expected, caplog, monkeypatch): assert version._release_info() == expected if files is None: assert len(caplog.records) == 1 - assert caplog.records[0].message == "Error while reading fake-file." + assert caplog.messages[0] == "Error while reading fake-file." @pytest.mark.parametrize('equal', [True, False]) From 078f5f9f1c5ee9cb79e949ea64867ab7b10f7ffc Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Wed, 24 Oct 2018 20:00:08 -0700 Subject: [PATCH 051/492] Fix dragging with visibility toggle --- qutebrowser/mainwindow/tabwidget.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/qutebrowser/mainwindow/tabwidget.py b/qutebrowser/mainwindow/tabwidget.py index 7090d5427..f2605e7d3 100644 --- a/qutebrowser/mainwindow/tabwidget.py +++ b/qutebrowser/mainwindow/tabwidget.py @@ -226,7 +226,9 @@ class TabWidget(QTabWidget): work. """ bar = self.tabBar() - toggle = self.count() > 10 and bar.isVisible() + toggle = (self.count() > 10 and + not bar.drag_in_progress and + bar.isVisible()) if toggle: bar.setUpdatesEnabled(False) bar.setVisible(False) @@ -384,6 +386,7 @@ class TabBar(QTabBar): self._on_show_switching_delay_changed() self.setAutoFillBackground(True) self._set_colors() + self.drag_in_progress = False QTimer.singleShot(0, self.maybe_hide) def __repr__(self): @@ -507,8 +510,16 @@ class TabBar(QTabBar): p.setColor(QPalette.Window, config.val.colors.tabs.bar.bg) self.setPalette(p) + def mouseReleaseEvent(self, e): + """Override mouseReleaseEvent to know when drags stop.""" + self.drag_in_progress = False + super().mouseReleaseEvent(e) + def mousePressEvent(self, e): - """Override mousePressEvent to close tabs if configured.""" + """Override mousePressEvent to close tabs if configured. + + Also keep track of if we are currently in a drag.""" + self.drag_in_progress = True button = config.val.tabs.close_mouse_button if (e.button() == Qt.RightButton and button == 'right' or e.button() == Qt.MiddleButton and button == 'middle'): From 11b5958bc4224cf8449cf376e05b4a5b4cd0782f Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Wed, 24 Oct 2018 20:39:14 -0700 Subject: [PATCH 052/492] Fix selection clearing when using Closes #2886 --- qutebrowser/misc/miscwidgets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/misc/miscwidgets.py b/qutebrowser/misc/miscwidgets.py index eef127cf2..36dad4f41 100644 --- a/qutebrowser/misc/miscwidgets.py +++ b/qutebrowser/misc/miscwidgets.py @@ -94,7 +94,7 @@ class CommandLineEdit(QLineEdit): We use __ here to avoid accidentally overriding it in subclasses. """ if new < self._promptlen: - self.setCursorPosition(self._promptlen) + self.cursorForward(self.hasSelectedText(), self._promptlen - new) def set_prompt(self, text): """Set the current prompt to text. From a4586150301bf6210ac648c3c1e93d8024cd4ba9 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 25 Oct 2018 11:16:26 +0200 Subject: [PATCH 053/492] Further simplify caplog.messages --- tests/unit/browser/test_pdfjs.py | 5 ++--- tests/unit/browser/test_qutescheme.py | 6 +++--- tests/unit/browser/test_signalfilter.py | 3 +-- tests/unit/config/test_config.py | 3 +-- tests/unit/keyinput/test_basekeyparser.py | 3 +-- tests/unit/misc/test_ipc.py | 4 +--- tests/unit/misc/test_sessions.py | 3 +-- tests/unit/test_app.py | 3 +-- tests/unit/utils/test_debug.py | 8 +++----- tests/unit/utils/test_error.py | 4 +--- tests/unit/utils/test_log.py | 6 ++---- tests/unit/utils/test_standarddir.py | 3 +-- tests/unit/utils/test_utils.py | 3 +-- tests/unit/utils/test_version.py | 6 ++---- 14 files changed, 21 insertions(+), 39 deletions(-) diff --git a/tests/unit/browser/test_pdfjs.py b/tests/unit/browser/test_pdfjs.py index 884ba159b..7fa1a8f6c 100644 --- a/tests/unit/browser/test_pdfjs.py +++ b/tests/unit/browser/test_pdfjs.py @@ -154,9 +154,8 @@ class TestResources: match="Path 'web/test' not found"): pdfjs.get_pdfjs_res_and_path('web/test') - assert len(caplog.records) == 1 - msg = caplog.messages[0] - assert msg == 'OSError while reading PDF.js file: Message' + expected = 'OSError while reading PDF.js file: Message' + assert caplog.messages == [expected] @pytest.mark.parametrize('path, expected', [ diff --git a/tests/unit/browser/test_qutescheme.py b/tests/unit/browser/test_qutescheme.py index d8353d7ae..0741f38db 100644 --- a/tests/unit/browser/test_qutescheme.py +++ b/tests/unit/browser/test_qutescheme.py @@ -203,9 +203,9 @@ class TestPDFJSHandler: with caplog.at_level(logging.WARNING, 'misc'): with pytest.raises(qutescheme.NotFoundError): qutescheme.data_for_url(QUrl('qute://pdfjs/no/file.html')) - assert len(caplog.records) == 1 - assert (caplog.messages[0] == - 'pdfjs resource requested but not found: /no/file.html') + + expected = 'pdfjs resource requested but not found: /no/file.html' + assert caplog.messages == [expected] def test_viewer_page(self, data_tmpdir): """Load the /web/viewer.html page.""" diff --git a/tests/unit/browser/test_signalfilter.py b/tests/unit/browser/test_signalfilter.py index e98207f15..8ea800e23 100644 --- a/tests/unit/browser/test_signalfilter.py +++ b/tests/unit/browser/test_signalfilter.py @@ -86,9 +86,8 @@ def test_logging(caplog, objects, tabbed_browser_stubs, index_of, verb): with caplog.at_level(logging.DEBUG, logger='signals'): objects.signaller.signal.emit('foo') - assert len(caplog.records) == 1 expected_msg = "{}: filtered_signal('foo') (tab {})".format(verb, index_of) - assert caplog.messages[0] == expected_msg + assert caplog.messages == [expected_msg] @pytest.mark.parametrize('index_of', [0, 1]) diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index 6438f8b98..672faf04a 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -388,9 +388,8 @@ class TestConfig: conf._set_value(opt, 'never') assert blocker.args == ['tabs.show'] - assert len(caplog.records) == 1 expected_message = 'Config option changed: tabs.show = never' - assert caplog.messages[0] == expected_message + assert caplog.messages == [expected_message] def test_set_value_no_backend(self, monkeypatch, conf): """Make sure setting values when the backend is still unknown works.""" diff --git a/tests/unit/keyinput/test_basekeyparser.py b/tests/unit/keyinput/test_basekeyparser.py index 25b470040..764c83e1f 100644 --- a/tests/unit/keyinput/test_basekeyparser.py +++ b/tests/unit/keyinput/test_basekeyparser.py @@ -60,8 +60,7 @@ class TestDebugLog: def test_log(self, keyparser, caplog): keyparser._debug_log('foo') - assert len(caplog.records) == 1 - assert caplog.messages[0] == 'foo' + assert caplog.messages == ['foo'] def test_no_log(self, keyparser, caplog): keyparser.do_log = False diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py index ce4698c7d..93b6581b8 100644 --- a/tests/unit/misc/test_ipc.py +++ b/tests/unit/misc/test_ipc.py @@ -698,8 +698,6 @@ class TestSendOrListen: with pytest.raises(ipc.Error): ipc.send_or_listen(args) - assert len(caplog.records) == 1 - error_msgs = [ 'Handling fatal misc.ipc.{} with --no-err-windows!'.format( exc_name), @@ -709,7 +707,7 @@ class TestSendOrListen: 'post_text: Maybe another instance is running but frozen?', 'exception text: {}'.format(exc_msg), ] - assert caplog.messages[0] == '\n'.join(error_msgs) + assert caplog.messages == ['\n'.join(error_msgs)] @pytest.mark.posix(reason="Flaky on Windows") def test_error_while_listening(self, qlocalserver_mock, caplog, args): diff --git a/tests/unit/misc/test_sessions.py b/tests/unit/misc/test_sessions.py index 6c6ea669b..e2676b4e7 100644 --- a/tests/unit/misc/test_sessions.py +++ b/tests/unit/misc/test_sessions.py @@ -215,9 +215,8 @@ class TestSave: with caplog.at_level(logging.ERROR): sess_man.save(str(session_path), last_window=True) - assert len(caplog.records) == 1 msg = "last_window_session is None while saving!" - assert caplog.messages[0] == msg + assert caplog.messages == [msg] assert not session_path.exists() def test_last_window_session(self, sess_man, tmpdir): diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index a4f78a5ab..3d7555bc4 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -35,6 +35,5 @@ def test_on_focus_changed_issue1484(monkeypatch, qapp, caplog): buf = QBuffer() app.on_focus_changed(buf, buf) - assert len(caplog.records) == 1 expected = "on_focus_changed called with non-QWidget {!r}".format(buf) - assert caplog.messages[0] == expected + assert caplog.messages == [expected] diff --git a/tests/unit/utils/test_debug.py b/tests/unit/utils/test_debug.py index 2a78c5cba..bb93cbf10 100644 --- a/tests/unit/utils/test_debug.py +++ b/tests/unit/utils/test_debug.py @@ -41,8 +41,7 @@ def test_log_events(qapp, caplog): obj = EventObject() qapp.sendEvent(obj, QEvent(QEvent.User)) qapp.processEvents() - assert len(caplog.records) == 1 - assert caplog.messages[0] == 'Event in test_debug.EventObject: User' + assert caplog.messages == ['Event in test_debug.EventObject: User'] class SignalObject(QObject): @@ -74,9 +73,8 @@ def test_log_signals(caplog, signal_obj): signal_obj.signal1.emit() signal_obj.signal2.emit('foo', 'bar') - assert len(caplog.records) == 2 - assert caplog.messages[0] == 'Signal in : signal1()' - assert caplog.messages[1] == "Signal in : signal2('foo', 'bar')" + assert caplog.messages == ['Signal in : signal1()', + "Signal in : signal2('foo', 'bar')"] class TestLogTime: diff --git a/tests/unit/utils/test_error.py b/tests/unit/utils/test_error.py index 6b0679d35..42a090c75 100644 --- a/tests/unit/utils/test_error.py +++ b/tests/unit/utils/test_error.py @@ -51,8 +51,6 @@ def test_no_err_windows(caplog, exc, name, exc_text, fake_args): error.handle_fatal_exc(e, fake_args, 'title', pre_text='pre', post_text='post') - assert len(caplog.records) == 1 - expected = [ 'Handling fatal {} with --no-err-windows!'.format(name), '', @@ -61,7 +59,7 @@ def test_no_err_windows(caplog, exc, name, exc_text, fake_args): 'post_text: post', 'exception text: {}'.format(exc_text), ] - assert caplog.messages[0] == '\n'.join(expected) + assert caplog.messages == ['\n'.join(expected)] # This happens on Xvfb for some reason diff --git a/tests/unit/utils/test_log.py b/tests/unit/utils/test_log.py index cefeda62e..a20e335ca 100644 --- a/tests/unit/utils/test_log.py +++ b/tests/unit/utils/test_log.py @@ -270,8 +270,7 @@ class TestHideQtWarning: def test_stub(caplog, suffix, expected): with caplog.at_level(logging.WARNING, 'misc'): log.stub(suffix) - assert len(caplog.records) == 1 - assert caplog.messages[0] == expected + assert caplog.messages == [expected] def test_ignore_py_warnings(caplog): @@ -300,5 +299,4 @@ class TestQtMessageHandler: def test_empty_message(self, caplog): """Make sure there's no crash with an empty message.""" log.qt_message_handler(QtCore.QtDebugMsg, self.Context(), "") - assert len(caplog.records) == 1 - assert caplog.messages[0] == "Logged empty message!" + assert caplog.messages == ["Logged empty message!"] diff --git a/tests/unit/utils/test_standarddir.py b/tests/unit/utils/test_standarddir.py index 8edcf41b8..5962c8f22 100644 --- a/tests/unit/utils/test_standarddir.py +++ b/tests/unit/utils/test_standarddir.py @@ -288,8 +288,7 @@ class TestInitCacheDirTag: mocker.patch('builtins.open', side_effect=OSError) with caplog.at_level(logging.ERROR, 'init'): standarddir._init_cachedir_tag() - assert len(caplog.records) == 1 - assert caplog.messages[0] == 'Failed to create CACHEDIR.TAG' + assert caplog.messages == ['Failed to create CACHEDIR.TAG'] assert not tmpdir.listdir() diff --git a/tests/unit/utils/test_utils.py b/tests/unit/utils/test_utils.py index 5359dc675..e25ecfe4a 100644 --- a/tests/unit/utils/test_utils.py +++ b/tests/unit/utils/test_utils.py @@ -469,9 +469,8 @@ class TestPreventExceptions: ret = self.func_raising() # pylint: enable=assignment-from-no-return assert ret == 42 - assert len(caplog.records) == 1 expected = 'Error in test_utils.TestPreventExceptions.func_raising' - assert caplog.messages[0] == expected + assert caplog.messages == [expected] @utils.prevent_exceptions(42) def func_not_raising(self): diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index 60d8c4590..c21ea0624 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -294,8 +294,7 @@ class TestGitStr: commit_file_mock.return_value = '0deadcode' with caplog.at_level(logging.ERROR, 'misc'): assert version._git_str() == '0deadcode' - assert len(caplog.records) == 1 - assert caplog.messages[0] == "Error while getting git path" + assert caplog.messages == ["Error while getting git path"] def _has_git(): @@ -456,8 +455,7 @@ def test_release_info(files, expected, caplog, monkeypatch): with caplog.at_level(logging.ERROR, 'misc'): assert version._release_info() == expected if files is None: - assert len(caplog.records) == 1 - assert caplog.messages[0] == "Error while reading fake-file." + assert caplog.messages == ["Error while reading fake-file."] @pytest.mark.parametrize('equal', [True, False]) From 2c45226b6d91c501b87a8b200c59d8b8a46e70ac Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 26 Oct 2018 09:15:16 +0200 Subject: [PATCH 054/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 662cada0d..665ce7c0a 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -57,6 +57,7 @@ Fixed - When websites suggest download filenames with invalid characters, those are now correctly replaced. - Invalid hint length calculation in certain rare cases. +- Dragging tabs in the tab bar (which was broken in v1.5.0) v1.5.1 ------ From cbc36666d018c9139ee1220eb85269376f2aa0fb Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 26 Oct 2018 09:33:00 +0200 Subject: [PATCH 055/492] Remove old _stop_timers --- qutebrowser/keyinput/modeparsers.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/qutebrowser/keyinput/modeparsers.py b/qutebrowser/keyinput/modeparsers.py index 6846c5a7a..d2391ef39 100644 --- a/qutebrowser/keyinput/modeparsers.py +++ b/qutebrowser/keyinput/modeparsers.py @@ -129,18 +129,6 @@ class NormalKeyParser(CommandKeyParser): self._debug_log("Releasing inhibition state of normal mode.") self._inhibited = False - @pyqtSlot() - def _stop_timers(self): - super()._stop_timers() - self._partial_timer.stop() - self._partial_timer.timeout.disconnect(self._clear_partial_match) - self._inhibited_timer.stop() - try: - self._inhibited_timer.timeout.disconnect(self._clear_inhibited) - except TypeError: - # no connections - pass - class PassthroughKeyParser(CommandKeyParser): From 9019bf790b696982c1d21f3b1e40a9dffef4fff7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 26 Oct 2018 10:01:01 +0200 Subject: [PATCH 056/492] Skip "navigating with invalid selector" on QtWebKit --- tests/end2end/features/navigate.feature | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/end2end/features/navigate.feature b/tests/end2end/features/navigate.feature index a7cd7fbd4..f3de78a6a 100644 --- a/tests/end2end/features/navigate.feature +++ b/tests/end2end/features/navigate.feature @@ -75,6 +75,7 @@ Feature: Using :navigate And I run :navigate next Then data/navigate/next.html should be loaded + @qtwebkit_skip Scenario: Navigating with invalid selector When I open data/navigate And I set hints.selectors to {"links": ["@"]} From 5ce1229ee5248a0fd9c20266143163acb41ba225 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 26 Oct 2018 10:05:44 +0200 Subject: [PATCH 057/492] Add temporary fix for test_caret.py flakiness Fixes #4311 Conflicts with #4087, we might be able to revert this for that PR. --- qutebrowser/browser/browsertab.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 3964472df..bb0b31626 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -917,7 +917,12 @@ class AbstractTab(QWidget): # https://github.com/qutebrowser/qutebrowser/issues/3498 return - sess_manager = objreg.get('session-manager') + try: + sess_manager = objreg.get('session-manager') + except KeyError: + # https://github.com/qutebrowser/qutebrowser/issues/4311 + return + sess_manager.save_autosave() if ok and not self._has_ssl_errors: From a5dba340887fb325d1937d26c07cdcbb6cf27ab1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 26 Oct 2018 10:13:37 +0200 Subject: [PATCH 058/492] Set content.cookies.accept to all by default Setting it to no-3rdparty is a nice idea from a "privacy by default" perspective, but it also breaks various pages. In particular, due to what's probably a Qt bug, it breaks the new GMail: https://bugreports.qt.io/browse/QTBUG-71393 Let's be in line with what other browsers by default here. Fixes #4281 --- doc/help/settings.asciidoc | 4 ++-- qutebrowser/config/configdata.yml | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index db0802349..348baf7ca 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -1591,11 +1591,11 @@ Type: <> Valid values: * +all+: Accept all cookies. - * +no-3rdparty+: Accept cookies from the same origin only. + * +no-3rdparty+: Accept cookies from the same origin only. This is known to break some sites, such as GMail. * +no-unknown-3rdparty+: Accept cookies from the same origin only, unless a cookie is already set for the domain. On QtWebEngine, this is the same as no-3rdparty. * +never+: Don't accept cookies at all. -Default: +pass:[no-3rdparty]+ +Default: +pass:[all]+ On QtWebEngine, this setting requires Qt 5.11 or newer. diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index d30041712..ac556f3fb 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -329,7 +329,7 @@ content.cache.appcache: ask the application cache for the contents, before hitting the network. content.cookies.accept: - default: no-3rdparty + default: all backend: QtWebKit: true QtWebEngine: Qt 5.11 @@ -337,7 +337,8 @@ content.cookies.accept: name: String valid_values: - all: "Accept all cookies." - - no-3rdparty: "Accept cookies from the same origin only." + - no-3rdparty: "Accept cookies from the same origin only. This is known + to break some sites, such as GMail." - no-unknown-3rdparty: "Accept cookies from the same origin only, unless a cookie is already set for the domain. On QtWebEngine, this is the same as no-3rdparty." From 5ad79ee6cdb9dce7f11eb8761d3de387b87dd484 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 26 Oct 2018 10:17:30 +0200 Subject: [PATCH 059/492] Update changelog --- doc/changelog.asciidoc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 665ce7c0a..8de8fa078 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -59,6 +59,16 @@ Fixed - Invalid hint length calculation in certain rare cases. - Dragging tabs in the tab bar (which was broken in v1.5.0) +v1.5.2 +------ + +Changed +~~~~~~~ + +- The `content.cookies.accept` setting is now set to `all` instead of + `no-3rdparty` by default, as `no-3rdparty` breaks various pages such as + GMail. + v1.5.1 ------ From a52c24791da231ae7eb15648bd08b40840b6f764 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 26 Oct 2018 10:20:24 +0200 Subject: [PATCH 060/492] Release v1.5.2 (cherry picked from commit a42f37a0c6be5651073754dd6e62cd968df07130) --- qutebrowser/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/__init__.py b/qutebrowser/__init__.py index f6134953d..8be3df172 100644 --- a/qutebrowser/__init__.py +++ b/qutebrowser/__init__.py @@ -26,7 +26,7 @@ __copyright__ = "Copyright 2014-2018 Florian Bruhin (The Compiler)" __license__ = "GPL" __maintainer__ = __author__ __email__ = "mail@qutebrowser.org" -__version_info__ = (1, 5, 1) +__version_info__ = (1, 5, 2) __version__ = '.'.join(str(e) for e in __version_info__) __description__ = "A keyboard-driven, vim-like browser based on PyQt5." From 9c73bf9e97a19c39230b1289b458e1d1a3d33bfc Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Sat, 27 Oct 2018 16:12:15 -0700 Subject: [PATCH 061/492] Add tests for selection persisting - Remove unneeded override of qt home method --- qutebrowser/misc/miscwidgets.py | 7 ------- tests/unit/misc/test_miscwidgets.py | 23 +++++++++++++++++++++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/qutebrowser/misc/miscwidgets.py b/qutebrowser/misc/miscwidgets.py index 36dad4f41..085b2fdd1 100644 --- a/qutebrowser/misc/miscwidgets.py +++ b/qutebrowser/misc/miscwidgets.py @@ -105,13 +105,6 @@ class CommandLineEdit(QLineEdit): self._validator.prompt = text self._promptlen = len(text) - def home(self, mark): - """Override home so it works properly with our cursor restriction.""" - oldpos = self.cursorPosition() - self.setCursorPosition(self._promptlen) - if mark: - self.setSelection(self._promptlen, oldpos - self._promptlen) - class _CommandValidator(QValidator): diff --git a/tests/unit/misc/test_miscwidgets.py b/tests/unit/misc/test_miscwidgets.py index d6b099418..551b466e2 100644 --- a/tests/unit/misc/test_miscwidgets.py +++ b/tests/unit/misc/test_miscwidgets.py @@ -59,8 +59,8 @@ class TestCommandLineEdit: assert cmd_edit.text() == ':hello' assert cmd_edit.cursorPosition() == len(':hello') - cmd_edit.home(mark=True) - assert cmd_edit.cursorPosition() == len(':hello') + cmd_edit.home(True) + assert cmd_edit.cursorPosition() == len(':') qtbot.keyClick(cmd_edit, Qt.Key_Delete) assert cmd_edit.text() == ':' qtbot.keyClick(cmd_edit, Qt.Key_Backspace) @@ -74,6 +74,25 @@ class TestCommandLineEdit: qtbot.keyClicks(cmd_edit, '$hello') assert cmd_edit.text() == '' + def test_selection_home(self, qtbot, cmd_edit): + """Test selection persisting when pressing home.""" + qtbot.keyClicks(cmd_edit, ':hello') + assert cmd_edit.text() == ':hello' + assert cmd_edit.cursorPosition() == len(':hello') + cmd_edit.home(True) + assert cmd_edit.cursorPosition() == len(':') + assert cmd_edit.selectionStart() == len(':') + + def test_selection_backspace(self, qtbot, cmd_edit): + """Test selection persisting when backspacing to the first char.""" + qtbot.keyClicks(cmd_edit, ':hello') + assert cmd_edit.text() == ':hello' + assert cmd_edit.cursorPosition() == len(':hello') + for _ in range(len(':hello')): + qtbot.keyClick(cmd_edit, Qt.Key_Left, modifier=Qt.ShiftModifier) + assert cmd_edit.cursorPosition() == len(':') + assert cmd_edit.selectionStart() == len(':') + class WrappedWidget(QWidget): From 27625604b68007b3dac53fca2536e919650089db Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Sat, 27 Oct 2018 16:23:28 -0700 Subject: [PATCH 062/492] Upgrade itsdangerous to 1.1.0 Fixes CI failing due to pulled release https://github.com/pallets/itsdangerous/issues/112 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 5028ca550..b324b2339 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -14,7 +14,7 @@ Flask==1.0.2 glob2==0.6 hunter==2.0.2 hypothesis==3.79.0 -itsdangerous==1.0.0 +itsdangerous==1.1.0 # Jinja2==2.10 Mako==1.0.7 # MarkupSafe==1.0 From 4166e50764dd8bef6187b74cece0073efdc5353d Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Sun, 28 Oct 2018 15:27:02 +0100 Subject: [PATCH 063/492] Add support for per-domain secret files in qute-pass This adds support for password stores where the domain is not the directory name, but the filename of a gpg file. This solves problems when using a password store folder structure like this reddit user does: https://www.reddit.com/r/qutebrowser/comments/7owzl2/cant_get_qutepass_working/ --- misc/userscripts/qute-pass | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/misc/userscripts/qute-pass b/misc/userscripts/qute-pass index ca9c4d4ca..bfc2cbeb9 100755 --- a/misc/userscripts/qute-pass +++ b/misc/userscripts/qute-pass @@ -97,13 +97,19 @@ def qute_command(command): def find_pass_candidates(domain, password_store_path): candidates = [] for path, directories, file_names in os.walk(password_store_path, followlinks=True): - if directories or domain not in path.split(os.path.sep): + secrets = fnmatch.filter(file_names, '*.gpg') + if not secrets: continue # Strip password store path prefix to get the relative pass path pass_path = path[len(password_store_path) + 1:] - secrets = fnmatch.filter(file_names, '*.gpg') - candidates.extend(os.path.join(pass_path, os.path.splitext(secret)[0]) for secret in secrets) + split_path = pass_path.split(os.path.sep) + for secret in secrets: + secret_base = os.path.splitext(secret)[0] + if domain not in (split_path + [secret_base]): + continue + + candidates.append(os.path.join(pass_path, secret_base)) return candidates From 3714adfe5a13e5ad360f6dff631f68cf5eb75ffa Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 29 Oct 2018 18:56:15 +0100 Subject: [PATCH 064/492] Update flake8 from 3.5.0 to 3.6.0 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index f0132ecf8..2612e49a6 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py attrs==18.2.0 -flake8==3.5.0 +flake8==3.6.0 flake8-bugbear==18.8.0 flake8-builtins==1.4.1 # rq.filter: != 1.4.0 flake8-comprehensions==1.4.1 From 11184d3d5b8912f25b6d834218ec289e56e7311d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 29 Oct 2018 18:56:17 +0100 Subject: [PATCH 065/492] Update setuptools from 40.4.3 to 40.5.0 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index 3ee692736..f95e8f620 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -3,6 +3,6 @@ appdirs==1.4.3 packaging==18.0 pyparsing==2.2.2 -setuptools==40.4.3 +setuptools==40.5.0 six==1.11.0 wheel==0.32.2 From c5526f5c3625139e5d3f0565e74a6c8a20a65c02 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 29 Oct 2018 18:56:19 +0100 Subject: [PATCH 066/492] Update future from 0.16.0 to 0.17.0 --- misc/requirements/requirements-pyinstaller.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pyinstaller.txt b/misc/requirements/requirements-pyinstaller.txt index 4edda80c9..f75eeb3a5 100644 --- a/misc/requirements/requirements-pyinstaller.txt +++ b/misc/requirements/requirements-pyinstaller.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py altgraph==0.16.1 -future==0.16.0 +future==0.17.0 macholib==1.11 pefile==2018.8.8 -e git+https://github.com/pyinstaller/pyinstaller.git@develop#egg=PyInstaller From 900bfe1e4fb41face8e3c3c2687b208ac09695c6 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 29 Oct 2018 18:56:20 +0100 Subject: [PATCH 067/492] Update python-dateutil from 2.7.3 to 2.7.5 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index cbce32720..819975943 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -14,7 +14,7 @@ lazy-object-proxy==1.3.1 mccabe==0.6.1 pycparser==2.19 pylint==2.1.1 -python-dateutil==2.7.3 +python-dateutil==2.7.5 ./scripts/dev/pylint_checkers requests==2.20.0 six==1.11.0 From 8d6d4163bb0fdfc0d2d4e847f9e79c3985df48ea Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 29 Oct 2018 18:56:22 +0100 Subject: [PATCH 068/492] Update hypothesis from 3.79.0 to 3.81.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index b324b2339..a576579ac 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -13,7 +13,7 @@ fields==5.0.0 Flask==1.0.2 glob2==0.6 hunter==2.0.2 -hypothesis==3.79.0 +hypothesis==3.81.0 itsdangerous==1.1.0 # Jinja2==2.10 Mako==1.0.7 From 69b28d6a4d483d597572dbd4969852ac9e977160 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 29 Oct 2018 18:56:23 +0100 Subject: [PATCH 069/492] Update pytest from 3.9.2 to 3.9.3 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index a576579ac..d00ff4f34 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -24,7 +24,7 @@ parse-type==0.4.2 pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 -pytest==3.9.2 +pytest==3.9.3 pytest-bdd==3.0.0 pytest-benchmark==3.1.1 pytest-cov==2.6.0 From 83e0ea28d2750135f152f3449b0db4e6aa4c020e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 29 Oct 2018 18:56:25 +0100 Subject: [PATCH 070/492] Update vulture from 0.29 to 1.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index d00ff4f34..eb52e2cc7 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -38,5 +38,5 @@ pytest-travis-fold==1.3.0 pytest-xvfb==1.1.0 PyVirtualDisplay==0.2.1 six==1.11.0 -vulture==0.29 +vulture==1.0 Werkzeug==0.14.1 From 130c2bcad431dd6b0005cc743b97845eb4a1fdbe Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 29 Oct 2018 18:56:26 +0100 Subject: [PATCH 071/492] Update vulture from 0.29 to 1.0 --- misc/requirements/requirements-vulture.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-vulture.txt b/misc/requirements/requirements-vulture.txt index 622527f5d..74ce34551 100644 --- a/misc/requirements/requirements-vulture.txt +++ b/misc/requirements/requirements-vulture.txt @@ -1,3 +1,3 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py -vulture==0.29 +vulture==1.0 From 398590828514b605d343fd1fe120830881f32d28 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 29 Oct 2018 18:56:28 +0100 Subject: [PATCH 072/492] Update tox from 3.5.2 to 3.5.3 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index 7ed4022bb..a3c980b5e 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -4,5 +4,5 @@ pluggy==0.8.0 py==1.7.0 six==1.11.0 toml==0.10.0 -tox==3.5.2 +tox==3.5.3 virtualenv==16.0.0 From 96ace5aa9936ddb9196f395521e22c6ed8ec5025 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 29 Oct 2018 19:57:54 +0100 Subject: [PATCH 073/492] Update flake8 dependencies --- .flake8 | 4 +++- misc/requirements/requirements-flake8.txt | 4 ++-- misc/requirements/requirements-flake8.txt-raw | 8 +------- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.flake8 b/.flake8 index 0617edc4d..8c03ef729 100644 --- a/.flake8 +++ b/.flake8 @@ -33,6 +33,7 @@ exclude = .*,__pycache__,resources.py # (false-positives) # D413: Missing blank line after last section (not in pep257?) # A003: Builtin name for class attribute (needed for overridden methods) +# W504: line break after binary operator ignore = B001,B008,B305, E128,E226,E265,E501,E402,E266,E722,E731, @@ -40,7 +41,8 @@ ignore = N802, P101,P102,P103, D102,D103,D106,D107,D104,D105,D209,D211,D401,D402,D403,D413, - A003 + A003, + W504 min-version = 3.4.0 max-complexity = 12 per-file-ignores = diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index 2612e49a6..cd1fcba4d 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -3,7 +3,7 @@ attrs==18.2.0 flake8==3.6.0 flake8-bugbear==18.8.0 -flake8-builtins==1.4.1 # rq.filter: != 1.4.0 +flake8-builtins==1.4.1 flake8-comprehensions==1.4.1 flake8-copyright==0.2.2 flake8-debugger==3.1.0 @@ -19,7 +19,7 @@ flake8-tuple==0.2.13 mccabe==0.6.1 pathmatch==0.2.1 pep8-naming==0.7.0 -pycodestyle==2.3.1 # rq.filter: < 2.4.0 +pycodestyle==2.4.0 pydocstyle==3.0.0 pyflakes==2.0.0 six==1.11.0 diff --git a/misc/requirements/requirements-flake8.txt-raw b/misc/requirements/requirements-flake8.txt-raw index 7ccbbce26..1f30b83ae 100644 --- a/misc/requirements/requirements-flake8.txt-raw +++ b/misc/requirements/requirements-flake8.txt-raw @@ -1,6 +1,6 @@ flake8 flake8-bugbear -flake8-builtins!=1.4.0 +flake8-builtins flake8-comprehensions flake8-copyright flake8-debugger @@ -15,9 +15,3 @@ flake8-tuple pep8-naming pydocstyle pyflakes - -# https://github.com/PyCQA/pycodestyle/issues/741 -#@ filter: pycodestyle < 2.4.0 - -# https://github.com/gforcada/flake8-builtins/issues/36 -#@ filter: flake8-builtins != 1.4.0 From d5a5e08eff3388fbde9e73dffbf2cd4b64863989 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 30 Oct 2018 15:32:19 +0100 Subject: [PATCH 074/492] Simplify test --- tests/unit/misc/test_miscwidgets.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/misc/test_miscwidgets.py b/tests/unit/misc/test_miscwidgets.py index 551b466e2..d5c1183a5 100644 --- a/tests/unit/misc/test_miscwidgets.py +++ b/tests/unit/misc/test_miscwidgets.py @@ -83,12 +83,12 @@ class TestCommandLineEdit: assert cmd_edit.cursorPosition() == len(':') assert cmd_edit.selectionStart() == len(':') - def test_selection_backspace(self, qtbot, cmd_edit): - """Test selection persisting when backspacing to the first char.""" + def test_selection_cursor_left(self, qtbot, cmd_edit): + """Test selection persisting when moving to the first char.""" qtbot.keyClicks(cmd_edit, ':hello') assert cmd_edit.text() == ':hello' assert cmd_edit.cursorPosition() == len(':hello') - for _ in range(len(':hello')): + for _ in ':hello': qtbot.keyClick(cmd_edit, Qt.Key_Left, modifier=Qt.ShiftModifier) assert cmd_edit.cursorPosition() == len(':') assert cmd_edit.selectionStart() == len(':') From a7fb07fbeec2e85f411d117730a58df9989b8763 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 30 Oct 2018 15:41:26 +0100 Subject: [PATCH 075/492] Add emacs-like config docs --- doc/help/configuring.asciidoc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/help/configuring.asciidoc b/doc/help/configuring.asciidoc index 67704cc0b..57e5528c0 100644 --- a/doc/help/configuring.asciidoc +++ b/doc/help/configuring.asciidoc @@ -423,6 +423,19 @@ config = config # type: ConfigAPI # noqa: F821 pylint: disable=E0602,C0103 c = c # type: ConfigContainer # noqa: F821 pylint: disable=E0602,C0103 ---- +emacs-like config +^^^^^^^^^^^^^^^^^ + +Various emacs/conkeror-like keybinding configs exist: + +- https://gitlab.com/jgkamat/qutemacs/blob/master/qutemacs.py[jgkamat] +- https://gitlab.com/Kaligule/qutebrowser-emacs-config/blob/master/config.py[Kaligule] +- http://me0w.net/pit/1540882719[nm0i] + +It's also mostly possible to get rid of modal keybindings by setting +`input.insert_mode.auto_enter` to `false`, and `input.forward_unbound_keys` to +`all`. + [[migrating]] Migrating older configurations ------------------------------ From 7c4356280728e5d5240d9142b766c28b6a694640 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 30 Oct 2018 15:43:04 +0100 Subject: [PATCH 076/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 8de8fa078..805653620 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -58,6 +58,7 @@ Fixed now correctly replaced. - Invalid hint length calculation in certain rare cases. - Dragging tabs in the tab bar (which was broken in v1.5.0) +- Using Shift-Home in command mode now works properly. v1.5.2 ------ From cac04d40014aa7a024577c9bdb39f1fb05e4eb86 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 31 Oct 2018 08:54:29 +0100 Subject: [PATCH 077/492] Add workaround for accepting third-party cookies An empty first-party URL is considered a first-party request. This workaround is equivalent to the Qt fix: https://codereview.qt-project.org/#/c/244021/ Note that later versions of Chromium changed that check: https://bugs.chromium.org/p/chromium/issues/detail?id=882107 That shouldn't be a problem since we disable our workaround with Qt 5.11.3, so once Qt catches up there, the check isn't done anymore. Fixes #4281 --- qutebrowser/browser/webengine/cookies.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/webengine/cookies.py b/qutebrowser/browser/webengine/cookies.py index d9d11cd98..e5abc20ea 100644 --- a/qutebrowser/browser/webengine/cookies.py +++ b/qutebrowser/browser/webengine/cookies.py @@ -20,7 +20,7 @@ """Filter for QtWebEngine cookies.""" from qutebrowser.config import config -from qutebrowser.utils import utils +from qutebrowser.utils import utils, qtutils def _accept_cookie(request): @@ -29,7 +29,13 @@ def _accept_cookie(request): if accept == 'all': return True elif accept in ['no-3rdparty', 'no-unknown-3rdparty']: - return not request.thirdParty + if qtutils.version_check('5.11.3', compiled=False): + third_party = request.thirdParty + else: + # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-71393 + third_party = (request.thirdParty and + not request.firstPartyUrl.isEmpty()) + return not third_party elif accept == 'never': return False else: From 9645b2ed0d1f93f43034706e1b1b85935bc628dd Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 31 Oct 2018 09:13:38 +0100 Subject: [PATCH 078/492] Update changelog --- doc/changelog.asciidoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 805653620..03d3e75b7 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -59,6 +59,10 @@ Fixed - Invalid hint length calculation in certain rare cases. - Dragging tabs in the tab bar (which was broken in v1.5.0) - Using Shift-Home in command mode now works properly. +- Workaround for a Qt bug which prevented + `content.cookies.accept = no-3rdparty` from working properly on some pages + like GMail. However, the default for `content.cookies.accept` is still `all` + to be in line with what other browsers do. v1.5.2 ------ From 08278138c4bebdf02c6c46fe0372b0cea7851657 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 3 Nov 2018 07:54:37 +0100 Subject: [PATCH 079/492] Add :yank markdown --- doc/changelog.asciidoc | 2 ++ doc/help/commands.asciidoc | 1 + doc/help/settings.asciidoc | 2 ++ qutebrowser/browser/commands.py | 11 +++++++++-- qutebrowser/config/configdata.yml | 2 ++ tests/end2end/features/yankpaste.feature | 7 +++++++ 6 files changed, 23 insertions(+), 2 deletions(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 03d3e75b7..93cffe40c 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -32,6 +32,8 @@ Added dict/list setting. - New `hints.selectors` setting which allows to configure what CSS selectors are used for hints, and also allows adding custom hint groups. +- New `:yank markdown` feature which yanks the current URL and title in + markdown format. Changed ~~~~~~~ diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index 88c738729..13cf0a790 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -1472,6 +1472,7 @@ Yank something to the clipboard or primary selection. - `title`: The current page's title. - `domain`: The current scheme, domain, and port number. - `selection`: The selection under the cursor. + - `markdown`: Yank title and URL in markdown format. diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index 348baf7ca..b7cb0349b 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -640,10 +640,12 @@ Default: * +pass:[xO]+: +pass:[set-cmd-text :open -b -r {url:pretty}]+ * +pass:[xo]+: +pass:[set-cmd-text -s :open -b]+ * +pass:[yD]+: +pass:[yank domain -s]+ +* +pass:[yM]+: +pass:[yank markdown -s]+ * +pass:[yP]+: +pass:[yank pretty-url -s]+ * +pass:[yT]+: +pass:[yank title -s]+ * +pass:[yY]+: +pass:[yank -s]+ * +pass:[yd]+: +pass:[yank domain]+ +* +pass:[ym]+: +pass:[yank markdown]+ * +pass:[yp]+: +pass:[yank pretty-url]+ * +pass:[yt]+: +pass:[yank title]+ * +pass:[yy]+: +pass:[yank]+ diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index a3f301ae5..096a324d2 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -796,7 +796,7 @@ class CommandDispatcher: def _yank_url(self, what): """Helper method for yank() to get the URL to copy.""" - assert what in ['url', 'pretty-url'], what + assert what in ['url', 'pretty-url', 'markdown'], what flags = QUrl.RemovePassword if what == 'pretty-url': flags |= QUrl.DecodeReserved @@ -816,7 +816,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('what', choices=['selection', 'url', 'pretty-url', - 'title', 'domain']) + 'title', 'domain', 'markdown']) def yank(self, what='url', sel=False, keep=False, quiet=False): """Yank something to the clipboard or primary selection. @@ -828,6 +828,7 @@ class CommandDispatcher: - `title`: The current page's title. - `domain`: The current scheme, domain, and port number. - `selection`: The selection under the cursor. + - `markdown`: Yank title and URL in markdown format. sel: Use the primary selection instead of the clipboard. keep: Stay in visual mode after yanking the selection. @@ -853,6 +854,12 @@ class CommandDispatcher: caret = self._current_widget().caret caret.selection(callback=_selection_callback) return + elif what == 'markdown': + idx = self._current_index() + title = self._tabbed_browser.widget.page_title(idx) + url = self._yank_url(what) + s = '[{}]({})'.format(title, url) + what = 'markdown URL' # For printing else: # pragma: no cover raise ValueError("Invalid value {!r} for `what'.".format(what)) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index ac556f3fb..e0bad5ba9 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -2615,6 +2615,8 @@ bindings.default: yD: yank domain -s yp: yank pretty-url yP: yank pretty-url -s + ym: yank markdown + yM: yank markdown -s pp: open -- {clipboard} pP: open -- {primary} Pp: open -t -- {clipboard} diff --git a/tests/end2end/features/yankpaste.feature b/tests/end2end/features/yankpaste.feature index c6f9b572b..806bbd2d2 100644 --- a/tests/end2end/features/yankpaste.feature +++ b/tests/end2end/features/yankpaste.feature @@ -41,6 +41,13 @@ Feature: Yanking and pasting. Then the message "Yanked title to clipboard: Test title" should be shown And the clipboard should contain "Test title" + Scenario: Yanking markdown URL to clipboard + When I open data/title.html + And I wait for regex "Changing title for idx \d to 'Test title'" in the log + And I run :yank markdown + Then the message "Yanked markdown URL to clipboard: *" should be shown + And the clipboard should contain "[Test title](http://localhost:(port)/data/title.html)" + Scenario: Yanking domain to clipboard When I open data/title.html And I run :yank domain From 8c7c686d3fdbec2f49e33dd0a5674298233850d0 Mon Sep 17 00:00:00 2001 From: lyeoh Date: Sat, 3 Nov 2018 12:36:19 -0500 Subject: [PATCH 080/492] Strip fragment and query only for `:navigate up` --- qutebrowser/browser/commands.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 096a324d2..d0627de92 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -636,7 +636,6 @@ class CommandDispatcher: cmdutils.check_exclusive((tab, bg, window), 'tbw') widget = self._current_widget() url = self._current_url() - url = url.adjusted(QUrl.RemoveFragment | QUrl.RemoveQuery) handlers = { 'prev': functools.partial(navigate.prevnext, prev=True), @@ -654,6 +653,8 @@ class CommandDispatcher: handler(browsertab=widget, win_id=self._win_id, baseurl=url, tab=tab, background=bg, window=window) elif where in ['up', 'increment', 'decrement']: + if where is 'up': + url = url.adjusted(QUrl.RemoveFragment | QUrl.RemoveQuery) new_url = handlers[where](url, count) self._open(new_url, tab, bg, window, related=True) else: # pragma: no cover From 4e1d63ee5f582eda94ee21c9a2019666861bbde9 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Sat, 3 Nov 2018 11:01:50 -0700 Subject: [PATCH 081/492] Add tests for query increment --- tests/end2end/features/navigate.feature | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/end2end/features/navigate.feature b/tests/end2end/features/navigate.feature index f3de78a6a..07bd56c69 100644 --- a/tests/end2end/features/navigate.feature +++ b/tests/end2end/features/navigate.feature @@ -125,6 +125,12 @@ Feature: Using :navigate And I run :navigate increment Then the error "No number found in URL!" should be shown + Scenario: Incrementing query + When I set url.incdec_segments to ["query"] + And I open data/numbers/1.txt?value=2 + And I run :navigate increment + Then data/numbers/1.txt?value=3 should be loaded + @qtwebengine_todo: Doesn't find any elements Scenario: Navigating multiline links When I open data/navigate/multilinelinks.html From 27d4796c2f9ced450ceaf3569de228532ce08df7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 5 Nov 2018 10:05:59 +0100 Subject: [PATCH 082/492] Add adblock benchmark --- tests/end2end/data/blocked-hosts | 53378 +++++++++++++++++++++++++++ tests/unit/browser/test_adblock.py | 17 +- 2 files changed, 53394 insertions(+), 1 deletion(-) create mode 100644 tests/end2end/data/blocked-hosts diff --git a/tests/end2end/data/blocked-hosts b/tests/end2end/data/blocked-hosts new file mode 100644 index 000000000..1fb431feb --- /dev/null +++ b/tests/end2end/data/blocked-hosts @@ -0,0 +1,53378 @@ +0.r.msn.com +00.creativecdn.com +000.0x1f4b0.com +000.gaysexe.free.fr +000free.us +000owamail0.000webhostapp.com +000tristanprod.free.fr +001.0x1f4b0.com +002.0x1f4b0.com +003.0x1f4b0.com +004.0x1f4b0.com +005.0x1f4b0.com +005.free-counter.co.uk +006.0x1f4b0.com +006.free-counter.co.uk +006.freecounters.co.uk +007.0x1f4b0.com +007.free-counter.co.uk +007angels.com +007freepics.com +008.0x1f4b0.com +008.free-counter.co.uk +008.free-counters.co.uk +009.0x1f4b0.com +00author.com +00f91.static-ex.epom.com +00fun.com +00go.com +00it.com +00sexus.com +00webcams.com +01-photos-porno.info +01-sex-amateur.info +0101011.com +011707160008.c.mystat-in.net +012.2o7.net +012br.com +013sv.com +015gf.com +016ih.com +017gj.com +0190service.de +01apple.com +0365.bid +03e.info +03p.info +042707d90914.agrigid.com +0427d7.se +050003.voodoo.com +050005.voodoo.com +0532a9.r.axf8.net +05tz2e9.com +061606084448.c.mystat-in.net +06272002-dbase.hitcountz.net +064bdf.r.axf8.net +070806142521.c.mystat-in.net +075.nu +07634.com +08.creativecdn.com +080jxrab.top +08feb2018.truconversion.com +08febuary18.truconversion.com +0900-telefonerotik.de +0906porno.nl +090906042103.c.mystat-in.net +092706152958.c.mystat-in.net +09killspyware.com +09zyy.com +0aqpqdju.me +0azx1.com +0cc175b9c0f1b6a831c399e269772661.com +0d7292.r.axf8.net +0d79ed.r.axf8.net +0dax.com +0f36f3.r.axf8.net +0iecfobt.com +0koryu0.easter.ne.jp +0latfee.ero-advertising.com +0lovespells0.blogspot.com +0m3.ru +0m4.ru +0n-line.tv +0nn.info +0ping.info +0pn.ru +0pros.com +0q2.sitey.me +0qizz.super-promo.hoxo.info +0stats.com +0to.info +0x1f4b0.com +1-2fly-befragung.de +1-800onlinecasino.com +1-free-share-buttons.com +1-pregnant-sex.com +1-sexy.com +1.114central.com +1.adbrite.com +1.allyes.com.cn +1.cpm.ak-is.net +1.forgetstore.com +1.googlenews.xorg.pl +1.hidemyass.com +1.httpads.com +1.ofsnetwork.com +1.primaryads.com +1.tl813.com +10-euro-golf.de +10.170.0.11.corp.returnpath.net +10.creativecdn.com +10.im.cz +10.proxy.us-east-1.world.rw.yieldmo.com +100.1qingdao.com +10000hai.com +10000verges.free.fr +10006.hittail.com +100065.hittail.com +1000bannerx.free.fr +1000cumshots.com +1000lashes.com +1000ps.oewabox.at +1000russianwomen.com +1000websporno.com +1001lingerie.com +1001movies.com +100dollars-seo.com +100filles.free.fr +100pornstars.com +100shemales.com +100webads.com +10168.hittail.com +1018d7.r.axf8.net +101billion.com +101cities.se +101com.com +101flag.ru +101gals.com +101lesbian.xyz +101malls.com +101order.com +101raccoon.ru +101satcom.com +102.112.207.net +102.112.2o7.net +102.122.2o7.net +102106151057.c.mystat-in.net +103.hosting-5.xtream.co.il +103532.hittail.com +10394-127.ampxchange.com +10394-2468.ampxchange.com +10394-4254.ampxchange.com +104231.dtiblog.com +105vibe.com +106242.hittail.com +108411.hittail.com +108shot.com +109-204-26-16.netconnexion.managedbroadband.co.uk +1097834592.rsc.cdn77.org +10best.us.intellitxt.com +10bet.com +10fbb07a4b0.se +10gb.6ka.info +10pg.scl5fyd.info +10xhellometro.112.2o7.net +11-15.net +11.lamarianella.info +1105governmentinformationgroup.122.2o7.net +11163221-517901.c.adprotect.net +11164531-19021001.c2.adprotect.net +11165583-40348.id2.clickprotects.com +112-tzm-766.mktoresp.com +112.2o7.net +112006133326.c.mystat-in.net +11235813.webzdarma.cz +11398.onceedge.ru +1170.xml.adx1.com +1173.xml.adx1.com +118605-5437.link.iwanttodeliver.com +11hour.com +11pikachu.ru +11zz.com +12.170.116.68 +12.com +121807150325.c.mystat-in.net +121media.com +121phonesex.co.uk +122.2o7.net +122907224924.c.mystat-in.net +123-tracker.com +123.fluxads.com +123.ichkoche.at +123any.com +123boy.free.fr +123branlemoi.free.fr +123cha.com +123count.com +123counter.mycomputer.com +123counter.superstats.com +123ero.nl +123freeavatars.com +123go.com +123greetings.com +123kia.free.fr +123kuma.com +123laceypink.com +123latina.free.fr +123locker.com +123plays.com +123sex.biz +123sex.org +123specialgifts.com +123stat.com +1262.hittail.com +1274.mediatraffic.com +1278725189.pub.ezanga.com +12877.hittail.com +12bet.com +12cams.be +12masterov.com +12month.loan +12research.com +12u.info +12xhardcore.com +130.211.230.53 +13146.engine.mobileapptracking.com +1314dh.com +1319.de +13223.hittail.com +1337crew.info +13453765871837679316.googlegroups.com +138shenbosbo.com +13tabs.com +14228.hittail.com +1435575.fls.doubleclick.net +145-ct.c3tag.com +145639-4902.link.iwanttodeliver.com +14713804a.l2m.net +148.xg4ken.com +1480876790.rsc.cdn77.org +1493361689.rsc.cdn77.org +14b.info +14teen.com +15.basebanner.com +15.taboola.com +15141.hittail.com +1559.stats.misstrends.com +156002.com +15628.hittail.com +15694.hittail.com +15b37.skroc.pl +15bb51.info +15minadlt.hit.gemius.pl +15x.info +164.109.51.67 +16565.hittail.com +165a7.v.fwmrm.net +166f.com +16aq.cn +17003124.xyz +175storis.com +178evakuator178.ru +17990.vicp.net +17chezhan.com +17updatechwe150218.ru +17youzi.com +18.creativecdn.com +1800.stats.misstrends.com +180hits.de +180searchassistant.com +1817628.fls.doubleclick.net +1818sex.com +1866809.securefastserver.com +1867.stats.misstrends.com +18744.com +188838.parkingcrew.net +189-211-177-171.static.axtel.net +189zx.com +18cm.org +18freeporn.com +18hdxxx.com +18pluscard.com +18pluspics.com +18plusstore.com +18pure.info +18teengirl.com +18xtube.com +19.creativecdn.com +1901.nordstrom.com +19097.hittail.com +191661.engine.mobileapptracking.com +192.168.112.2o7.net +192.168.122.2o7.net +194792.engine.mobileapptracking.com +19500.hittail.com +19533.hittail.com +19blog.com +1adult.com +1as-bannertest.adtech.de +1as-bannertest.adtechus.com +1au.cqcounter.com +1auntie-phone-sex.info +1bb261.r.axf8.net +1beb2a44.space +1bet.com +1bg.net +1bm.cqcounter.com +1c.adx1.com +1c6e2.v.fwmrm.net +1ca.cqcounter.com +1cgi.hitbox.com +1de.cqcounter.com +1directory.ru +1egy.com +1ejaculationinterne.com +1empiredirect.com +1eroticspanking.info +1es.cqcounter.com +1forced.com +1fr.cqcounter.com +1freesoftwareonline.com +1gavcom.popunder.ru +1girl1pitcher.com +1girl1pitcher.org +1guy1cock.com +1hour.info +1hwy.com +1in.cqcounter.com +1it.cqcounter.com +1jo.cqcounter.com +1kdailyprofit.biz +1kinobig.ru +1l-view.mail.ru +1lesbiansex.com +1man1jar.org +1man2needles.com +1nl.cqcounter.com +1pamm.ru +1phads.com +1priest1nun.com +1priest1nun.net +1pt.cqcounter.com +1q0bjj4d39.top +1q2w3.fun +1q2w3.me +1q2w3.top +1q2w3.website +1qingdao.com +1re.info +1rx.io +1se.cqcounter.com +1sexe1.free.fr +1si.cqcounter.com +1stat.ru +1stproxy.info +1studio.net +1th.cqcounter.com +1tr.cqcounter.com +1ua.cqcounter.com +1uk.cqcounter.com +1unblock.com +1und1.ivwbox.de +1und1internetag.d3.sc.omtrdc.net +1up.us.intellitxt.com +1us.cqcounter.com +1whore.com +1wish.net +1worlditsolutions.com +1xxx.cqcounter.com +1zone1.free.fr +2-art-coliseum.com +2-dot-mod-ads-dot-house-ads-server.appspot.com +2.adbrite.com +2.adx1.com +2.googlenews.xorg.pl +2.hidemyass.com +2.marketbanker.com +2.rubanners.com +2.s09.flagcounter.com +2.speedknow.co +20-yrs-1.info +20.creativecdn.com +2000greetings.com +2001-007.com +2001positions.com +2005-search.com +2006mindfreaklike.blogspot.com +2012countdown.info +2012hacks.info +2013tomsshoesforsale.com +2015god.org +201mb.com +2020iscoming.info +202ch.com +20585485p.rfihub.com +207-87-18-203.wsmg.digex.net +207.net +20909.hittail.com +20996-1061.link.iwanttodeliver.com +20d625b48e.se +20pascals.nl +21.creativecdn.com +21750.tctm.co +21807.hittail.com +2183.jsjmlejl.clickshield.net +21jewelry.com +21updatechefw150218.ru +22.creativecdn.com +22.theappgrader.com +222-33544_999.pub.adfirmative.com +22537.hittail.com +2278.stats.misstrends.com +22kkkk.com +23.creativecdn.com +23315.hittail.com +234.adru.net +234.media.lbn.ru +234x120.adv.vz.ru +23837.hittail.com +24-ak.ru +24-fakty.pl +24-xxx.biz +24.creativecdn.com +243029-18685.link.iwanttodeliver.com +244657-12903.link.iwanttodeliver.com +2468.go2cloud.org +24695.com +24725.hittail.com +247590.r.axf8.net +247access.mookie1.com +247adbiz.net +247connect.247realmedia.com +247connect.uat.247realmedia.com +247locksmith-tucson.com +247lyrics.com +247media.com +247playz.com +247realmedia.com +247support.adtech.fr +247support.adtech.us +247wallstreet.us.intellitxt.com +24809.hittail.com +24counter.com +24holdem.com +24hoursready.cf +24hwebsex.com +24log.com +24log.de +24m.nuggad.net +24newsoft.fetmoredonefasterbysubmiting.download +24pm-affiliation.com +24ratownik.hit.gemius.pl +24sexycams.com +24tradeplus.com +24trk.com +24upgradecheck.thesteadysystemforupgrades.download +24videos.tv +24wrestling.us.intellitxt.com +24x7.soliday.org +25.creativecdn.com +25057.hittail.com +25184.hittail.com +2542116.fls.doubleclick.net +2560.fd.mobile.tv.sms13.de +257.de +257639.com +259572.com +25cat.tk +26.creativecdn.com +2607.cn +26288.hittail.com +2664.tm.zedo.com +267932.com +2712.api.swrve.com +2712.content.swrve.com +271395.com +272351.com +27460.hittail.com +2754.btrll.com +276bf6.r.axf8.net +27891.hittail.com +280h.info +2822.v.fwmrm.net +28305.hittail.com +284419414.log.optimizely.com +289931.com +2912a.v.fwmrm.net +2915d.v.fwmrm.net +2915dc.v.fwmrm.net +2945.v.fwmrm.net +2975c.v.fwmrm.net +29773.v.fwmrm.net +298-ct.c3tag.com +29xyt.adx1.com +2a24.com +2ab7f.v.fwmrm.net +2amsports.com +2anal.net +2baners.ero-advertising.com +2boys.pl +2cam.eu +2cam.nl +2cgi.hitbox.com +2chicks1dick.biz +2df7e.v.fwmrm.net +2ds.ero-advertising.com +2fbanners.ero-advertising.com +2fflatfee.ero-advertising.com +2fspeedclicks.ero-advertising.com +2gaap.com +2gay.net +2giga.download +2giga.link +2girls1cumshot.com +2girls1cup-free.com +2girls1cup.cc +2girls1cup.com +2girls1cup.nl +2girls1cup.ws +2girls1finger.com +2girls1finger.org +2guys1stump.org +2kata.ru +2kpixel.quantserve.com +2kporn.com +2ledhenone.com +2leep.com +2lesbians.net +2manshow.com +2mdn.net +2milks.com +2mouses.com +2muchsex.com +2mycomputer.com +2n2qlh5hqcwrvo.net +2o34.com +2o7.net +2open.facebook-ads.adtz.com +2p9fyvx.com +2pxg8bcf.top +2rich4bitches.com +2sexxxy.com +2sexy.ro +2site.com +2snaps.us.intellitxt.com +2spyware.us.intellitxt.com +2step-garage.co.uk +2tr.info +2wink.com.au +2ydian.com +2znp09oa.com +3-dauto.com +3-gay.com +3-letter-domains.net +3.adbrite.com +3.cennter.com +3.googlenews.xorg.pl +3.hidemyass.com +30-day-change.com +30001.hittail.com +30073.api.swrve.com +30073.content.swrve.com +300ca0d0.space +300sk.com +30280827a.l2m.net +302br.net +308-xbb-662.mktoresp.com +30811.hittail.com +30hardcore.galleryprogram.com +30sec.info +310ca263.space +312.1d27c9b8fb.com +31335.hittail.com +314.hittail.com +3151.77152.blueseek.com +3165.tm.zedo.com +31870.hittail.com +31seconds.net +320ca3f6.space +3211.tm.zedo.com +321cba.com +3241.hittail.com +3278dy.com +32e1dff65ea4eb3627ed-f1ecc94c86a56d3e42e512fcfd192886.r6.cf1.rackcdn.com +32red.it +330ca589.space +332645.r.axf8.net +33across-d.openx.net +33across.com +33b.b33r.net +33universal.adprimemedia.com +33video.33universal.com +33z6hhbo5tjmx6hdb1cn.adx1.com +34.gs +340ca71c.space +3415.hittail.com +341800575.log.optimizely.com +3459571470.log.optimizely.com +3463.hittail.com +34673.hittail.com +35385.hittail.com +360ads.com +360caa42.space +360clicks.de +360yield.com +3642305.fls.doubleclick.net +3650.tm.zedo.com +365locksmithsminneapolis.com +370cabd5.space +3765329.fls.doubleclick.net +377baidu.com +38707-223419.link.iwanttodeliver.com +3918.hittail.com +3933.hittail.com +3944448.fls.doubleclick.net +3957.hittail.com +39bola.com +39dvd-999.com +3ad.doubleclick.net +3am.info +3amcouk.skimlinks.com +3angelsvideo.com +3animalsex.com +3bb4f0.r.axf8.net +3bc3fd26-91cf-46b2-8ec6-b1559ada0079.statcamp.net +3c0cb3b4.space +3cloud.net +3d-daughter-list.info +3d-hentai.de +3d0cb547.space +3date.de +3dbluerayplayer.com +3dcgfx.net +3donlinegames.de +3dpassport.com +3dporn.biz +3ds.ero-advertising.com +3dsemulator.info +3dviolet.com +3fns.com +3gplay.pl +3gupload.112.2o7.net +3guys1hammer.ws +3henterprise.com +3jmcwio.com +3lift.com +3lm.info +3porno.org +3ps.go.com +3pt-staging.placelocal.com +3pt.placelocal.com +3pt.prod.paperg.com +3pt.staging.paperg.com +3sexlist.com +3sixty.exacttarget.com +3vig.com +3w.nuggad.net +3w24.com +3weekdiet.com +3wregie.ezakus.net +3wt4c.com +3x-fist-fucking.com +3xit.net +3xlist.com +3xtraffic.com +4-counter.com +4.adbrite.com +4.adx1.com +4.afs.googleadservices.com +4.androidislamic.com +4.collecorvino.org +4.dlevo.com +4.e-why.net +4.googlenews.xorg.pl +4.hidemyass.com +4.tl813.com +4.whereinitaly.com +4.whereinlazio.com +4.whereinliguria.com +4.whereinlombardy.com +4.whereinmilan.com +4.whereinmolise.com +4.whereinpiemonte.com +4.whereinpuglia.com +4.whereinsardegna.com +4.whereinsicilia.com +4.whereinsicily.com +4.whereintoscana.com +4.whereintrentinoaltoadige.com +403.hqhost.net +404.fuckyoucash.com +404.hqhost.net +404.online.net +404.xxxymovies.com +4053494.fls.doubleclick.net +40cg.com +40hardcore.galleryprogram.com +411-singles.com +411mania.us.intellitxt.com +411playz.com +4133.88.primosearch.com +4134.hittail.com +4184.stats.misstrends.com +420bankofwashington.com +4225.zhuolingxiu.com +422653.parkingcrew.net +423.ru +4236808.fls.doubleclick.net +4292932.fls.doubleclick.net +4332.ws +4354787.fls.doubleclick.net +4360661.fls.doubleclick.net +4436230.fls.doubleclick.net +4448269.fls.doubleclick.net +4488352.fls.doubleclick.net +4514783.fls.doubleclick.net +4560.hittail.com +45ansetplus.com +4612.hittail.com +4645336.fls.doubleclick.net +4654.2465.primosearch.com +4684100.fls.doubleclick.net +4735610.fls.doubleclick.net +48.2mydns.net +4802.170.blueseek.com +48544d4c5.adready.com +49.adx1.com +4902-145639.link.iwanttodeliver.com +4923503.fls.doubleclick.net +4affiliate.net +4ah.info +4allfree.com +4anners.ero-advertising.com +4asianporn.com +4beast.com +4biogas.de +4bqs.com +4c28d6.r.axf8.net +4cock.com +4d5.net +4dexports.com +4ever.cc +4fazz.pcloadletter.quhu.info +4girlsfingerpaint.com +4girlsfingerpaint.org +4girlss.com +4inn.pl +4jnzhl0d0.com +4kplayer.pl +4ksport.pl +4kstream.pl +4love.info +4meme.com +4o64flb.com +4plus11.com +4pornxxx.com +4pp13.com +4pussies.com +4qinvite.4q.iperceptions.com +4realzed.com +4replicawatch.net +4sex.nu +4sin.net +4takt-oel.de +4teacher.de +4th3d48.com +4thegame.uk.intellitxt.com +4tt.org +4u69.com +4unblock.info +4ur.click +4ureyesonly.com +4v9wp.com +4w-wrestling.us.intellitxt.com +4webmasters.com +4wheel.de +4wmp.nuggad.net +4xporn.com +4youcom.com +5.100.249.215 +5.estasiatica.com +5.eventiduepuntozero.com +5.googlenews.xorg.pl +5.hidemyass.com +5.xlmywdemotic.review +5000-cotydzien.com +506.xg4ken.com +50bots.nullrefexcep.com +50centstreetkingimmortal.com +50efa6486f1ef.skydivesolutions.be +50h6v79p.top +50hardcore.galleryprogram.com +50websads.com +51.la +511a.cn +518ad.com +51af72.r.axf8.net +51yes.com +5241.it +529collegesaving.com +52djcy.com +53.localytics.com +531.xg4ken.com +5322221.fls.doubleclick.net +5362399.fls.doubleclick.net +540.filost.com +5486.winxp.primosearch.com +5490.spedads.primosearch.com +55.2myip.com +550a.com +5582200.fls.doubleclick.net +55995-519009.link.iwanttodeliver.com +55hft.adx1.com +5726.bapi.adsafeprotected.com +5740.4785.blueseek.com +57883.net +5851.bid +5882.1158.blueseek.com +59-106-20-39.r-bl100.sakura.ne.jp +599.stats.misstrends.com +5990.findit.blueseek.com +59cn7.com +59nmk4u.tech +5advertise.com +5b008e.r.axf8.net +5bde1.v.fwmrm.net +5d0dd.v.fwmrm.net +5d406.v.fwmrm.net +5d427.v.fwmrm.net +5d4a1.v.fwmrm.net +5dimessports.com +5ebec5.r.axf8.net +5f055i.co.cc +5finder.com +5forex.ru +5g.adx1.com +5gb-internetu-pakiety.blogspot.com +5hmmm1mk.top +5i2.net +5k-player.com +5kstore.com +5mcwl.pw +5rnl.adx1.com +5rocks.io +5starhiphop.us.intellitxt.com +5starsupport.us.intellitxt.com +5toc.com +5u.com +5udt.com +5vz3cfs0yd.me +5wh.co.zw +5ws.dating-app.ru +5ya.adx1.com +5yfi7sy.com +5yszz.super-promo.quhu.info +6.hidemyass.com +6.mamaswishes.com +6.spacepur.de +6000518.com +600co.info +600z.com +602.stats.misstrends.com +604.stats.misstrends.com +606.stats.misstrends.com +6063.bapi.adsafeprotected.com +60secpanic.com +612045126.htmldrop.com +6159.genieessp.com +6165.rapidforum.com +61711.static-ex.epom.com +61kx.uk-insolvencydirect.com +6266.570204.primosearch.com +633642.parkingcrew.net +64uq73u7ug.webcam +654.stats.misstrends.com +65xps.com +662bd114b7c9.onceedge.ru +6635101.fls.doubleclick.net +6660003.com +666bukkake.eu +666s.info +66av.cc +671.stats.misstrends.com +680.stats.misstrends.com +687-ct.c3tag.com +694-img.c3tag.com +699.stats.misstrends.com +69boysex.com +69er.de +69freepornlinks.com +69lingerie.com +69net.de +69proof.com +69tubex.com +6amateure.net +6b8a953b2bf7788063d5-6e453f33ecbb90f11a62a5c376375af3.r71.cf5.rackcdn.com +6buckamateurs.com +6cg.adx1.com +6e.co.kr +6e2f1d2ae033.com +6ftlady.com +6j4cea2ybg.pl +6ldu6qa.com +6ow9rhxtolls.gq +6ox.de +6pg.ryf3hgf.info +6sc.co +6scout.de +6server.com +6stuff.com +6tsbe1zs.me +7.hidemyass.com +71158.hittail.com +7156.info +71i.nuggad.net +72-news.com +7209235.collect.igodigital.com +7228.eu +724106.biz +726.stats.misstrends.com +72d329.r.axf8.net +72impala.com +73091.hittail.com +734302086.keywordblocks.com +74.112.173.77 +7438.info +7457.accessaw.blueseek.com +7457.pownit.blueseek.com +7468.v.fwmrm.net +750.stats.misstrends.com +7500.com +755-ct.c3tag.com +76.a.boom.ro +77266.hittail.com +777-club.ru +777partner.com +77search.com +77sky.de +77tracking.com +78843.hittail.com +78tdd75.com +79.adx1.com +791026.com +79423.analytics.edgekey.net +79423.analytics.edgesuite.net +7979.nosubid.blueseek.com +7adpower.com +7bpeople.com +7bpeople.data.7bpeople.com +7cfmnf.top +7cnbcnews.com +7f1au20glg.com +7fb.ru +7gfs.com +7metasearch.com +7minuteworkout.com +7mu36somt5.com +7n0zz.300prize.7113879.com +7oqnsnzwwnm6zb7y.optionpaymentprak.com +7search.com +7softwaredreams.com +7thlegion.ru +7tools.eu +7vws1j1j.com +7wind.ru +7x.cc +7x7.ruwe.net +7xc4n.com +7y7.us +7yue.org +7zip.fr +7zsex.info +8000plus.si +803.stats.misstrends.com +8090cpa.com +815.hittail.com +81yvz.adx1.com +8260.hittail.com +829331534d183e7d1f6a-8d91cc88b27b979d0ea53a10ce8855ec.r96.cf5.rackcdn.com +82o9v830.com +83net.jp +85103.hittail.com +8574dnj3yzjace8c8io6zr9u3n.hop.clickbank.net +86d6.com +86file.megajoy.com +86get.joy.cn +86log.joy.cn +879.stats.misstrends.com +87w.info +883zy.com +888-vip.net +888.com +888casino.com +8899804.com +88proxy.xyz +88square.biz +8959.hittail.com +8b3439.r.axf8.net +8cb8a3.r.axf8.net +8cr.purredheanb.online +8d6274.r.axf8.net +8d6274.t.axf8.net +8feb18.truconversion.com +8feb2018.truconversion.com +8fga7.adx1.com +8fnzz.super-promo.quhu.info +8fvchzuz.myutilitydomain.com +8gold.com +8jd2lfsq.me +8jn.dating-app.ru +8khmer.com +8rf.com +8ruzz.allcpa.006238.xyz +8si.ru +8streams.com +8teentrannies.com +8tube.info +8ue9q7i.com +8vnzz.super-promo.quhu.info +8xv8.com +9000videos.com +90i.info +91.205.157.38 +91.212.132.230 +911.x24hr.com +91abcw.com +922.hittail.com +925.lt +93367.hittail.com +9394.hittail.com +944279.parkingcrew.net +9446.hittail.com +94cdn.com +94uyvwwh.com +9547.hittail.com +9563.hittail.com +9571.hittail.com +961.com +96id.de +97b1c56132dfcdd90f93-0c5c8388c0a5897e648f883e2c86dc72.r54.cf5.rackcdn.com +97fn1ej0.myutilitydomain.com +986.stats.misstrends.com +98oi.ru +99400.hittail.com +994119.r.axf8.net +999fitness.com +999ways.blogspot.co.uk +999webdesign.com +99bthgc.me +99count.com +99topnn.info +9a5l5.adx1.com +9aad7115.amy.gs +9ata.ero-advertising.com +9c51vda.com +9cd76b4462bb.com +9chrm100218dd.ru +9d060c.r.axf8.net +9dacbd.r.axf8.net +9down.us.intellitxt.com +9fb.info +9h7n8.com +9hp.info +9ics.cn +9med.net +9n68b4.top +9stoneinvestments.com +9thien.com +9xa.pl +___id___.c.mystat-in.net +_autodiscover._tcp.agkn.com +a-5.info +a-ads.com +a-blog.eu +a-counter.kiev.ua +a-lb.tribalfusion.com +a-lb.tribalfusion.com.akadns.net +a-n-o-n-y-m-o-u-s.info +a-nj.1rx.io +a-scl1.tribalfusion.com.akadns.net +a-scrip.org +a-sg01sl07.insnw.net +a-sg02sl07.insnw.net +a-sg03sl07.insnw.net +a-ssl.ligatus.com +a.0day.kiev.ua +a.1nimo.com +a.abnad.net +a.abv.bg +a.acrabakasaka.com +a.ad.playstation.net +a.adexchangemachine.com +a.admaxserver.com +a.admob.com +a.adnium.com +a.adorika.net +a.adready.com +a.adroll.com +a.ads1.msads.net +a.ads1.msn.com +a.ads2.msads.net +a.ads2.msn.com +a.ads99.cn +a.adstome.com +a.adtech.de +a.adtechjp.com +a.adtechus.com +a.adtpix.com +a.advanstar.com +a.ajkelra.com +a.algovid.com +a.amd.com +a.analytics.yahoo.com +a.androidandme.com +a.answers.com +a.applovin.com +a.applvn.com +a.aproductmsg.com +a.as-eu.falkag.net +a.as-us.falkag.net +a.autoexpress.co.uk +a.avalhukof.com +a.backclick.net +a.bahaimlo.com +a.baidu.com +a.beliefnet.com +a.bf-ad.net +a.bizarremag.com +a.boom.ro +a.botiviga.com +a.cbc.ca +a.cctv.com +a.cdn.intentmedia.net +a.centrum.cz +a.ciridola.com +a.civitik.com +a.cntv.cn +a.collective-media.net +a.company-target.com +a.consumer.net +a.custompc.co.uk +a.deepdive.exponential.com +a.dpmsrv.com +a.dynad.net +a.environmentaldefense.org +a.evo.co.uk +a.fandango.com +a.farlex.com +a.fiksu.com +a.fox.com +a.fqtag.com +a.giantrealm.com +a.glcdn.co +a.global.msads.net +a.goember.com +a.gsmarena.com +a.heavy-r.com +a.heretv.com +a.hspvst.com +a.huluad.com +a.idio.co +a.imonomy.com +a.independent.co.uk +a.itpro.co.uk +a.jadizayo.com +a.jandolav.com +a.jquerycdn.co.il +a.jsrdn.com +a.karmatrail.club +a.kaytri.com +a.kerg.net +a.kickass.to +a.kickassunblock.net +a.kik.bg +a.kilomansa.com +a.kilorama.com +a.klaviyo.com +a.komoona.com +a.law.com +a.ligatus.com +a.ligatus.de +a.liktirov.com +a.livesportmedia.eu +a.macuser.co.uk +a.mailmunch.co +a.marketgid.com +a.medialytics.com +a.mgid.com +a.milparota.com +a.mktw.net +a.mobify.com +a.mobile.toboads.com +a.modernmedicine.com +a.moitepari.bg +a.monetate.net +a.mouseflow.com +a.mozefakt.com +a.muligov.com +a.namitol.com +a.netmng.com +a.networkworld.com +a.niklesrov.com +a.nimdinb.com +a.o333o.com +a.oix.com +a.oix.net +a.openinternetexchange.com +a.optmnstr.com +a.optmstr.com +a.optnmstr.com +a.pcpro.co.uk +a.phormlabs.com +a.pipilida.com +a.postrelease.com +a.predictvideo.com +a.press24.mk +a.prisacom.com +a.propos.free.fr +a.proxy4.nullrefexcep.com +a.proxy5.nullrefexcep.com +a.pub.network +a.pxi.pub +a.quora.com +a.rad.atdmt.com +a.rad.live.com +a.rad.msn.com +a.remarketstats.com +a.reqpostanza.com +a.rfihub.com +a.rfihub.com.akadns.net +a.rkdms.com +a.rmgserving.com +a.roritabo.com +a.rotibald.com +a.rvttrack.com +a.sakh.com +a.scorecardresearch.com +a.senolati.com +a.shokala.com +a.shop.com +a.shulhanafuh.com +a.softconsultgroup.com +a.spicetv.com +a.sprymetrics.com +a.ss34.on9mail.com +a.stat.xiaomi.com +a.tadd.react2media.com +a.teads.tv +a.tempurpedic.com +a.thanksearch.com +a.thirdpresence.com +a.thoughtleadr.com +a.tiscali.co.uk +a.total-media.net +a.tribalfusion.com +a.triggit.com +a.trkme.net +a.tvn.lv +a.tvpage.com +a.twiago.com +a.ucoz.net +a.ucoz.ru +a.update.51edm.net +a.utorido.com +a.uzekrs.com +a.uzotarak.com +a.visualrevenue.com +a.vonage.com +a.vserv.mobi +a.websponsors.com +a.webwise.com +a.webwise.net +a.webwise.org +a.wikia-beacon.com +a.wishabi.com +a.xanga.com +a.zeroredirect.com +a.zeroredirect1.com +a.zeroredirect2.com +a.zoot.ro +a001.bostonglobe.inscname.net +a001.weather.inscname.net +a001.zamnetwork.inscname.net +a004.tronc.inscname.net +a004.webmd.inscname.net +a007.timeanddate.inscname.net +a008.tronc.inscname.net +a01.gestionpub.com +a01.korrelate.net +a013.tronc.inscname.net +a015.tronc.inscname.net +a0152829.xsph.ru +a017.tronc.inscname.net +a02.korrelate.net +a021.ranker.inscname.net +a1.admaster.net +a1.greenadworks.net +a1.interclick.com +a1.vdna-assets.com +a1.x-traceur.com +a10.reflexcash.com +a12.x-traceur.com +a135.wftv.com +a15172379.alturo-server.de +a1589.casalemedia.com +a1653.casalemedia.com +a1664.casalemedia.com +a1681.casalemedia.com +a18.x-traceur.com +a1899.casalemedia.com +a1thumbpost.com +a2.adform.net +a2.mediagra.com +a2.websponsors.com +a20.x-traceur.com +a200.yieldoptimizer.com +a23.boston.inscname.net +a2892.casalemedia.com +a2btrans.pl +a2pub.com +a2sex.com +a2zgroup.in +a3.adzs.nl +a3.innovid.com +a3.suntimes.com +a3.websitealive.com +a3.websponsors.com +a3.x-traceur.com +a32.g.a.yimg.com +a4.adzs.nl +a4.innovid.com +a4.websponsors.com +a407.casalemedia.com +a460.cell.phone.ringtone.samsung.sms13.de +a48.info +a4p.adpartner.pro +a5.innovid.com +a5.websponsors.com +a62.info +a71.info +a74.info +a796faee-7163-4757-a34f-e5b48cada4cb.statcamp.net +a7cleaner.com +a7search.com +a85.info +a94.info +a98spolicies.com +aa-d.openx.net +aa-gb.marketgid.com +aa-gb.mgid.com +aa-nb.marketgid.com +aa.agkn.com +aa.connextra.com +aa.newsblock.dt00.net +aa.newsblock.marketgid.com +aa.oasfile.aftenposten.no +aa.online-metrix.net +aa.voice2page.com +aa08daf7e13b6345e09e92f771507fa5f4.com +aa14ab57a3339c4064bd9ae6fad7495b5f.com +aa1test.pixel.marketing +aa625d84f1587749c1ab011d6f269f7d64.com +aa81bf391151884adfa3dd677e41f94be1.com +aa9bd78f328a6a41279d0fad0a88df1901.com +aa9d046aab36af4ff182f097f840430d51.com +aaa419.com +aaannuairex.com +aaaurgentcare.net +aab94f698f36684c5a852a2ef272e031bb.com +aac500b7a15b2646968f6bd8c6305869d7.com +aac52006ec82a24e08b665f4db2b5013f7.com +aad1f4acb0a373420d9b0c4202d38d94fa.com +aaddzz.com +aadroid.net +aads.treehugger.com +aadultwork.com +aaflt.org +aagoop7.top +aalbbh84.info +aalbc.advertserve.com +aalures.com +aams1.aim4media.com +aan.amazon.com +aanqylta.com +aapz.com +aarbur.com +aaronabel.com +aaronautosandtrucks.com +aarp.122.2o7.net +aarpadvantages.co +aarsneuken.nu +aas-bd.org +aasexo.com +aashima.goyal.com.au +aashyamayro.com +aaskypepool.foresee.com +aasoldes.fr +aata.ero-advertising.com +aaukqiooaseseuke.org +aax-cpm.amazon-adsystem.com +aax-eu-rtb-adx.amazon-adsystem.com +aax-eu-rtb.amazon-adsystem.com +aax-eu-test.amazon-adsystem.com +aax-eu-test1.amazon-adsystem.com +aax-eu-test2.amazon-adsystem.com +aax-eu-test3.amazon-adsystem.com +aax-eu.amazon-adsystem.com +aax-fe-pek.amazon-adsystem.com +aax-fe-sin-rtb-adx.amazon-adsystem.com +aax-fe-sin-rtb.amazon-adsystem.com +aax-fe-sin.amazon-adsystem.com +aax-fe.amazon-adsystem.com +aax-opf-us-east.amazon-adsystem.com +aax-us-east-rtb-adx.amazon-adsystem.com +aax-us-east-rtb.amazon-adsystem.com +aax-us-east-test.amazon-adsystem.com +aax-us-east-test1.amazon-adsystem.com +aax-us-east-test2.amazon-adsystem.com +aax-us-east-test3.amazon-adsystem.com +aax-us-east-test4.amazon-adsystem.com +aax-us-east-test5.amazon-adsystem.com +aax-us-east-test6.amazon-adsystem.com +aax-us-east.amazon-adsystem.com +aax-us-pdx-rtb-adx.amazon-adsystem.com +aax-us-pdx-rtb.amazon-adsystem.com +aax-us-pdx.amazon-adsystem.com +aax-us-west.amazon-adsystem.com +aax-vx-eu-dub.amazon-adsystem.com +aax-vx-eu-eu-west-1.amazon-adsystem.com +aax-vx-fe-pdx.amazon-adsystem.com +aax-vx-fe-us-west-2.amazon-adsystem.com +aax-vx-us-iad.amazon-adsystem.com +aax-vx-us-pdx.amazon-adsystem.com +aax-vx-us-us-east-1.amazon-adsystem.com +aax-vx-us-us-west-2.amazon-adsystem.com +aax.amazon-adsystem.amazon.com +aax.amazon-adsystem.com +aax.amazon.amazon-adsystem.com +ab-gb.mgid.com +ab-nb.marketgid.com +ab.5.p2l.info +ab.adpro.com.ua +ab.adrecreate.com +ab.advertiserurl.com +ab.goodsblock.dt07.net +ab.teenx.free.fr +ab.tune.com +ab.usageload32.com +ab.vendemore.com +ab10.mktossl.com +ab159015.adbutler-zilon.com +ab163949.adbutler-kaon.com +ab199.de +ab44aa.r.axf8.net +ab4hr.com +ab913aa797e78b3.com +aba.ae +abacho.net +abackchain.com +abacusfinance.co.uk +abacusnet.info +abacuspresents.com +abadass.com +abahah.com +abaletaboo.com +abandonedaction.com +abandonedclover.com +abandonment.saas.seewhy.com +abashedangle.com +abbanreddy.com +abbeyxxx.com +abbyssh.freestats.com +abbywintersnudes.thumblogger.com +abc-ads.com +abc-staden.nu +abc.atom.adjust.com +abc.cosiloon.com +abc.doublegear.com +abc.pema.cl +abc.truconversion.com +abcdespanol.com +abclauncher.com +abclipper-ui1.alphonso.tv +abclnks.com +abcnews.dev.extremereach.com +abcnews.footprint.net +abcno.nuggad.net +abcotv.hb.omtrdc.net +abcsex.dk +abcsexy.free.fr +abcstats.com +abctoppictures.net +abd.cosiloon.com +abdicted.com +abdl-adult-baby-phone-sex.info +abdlphone.com +abeggs.com +abercrombiehollister.net +abercrombieport.com +abetran.com +abetterinternet.com +abetting.net +able2know.us.intellitxt.com +ablefull.com +ablen01.tk +ablen02.tk +ablen03.tk +ablen04.tk +ablen05.tk +ablen06.tk +ablen07.tk +ablen08.tk +ablen09.tk +ablen10.tk +ablen11.tk +ablen12.tk +abm-certification.demandbase.com +abmodellbau.de +abo.prismamediadigital.com +aboardlevel.com +abogadodejacksonville.com +abonne100.free.fr +aboomnsaoq.top +abosexcams.de +abourselfi.com +aboutads.quantcast.com +aboutharrypotter.fasthost.tv +abouthomesdecorating.com +aboutproperty.co.uk +aboutwebservices.com +above.com +above.e-rezerwacje24.pl +abp.mxptint.net +abp.smartadcheck.de +abrahamschildren.com +abrogatesdv.info +abrtp1-cdn.marketo.com +abruptroad.com +abruzzoinitaly.co.uk +abs.beweb.com +abs.proxistore.com +abscbn.spinbox.net +abseckw.adtlgc.com +absentstream.com +absinths.com +absolute-live.com +absoluteclickscom.com +absorbingband.com +absum.ru +absurdity.flarelight.com +absurdwater.com +abtest.activision.swrve.com +abtest.mistat.intl.xiaomi.com +abtest.mistat.xiaomi.com +abtest.swrve.com +abtesting.intuit.com +abtracker.adultbouncer.com +abz.com +ac-feedback.com +ac-gb.mgid.com +ac-nb.marketgid.com +ac-transfer.com +ac.ajur.info +ac.atpanel.com +ac.eu.angsrvr.com +ac.mmstat.com +ac.realvu.net +ac.rnm.ca +ac.tynt.com +ac.ybinst0.ec.yimg.com +ac.ybinst1.ec.yimg.com +ac.ybinst2.ec.yimg.com +ac.ybinst3.ec.yimg.com +ac.ybinst4.ec.yimg.com +ac.ybinst5.ec.yimg.com +ac.ybinst6.ec.yimg.com +ac.ybinst7.ec.yimg.com +ac.ybinst8.ec.yimg.com +ac.ybinst9.ec.yimg.com +ac9d98.r.axf8.net +academy.appboy.com +academy.dynamicyield.com +academy.tune.com +acads.net +acaiberryextreme.pl +acanales.sc.omtrdc.net +acbp0020171456.page.tl +accel-api.online-metrix.net +accel-fp.online-metrix.net +accelerate.criteo.com +acceleration.mparticle.com +accelerator.arsdev.net +acceptance.bidswitch.net +acces.streaming-direct.co +access-prod.apis.anvato.net +access.adtouchlabs.com +access.adx1.com +access.eloqua.com +access.truconversion.com +accessful.info +accessiblemetrics.com +accessrequest.taboola.com +accidentadvicehelpline.co.uk +acckalaharinet.112.2o7.net +account.fyber.com +account.maximus.co +account.paypal-inc.tribesiren.com +accountlock-demo.iovation.com +accountmanager.adviserplus.com +accountprotection.xyz +accounts.appboy.com +accounts.backtrace.io +accounts.doubleclick.net +accounts.fgl.com +accounts.in.backtrace.io +accounts.inlocomedia.com +accounts.livefyre.com +accounts.petametrics.com +accounts.qa-ext.livefyre.com +accounts.t402.livefyre.com +accur.biz +accuweather.us.intellitxt.com +acd.theappgrader.com +acdn.adnxs.com +ace-lb.advertising.com +ace-tag.advertising.com +ace.adoftheyear.com +ace.curalate.com +ace.jamba.pl +ace.jamster.pl +acenar.com +acervo.info +aceshowbiz.us.intellitxt.com +acetical.com +acezsoftware.com +acglgoa.com +acheterviagrafr24.com +achetezfacile.com +achmedia.com +achren.org +achterin.nl +aciklise.web.tr +acim.moqhixoz.cn +acimo.com +aciphex.about-tabs.com +ackjeeves.com +aclasscelebs.us.intellitxt.com +aclick.adhoc2.net +aclickads.com +aclu.tt.omtrdc.net +acmedia.org +acmmarketingdigital.com.br +acmsa.com.ar +acneforums.com +acnenomor.com +acompanhantesbrasil.com.br +acompanhantesdeportugal.com +acompanhantesportoalegre.net +acookie.alimama.com +acool.csheaven.com +acornpointlodge.com +acortarurl.es +acount-cheks0912.suport-acount-confrim12.gq +acoustoopticmodulator.com +acp.fyber.com +acpbdf.com.br +acpmagazines.112.2o7.net +acproyectos.com +acquisition-tracker.wix.com +acr10.alphonso.tv +acr11.alphonso.tv +acr12.alphonso.tv +acr13.alphonso.tv +acr14.alphonso.tv +acr15.alphonso.tv +acr16.alphonso.tv +acr17.alphonso.tv +acr18.alphonso.tv +acr19.alphonso.tv +acr2.alphonso.tv +acr20.alphonso.tv +acr21.alphonso.tv +acr22.alphonso.tv +acr23.alphonso.tv +acr25.alphonso.tv +acr26.alphonso.tv +acr27.alphonso.tv +acr28.alphonso.tv +acr29.alphonso.tv +acr3.alphonso.tv +acr30.alphonso.tv +acr31.alphonso.tv +acr32.alphonso.tv +acr33.alphonso.tv +acr34.alphonso.tv +acr35.alphonso.tv +acr36.alphonso.tv +acr37.alphonso.tv +acr39.alphonso.tv +acr4.alphonso.tv +acr40.alphonso.tv +acr41.alphonso.tv +acr42.alphonso.tv +acr43.alphonso.tv +acr44.alphonso.tv +acr45.alphonso.tv +acr46.alphonso.tv +acr47.alphonso.tv +acr49.alphonso.tv +acr5.alphonso.tv +acr51.alphonso.tv +acr52.alphonso.tv +acr53.alphonso.tv +acr54.alphonso.tv +acr55.alphonso.tv +acr56.alphonso.tv +acr58.alphonso.tv +acr59.alphonso.tv +acr6.alphonso.tv +acr7.alphonso.tv +acr8.alphonso.tv +acr9.alphonso.tv +acrabakasaka.com +acrdb.alphonso.tv +acrh.be +acridtwist.com +acrowiswhite.com +acs.56.com +acs.agent.56.com +acs.agent.v-56.com +acspaces.ero-advertising.com +actest.campaign.adobe.com +actforvictory.112.2o7.net +actingonacts.com +action-dvd.net +action.dev.khingtracking.com +action.ientry.net +action.khingtracking.com +action.mathtag.com +action.media6degrees.com +action.metaffiliation.com +actiondesk.com +actionflash.com +actionmobilemarine.net +actionnooz.com +actionscript.us.intellitxt.com +actionsplash.com +activation.adobedtm.com +active.cache.el-mundo.net +active.hit.stat24.com +activeby.hit.gemius.pl +activecampaign.dreamhosters.com +activeideas.net +activepr.ru +activewatch.ro +activewin.us.intellitxt.com +activex.matcash.com +activity.serving-sys.com +actonel.about-tabs.com +actontv.122.2o7.net +actos.about-tabs.com +actrck.com +actricesmexicanasdesnudas.com +actricespornofamosas.com +actualdeals.com +actualite-de-stars.fr.intellitxt.com +actuallysheep.com +actuallysnake.com +actulite.com +actvtrack.com +acuityads.com +acuityplatform.com +acunt-fanpage00.plis-suport2-center.ga +acvs.mediaonenetwork.net +acvsrv.mediaonenetwork.net +acyclovir.1.p2l.info +ad-411.com +ad-ace.doubleclick.net +ad-apac.doubleclick.net +ad-audit.tubemogul.com +ad-balancer.at +ad-balancer.net +ad-beast.com +ad-cdn.technoratimedia.com +ad-center.com +ad-clicks.com +ad-dc2.adtech.de +ad-delivery.net +ad-emea.doubleclick.net +ad-feeds.com +ad-flow.com +ad-g.doubleclick.net +ad-gb.mgid.com +ad-gbn.com +ad-hoc-news.de.intellitxt.com +ad-indicator.com +ad-logics.com +ad-media.xe.gr +ad-mediation.tuanguwen.com +ad-miner.com +ad-noise.net +ad-pay.de +ad-player.spotxchange.com +ad-plus.cn +ad-rotator.com +ad-score.com +ad-server.co.za +ad-server.gulasidorna.se +ad-serverparc.nl +ad-servicestats.net +ad-souk.com +ad-space.net +ad-sponsor.com +ad-srv.net +ad-tech.com +ad-test.adtechus.com +ad-u.com +ad-uk.tiscali.com +ad-up.com +ad-us-ec.adtechus.com +ad-us-wc.adtechus.com +ad-vice.biz +ad-void.com +ad-yt-bfp.doubleclick.net +ad.100.tbn.ru +ad.103092804.com +ad.23blogs.com +ad.360in.com +ad.360yield.com +ad.3au.doubleclick.net +ad.3dnews.ru +ad.71i.de +ad.9tv.co.il +ad.a-ads.com +ad.a8.net +ad.abcnews.com +ad.abctv.com +ad.aboutwebservices.com +ad.abum.com +ad.accessmediaproductions.com +ad.activesolutions.cz +ad.ad-arata.com +ad.ad-srv.net +ad.ad-stir.com +ad.ad24.ru +ad.adapter.kaffnet.com +ad.adbull.com +ad.adc-serv.net +ad.adfunky.com +ad.adip.ly +ad.adition.de +ad.adition.net +ad.adlantis.jp +ad.adlegend.com +ad.admarketplace.net +ad.admitad.com +ad.adnet.biz +ad.adnet.de +ad.adnetwork.com.br +ad.adnetwork.net +ad.adnow.com +ad.adocean.pl +ad.adorika.com +ad.adperium.com +ad.adriver.ru +ad.adserve.com +ad.adserver01.de +ad.adserverplus.com +ad.adsmart.net +ad.adsrvr.org +ad.adtegrity.net +ad.adtoma.com +ad.aduserver.com +ad.adver.com.tw +ad.adverticum.net +ad.advertstream.com +ad.adview.pl +ad.adworx.at +ad.adxcore.com +ad.ae.doubleclick.net +ad.afilo.pl +ad.aftenposten.no +ad.aftonbladet.se +ad.afy11.net +ad.agava.tbn.ru +ad.agilemedia.jp +ad.agkn.com +ad.airad.com +ad.ajanshaber.com +ad.allstar.cz +ad.allyes.cn +ad.altervista.org +ad.amgdgt.com +ad.amiadogroup.com +ad.anuntis.com +ad.api.kaffnet.com +ad.apsalar.com +ad.aquamediadirect.com +ad.ar.doubleclick.net +ad.asntown.net +ad.asv.de +ad.at.doubleclick.net +ad.atdmt.com +ad.au.doubleclick.net +ad.auditude.com +ad.axyzconductor.jp +ad.bannerbank.ru +ad.bannerconnect.net +ad.bannerhost.ru +ad.batanga.com +ad.batanga.net +ad.bauerverlag.de +ad.be.doubleclick.net +ad.beepworld.de +ad.beritasatumedia.com +ad.bg.doubleclick.net +ad.bizo.com +ad.bnmla.com +ad.bondage.com +ad.br.doubleclick.net +ad.brainbuzz.com +ad.brainer.jp +ad.broadstreetads.com +ad.bubblestat.com +ad.ca.doubleclick.net +ad.caradisiac-publicite.com +ad.caradisiac.com +ad.cashdorado.de +ad.cc.webmd.com +ad.cctv.com +ad.centrum.cz +ad.cgi.cz +ad.ch.doubleclick.net +ad.choiceradio.com +ad.cibleclick.com +ad.cl.doubleclick.net +ad.click.kaffnet.com +ad.clickdistrict.com +ad.clickotmedia.com +ad.clix.pt +ad.cmfu.com +ad.cn.doubleclick.net +ad.coas2.co.kr +ad.cooks.com +ad.cpe.dotomi.com +ad.crwdcntrl.net +ad.db3nf.com +ad.dc2.adtech.de +ad.de.doubleclick.net +ad.dedicatedmedia.com +ad.depositfiles.com +ad.designtaxi.com +ad.deviantart.com +ad.dic.nicovideo.jp +ad.digitallook.com +ad.digitimes.com.tw +ad.directanetworks.com +ad.directmirror.com +ad.directrev.com +ad.dk.doubleclick.net +ad.doctissimo.fr +ad.doganburda.com +ad.domainfactory.de +ad.donanimhaber.com +ad.doubleclick.net +ad.download.cnet.com +ad.download.net +ad.downloadyee.com +ad.duga.jp +ad.dumedia.ru +ad.e-kolay.net +ad.e-sport.com +ad.eanalyzer.de +ad.econet.hu +ad.ecplaza.net +ad.egloos.com +ad.ekonomikticaret.com +ad.epochtimes.com +ad.eporner.com +ad.es.doubleclick.net +ad.espn.starwave.com +ad.eurosport.com +ad.favod.net +ad.fi.doubleclick.net +ad.filmweb.pl +ad.firstadsolution.com +ad.floq.jp +ad.flurry.com +ad.flux.com +ad.fnnews.com +ad.fo.net +ad.foodlion.com +ad.fout.jp +ad.foxnetworks.com +ad.fr.doubleclick.net +ad.freecity.de +ad.funpic.de +ad.g-content.bid +ad.garantiarkadas.com +ad.gate24.ch +ad.gazeta.pl +ad.getfond.info +ad.ghfusion.com +ad.globe7.com +ad.glossymedia.pl +ad.go.com +ad.goo.ne.jp +ad.gr.doubleclick.net +ad.gra.pl +ad.grafika.cz +ad.greenmarquee.com +ad.groupon.be +ad.groupon.co.uk +ad.groupon.com +ad.groupon.de +ad.groupon.fr +ad.groupon.net +ad.groupon.nl +ad.groupon.pl +ad.hankooki.com +ad.harrenmedianetwork.com +ad.hbv.de +ad.hi5.com +ad.himediadx.com +ad.hirekmedia.hu +ad.hit.gemius.pl +ad.hk.doubleclick.net +ad.hodomobile.com +ad.horvitznewspapers.net +ad.host.bannerflow.com +ad.hosting.pl +ad.howstuffworks.com +ad.hr.doubleclick.net +ad.httpool.com +ad.hu.doubleclick.net +ad.hyena.cz +ad.icasthq.com +ad.iconadserver.com +ad.ie.doubleclick.net +ad.iinfo.cz +ad.ilove.ch +ad.iloveinterracial.com +ad.imad.co.kr +ad.imediaaudiences.com +ad.impresionesweb.com +ad.impressbm.co.jp +ad.in.doubleclick.net +ad.indomp3z.us +ad.infoseek.com +ad.inmatads.info +ad.insightexpress.com +ad.insightexpressai.com +ad.internetradioinc.com +ad.investopedia.com +ad.investor.bg +ad.ipredictive.com +ad.ir.ru +ad.isohunt.com +ad.it.doubleclick.net +ad.iwin.com +ad.jamba.de +ad.jamba.it +ad.jamba.net +ad.jamster.ca +ad.jamster.co.uk +ad.jamster.com +ad.janalta.com +ad.jetsoftware.com +ad.joinaxxess.com +ad.jokeroo.com +ad.jp.ap.valu.com +ad.jp.ap.valuecommerce.com +ad.jp.doubleclick.net +ad.jsecoin.com +ad.jugem.jp +ad.jumbaexchange.com +ad.kat.ph +ad.kataweb.it +ad.kau.li +ad.keenspace.com +ad.koreadaily.com +ad.kr.doubleclick.net +ad.krutilka.ru +ad.land.to +ad.leadbolt.net +ad.leadboltads.net +ad.leadboltapps.net +ad.leadboltmobile.net +ad.leadcrunch.com +ad.lgappstv.com +ad.libgel.net +ad.lijit.com +ad.linkexchange.com +ad.linkstorms.com +ad.linksynergy.com +ad.lista.cz +ad.liveinternet.ru +ad.livere.co.kr +ad.lkqd.net +ad.looktraffic.com +ad.lupa.cz +ad.lyricswire.com +ad.m-adx.com +ad.m5prod.net +ad.madvertise.de +ad.mail.ru +ad.mainichi.jp +ad.maist.jp +ad.mangareader.net +ad.mastermedia.ru +ad.media-servers.net +ad.mediabong.net +ad.mediaprostor.cz +ad.mediastorm.hu +ad.mgd.de +ad.mo.doubleclick.net +ad.monetate.net +ad.moreto.net +ad.moscowtimes.ru +ad.musicmatch.com +ad.my.doubleclick.net +ad.mygamesol.com +ad.mylook.ee +ad.n2434.doubleclick.net +ad.nachtagenten.de +ad.nate.com +ad.naver.com +ad.ne.com +ad.net +ad.netcommunities.com +ad.netgoo.com +ad.netseer.com +ad.network60.com +ad.nicovideo.jp +ad.nl.doubleclick.net +ad.no.doubleclick.net +ad.nozonedata.com +ad.nttnavi.co.jp +ad.ntvmsnbc.com +ad.nwt.cz +ad.nz.doubleclick.net +ad.ohmynews.com +ad.orbitel.bg +ad.oret.jp +ad.ourgame.com +ad.oyy.ru +ad.pandora.tv +ad.parom.hu +ad.parrot.mable-inc.com +ad.partis.si +ad.payclick.it +ad.period-calendar.com +ad.petel.bg +ad.pgwticketshop.nl +ad.ph-prt.tbn.ru +ad.pickple.net +ad.pl.doubleclick.net +ad.policeone.com +ad.pravda.ru +ad.preferances.com +ad.preferences.com +ad.premiumonlinemedia.com +ad.prismamediadigital.com +ad.pro-advertising.com +ad.profiwin.de +ad.propellerads.com +ad.proxy.sh +ad.prv.pl +ad.pt.doubleclick.net +ad.punto-informatico.it +ad.qq.com +ad.qwapi.com +ad.qyer.com +ad.rambler.ru +ad.reachppc.com +ad.realist.gen.tr +ad.realmcdn.net +ad.realmedia.co.kr +ad.reduxmediia.com +ad.reklamport.com +ad.repubblica.it +ad.response.jp +ad.retargeter.com +ad.reunion.com +ad.ro.doubleclick.net +ad.rs.doubleclick.net +ad.rtl.hr +ad.ru.doubleclick.net +ad.sbb.bg +ad.se.doubleclick.net +ad.search.ch +ad.searchhound.com +ad.searchina.ne.jp +ad.sensismediasmart.com +ad.sensismediasmart.com.au +ad.sexcount.de +ad.seznam.cz +ad.sg.doubleclick.net +ad.sgdgjarfpp123.com +ad.sharethis.com +ad.showbizz.net +ad.si.doubleclick.net +ad.simgames.net +ad.sitelement.sk +ad.sitemaji.com +ad.slashgear.com +ad.slutload.com +ad.sma.punto.net +ad.smaato.net +ad.smaclick.com +ad.smartclip.net +ad.smni.com +ad.spielothek.so +ad.sponsoreo.com +ad.stat.4u.pl +ad.suprnova.org +ad.sxp.smartclip.net +ad.targeting.snapads.com +ad.tbn.ru +ad.technoramedia.com +ad.technoratimedia.com +ad.terra.com.mx +ad.terra.doubleclick.net +ad.text.tbn.ru +ad.tgdaily.com +ad.th.doubleclick.net +ad.thehill.com +ad.thesimplecomplex.bg +ad.thetyee.ca +ad.thewheelof.com +ad.thisav.com +ad.thoughtsondance.info +ad.tiscali.com +ad.tom.com +ad.tomshardware.com +ad.touchnclick.co.kr +ad.track.us.org +ad.trafficmp.com +ad.trafficshop.com +ad.traffique.net +ad.traffmonster.info +ad.trident.net +ad.triplemind.com +ad.turn.com +ad.tv2.no +ad.tw.doubleclick.net +ad.twitchguru.com +ad.u.nuggad.net +ad.ubnm.co.kr +ad.uk.doubleclick.net +ad.uk.tangozebra.com +ad.us.doubleclick.net +ad.usatoday.com +ad.userporn.com +ad.valuecalling.com +ad.ve.doubleclick.net +ad.velmedia.net +ad.vidaroo.com +ad.vippers.jp +ad.virtual-nights.com +ad.vurts.com +ad.wanderlist.com +ad.watch.impress.co.jp +ad.wavu.hu +ad.way.cz +ad.weatherbug.com +ad.webisleri.com +ad.webprovider.com +ad.weplayer.cc +ad.where.com +ad.wingads.com +ad.wiredvision.jp +ad.wretch.cc +ad.wsod.com +ad.wynk.in +ad.wz.cz +ad.xe.gr +ad.xrea.com +ad.xtendmedia.com +ad.yadro.ru +ad.yemeksepeti.com +ad.yieldlab.net +ad.yieldmanager.com +ad.yieldmanager.net +ad.yonhapnews.co.kr +ad.yourmedia.com +ad.za.doubleclick.net +ad.zaman.com +ad.zaman.com.tr +ad.zanox.com +ad.zodera.hu +ad.zompmedia.com +ad0.adspaces.ero-advertising.com +ad0.api.ero-advertising.com +ad0.banners.ero-advertising.com +ad0.bigmir.net +ad0.data2.ero-advertising.com +ad0.haynet.com +ad001.ru +ad01.adonspot.com +ad01.advertise.com +ad01.focalink.com +ad01.investor.bg +ad01.mediacorpsingapore.com +ad01.tmgrup.com.tr +ad02.focalink.com +ad03.doubleadx.com +ad03.focalink.com +ad04.focalink.com +ad05.focalink.com +ad06.focalink.com +ad07.focalink.com +ad08.focalink.com +ad09.focalink.com +ad1.adfarm1.adition.com +ad1.adfun.ru +ad1.adinfuse.com +ad1.ads.ero-advertising.com +ad1.adspaces.ero-advertising.com +ad1.adtitan.net +ad1.api.ero-advertising.com +ad1.bannerbank.ru +ad1.banners.ero-advertising.com +ad1.bigmir.net +ad1.checkm8.com +ad1.clickhype.com +ad1.doublepimp.com +ad1.emediate.dk +ad1.emediate.se +ad1.emule-project.org +ad1.ero-advertising.com +ad1.gamezone.com +ad1.hotel.com +ad1.kde.cz +ad1.lbn.ru +ad1.nownews.com +ad1.pamedia.com.au +ad1.peel.com +ad1.popcap.com +ad1.speedbit.com +ad1.yomiuri.co.jp +ad1.yourmedia.com +ad10.bannerbank.ru +ad10.checkm8.com +ad10.focalink.com +ad10.play3.de +ad10.speedbit.com +ad101com.adbureau.net +ad10digital.checkm8.com +ad11.adfarm1.adition.com +ad11.bannerbank.ru +ad11.checkm8.com +ad11.focalink.com +ad11digital.checkm8.com +ad12.bannerbank.ru +ad12.checkm8.com +ad12.focalink.com +ad12digital.checkm8.com +ad13.checkm8.com +ad13.focalink.com +ad130m.adpdx.com +ad131m.adk2.co +ad132m.adk2.co +ad132m.adpdx.com +ad13digital.checkm8.com +ad14.checkm8.com +ad14.focalink.com +ad14digital.checkm8.com +ad15.checkm8.com +ad15.focalink.com +ad15digital.checkm8.com +ad16.checkm8.com +ad16.focalink.com +ad16digital.checkm8.com +ad17.checkm8.com +ad17.focalink.com +ad17digital.checkm8.com +ad18.checkm8.com +ad18.focalink.com +ad18digital.checkm8.com +ad19.checkm8.com +ad19.focalink.com +ad19digital.checkm8.com +ad1digital.checkm8.com +ad2.adecn.com +ad2.adfarm1.adition.com +ad2.adinfuse.com +ad2.adnetwork.net +ad2.adspaces.ero-advertising.com +ad2.api.ero-advertising.com +ad2.bal.dotandad.com +ad2.bannerbank.ru +ad2.bannerhost.ru +ad2.banners.ero-advertising.com +ad2.bbmedia.cz +ad2.checkm8.com +ad2.cooks.com +ad2.doubleclick.net +ad2.doublepimp.com +ad2.emediate.se +ad2.ero-advertising.com +ad2.firehousezone.com +ad2.gammae.com +ad2.hotel.com +ad2.hotels.com +ad2.iinfo.cz +ad2.ip.ro +ad2.ireklama.cz +ad2.lbn.ru +ad2.linxcz.cz +ad2.lupa.cz +ad2.monetate.net +ad2.nationalreview.com +ad2.neodatagroup.com +ad2.pamedia.com +ad2.parom.hu +ad2.peel.com +ad2.pl +ad2.pl.mediainter.net +ad2.rambler.ru +ad2.sbisec.co.jp +ad2.smni.com +ad2.speedbit.com +ad2.thumbs.ero-advertising.com +ad2.tr.mediainter.net +ad2.turn.com +ad2.xrea.com +ad2.yam.com +ad2.zapmedya.com +ad2.zophar.net +ad20.checkm8.com +ad20.net +ad20digital.checkm8.com +ad21.checkm8.com +ad21digital.checkm8.com +ad22.checkm8.com +ad22digital.checkm8.com +ad23.checkm8.com +ad234.prbn.ru +ad23digital.checkm8.com +ad24.checkm8.com +ad24digital.checkm8.com +ad25.checkm8.com +ad25digital.checkm8.com +ad26.checkm8.com +ad26digital.checkm8.com +ad27.checkm8.com +ad27digital.checkm8.com +ad28.checkm8.com +ad28digital.checkm8.com +ad29.checkm8.com +ad29digital.checkm8.com +ad2digital.checkm8.com +ad2flash.com +ad2games.com +ad2play.ftv-publicite.fr +ad3.adfarm1.adition.com +ad3.adspaces.ero-advertising.com +ad3.api.ero-advertising.com +ad3.bannerbank.ru +ad3.banners.ero-advertising.com +ad3.bb.ru +ad3.checkm8.com +ad3.depositfiles.com +ad3.eu +ad3.fpa.ero-advertising.com +ad3.hornymatches.com +ad3.iinfo.cz +ad3.l3go.com +ad3.lbn.ru +ad3.linkbucks.com +ad3.nationalreview.com +ad3.pamedia.com.au +ad3.rambler.ru +ad3.speedbit.com +ad3.xrea.com +ad30.checkm8.com +ad30digital.checkm8.com +ad31.checkm8.com +ad31digital.checkm8.com +ad32.checkm8.com +ad32digital.checkm8.com +ad33.checkm8.com +ad33digital.checkm8.com +ad34.checkm8.com +ad34digital.checkm8.com +ad35.checkm8.com +ad35digital.checkm8.com +ad36.checkm8.com +ad36digital.checkm8.com +ad37.checkm8.com +ad37digital.checkm8.com +ad38.checkm8.com +ad38digital.checkm8.com +ad39.checkm8.com +ad39digital.checkm8.com +ad3digital.checkm8.com +ad4.adfarm1.adition.com +ad4.adspaces.ero-advertising.com +ad4.api.ero-advertising.com +ad4.bannerbank.ru +ad4.banners.ero-advertising.com +ad4.bigmir.net +ad4.checkm8.com +ad4.gueb.com +ad4.layerads.ero-advertising.com +ad4.lbn.ru +ad4.liverail.com +ad4.speedbit.com +ad4.thumbs.ero-advertising.com +ad40.checkm8.com +ad40digital.checkm8.com +ad41.atlas.cz +ad41.checkm8.com +ad41digital.checkm8.com +ad42.checkm8.com +ad42digital.checkm8.com +ad43.checkm8.com +ad43digital.checkm8.com +ad44.checkm8.com +ad44digital.checkm8.com +ad45.checkm8.com +ad45digital.checkm8.com +ad46.checkm8.com +ad46digital.checkm8.com +ad47.checkm8.com +ad47digital.checkm8.com +ad48.checkm8.com +ad48digital.checkm8.com +ad49.checkm8.com +ad49digital.checkm8.com +ad4digital.checkm8.com +ad4game.com +ad4mat.com +ad4mat.de +ad4mat.net +ad4partners.com +ad5.adspaces.ero-advertising.com +ad5.bannerbank.ru +ad5.banners.ero-advertising.com +ad5.bigmir.net +ad5.checkm8.com +ad5.fpa.ero-advertising.com +ad5.lbn.ru +ad5.netshelter.net +ad5.speedbit.com +ad50.checkm8.com +ad50digital.checkm8.com +ad5digital.checkm8.com +ad6.adspaces.ero-advertising.com +ad6.bannerbank.ru +ad6.banners.ero-advertising.com +ad6.bigmir.net +ad6.checkm8.com +ad6.horvitznewspapers.net +ad6.liverail.com +ad6.speedbit.com +ad6digital.checkm8.com +ad6media.fr +ad7.adspaces.ero-advertising.com +ad7.api.ero-advertising.com +ad7.bannerbank.ru +ad7.banners.ero-advertising.com +ad7.bigmir.net +ad7.checkm8.com +ad7.gueb.com +ad7.literotica.com +ad7.speedbit.com +ad7.thumbs.ero-advertising.com +ad7digital.checkm8.com +ad8.adfarm1.adition.com +ad8.adspaces.ero-advertising.com +ad8.api.ero-advertising.com +ad8.bannerbank.ru +ad8.banners.ero-advertising.com +ad8.checkm8.com +ad8.speedbit.com +ad8digital.checkm8.com +ad9.bannerbank.ru +ad9.checkm8.com +ad9.speedbit.com +ad9digital.checkm8.com +ada.zemanta.com +adaction.de +adactiongapl.hit.gemius.pl +adactive-ads.aimatch.com +adacus-cdn-staging.placelocal.com +adacus-cdn.placelocal.com +adadvisor.net +adafi.hit.gemius.pl +adagiobanner.s3.amazonaws.com +adagiof3.repubblica.it +adamsfilms.com +adamsmarkhotels.com +adan.xtendmedia.com +adaos-ads.net +adap.tv +adapd.com +adapi.ragapa.com +adapi.sizmek.com +adapi.uat.sizmek.com +adapj.rtb.adx1.com +adapt.tv +adaptv.advertising.com +adaptv.pixel.invitemedia.com +adashx.ut.taobao.com +adashx4ae.ut.taobao.com +adasiaholdings.com +adb.fling.com +adb.wp.pl +adbanner.adxcore.com +adbard.net +adbcache.brandreachsys.com +adbers.com +adbetnet.advertserve.com +adbg.hit.gemius.pl +adbiq.com +adbit.co +adblade.com +adblock.fr +adblockanalytics.com +adblockdetect.xyz +adblockerkillswebsites.pw +adbnr.ru +adboost.de.vu +adboost.finalid.com +adboost.net +adbooth.adk2.co +adbooth.net +adbot.com +adbot.theonion.com +adbox.hu +adbox.inbox-online.com +adbrite.112.2o7.net +adbrite.122.2o7.net +adbrite.com +adbrn.com +adbroker.de +adbtc.top +adbucks.brandreachsys.com +adbuilder.cloud.kargo.com +adbuka.com +adbull.com +adbunker.com +adbutler.com +adbuyer.com +adbuyer3.lycos.com +adc-serv.net +adc.brandreachsys.com +adc2.adcentriconline.com +adc3-assets-enc-cdn.adcolony.com +adc3-assets.adcolony.com +adc3-launch.adcolony.com +adcache.aftenposten.no +adcache.intentmedia.net +adcache.nymag.com +adcanadian.com +adcarem.co +adcash.com +adcast.deviantart.com +adcdn.33universal.com +adcell.de +adcenter.net +adcentre.it-advanced.com +adcentric.randomseed.com +adcentriconline.com +adcept.net +adchimp.com +adclick.com +adclick.g.doubleclick.net +adclick.hit.gemius.pl +adclicks.io +adclickservice.com +adclickthru.net +adclient-af.lp.uol.com.br +adclient.163.com +adclient.rottentomatoes.com +adclient.uimserv.net +adclient1.tucows.com +adcloud-dp.nuggad.net +adcloud.extremereach.com +adcmtd.mac-torrent-download.net +adcode.adengage.com +adcode.rontar.com +adcodes.aim4media.com +adcolony.com +adcom.akadns.net +adcomplete.com +adconion.com +adconscious.com +adcontent.gamespy.com +adcontent.reedbusiness.com +adcontent.saymedia.com +adcontent.videoegg.com +adcontent2.allaccess.com.ph +adcontrol.tudou.com +adcontroller.unicast.com +adcore.ru +adcount.ohmynews.com +adcounter.globeandmail.com +adcounter.theglobeandmail.com +adcreative.naver.com +adcreative.tribuneinteractive.com +adcrowd.com +adcycle.com +adcycle.footymad.net +adcycle.icpeurope.net +adcz.hit.gemius.pl +add.f5haber.com +add.newmedia.cz +add1.aniview.com +add2.aniview.com +addelivery.thestreet.com +addenly.info +adderall.ourtablets.com +adderallxr.freespaces.com +addesk.advertising.com +addevent.com +addfreestats.com +addirector.vindicosuite.com +additcinggames.com +addjump.com +addme.com +adds.misiamoiatdom.com +adds.trafflow.com +adds1.trafflow.com +addserver.mtv.com.tr +addshoppers.com +addshoppers.t.domdex.com +addthis.com +addthiscdn.com +addtoany.com +ade.clmbtech.com +ade.googlesyndication.com +ade.wooboo.com.cn +adecn-w.atdmt.com +adecn.com +adedy.com +adee.hit.gemius.pl +adelogs.adobe.com +ademails.com +adengage.com +adengine.rt.ru +adeplast.theappgrader.com +adeventtracker.spotify.com +adexc.net +adexchange.analyticson.com +adexchange.guru +adexchangedirect.com +adexchangegate.com +adexchangeprediction.com +adexchangetracker.com +adexcite.com +adexpansion.com +adexpose.com +adexprt.com +adexprt.me +adexprts.com +adext.inkclub.com +adextensioncontrol.tudou.com +adf.ero-advertising.com +adf.ly +adfactor.nl +adfarm.mediaplex.com +adfarm.mserve.ca +adfarm1.adition.com +adfiles.o2.pl.sds.o2.pl +adfiles.pitchforkmedia.com +adflash.affairsclub.com +adflight.com +adfoc.us +adfocus.ru +adforati.com +adforce.ads.imgis.com +adforce.adtech.de +adforce.adtech.fr +adforce.adtech.us +adforce.com +adforce.imgis.com +adforce.ru +adform.com +adform.net +adformdsp.net +adfpaces.ero-advertising.com +adfreetv.ch +adfu.blockstackers.com +adfun.ru +adfusion.com +adg.bzgint.com +adgallery.whitehousedrugpolicy.gov +adgardener.com +adgebra.co.in +adgeo.163.com +adglare.net +adgoto.com +adgraphics.theonion.com +adgroup.naver.com +adgtracker.com +adguanggao.eee114.com +adgui.ace.advertising.com +adhall.com +adhealers.com +adhearus.com +adhese.be +adhese.com +adhese.gva.be +adhese.hbvl.be +adhese.nieuwsblad.be +adhese.standaard.be +adhitzads.com +adhoc4.net +adhome.biz +adhr.hit.gemius.pl +adhref.pl +adi.bigmir.net +adi.mainichi.co.jp +adidaspureboost.pl +adidm.idmnet.pl +adidm.supermedia.pl +adidm07.idmnet.pl +adimage.asia1.com.sg +adimage.asiaone.com +adimage.asiaone.com.sg +adimage.blm.net +adimage.guardian.co.uk +adimages.been.com +adimages.carsoup.com +adimages.earthweb.com +adimages.go.com +adimages.homestore.com +adimages.mp3.com +adimages.omroepzeeland.nl +adimages.sanomawsoy.fi +adimages.scrippsnetworks.com +adimages.sina.com.hk +adimages.watchmygf.net +adimg.activeadv.net +adimg.alice.it +adimg.bnet.com +adimg.chow.com +adimg.cnet.com +adimg.com.com +adimg.download.com +adimg.gamefaqs.com +adimg.luminate.com +adimg.mp3.com +adimg.news.com +adimg.ngfiles.com +adimg.theinsider.com +adimg.tv.com +adimg.uimserv.net +adimg.zdnet.com +adimg1.chosun.com +adimg3.search.naver.net +adimgs.sapo.pt +adimpact.com +adin.bigpoint.com +adincl.gopher.com +adincube.com +adinfuse.com +adinjector.net +adintegrity01-ssl.svc.insnw.net +adinterax.cnet.com.edgesuite.net +adinterax.com +adipex.1.p2l.info +adipex.24sws.ws +adipex.3.p2l.info +adipex.4.p2l.info +adipex.hut1.ru +adipex.ourtablets.com +adipex.shengen.ru +adipex.t-amo.net +adipexp.3xforum.ro +adipics.com +adireland.com +adisfy.com +adition.com +adition.de +adition.net +adizio.com +adj.st +adj1.thruport.com +adj10.thruport.com +adj11.thruport.com +adj12.thruport.com +adj13.thruport.com +adj14.thruport.com +adj15.thruport.com +adj16.thruport.com +adj16r1.thruport.com +adj17.thruport.com +adj18.thruport.com +adj19.thruport.com +adj2.thruport.com +adj22.thruport.com +adj23.thruport.com +adj24.thruport.com +adj25.thruport.com +adj26.thruport.com +adj27.thruport.com +adj28.thruport.com +adj29.thruport.com +adj3.thruport.com +adj30.thruport.com +adj31.thruport.com +adj32.thruport.com +adj33.thruport.com +adj34.thruport.com +adj35.thruport.com +adj36.thruport.com +adj37.thruport.com +adj38.thruport.com +adj39.thruport.com +adj4.thruport.com +adj40.thruport.com +adj41.thruport.com +adj43.thruport.com +adj44.thruport.com +adj45.thruport.com +adj46.thruport.com +adj47.thruport.com +adj48.thruport.com +adj49.thruport.com +adj5.thruport.com +adj50.thruport.com +adj51.thruport.com +adj52.thruport.com +adj53.thruport.com +adj54.thruport.com +adj55.thruport.com +adj56.thruport.com +adj6.thruport.com +adj7.thruport.com +adj8.thruport.com +adj9.thruport.com +adjix.com +adjmps.com +adjug.com +adjuggler.com +adjuggler.net +adjuggler.yourdictionary.com +adjust.com +adjustnetwork.com +adk2.co +adk2.com +adk2ads.tictacti.com +adklip.com +adkmob.com +adkontekst.pl +adland.ru +adlearnop.advertising.com +adledge.com +adlegend.com +adless.io +adlev.neodatagroup.com +adlightning.com +adlik.akavita.com +adlik2.akavita.com +adlock.in +adlog.cbsi.com +adlog.com.com +adloox.com +adlooxtracking.com +adlt.hit.gemius.pl +adlure.net +adlv.hit.gemius.pl +adm.265g.com +adm.baidu.com +adm.dynamicyield.com +adm.funshion.com +adm.fwmrm.net +adm.intel-intg.dynamicyield.com +adm.intel-stage.dynamicyield.com +adm.shacknews.com +adm.shinobi.jp +adm.xmfish.com +admagnet.net +admailtiser.com +adman.freeze.com +adman.gr +adman.in.gr +adman.kathimerini.gr +adman.otenet.gr +adman.se +admanage.com +admanagement.ch +admanager.adam4adam.com +admanager.beweb.com +admanager.btopenworld.com +admanager.carsoup.com +admanager.collegepublisher.com +admanager1.collegepublisher.com +admanager2.broadbandpublisher.com +admanager3.collegepublisher.com +admanagerplus.flurry.com +admanmail.com +admantx.com +admarket.cz +admarket.entireweb.com +admarketplace.net +admarkt.marktplaats.nl +admarsx.com +admarvel.com +admarvel.mads.advertising.com +admarvel.s3.amazonaws.com +admatch-syndication.mochila.com +admatcher.videostrip.com +admaven.adk2x.com +admax.nexage.com +admax.quisma.com +admd.yam.com +admedia.com +admedia.expedia.com +admedia.wsod.com +admedia.xoom.com +admedias.net +admediator.unityads.unity3d.com +admedit.net +admedo.com +admega.feed.gr +admeld.com +admention.adspirit.de +admerize.be +admeta.com +admeta.vo.llnwd.net +admex.com +admez.com +admicro1.vcmedia.vn +admicro2.vcmedia.vn +admin-client.mc1.qa-dest.imprev.net +admin-client.rg1.qa-dest.imprev.net +admin-pixel.advidi.com +admin-stg.revcontent.com +admin-styleguide.dynamicyield.com +admin.adlightning.com +admin.adserver.mopub.com +admin.adyoulike.com +admin.airfind.com +admin.analyticson.com +admin.bitcoin.siliconorchard.com +admin.campaign.piwik.pro +admin.cb.qa-dest.imprev.net +admin.corp.mparticle.com +admin.cpufan.club +admin.dev.airfind.com +admin.digitalacre.com +admin.drawbrid.ge +admin.getambassador.com +admin.hotkeys.com +admin.iesnare.co.uk +admin.iesnare.com +admin.impresionesweb.com +admin.inq.com +admin.iovation.com +admin.livefyre.com +admin.marketing.qa-dest.imprev.net +admin.mc1.qa-dest.imprev.net +admin.mpx.mopub.com +admin.pixel.optimalq.net +admin.prudential.qa-dest.imprev.net +admin.qa-dest.imprev.net +admin.remax.qa-dest.imprev.net +admin.revcontent.com +admin.rg1.qa-dest.imprev.net +admin.rg2.qa-dest.imprev.net +admin.rlp.qa-dest.imprev.net +admin.rw.qa-dest.imprev.net +admin.spotxchange.com +admin.staging.airfind.com +admin.streetview.siliconorchard.com +admin.usc-ppa-test.urbaninsight.com +admin.vserv.mobi +admin.yieldmo.com +admindash.spotxchange.com +adminder.com +adminec1.hitbox.com +adminer.com +adminshop.com +admiral-pci.insnw.net +admiral-pci.svc.insnw.net +admiral.mgr.consensu.org +admiral.vpn.insnw.net +admized.com +admnew.dynamicyield.com +admob.com +admonitor.com +admonkey.dapper.net +admotion.com.ar +admp-tc.delfi.lv +admp-tc.iltalehti.fi +admp.io +adms.physorg.com +admtpmp127.adsk2.co +admxxx.com +adn.ebay.com +adn.fusionads.net +adn.impactradius.com +adn.insight.ucweb.com +adn.kinkydollars.com +adn.plxnt.com +adn.static-files.com +adn.zone-telechargement.com +adnet.affinity.com +adnet.asahi.com +adnet.biz +adnet.chicago.tribune.com +adnet.com +adnet.com.ua +adnet.de +adnet.hit.gemius.pl +adnet.pravda.com.ua +adnet.ru +adnet.worldreviewer.com +adnetgalt.hit.gemius.pl +adnetinteractive.com +adnetwork.adasiaholdings.com +adnetwork.buzzlogic.com +adnetwork.net +adnetwork.nextgen.net +adnetwork.rovicorp.com +adnetworkperformance.com +adnetworkperformance.compopcash.net +adnetxchange.com +adnews.maddog2000.de +adnext.fr +adnexus.net +adng.ascii24.com +adnimation-d.openx.net +adnotch.com +adnxs.com +adnxs.revsci.net +ado.icorp.ro +ado.pro-market.net +adobe-flashplayer.com +adobe.demdex.net +adobe.tt.omtrdc.net +adobecorp.sc.omtrdc.net +adobedtm.com +adobee.com +adobeflashupdate14.com +adobur.com +adobur.net +adoburcrv.com +adocean-by.hit.gemius.pl +adocean-cz.hit.gemius.pl +adocean-ee.hit.gemius.pl +adocean-hr.hit.gemius.pl +adocean-lt.hit.gemius.pl +adocean-lt.lt +adocean-lv.hit.gemius.pl +adocean-pl.hit.gemius.pl +adocean-ro.hit.gemius.pl +adocean-si.hit.gemius.pl +adocean-ua.hit.gemius.pl +adocean.delfi.lv +adocean.pl +adonline.e-kolay.net +adonspot.com +adoops.zemanta.com +adoperator.com +adops.cbsinteractive.com +adopt.euroclick.com +adopt.precisead.com +adopt.specificclick.net +adorigin.com +adotmob.com +adotube.com +adp.112.2o7.net +adp.adview.pl +adp.gazeta.pl +adpdl.ssl.d2.sc.omtrdc.net +adpenguin.biz +adpepper.dk +adpepper.nl +adperium.com +adpia.vn +adpick.switchboard.com +adping.qq.com +adplans.net +adplay.tudou.com +adplexmedia.adk2.co +adplexmedia.adk2x.com +adplus.co.id +adplus.yonhapnews.co.kr +adplusplus.fr +adplxmd.com +adpoddb1.dfw2.lijit.com +adportal.advertising.com +adportal.advertisingnemesis.com +adpredictive.com +adpro.futurenet.club +adprofile.net +adprotect.net +adprovider.adlure.net +adproxy.ndmdhs.com +adpsj.ssl.d1.sc.omtrdc.net +adpulse.ads.targetnet.com +adpush.dreamscape.com +adpxl.co +adpxljs.adpxl.co +adq.nextag.com +adr.adplus.co.id +adrates.theglobeandmail.com +adrazzi.com +adreactor.com +adready.com +adreadytractions.com +adreclaim.com +adrecover.com +adrecreate.com +adrelevantis.com +adremedy.com +adremote.pathfinder.com +adremote.timeinc.aol.com +adremote.timeinc.net +adrenali.gq +adreporting.com +adrequisitor-af.lp.uol.com.br +adres.internet.com +adrevolver.com +adrianzajewicz.blogspot.com +adriver.ru +adrizer.com +adro.hit.gemius.pl +adrolays.de +adroll.com +adrotate.de +adrotate.se +adrotator.com +adrotator.se +adrotic.girlonthenet.com +adrs.hit.gemius.pl +adrta.com +adrunnr.com +ads-a.juicyads.com +ads-adseast.yldbt.com +ads-api.ft.com +ads-bid.l.doubleclick.net +ads-by.madadsmedia.com +ads-by.yieldselect.com +ads-click.com +ads-colruytgroup.adhese.com +ads-d.viber.com +ads-de.spray.net +ads-dev.youporn.com +ads-development.clrstm.com +ads-direct.prodigy.net +ads-hl.noktamedya.com.tr +ads-kurir.providus.rs +ads-local.sixapart.com +ads-nrc.adhese.com +ads-pebblemedia.adhese.com +ads-qa.servebom.com +ads-rm.looksmart.com +ads-rolandgarros.com +ads-rouge.haber7.com +ads-roularta.adhese.com +ads-srv.net +ads-staging.clrstm.com +ads-stats-limiter-shadow.snapads.com +ads-stats.com +ads-stream.com +ads-t.ru +ads-trk.vidible.tv +ads-twitter.com +ads-us.pictela.net +ads-v-darwin.hulu.com +ads-web.mail.com +ads.20minutes.fr +ads.24.com +ads.359group.com +ads.3bay.bg +ads.3e-news.net +ads.3sfmedia.com +ads.4rati.lv +ads.4tube.com +ads.5ci.lt +ads.7days.ae +ads.8833.com +ads.abovetopsecret.com +ads.abs-cbn.com +ads.accelerator-media.com +ads.aceweb.net +ads.active.com +ads.activeagent.at +ads.activepower.net +ads.activestate.com +ads.ad-center.com +ads.ad-flow.com +ads.ad4game.com +ads.ad4max.com +ads.adadapted.com +ads.adagent.chacha.com +ads.adamoads.com +ads.adap.tv +ads.adaptv.advertising.com +ads.adasiaholdings.com +ads.adbrite.com +ads.adbroker.de +ads.adcorps.com +ads.addesktop.com +ads.addynamix.com +ads.adengage.com +ads.adfox.ru +ads.adgoto.com +ads.adhall.com +ads.adhearus.com +ads.adhese.be +ads.adhood.com +ads.adhostingsolutions.com +ads.adhsm.adhese.com +ads.adhub.co.nz +ads.adiply.com +ads.adiquity.com +ads.adk2.com +ads.admarvel.com +ads.admaxasia.com +ads.admaximize.com +ads.administrator.de +ads.admoda.com +ads.admodus.com +ads.admonitor.net +ads.adn.com +ads.adnet-media.net +ads.adnet.am +ads.adone.com +ads.adonion.com +ads.adroar.com +ads.ads.netlog.com +ads.adsag.com +ads.adsbookie.com +ads.adshareware.net +ads.adsinimages.com +ads.adsonar.com +ads.adsponse.de +ads.adsready.com +ads.adsrvmedia.com +ads.adsrvmedia.net +ads.adsrvr.org +ads.adstream.com.ro +ads.adsurve.com +ads.adtegrity.net +ads.adtekmedia.com +ads.adthrive.com +ads.adtiger.de +ads.adtrustmedia.com +ads.adtube.de +ads.adual.net +ads.adultfriendfinder.com +ads.adultswim.com +ads.advance.net +ads.adverline.com +ads.advertise.net +ads.advertisespace.com +ads.advertisingnemesis.com +ads.adviva.net +ads.advolume.com +ads.adworldnetwork.com +ads.adx.nu +ads.adxpansion.com +ads.adxpose.com +ads.adxpose.mpire.akadns.net +ads.adzoka.com +ads.aerserv.com +ads.afa.net +ads.affbuzzads.com +ads.affiliateclub.com +ads.affiliates-spinit.com +ads.affiliates.match.com +ads.afraccess.com +ads.aftonbladet.se +ads.ah-ha.com +ads.ahds.ac.uk +ads.aintitcool.com +ads.airamericaradio.com +ads.ak.facebook.com +ads.ak.facebook.com.edgesuite.net +ads.akademika.bg +ads.al.com +ads.albawaba.com +ads.all-free-download.com +ads.allaccess.com.ph +ads.allsites.com +ads.allvatar.com +ads.allvertical.com +ads.almasdarnews.com +ads.alphaporno.com +ads.alphonso.tv +ads.alt.com +ads.altitude-arena.com +ads.amakings.com +ads.amaland.com +ads.amarillo.com +ads.amateurmatch.com +ads.amazingmedia.com +ads.amdmb.com +ads.amgdgt.com +ads.ami-admin.com +ads.amigos.com +ads.anm.co.uk +ads.anvato.com +ads.aol.co.uk +ads.aol.com +ads.apartmenttherapy.com +ads.api.vungle.com +ads.apn.co.nz +ads.apn.co.za +ads.appleinsider.com +ads.appsgeyser.com +ads.araba.com +ads.arcadechain.com +ads.arkitera.net +ads.aroundtherings.com +ads.artsopolis.com +ads.as4x.tmcs.net +ads.as4x.tmcs.ticketmaster.ca +ads.as4x.tmcs.ticketmaster.com +ads.asexstories.com +ads.asia1.com +ads.asia1.com.sg +ads.asiafriendfinder.com +ads.ask.com +ads.asp.net +ads.aspalliance.com +ads.aspentimes.com +ads.asredas.com +ads.associatedcontent.com +ads.astalavista.us +ads.atlantamotorspeedway.com +ads.auctionads.com +ads.auctioncity.co.nz +ads.auctions.yahoo.com +ads.augusta.com +ads.autoscout24.com +ads.autotrader.com +ads.avazu.net +ads.aversion2.com +ads.avocarrot.com +ads.avusa.co.za +ads.aws.sitepoint.com +ads.aws.viber.com +ads.ayads.co +ads.azjmp.com +ads.b10f.jp +ads.baazee.com +ads.badische-zeitung.de +ads.balkanec.bg +ads.bangkokpost.co.th +ads.banner.t-online.de +ads.barnonedrinks.com +ads.battle.net +ads.bauerpublishing.com +ads.baventures.com +ads.baz.ch +ads.bbcworld.com +ads.bcnewsgroup.com +ads.be2hand.com +ads.beeb.com +ads.beliefnet.com +ads.belointeractive.com +ads.benefitspro.com +ads.berlinonline.de +ads.beta.itravel2000.com +ads.betanews.com +ads.betfair.com +ads.betfair.com.au +ads.betsafe.com +ads.betternetworker.com +ads.betweendigital.com +ads.bfast.com +ads.bfm.valueclick.net +ads.bg-mamma.com +ads.bgfree.com +ads.bgtop.net +ads.bhmedianetwork.com +ads.bianca.com +ads.bidclix.com +ads.bidvertiser.com +ads.bigchurch.com +ads.bigcitytools.com +ads.bigfoot.com +ads.biggerboat.com +ads.bigrebelads.com +ads.bing.com +ads.biscom.net +ads.bitsonthewire.com +ads.bittorrent.com +ads.bizhut.com +ads.biznews.bg +ads.bizx.info +ads.bl-consulting.net +ads.blixem.nl +ads.blizzard.com +ads.blog.com +ads.blogdrive.com +ads.blogherads.com +ads.blogtalkradio.com +ads.bloodhorse.com +ads.bloomberg.com +ads.blp.calueclick.net +ads.blp.valueclick.net +ads.bluelithium.com +ads.bluemountain.com +ads.bluesq.com +ads.bninews.com +ads.bnmedia.com +ads.boardtracker.com +ads.boerse-express.com +ads.bondage.com +ads.bonniercorp.com +ads.bonnint.net +ads.boursorama.com +ads.box.sk +ads.boylesports.com +ads.brabys.com +ads.brand.net +ads.brandeins.de +ads.brazzers.com +ads.bridgetrack.com +ads.bridgetrack.com.edgesuite.net +ads.britishexpats.com +ads.bsplayer.com +ads.bta.bg +ads.bttbgroup.com +ads.btv.bg +ads.buljobs.bg +ads.bumq.com +ads.burgasinfo.com +ads.buscape.com.br +ads.businessclick.com +ads.businessclick.pl +ads.businessweek.com +ads.calgarystampede.com +ads.calgarysun.com +ads.callofdutyblackopsforum.net +ads.camrecord.com +ads.canalblog.com +ads.canoe.ca +ads.captifymedia.com +ads.cardea.se +ads.cardplayer.com +ads.carltononline.com +ads.carocean.co.uk +ads.cars.com +ads.casinocity.com +ads.casumoaffiliates.com +ads.catholic.org +ads.cavello.com +ads.cbc.ca +ads.cc +ads.cc-dt.com +ads.cdfreaks.com +ads.cdnow.com +ads.cdnslate.com +ads.cdrinfo.com +ads.celtra.com +ads.centraliprom.com +ads.cgchannel.com +ads.cgnetworks.com +ads.chacomedia.com +ads.chalomumbai.com +ads.champs-elysees.com +ads.chango.ca +ads.chango.com +ads.channel4.com +ads.chargeads.com +ads.checkm8.co.za +ads.china.com +ads.chipcenter.com +ads.chumcity.com +ads.cinemaden.com +ads.cineville.nl +ads.city24.ee +ads.cjonline.com +ads.clamav.net +ads.clara.net +ads.clearchannel.com +ads.cleveland.com +ads.clickability.com +ads.clickad.com.pl +ads.clickagents.com +ads.clickhouse.com +ads.clicksor.cn +ads.clicksor.com +ads.clickthru.net +ads.clicmanager.fr +ads.clipconverter.cc +ads.cloud.kargo.com +ads.clovenetwork.com +ads.clrstm.com +ads.clubz.bg +ads.clubzone.com +ads.cluster01.oasis.zmh.zope.net +ads.cmediaworld.com +ads.cmg.valueclick.net +ads.cnixon.com +ads.cnn.com +ads.cnngo.com +ads.co.com +ads.cobrad.com +ads.collegclub.com +ads.collegehumor.com +ads.collegemix.com +ads.colombiaonline.com +ads.com.com +ads.comediagroup.hu +ads.comeon.com +ads.comicbookresources.com +ads.comperia.pl +ads.consumeraffairs.com +ads.contactmusic.com +ads.contentabc.com +ads.contextweb.com +ads.coopson.com +ads.corusradionetwork.com +ads.courierpostonline.com +ads.cpsgsoftware.com +ads.cpxcenter.com +ads.cpxinteractive.com +ads.cracked.com +ads.crakmedia.com +ads.crapville.com +ads.crawler.com +ads.creative-serving.com +ads.creativematch.com +ads.cricbuzz.com +ads.crisppremium.com +ads.crosscut.com +ads.crossworxs.eu +ads.ctvdigital.net +ads.currantbun.com +ads.cursorinfo.co.il +ads.cvut.cz +ads.cyberfight.ru +ads.cybersales.cz +ads.cybertrader.com +ads.d-msquared.com +ads.dada.it +ads.dailystar.com.lb +ads.danworld.net +ads.darkhardware.com +ads.databrainz.com +ads.datinggold.com +ads.datingyes.com +ads.dazoot.ro +ads.dbforums.com +ads.ddj.com +ads.dealnews.com +ads.deliverimp.com +ads.deltha.hu +ads.democratandchronicle.com +ads.dennisnet.co.uk +ads.depositfiles.com +ads.designboom.com +ads.designtaxi.com +ads.desktopscans.com +ads.desmoinesregister.com +ads.detelefoongids.nl +ads.developershed.com +ads.deviantart.com +ads.devicebondage.com +ads.dichtbij.adhese.com +ads.digital-digest.com +ads.digitalacre.com +ads.digitalalchemy.tv +ads.digitalhealthcare.com +ads.digitalmedianet.com +ads.digitalpoint.com +ads.digitalthrottle.com +ads.dijitalvarliklar.com +ads.dimcab.com +ads.dir.bg +ads.directcorp.de +ads.directionsmag.com +ads.discovery.com +ads.discreetad.com +ads.dk +ads.dkelseymedia.com +ads.doclix.com +ads.doctors.co.il +ads.domain.com +ads.domainoptions.net +ads.domeus.com +ads.dontpanicmedia.com +ads.dothads.com +ads.dotomi.com +ads.double.net +ads.doubleviking.com +ads.downloadaccelerator.com +ads.draugas.lt +ads.drf.com +ads.drivelinemedia.com +ads.drugs.com +ads.dumpalink.com +ads.dynamic-media.org +ads.dynamicyield.com +ads.e-go.gr +ads.e-planning.net +ads.eagletribune.com +ads.easy-forex.com +ads.eccentrix.com +ads.ecircles.com +ads.economist.com +ads.ecosalon.com +ads.ecrush.com +ads.edbindex.dk +ads.edipresse.pl +ads.edirectme.com +ads.egrana.com.br +ads.ehealthcaresolutions.com +ads.einmedia.com +ads.eircom.net +ads.elcarado.com +ads.electrocelt.com +ads.elitetrader.com +ads.elmaz.com +ads.emeraldcoast.com +ads.emirates.net.ae +ads.empoweringmedia.net +ads.emqus.com +ads.energy-torrent.com +ads.enliven.com +ads.enrd.co +ads.epi.es +ads.epltalk.com +ads.epom.com +ads.eqads.com +ads.ere.net +ads.ereklama.mk +ads.ero-advertising.com +ads.erotism.com +ads.ersamedia.ch +ads.espn.adsonar.com +ads.eu.e-planning.net +ads.eu.msn.com +ads.eudora.com +ads.euniverseads.com +ads.eurogamer.net +ads.evtv1.com +ads.exactdrive.com +ads.exactseek.com +ads.examiner.net +ads.exdynsrv.com +ads.exhedra.com +ads.exoclick.com +ads.exosrv.com +ads.expat-blog.biz +ads.expedia.com +ads.expekt.com +ads.extremereach.com +ads.eyeonx.ch +ads.ezboard.com +ads.factorymedia.com +ads.fairfax.com.au +ads.fark.com +ads.fasttrack-ignite.com +ads.faxo.com +ads.fayettevillenc.com +ads.feedly.com +ads.ferianc.com +ads.fiat-bg.org +ads.fidelity-media.com +ads.filecloud.com +ads.fileindexer.com +ads.filmup.com +ads.financialcontent.com +ads.finzoom.com.tr +ads.first-response.be +ads.flabber.nl +ads.flashgames247.com +ads.fling.com +ads.flooble.com +ads.floridatoday.com +ads.flurry.com +ads.focus-news.net +ads.fool.com +ads.footballmedia.com +ads.footymad.net +ads.fooyoh.com +ads.fora.tv +ads.forbes.com +ads.forbes.net +ads.forium.de +ads.fortunecity.com +ads.fotosidan.se +ads.fox.com +ads.foxnetworks.com +ads.foxnews.com +ads.fredericksburg.com +ads.freebannertrade.com +ads.freecaster.tv +ads.freecity.de +ads.freeonlinegames.com +ads.freeskreen.com +ads.freewheel.tv +ads.fresh.bg +ads.freshmeat.net +ads.fresnobee.com +ads.friendfinder.com +ads.ft.com +ads.fuckingmachines.com +ads.fuelo.net +ads.fulldls.com +ads.fulltiltpoker.com +ads.gadget.ro +ads.gamblinghit.com +ads.game.net +ads.gamecity.net +ads.gamecopyworld.no +ads.gameinformer.com +ads.gamelink.com +ads.gamershell.com +ads.gameservers.com +ads.gamespy.com +ads.gamespyid.com +ads.gamigo.de +ads.gaming-universe.de +ads.gamned.com +ads.garga.biz +ads.gateway.bg +ads.gateway.com +ads.gawker.com +ads.geekswithblogs.net +ads.genericlink.com +ads.germanfriendfinder.com +ads.getlucky.com +ads.gettools.com +ads.ghettotube.com +ads.gigaom.com.php5-12.websitetestlink.com +ads.givemegay.com +ads.gladen.bg +ads.glasove.com +ads.glispa.com +ads.globeandmail.com +ads.globescale.com +ads.globo.com +ads.gmg.valueclick.net +ads.gmodules.com +ads.god.co.uk +ads.gofuckyourself.com +ads.gold +ads.golfweek.com +ads.goodreads.com +ads.gorillanation.com +ads.gorillavid.in +ads.goyk.com +ads.gplusmedia.com +ads.gradfinder.com +ads.granadamedia.com +ads.grandonmedia.com +ads.gravytrainproductions.com +ads.greenbaypressgazette.com +ads.greenvilleonline.com +ads.grindinggears.com +ads.groupcommerce.com +ads.gsm-exchange.com +ads.gsmexchange.com +ads.guardian.co.uk +ads.guardianunlimited.co.uk +ads.gulflive.com +ads.gumgum.com +ads.gunaxin.com +ads.guru3d.com +ads.h2porn.com +ads.haber3.com +ads.haber7.net +ads.haberler.com +ads.halogennetwork.com +ads.hamptonroads.com +ads.hamtonroads.com +ads.happyidiots.nl +ads.hardwarezone.com +ads.harpers.org +ads.harvard.edu +ads.haskovo.net +ads.havenhomemedia.com +ads.hbv.de +ads.he.valueclick.net +ads.healthline.com +ads.hearstmags.com +ads.heartlight.org +ads.heias.com +ads.herald-mail.com +ads.heraldnet.com +ads.heraldonline.com +ads.heraldsun.com +ads.heroldonline.com +ads.hexun.com +ads.hicomm.bg +ads.hideyourarms.com +ads.highdefdigest.com +ads.hitbox.com +ads.hitcents.com +ads.hlwd.valueclick.net +ads.hobyto.com +ads.hogtied.com +ads.hollandsentinel.com +ads.hollywood.com +ads.hookedmediagroup.com +ads.hooqy.com +ads.hornypharaoh.com +ads.horsehero.com +ads.horyzon-media.com +ads.host.camz.com +ads.hosting.vcmedia.vn +ads.hothardware.com +ads.hulu.com +ads.hulu.com.edgesuite.net +ads.humorbua.no +ads.hurra.de +ads.i-am-bored.com +ads.i12.de +ads.i33.com +ads.iafrica.com +ads.iawsnetwork.com +ads.ibest.com.br +ads.iboost.com +ads.ibox.bg +ads.ibryte.com +ads.ibtracking.com +ads.icn.bg +ads.icorp.ro +ads.icq.com +ads.id-t.com +ads.identads.com +ads.idgworldexpo.com +ads.iforex.com +ads.ign.com +ads.ihaberadserver.com +ads.iknowthatgirl.com +ads.illuminatednation.com +ads.imaging-resource.com +ads.imarketservices.com +ads.imdb.com +ads.imeem.com +ads.img.co.za +ads.img.globo.com +ads.imguol.com +ads.imgur.com +ads.immobilienscout24.de +ads.imposibil.ro +ads.indeed.com +ads.indexinfo.org +ads.indiatimes.com +ads.indya.com +ads.indystar.com +ads.inedomedia.com +ads.inetdirectories.com +ads.inetinteractive.com +ads.inews.bg +ads.infi.net +ads.infomediainc.com +ads.infospace.com +ads.injersey.com +ads.inmobi.com +ads.insidehighered.com +ads.insmarket.bg +ads.inspirestudio.net +ads.intellicast.com +ads.intergi.com +ads.internal.unity3d.com +ads.internic.co.il +ads.inthesidebar.com +ads.investingchannel.com +ads.inviziads.com +ads.iol.co.il +ads.ipowerweb.com +ads.ireel.com +ads.ireport.com +ads.isat-tech.com +ads.isoftmarketing.com +ads.isum.de +ads.itmcash.com +ads.itv.com +ads.itzdigital.com +ads.iwangmedia.com +ads.iwannawatch.to +ads.iwon.com +ads.jacksonville.com +ads.jeneauempire.com +ads.jenite.bg +ads.jetpackdigital.com +ads.jetphotos.net +ads.jewcy.com +ads.jewishfriendfinder.com +ads.jimworld.com +ads.jiwire.com +ads.jlisting.jp +ads.jo-games.com +ads.joaffs.com +ads.jobsite.co.uk +ads.joemonster.org +ads.joetec.net +ads.jokaroo.com +ads.jornadavirtual.com.mx +ads.jossip.com +ads.jpost.com +ads.jubii.dk +ads.juicyads.com +ads.juneauempire.com +ads.justhungry.com +ads.justpremium.nl +ads.justrelevant.com +ads.jwtt3.com +ads.ka6tata.com +ads.kabooaffiliates.com +ads.kaktuz.net +ads.kaldata.com +ads.kanal3.bg +ads.kartu.lt +ads.kazaa.com +ads.kelbymediagroup.com +ads.keywordblocks.com +ads.kidssports.bg +ads.kinobox.cz +ads.kinxxx.com +ads.kiosked.com +ads.kixer.com +ads.kleinman.com +ads.kmpads.com +ads.kokteyl.com +ads.kompass.com +ads.koreanfriendfinder.com +ads.kozmetika-bg.com +ads.krawall.de +ads.ksl.com +ads.kulinar.bg +ads.kure.tv +ads.kurir-info.rs +ads.kyalon.net +ads.lanistaads.com +ads.lapalingo.com +ads.laptop.bg +ads.larryaffiliates.com +ads.layer-ad.org +ads.lehighvalleylive.com +ads.leo.org +ads.leovegas.com +ads.lesbianpersonals.com +ads.lfstmedia.com +ads.lifehealthpro.com +ads.lifesport.bg +ads.lilengine.com +ads.link4ads.com +ads.linkedin.com +ads.linki.nl +ads.linksponsor.com +ads.linktracking.net +ads.linuxfoundation.org +ads.linuxjournal.com +ads.linuxsecurity.com +ads.list-universe.com +ads.listingware.com +ads.live365.com +ads.livenation.com +ads.livepromotools.com +ads.livescore.com +ads.ljworld.com +ads.lmmob.com +ads.lnkworld.com +ads.localnow.com +ads.localyokelmedia.com +ads.lordlucky.com +ads.lovercash.com +ads.loveshack.org +ads.lubbockonline.com +ads.lucidmedia.com +ads.lucidmedia.com.gslb.com +ads.lycos-europe.com +ads.lycos.com +ads.lzjl.com +ads.macnews.de +ads.macupdate.com +ads.madison.com +ads.madisonavenue.com +ads.magnetic.is +ads.mail.bg +ads.mail.com +ads.mail3x.com +ads.maksimum.net +ads.maleflixxx.tv +ads.mambocommunities.com +ads.manager.bg +ads.marica.bg +ads.mariuana.it +ads.massinfra.nl +ads.masslive.com +ads.matiro.com +ads.matomymobile.com +ads.mcafee.com +ads.mdchoice.com +ads.mdotm.com +ads.mediaforge.com +ads.mediamayhemcorp.com +ads.mediaodyssey.com +ads.mediaturf.net +ads.mediatwo.com +ads.medienhaus.de +ads.mefeedia.com +ads.megaproxy.com +ads.meropar.jp +ads.metatron.co.il +ads.metblogs.com +ads.metropolis.co.jp +ads.mgnetwork.com +ads.miarroba.com +ads.mic.com +ads.millionairemate.com +ads.milliyet.cubecdn.net +ads.mindsetnetwork.com +ads.mindviz.com +ads.miniclip.com +ads.mininova.org +ads.mircx.com +ads.mixbg.net +ads.mixedtraffic.com +ads.mixi.jp +ads.mixtraffic.com +ads.mlive.com +ads.mm.ap.org +ads.mmania.com +ads.mndaily.com +ads.mnemosoft.com +ads.mobclix.com +ads.mobgold.com +ads.mobilautomaten.com +ads.mobilebet.com +ads.mobiledia.com +ads.mobilemarketer.com +ads.mobilityware.com +ads.mobygames.com +ads.modbee.com +ads.mofos.com +ads.mondogames.com +ads.monetize-me.com +ads.money.bg +ads.monogram.sk +ads.monster.com +ads.mopub.com +ads.morningstar.com +ads.motor-forum.nl +ads.motormedia.nl +ads.mouseplanet.com +ads.movieweb.com +ads.mp.mydas.mobi +ads.mp3searchy.com +ads.mpm.com.mk +ads.mrgreen.com +ads.mrskin.com +ads.mrtones.com +ads.msn.com +ads.mt.valueclick.net +ads.mtc.ace.advertising.com +ads.mtv.uol.com.br +ads.multimania.lycos.fr +ads.musiccity.com +ads.mustangworks.com +ads.mybet.com +ads.mycricket.com +ads.mylikes.com +ads.mysimon.com +ads.mytelus.com +ads.n-ws.org +ads.n131adserv.com +ads.naftemporiki.gr +ads.nandomedia.com +ads.nationalgeographic.com +ads.nationalreview.com +ads.nationchannel.com +ads.nativeinstruments.de +ads.ncm.com +ads.ndtv1.com +ads.neg.bg +ads.neoseeker.com +ads.neowin.net +ads.nerve.com +ads.netbul.com +ads.netcommunities.com +ads.nethaber.com +ads.netinfo.bg +ads.netmechanic.com +ads.netrition.com +ads.netsol.com +ads.networkhm.com +ads.networksolutions.com +ads.networkwcs.net +ads.networldmedia.net +ads.neudesicmediagroup.com +ads.newcity.com +ads.newcitynet.com +ads.newdream.net +ads.newgrounds.com +ads.newmedia.cz +ads.news359.bg +ads.newsbtc.com +ads.newsgeek.co.il +ads.newsint.co.uk +ads.newsminerextra.com +ads.newsobserver.com +ads.newsquest.co.uk +ads.newtention.net +ads.newtimes.com +ads.nexage.akadns.net +ads.nexage.com +ads.ngenuity.com +ads.nicovideo.jp +ads.ninemsn.com.au +ads.nj.com +ads.nola.com +ads.nordichardware.com +ads.nordichardware.se +ads.northjersey.com +ads.novem.pl +ads.novinhagostosa10.com +ads.novsport.com +ads.nowrunning.com +ads.npr.valueclick.net +ads.nrc.adhese.com +ads.ntadvice.com +ads.ntc.ace.advertising.com +ads.nudecards.com +ads.nudereviews.com +ads.nwsource.com +ads.nwsource.com.edgesuite.net +ads.nyi.net +ads.nyjournalnews.com +ads.nyootv.com +ads.nypost.com +ads.nytimes.com +ads.nyx.cz +ads.nzcity.co.nz +ads.o-networkaffiliates.com +ads.o2.pl +ads.oddschecker.com +ads.offsidebet.com +ads.ogdenpubs.com +ads.okcimg.com +ads.ole.com +ads.olivebrandresponse.com +ads.olx.com +ads.omaha.com +ads.one.co.il +ads.onemodelplace.com +ads.oneplace.com +ads.online.ie +ads.onlineathens.com +ads.onlinevenditatio.space +ads.onvertise.com +ads.ookla.com +ads.open.pl +ads.opensubtitles.org +ads.optusnet.com.au +ads.oregonlive.com +ads.orsm.net +ads.osdn.com +ads.outpersonals.com +ads.oxymoronent.com +ads.p.veruta.com +ads.panadvert.com +ads.pandora.tv.net +ads.panoramtech.net +ads.paper.li +ads.papeteka.com +ads.parrysound.com +ads.partner2profit.com +ads.partystars.bg +ads.passion.com +ads.pastemagazine.com +ads.patch.com +ads.paxnet.co.kr +ads.pcper.com +ads.pdxguide.com +ads.pe.com +ads.pebblemedia.adhese.com +ads.peel.com +ads.peninsulaclarion.com +ads.pennet.com +ads.pennlive.com +ads.pennnet.com +ads.penny-arcade.com +ads.pennyweb.com +ads.people-group.net +ads.people.com.cn +ads.peoplespharmacy.com +ads.periodistadigital.com +ads.persgroep.adhese.com +ads.persgroep.net +ads.peteava.ro +ads.petvet.bg +ads.pg.valueclick.net +ads.pheedo.com +ads.phillipsdata.us +ads.phillyadclub.com +ads.phillyburbs.com +ads.phonearena.com +ads.photosight.ru +ads.phpclasses.org +ads.pictela.net +ads.pik.bg +ads.pilotonline.com +ads.pimdesign.org +ads.pinger.com +ads.pitchforkmedia.com +ads.pittsburghlive.com +ads.pixiq.com +ads.place1.com +ads.planet-f1.com +ads.planet.nl +ads.plantyours.com +ads.playboy.bg +ads.playboy.com +ads.pni.com +ads.pno.net +ads.po-zdravidnes.com +ads.poconorecord.com +ads.pof.com +ads.pointroll.com +ads.popfolkstars.com +ads.pornerbros.com +ads.portlandmercury.com +ads.postimees.ee +ads.powweb.com +ads.prd.ie.internal.unity3d.com +ads.premiumnetwork.com +ads.premiumnetwork.net +ads.pressdemo.com +ads.pressflex.com +ads.pricescan.com +ads.primaryclick.com +ads.primeinteractive.net +ads.primissima.it +ads.printscr.com +ads.prisacom.com +ads.pro-market.net +ads.pro-market.net.edgesuite.net +ads.proboards.com +ads.proc.cc +ads.profitsdeluxe.com +ads.profootballtalk.com +ads.program3.com +ads.programattik.com +ads.propertycasualty360.com +ads.prospect.org +ads.proz.com +ads.pruc.org +ads.psd2html.com +ads.publicdisgrace.com +ads.publicidad.net +ads.pubmatic.com +ads.pubsqrd.com +ads.purefuck.com +ads.pushplay.com +ads.q1media.com +ads.quasaraffiliates.com +ads.queendom.com +ads.quicken.com +ads.quoka.de +ads.rackshack.net +ads.racunalniske-novice.com +ads.radar.bg +ads.radiatemedia.com +ads.radioactive.se +ads.rampidads.com +ads.rasmussenreports.com +ads.ratemyprofessors.com +ads.rcgroups.com +ads.rcs.it +ads.rdstore.com +ads.realcastmedia.com +ads.realcities.com +ads.realmedia.com.br +ads.realmedia.de +ads.realtechnetwork.net +ads.reason.com +ads.recoletos.es +ads.reddit.com +ads.rediff.com +ads.redlightcenter.com +ads.redorbit.com +ads.redtube.com +ads.reduxmediagroup.com +ads.reembed.com +ads.referlocal.com +ads.reflexcash.com +ads.register.com +ads.reklamatik.com +ads.reklamlar.net +ads.resoom.de +ads.retirementjobs.com +ads.returnpath.net +ads.revenews.com +ads.revenue.net +ads.revjet.com +ads.revsci.net +ads.right-ads.com +ads.rim.co.uk +ads.ripoffreport.com +ads.rkdms.com +ads.rnmd.net +ads.roanoke.com +ads.rockstargames.com +ads.rodale.com +ads.rohea.com +ads.roiserver.com +ads.roku.com +ads.rol.ro +ads.rondomondo.com +ads.rootzoo.com +ads.rottentomatoes.com +ads.roularta.adhese.com +ads.rp-online.de +ads.rttnews.com +ads.rtvslo.si +ads.rubiconproject.com +ads.rude.com +ads.ruralpress.com +ads.s3.sitepoint.com +ads.sabah.com.tr +ads.sacbee.com +ads.sagabg.net +ads.sanomalehtimedia.fi +ads.sapo.pt +ads.satyamonline.com +ads.savannahnow.com +ads.saymedia.com +ads.scabee.com +ads.scanapps.com +ads.schwabtrader.com +ads.scifi.com +ads.scorecardresearch.com +ads.scott-sports.com +ads.scottusa.com +ads.search.bg +ads.seattletimes.com +ads.senddroid.com +ads.seniorfriendfinder.com +ads.seriouswheels.com +ads.servebom.com +ads.sexandsubmission.com +ads.sexforums.com +ads.sexier.com +ads.sexinyourcity.com +ads.sexspaces.com +ads.sfomedia.com +ads.sfusion.com +ads.shiftdelete.net +ads.shizmoo.com +ads.shoppingads.com +ads.shopstyle.com +ads.shorte.st +ads.shoutfile.com +ads.shovtvnet.com +ads.showtvnet.com +ads.sidekick.condenast.com +ads.sift.co.uk +ads.sify.com +ads.silive.com +ads.silverdisc.co.uk +ads.simpli.fi +ads.simtel.com +ads.simtel.net +ads.sina.com +ads.singlescash.com +ads.sitemeter.com +ads.sixapart.com +ads.skelbiu.lt +ads.skinected.com +ads.skupe.net +ads.sl.interpals.net +ads.sladur.com +ads.slava.bg +ads.smartclick.com +ads.smartclicks.com +ads.smartclicks.net +ads.smartdevicemedia.com +ads.smartolution.com +ads.smartshoppingads.de +ads.smowtion.com +ads.snowball.com +ads.socialreach.com +ads.socialtheater.com +ads.soft32.com +ads.softure.com +ads.sohh.com +ads.sol.no +ads.somd.com +ads.somethingawful.com +ads.songs.pk +ads.sonital.com +ads.sonobi.com +ads.space.com +ads.specificclick.com +ads.specificmedia.com +ads.specificpop.com +ads.spilgames.com +ads.spintrade.com +ads.sport1.bg +ads.sports.fr +ads.sportsblog.com +ads.sptimes.com +ads.spymac.net +ads.stackoverflow.com +ads.stage-one.heyzap.com +ads.standartnews.com +ads.starbanner.com +ads.stardoll.com +ads.start.bg +ads.static.adhood.com +ads.static.blip.tv +ads.stephensmedia.com +ads.stickyadstv.com +ads.stileproject.com +ads.stoiximan.gr +ads.stupid.com +ads.suite6ixty6ix.com +ads.sumotorrent.com +ads.sun.com +ads.sunjournal.com +ads.suomiautomaatti.com +ads.sup.com +ads.superonline.com +ads.supplyframe.com +ads.svnt.com +ads.swiftnews.com +ads.switchboard.com +ads.sxx.com +ads.syracuse.com +ads.sysmesh.com +ads.tahono.com +ads.tarrobads.com +ads.tbs.com +ads.tdbank.com +ads.tdcanadatrust.com +ads.teamyehey.com +ads.technoratimedia.com +ads.techtv.com +ads.techvibes.com +ads.techweb.com +ads.tele.net +ads.telecinco.es +ads.telegraaf.nl +ads.telegraph.co.uk +ads.the15thinternet.com +ads.theawl.com +ads.thebugs.ws +ads.thecoolhunter.net +ads.thecrimson.com +ads.thefrisky.com +ads.thegauntlet.com +ads.theglobeandmail.com +ads.thehorse.com +ads.theindependent.com +ads.themoneytizer.com +ads.themovienation.com +ads.theolympian.com +ads.thesmokinggun.com +ads.thestar.com +ads.thestranger.com +ads.thetrainingofo.com +ads.thewebfreaks.com +ads.thrillsaffiliates.com +ads.timesunion.com +ads.tiscali.com +ads.tiscali.fr +ads.tiscali.it +ads.tmcs.net +ads.tnt.tv +ads.top-banners.com +ads.top.bg +ads.top500.org +ads.toplayaffiliates.com +ads.topnovini.bg +ads.topwam.com +ads.toronto.com +ads.torrpedo.net +ads.totallyfreestuff.com +ads.townhall.com +ads.tracfonewireless.com +ads.track.net +ads.tracking202.com +ads.trackitdown.net +ads.tradeads.eu +ads.trademe.co.nz +ads.traderonline.com +ads.traffichaus.com +ads.traffichunt.com +ads.trafficjunky.net +ads.trafficnews.bg +ads.trafficpimps.com +ads.traffikings.com +ads.treehugger.com +ads.tremorhub.com +ads.triada.bg +ads.tricityherald.com +ads.trinitymirror.co.uk +ads.tripican.com +ads.tripod.com +ads.tripod.lycos.co.uk +ads.tripod.lycos.de +ads.tripod.lycos.es +ads.tripod.lycos.it +ads.tripod.lycos.nl +ads.tripod.spray.se +ads.tromaville.com +ads.trutv.com +ads.tso.dennisnet.co.uk +ads.tucows.com +ads.tunein.com +ads.turkticaret.net +ads.tv7.sporta.bg +ads.tvadsync.com +ads.tvtv.bg +ads.tw.adsonar.com +ads.twitter.com +ads.ucomics.com +ads.uigc.net +ads.ukclimbing.com +ads.uknetguide.co.uk +ads.ultimate-guitar.com +ads.ultimatesurrender.com +ads.uncrate.com +ads.undertone.com +ads.univision.com +ads.unixathome.org +ads.up-value.de +ads.update.com +ads.uproar.com +ads.urbandictionary.com +ads.urlfan.com +ads.us.e-planning.ne +ads.us.e-planning.net +ads.usatoday.com +ads.usercash.com +ads.userfriendly.org +ads.v-links.net +ads.v3.com +ads.v3exchange.com +ads.vador.com +ads.vaildaily.com +ads.valuead.com +ads.vclick.vn +ads.vegas.com +ads.veloxia.com +ads.ventivmedia.com +ads.veoh.com +ads.verkata.com +ads.verticalresponse.com +ads.verticalscope.com +ads.vesperexchange.com +ads.vg.basefarm.net +ads.vgchartz.com +ads.viber.com +ads.viddler.com +ads.videoadex.com +ads.videoadvertising.com +ads.videofen.com +ads.videohub.tv +ads.videosz.com +ads.vidsense.com +ads.viewlondon.co.uk +ads.viewsignage.com +ads.viksaffiliates.com +ads.vimg.net +ads.vipcams.com +ads.virginislandsdailynews.com +ads.virtual-nights.com +ads.virtualcountries.com +ads.vjaffiliates.com +ads.vkushti.tv +ads.vntsm.com +ads.vnuemedia.com +ads.vnumedia.com +ads.voyit.com +ads.vporn.com +ads.vs.co +ads.vs.com +ads.vserv.mobi +ads.w3hoster.de +ads.w55c.net +ads.waframedia1.com +ads.wanadooregie.com +ads.waps.cn +ads.wapx.cn +ads.warcry.com +ads.watchmygf.net +ads.watershed-publishing.com +ads.watson.ch +ads.wave.si +ads.weather.ca +ads.weather.com +ads.web.alwayson-network.com +ads.web.aol.com +ads.web.compuserve.com +ads.web.cs.com +ads.web.de +ads.web1tv.de +ads.web21.com +ads.webattack.com +ads.webcafe.bg +ads.webcamclub.com +ads.webcoretech.com +ads.webfeat.com +ads.webground.bg +ads.webheat.com +ads.webhosting.info +ads.webindia123.com +ads.webisleri.com +ads.webkinz.com +ads.webmasterpoint.org +ads.webmd.com +ads.webnet.advance.net +ads.websearch.com +ads.webshots.com +ads.websiteservices.com +ads.websponsors.com +ads.webtools24.net +ads.weissinc.com +ads.wellsmedia.com +ads.weownthetraffic.com +ads.whaleads.com +ads.whi.co.nz +ads.whippedass.com +ads.whitelabelpros.com +ads.whoishostingthis.com +ads.wiezoekje.nl +ads.wikia.nocookie.net +ads.wikipartes.com +ads.wineenthusiast.com +ads.winsite.com +ads.wnd.com +ads.worddictionary.co.uk +ads.worldstarhiphop.com +ads.worthplaying.com +ads.wsrs.net +ads.wunderground.com +ads.wwe.biz +ads.x10.com +ads.x10.net +ads.x17online.com +ads.xbiz.com +ads.xbox-scene.com +ads.xboxic.com +ads.xda-developers.com +ads.xhamster.com +ads.xpg.com.br +ads.xposed.com +ads.xprofiles.com +ads.xtargeting.com +ads.xtra.ca +ads.xtra.co.nz +ads.xtramsn.co.nz +ads.xtribeapp.com +ads.xxxad.net +ads.xxxbunker.com +ads.y-0.net +ads.yadro.ru +ads.yahoo.com +ads.yam.com +ads.yankscash.com +ads.yap.yahoo.com +ads.yeshanews.com +ads.yieldmedia.net +ads.yieldmo.com +ads.yimg.com +ads.yimg.com.edgesuite.net +ads.yldmgrimg.net +ads.ynot.com +ads.youporn.com +ads.yourfreedvds.com +ads.youtube.com +ads.yvmads.com +ads.zajenata.bg +ads.zamunda.net +ads.zamunda.se +ads.zap2it.com +ads.zdnet.com +ads.zedo.com +ads.zeusclicks.com +ads.ztod.com +ads.zynga.com +ads0.okcupid.com +ads01.com +ads01.focalink.com +ads01.hyperbanner.net +ads02.focalink.com +ads02.hyperbanner.net +ads03.focalink.com +ads03.hyperbanner.net +ads03.redtube.com +ads04.focalink.com +ads04.hyperbanner.net +ads05.focalink.com +ads05.freecity.de +ads05.hyperbanner.net +ads06.focalink.com +ads06.hyperbanner.net +ads07.focalink.com +ads07.hyperbanner.net +ads08.focalink.com +ads08.hyperbanner.net +ads09.focalink.com +ads09.hyperbanner.net +ads1-adnow.com +ads1.activeagent.at +ads1.ad-flow.com +ads1.admedia.ro +ads1.advance.net +ads1.advertwizard.com +ads1.ami-admin.com +ads1.beta.lt +ads1.canoe.ca +ads1.cricbuzz.com +ads1.destructoid.com +ads1.empiretheatres.com +ads1.ero-advertising.com +ads1.erotism.com +ads1.eudora.com +ads1.globeandmail.com +ads1.itadnetwork.co.uk +ads1.jev.co.za +ads1.legalworld.bg +ads1.mediacapital.pt +ads1.mojiva.com +ads1.msads.net +ads1.msn.com +ads1.nexdra.com +ads1.omdadget.com +ads1.perfadbrite.com.akadns.net +ads1.performancingads.com +ads1.realcities.com +ads1.revenue.net +ads1.rne.com +ads1.speedbit.com +ads1.sptimes.com +ads1.theglobeandmail.com +ads1.tripod.com +ads1.ucomics.com +ads1.udc.advance.net +ads1.updated.com +ads1.virtual-nights.com +ads1.virtumundo.com +ads1.zdnet.com +ads10.focalink.com +ads10.gladen.bg +ads10.hyperbanner.net +ads10.speedbit.com +ads10.udc.advance.net +ads11.focalink.com +ads11.hyperbanner.net +ads11.udc.advance.net +ads12.focalink.com +ads12.hyperbanner.net +ads12.udc.advance.net +ads13.focalink.com +ads13.hyperbanner.net +ads13.udc.advance.net +ads13000.cpmoz.com +ads14.bpath.com +ads14.focalink.com +ads14.hyperbanner.net +ads14.udc.advance.net +ads15.bpath.com +ads15.focalink.com +ads15.hyperbanner.net +ads15.udc.advance.net +ads16.advance.net +ads16.focalink.com +ads16.hyperbanner.net +ads16.udc.advance.net +ads17.focalink.com +ads17.hyperbanner.net +ads18.focalink.com +ads18.hyperbanner.net +ads180.com +ads19.focalink.com +ads1a.depositfiles.com +ads2-adnow.com +ads2.ad-flow.com +ads2.adbrite.com +ads2.advance.net +ads2.advertwizard.com +ads2.blastro.com +ads2.brazzers.com +ads2.canoe.ca +ads2.clearchannel.com +ads2.clickad.com +ads2.collegclub.com +ads2.collegeclub.com +ads2.contentabc.com +ads2.drivelinemedia.com +ads2.ekologia.pl +ads2.emeraldcoast.com +ads2.eqads.com +ads2.ero-advertising.com +ads2.evz.ro +ads2.exhedra.com +ads2.firingsquad.com +ads2.gamecity.net +ads2.greystripe.com +ads2.haber3.com +ads2.helpos.com +ads2.ihaberadserver.com +ads2.jubii.dk +ads2.ljworld.com +ads2.mediaarmor.com +ads2.mojiva.com +ads2.msads.net +ads2.msn.com +ads2.mynet.com +ads2.net-communities.co.uk +ads2.newtimes.com +ads2.nextmedia.bg +ads2.oneplace.com +ads2.opensubtitles.org +ads2.osdn.com +ads2.pittsburghlive.com +ads2.realcities.com +ads2.revenue.net +ads2.rne.com +ads2.rp.pl +ads2.servebom.com +ads2.speedbit.com +ads2.theglobeandmail.com +ads2.udc.advance.net +ads2.vasmg.com +ads2.virtual-nights.com +ads2.virtumundo.com +ads2.vortexmediagroup.com +ads2.weblogssl.com +ads2.williamhill.com +ads2.xnet.cz +ads2.zamunda.net +ads2.zdnet.com +ads2.zeusclicks.com +ads20.adcolony.com +ads20.focalink.com +ads2000.hw.net +ads2004.treiberupdate.de +ads21.focalink.com +ads22.focalink.com +ads23.focalink.com +ads234.com +ads24.focalink.com +ads25.focalink.com +ads2ads.net +ads2srv.com +ads3.ad-flow.com +ads3.adman.gr +ads3.advance.net +ads3.advertwizard.com +ads3.bangkokpost.co.th +ads3.blastro.com +ads3.canoe.ca +ads3.contentabc.com +ads3.freebannertrade.com +ads3.gamecity.net +ads3.haber3.com +ads3.ihaberadserver.com +ads3.jubii.dk +ads3.kompasads.com +ads3.moitepari.bg +ads3.mojiva.com +ads3.realcities.com +ads3.speedbit.com +ads3.udc.advance.net +ads3.virtual-nights.com +ads3.virtumundo.com +ads3.zdnet.com +ads345.com +ads36.hyperbanner.net +ads360.com +ads4.ad-flow.com +ads4.advance.net +ads4.advertwizard.com +ads4.canoe.ca +ads4.clearchannel.com +ads4.gamecity.net +ads4.kompasads.com +ads4.mojiva.com +ads4.realcities.com +ads4.speedbit.com +ads4.udc.advance.net +ads4.virtual-nights.com +ads4.virtumundo.com +ads4cheap.com +ads4homes.com +ads4pubs.com +ads5.ad-flow.com +ads5.admatic.com.tr +ads5.advance.net +ads5.advertwizard.com +ads5.canoe.ca +ads5.fxdepo.com +ads5.kompasads.com +ads5.mconetwork.com +ads5.mojiva.com +ads5.sabah.com.tr +ads5.speedbit.com +ads5.truecaller.com +ads5.udc.advance.net +ads5.virtual-nights.com +ads5.virtumundo.com +ads56-us-east.stickyadstv.com +ads6.ad-flow.com +ads6.advance.net +ads6.advertwizard.com +ads6.gamecity.net +ads6.kompasads.com +ads6.speedbit.com +ads6.udc.advance.net +ads7.ad-flow.com +ads7.advance.net +ads7.advertwizard.com +ads7.gamecity.net +ads7.speedbit.com +ads7.udc.advance.net +ads8.ad-flow.com +ads8.advertwizard.com +ads8.com +ads8.kompasads.com +ads8.speedbit.com +ads8.udc.advance.net +ads80.com +ads9.ad-flow.com +ads9.advertwizard.com +ads9.speedbit.com +ads9.udc.advance.net +adsadmin.aspentimes.com +adsadmin.corusradionetwork.com +adsadmin.vaildaily.com +adsafeprotected.com +adsafiliados.com.br +adsances.ero-advertising.com +adsapi.chartbeat.com +adsatt.abc.starwave.com +adsatt.abcnews.starwave.com +adsatt.disney.starwave.com +adsatt.espn.go.com +adsatt.espn.starwave.com +adsatt.familyfun.starwave.com +adsatt.go.starwave.com +adsatt.movies.starwave.com +adsbb.dfiles.eu +adsbizsimple.com +adsbookie.com +adsbox.detik.com +adsbtrk.com +adsby.bidtheatre.com +adsby.klikki.com +adsby.webtraffic.se +adscale.de +adscampaign.net +adscan.yelabapp.com +adscendmedia.com +adscholar.com +adscience.nl +adsclick.qq.com +adscpm.com +adsdaq.com +adsdk.qwapi.com +adsdk.siliconorchard.com +adsdk.vrvm.com +adsearch.adkontekst.pl +adsearch.pl +adsearch.wp.pl +adsearch.www1.biz +adselect.nuggad.net +adsend.de +adsense.apps.wix.com +adsense.clicking.com.tw +adsensecustomsearchads.com +adsentnetwork.com +adserer.ihigh.com +adserv.adbonus.com +adserv.aip.org +adserv.bravenet.com +adserv.bulletinmarketing.com +adserv.entriq.net +adserv.free6.com +adserv.gamezone.de +adserv.geocomm.com +adserv.iafrica.com +adserv.impactengine.com +adserv.internetfuel.com +adserv.jupiter.com +adserv.lwmn.net +adserv.maineguide.com +adserv.mako.co.il +adserv.muchosucko.com +adserv.mywebtimes.com +adserv.net +adserv.pitchforkmedia.com +adserv.postbulletin.com +adserv.qconline.com +adserv.quality-channel.de +adserv.roundrockmedia.com +adserv.usps.com +adserv001.adtech.de +adserv001.adtech.fr +adserv001.adtech.us +adserv002.adtech.de +adserv002.adtech.fr +adserv002.adtech.us +adserv003.adtech.de +adserv003.adtech.fr +adserv003.adtech.us +adserv004.adtech.de +adserv004.adtech.fr +adserv004.adtech.us +adserv005.adtech.de +adserv005.adtech.fr +adserv005.adtech.us +adserv006.adtech.de +adserv006.adtech.fr +adserv006.adtech.us +adserv007.adtech.de +adserv007.adtech.fr +adserv007.adtech.us +adserv008.adtech.de +adserv008.adtech.fr +adserv008.adtech.us +adserv2.bravenet.com +adservant.guj.de +adserve-east.technologygeeks.com +adserve.adtoll.com +adserve.ams.rhythmxchange.com +adserve.canadawidemagazines.com +adserve.city-ad.com +adserve.cpmba.se +adserve.donanimhaber.com +adserve.doteasy.com +adserve.ehpub.com +adserve.gossipgirls.com +adserve.kikizo.com +adserve.mizzenmedia.com +adserve.podaddies.com +adserve.postrelease.com +adserve.profit-smart.com +adserve.shopzilla.com +adserve.splicetoday.com +adserve.viaarena.com +adserve.video +adserve5.nikkeibp.co.jp +adserver-2.ig.com.br +adserver-3.ig.com.br +adserver-4.ig.com.br +adserver-5.ig.com.br +adserver-a-amt.adtech.de +adserver-a-frr.adtech.de +adserver-a-mtc.adtechus.com +adserver-a-northeast-1.adtechjp.com +adserver-a-scd.adtechus.com +adserver-a-southeast-1.adtechjp.com +adserver-a-toy.adtechjp.com +adserver-as.adtech.advertising.com +adserver-clarium-446793891.us-east-1.elb.amazonaws.com +adserver-dpamt.adtech.de +adserver-dpfrr.adtech.de +adserver-e7.com +adserver-east.adtechus.com +adserver-east.extend.tv +adserver-espnet.sportszone.net +adserver-eu.adtech.advertising.com +adserver-images.adikteev.com +adserver-nbamt.adtech.de +adserver-nbfrr.adtech.de +adserver-origin-ap-northeast-1.adtechjp.com +adserver-origin-ap-southeast-1.adtechjp.com +adserver-origin.adtechjp.com +adserver-qcamt.adtech.de +adserver-qcfrr.adtech.de +adserver-qcmtc.adtechus.com +adserver-qcscd.adtechus.com +adserver-toy.adtechjp.com +adserver-us.adtech.advertising.com +adserver-voice-online.co.uk +adserver-west.adtechus.com +adserver.100free.com +adserver.163.com +adserver.2618.com +adserver.383media.net +adserver.3digit.de +adserver.43plc.com +adserver.4clicks.org +adserver.71i.de +adserver.a.in.monster.com +adserver.abv.bg +adserver.aceofmedia.com +adserver.ad-it.dk +adserver.adbull.com +adserver.adigitalrepublic.com +adserver.adreactor.com +adserver.adrelevantis.com +adserver.adremedy.com +adserver.ads-srv.net +adserver.ads360.com +adserver.adserver.com.pl +adserver.adsimsar.net +adserver.adsincontext.com +adserver.adswizz.com +adserver.adtech.de +adserver.adtech.fr +adserver.adtech.us +adserver.adtechjp.com +adserver.adtechus.com +adserver.adtz.com +adserver.adultfriendfinder.com +adserver.advertisespace.com +adserver.advertisingbox.com +adserver.advertist.com +adserver.affiliatemg.com +adserver.affiliation.com +adserver.aidameter.com +adserver.aim4media.com +adserver.airmiles.ca +adserver.akamanda.com +adserver.akqa.net +adserver.allheadlinenews.com +adserver.allinviews.com +adserver.allinviews.com.herokudns.com +adserver.alt.com +adserver.amna.gr +adserver.amnews.com +adserver.ancestry.com +adserver.anemo.com +adserver.anm.co.uk +adserver.aol.advertising.com +adserver.aol.fr +adserver.aptdynamics.com +adserver.archant.co.uk +adserver.artempireindustries.com +adserver.arttoday.com +adserver.asiafriendfinder.com +adserver.atari.net +adserver.b2c.com +adserver.beeviewd.com +adserver.beeviewd.com.herokudns.com +adserver.bestcontentonline.com +adserver.betandwin.de +adserver.billiger-surfen.de +adserver.billiger-telefonieren.de +adserver.bing.com +adserver.bizhat.com +adserver.bizland-inc.net +adserver.bloodhorse.com +adserver.bluereactor.com +adserver.bluereactor.net +adserver.bluewin.ch +adserver.bondage.com +adserver.borsaitaliana.it +adserver.borsonline.hu +adserver.break-even.it +adserver.buttonware.com +adserver.buttonware.net +adserver.cams.com +adserver.cantv.net +adserver.cebu-online.com +adserver.cheatplanet.com +adserver.chickclick.com +adserver.click4cash.de +adserver.clix.pt +adserver.clubic.com +adserver.clubs1.bg +adserver.clundressed.com +adserver.co.il +adserver.colleges.com +adserver.com +adserver.com-solutions.com +adserver.comparatel.fr +adserver.conjelco.com +adserver.corusradionetwork.com +adserver.creative-asia.com +adserver.creativeads.ro +adserver.creativeinspire.com +adserver.dayrates.com +adserver.dbusiness.com +adserver.densitymedia.com +adserver.dev.khingtracking.com +adserver.devel.adswizz.com +adserver.developersnetwork.com +adserver.devx.com +adserver.digitalmedianet.com +adserver.digitalpartners.com +adserver.digitoday.com +adserver.directcorp.de +adserver.directforce.com +adserver.directforce.net +adserver.directworksmedia.com +adserver.dnps.com +adserver.dotcommedia.de +adserver.dotmusic.com +adserver.economic.bg +adserver.eham.net +adserver.emapadserver.com +adserver.emporis.com +adserver.emulation64.com +adserver.eudora.com +adserver.euronics.de +adserver.eva2000.com +adserver.exgfnetwork.com +adserver.exoticads.com +adserver.expatica.nxs.nl +adserver.eyeonx.ch +adserver.ezwebsitetraffic.com +adserver.ezzhosting.com +adserver.filefront.com +adserver.fixionmedia.com +adserver.flossiemediagroup.com +adserver.fmpub.net +adserver.fr.adtech.de +adserver.freecity.de +adserver.freenet.de +adserver.friendfinder.com +adserver.gadu-gadu.pl +adserver.gallerytrafficservice.com +adserver.game-focus.net +adserver.gameparty.net +adserver.gamesquad.net +adserver.garden.com +adserver.gecce.com +adserver.goodnuze.com +adserver.gorillanation.com +adserver.gr +adserver.gtcmovies.com +adserver.gunaxin.com +adserver.hardsextube.com +adserver.hardwareanalysis.com +adserver.harktheherald.com +adserver.harvestadsdepot.com +adserver.hellasnet.gr +adserver.hg-computer.de +adserver.hi-m.de +adserver.hispanoclick.com +adserver.hispavista.com +adserver.hk.outblaze.com +adserver.home.pl +adserver.hostinteractive.com +adserver.hotfix.adswizz.com +adserver.html.it +adserver.humanux.com +adserver.hwupgrade.it +adserver.icmedienhaus.de +adserver.ifmagazine.com +adserver.ig.com.br +adserver.ign.com +adserver.ilmessaggero.it +adserver.ilounge.com +adserver.iminent.com +adserver.infinit.net +adserver.infotiger.com +adserver.installfarm.com +adserver.intentiq.com +adserver.interfree.it +adserver.inwind.it +adserver.iprom.net +adserver.irishwebmasterforum.com +adserver.ision.de +adserver.isonews.com +adserver.ixm.co.uk +adserver.jacotei.com.br +adserver.janes.com +adserver.janes.net +adserver.janes.org +adserver.janesguide.com +adserver.jolt.co.uk +adserver.journalinteractive.com +adserver.juicyads.com +adserver.kcilink.com +adserver.khingtracking.com +adserver.killeraces.com +adserver.kimia.es +adserver.kissfm.ro +adserver.kontextua.com +adserver.kylemedia.com +adserver.lanacion.com.ar +adserver.lanepress.com +adserver.latimes.com +adserver.legacy-network.com +adserver.libero.it +adserver.linktrader.co.uk +adserver.livejournal.com +adserver.lonuncavisto.com +adserver.lostreality.com +adserver.lunarpages.com +adserver.lycos.co.jp +adserver.m2kcore.com +adserver.magazyn.pl +adserver.matchcraft.com +adserver.merc.com +adserver.merciless.localstars.com +adserver.millionairemate.com +adserver.mindshare.de +adserver.ministryofads.com +adserver.mixedtraffic.com +adserver.mobsmith.com +adserver.moitepari.bg +adserver.monster.com +adserver.monstersandcritics.com +adserver.motonews.pl +adserver.mrnetworks.de +adserver.myownemail.com +adserver.netcollex.co.uk +adserver.netcollins.com +adserver.netcreators.nl +adserver.netshelter.net +adserver.newdigitalgroup.com +adserver.newmassmedia.net +adserver.news-journalonline.com +adserver.news.com +adserver.news.com.au +adserver.newtimes.com +adserver.ngz-network.de +adserver.nydailynews.com +adserver.nzoom.com +adserver.o2.pl +adserver.oddschecker.com +adserver.omroepzeeland.nl +adserver.online-tech.com +adserver.onlinesyn.com +adserver.onwisconsin.com +adserver.openx.co.za +adserver.outpersonals.com +adserver.panaceapublishing.com +adserver.pandora.com +adserver.passion.com +adserver.phatmax.net +adserver.phillyburbs.com +adserver.pl +adserver.placeyourview.com +adserver.planet-multiplayer.de +adserver.plastikcity.com +adserver.playtv.fr +adserver.plhb.com +adserver.pollstar.com +adserver.portal.pl +adserver.portalofevil.com +adserver.portugalmail.net +adserver.portugalmail.pt +adserver.powerlinks.com +adserver.pressboard.ca +adserver.pressflex.com +adserver.prodigy.net +adserver.proteinos.com +adserver.radio-canada.ca +adserver.radiomediagroup.org +adserver.rankedbyreview.com +adserver.ratestar.net +adserver.reklamstore.com +adserver.revver.com +adserver.ro +adserver.rtvutrechtreclame.nl +adserver.sabc.co.za +adserver.sabcnews.co.za +adserver.sandbox.cxad.cxense.com +adserver.sanomawsoy.fi +adserver.saxonsoft.hu +adserver.sciflicks.com +adserver.scmp.com +adserver.securityfocus.com +adserver.seniorfriendfinder.com +adserver.sextracker.com +adserver.shadow.snapads.com +adserver.sharewareonline.com +adserver.shoofle.tv +adserver.singnet.com +adserver.sitesense.com +adserver.sl.kharkov.ua +adserver.smashtv.com +adserver.snapads.com +adserver.snowball.com +adserver.softonic.com +adserver.softure.com +adserver.softwareonline.com +adserver.soloserver.com +adserver.spankaway.com +adserver.spctl.com +adserver.sprintdisk.com +adserver.spritmonitor.de +adserver.staging.adswizz.com +adserver.staging.snapads.com +adserver.swiatobrazu.pl +adserver.synergetic.de +adserver.tappsgames.com +adserver.te.pt +adserver.telalink.net +adserver.tele.net +adserver.telekom.de +adserver.teracent.net +adserver.terra.com.br +adserver.terra.es +adserver.theappgrader.com +adserver.theknot.com +adserver.theonering.net +adserver.thirty4.com +adserver.thisislondon.co.uk +adserver.tilted.net +adserver.tqs.ca +adserver.track-star.com +adserver.trader.ca +adserver.trafficsyndicate.com +adserver.trb.com +adserver.tribuneinteractive.com +adserver.trojaner-info.de +adserver.tsgadv.com +adserver.tulsaworld.com +adserver.tvcatchup.com +adserver.tweakers.net +adserver.twitpic.com +adserver.ubiyoo.com +adserver.ugo.com +adserver.ugo.nl +adserver.ukplus.co.uk +adserver.uproxx.com +adserver.usermagnet.com +adserver.valuemd.com +adserver.van.net +adserver.veruta.com +adserver.viagogo.com +adserver.viewbix.com +adserver.viewsignage.com +adserver.virgin.net +adserver.virginmedia.com +adserver.virtualminds.nl +adserver.virtuous.co.uk +adserver.voir.ca +adserver.weakgame.com +adserver.webads.co.uk +adserver.webads.it +adserver.webads.nl +adserver.webstatsserver.de +adserver.wemnet.nl +adserver.wietforum.nl +adserver.x3.hu +adserver.xpanama.net +adserver.ya.com +adserver.yahoo.com +adserver.zaz.com.br +adserver.zeads.com +adserver01.ancestry.com +adserver01.de +adserver1-images.backbeatmedia.com +adserver1.adbrands.co.il +adserver1.adserver.com.pl +adserver1.adtech.com.tr +adserver1.backbeatmedia.com +adserver1.economist.com +adserver1.eudora.com +adserver1.harvestadsdepot.com +adserver1.hookyouup.com +adserver1.isohunt.com +adserver1.lokitorrent.com +adserver1.mediainsight.de +adserver1.mindshare.de +adserver1.ogilvy-interactive.de +adserver1.realtracker.com +adserver1.sonymusiceurope.com +adserver1.teracent.net +adserver1.wmads.com +adserver2.adserver.com.pl +adserver2.atman.pl +adserver2.blueadvertise.com +adserver2.christianitytoday.com +adserver2.condenast.co.uk +adserver2.creative.com +adserver2.eudora.com +adserver2.exgfnetwork.com +adserver2.goals365.com +adserver2.mediainsight.de +adserver2.mindshare.de +adserver2.news-journalonline.com +adserver2.popdata.de +adserver2.realtracker.com +adserver2.teracent.net +adserver3.eudora.com +adserver4.eudora.com +adserver4.fluent.ltd.uk +adserver9.contextad.com +adserverams.adtech.de +adserverb.conjelco.com +adserverc.allinviews.com +adserverc.cliipa.com +adserverc.shoofle.tv +adservercin.allinviews.com +adservercin.shoofle.tv +adserverec.adtechus.com +adserverplus.com +adserverpub.com +adservers-users-1-1251423768.us-east-1.elb.amazonaws.com +adservers.selfserve.rubiconproject.com +adserversolutions.com +adserverus.info +adserverwc.adtechus.com +adservice.aliexpress.com +adservice.google.ca +adservice.google.co.in +adservice.google.com +adservice.google.com.au +adservice.google.nl +adservices.cmp.advertising.com +adservices.google.com +adservices.picadmedia.com +adservicestats.com +adserving.autotrader.com +adserving.cpxinteractive.com +adserving.favorit-network.com +adserving.fyi-marketing.com +adserving.muppetism.com +adserving.unibet.com +adserving03.epi.es +adservingcentral.com +adservinginternational.com +adservone.com +adserwer.afilo.pl +adserwer.o2.pl +adseu.novem.pl +adsfac.eu +adsfac.net +adsfac.us +adsfeed3.brabys.co.za +adsfile.qq.com +adsflame.com +adsgangsta.com +adsgen.bangbros.com +adsgroup.qq.com +adsharenetwork.com +adsheads.go2affise.com +adshmct.qq.com +adshmmsg.qq.com +adshow.it168.com +adshufffle.com +adsid.rtb.adx1.com +adside.com +adsiduous.rtb.adx1.com +adsim.sabah.com.tr +adsimg.kompas.com +adsinimages.com +adsino24.com +adsintl.starwave.com +adsk2.co +adskape.ru +adsklick.de +adslvfile.qq.com +adslvseed.qq.com +adsm.gameforge.de +adsm.soush.com +adsmarket.com +adsmart.co.uk +adsmart.com +adsmart.net +adsmogo.com +adsmws.cloudapp.net +adsnative.com +adsnative.rtb.adx1.com +adsnew.gsmarena.com +adsnew.internethaber.com +adsnew.userfriendly.org +adsniper.ru +adsoftware.com +adsoldier.com +adsomenoise.cdn01.rambla.be +adson.awempire.com +adsonar.com +adsorb.com +adsp.ciner.com.tr +adsp.haberturk.com +adspacds.ero-advertising.com +adspace.zaman.com.tr +adspaces.ero-ades.ero-advertising.com +adspaces.ero-advertising.com +adspaces.ero-apaces.ero-advertising.com +adspaces2.ero-advertising.com +adspaes.ero-advertising.com +adspages.ero-advertising.com +adspcces.ero-advertising.com +adspeed.net +adspirit.de +adspirit.net +adspiro.pl +adsplius.lt +adsponse.de +adspr.haber7.net +adspserving.com +adsqqclick.qq.com +adsr3pg.com.br +adsradios.adswizz.com +adsrc.bankrate.com +adsremote.scripps.com +adsremote.scrippsnetwork.com +adsrevenue.net +adsrich.qq.com +adsrv.adplus.co.id +adsrv.ads.eniro.com +adsrv.advanced-television.tv +adsrv.bangbros.com +adsrv.bankrate.com +adsrv.deviantart.com +adsrv.dispatch.com +adsrv.ea.com +adsrv.eacdn.com +adsrv.emporis.com +adsrv.fashion.bg +adsrv.heraldtribune.com +adsrv.hpg.com.br +adsrv.iol.co.za +adsrv.lua.pl +adsrv.news.com.au +adsrv.tuscaloosanews.com +adsrv.wilmingtonstar.com +adsrv1.tapad.com +adsrv2.ihlassondakika.com +adsrv2.wilmingtonstar.com +adsrvmedia.adk2.co +adsrvmedia.adk2x.com +adsrvr.com +adsrvr.org +adss.comeadvertisewithus.com +adssl-dc2.adtech.de +adssl01.adtech.de +adssl01.adtech.fr +adssl01.adtech.us +adssl02.adtech.de +adssl02.adtech.fr +adssl02.adtech.us +adsspace.net +adsspaces.ero-advertising.com +adssrv.nationmultimedia.com +adsstat.com +adstaces.ero-advertising.com +adstage.io +adstat.4u.pl +adstats-shadow.snapads.com +adstats.adviva.net +adstats.snapads.com +adstest.reklamstore.com +adstest.weather.com +adstextview.qq.com +adstil.indiatimes.com +adstogo.com +adstome.com +adstrac.adk2x.com +adstract.adk2x.com +adstream.cardboardfish.com +adstreams.org +adsttc.com +adstxt.adnxs.com +adsupply.com +adsupplyads.net +adsvert.com +adsvids.com +adsvidsdouble.com +adsview.qq.com +adsview2.qq.com +adsvr.adknowledge.com +adsvr.deviantart.com +adswakeup.com +adsweb.tiscali.cz +adsweb.tiscali.it +adswizz.com +adsx.greystripe.com +adsx.unityads.unity3d.com +adsxyz.com +adsy.mail.bg +adsymptotic.com +adsyndication.msn.com +adsyndication.yelldirect.com +adsynergy.com +adsys.adk2x.com +adsys.insert.bg +adsys.townnews.com +adsyst.biz +adsystem.adbull.com +adsystem.simplemachines.org +adt.m7z.net +adtactics.com +adtag.admarketplace.net +adtag.asiaone.com +adtag.msn.ca +adtag.staging.adlightning.com +adtag.sympatico.ca +adtago.s3.amazonaws.com +adtags-core-03-eu.adtags.pro +adtaily.com +adtaily.pl +adtcp.ru +adtech.advertising.com +adtech.com +adtech.de +adtech.panthercustomer.com +adtech.sabitreklam.com +adtechjp.com +adtechus.com +adtegrity.com +adtegrity.net +adtegrity.spinbox.net +adtekmedia.com +adtest.qwapi.com +adtext.pl +adtgs.adk2.co +adtgs.com +adthis.com +adthrive.com +adthru.com +adtier.toboads.com +adtiger.de +adtigerpl.adspirit.net +adtilt.com +adtlgc.com +adtoll.com +adtology.com +adtology3.com +adtoma.com +adtools.gossipkings.com +adtools.matrix-cash.com +adtools2.amakings.com +adtotal.pl +adtouchlabs.com +adtrace.org +adtrack.cimedia.net +adtrack.link.ch +adtrack.voicestar.com +adtrack1.waw.pl +adtracker.inmobi.com +adtracking.vinden.nl +adtrade.net +adtrade.ro +adtrader.com +adtradr.com +adtradradservices.com +adtrak.net +adtriplex.com +adturtle.biz +adtz.com +adult.foxcounter.com +adult.shengen.ru +adultadvertising.com +adultadworld.com +adultadworld.directtrack.com +adultcomix.biz +adultdatingtest.worlddatingforum.com +adultfriendfinder.com +adultimate.net +adultlinksco.com +adultmoda.com +adultmoneymakers.com +adunit.cdn.auditude.com +adunit.chango.ca +adunit.chango.com +adv-adserver.com +adv-banner.libero.it +adv-mydarkness.ggcorp.me +adv-op2.joygames.me +adv.0tub.com +adv.440net.com +adv.440network.com +adv.abv.bg +adv.adgates.com +adv.adtotal.pl +adv.adultpartnership.com +adv.adview.pl +adv.aftonbladet.se +adv.alice.it +adv.all-free-download.com +adv.alo.bg +adv.api.admedia.com +adv.aport.ru +adv.arubamediamarketing.it +adv.axiatraders.com +adv.bannercity.ru +adv.bbanner.it +adv.blogupp.com +adv.bol.bg +adv.bookclubservices.ca +adv.casinopays.com +adv.consadbg.com +adv.cooperhosting.net +adv.deltanews.bg +adv.domino.it +adv.dontcrack.com +adv.drtuber.com +adv.elaana.com +adv.federalpost.ru +adv.freeonline.it +adv.freepornvs.com +adv.gazeta.pl +adv.gepime.com +adv.grandonmedia.com +adv.gratuito.st +adv.h2porn.com +adv.hwupgrade.it +adv.ilsecoloxix.it +adv.ilsole24ore.it +adv.lampsplus.com +adv.livedoor.com +adv.mangoadv.com +adv.marica.bg +adv.medicine.bg +adv.medscape.com +adv.merlin.co.il +adv.netinfo.bg +adv.netshelter.net +adv.nexthardware.com +adv.p2pbg.com +adv.publy.net +adv.punto-informatico.it +adv.r7.com +adv.riza.it +adv.rockstar.bg +adv.sec.intl.miui.com +adv.sexcounter.com +adv.speednet.bg +adv.starozagorci.com +adv.strategy.it +adv.stznews.bg +adv.surinter.net +adv.swzone.it +adv.technews.bg +adv.tgadvapps.it +adv.uauaclub.it +adv.virgilio.it +adv.webmd.com +adv.webvariant.com +adv.wisdom.bg +adv.wp.pl +adv.yo.cz +adv.zapal.ru +adv0005.247realmedia.com +adv0035.247realmedia.com +adv2.expres.ua +advaction.ru +advancedcleaner.com +advancedigital-d.openx.net +advancedmactools.com +advancedmn.us.intellitxt.com +advancedsoftwaresupport.com +advancetec.co.uk +advancing-technology.com +advandmedia-banner-desktop.rtb.adx1.com +advandmedia-banner-mobile.rtb.adx1.com +advandmedia-native.rtb.adx1.com +advariant.com +advconversion.com +advdl.ammadv.it +adve.net +adveng.hiasys.com +adventory.com +adventurefeeds-reklam.rtb.adx1.com +adventurefeeds.com +adver.pengyou.com +adveraction.pl +adversal.mgr.consensu.org +adverserve.austriacomplus.at +advert.ananzi.co.za +advert.bayarea.com +advert.dyna.ultraweb.hu +advert.eurotip.cz +advert.exaccess.ru +advert.funimation.com +advert.gameranger.com +advert.gittigidiyor.com +advert.istanbul.net +advert.leo.org +advert.livesportmedia.eu +advert.mediaswiss.rs +advert.rare.ru +advert.ru.redtram.com +advert.runescape.com +advert.technews.bg +advert.travlang.com +advert.uloz.to +advert.uzmantv.com +advert2.ananzi.co.za +advertere.zamunda.net +adverteren.vakmedianet.nl +adverterenbijnh.nl +adverterenbijsbs.nl +adverticum.com +adverticum.net +adverticus.de +advertise.com +advertiseireland.com +advertisement.avosapps.us +advertisement.bg +advertisementafterthought.com +advertisementnl.112.2o7.net +advertiser.fyber.com +advertiser.mylead.pl +advertisers.admedia.com +advertisers.federatedmedia.net +advertisers.tapjoy.com +advertisersegment.inmobi.com +advertiserurl.com +advertisespace.com +advertising.aol.com +advertising.bayoubuzz.com +advertising.bbcworldwide.com +advertising.com +advertising.dclux.com +advertising.embarcaderopublishing.com +advertising.entensity.net +advertising.ezanga.com +advertising.finditt.com +advertising.fussball-liveticker.eu +advertising.gfxartist.com +advertising.goldseek.com +advertising.hiasys.com +advertising.illinimedia.com +advertising.ingame.de +advertising.justusboys.net +advertising.online-media24.de +advertising.paltalk.com +advertising.rockettube.net +advertising.seenews.com +advertising.thediabetesnetwork.com +advertising.wellpack.fr +advertising.yandex.ru +advertising.zenit.org +advertisingagent.com +advertisingbanners.com +advertisingbay.com +advertisingbeacon.co.uk +advertisingbox.com +advertisingcom.122.2o7.net +advertisingnemesis.com +advertisingtag.net +advertlets.com +advertmarket.com +advertmedia.de +advertpro.investorvillage.com +advertpro.sitepoint.com +advertpro.ya.com +adverts.carltononline.com +adverts.creativemark.co.uk +adverts.digitalspy.co.uk +adverts.ecn.co.uk +adverts.freeloader.com +adverts.im4ges.com +advertserve.com +advertstream.com +advertwizard.com +advfromnwl.com +advice-ads-cdn.vice.com +advice-ads.s3.amazonaws.com +advice.hit.gemius.pl +advicead.hit.gemius.pl +advicepl.adocean.pl +advideo.uimserv.net +advidi.com +adview.pl +adview.ppro.de +adviserplus.com +advisormedia.cz +adviva.net +advizi.ru +advloc.alice.it +advmaker.ru +advnt.com +advombat.ru +advplace.com +advplace.nuggad.net +advrts-1.revenue-tracker.com +advs.adgorithms.com +advserver.xyz +advstat.xunlei.com +advt.webindia123.com +advzilla.com +adw.ero-advertising.com +adw.sapo.pt +adware.kogaryu.com +adwareremovergold.com +adwarereport.us.intellitxt.com +adwcleaner.programmesetjeux.com +adwcleaner.telecharger.toggle.com +adweb1.hornymatches.com +adweb2.hornymatches.com +adwenturehelp.club +adwhirl.com +adwitserver.com +adwitty.com +adwords.google.lloymlincs.com +adwords.panadvert.com +adwords2.paretologic.revenuewire.net +adworkmedia.com +adworks.rediff.com +adworldnetwork.com +adworx.at +adworx.be +adworx.nl +adwpaces.ero-advertising.com +adwpro.adwareprof.hop.clickbank.net +adwyze.com +adx.adform.net +adx.adrenalinesk.sk +adx.adspirit.de +adx.allstar.cz +adx.atnext.com +adx.chip.de +adx.darikweb.com +adx.districtm.ca +adx.g.doubleclick.net +adx.gainesvillesun.com +adx.gainesvillsun.com +adx.groupstate.com +adx.hendersonvillenews.com +adx.heraldtribune.com +adx.ibibo.com +adx.ocala.com +adx.petametrics.com +adx.starbanner.com +adx.starnewsonline.com +adx.telegram.com +adx.theledger.com +adx.timesdaily.com +adx1.com +adxcel-ec2.com +adxite-ads.com +adxpansion.com +adxpose.com +adxprts.com +adxprtz.com +adxtrem.com +adxvalue.com +adyea.com +adyoulike.com +adyoulike.omnitagjs.com +adz.afterdawn.net +adz2you.com +adzbazar.com +adzerk.com +adzerk.net +adzerk.s3.amazonaws.com +adzjzewsma.cf +adzoka.com +adzone.ro +adzone.stltoday.com +adzones.com +adzservice.theday.com +ae-gb.mgid.com +ae.adserver.yahoo.com +ae.amgdgt.com +ae.goodsblock.marketgid.com +ae.gsecondscreen.com +ae1-devwebui.dev.corp.mparticle.com +ae1-devwebui1.dev.corp.mparticle.com +ae1-devwebui2.dev.corp.mparticle.com +ae1-devwebui3.dev.corp.mparticle.com +ae1-devwebui4.dev.corp.mparticle.com +ae1-devwebui5.dev.corp.mparticle.com +aehistory.112.2o7.net +aem-six-three.livefyre.com +aeon.crypto-webminer.com +aeon.hashvault.pro +aep.emea.mxptint.net +aep.mxptint.net +aerlingus2.solution.weborama.fr +aero.pixel.optimalq.net +aeros01.tk +aeros02.tk +aeros03.tk +aeros04.tk +aeros05.tk +aeros06.tk +aeros07.tk +aeros08.tk +aeros09.tk +aeros10.tk +aeros11.tk +aeros12.tk +aetn.com.ssl.d1.sc.omtrdc.net +aetnaaetnaprod2018.112.2o7.net +aetv.112.2o7.net +aexp.demdex.net +af-ad.co.uk +af-gb.marketgid.com +af.monetate.net +af2.monetate.net +afa15.com.ne.kr +afantispy.com +afd.adsttc.com +afdbande.cn +afdjljiyagf.ru +afdyfxfrwbfy.com +afe.specificclick.net +afe2.specificclick.net +aff.adsurve.com +aff.adventory.com +aff.creativecdn.com +aff.foxtab.com +aff.gittigidiyor.com +aff.indirdik.com +aff.naughtyconnect.com +aff.primaryads.com +aff.promodeals.nl +aff.ringtonepartner.com +aff.shopmania.bg +aff.summercart.com +aff.tagcdn.com +aff1.gittigidiyor.com +aff12.com +aff2.gittigidiyor.com +aff3.gittigidiyor.com +aff4.gittigidiyor.com +affargenus.112.2o7.net +affbeat.com +affbuzzads.com +affec.tv +affilcrtopcolle.112.2o7.net +affili.net +affiliace.directtrack.com +affiliate-fr.com +affiliate.1800flowers.com +affiliate.2mdn.net +affiliate.a4dtracker.com +affiliate.ab1trk.com +affiliate.adgtracker.com +affiliate.affdirect.com +affiliate.aol.com +affiliate.baazee.com +affiliate.bfashion.com +affiliate.blucigs.com +affiliate.cfdebt.com +affiliate.doubleyourdating.com +affiliate.dtiserv.com +affiliate.exabytes.com.my +affiliate.fr.espotting.com +affiliate.friendlyduck.com +affiliate.gamestop.com +affiliate.gmtracker.com +affiliate.googleusercontent.com +affiliate.gwmtracker.com +affiliate.hbytracker.com +affiliate.imperiaonline.org +affiliate.irotracker.com +affiliate.kitapyurdu.com +affiliate.mercola.com +affiliate.mlntracker.com +affiliate.mogs.com +affiliate.mymall.bg +affiliate.offgamers.com +affiliate.placed.com +affiliate.techstats.net +affiliate.travelnow.com +affiliate.treated.com +affiliate.trk4.com +affiliate.viator.com +affiliatecashpile.go2jump.org +affiliatefuel.com +affiliatefuture.com +affiliategroove.com +affiliates.allposters.com +affiliates.arvixe.com +affiliates.babylon.com +affiliates.bet-at-home.com +affiliates.bhphotovideo.com +affiliates.digitalriver.com +affiliates.eblastengine.com +affiliates.genealogybank.com +affiliates.globat.com +affiliates.hookup.com +affiliates.internationaljock.com +affiliates.lifeselector.com +affiliates.neteller.com +affiliates.pinnaclesports.com +affiliates.rozetka.com.ua +affiliates.streamray.com +affiliates.thinkhost.net +affiliates.thrixxx.com +affiliates.ultrahosting.com +affiliates.upforitnetworks.com +affiliates.yourapprovaltracker.com +affiliatetracking.com +affiliatetracking.net +affiliatewindow.com +affiliation-france.com +affimg.pop6.com +affinity-xml.t.domdex.com +affinity.go2jump.org +affinity.mgr.consensu.org +afflow.18-plus.net +affntwklnk.com +afform.co.uk +affpartners.com +affpool.com +affrh2019.com +affrh2023.com +afftrack.com +afftrack001.com +afftracking.justanswer.com +afi.adocean.pl +afilo.pl +afinder.oewabox.at +afisa.nolsab.space +afisz24.eu +afkarehroshan.com +afminer.com +afp.qiyi.com +afp.tidaltv.com +afraidtoask.us.intellitxt.com +africanmango.pl +africanmango900.pl +afs.ero-advertising.com +afterdawn.us.intellitxt.com +afterview.ru +aftrk.com +afunnygames.com +afx.creativecdn.com +afx.tagcdn.com +ag.innovid.com +ag.tags.crwdcntrl.net +ag.yieldoptimizer.com +ag1.hitbox.com +agamgreetingscom.112.2o7.net +agardomains.com +agbmcom.112.2o7.net +agegreetings.112.2o7.net +agency-stage.truconversion.com +agentanalytics.com +agents.dev.extremereach.com +agents.extremereach.com +agents.extremereach.com.extremereach.com +agisdayra.com +agkn.com +agl-intl.hotstar.com +agl.hotstar.com +agmsnag.112.2o7.net +agora.advertising.com +agreeableprice.com +agreeablestew.com +agreemand.com +agroeconom.kz +agsteier.com +agstracker.com +aguileranude.1stok.com +agwebshots.112.2o7.net +agyahooag.112.2o7.net +ah-gb.marketgid.com +ah-ha.com +ahalogy.com +ahbn1.hitbox.com +ahbn2.hitbox.com +ahbn3.hitbox.com +ahbn4.hitbox.com +aheadday.com +ahh-teens.com +ahror.safin.space +ahzahg6ohb.com +ai-gb.marketgid.com +ai.branch.io +ai.hitbox.com +ai.silverpush.co +ai062.insightexpress.com +ai078.insightexpressai.com +ai087.insightexpress.com +ai113.insightexpressai.com +ai125.insightexpressai.com +aialik.branch.io +aibg.hitbox.com +aibl.hitbox.com +aics.hitbox.com +aid-golf-golfdust-training.tabrays.com +aidl-dev1001.data.corp.inmobi.com +aidps.atdmt.com +aidu-ads.de +aim4media.com +aimes.com +aimfar.solution.weborama.fr +aimg.haber3.com +aintdoinshit.com +aio.lp.mydas.mobi +aippnetworks.com +air-plane-ticket.beesearch.info +air.fyber.com +aircraft.evote.cl +airfind.com +airfind.nmv21jjpsr4e4kyh1t.netdna-cdn.com +airflow-dev.etl.us-east-1.kops.kargo.com +airflow-prod.etl.us-east-1.kops.kargo.com +airline-ticket.gloses.net +airnetinfotech.com +airpb.com +airportaxi.pl +airportsys.com +airpr.com +airvertiseme.com +aisiansex.com +aistat.net +ait7ee.win +aitligold.tripod.com +aitsngnuu.angelcities.com +aiui.hitbox.com +aivae2o.top +aj-tuning-1220.de +aj.600z.com +aj.adjungle.com +ajakbytak.pl +ajansyenimedya.com +ajc.us.intellitxt.com +ajcclassifieds.com +ajcryptominer.com +ajewishgift.com +ajinomoto.d1.sc.omtrdc.net +ajitashaengg.com +ajkzd9h.com +ajocbplhzcvr.bid +ajokeaday.com +ajokenyme.easyfreehosting.com +ajplugins.com +ajuntamentodastribos.com.br +ak-cdn.placelocal.com +ak-gb.marketgid.com +ak-is.net +ak.5.p2l.info +ak.buyservices.com +ak.cdn-jquery.host +ak.imgfarm.com +ak.maxserving.com +ak.p.openx.net +ak.quantcast.com +ak.sail-horizon.com +ak0gsh40.com +ak1.abmr.net +ak1s.abmr.net +aka-cdn-ns.adtech.de +aka-cdn-ns.adtechus.com +aka-cdn.adtech.de +aka-cdn.adtechus.com +aka-root.com +aka.accortech.com +akaads-espn.starwave.com +akademianaukowa.pl +akademiazarabianiawinternecie.pl +akademija.marketing365.mk +akaflieg-sb.de +akama.com +akamai-san1.exacttarget.com +akamai-san10.exacttarget.com +akamai-san11.exacttarget.com +akamai-san12.exacttarget.com +akamai-san13.exacttarget.com +akamai-san14.exacttarget.com +akamai-san15.exacttarget.com +akamai-san16.exacttarget.com +akamai-san17.exacttarget.com +akamai-san18.exacttarget.com +akamai-san19.exacttarget.com +akamai-san20.exacttarget.com +akamai-san21.exacttarget.com +akamai-san22.exacttarget.com +akamai-san23.exacttarget.com +akamai-san24.exacttarget.com +akamai-san25.exacttarget.com +akamai-san26.exacttarget.com +akamai-san27.exacttarget.com +akamai-san28.exacttarget.com +akamai-san29.exacttarget.com +akamai-san30.exacttarget.com +akamai-san4.exacttarget.com +akamai-san5.exacttarget.com +akamai-san6.exacttarget.com +akamai-san7.exacttarget.com +akamai-san8.exacttarget.com +akamai-san9.exacttarget.com +akamai-sannestle.exacttarget.com +akamai.cdneval.adnxs.com +akamai.invitemedia.com +akamai.mathtag.com +akamai.smartadserver.com +akamai.t.axf8.net +akamai.vungle-cdn.vungle.com +akamaisan.qualtrics.com +akamaisecure.qualtrics.com +akamaisecure2.qualtrics.com +akamaisecure3.qualtrics.com +akamaisecure4.qualtrics.com +akariyer.com +akatest.search.spotxchange.com +akatracking.esearchvision.com +akazoo.pl +akcr.free.fr +akihabaranews.us.intellitxt.com +akirkpatrick.com +akita.kz +akku.mondo.trium.mitsubishi.sms13.de +akm.ssacdn.com +akm1.ssacdn.com +ako.cc +aksao.com +aksdk-images.adikteev.com +aksite.freedom.fi +aksonural.ru +aktif.haberx.com +aktivator-windows10.blogspot.com +aktobe.xkaz.org +aktrack.pubmatic.com +aktualizacjafacebooka.blogspot.com +akuhni.by +akusherok.ru +akzmaihd.net +al-futtaiminvestmentgroup.com +al.5.p2l.info +al1.sharethis.com +alabamabackpage.com +alaksaair.com +alamosupply.com +alamuk.com +alanstrack.com +alarash.com +alarmobninsk.ru +alaskaaair.com +alb-prod-invenio-1916515004.us-west-2.elb.amazonaws.com +alb.reddit.com +albamargroup.com +albanypowerexchange.com +albanytimesunion.122.2o7.net +albaphotos.free.fr +albergoabruzzo.com +alberguecasaanita.com +albiondrugs.com +alblux.com +alboautotrasportatori.it +alchemyworldwide.tt.omtrdc.net +alclick.com +alcohol-treatment.gloses.net +alcohort.com +aldaniti.net +aldersgatencsc.org +aldik.com +aldo061.free.fr +aldo063.free.fr +ale-fotogragia.bo.pl +ale-gratka.pl +alegratka.eu +alegroup.info +aleinvest.xyz +alekseevec.ru +alemoney.xyz +alenty.com +alert.mac-notification.com +alert.police-patrol-agent.com +alessandraleone.com +alessandroesse.biz +alexa-silver.com +alexa-sitestats.s3.amazonaws.com +alexametrics.com +alexanderinteriorsanddesign.com +alexandria-locksmithservice.com +alexandria90.etcserver.com +alexbensonship.com +alexianer-service.de +alexine.net +alexphoto.biz +alexsoff.com +alexxxxpages.info +alf-img.com +alfa-img.com +alfa-medosmotr.ru +alfa-search.com +alfa9.com +alfacentauro.nu +alfalakgifts.com +alfapro.ru +alfatraffic.com +alflying.bid +alflying.date +alflying.win +algawhra.com +algerianembassy.co.in +algodon.net +algovid.com +alhamdtravel.com.pk +alhijaztrvl.com +alibabaslots.com +alibestsale.com +alice20.free.fr +aliciatrans.free.fr +aliclonepro.xyz +aliecspres.com +alienwheels.de +aliexpresscashback.club +alif-ba-ta.com +alini.de +alipromo.com +alirey.com +alisat.biz +alisatilsner.com +alissonluis-musico.sites.uol.com.br +alive-ua.com +alive.us.intellitxt.com +alizedusud.free.fr +aljassarengineering.com +alkalifeph.fr +all-blonde.nu +all-internet-security.com +all-player.pl +all-sex.shengen.ru +all-streaming-media.com +all-sucking-cock.gocunt.com +all-tgp.org +all-thumbs.nu +all-video.elk.pl +all.alisatilsner.com +all.darkhost.info +all.orfr.adgtw.orangeads.fr +all4invest.info +all4invest.ru +all4spy.com +all4wap.ru +allaboutxxx.com +alladvantage.com +allamericanmadetoys.com +allan1qa.midasplayer.com +allanimehentai.com +allaskme.com +allavailable.me +allbdpaper.com +allbest-medicalbillingandcoding-deals.com +allbestpantyhose.com +allboard.xobor.de +allboys.buckshost.com +allbritishescorts.com +allbritton.122.2o7.net +allcarselectric.us.intellitxt.com +allcredits.su +alldcs.outbrain.org +alldubai.biz +allegra.1.p2l.info +allegro.hit.gemius.pl +allergiques.com +allergy.1.p2l.info +allergycenter.info +allerinternett.tns-cs.net +alleron.andree.free.fr +allfet.info +allfiles.pl +allfontshere.press +allforlove.de +allgetaways.us.intellitxt.com +allhiphop.us.intellitxt.com +allhqpics.com +alliance.adbureau.net +alliance4media.com +allinviews.com +allkindlecloud.com +allo-sexe.com +allo-sexe.net +allosexmovies.com +allosponsor.com +alloversuccess.com +alloysteel.ru +allpdfmags.net +allplayer.pl +allpornarea.com +allpornauditions.com +allpornofilm.com +allpornpics.nu +allpregnantporn.com +allpussyvideos.com +allrefer.us.intellitxt.com +allsaints.nu +allseoservices247.com +allsexclub.com +allsexdomain.nu +allshemaleporn.com +allsilver925.co.il +allslash.org +allstrings.free.fr +alltereg0.ru +allternate.de +allthepornstarsstore.com +allthevideo.com +alltheviews.com +allwarezfree.com +allwomen.info +allwomenstalk.us.intellitxt.com +allx.info +allxscan.tk +ally-mc-dr.exacttarget.com +ally-mc.exacttarget.com +ally-members-dr.exacttarget.com +ally-members.exacttarget.com +allyoungteenz.nu +allzeed.com +alocdn.com +alog.umeng.co +alog.umeng.com +alog.umengcloud.com +alpha-assets.adcolony.com +alpha.adswizz.com +alpha.easy-hit-counters.com +alphabirdnetwork.com +alphalux.oewabox.at +alphonso.hebergratuit.net +alphonso.tv +alphonsor.rf.gd +alpin.free.fr +alprazolam.ourtablets.com +alprazolamonline.findmenow.info +alsoknowsit.com +alt.impresionesweb.com +alt.webtraxs.com +altavista.ovh +alternativos.iw-advertising.com +alteryx.marketo.com +altfarm.mediaplex.com +altitude-arena.com +altmedia101.com +altpool.pro +aluma.it +alupoint.com +alveris.ru +alvisi.kiev.ua +alvisp.ru +alvtank.se +alwaysirishshop.com +alwen.fr +alwqfajh.com +alwrig84.gamed.hop.clickbank.net +alxsite.com +alyeskaresort.com +alyssamilano.1stok.com +alyssamilano.ca.tt +alyssamilano.home.sapo.pt +am-anna.com +am-begleitservice.net +am-display.com +am-display.hb.adx1.com +am-display.rtb.adx1.com +am-native.hb.adx1.com +am-native.rtb.adx1.com +am-pops.xml.adx1.com +am-trc.taboola.com +am1-h-api.online-metrix.net +am15.net +am4u.kr +ama-alliance.com +ama-fitness.com +amadeus.d2.sc.omtrdc.net +amadorasnanet.com.br +amadurece.net +amagle.com +amanda-porn.ga +amanita.com.my +amaporn.com +amare.softwaregarden.com +amarktflow.com +amat78.free.fr +amateur-erotik.biz +amateur-index.de +amateur-mature-sex.adaltabaza.net +amateur-peepshow.de +amateur-porn.nu +amateur-pussy-pictures.com +amateur.xxxcounter.com +amateuravenue.com +amateurbasnylon.free.fr +amateurcollegeporn.com +amateurdevils.com +amateurfick.de +amateurgalls.com +amateurgirlfriends.org +amateurgirls.nu +amateurhardcoreporn.com +amateurhuren.org +amateurlivechat.org +amateurlivesex.nl +amateurpornking.com +amateurpornos.biz +amateurpornplanet.com +amateurpornzone.com +amateurs-cam.0my.net +amateurs.jerkr.com +amateursconvert.com +amateursdoingporn.com +amateursex.nu +amateursexclips.org +amateursexdvd.com +amateursexplace.com +amateursexshop.us +amateursexvideo.de +amateurspain.com +amateurspread.nu +amateursrated.com +amateursrus.nu +amateurteen.nu +amateurteens.nu +amateurtour.biz +amateurwifevids.com +amateurwives.nu +amatorki.sve.pl +amatorsikis.org +amatrice-partouzeuse.com +amatrices-sexy.fr +amatrixe.free.fr +amatueranal.com +amaturesex.net +amatvideo.free.fr +amazing-amanda.com +amazing-offers.co.il +amazinggreentechshop.com +amazingphonesex.com +amazingpic.net +amazingtipsbook.com +amazingvacationhotels.com +amazon-adsystem.amazon.com +amazon-adsystem.com +amazon-en.com +amazon-seo-service.com +amazon-sicherheit.kunden-ueberpruefung.xyz +amazoncards.dlcodes.com +amazoncustomerservice.d2.sc.omtrdc.net +amazonmerchants.122.2o7.net +amazonoffice.com.br +amazonservices.122.2o7.net +amazonshopbop.122.2o7.net +amazonwebservices.d2.sc.omtrdc.net +amazonwebservicesinc.tt.omtrdc.net +amazonwebstore.122.2o7.net +amb-greiz.de +amberform.com +ambersstories.nu +ambien.1.p2l.info +ambien.3.p2l.info +ambien.4.p2l.info +ambien.ourtablets.com +ambiguousquilt.com +ambitiousagreement.com +ambra.com +ambulanciaslazaro.com +ambutec.it +amcglobal.sc.omtrdc.net +amch.questionmarket.com +amdvtest.112.2o7.net +amdzone.us.intellitxt.com +amedia.tns-cs.net +amege.com +amelie95.free.fr +amer.hops.glbdns.microsoft.com +amer.rel.msn.com +amer.se +amer01.sp.backtrace.io +amer02.sp.backtrace.io +amercanfidelity.com +america.monerise.com +american-prize-center.com +americana-p.shopcurbside.com +americana-s.shopcurbside.com +americana.shopcurbside.com +americanbaby.112.2o7.net +americancareconcept.com +americancontractbuyers.com +americaneagleoutfitt.tt.omtrdc.net +americaninfomanagement.com +americanlearns.net +americanmasonry.net +americanmedia.us.intellitxt.com +americansingles.click-url.com +americanvixens.com +americash.com +amerisec.net +ameritradeamerivest.112.2o7.net +ameritradeogilvy.112.2o7.net +amexopenprod.122.2o7.net +amhixwqagiz.ru +amicicannisusa.org +amidra.com +amiesdechatoune66.free.fr +aminev.com +amirconstruction.com +amiscam.free.fr +amislibertins.free.fr +amn.doubleclick.net +amocinema.websantos.com +amoi.tn +amore.darkhost.info +amorepaixaomensagens.com.br +amorex.de +amospalla.es +amourangels.biz +amoxicillin.ourtablets.com +amp.automatad.com +amp.casalemedia.com +amp.locations.yext.com +amp.mxptint.net +amp.services +ampblog.tritondigital.com +ampcid.google.com +ampedmedia.directtrack.com +amphorasf.com +amplexus.org +amplify-eu.swrve.com +amplify.amplitude.com +amplify.outbrain.com +amplify.swrve.com +amplifypixel.outbrain.com +amplitude-peinture.fr +amplitude.com +ampmetrics.engadget.com +ampmetrics.techcrunch.com +ampower.me +amricanfidelity.com +amrytt.adk2x.com +ams-aws-stg.fyber.com +ams.atom.adjust.com +ams.contextweb.com +ams.fyber.com +ams.toxity.biz +ams1-ib.adnxs.com +ams1.ib.adnxs.com +amsad.adtech.de +amscdn.btrll.com +amskrupajal.org +amt-k.ru +amtools.juicemobile.com +amu-d.openx.net +amu.adduraddonhere.info +amu.boxinstallercompany.info +amu.brandnewinstall.info +amu.helpyourselfinstall.info +amu.twobox4addon.info +amung.us +amunow.org +amwatching.com +amygrindhouse.uk.intellitxt.com +amznshopbop.122.2o7.net +an-donut.com +an.batmobi.net +an.mlb.com +an.secure.tacoda.net +an.tacoda.net +an.worldbaseballclassic.com +an.yandex.ru +an.z5x.net +ana.analyticson.com +anahtars.com +anal-acrobats.com +anal-cinema.org +anal-eclate.org +anal-et-sodomie.com +anal-fisting.nu +anal-intentions.com +anal-links.nu +anal-love.net +anal-pictures.biz +anal-videos-photos.com +anal.cx +anal.gold10.com +analaction.nu +analanimalsex.nl +analasian.nu +analcreampie.net +analdude.com +anale-seks.nl +anale-sex.nl +analextasy.com +analfilth.nu +analingus.nu +analog.cell.phone.service.sms13.de +analog.sms13.de +analpics.net +analpornvids.org +analsex-lesben-oralsex.de +analsexe.net +analsexhard.com +analsexmovies.org +analsexo.info +analsexphoto.yourfreesites.com +analsexporn.org +analsexwhores.com +analsluts.nu +analwhore.schoolreference.com +analxxxclipsyjh.dnset.com +analyse.advertisingbox.com +analysis.fc2.com +analysis.polarisoffice.com +analyst-stg-coursera.airpr.com +analyst.airpr.com +analytic.ae.com +analytic.detik.com +analytic.gatewayinterface.com +analytic.spamfighter.com +analyticcdn.globalmailer.com +analyticdns.org +analytics-api-samples.googlecode.com +analytics-dash-stg.tools.airpr.com +analytics-dash.airpr.com +analytics-dash.tools.airpr.com +analytics-digit-in.cdn.ampproject.org +analytics-eu.clickdimensions.com +analytics-ingress-global.bitmovin.com +analytics-production.hapyak.com +analytics-service.us-east-1.prod.public.atl-paas.net +analytics-static.ugc.bazaarvoice.com +analytics-tx.tdameritrade.com +analytics.247sports.com +analytics.adlightning.com +analytics.admob.com +analytics.adpost.org +analytics.adspaces.ero-advertising.com +analytics.adtech.de +analytics.adtechus.com +analytics.airfind.com +analytics.algolia.com +analytics.amakings.com +analytics.analytics-egain.com +analytics.androidandme.com +analytics.appdynamics.com +analytics.archive.org +analytics.atdmt.com +analytics.atlassian.com +analytics.atomiconline.com +analytics.aweber.com +analytics.bigcommerce.com +analytics.bitrix.info +analytics.bleacherreport.com +analytics.blue +analytics.bluekai.com +analytics.breakingnews.com +analytics.brightedge.com +analytics.ccgateway.net +analytics.civicplus.com +analytics.clickdimensions.com +analytics.clickpathmedia.com +analytics.cloudron.io +analytics.cnd-motionmedia.de +analytics.codigo.se +analytics.colacoweb.net +analytics.de.algolia.com +analytics.dev.popdust.com +analytics.digit.in +analytics.disneyinternational.com +analytics.edgekey.net +analytics.ero-advertising.com +analytics.fairfax.com.au +analytics.ff.avast.com +analytics.foresee.com +analytics.fuckingawesome.com +analytics.gameforge.de +analytics.gazeta.pl +analytics.getpostman.com +analytics.glance.inmobi.com +analytics.google.com +analytics.harpercollins.com +analytics.hayneedle.com +analytics.hgcdn.net +analytics.htmedia.in +analytics.icons8.com +analytics.ihgip.net +analytics.ispot.tv +analytics.jabong.com +analytics.kaltura.com +analytics.ku6.com +analytics.kwebsoft.com +analytics.levelaccess.net +analytics.live.com +analytics.livefyre.com +analytics.lk.api.ditto.com +analytics.localytics.com +analytics.logsss.com +analytics.mail-corp.com +analytics.mailmunch.co +analytics.mopub.com +analytics.msn.com +analytics.msnbc.com +analytics.msnbc.msn.com +analytics.myfinance.com +analytics.myfinances.com +analytics.mytvzion.pro +analytics.narvar.com +analytics.newsinc.com +analytics.newsvine.com +analytics.onesearch.id +analytics.ooyala.com +analytics.paddle.com +analytics.percentmobile.com +analytics.phando.com +analytics.picsart.com +analytics.pimproll.com +analytics.podtrac.com +analytics.pokki.com +analytics.poolshool.com +analytics.posttv.com +analytics.prx.org +analytics.publitas.com +analytics.query.yahoo.com +analytics.r.msn.com +analytics.radiatemedia.com +analytics.rayjump.com +analytics.revee.com +analytics.rogersmedia.com +analytics.safelinking.net +analytics.samdd.me +analytics.sanoma.fi +analytics.services.kirra.nl +analytics.shareaholic.com +analytics.siliconexpert.com +analytics.sitewit.com +analytics.slashdotmedia.com +analytics.soup.io +analytics.spongecell.com +analytics.spotta.nl +analytics.springboardvideo.com +analytics.staging.airfind.com +analytics.stg.springboardvideo.com +analytics.strangeloopnetworks.com +analytics.supplyframe.com +analytics.sutterhealth.org +analytics.swiggy.com +analytics.tbs.com +analytics.testing.piwik.pro +analytics.theknot.com +analytics.thenest.com +analytics.thevideo.me +analytics.tout.com +analytics.trutv.com +analytics.upworthy.com +analytics.us.algolia.com +analytics.usdm.net +analytics.userreport.com +analytics.vast.com +analytics.verizonenterprise.com +analytics.vodafone.co.uk +analytics.wishabi.ca +analytics.xcal.tv +analytics.yahoo.com +analytics.yolacdn.net +analytics.youramigo.com +analytics.zdbb.net +analytics.zg-api.com +analytics2.aweber.com +analyticsapi.bsbportal.com +analyticson.com +analyticstest.adtech.de +analyticstest.appdynamics.com +analyticstest.localytics.com +analyticsv2.dol.gr +analyze.urbanairship.com +analyzer51.fc2.com +ananashotel.com +anapixel.elmundo.es +anapixel.marca.com +anat.tacoda.net +anatomytrains.co.uk +anayltics.kuikr.com +anbstudios.com +ancestrymsn.112.2o7.net +ancestryuki.112.2o7.net +anchor.coadvertise.com +anchor.stailamedia.com +anchorpoint.co.za +anchorwheelmotel.com.au +ancome.ru +anctestsystem.corp.returnpath.net +andersondiamonds.com +andlache.com +andpolice.com +andpop.us.intellitxt.com +andr.net +andr0id.traffic-smart.com +andrew.nullrefexcep.com +andrewrobertsllc.info +andrionmobileapp.bid +android-sdk31.transpera.com +android-style.com +android-systems.ru +android-vsem.org +android.airfind.com +android.bcfads.com +android.bigresource.com +android.fyber.com +android.stage-one.heyzap.com +android.stage-three.heyzap.com +android.stage-two.heyzap.com +android4fun.org +androidads23.adcolony.com +androidandme.us.intellitxt.com +androidcentral.us.intellitxt.com +androidcommunity.us.intellitxt.com +androiddev.orkitra.com +androidgameshacks.com +androidsdk.ads.mp.mydas.mobi +androidsecurityplus.com +andrwnolas.top +anduongjsc.com +andydill.com +anelkathe.tripod.com +anet.tradedoubler.com +anetch.tradedoubler.com +anetdk.tradedoubler.com +anetfi.tradedoubler.com +anetit.tradedoubler.com +anetlt.tradedoubler.com +anetno.tradedoubler.com +anetse.tradedoubler.com +anews.cc +anews.co.uk +anewyoufitness.com +angeing.info +angel-x.com +angelalittle.net +angelanmegan.us +angelas-place.com +angelbetting.com +angelfuns.info +angelinajolie.1stok.com +angelinajolie.ca.tt +angelinajoliepics.com +angelinfo.com +angelinna.free.fr +angelsinuniform.com +angiba.112.2o7.net +angiemktg.com +angieslist.tt.omtrdc.net +anglewinks.com +angmar.112.2o7.net +angmil.112.2o7.net +angolotesti.it +angpar.112.2o7.net +angtr.112.2o7.net +angts.112.2o7.net +angvac.112.2o7.net +anhangueraeducacional.com +animadulte.com +animal-drawings.com +animal36.com +animalcum.net +animalfucking.nu +animalhouse.nu +animalrank.com +animaltoplist.com +anime.reactor.cc +aniview.com +ankieta-online.pl +anklets.shengen.ru +anm.112.2o7.net +anm.intelli-direct.com +anmira.info +annanicolesannanicolesmith.ca.tt +annanicolesmith.1stok.com +anners.ero-advertising.com +annonser.dagbladet.no +annotate.api.driftt.com +annotate.driftt.com +announcements.livefyre.com +annuaire-autosurf.com +annualconsumersurvey.com +anon-stats.eff.org +anon.doubleclick.speedera.net +anonymous-net.com +anonymous.s50.exacttarget.com +anonymousdemographics.com +anonymousproxy.tk +anonymousstats.keefox.org +anorak.uk.intellitxt.com +anouslab.cmail20.com +anrtx.tacoda.net +anrysys.popunder.ru +anshrit.com +answerbag.us.intellitxt.com +answerhub.com +answers.chartboost.com +answers.livefyre.com +answers.us.intellitxt.com +answerzones.com +ant.com +ant.conversive.nl +antalya.ru +antcompany.com +anthonymthompson.com +anti-virus-removal.info +anticlown.com +anticodistretto.com +anticosm.com +antidepressants.1.p2l.info +antifa.co.at +antimusic.us.intellitxt.com +antispyware.onlinedownloads.org +antispywareexpert.com +antivirus-message.com +antivirus-online-scan5.com +antivirus-scanner.com +antivirus-scanner8.com +antventure.com +antyweb.push-ad.com +anuluj-dlug.pl +anuluj-mandat.pl +anuluj-natreta.pl +anvato-api-config.s3.amazonaws.com +anxiety.1.p2l.info +anxiousapples.com +any-log.videe.tv +any.footprintdns.com +anycast-stb.metric.gstatic.com +anycast.adnxs.com +anycast.dt.adsafeprotected.com +anycast.metric.gstatic.com +anycast1-stb.metric.gstatic.com +anycast1.metric.gstatic.com +anycast2-stb.metric.gstatic.com +anycast2.metric.gstatic.com +anyclip-d.openx.net +anycracks.com +anythinghollywood.us.intellitxt.com +anzanish.tripod.com +aoc.teleaudio.pl +aol-heliosiq.adtechus.com +aol.gscontxt.net +aol.spb.su +aolbks.122.2o7.net +aolcamember.122.2o7.net +aolcareers.122.2o7.net +aolcg.122.2o7.net +aolcmp.122.2o7.net +aolcommem.122.2o7.net +aolcommvid.122.2o7.net +aolcsmen.122.2o7.net +aoldlama.122.2o7.net +aoldrambuie.122.2o7.net +aolgam.122.2o7.net +aolgamedaily.122.2o7.net +aoljournals.122.2o7.net +aollatblog.122.2o7.net +aollove.122.2o7.net +aolmov.122.2o7.net +aolmus.122.2o7.net +aolnews.122.2o7.net +aolnsnews.122.2o7.net +aolnssearch.122.2o7.net +aolpf.122.2o7.net +aolpolls.112.2o7.net +aolpolls.122.2o7.net +aolsearch.122.2o7.net +aolshred.122.2o7.net +aolsports.122.2o7.net +aolstylist.122.2o7.net +aolsvc.122.2o7.net +aolswitch.122.2o7.net +aolt.hit.gemius.pl +aoltmz.122.2o7.net +aoltruveo.122.2o7.net +aolturnercnnmoney.112.2o7.net +aolturnercnnmoney.122.2o7.net +aolturnersi.122.2o7.net +aoluk.122.2o7.net +aolukglobal.122.2o7.net +aolv.hit.gemius.pl +aolvideo.122.2o7.net +aolwbautoblog.122.2o7.net +aolwbcinema.122.2o7.net +aolwbdnlsq.122.2o7.net +aolwbengadget.122.2o7.net +aolwbgadling.122.2o7.net +aolwbluxist.122.2o7.net +aolwbpspfboy.122.2o7.net +aolwbtvsq.122.2o7.net +aolwbwowinsd.122.2o7.net +aolwinamp.122.2o7.net +aolwpaim.112.2o7.net +aolwpicq.122.2o7.net +aolwpmq.112.2o7.net +aolwpmq.122.2o7.net +aolwpmqnoban.112.2o7.net +aolwpnscom.122.2o7.net +aolwpnswhatsnew.112.2o7.net +aolyedda.122.2o7.net +aoncomprod.122.2o7.net +aop-prog.advertising.com +aoredi.com +aos.gw.youmi.net +aos.wall.youmi.net +ap-northeast-1.bid.bidr.io +ap-northeast-1.event.prod.bidr.io +ap-northeast-1.stinger-ad.bidr.io +ap-sonar.sociomantic.com +ap.cdn.survey.medallia.com +ap.event.cmp.advertising.com +ap.lijit.com +ap.oasfile.aftenposten.no +ap.octopuspop.com +ap.read.mediation.pns.ap.orangeads.fr +ap.silverpush.co +ap101.curves.com +ap76rmx3.accountant +apac.analytics.yahoo.com +apac.cnv.event.prod.bidr.io +apac.event.prod.bidr.io +apac.match.prod.bidr.io +apac.rel.msn.com +apac.segment.prod.bidr.io +apac.u.fastly-insights.com +apac.u.staging.fastly-insights.com +apac.u.test.fastly-insights.com +apac1-proxy.adnxs.com +apac2-proxy.adnxs.com +apac3-proxy.adnxs.com +apac4-proxy.adnxs.com +apache.adwyze.com +apartamentypoleska.pl +apathetictheory.com +apdigitalorg.112.2o7.net +apdigitalorgovn.112.2o7.net +apdrive.win +apepix.com +aperture.displaymarketplace.com +apex-ad.com +apex.go.sonobi.com +aphrodisia01.free.fr +aphrodite.porntrack.com +aphroditeshaven.com +api-54-190-136-221.b2c.com +api-alt.rollbar.com +api-apac.web.analytics.yahoo.com +api-apple.com +api-backup.viaxmr.com +api-bg.web.analytics.yahoo.com +api-black.convertkit.com +api-cache.adsnative.com +api-dev-bos.yottaa.com +api-dev-new.yottaa.com +api-dev.instartlogic.com +api-dev.yottaa.com +api-development-us-west-2.lisnr.com +api-development.lisnr.com +api-dfw-a.bandwidthx.net +api-dfw-b.bandwidthx.net +api-dfw.bandwidthx.net +api-doc.adtech.de +api-doc.adtechus.com +api-docs.playhaven.com +api-gateway.uat.dev.sizmek.com +api-gce.petametrics.com +api-iad.bandwidthx.net +api-internal-us-east-1.mathtag.com +api-logger.curejoy.com +api-ntv-elb-1185445618.us-east-1.elb.amazonaws.com +api-ntv.sele.co +api-oma-00.bandwidthx.net +api-oma-02.bandwidthx.net +api-oma-a.bandwidthx.net +api-ono.web.analytics.yahoo.com +api-p.shopcurbside.com +api-public.addthis.com +api-q1.shopcurbside.com +api-s.shopcurbside.com +api-selene.prod.adtech.de +api-selene.prod.adtechus.com +api-staging-us-west-2.lisnr.com +api-staging.lisnr.com +api-staging.wootric.com +api-static.syndicaster.tv +api-t.shopcurbside.com +api-us-west-1.petametrics.com +api-v2.instartlogic.com +api-v2.lootsie.com +api-v3_0.us-west-2.prod.aws.keen.io +api.1beb2a44.space +api.300ca0d0.space +api.310ca263.space +api.320ca3f6.space +api.330ca589.space +api.340ca71c.space +api.360caa42.space +api.370cabd5.space +api.3c0cb3b4.space +api.3d0cb547.space +api.5rocks.io +api.7segments.com +api.aalbbh84.info +api.activision.swrve.com +api.ad.intl.xiaomi.com +api.ad.snappea.com +api.ad.xiaomi.com +api.adcalls.nl +api.addnow.com +api.addthis.com +api.adip.ly +api.adlearnop.advertising.com +api.adlure.net +api.admob.com +api.admob.xiaomi.com +api.adquality.ch +api.adrenalads.com +api.adrtx.net +api.adsnative.com +api.adsttc.com +api.adsymptotic.com +api.adwyze.com +api.adx1.com +api.adyoulike.com +api.aeon.hashvault.pro +api.affinesystems.com +api.airfind.com +api.airpush.com +api.alpha.branch.io +api.alphonso.tv +api.amplitude.com +api.analytics.omgpop.com +api.analyticson.com +api.app.optimizely.com +api.appboy.com +api.appdynamics.com +api.apps.airfind.com +api.appsee.com +api.atdmt.com +api.autopilothq.com +api.axiatraders.com +api.b2c.com +api.backtrace.io +api.bandwidthx.net +api.be.airfind.com +api.behavioralengine.com +api.beta.branch.io +api.beta.extremereach.com +api.bhzejltg.info +api.bidder10.mookie1.com +api.bidder7.mookie1.com +api.bidder9.mookie1.com +api.bidr.io +api.bigmobileads.com +api.billing.internal.intercom.io +api.bizographics.com +api.boa.exacttarget.com +api.boomtrain.com +api.bounceexchange.com +api.branch.io +api.brightfunnel.com +api.browsermine.com +api.brs.intl.miui.com +api.bttrack.com +api.c.avazunativeads.com +api.calq.io +api.cheatsheet.me +api.chillyc.env.sandbox53.localytics.com +api.chris.env.sandbox53.localytics.com +api.circularhub.com +api.cloudmobi.net +api.clrstm.com +api.coin-hive.com +api.coinerra.com +api.coinhive.com +api.collect.data.intl.miui.com +api.conduit.com +api.config.airfind.com +api.content-ad.net +api.content.ad +api.convertkit.com +api.crypto-loot.com +api.curalate.com +api.d.xiaomi.com +api.dans-parsley-change-test.env.sandbox53.localytics.com +api.dc1.exacttarget.com +api.dc2.exacttarget.com +api.dev.airfind.com +api.dev.extremereach.com +api.dev.jivox.com +api.districtm.ca +api.dna.247realmedia.com +api.drift.com +api.driftt.com +api.dynamicyield.com +api.eb-test.firehound.staging.paperg.com +api.eqmob.com +api.ero-advertising.com +api.ethereum.hashvault.pro +api.extremereach.com +api.extremereach.com.extremereach.com +api.final.env.sandbox53.localytics.com +api.flyertown.ca +api.franklyinc.com +api.fyber.com +api.gameanalytics.com +api.glance.inmobi.com +api.grandonmedia.com +api.h-bid.com +api.hb.ad.cpe.dotomi.com +api.hybrid.intl.xiaomi.com +api.ibm.xtify.com +api.infinario.com +api.inmobi.com +api.instartlogic.com +api.int.drift.com +api.intel.dynamicyield.com +api.intellimize.co +api.intense.hashvault.pro +api.intensifier.de +api.intentiq.com +api.intercom.io +api.internal.dev.extremereach.com +api.internal.extremereach.com +api.inwemo.com +api.ios.tenjin.com +api.iperceptions.com +api.ipinfodb.com +api.iris.tv +api.jetlore.com +api.jivox.com +api.joanna-test.env.sandbox53.localytics.com +api.joanna.env.sandbox53.localytics.com +api.joe.env.sandbox53.localytics.com +api.josh.env.sandbox53.localytics.com +api.jsecoin.com +api.keen.io +api.kochava.com +api.l33tsite.info +api.lanistaads.com +api.levelaccess.net +api.linkgist.com +api.linkz.net +api.lisnr.com +api.livefyre.com +api.lo.extole.io +api.lytics.io +api.master.firehound.staging.paperg.com +api.master.frozenyak.staging.paperg.com +api.minero.cc +api.minexmr.com +api.mixpanel.com +api.mobileapptracking.com +api.moengage.com +api.monerise.com +api.monero.hashvault.pro +api.moneroocean.stream +api.monetizer101.com +api.murdoog.com +api.myeforsa.pl +api.n131adserv.com +api.netflare.info +api.nonewlines.env.sandbox53.localytics.com +api.nrelate.com +api.omnitagjs.com +api.oneaudience.com +api.opencandy.com +api.optimizely.com +api.optinmonster.com +api.optmnstr.com +api.optnmnstr.com +api.parsely.com +api.petametrics.com +api.placed.com +api.poc.exacttarget.com +api.ppoi.org +api.privacy-center.org +api.promotions.skype.com +api.proofpositivemedia.com +api.publishers.adasiaholdings.com +api.pubnative.net +api.pubwise.io +api.pushspring.com +api.pzoifaum.info +api.qa-ext.livefyre.com +api.qa.branch.io +api.qa.corp.mparticle.com +api.qa.drift.com +api.qa.exacttarget.com +api.qa.samplicio.us +api.qa.test.appsee.com +api.qa1.corp.mparticle.com +api.qa2.corp.mparticle.com +api.qualtrics.com +api.quantumgraph.com +api.raphael.env.sandbox53.localytics.com +api.rbl.ms +api.redshell.io +api.release.firehound.prod.paperg.com +api.release.frozenyak.prod.paperg.com +api.release.template-build-service.prod.paperg.com +api.reports.advertising.com +api.rollbar.com +api.s1.qa2.exacttarget.com +api.s2.qa2.exacttarget.com +api.s4.exacttarget.com +api.sagent.io +api.samplicio.us +api.sandbox-shared.env.sandbox53.localytics.com +api.sandbox-val.env.sandbox53.localytics.com +api.sandbox.env.sandbox53.localytics.com +api.sandbox53.localytics.com +api.sec.intl.miui.com +api.segment.io +api.sele.co +api.selfserve.rubiconproject.com +api.setting.intl.miui.com +api.shoppingminds.net +api.sibboventures.mgr.consensu.org +api.silverpush.co +api.simpleanalytics.io +api.sizmek.com +api.skimlinks.mgr.consensu.org +api.sonobi.com +api.speedcurve.com +api.spotxchange.com +api.staging.airfind.com +api.staging.privacy-center.org +api.staging.wootric.com +api.stathat.com +api.static.xtify.com +api.stats.appa.pe +api.stg.samplicio.us +api.sumo.hashvault.pro +api.sumokoin.hashvault.pro +api.swrve.com +api.syndicaster.tv +api.t402.livefyre.com +api.taboola.com +api.taplytics.com +api.terraform-outputs.env.sandbox53.localytics.com +api.test.exacttarget.com +api.tf.airfind.com +api.tfvpn.airfind.com +api.thirdpresence.com +api.tns-cs.net +api.trackuity.com +api.traffiliate.com +api.traq.li +api.treasuredata.com +api.tumra.com +api.tushar-test.env.sandbox53.localytics.com +api.tushar.env.sandbox53.localytics.com +api.tutorial-sharing-again.env.sandbox53.localytics.com +api.tutorial-sharing.env.sandbox53.localytics.com +api.tutorial.env.sandbox53.localytics.com +api.tvpage.com +api.uat.dev.sizmek.com +api.urbanairship.com +api.userstyles.org +api.val.env.sandbox53.localytics.com +api.viaxmr.com +api.viglink.com +api.vungle.akadns.net +api.vungle.com +api.web.analytics.yahoo.com +api.webchunker.streaming.adswizz.com +api.wipmania.com +api.wootric.com +api.wootric.com.herokudns.com +api.wundercounter.com +api.xmrpool.net +api.xtify.com +api.yoni.env.sandbox53.localytics.com +api.yottaa.com +api.yp.com +api.zanox.com +api.zemanta.com +api2.branch.io +api2.murdoog.com +api5.batmobil.net +apiadanaknet-a.akamaihd.net +apiallgeniusinfo-a.akamaihd.net +apiappenableinfo-a.akamaihd.net +apib.monerise.com +apibatbrowsecom-a.akamaihd.net +apibeta.zeti.com +apibetweenlinesn-a.akamaihd.net +apibrowsesmartne-a.akamaihd.net +apicit.net +apidemo.eazybiz.ng +apidiamondatanet-a.akamaihd.net +apidigidocketnet-a.akamaihd.net +apidocs-dev.instartlogic.com +apidocs.instartlogic.com +apifasterlightin-a.akamaihd.net +apiholdingmypage-a.akamaihd.net +apiitsthirteende-a.akamaihd.net +apilinkswiftco-a.akamaihd.net +apiluckyleapnet-a.akamaihd.net +apimegabrowsebiz-a.akamaihd.net +apimossnetinfo-a.akamaihd.net +apimountainbikei-a.akamaihd.net +apin.monerise.com +apinfo45.free.fr +apioasisspacenet-a.akamaihd.net +apioutoboxnet-a.akamaihd.net +apiportalmorecom-a.akamaihd.net +apiqualitinknet-a.akamaihd.net +apis-acceptance.sharethrough.com +apis-ci.web.analytics.yahoo.com +apis-staging.sharethrough.com +apis.murdoog.com +apis.sharethrough.com +apis.staging.sharethrough.com +apis.web.analytics.yahoo.com +apiv2.moengage.com +apiv3.moengage.com +apix.web.analytics.yahoo.com +apnonline.112.2o7.net +apo.ero-advertising.com +apodir.oewabox.at +apollo.internal.glbs.keen.io +apolloadlv.hit.gemius.pl +apopt.hbmediapro.com +aporg.112.2o7.net +app-ab12.marketo.com +app-ab13.marketo.com +app-ab14.marketo.com +app-ab15.marketo.com +app-ab16.marketo.com +app-ab17.marketo.com +app-ab18.marketo.com +app-ab19.marketo.com +app-ab20.marketo.com +app-ab21.marketo.com +app-ab22.marketo.com +app-ab23.marketo.com +app-ab24.marketo.com +app-abc.marketo.com +app-abd.marketo.com +app-analytics.snapchat.com +app-dev.instartlogic.com +app-lon08.marketo.com +app-measurement.com +app-nation.marketo.com +app-qe.marketo.com +app-sj04.marketo.com +app-sj08.marketo.com +app-sjf.marketo.com +app-sjo5.marketo.com +app-sjqe.marketo.com +app-stage.truconversion.com +app-www.nation.marketo.com +app.activetrail.com +app.adjust.com +app.admedo.com +app.adsbrook.com +app.adx1.com +app.api.jivox.com +app.appsflyer.com +app.ascend.ai +app.beanstalkdata.com +app.boa.exacttarget.com +app.brightinfo.com +app.convertkit.com +app.datafastguru.info +app.dev.extremereach.com +app.dev.jivox.com +app.dev.pardot.com +app.eazybiz.ng +app.exacttarget.com +app.extremereach.com +app.extremereach.com.extremereach.com +app.fancifulapp.cool +app.freshmarketer.com +app.getambassador.com +app.getresponse.com +app.getsitecontrol.com +app.graphly.io +app.instartlogic.com +app.intellimize.co +app.intuit.launchdarkly.com +app.jivox.com +app.kargo.com +app.lisnr.com +app.mashero.com +app.medyanetads.com +app.monetizze.com.br +app.mopub.com +app.mparticle.com +app.onlinesucces.nl +app.optimizely.com +app.pathful.com +app.pendo.io +app.pho8.com +app.picreel.com +app.pr0gramm.com +app.preview.exacttarget.com +app.pubserver.adhood.com +app.qa.exacttarget.com +app.returnpath.net +app.s1.exacttarget.com +app.s1.qa2.exacttarget.com +app.s2.qa2.exacttarget.com +app.s4.exacttarget.com +app.s50.exacttarget.com +app.scanscout.com +app.software-phile.com +app.spotxchange.com +app.stage.driftt.com +app.storage.yunvm.com +app.super-links.net +app.syndicaster.tv +app.test.exacttarget.com +app.truconversion.com +app.tst.returnpath.net +app.ubertags.com +app.visualwebsiteoptimizer.com +app.whoisvisiting.com +app.winwords.adhood.com +app.wootric.com +app.yesware.com +app.yieldify.com +app1.letitbefaster.life +app1.letitbefaster.website +app1.letmacworkfaster.site +app1.letslowbefast.site +app2.downloadmacsoft.world +app2.letitbefaster.life +app2.letitbefaster.website +app2.letmacwork.world +app2.letmacworkfaster.site +app2.letslowbefast.life +app2.letslowbefast.site +app2.returnpath.net +app2.salesmanago.pl +app3.letitbefaster.life +app3.letitbefaster.website +app3.letmacwork.world +app3.letslowbefast.site +app3.makeitworkfaster.life +app4.greatmacsoft.tech +app4.letitbefaster.life +app4.letitbefaster.website +app4.letslowbefast.life +app4.letslowbefast.site +app4.letslowbefast.today +app4com.bestgrade4update.trade +app5.fastermac.tech +app5.letitbefaster.life +app5.letitbefaster.website +app5.letslowbefast.site +apparel-offer.com +apparelncs.com +appboy.com +appcache.admission.net +appcaptcha.com +appcdn.tvpage.com +appcenter.bronto.com +appcentre.bronto.com +appchoices.rubiconproject.com +appdemo.eazybiz.ng +appdev.addthis.com +appdynamics.com +appelamule.com +appengage-fyber.fyber.com +appengage-video-staging.fyber.com +appengage-video.fyber.com +appengage-video.staging.fyber.com +appetizers.appsee.com +appexchange.exacttarget.com +appfixing.space +appfox.org +appgasstation.com +appgrowth.appsee.com +appie.com +appiq.mobi +apple-protection.info +apple.com--------scanner.bid +apple.com------support.host +apple.com-----scanner.club +apple.com-analysis-safety-antimalware-support.accountant +apple.com-internet-security-review.info +apple.com-internet-security-review.review +apple.com-notice.info +apple.com-onlinesupport.host +apple.com-onlinesupport.site +apple.com-safetyalert.com +apple.com-scan-virus-detected.com +apple.com-security-desktop-antimalware-support.download +apple.com-store.me +apple.com-supportcenter.pro +apple.com-supportcenter.website +apple.com-web-security-analysis.win +apple.com-webbrowsing-security.bid +apple.com-webbrowsing-security.download +apple.com-webbrowsing-security.review +apple.com-webbrowsing-security.science +apple.com-webbrowsing-security.site +apple.com.clean-virus-mac.com +apple.com.virus-mac.com +apple.comscoreresearch.com +appleld.apple.com.t5j2kdkc88dd2m423-verif.info +applestore.com-mobile.gift +applets.sulekha.com +application-software-store-net.win +applicationcodeshopnet.win +applicationcodeshopwebs.win +applicationinsights.microsoft.com +applicationpremium70.club +applicationsoftwareshopnet.win +applicationsoftwarestorenet.win +applicationstat.com +applifier.info +applift.com +applink.intentmedia.net +applog.camera360.com +applog.uc.cn +applyfix.tech +appnexus.com +appodeal.com +apppersonalization.api.intuit.com +apprep.smartscreen.microsoft.com +approval.qwapi.com +approvals.s50.exacttarget.com +apps-cloud.xyz +apps-dev-bos.yottaa.com +apps-dev-new.yottaa.com +apps-dev.yottaa.com +apps.admission.net +apps.adtz.com +apps.airfind.com +apps.bizible.com +apps.buzzcity.net +apps.clickcash.com +apps.conduit-banners.com +apps.customerexchange-uat.thunderhead.com +apps.customerexchange.thunderhead.com +apps.epom.com +apps.id.net +apps.mobilityware.com +apps.nastydollars.com +apps.onecommunity-uat.thunderhead.com +apps.onecommunity.thunderhead.com +apps.p03.eloqua.com +apps.p07.eloqua.com +apps.panadvert.com +apps.secure.eloqua.com +apps.shareaholic.com +apps.www02.secure.eloqua.com +apps.yottaa.com +apps3.cointraffic.io +apps5.oingo.com +apps9039.super-your-prize33.loan +appscout.us.intellitxt.com +appsdorado.com +appsecurityr.com +appsee.com +appsflyer-impressions-1319352537.eu-west-1.elb.amazonaws.com +appsflyer-web-1810875176.eu-west-1.elb.amazonaws.com +appsflyer-web-2-1926050047.eu-west-1.elb.amazonaws.com +appsflyer-web-3-1052820924.eu-west-1.elb.amazonaws.com +appsflyer-web-4-962407740.eu-west-1.elb.amazonaws.com +appsflyer-web-5-2093104013.eu-west-1.elb.amazonaws.com +appsflyer.com +appsrv1.madserving.cn +appstatic.bronto.com +apptester.tk +apptesting.appsee.com +apptrckr.com +aproxtrack2.com +aps.hearstnp.com +aps.media.adrevolver.com +apt.campaign.adobe.com +apteka2000.pl +aptitude.newversionupdatefreshand4you.space +apture.com +apusx.com +apx-plugin.sizmek.com +apx.moatads.com +aqqgli3vle.bid +aquasoft.us.intellitxt.com +aquaticowl.com +ar.2.cqcounter.com +ar.5.p2l.info +ar.adserver.yahoo.com +ar.atwola.com +ar.hao123.com +ar.voicefive.com +ar1.atwola.com +ar1nvz5.com +ar7.atwola.com +ar9.atwola.com +arabicsexphoto.yourfreesites.com +arabtechmessenger.net +arank.com +arbo.hit.gemius.pl +arboe.oewabox.at +arbomedia.pl +arbopl.bbelements.com +arc1.msn.com +arcade.ya.com +arcadefree.com +architecturaldesigns.us.intellitxt.com +archive.coolerads.com +archswimming.com +ard.sexplaycam.com +ard.sweetdiscreet.com +ard.xxxblackbook.com +ardrone.swoop.com +are-ter.com +are.clevernt.com +area51-ts.com +areagame.pl +areasnap.com +arecio.work +arena.altitude-arena.com +arena.altitudeplatform.com +arenda-yeisk.ru +arendatora.ru +areolas.org +arewater.com +areyouabot.net +areyouahuman.co +argamez.com +argondenims.siliconorchard.com +argondrug.com +argyresthia.com +arhiv-porno.info +ariba.112.2o7.net +ariboo.com +aricie.free.fr +arightcharlie.whodigital.com +arion-api.staging.us-east-1.kops.kargo.com +aripaadee.hit.gemius.pl +aripaee.adocean.pl +aritzal.com +arizona-miner.tk +arizonalionscamp.org +arkallia.free.fr +arkartex.ru +arkinsoftware.in +arkitektmuseet.se +arklighting.co +arkonfinance.pl +arkonziv.com +arlettefm.free.fr +arlingtonmommy.com +arm2pie.com +armaanitravels.com +armanix.white.prohosting.com +armdoctor.ru +armsart.com +armsved.dk +aromamirror.com +arpabol.com +arqmdiaz.com.ar +arquitecturaeinteriores.com +arraty.altervista.org +arrayshift.com +arriendomesas.cl +arrivalist.com +arrowsports.de +arrowtravel.net +arsch-loch.de +arschamps.com +arschficken.at +arsconsole.global-intermedia.com +arsdev.net +arshard.com +arsri.com +arstaparkbilvard.se +art-archiv.ru +art-art-art.info +art-fashion.pl +art-music-rewardpath.com +art-n-couture.com +art-nym.info +art-offer.com +art-offer.net +art-photo-music-premiumblvd.com +art-photo-music-rewardempire.com +art-photo-music-savingblvd.com +artcccp.com +artcomix.com +artdeli.co.kr +arteenimagen.net +artefakct.com +artel116.ru +arteone77.buckshost.com +arteprofana.com +arteriaatelie.com +artesanoperfumista.com +artesproduction.com +arteysexo.com +arthosurface.com +arthritis.atspace.com +arthurmiddletoncapit.tt.omtrdc.net +artials.com +articized.com +articlefulltime.com +articlefuns.cn +articleidea.cn +artifactory-qa-p01.exacttarget.com +artifactory-qa-p02.exacttarget.com +artifactory-qa-p03.exacttarget.com +artifactory-xt-p01.exacttarget.com +artifactory-xt-p02.exacttarget.com +artifactory-xt-p03.exacttarget.com +artifactory-xt-p04.exacttarget.com +artifactory-xt-p05.exacttarget.com +artifactory-xt-p06.exacttarget.com +artifactory-xt-s50.exacttarget.com +artifactory.corp.mixpanel.com +artisangarricmickael.fr +artisbags.com +artistdirect.us.intellitxt.com +artiste-lust-katie-fey.blogomer.com +artnq.com +artnudegallerys.com +artoferotica.nu +artsconsortium.org +arttest.thegoldenpath.biz +artwork.aim4media.com +arvetellefsen.no +arvigoshop.com +arvut.org +as-sec.casalemedia.com +as.5.p2l.info +as.5to1.com +as.adfonic.net +as.adwise.bg +as.autoforums.com +as.casalemedia.com +as.cfcdist.loan +as.cfcnet.top +as.criteo.com +as.criteo.net +as.ebz.io +as.eu.angsrvr.com +as.featurelink.com +as.gostats.com +as.jivox.com +as.medscape.com +as.pmates.com +as.rtb.adx1.com +as.sexad.net +as.specificmedia.com +as.vs4entertainment.com +as.webmd.com +as.wiahoas581.pw +as.y.atwola.com +as.yl.impact-ad.jp +as1.advfn.com +as1.casinocity.com +as1.cfcnet.gdn +as1.falkag.de +as1.inoventiv.com +as1.mistupid.com +as1image1.adshuffle.com +as1image2.adshuffle.com +as2.autoforums.com +as2.falkag.de +as3.falkag.de +as4.falkag.de +as5000.com +asa-api.aws.rubiconproject.com +asa.tynt.com +asa01-ashbur03.247realmedia.com +asa5510-02.hq.adready.com +asaclaim.com +asacopaco.tk +asacredstone.com +asadventure.tt.omtrdc.net +asafetyguide.com +asap-task-scheduler-shadow.snapads.com +asap-task-scheduler-staging.snapads.com +asap-task-scheduler.snapads.com +asap.sharethrough.com +asb.tynt.com +asbschildersbedrijf.be +ascat.porn +ascend.ai +ascentdata.irganalytics.com +ascentdatadirect.irganalytics.com +ascentive.com +aschreib.oewabox.at +aschricke.free.fr +asco.d2.sc.omtrdc.net +ascout24.oewabox.at +asctmd.com +asd.tynt.com +asdawest.com +asdfanlli-jdna.org +asdfg.pro +asdfjkl.info +asdfz.pro +ase.adserver.snapads.com +ase.clmbtech.com +asecurecraft.com +aserve.directorym.com +aservices.party +asg01.casalemedia.com +asg02.casalemedia.com +asg03.casalemedia.com +asg04.casalemedia.com +asg05.casalemedia.com +asg06.casalemedia.com +asg07.casalemedia.com +asg08.casalemedia.com +asg09.casalemedia.com +asg10.casalemedia.com +asg11.casalemedia.com +asg12.casalemedia.com +asg13.casalemedia.com +ash.creativecdn.com +asha.edu.ph +asham.tourstogo.us +asharna.com +ashburnnailsalon.com +ashemaletune.com +ashley-judd.net +ashlynnbrooke.biz +ashlynnbrookevideos.com +ashokdamodaran.com +ashow.pcpop.com +ashsrightdirection.com +ashvale.com +asia.monerise.com +asia.qualtrics.com +asia1.cpufan.club +asian.streamate.com +asianread.com +ask-coder.com +ask-gps.ru +ask.webatall.com +askads.ask.com +askbot.com +askjolene.ero-advertising.com +asklots.com +askmen.thruport.com +askmen.us.intellitxt.com +askmen2.us.intellitxt.com +askto.net +asm2.z1.adserver.com +asm3.z1.adserver.com +asmedia.adsupplyssl.com +asn.advolution.de +asn.cunda.advolution.biz +asophoto.com +asotrack1.fiksu.com +asotrack1.fluentmobile.com +asotrack2.fiksu.com +aspera.extremereach.com +aspera.extremereach.com.extremereach.com +aspesa.info +asphaltdesperados.de +aspirehive.com +aspirin.about-tabs.com +aspp.atom.adjust.com +asprintfreedom.com +asqcondenast.nuggad.net +asqlesechos.nuggad.net +asqnext.nuggad.net +asqrtl.nuggad.net +asridge.siliconorchard.com +asrvrep-a.akamaihd.net +asrvvv-a.akamaihd.net +ass-2-mouth.com +ass.gold10.com +assasin.siliconorchard.com +assbusters.net +asscenihotosidea.blogspot.com +assculturaleincontri.it +asseenonpc.directtrack.com +asseenontv.ru +assess.vet.cmu.ac.th +assessni.co.uk +asset.appdynamics.com +asset.pagefair.com +asset.pagefair.net +asset.tabloidbintang.com +asset1.fyber.com +asset2.fyber.com +asset3.fyber.com +asset4.fyber.com +assets-acceptance.sharethrough.com +assets-auto.rbl.ms +assets-auto.rbl.ms.cdn.cloudflare.net +assets-staging.sharethrough.com +assets.acceptance.sharethrough.com +assets.adobedtm.com +assets.adsttc.com +assets.adtaily.com +assets.adtech.de +assets.adtechus.com +assets.alphonso.tv +assets.applovin.com +assets.buysellads.com +assets.cdn.ispot.tv +assets.cntdy.mobi +assets.consumedmedia.com +assets.context.ly +assets.convertkit.com +assets.customer.io +assets.customerio.netdna-cdn.com +assets.demo.pardot.com +assets.drawbrid.ge +assets.github.exacttarget.com +assets.igapi.com +assets.ipcdigital.co.uk +assets.jetlore.com +assets.kampyle.com +assets.kixer.com +assets.kochava.com +assets.kromtech.net +assets.luminate.com +assets.pcrl.co +assets.percentmobile.com +assets.popmarker.com +assets.prebid.org +assets.rbl.ms +assets.sharethrough.com +assets.staging.sharethrough.com +assets.tapad.com +assets.ui.optimizely.com +assets.videoamp.com +assets.vidora.com +assets.www.paperg.com +assets1.adroll.com +assets1.exgfnetwork.com +assets3.admulti.com +assfrenzy.com +assfuckers.nu +assinatura.com.pt +assoc-amazon.com +assoc-msdk-cn.amazon-adsystem.com +assoc-msdk-eu.amazon-adsystem.com +assoc-msdk-fe.amazon-adsystem.com +assoc-msdk-metrics-us.amazon-adsystem.com +assoc-msdk-us.amazon-adsystem.com +associatedcontent.112.2o7.net +associatesexports.com +astalavista.box.sk +astatic.weborama.fr +aster18cdn.nl +aster18prx.nl +astrocash.org +asu.msmu.ru +asv.nuggad.net +asvoxod.ru +asy.a8ww.net +async01.admantx.com +at-adserver.alltop.com +at-img1.tdimg.com +at-img2.tdimg.com +at-img3.tdimg.com +at.amgdgt.com +at.atwola.com +at.campaigns.f2.com.au +at.ceofreehost.com +at.gmads.net +at.m1.nedstatbasic.net +at.ontargetjobs.com +ata.ero-advertising.com +atax.askmen.com +atcofiles.com +atdmt.com +atemda.com +athena-ads.wikia.com +atinna.com +ativan.ourtablets.com +atl-dc01.marketo.net +atl-dc02.marketo.net +atl-sslvpn.silverpop.com +atl.my.bidsystem.com +atl.xmlsearch.miva.com +atlanta01.monero.hashvault.pro +atlanticgam.online +atlanticmedia.122.2o7.net +atlasdmt.com +atlassian.122.2o7.net +atlassian.fyber.com +atlassian2.fyber.com +atlcourier.com +atm.youku.com +atmovs.com +atofilms.com +atom.adjust.com +atousoft.com +atout-energie-69.com +atp.mxptint.net +atrd.netmng.com +atrk.alexametrics.com +atspace.de.intellitxt.com +attdcmtest.dev.paperg.com +atti.velti.com +attractiveafternoon.com +attribution.snapads.com +attribution.webmarketing123.com +attributiontracker.com +atvplus.oewabox.at +atwola.com +atyss.barginginfrance.net +au-cdn.effectivemeasure.net +au-gmtdmp.gd3.mookie1.com +au.2.cqcounter.com +au.ads.link4ads.com +au.adserver.yahoo.com +au.audience.newscgp.com +au.doubleclick.net +au.effectivemeasure.net +au.pixel.newscgp.com +au.tags.newscgp.com +au.track.decideinteractive.com +au.youmi.net +au052.insightexpress.com +au1.qualtrics.com +aubrandsummit.exponential.com +auction-master.ads.prd.ie.internal.unity3d.com +auction.unityads.unity3d.com +auctionads.com +auctionads.net +auctiondirectory.org +aud.pubmatic.com +audacity.fr +audi4e.oewabox.at +audia6.com +audible.112.2o7.net +audience.ad.yieldmanager.net +audience.newscgp.com +audience.tapad.com +audience2media.com +audienceinsights.com +audienceinsights.net +audiencesuite.sizmek.com +audiensis.com +audio.de.intellitxt.com +audioknigi.club +audiomax.adswizz.com +audiomax.devel.adswizz.com +audit.extremereach.com +audit.median.hu +audit.trackverify.com +audit.webinform.hu +augur.io +augvtjtnsfnxg.ru +auiehechoulh.ru +aujourdhui.refr.adgtw.orangeads.fr +aumo123usedcarscom.112.2o7.net +aumoautomobilemagcom.112.2o7.net +aumoautomotivecom.112.2o7.net +aumoautomotivectl.112.2o7.net +aumocarsbelowinvoice.112.2o7.net +aumointernetautoguidecom.112.2o7.net +aumomotortrend.112.2o7.net +aumonewcarcom.112.2o7.net +aumotradeinvaluecom.112.2o7.net +aureate.com +aurelius.httpool.com +auroramine.com +aus-mec-tracking.adalyser.com +aus-smv-tracking.adalyser.com +aus.laola1.tv +auslieferung.commindo-media-ressourcen.de +auspice.augur.io +auspolice.com +aussiemethod.com +aussieroadtosuccess.com +australianewzealandb.tt.omtrdc.net +austria-car-rental.findworm.net +austria.oewabox.at +austria1.adverserve.net +ausvpn.thunderhead.com +ausvpn2.thunderhead.com +auth-canary.flurry.com +auth-san.exacttarget.com +auth.a.pxi.pub +auth.api.driftt.com +auth.avs.io +auth.boa.exacttarget.com +auth.corp.instartlogic.com +auth.crypto-webminer.com +auth.exacttarget.com +auth.global.exacttarget.com +auth.k8s-prod.fiksu.com +auth.k8s-test.fiksu.com +auth.livefyre.com +auth.mparticle.com +auth.poc.exacttarget.com +auth.qa1.exacttarget.com +auth.qa2.exacttarget.com +auth.qa3.exacttarget.com +auth.s1.exacttarget.com +auth.s1.qa1.exacttarget.com +auth.s1.qa2.exacttarget.com +auth.s1.qa3.exacttarget.com +auth.s1.qa5.exacttarget.com +auth.s100.exacttarget.com +auth.s2.qa1.exacttarget.com +auth.s2.qa2.exacttarget.com +auth.s2.qa3.exacttarget.com +auth.s4.exacttarget.com +auth.s5.exacttarget.com +auth.s50.exacttarget.com +auth.s6.exacttarget.com +auth.s7.exacttarget.com +auth.s8.exacttarget.com +auth.tune.com +authbe.sec.intl.miui.com +authcaptcha.com +authedmine.com +authedmine.eu +authedwebmine.cz +authentication-dev.demandbase.com +authentication.demandbase.com +authorisation.analyticson.com +authportal.optimizely.com +auto-bannertausch.de +auto-deals247.com +auto-moto-elektronika.cz +auto-overview.com +auto-px.dynamicyield.com +auto-windabweiser.de +auto-zapchasti.org +auto.allewagen.de +auto.monerise.com +auto.rusvile.lt +auto2000.ru +auto4style.ru +autoanythingcom.112.2o7.net +autoaribagsettlement.com +autobilan-chasseneuillais.fr +autobudpostach.club +autobytel.112.2o7.net +autobytelcorppopup.112.2o7.net +autocarcomprod.112.2o7.net +autochoixspinelli.com +autocontext.begun.ru +autocounter.marketgid.com +autocukejvmab26a.marketo.com +autodesk.tt.omtrdc.net +autodiscover.adviserplus.com +autodiscover.airvertiseme.com +autodiscover.analyticson.com +autodiscover.chartboost.com +autodiscover.clickconvertsell.com +autodiscover.corp.returnpath.com +autodiscover.corp.returnpath.net +autodiscover.datamark.net +autodiscover.demandbase.com +autodiscover.dotomi.com +autodiscover.eloqua.com +autodiscover.exacttarget.com +autodiscover.exponential.com +autodiscover.foresee.com +autodiscover.franklyinc.com +autodiscover.intelsad.com +autodiscover.ispot.tv +autodiscover.juicemobile.com +autodiscover.marketing365.mk +autodiscover.marketingmachine.co.za +autodiscover.maxpoint.com +autodiscover.midasplayer.com +autodiscover.o365.foresee.com +autodiscover.panadvert.com +autodiscover.pardot.com +autodiscover.postrelease.com +autodiscover.returnpath.com +autodiscover.returnpath.net +autodiscover.starkey.theappgrader.com +autodiscover.thunderhead.com +autodiscover.tritondigital.com +autodiscover.viewsignage.com +autodiscover.whoisvisiting.com +autoforums.us.intellitxt.com +autoguide.com.vsassets.com +autohipnose.com +autohits.dk +autologica.ga +automatad.com +automaticflock.com +automation.metaps.com +automatkredytowy.pl +automobi.oewabox.at +automobilemag.us.intellitxt.com +automoney.qtder.com +automoneygenerator.com +automotive-offer.com +automotive-rewardpath.com +automotive.us.intellitxt.com +automoto.oewabox.at +autonations.com +autopflegeprodukte.com +autopilot.dz.optimizely.com +autopilothq.com +autopub.misterbot.com +autoreparatie.nl +autoreply.co.uk +autos.msnbc.us.intellitxt.com +autoscout24.112.2o7.net +autospies.us.intellitxt.com +autoua.top +autoupdate.update4ever.xyz +autoversion.de +autovideobroadcast.com +autoweb.112.2o7.net +autoweb.tk +autowebmarket.com.ua +autoworldnews.us.intellitxt.com +autumntwilight.net +av-cash.com +av-clean.com +av-db.com +av.foresee.com +av0713.tk +ava-s.de +ava-von-eden.com +avada.nycwebapps.com +availit.weebly.com +avalon.topbucks.com +avangate.appsee.com +avantgardevisions.com +avantlink.com +avast-downloads.com +avatars.github.exacttarget.com +avazudsp.net +avcounter10.com +avd.innity.net +avdata.com +avecduplaisir.free.fr +avek.ru +avenfeld.com +avenue-du-sexe.com +avenuea.com +avenueainc.com +aveplay.com +aveprize.com +avero.xyz +averoconnector.com +aversis.net +avgtechnologies.112.2o7.net +aviapanda.ru +aviav.co +aviav.eu +aviav.org +aviav.ru +aviav.ru.com +avidflygare.se +avidnewssource.com +avidtrak.com +avijehdaroo.co +aviodg.eu +aviraoperations.d3.sc.omtrdc.net +avirasecureserver.com +avis.cm +avitocars.ru +aviva.112.2o7.net +avixxx.com +avkzarabotok.com +avkzarabotok.info +avlive.yes103.com +avocet.io +avocet.mgr.consensu.org +avoidaroid.com +avoidfilter.net +avon-novosib.ru +avon-severozapad.ru +avon-ukraine.com +avon.112.2o7.net +avp.innity.com +avpa.dzone.com +avpa.javalobby.org +avpayments.com +avppet.com +avrakougioumtzi.gr +avramstroy.ru +avsads.com +avskype.com +avt.hit.gemius.pl +avualrhg9p.bid +avualrhg9p0.bid +awardspace.de.intellitxt.com +awarenesstech.122.2o7.net +awarialaptopa.pl +away.us.intellitxt.com +aweber.com +awempire.com +awesome.bizible.com +awesomevipoffers.com +awin1.com +awltovhc.com +awrz.net +aws-adserver-origin-ap-northeast-1.adtechjp.com +aws-adserver-origin-ap-southeast-1.adtechjp.com +aws-adserver-origin.adtechjp.com +aws-cni-test.us-west-2.k8s.ops.tune.com +aws-production-banner-server-eu-west-1.banner-server.fyber.com +aws-production-banner-server-us-west-2.banner-server.fyber.com +aws-production-video-broker-eu-west-1.video-v2.fyber.com +aws-staging-banner-eu-west-1.staging-banner.fyber.com +aws.footprintdns.com +aws.kargo.com +aws.lijit.com +aws.rubiconproject.com +aws2sip.exponential.com +aws2webapp.exponential.com +aws2webconf.exponential.com +awstrack.me +awzbijw.com +ax-d.pixfuture.net +axbetb2.com +axdget-sync.nuggad.net +axel.hit.gemius.pl +aximsite.us.intellitxt.com +axiomaticalley.com +axisbuild.com +axoncoho.tk +axp.zedo.com +axsrv.com +ay.eastmoney.com +ayada.zapto.org +ayboll.sgsrv.com +ayehcleaners.com +ayerbo.xhost.ro +aymcsx.ru +aynachatsrv.com +az.5.p2l.info +az1.qualtrics.com +az27.pl +az361816.vo.msecnd.net +az512334.vo.msecnd.net +azcdn-preprod.criteo.net +azcdn.criteo.net +azcentra.app.ur.gcion.com +azkaban.adwyze.com +azoogleads.com +azoos.csheaven.com +azp.footprintdns.com +azr.footprintdns.com +azure-res-provider.newrelic.com +azure.appdynamics.com +azvjudwr.info +azz.badazz.org +b-1st.com +b-aws.aol.com +b-aws.huffingtonpost.com +b-code.liadm.com +b-eu10.stripcdn.com +b-eu15.stripcdn.com +b-eu4.stripcdn.com +b-eu5.stripcdn.com +b-eu6.stripcdn.com +b-eu8.stripcdn.com +b-eu9.stripcdn.com +b.6sc.co +b.a2gw.com +b.abnad.net +b.adbox.lv +b.adexchangemachine.com +b.admedia.com +b.admob.com +b.adnxs.com +b.ads1.msn.com +b.ads2.msads.net +b.ads2.msn.com +b.adx1.com +b.alot.com +b.am15.net +b.as-us.falkag.net +b.casalemedia.com +b.codeonclick.com +b.computerworlduk.com +b.detetoigrae.com +b.digitalartsonline.co.uk +b.ds1.nl +b.economedia.bg +b.ensighten.com +b.getprizenow.top +b.grabo.bg +b.kavanga.ru +b.lga.contextweb.com +b.liquidustv.com +b.measuread.com +b.mmnetwork.mobi +b.monetate.net +b.myspace.com +b.nevadaprivateoffice.com +b.nex.bg +b.oix.com +b.oix.net +b.proxy4.nullrefexcep.com +b.rad.atdmt.com +b.rad.live.com +b.rad.msn.com +b.recwwcc5.info +b.rmgserving.com +b.sc.omtrdc.net +b.scorecardresearch.com +b.siftscience.com +b.skinstore.com +b.sli-spark.com +b.stats.paypal.com +b.t.tailtarget.com +b.thanksearch.com +b.videoamp.com +b.webwise.com +b.webwise.net +b.webwise.org +b.wishabi.com +b.zeroredirect.com +b.zeroredirect1.com +b.zeroredirect2.com +b.zog.link +b1-prv.qualtrics.com +b1.adbrite.com +b1.azjmp.com +b1.midasplayer.com +b1.perfb.com +b100.takru.com +b120.takru.com +b130.takru.com +b140.takru.com +b180.takru.com +b1fe8a95ae27823.com +b2b.filecloud.me +b2bdemo.getambassador.com +b2bsuccessdemo.getambassador.com +b2c.com +b2cdemo.getambassador.com +b2csuccessdemo.getambassador.com +b3-eu.mookie1.com +b3-uk.mookie1.com +b3.mookie1.com +b3.staging.districtm.ca +b34rightym.com +b3a70b.t.axf8.net +b3d.com +b400393baba7cd476a3.com +b5057c.r.axf8.net +b59812ee54afcabd.com +b5media.us.intellitxt.com +b92adrs.hit.gemius.pl +b92rs.adocean.pl +ba.afl.rakuten.co.jp +ba1.midasplayer.com +babanetwork.adk2x.com +babes.ign.us.intellitxt.com +bablace.com +babos.scrapping.cc +babs.tv2.dk +babsy.foreverhorny.com +baby-soft.ca +baby.dorki.info +babycenter.tt.omtrdc.net +babycentercom.112.2o7.net +babyeishgames.com +babyf.oewabox.at +babylyst.com +babynow.org +babywantsbling.com +bacanal.cl +back.dog +back4.2giga.link +backalleyblowjobs.com +backbeatmedia.com +backdoor.thumblogger.com +backend.freecontent.win +backfill.ph.affinity.com +backgroundpictures.net +backlink4u.net +backlinkwatch.com +backoffice.evobinary.com +backofficellc.com +backonline.info +backpaininstantrelief.com +backseat-bangers.biz +backseatbangers-porn.info +backseatcuddler.us.intellitxt.com +backstage.taboola.com +backtrace.io +backuperwebcam.weebly.com +backvids.com +baconredirects-elb-eyweax7fhr0v-300945382.us-east-1.elb.amazonaws.com +bacr.com.pk +badaboem.nl +badge.clevergirlscollective.com +badges.adsttc.com +badmactogoodmac.space +badmactogoodmac.tech +badservant.guj.de +badults.se +badv.wp.pl +bag.mobile.system.video.sms13.de +bagslap.com +bagsonsale.online +bahisstratejileri.info +baiduccdn1.com +baidutv.baidu.com +bajarlo.net +balab.portx.net +balabass.peerserver.com +balakin.popunder.ru +balancebreath.com +bale.alphonso.tv +balleralert.us.intellitxt.com +balloontexture.com +ballsack.org +ballymoreboardingkennels.ie +balois.worldbreak.com +balook.com +baltgem.com +bam-pilot.iovation.com +bam.nr-data.net +bambi.ck.ua +bamboo-testing.districtm.net +bamboo.districtm.net +bamo.xsl.pt +bamrot.com +ban.xpays.com +ban3ers.ero-advertising.com +ban4ers.ero-advertising.com +banan.tv +bananacashback.com +bananapower.net +bananarepubic.com +bandelstjohns.com +bandisintown.com +bandleader.com.br +bandoc.d-group.co.il +bandwidthx.com +bandwidthx.net +baner.energy-torrent.com +banerator.net +banery.acr.pl +banery.netart.pl +banery.onet.pl +banex.bikers-engine.com +banex.search.bg +bang-hotties.com +bangbrosporn.org +bangbross.info +bangherboobs.com +banginamateurs.com +bangkokbabes.nu +bangkokcitythumbs.com +banik.redigy.cz +banjers.ero-advertising.com +bank01.ads.dt.mydas.mobi +bank01.ads.mp.mydas.mobi +bank02.ads.dt.mydas.mobi +bank02.ads.mp.mydas.mobi +bank03.ads.dt.mydas.mobi +bank03.ads.mp.mydas.mobi +bank04.ads.dt.mydas.mobi +bank04.ads.mp.mydas.mobi +bank05.ads.dt.mydas.mobi +bank05.ads.mp.mydas.mobi +bank06.ads.dt.mydas.mobi +bank06.ads.mp.mydas.mobi +bank07.ads.dt.mydas.mobi +bank07.ads.mp.mydas.mobi +bank08.ads.dt.mydas.mobi +bank08.ads.mp.mydas.mobi +bank09.ads.dt.mydas.mobi +bank09.ads.mp.mydas.mobi +bank10.ads.dt.mydas.mobi +bank10.ads.mp.mydas.mobi +bank11.ads.dt.mydas.mobi +bank11.ads.mp.mydas.mobi +bank12.ads.dt.mydas.mobi +bank12.ads.mp.mydas.mobi +bank13.ads.dt.mydas.mobi +bank13.ads.mp.mydas.mobi +bank15.ads.dt.mydas.mobi +bank15.ads.mp.mydas.mobi +bank16.ads.dt.mydas.mobi +bank16.ads.mp.mydas.mobi +bank17.ads.dt.mydas.mobi +bank17.ads.mp.mydas.mobi +bank18.ads.dt.mydas.mobi +bank18.ads.mp.mydas.mobi +bank19.ads.dt.mydas.mobi +bank19.ads.mp.mydas.mobi +bank20.ads.dt.mydas.mobi +bank20.ads.mp.mydas.mobi +banka-navibor.by +bankcrediti.ru +bankfirsttennessee.biz +banki-credit-online.ru +banki.onet.pl +banki76.ru +bankiem.pl +bankmib.ru +bankofamerica.tt.omtrdc.net +bankrate.112.2o7.net +bankwest.112.2o7.net +banlv.baidu.com +banman.isoftmarketing.com +banman.nepsecure.co.uk +bann12s.ero-advertising.com +bann13s.ero-advertising.com +bann14s.ero-advertising.com +bann1rs.ero-advertising.com +bannanarepublic.com +banne2s.ero-advertising.com +banne3s.ero-advertising.com +banne4s.ero-advertising.com +banner-a.oddcast.com +banner-d.oddcast.com +banner-exchange-24.de +banner-img.haber7.com +banner-server.fyber.com +banner-server.winecountry.com +banner.0catch.com +banner.1and1.co.uk +banner.50megs.com +banner.ad.nu +banner.adserverpub.com +banner.adsrevenue.net +banner.advertising.com +banner.affactive.com +banner.ambercoastcasino.com +banner.betfred.com +banner.betroyalaffiliates.com +banner.betwwts.com +banner.boostbox.com.br +banner.buempliz-online.ch +banner.casino.net +banner.casinodelrio.com +banner.casinotropez.com +banner.cdpoker.com +banner.clubdicecasino.com +banner.content-ad.net +banner.cotedazurpalace.com +banner.coza.com +banner.cz +banner.date.com +banner.diamondclubcasino.com +banner.easyspace.com +banner.elisa.net +banner.ero-advertising.com +banner.euroads.no +banner.eurogrand.com +banner.europacasino.com +banner.finn.no +banner.finzoom.ro +banner.free6.com +banner.freeservers.com +banner.fyber.com +banner.getgo.de +banner.goldenpalace.com +banner.hpmdnetwork.ru +banner.img.co.za +banner.inyourpocket.com +banner.joylandcasino.com +banner.kanald.com.tr +banner.kiev.ua +banner.lbs.km.ru +banner.linux.se +banner.media-system.de +banner.mindshare.de +banner.missingkids.com +banner.monacogoldcasino.com +banner.newyorkcasino.com +banner.nixnet.cz +banner.noblepoker.com +banner.nonstoppartner.de +banner.northsky.com +banner.nttnavi.co.jp +banner.oddcast.com +banner.orb.net +banner.passion.com +banner.penguin.cz +banner.piratos.de +banner.play-asia.com +banner.playgatecasino.com +banner.prestigecasino.com +banner.publisher.to +banner.rbc.ru +banner.relcom.ru +banner.ringofon.com +banner.scasino.com +banner.search.bg +banner.sedem.bg +banner.synergy-e.com +banner.tanto.de +banner.tattomedia.com +banner.techarp.com +banner.terminal.hu +banner.titan-dsl.de +banner.titanpoker.com +banner.tonygpoker.com +banner.usacasino.com +banner.vadian.net +banner.vrs.cz +banner.webmersion.com +banner.webtools24.net +banner.wirenode.com +banner1.pornhost.com +banner2.inet-traffic.com +banner2.isobarturkiye.net +bannerads.anytimenews.com +bannerads.de +bannerads.mantecabulletin.com +bannerads.zwire.com +banneradvertising.adclickmedia.com +bannerboxes.com +bannerco-op.com +bannercommunity.de +bannerconnect.com +bannerconnect.net +bannerdriven.ru +bannerexchange.cjb.net +bannerexchange.troglod.com +bannerfarm.ace.advertising.com +bannerflow.com +bannergrabber.internet.gr +bannerhost.com +bannerhost.egamingonline.com +bannerimage.com +bannerimages.0catch.com +bannerlandia.com.ar +bannerlink.xxxtreams.com +bannermall.com +bannermanager.bnr.bg +bannermarkt.nl +bannerpower.com +bannerpromotion.it +bannerrotation.sexmoney.com +banners.2lipslive.com +banners.4d5.net +banners.absolpublisher.com +banners.adfox.ru +banners.adgoto.com +banners.adnetmedia.lt +banners.adultfriendfinder.com +banners.adventory.com +banners.advidi.com +banners.affiliatefuel.com +banners.affiliatefuture.com +banners.affilimatch.de +banners.aftrk.com +banners.alo.bg +banners.alt.com +banners.amfibi.com +banners.amigos.com +banners.analyticson.com +banners.asiafriendfinder.com +banners.askmecca.com +banners.audioholics.com +banners.babylon-x.com +banners.betcris.com +banners.bghelp.co.uk +banners.bgmaps.com +banners.bigchurch.com +banners.bigmobileads.com +banners.blogads.com +banners.bol.com.br +banners.bol.se +banners.brinkin.com +banners.broadwayworld.com +banners.camdough.com +banners.cams.com +banners.celebritybling.com +banners.clickon.co.il +banners.clips4sale.com +banners.clubseventeen.com +banners.content.rude.com +banners.copyscape.com +banners.crakcash.com +banners.crisscross.com +banners.czi.cz +banners.datecs.bg +banners.delivery.addynamo.com +banners.dine.com +banners.dir.bg +banners.direction-x.com +banners.directnic.com +banners.dnastudio.com +banners.dogfart.com +banners.dol.gr +banners.e-dologic.co.il +banners.easydns.com +banners.easysolutions.be +banners.ebay.com +banners.ero-advertising.com +banners.expressindia.com +banners.ffsbg.com +banners.flair.be +banners.flingguru.com +banners.free6.com +banners.freett.com +banners.friendfinder.com +banners.fuckbookhookups.com +banners.fuifbeest.be +banners.fulltiltpoker.com +banners.gayfriendfinder.com +banners.germanfriendfinder.com +banners.getiton.com +banners.globovision.com +banners.host.bannerflow.com +banners.icams.com +banners.images.streamray.com +banners.img.uol.com.br +banners.ims.nl +banners.inetfast.com +banners.iop.org +banners.ipotd.com +banners.iq.pl +banners.isoftmarketing.com +banners.japantoday.com +banners.jewishfriendfinder.com +banners.kfmb.com +banners.ksl.com +banners.lativio.com +banners.leadingedgecash.com +banners.linkbuddies.com +banners.looksmart.com +banners.lottoelite.com +banners.meccahoo.com +banners.mediaparade.net +banners.mellowads.com +banners.millionairemate.com +banners.moreniche.com +banners.mynakedweb.com +banners.nbcupromotes.com +banners.netcraft.com +banners.news1.co.il +banners.newsru.com +banners.nextcard.com +banners.nova.bg +banners.outpersonals.com +banners.outster.com +banners.oxiads.fr +banners.passion.com +banners.payserve.com +banners.pennyweb.com +banners.penthouse.com +banners.perfectgonzo.com +banners.pinnaclesports.com +banners.popads.net +banners.primaryclick.com +banners.realitycash.com +banners.resultonline.com +banners.rexmag.com +banners.rspworldwide.com +banners.rude.com +banners.rushcommerce.com +banners.securedataimages.com +banners.seniorfriendfinder.com +banners.sexsearch.com +banners.sextracker.com +banners.spiceworks.com +banners.sublimedirectory.com +banners.swapfinder.com +banners.sys-con.com +banners.takru.com +banners.tempobet.com +banners.thegridwebmaster.com +banners.thestranger.com +banners.thgimages.co.uk +banners.thirdmovies.com +banners.thiswillshockyou.com +banners.thomsonlocal.com +banners.toteme.com +banners.tribute.ca +banners.truecash.com +banners.tucson.com +banners.unibet.com +banners.valuead.com +banners.victor.com +banners.videosecrets.com +banners.videosz.com +banners.virtuagirlhd.com +banners.webcams.com +banners.webcounter.com +banners.webmasterplan.com +banners.weboverdrive.com +banners.weselltraffic.com +banners.wunderground.com +banners.yllix.com +banners.zbs.ru +banners.ztod.com +banners1.ero-advertising.com +banners1.linkbuddies.com +banners2.castles.org +banners2.ero-advertising.com +banners3.spacash.com +bannerserver.com +bannersgomlm.buildreferrals.com +bannersgomlm.com +bannershotlink.perfectgonzo.com +bannersng.yell.com +bannerspace.com +bannersurvey.biz +bannerswap.com +bannersxchange.com +bannert.ru +bannertest.adtech.de +bannertest.adtechus.com +bannertesting.com +bannerus1.axelsfun.com +bannerus3.axelsfun.com +bannery.cz +bannevs.ero-advertising.com +banniere.reussissonsensemble.fr +bannieres.acces-contenu.com +bans.adserver.co.il +bans.bride.ru +banstex.com +bansys.onzin.com +bantam.ai.net +bar.baidu.com +bar.freelogs.com +bar.rad.atdmt.com +barafranca.iwarp.com +barbarousnerve.com +barclaysghana.org +bargainbeautybuys.com +bargainpda.us.intellitxt.com +bargainracks.co.uk +barilliance.net +barnesandnoble.bfast.com +barsy.blogspot.com +bartekzukiewicz.pl +basebanner.com +basecamp.qualtrics.com +baselinemag.us.intellitxt.com +basepush.com +baskettexture.com +bastardly.us.intellitxt.com +basterr.popunder.ru +bat-bing-com.a-0001.a-msedge.net +bat.bing-int.com +bat.bing.com +batbuilding.com +batch.iovation.com +batchlogging4.truecaller.com +batcoroadlinescorporation.com +bats.video.yahoo.com +battleoftheprizes.club +battleon.directtrack.com +baublebar.sp1.convertro.com +bauersagtnein.myeffect.net +bavners2.ero-advertising.com +bawdybeast.com +bayoubuzz.advertserve.com +baypops.com +baywttgdhe.download +bazafilmowa.org +bazandegan.com +bazar.oewabox.at +bazasprawdzianow.pl +bb.connextra.com +bb.crwdcntrl.net +bb.o2.eyereturn.com +bbads.sv.publicus.com +bbads.sx.atl.publicus.com +bbc.112.2o7.net +bbcdn-bbnaut.ibillboard.com +bbcdn-tag.ibillboard.com +bbcdn.code.new.smartcontext.pl +bbcdn.delivery.reklamz.com +bbcdn.go.adlt.bbelements.com +bbcdn.go.adlv.bbelements.com +bbcdn.go.adnet.bbelements.com +bbcdn.go.arbo.bbelements.com +bbcdn.go.arbopl.bbelements.com +bbcdn.go.cz.bbelements.com +bbcdn.go.eu.bbelements.com +bbcdn.go.ihned.bbelements.com +bbcdn.go.pl.bbelements.com +bbcdn.go.pol.bbelements.com +bbcnewscouk.112.2o7.net +bbelements.com +bbg.d1.sc.omtrdc.net +bbg.sc.omtrdc.net +bbn.img.com.ua +bbnaut.bbelements.com +bbnaut.ibillboard.com +bbs.bjchun.com +bbs.ws +bbtv.blinkx.com +bbvacolombia.sc.omtrdc.net +bc.5.p2l.info +bc.marfeel.com +bc43.pl +bc685d37-266c-488e-824e-dd95d1c0e98b.statcamp.net +bcanalytics.bigcommerce.com +bcbsks.com.102.112.2o7.net +bcdn.automatad.com +bcn.cpufan.club +bcnquintana.impresionesweb.com +bcp.crwdcntrl.net +bd.tapad.com +bd.vungle.com +bd0dc.v.fwmrm.net +bdb.oewabox.at +bde.be +bde3d.com +bdg-analytics.appspot.com +bdgadv.ru +bdnad1.bangornews.com +bdsmcompany.com +bdsmtours.com +bdv.bidvertiser.com +bdx.comclick.com +be-funk.com +be-wild.pl +be.ads.justpremium.com +be.adserver.yahoo.com +be.fyber.com +be.nedstat.net +be.sitestat.com +bea4.v.fwmrm.net +beach-top.info +beachfrontio.com +beachpics.com +beacon-1.newrelic.com +beacon-17-537698933.us-east-1.elb.amazonaws.com +beacon-3.newrelic.com +beacon-all.walmart.com.akadns.net +beacon-maxis.krxd.net +beacon-streamer.saymedia.com +beacon-us-iad2.rubiconproject.com +beacon-us-iad3.rubiconproject.com +beacon-us-west.rubiconproject.com +beacon.ads.scanapps.com +beacon.adtouchlabs.com +beacon.advertisingbeacon.co.uk +beacon.affil.walmart.com +beacon.afy11.net +beacon.aimtell.com +beacon.airvertiseme.com +beacon.apptrckr.com +beacon.campaigndeputy.com +beacon.clickequations.net +beacon.cracked.com +beacon.ehow.com +beacon.errorception.com +beacon.examiner.com +beacon.geo.netflix.com +beacon.gu-web.net +beacon.guim.co.uk +beacon.gutefrage.net +beacon.hookedmediagroup.com +beacon.jump-time.net +beacon.jumptime.com +beacon.krxd.net +beacon.lijit.com +beacon.livefyre.com +beacon.mediahuis.be +beacon.netflix.com +beacon.samsclub.com +beacon.scanapps.com +beacon.scorecardresearch.com +beacon.searchlinks.com +beacon.securestudies.com +beacon.sojern.com +beacon.statful.com +beacon.t402.livefyre.com +beacon.terratracker.com +beacon.thred.woven.com +beacon.tracelytics.com +beacon.tru.am +beacon.tunecore.com +beacon.us-west-2.prodaa.netflix.com +beacon.vicinity-marketing.com +beacon.walmart.ca +beacon.walmart.com +beacon.wikia-services.com +beaconin2.notinote.me +beacons.extremereach.io +beacons.helium.com +beacons.hottraffic.nl +beads.sx.atl.publicus.com +beam.hlserve.com +beamincrease.com +beamkite.com +bean-bang.ru +beanextra.com +beap-bc.yahoo.com +beap.ad.yieldmanager.net +beap.adx.yahoo.com +beap.gemini.yahoo.com +beap1.cb.g01.yahoodns.net +beauty-tea.com +beauty.finaltips.com +beautyden.us.intellitxt.com +beautysafari.com +bebe.alphonso.tv +bebi.com +bebo.crwdcntrl.net +becanium.com +becconet.com +beckham.alphonso.tv +becl23.b2.gns.co.il +becomedebtfree.com.au +becomegorgeous.us.intellitxt.com +bedach.stream +bedsbreath.com +beedigital.truconversion.com +beemray.com +beespace.com.ua +beeviewd.com +befirstcdn.com +begun.ru +behavioralengine.com +bei.nuggad.net +beka.pl +bel-dag-001.ispot.tv +bel-dag-003.ispot.tv +beldiplomcom.75.com1.ru +belicimo.pw +beliefnet.us.intellitxt.com +belierlaine.com +bell.adcentriconline.com +bellca.112.2o7.net +bellglobemediapublishing.122.2o7.net +bellglovemediapublishing.122.2o7.net +bellsandroses.pl +bellserviceeng.112.2o7.net +belointeractive.122.2o7.net +beloysoff.ru +belstat.com +belstat.nl +bemydate.mobi +benchemail.bmetrack.com +bender.appboy.com +benealed.com +benefitslver.com +benifitsaccess.org +benikgeil.nl +benimreklam.com +benny.arbeid.free.fr +benoit.reyt.free.fr +benpres-holdings.com +benrie.stream +bensbargains.net +bentala.com +bentham-editorial.com +benvideos.com +beologopedie.nl +berateveng.ru +berkleynude.ca.tt +berldk.nuggad.net +berp.com +berserkpl.net.pl +bertelwissenprod.122.2o7.net +beseenad.looksmart.com +besstbuy.com +best-coupon-offer.com +best-pr.info +best-rated-offers.com +best-search.cc +best-seo-offer.com +best-seo-solution.com +best-strippers.com +best-top.ro +best-wygrane.com.pl +best.alphonso.tv +best100catfights.com +best2017games.com +best2018games.com +best5768.checkyourmoneybox98.loan +bestadbid.com +bestappinstalls.com +bestboundary.com +bestbuy.demdex.net +bestcoinsignals.com +bestcontentonline.com +bestgift4you.cn +besti.ga +bestjobs.hit.gemius.pl +bestlolaray.com +bestmobiworld.com +bestoffers.activeshopper.com +bestofpush.com +bestofupload.info +bestorican.com +bestphoneapps.mobi +bestplacetobuyeriacta.jw.lt +bestpornofree.com +bestpornxlxx.blogs-blogs.com +bestpriceninja.com +bestpromocenter.com +bestpromoland.com +bestrailtrain.info +bestrecipes.ru +bestreview.site +bestsearch.com +bestsearch.net +bestsecurepractice.com +bestselections.top +bestserials.com +bestshemalehentai.com +bestshockers.com +bestshopperrewards.com +bestsologirls.thumblogger.com +beststocktrend.com +bestsumppumpreviews.com +besttrannies.info +bestware.org +bestwaypest.com +bestwaystogetpaid.us +bestwebsiteawards.com +bestwebsitesawards.com +bestwm.info +bestwrinklecreamnow.com +bestxxx.org +bet-at-home.com +bet-online.petrovka.info +bet-prognoz.com +bet.122.2o7.net +bet.ch +bet.demdex.net +bet365.com +bet9a.com +beta-adserver.adtech.de +beta-adserver.adtechus.com +beta-imageserver.adtech.de +beta-imageserver.adtechus.com +beta-jp.adlearnop.advertising.com +beta-lombardi.advertising.com +beta-p.shopcurbside.com +beta-s.shopcurbside.com +beta-shop.shopcurbside.com +beta-uk.adlearnop.advertising.com +beta.ace.advertising.com +beta.addesk.advertising.com +beta.adlearnop.advertising.com +beta.adwyze.com +beta.adx1.com +beta.api.adlearnop.advertising.com +beta.api.adx1.com +beta.app.optimizely.com +beta.automatad.com +beta.coinblind.com +beta.coinrail.io +beta.developers.marketo.com +beta.easy-hit-counter.com +beta.easy-hit-counters.com +beta.easyhitcounters.com +beta.galleries.paperstreetcash.com +beta.hotkeys.com +beta.keen.io +beta.meeting.inlocomedia.com +beta.mobileapptracking.com +beta.monerise.com +beta.newopenx.detik.com +beta.optimizely.com +beta.outbrain.com +beta.reports.advertising.com +beta.shopcurbside.com +beta.tune.com +beta.valassisdigital.com +beta.vungle.com +betaadserv001.adtech.de +betama.ru +betanews.us.intellitxt.com +betblog.net +betclic.com +beterdoctor.com +beterment.com +bethie.free.fr +bethpagesetlement.com +bethpagesettelment.com +bethpagessettlement.com +betmaker.org +betmummy.com +betonka.pro +betpromo247.com +bettenversand.de +betterhdporn.com +betterhg.112.2o7.net +betterhomeandgardenideas.com +betterperformance.goldenopps.info +betterphotosextechnique.yourfreesites.com +betterscooter.com +betterstay.cn +bettes-free-porn-pictures.gocunt.com +betting-online.petrovka.info +betune.onlinewebshop.net +between.rtb.adx1.com +betwinservice.com +beurette-chaleur.com +beurette93.com +bevo-eu-west-1.adsnative.com +bevo-us-east-1.adsnative.com +bewaslac.com +bewhoyouare.gq +bewilderedblade.com +bewox.net +bewumuhax.bid +bextra-store.shengen.ru +bextra.ourtablets.com +beyaek3.top +beyond-api.shopkick.com +beyondhollywood.us.intellitxt.com +beyonduserpaid.api.intuit.com +beyondwhois.com +bezoglasa.online +bezproudoff.cz +bf.mocda1.com +bf4codes.dlcodes.com +bf4secondassault.dlcodes.com +bfast.com +bfgytu-indgtoy.tk +bfmio.com +bfw-vermittlungskontor.de +bfz.biz +bg.2.cqcounter.com +bg.adocean.pl +bg.hit.gemius.pl +bg.search.etargetnet.com +bg.static.etargetnet.com +bg6s0.com +bgbaner.com +bggde-new.adocean.pl +bggde.adocean.pl +bgl1dr1-a-fixed.sancharnet.in +bgl1pp1-a-fixed.sancharnet.in +bgrel.bonedmilfs.com +bgtop100.com +bgwebads.com +bh.contextweb.com +bh1.doubleclick.net +bharatdefencekavach.com +bhavanabank.com +bhclicks.com +bhcumsc.com +bhgdiabeticliving.112.2o7.net +bhgdiy.112.2o7.net +bhgkitchenbath.112.2o7.net +bhgmarketing.112.2o7.net +bhgquilting.112.2o7.net +bhgremodel.112.2o7.net +bhgscrap.112.2o7.net +bhmais.com.br +bhmenavkijeufq.bid +bhojpurtoday.com +bhosadwa.com +bhpipoz.pl +bhyuu.com +bhzejltg.info +bi-collector.oneapm.com +bi.advidi.com +bi.adview.pl +bi.demandbase.com +bi.medscape.com +bianche.it +biberukalap.com +bibitu.ru +bibliophile.free.fr +bibys.com +bicat.allinviews.com +bicat.beeviewd.com +bicat.bestcontentonline.com +bicat.installfarm.com +bicat.placeyourview.com +bicat.shoofle.tv +bid.ace.advertising.com +bid.axiatraders.com +bid.contextweb.com +bid.dc3.videoamp.com +bid.g.doubleclick.net +bid.grandonmedia.com +bid.openx.net +bid.pubmatic.com +bid.snapads.com +bidbuy.co.kr +bidclix.com +bidclix.net +bidder.criteo.com +bidder.pcl.exponential.com +bidder.rtk.io +bidder.talkingpointsmemo.com +bidentonrccom.122.2o7.net +bidgear.com +bidr.io +bidr.trellian.com +bidswitch-rtbcat.rtb.adx1.com +bidswitch.net +bidswitch.rdb.adx1.com +bidswitch.rtb.adx1.com +bidsystem.com +bidtraffic.com +bidvertiser.com +bielertb.wemfbox.ch +bier.win +biermanns-hof.de +bieshubbs.com +bifrost-ash.247realmedia.com +bifrost-lon.247realmedia.com +bifrost-ny.247realmedia.com +bifrost-pa.247realmedia.com +big-ass-sex.com +big-cum-shots.nu +big-dicks.biz +big-mammaries.biz +big-shemale.net +big-tit-porn-links.com +big-tit-porn.inhit.com +big-tit.flywebs.com +big-tit.tabrays.com +big-tits-land.info +big-tits-ranch.com +bigads.guj.de +bigairusa.com +bigames.online +bigapple.contextuads.com +bigb00bs.biz +bigbangads.go2cloud.org +bigbangmedia.com +bigbigforums.us.intellitxt.com +bigblackpussy.biz +bigboobsexpics.com +bigbootydaddy.com +bigbrandpromotions.com +bigbrandrewards.com +bigchris.tk +bigcities.org +bigclicks.com +bigcloseups.thumblogger.com +bigcockencounters.thumblogger.com +bigcockloversrejoice.com +bigcockthumbs.org +bigconsider.com +bigdata.adfuture.cn +bigdata.adsunflower.com +bigdata.adups.com +bigdata.advmob.cn +bigdickblog.info +bigdicklistcom.thumblogger.com +bigdiscounted.ru +bigdix.easygaysex.com +bigerotik.biz +bigfoot.sp.backtrace.io +bigfreelotto.com +bigfuckingtits.info +biggestgiftrewards.com +bighop.com +bighow.net +bigideas.kargo.com +bigip1.hitbox.com +bigip2.hitbox.com +bigmart.com.np +bigmaturewomen.galleryprogram.com +bigmobileads.com +bignatural.info +bigornot.com +bigpage.de +bigpayout.go2jump.org +bigpenisguide.com +bigpond.122.2o7.net +bigrain.com +bigsearch.biz +bigsextits.com +bigsharkmedia.com +bigsik.com +bigsmart.com +bigteenboobs.net +bigtit2008porn.blogs-blogs.com +bigtitporn.nu +bigtitregistry.thumblogger.com +bigtits.xxxallaccesspass.com +bigtitshot.com +bigtitsthumbs.org +bigtitstoday.com +bigtittedteens.com +bijuteriistarmd.ro +bike-path.com +bikeforumsnet.skimlinks.com +biketank.ga +biketoworkdaywinnipeg.org +bikhire.com +bikini-image.com +bikinirotica.com +bilbaopisos.es +bilbo.counted.com +bilbob.com +bild.de.intellitxt.com +bild.ivwbox.de +bilder-upload.eu +bildungsluecke.com +bill.agent.56.com +bill.agent.v-56.com +bill.ccbill.com +bill.ecsuite.com +billboard.cz +billboard.vungle.com +billboards.marketing365.mk +billing.backtrace.io +billing.returnpath.com +billing.speedboink.com +billing.taboola.com +bimg.abv.bg +bimonline.insites.be +bin.clearspring.com +bin.pinion.gg +binadroid.com +bindedge.com +bindfast.com +bingo-online.petrovka.info +bingorevenue.directtrack.com +bink.uk.intellitxt.com +binomo.com +binsservicesonline.info +bio-chemik24.pl +biosmagazine.uk.intellitxt.com +biotalerz.pl +bip.presage.io +bir.snjack.info +biromacos.com +birta.stats.is +birth-control.1.p2l.info +bis-ssl.allinviews.com +bis-ssl.beeviewd.com +bis-ssl.bestcontentonline.com +bis-ssl.installfarm.com +bis-ssl.placeyourview.com +bis-ssl.shoofle.tv +bis-ssp-ssl.allinviews.com +bis-ssp-ssl.beeviewd.com +bis-ssp-ssl.bestcontentonline.com +bis-ssp-ssl.installfarm.com +bis-ssp-ssl.placeyourview.com +bis-ssp-ssl.shoofle.tv +bis-ssp.allinviews.com +bis-ssp.beeviewd.com +bis-ssp.bestcontentonline.com +bis-ssp.installfarm.com +bis-ssp.placeyourview.com +bis-ssp.shoofle.tv +bis.allinviews.com +bis.beeviewd.com +bis.bestcontentonline.com +bis.installfarm.com +bis.placeyourview.com +bis.shoofle.tv +bis.vidazoo.com +biscuitbutt.com +biseksualni.qii.pl +bisexland.com +bisexuell.at +bismatic.com +bit-coin-trader.com +bit-tech.uk.intellitxt.com +bit.imprev.net +bitads.net +bitbucket-testing.districtm.net +bitbucket.districtm.net +bitburg.adtech.de +bitburg.adtech.fr +bitburg.adtech.us +bitcast-a.v1.iad1.bitgravity.com +bitcast-d.bitgravity.com +bitcoadz.io +bitcoin-pay.eu +bitcoin.siliconorchard.com +bitcoiner.win +bitcoinmillionairepro.com +bitcoinplus.com +bitdrive.112.2o7.net +bitmedia.io +bitmedianetwork.com +bitonclick.com +bitpirata.com +bitporno.sx +bitraffic.com +bitsearch.org +bitstalks.com +bitt.co.uk +bittenandbound.us.intellitxt.com +bitter-buch.de +bivouac-iguana-sahara-merzouga.com +biwwltvcom.112.2o7.net +biwwltvcom.122.2o7.net +biz-offer.com +biz.vsassets.com +biz2us.info +biz5.sandai.net +bizad.nikkeibp.co.jp +bizarrepassion.org +bizarro.be +bizarro.nu +bizarrporn.com +bizbor.popunder.ru +bizcheapjerseyswholesalechina.com +bizible.com +bizjournals-d.openx.net +bizjournals.112.2o7.net +bizneed.com +biznesplay.biz +bizographics.com +bizoninvest.com +bizopprewards.com +bizrate.com +bizzclick.rtb.adx1.com +bizzclicknative.rtb.adx1.com +bizzibeans.net +bj02.cww.com +bj04.com +bj7kpvd.gandjaltilogoki.com +bjetjt.com +bjgaxcstxlvm.bid +bjknjsfrevt.bid +bjkookfanmxx.bid +bjmrnfwcoqp.bid +bjorkbacken.nu +bjorksta.men +bjselectric.com +bjssj0917.com +bjswchnxfoui.bid +bjzm365.com +bk.et.w.inmobi.com +bkbogosettlement.com +bkeueifcqeicli.bid +bkgr.se +bkns.vn +bkp.emea.mxptint.net +bkp.mxptint.net +bkrntr.netmng.com +bkrtx.com +bksn.se +bl.wavecdn.de +bl11-253-38.dsl.telepac.pt +blabla4u.adserver.co.il +black-booty.org +black-girls-sex.info +black-js.github.io +black-lesbian-sex.com +black-lesbian.biz +black-porn-star.net +black-porn.nu +black-pussy.nu +black-sex-links.net +black-xxx.biz +black.convertkit.com +black.demo.dmp.piwik.pro +black.soju.openx.net +black24porn.com +blackamateursex.net +blackandbeautiful.thumblogger.com +blackandblew.com +blackandthick.com +blackasslover.com +blackbabe.eroticamag.com +blackbitches.be +blackbitches.nu +blackboobs.centuryhost.com +blackbreath.com +blackchek.popunder.ru +blackcherrys.com +blackcollegegirls.com +blackcunts.nu +blackdnyc.com +blackettesexe.com +blackexgfsnude.com +blackfalcon5.net +blackfuck.biz +blackgangbangs.galleryprogram.com +blackgirlworld.com +blackhardcore.nu +blackhat.be +blackhatworth.com +blackjuggs.com +blackkeyclub.com +blackle.com +blacklinepartners.pl +blacklogic.info +blacknite.eu +blackporno.nu +blackpornstars.co.uk +blackpress.122.2o7.net +blackpussi.com +blackpussy.nu +blackscissor.com +blacksecuritygroup.com +blacksexualunderground.com +blacksnake.com +blacksportsonline.us.intellitxt.com +blackteenmodels.com +blackwidowxxx.com +blackwitchcraft.ru +blackwoman.nu +blagovest-med.ru +blah.insnw.net +blanchardautosaleshoquiam.com +blarclaycardus.com +blasen.la +blasir.com +blasphemysfhs.info +blast4traffic.com +blastro.us.intellitxt.com +blatant8jh.info +blatfee.ero-advertising.com +blavia.00author.com +bleachbit.com +bleepingcomputer.us.intellitxt.com +blekko.com +blender3d.fr +blenz-me.net +blethenmaine.112.2o7.net +blickonl.wemfbox.ch +bliga.oewabox.at +bling1.midasplayer.com +bling2.midasplayer.com +blingbucks.com +blismedia.com +bliss.rtb.adx1.com +blissinstalls.com +blisstree.us.intellitxt.com +blitz.appdynamics.com +blitz01.ops.appdynamics.com +blitzadbg.hit.gemius.pl +blitzbg.adocean.pl +blkrad.rad.atdmt.com +blkrpt.rad.atdmt.com +blobar.org +block.sw1block.com +blockchain.jsecoin.com +blockchained.party +blockmetrics.com +blog-hanger.autopilothq.com +blog-hits.com +blog-in.biz +blog-test.autopilothq.com +blog.33across.com +blog.adasiaholdings.com +blog.addthis.com +blog.adroll.com +blog.adspaces.ero-advertising.com +blog.adwyze.com +blog.adx1.com +blog.adyoulike.com +blog.airpr.com +blog.alphonso.tv +blog.appboy.com +blog.appdynamics.com +blog.appsee.com +blog.autopilothq.com +blog.aweber.com +blog.branch.io +blog.byethost.com +blog.calq.io +blog.clearbit.com +blog.count.ly +blog.curalate.com +blog.drawbrid.ge +blog.drift.com +blog.driftt.com +blog.ero-advertising.com +blog.fgl.com +blog.flurry.com +blog.fullstory.com +blog.fyber.com +blog.gumgum.com +blog.intelsad.com +blog.intercom.com +blog.intercom.io +blog.intext.ero-advertising.com +blog.jacekpaciorek.pl +blog.keen.io +blog.lisnr.com +blog.marketing365.mk +blog.marketo.com +blog.motorcycle.com.vsassets.com +blog.newrelic.com +blog.optimizely.com +blog.placed.com +blog.privy.com +blog.replacemycontacts.com +blog.returnpath.com +blog.roboinside.me +blog.staging.appdynamics.com +blog.taboola.com +blog.tapjoy.com +blog.tenjin.com +blog.thirdpresence.com +blog.tritondigital.com +blog.vicedata.com +blog.videoamp.com +blog.viewbix.com +blog.vilynx.com +blog.vizury.com +blog.yottaa.com +blog2.placed.com +blogads.com +blogads.ebanner.nl +blogadswap.com +blogchanie.com +blogcounter.com +blogcounter.de +blogde.taboola.com +blogfr.taboola.com +bloggernetwork-d.openx.net +bloggers.fuckyoucash.com +blogherads.com +blogjp.taboola.com +blogonews.com +blogpt.taboola.com +blogrankers.com +blogrush.com +blogtalkradio.crwdcntrl.net +blogtest.placed.com +blogtoplist.se +blogtopsites.com +blogvertising.pl +blow-job-paysite-preview-street.vip-show.net +blowfish.hitbox.com +blowjob-porno.com +blowjobers.com +blowjobhdmovies.com +blowjobsexjob.blogs-blogs.com +blowmebaby.nu +blowmoldings.com +blowtube.mobi +blox.minexmr.com +blpmovies.com +blt.onlinesucces.nl +blu.mobileads.msn.com +blue-js.github.io +blue-pill-shop.com +blue.demo.dmp.piwik.pro +blue.fonbet.dmp.piwik.pro +blue.sexer.com +blue.soju.openx.net +blueadvertise.com +bluecutsystem.com +bluediamondoffers.com +bluehparking.com +bluekai.com +bluelagoonconstructions.com.au +bluelithium.com +bluemateur.free.fr +bluemountain1.com +bluemountain2.com +bluemounten.com +bluenight.org +blueporn.de +bluerobot.info +bluesberry.se +bluescreenalert.com +bluescreenerrors.net +bluesilk.info +bluesite.co.uk +bluesman.nu +bluestreak.com +bluewaffle.biz +bluewhaleweb.com +bluewin.wemfbox.ch +bluewinsource.weebly.com +bluhostedbanners.blucigs.com +blumepower.net +blushingbeast.com +blushingboundary.com +blutjung.thumblogger.com +bluyonder.co.uk +blw4-1.com +bm.alimama.cn +bm.annonce.cz +bm.met.vgwort.de +bmcm.ml +bmcm.pw +bmnadutub.ru +bmnr.pw +bmo.hosting.exacttarget.com +bmpx.pw +bms.msk.bg +bms.qa-dest.imprev.net +bms.sportal.ru +bms.xenium.bg +bmst.pw +bmvip.alimama.cn +bmw-serviceweb.de +bmwhighperformers.com +bmwmoter.122.2o7.net +bn-01.adtomafusion.com +bn.adx1.com +bn.bfast.com +bn.premiumhdv.com +bn.profiwin.de +bnc.lt +bnewsb.com +bnfastigheter.se +bng.in +bnk30livejs.112.2o7.net +bnkholic.112.2o7.net +bnkicomv2.112.2o7.net +bnkr8dev.112.2o7.net +bnmgr.adinjector.net +bnrs.ilm.ee +bnsolutions.com.au +bnsoutlaws.co.uk +bnsr.com +bntbcstglobal.112.2o7.net +bnvxcfhdgf.blogspot.com.es +bo-nichons.com +bo.allinviews.com +bo.beeviewd.com +bo.bestcontentonline.com +bo.installfarm.com +bo.jumptap.com +bo.placeyourview.com +bo.promotions.skype.com +boa-0918-verify-login-2014.icrb.cl +boa-plc.com +boa.exacttarget.com +boaonline.ga +board.classifieds1000.com +boattraider.com +bob.dmpxs.com +boca.urbanairship.com +bodysecretrevelation.com +boersego-ads.de +boilingbeetle.com +boilingumbrella.com +bokee.allyes.com +bokotraffic.com +boksy.dir.onet.pl +boksy.onet.pl +boldride.us.intellitxt.com +bolero.wemfbox.ch +boloz.com +bolt.us.intellitxt.com +bombermen.free.fr +bombes-orientales.com +bombla.org +bombshells.blogomer.com +bomcl.richmetrics.com +bon-do-marketu.pl +bondage-fantasies.boinkers.com +bondage-here.com +bondage-porn.net +bondage-teens.com +bondagefilm.dk +bondagemart.com +bondagepics.nu +bondageporn.100toppages.com +bondageporn.nu +bondiwebdesign.com +bonintnewsktarcom.112.2o7.net +bonjo.bmbsklep.pl +bonneville.112.2o7.net +bonniercorp.122.2o7.net +bontril.1.p2l.info +bontril.ourtablets.com +bonus.tapjoy.com +bonuscashh.com +bony-zakupowe.pl +bonydodrogerii.eu +bonyodziezowe.eu +bonypodarunkowe.com.pl +bonzaivids.com +bonzbuddy.com +bonzibuddi.com +bonzybuddy.com +boob.dk +boobfilter.com +boobi.biz +booble.dk +boobrater.net +boobs-club.com +boobshack.com +boobsimge.com +booby-fever.blogomer.com +boobz.tv +boogie-blog.com +boogu.barginginfrance.net +book.phone.telus.sms13.de +book31.free.fr +bookclub-offer.com +bookhome.info +bookmaker-bet.com +bookofkisl.com +bookpdf.services +bookproplus.com +books-analytics-events.apple.com +books-analytics-events.news.apple-dns.net +books-media-edu-premiumblvd.com +books-media-edu-rewardempire.com +books-media-rewardpath.com +boole.onlinewebshop.net +boomads.com +boomcash.org +boomsgkenwewjoytto.net +boonwurrung.org.au +boost-my-pr.de +boost-qa2.districtm.ca +boost.mobile.nextel.sms13.de +boost.mobile.ring.tone.sms13.de +boostinsurence.com +boostmobile.112.2o7.net +boostmyppc.com +boostsoftware.com +boostyour-t.com +bootdaily.us.intellitxt.com +booth.phone.sale.sms13.de +boots.fotopyra.pl +bootsonclearance.info +bootsoutlets-store12.info +bootstrap.livefyre.com +bootstrap.qa-ext.livefyre.com +bootstrap.t402.livefyre.com +bootstraplugin.com +bootydancer.com +bootyoftheday.com +bootyseeker.biz +booung.com +bopstermedia56.com +boracol-shop.de +borat.elticket.com.ar +borders.112.2o7.net +boredcrown.com +boringcoat.com +bormis.com +born-genius.se +bororango.com +borrower.it +boryskowalski.pl +bos-tapreq01.jumptap.com +bos-tapreq02.jumptap.com +bos-tapreq03.jumptap.com +bos-tapreq04.jumptap.com +bos-tapreq05.jumptap.com +bos-tapreq06.jumptap.com +bos-tapreq07.jumptap.com +bos-tapreq08.jumptap.com +bos-tapreq09.jumptap.com +bos-tapreq10.jumptap.com +bos-tapreq11.jumptap.com +bos-tapreq12.jumptap.com +bos-tapreq13.jumptap.com +bos-tapreq14.jumptap.com +bos-tapreq15.jumptap.com +bos-tapreq16.jumptap.com +bos-tapreq17.jumptap.com +bos-tapreq18.jumptap.com +bos-tapreq19.jumptap.com +bos-tapreq20.jumptap.com +bos.ads.nexage.com +boschetto-hotel.gr +boscovs.com.ssl.sc.omtrdc.net +bosecom.112.2o7.net +boskrut.com +bosman.pluto.ro +boston-d.openx.net +bostonbruinsteamstore.com +bostoncommonpress.112.2o7.net +bostonglobe.demdex.net +bostonscientificcorporation.112.2o7.net +bostonsubwayoffer.com +botd.wordpress.com +botd2.wordpress.com +boticariovalepresent.home.sapo.pt +botifiles.com +botosh.com +bottegavenetaloewesale.biz +bottleguy.com +botw.topbucks.com +boudja.com +bounce.s50.exacttarget.com +bounceexchange.com +bowithow.com +bowlgirl.com +bowlingle.com +box-land.ru +box.anchorfree.net +boxingscene.us.intellitxt.com +boxoff.net +boxoffice.urbanairship.com +boy4you.com +boyarena.com +boycamz.nl +bp.adkmob.com +bp.specificclick.net +bpath.com +bps.beweb.com +br.adserver.yahoo.com +br.comclick.com +br.fling.com +br.meetlocals.com +br.naked.com +br.newrelic.com +br.phorm.com +br.rawcomm.net +br.realitykings.com +br.returnpath.com +br.rk.com +bracalemusic.com +bracbetul.com +bracewellfamily.com +bradpittnow.us.intellitxt.com +brahe.apptimize.com +brain-dev.staging.us-east-1.kops.kargo.com +braincash.com +brainfall-d.openx.net +brainfox.com +brainyquote-d.openx.net +bramka-sms-za-darmo.pl +bramki.darmowe.sms.sms13.de +branch.io +branchlearn.com +brand.criteo.com +brand.extremereach.com +brand.returnpath.com +brandcdn.exacttarget.com +brandcenterdl.adobe.com +brandedleadgeneration.com +brandguidelines.outbrain.com +branding.taboola.com +brandoshmando.getambassador.com +brandreachsys.com +brandrewardcentral.com +brandsurveypanel.com +brangista.122.2o7.net +brans.pl +brapolice.com +brassrule.com +bravenet.com +bravo.israelinfo.ru +bravospots.com +braze.com +braze.eu +bre.fyber.com +bread-sentry.dev.pardot.com +breaksurvey.com +breakthroughtrend.com +brevardmusic.com +brf-corpca1.corp.mparticle.com +bricksandstonesgossip.us.intellitxt.com +bride1.com +bridge.ame.admarketplace.net +bridge.lga1.admarketplace.net +bridge.sf.admarketplace.net +bridge.sfo1.admarketplace.net +bridgetrack.com +bridgetrack.speedera.r3h.net +briebailey.tripod.com +brightcove.112.2o7.net +brightcove.map.fastly.net +brightfunnel.com +brighthouse.122.2o7.net +brighthub.us.intellitxt.com +brightinfo.com +brightonclick.com +brightroll.com +british-banners.com +britishskybroadcasti.tt.omtrdc.net +britneyspears.1stok.com +britneyspears.ca.tt +brittlefilet.com +brnys.netmng.com +broadboundary.com +broadcast.piximedia.fr +broadcastbed.com +broadcaster.streamate.com +broadcastpc.tv +broaddoor.com +broadent.vo.llnwd.net +broadspring.com +broadtech.co +broker-builder.staging-video-v2.fyber.com +broker.staging-video-v2.fyber.com +broker.video-v2.fyber.com +brokertraffic.com +brominer.com +bronto.com +brothersoft.us.intellitxt.com +browser-message.com +browser-notifications.bid +browser-tools.openx.net +browser-tools.systems +browseraccelerator.com +browserbreckalarm.info +browsergames2018.com +browserhawk.com +browsermine.12finance.com +browsermine.com +browserprotecter.com +browsersurf.12finance.com +browsesafemac.com +brp.mxptint.net +bruceclay.112.2o7.net +brucelead.com +brunga.at +brwser-message.pw +brxfinance.com +bs-creatives-fix.fyber.com +bs-creatives.fyber.com +bs-meta.yandex.ru +bs.israelinfo.ru +bs.serving-sys.com +bs.yandex.ru +bsads.looksmart.com +bsclick.adknowledge.com +bseaqmi.angelcities.com +bserver.blick.com +bsnj.eyeblaster.akadns.net +bspixel.bidsystem.com +bstats.adbrite.com +bsyauqwerd.party +bt.linkpulse.com +bt.phorm.com +bt.webwise.com +bt.webwise.net +bt.webwise.org +btb.adx1.com +btbusiness.d1.sc.omtrdc.net +btbusiness.tt.omtrdc.net +btc.cpufan.club +btcom.112.2o7.net +btds.artplay.info +btez8.xyz +btf-analytics.s3.amazonaws.com +btigspresalessandt.112.2o7.net +btlsurvey.com +btn.clickability.com +btn.counter.weather.ca +btnativedirect.com +btprmnav.com +btstatic.com +bttrack.com +btw.ero-advertising.com +bucket1.mm-syringe.com +bucketbean.com +bucksense.com +budget.airfind.com +budgetcarhire.112.2o7.net +budgetmobile.dev.airfind.com +budgetmobile.staging.airfind.com +budsinc.com +buffalogoesout.com +bugera.popunder.ru +bugify.viewbix.com +bugly.qq.com +bugs.viewbix.com +bugsnag.appstore.a2z.com +bugsurf.com +build.ares.inmobi.com +build.client.optimizely.com +build.dynamicyield.com +build.livefyre.com +build.qa-dest.imprev.net +build.tools.inmobi.com +build1500.scm.ev1.inmobi.com +builderonlinecom.112.2o7.net +builds.aca.bugsnag.appstore.a2z.com +builds.bugsnag.appstore.a2z.com +builds.firetv.bugsnag.appstore.a2z.com +buildviet.info +bukisa.us.intellitxt.com +bulgariabg.com +bulkquery2.petametrics.com +bulldog.122.2o7.net +bullseye.backbeatmedia.com +bullz-eye.us.intellitxt.com +bumerangshowsites.hurriyet.com.tr +bumpberam.pro +bumpshack.us.intellitxt.com +bundasnovinhas.com +bundle-geoip.herokuapp.com +bunny-net.com +bupropion-hcl.1.p2l.info +bureau.co.il +burns.adtech.de +burns.adtech.fr +burns.adtech.us +bus-offer.com +buschen.oewabox.at +business-made-fun.com +business-rewardpath.com +business.lbn.ru +business.msnbc.us.intellitxt.com +business.realtracker.com +businessbells.com +businessdealsblog.com +businessdirectnessource.com +businessedgeadvance.com +businessinsider.us.intellitxt.com +businessknowhow.us.intellitxt.com +businesspundit.us.intellitxt.com +businessweekpoc.112.2o7.net +buspar.1.p2l.info +buspirone.1.p2l.info +bustcream-pro.com +bustedcoverage.us.intellitxt.com +bustlinganimal.com +butalbital-apap.1.p2l.info +butcalve.com +butt-head.mos.ru +buttcandy.com +button.clickability.com +buttons.googlesyndication.com +buy-adipex-cheap-adipex-online.com +buy-adipex-online.md-online24.de +buy-adipex.aca.ru +buy-adipex.hut1.ru +buy-adipex.i-jogo.net +buy-adipex.petrovka.info +buy-carisoprodol.polybuild.ru +buy-cheap-phentermine.blogspot.com +buy-cheap-xanax.all.at +buy-cialis-cheap-cialis-online.info +buy-cialis-online.iscool.nl +buy-cialis-online.meperdoe.net +buy-cialis.freewebtools.com +buy-cialis.splinder.com +buy-diazepam.connect.to +buy-fioricet.hut1.ru +buy-flower.petrovka.info +buy-hydrocodone-cheap-hydrocodone-online.com +buy-hydrocodone-online.tche.com +buy-hydrocodone.aca.ru +buy-hydrocodone.este.ru +buy-hydrocodone.petrovka.info +buy-hydrocodone.polybuild.ru +buy-hydrocodone.quesaudade.net +buy-hydrocodone.scromble.com +buy-levitra-cheap-levitra-online.info +buy-lortab-cheap-lortab-online.com +buy-lortab-online.iscool.nl +buy-lortab.hut1.ru +buy-meds24.com +buy-phentermine-cheap-phentermine-online.com +buy-phentermine-online.135.it +buy-phentermine-online.i-jogo.net +buy-phentermine-online.i-ltda.net +buy-phentermine.hautlynx.com +buy-phentermine.polybuild.ru +buy-phentermine.thepizza.net +buy-tamiflu.asian-flu-vaccine.com +buy-ultram-online.iscool.nl +buy-valium-cheap-valium-online.com +buy-valium.este.ru +buy-valium.hut1.ru +buy-valium.polybuild.ru +buy-viagra.aca.ru +buy-viagra.go.to +buy-viagra.polybuild.ru +buy-vicodin-cheap-vicodin-online.com +buy-vicodin-online.i-blog.net +buy-vicodin-online.seumala.net +buy-vicodin-online.supersite.fr +buy-vicodin.dd.vu +buy-vicodin.hut1.ru +buy-vicodin.iscool.nl +buy-xanax-cheap-xanax-online.com +buy-xanax-online.amovoce.net +buy-xanax.aztecaonline.net +buy-xanax.hut1.ru +buy-zyban.all.at +buyandfun.review +buycialisonline.7h.com +buycialisonline.bigsitecity.com +buyclomidonlaine.com +buycom.122.2o7.net +buycustomessaysonline.com +buyers-dev.svc.kargo.com +buyers-service-dev.svc.kargo.com +buyessaynow.biz +buyfioricet.findmenow.info +buyfioricetonline.7h.com +buyfioricetonline.bigsitecity.com +buyfioricetonline.freeservers.com +buyforzat5.com +buyfriend.ru +buyhoverboard.com +buyhydrocodone.all.at +buyhydrocodoneonline.findmenow.info +buying.mobile.online.phone.samsung.uk.sms13.de +buyingedge.com +buyk.host.sk +buylevitra.3xforum.ro +buylevitra.net +buylevitraonline.7h.com +buylevitraonline.bigsitecity.com +buylicensekey.com +buylortabonline.7h.com +buylortabonline.bigsitecity.com +buymeacofee.com +buynorxx.com +buyonlineviagra.com +buypanicdisorderpill.com +buyparajumpers.online +buypaxilonline.7h.com +buypaxilonline.bigsitecity.com +buyphentermineonline.7h.com +buyphentermineonline.bigsitecity.com +buypillsorderonline.com +buypixelads.com +buyplatformbed.com +buypuppies.ca +buyscabiescream.com +buysellads.com +buyskype.ru +buyultramnow.com +buyvalium.polybuild.ru +buyviagra.polybuild.ru +buyvicodinonline.veryweird.com +buz2mobile.com +buzz-porno.info +buzz.mobiapp-games.com +buzzadnetwork.com +buzzbox.buzzfeed.com +buzzclicks.com +buzzdeck.com +buzzfeed.d1.sc.omtrdc.net +buzzfoto.us.intellitxt.com +buzzhumor.us.intellitxt.com +buzznet.112.2o7.net +buzzonclick.com +buzzprox.com +buzzsumo.com +buzzurl.jp +bvfsc.info +bvlgariring.xyz +bvlgariwallet.xyz +bvo.ch +bw-euwest-bidder.appd.inmobi.com +bw-useast-bidder.appd.inmobi.com +bw-uswest-bidder.appd.inmobi.com +bw.bidder.inmobi.com +bw1.midasplayer.com +bwlkup.alphonso.tv +bwlx.prepedu.cn +bwp.download.com +bwp.lastfm.com.com +bwp.mp3.com +bwp.news.com +bws3.midasplayer.com +bx6.blrf.net +bxnvdau.com +bxoemfpetyqi.bid +by-nightlife.de +by.adocean.pl +by.essl.optimost.com +by.optimost.com +by.uservoice.com +by98.com +bycontext.com +byecttekgbksr.bid +byet.org +byhyundai.com +byk49187.com +byla.pl +byme.se +bymeacoffee.com +bypass.heartsavior.net +bypass.secure.la +bypassdatabase.info +bypasseducation.com +bypasser.net +bytecoin.crypto-webminer.com +byubroadcast.112.2o7.net +byutv.d1.sc.omtrdc.net +bzresults.122.2o7.net +c-eu1.stripcdn.com +c-eu2.stripcdn.com +c-eu3.stripcdn.com +c-eu4.stripcdn.com +c-eu5.stripcdn.com +c-eu8.stripcdn.com +c-lt2.go-mpulse.net +c-lt3.go-mpulse.net +c-us1.stripcdn.com +c-us2.stripcdn.com +c-us3.stripcdn.com +c-us4.stripcdn.com +c-us5.stripcdn.com +c-us8.stripcdn.com +c.abnad.net +c.actiondesk.com +c.ad6media.fr +c.adbiq.com +c.adclickthru.net +c.adexchangemachine.com +c.adfirmative.com +c.admob.com +c.adroll.com +c.adskeeper.co.uk +c.algovid.com +c.am10.ru +c.am11.ru +c.amazon-adsystem.com +c.anytrx.com +c.ap1.dyntrk.com +c.ap2.dyntrk.com +c.ar.msn.com +c.as-us.falkag.net +c.at.msn.com +c.atdmt.com +c.baidu.com +c.be.msn.com +c.bebi.com +c.betrad.com +c.bigmir.net +c.bing.com +c.bksn.se +c.blogads.com +c.br.msn.com +c.bucksense.com +c.ca.msn.com +c.casalemedia.com +c.cfjump.com +c.chango.com +c.cintnetworks.com +c.cl.msn.com +c.cliop.com +c.cnstats.ru +c.cnzz.com +c.codeonclick.com +c.de.msn.com +c.dk.msn.com +c.dynad.net +c.eblastengine.com +c.ecliks.com +c.effectivemeasure.net +c.enhance.com +c.es.msn.com +c.eu1.dyntrk.com +c.evidon.com +c.f5mtrack.com +c.fi.msn.com +c.flx1.com +c.fqtag.com +c.fr.msn.com +c.gcp.msas.media.net +c.gmtrack.com +c.go-mpulse.net +c.googlesyndication.com +c.gr.msn.com +c.greystripe.com +c.gumgum.com +c.hit.ua +c.hk.msn.com +c.id.msn.com +c.ie.msn.com +c.il.msn.com +c.imedia.cz +c.in.msn.com +c.it.msn.com +c.jp.msn.com +c.jsrdn.com +c.l.qq.com +c.la1-c2-phx.salesforceliveagent.com +c.latam.msn.com +c.lomadee.com +c.lytics.io +c.marketgid.com +c.mdnhinc.com +c.medialytics.com +c.mgid.com +c.msas.media.net +c.msn.com +c.mtro.co +c.mttwtrack.com +c.my.msn.com +c.mystat-in.net +c.newsinc.com +c.ninemsn.com.au +c.nl.msn.com +c.no.msn.com +c.novostimira.biz +c.oix.com +c.oix.net +c.optvdo.com +c.pebblemedia.be +c.ph.msn.com +c.pioneeringad.com +c.pocitadlo.sk +c.prodigy.msn.com +c.pt.msn.com +c.quantserve.com +c.realtytrac.com +c.rmgserving.com +c.ru.msn.com +c.scorecardresearch.com +c.se.msn.com +c.securepaths.com +c.sg.msn.com +c.sharethis.mgr.consensu.org +c.silvinst.com +c.smartclick.net +c.spiegel.de +c.statcounter.com +c.supert.ag +c.t4ft.de +c.th.msn.com +c.thanksearch.com +c.thecounter.de +c.thestat.net +c.tr.msn.com +c.tw.msn.com +c.uarating.com +c.uk.msn.com +c.us1.dyntrk.com +c.velaro.com +c.vrvm.com +c.vserv.mobi +c.w.inmobi.com +c.webengage.com +c.webtrends.com +c.webwise.com +c.webwise.net +c.webwise.org +c.za.msn.com +c.zeroredirect.com +c.zeroredirect1.com +c.zeroredirect2.com +c0.adalyser.com +c0.amazingcounters.com +c01.smaato.net +c02.smaato.net +c03.adsummos.net +c03.smaato.net +c04.adsummos.net +c04.smaato.net +c05.smaato.net +c06.smaato.net +c07.smaato.net +c08.smaato.net +c09.smaato.net +c0i8h8ac7e.bid +c1.adform.net +c1.amazingcounters.com +c1.atdmt.com +c1.gostats.com +c1.navrcholu.cz +c1.nowlinux.com +c1.onedmp.com +c1.openx.org +c1.outster.com +c1.popads.net +c1.rfihub.net +c1.shoofle.tv +c1.smartclick.net +c1.statcounter.com +c1.teaser-goods.ru +c1.thecounter.com +c1.thecounter.de +c1.xxxcounter.com +c1.zedo.com +c1.zxxds.net +c10.smaato.net +c10.statcounter.com +c11.smaato.net +c11.statcounter.com +c11370896.c.youradexchange.com +c12.smaato.net +c12.statcounter.com +c13.smaato.net +c13.statcounter.com +c14.smaato.net +c14.statcounter.com +c14.zedo.com +c15.smaato.net +c15.statcounter.com +c16.smaato.net +c16.statcounter.com +c17.smaato.net +c17.statcounter.com +c18.smaato.net +c18.statcounter.com +c19.smaato.net +c19.statcounter.com +c1exchange.com +c2.amazingcounters.com +c2.clickprotects.com +c2.gostats.com +c2.l.qq.com +c2.outster.com +c2.popads.net +c2.rfihub.net +c2.shoofle.tv +c2.statcounter.com +c2.taboola.com +c2.tentaculos.net +c2.thecounter.com +c2.thecounter.de +c2.xxxcounter.com +c2.zedo.com +c20.smaato.net +c20.statcounter.com +c21.smaato.net +c21.statcounter.com +c22.smaato.net +c22.statcounter.com +c23.smaato.net +c23.statcounter.com +c2366475.c.youradexchange.com +c24.smaato.net +c24.statcounter.com +c25.smaato.net +c25.statcounter.com +c26.smaato.net +c26.statcounter.com +c27.smaato.net +c27.statcounter.com +c28.smaato.net +c28.statcounter.com +c29.smaato.net +c29.statcounter.com +c29new.smaato.net +c2c738.r.axf8.net +c2i-cdn.startappnetwork.com +c3.adalyser.com +c3.amazingcounters.com +c3.gostats.com +c3.gostats.ir +c3.openx.org +c3.outster.com +c3.statcounter.com +c3.thecounter.com +c3.xxxcounter.com +c3.zedo.com +c30.smaato.net +c30.statcounter.com +c31.smaato.net +c31.statcounter.com +c32.smaato.net +c32.statcounter.com +c33.smaato.net +c33.statcounter.com +c34.smaato.net +c34.statcounter.com +c35.smaato.net +c35.statcounter.com +c35000246.c.youradexchange.com +c36.smaato.net +c36.statcounter.com +c37.smaato.net +c37.statcounter.com +c38.smaato.net +c38.statcounter.com +c39.smaato.net +c39.statcounter.com +c3tag.com +c4.amazingcounters.com +c4.gostats.com +c4.gostats.ru +c4.iwon.com +c4.maxserving.com +c4.mysearch.com +c4.myway.com +c4.statcounter.com +c4.zedo.com +c40.smaato.net +c40.statcounter.com +c41.smaato.net +c41.statcounter.com +c42.smaato.net +c42.statcounter.com +c43.smaato.net +c43.statcounter.com +c44.smaato.net +c45.smaato.net +c45.statcounter.com +c46.smaato.net +c46.statcounter.com +c47.smaato.net +c48.smaato.net +c49.smaato.net +c4d-cdn.adcolony.com +c4dl.com +c4tracking01.com +c5.amazingcounters.com +c5.statcounter.com +c5.zedo.com +c50.smaato.net +c51.smaato.net +c52.smaato.net +c53.smaato.net +c54.smaato.net +c55.smaato.net +c56.smaato.net +c57.smaato.net +c58.smaato.net +c59.smaato.net +c6.amazingcounters.com +c6.edgesuite.net +c6.statcounter.com +c6.zedo.com +c60.smaato.net +c6530e.r.axf8.net +c7.adforgeinc.com +c7.amazingcounters.com +c7.statcounter.com +c7.zedo.com +c753738.r38.cf2.rackcdn.com +c7e935.netlify.com +c8.amazingcounters.com +c8.statcounter.com +c8.zedo.com +c9.amazingcounters.com +c9.statcounter.com +ca.2.cqcounter.com +ca.5.p2l.info +ca.abv.bg +ca.adserver.yahoo.com +ca.altitude-arena.com +ca.cdn.survey.medallia.com +ca.cqcounter.com +ca.iadsdk.apple.com +ca.intentmedia.net +ca.minexmr.com +ca.vsassets.com +ca1.metrics.backtrace.io +ca1.qualtrics.com +ca3.revieworbit.com +ca4.revieworbit.com +ca8g5.win +cabelas.ugc.bazaarvoice.com +cabeles.com +cablevision.112.2o7.net +cablyshaw.com +cache-dev.addthis.com +cache-ssl.celtra.com +cache.ad-serverparc.nl +cache.addthis.com +cache.addthiscdn.com +cache.adm.cnzz.net +cache.adnet-media.net +cache.ads.kartu.lt +cache.adviva.net +cache.betweendigital.com +cache.blogads.com +cache.btrll.com +cache.celtra.com +cache.daredorm.com +cache.directorym.com +cache.dtmpub.com +cache.gfrevenge.com +cache.izearanks.com +cache.realitykings.com +cache.specificmedia.com +cache.unicast.com +cachebanners.toteme.com +cacheserve.eurogrand.com +cacheserve.prestigecasino.com +cacheserve.williamhill.com +cachewww.europacasino.com +cacl.fr +cad.chosun.com +cadaver.org +cadillacescalade.com +cadillacforums.us.intellitxt.com +caea4e.r.axf8.net +caea4e.t.axf8.net +cafecoc.com +cafemedia-d.openx.net +cafemom.d2.sc.omtrdc.net +cafemom.us.intellitxt.com +cahoots.com +calculatingcircle.com +calculatingtoothbrush.com +calculatorcamera.com +cale-filmy.online +califia.imaginemedia.com +californiastateparks.com +callawaypos.com +callbling.com +callingcardsinstantly.com +callmd5map.com +callousbrake.com +calmfoot.com +calouskype.over-blog.com +calq.io +calworthingtonford.com +cam-now.com +cam-sexy.de +cam.demdex.net +cam2cam.xlovecam.com +cambonanza.com +camera.phone.samsung.sms13.de +camerahi.com +camerondiaznude.1stok.com +camerondiaznude.ca.tt +camerotix.de +camflirt.biz +camgay.org +camgeil.com +camgirllist.com +camillascake.it +cammeisjes.info +camoandbows.com +camolist.info +camorg.net +camp.districtm.net +campaign-archive.com +campaign-tapad.s3.amazonaws.com +campaign-tracking-service.placelocal.com +campaign-tracking-service.prod.paperg.com +campaign-tracking-service.staging.paperg.com +campaign.adobe.com +campaign.bharatmatrimony.com +campaign.iitech.dk +campaign.indieclick.com +campaignperf.qa.campaign.adobe.com +campaigns.curalate.com +campaigns.f2.com.au +campaigns.interclick.com +campamento.queenscamp.com +cams.enjoy.be +camsoda.com +canada.dev.extremereach.com +canada.extremereach.com +canada.extremereach.com.extremereach.com +canadaalltax.com +canadafreepress.us.intellitxt.com +canadapost.112.2o7.net +canary-x.flurry.com +canary.flurry.com +canary.pushspring.com +cancalgary.112.2o7.net +cancertreatmente.tt.omtrdc.net +candelluxsklep.pl +candiceloves.us +candid.zone +candidate.atom.adjust.com +candidography.com +canfaceoff.112.2o7.net +canfinancialpost.112.2o7.net +caniamedia.com +canmag.us.intellitxt.com +cannabislyric.com +cannabispicture.com +cannationalpost.112.2o7.net +canoe.112.2o7.net +canoehipchat.dev.pardot.com +canottowa.112.2o7.net +canshowcase.112.2o7.net +cantire.122.2o7.net +canuck-method.com +canuckmethod.com +canuckmethod.net +canwest.112.2o7.net +canwestcom.112.2o7.net +canwestglobal.112.2o7.net +canwestgolbal.sc.omtrdc.net +capability.viewsignage.com +capablecows.com +capath.com +capcityadvcom.112.2o7.net +capcityadvcom.122.2o7.net +capecodonlinecom.112.2o7.net +capella.122.2o7.net +capitain.noblock.pro +capitaloneservices.tt.omtrdc.net +capitalpolicyinternational.com +capku.com +capodannoinversilia.com +capopex.juicemobile.com +captain.directprimal.com +captain.noblock.pro +captain2.directprimal.com +captainbicycle.com +captainquizz.de +captainstarfish.com +captchas.freebitco.in +captify.mgr.consensu.org +captive.free.fr +capture-room.com +capture.condenastdigital.com +capture.prod.paperg.com +capture.staging.paperg.com +capture.trackjs.com +car-donation.shengen.ru +car-insurance.inshurance-from.com +car-loan.shengen.ru +car-stuff.us.intellitxt.com +car-truck-boat-bonuspath.com +car-truck-boat-premiumblvd.com +car4you.oewabox.at +carabela.com.do +caramail-tchatche.maxisecure.com +carambaba.com +carambo.la +caramori.com +caranikahsiri.com +carapics.com +caravel.adthrive.com +carbonads.com +carbonads.net +carbonite.tt.omtrdc.net +card.number.phone.prepaid.sms13.de +cardgameinfo.com +cardgamespidersolitaire.com +cardiffbusinesscouncil.com +cardioweb.co.uk +cardmusical.com.sapo.pt +cards.free.cardfountain.com +cards.virtuagirlhd.com +cardsdumps.com +cardsharp1.ru +cardul.ru +care2.112.2o7.net +care4it.com +careceditpay.com +careeducation.com +careers-dev.datamark.net +careers-rewardpath.com +careers.112.2o7.net +careers.canwestad.net +careers.datamark.net +careers.exacttarget.com +careers.outbrain.com +careers.returnpath.com +careers.returnpath.net +careers.taboola.com +careington.co +carelan.com +carelis.com +carfax.112.2o7.net +carfax.com.ua +cargostream.dk +carina-sy.de +carisoprodol.1.p2l.info +carisoprodol.hut1.ru +carisoprodol.ourtablets.com +carisoprodol.polybuild.ru +carisoprodol.shengen.ru +carloans.com +carlsonradisson.112.2o7.net +carmenelectra.1stok.com +carmuffler.net +caroprometa.de +carpediem.sv2.biz +carpee.net +carpet.pulse.inmobi.com +carpetdenfa.com +carpetfitters.co.uk +carrel.services +carrier.bz +carry.myeffect.net +cars.ign.us.intellitxt.com +cart.adx1.com +carters.sp1.convertro.com +carters.ugc.bazaarvoice.com +cartoonnetwork.122.2o7.net +cartoonpornguide.com +caruso.shopcurbside.com +cas.adviserplus.com +cas.be.eu.criteo.com +cas.clickability.com +cas.criteo.com +cas.eu.criteo.com +cas.fr.eu.criteo.com +cas.jp.as.criteo.com +cas.nl.eu.criteo.com +cas.ny.us.criteo.com +cas.sv.us.criteo.com +casalemedia.com +casalmedia.com +cascade.adviserplus.com +case-attachments.marketo.com +cash-advance.now-cash.com +cash4members.com +cash4popup.de +cashadvancework.com +cashback.co.uk +cashbackwow.co.uk +cashbeet.com +cashcount.com +cashcounter.com +cashcownetworks.com +cashcrate.com +cashengines.com +cashext.com +cashfiesta.com +cashflowmarketing.com +cashpartner.com +cashreportz.com +casino-gambling-online.searchservice.info +casino-online.100gal.net +casino770.com +casinogames.com +casinopays.com +casinorewards.com +casinotraffic.com +casinotreasure.com +caslemedia.com +casper.sp1.convertro.com +casterist.info +casting.openv.com +castingshow-news.de.intellitxt.com +cat.onlinepeople.net +cata.ero-advertising.com +catalinkcashback.com +catalog.adx1.com +catalogo.intelsad.com +catashare.pw +catchvid.info +catjogger.win +catrg.peer39.net +catsplit.com +catz4.com +caue971.org +cavemancircus.us.intellitxt.com +caw.be.eu.criteo.com +caw.criteo.com +caw.fr.eu.criteo.com +caw.jp.as.criteo.com +caw.nl.eu.criteo.com +caw.ny.us.criteo.com +caw.sv.us.criteo.com +cb.alimama.cn +cb.amazingcounters.com +cb.baidu.com +cb.mdnhinc.com +cb.qa-dest.imprev.net +cb1.counterbot.com +cba.122.2o7.net +cbanners.virtuagirlhd.com +cbaol.112.2o7.net +cbc.122.2o7.net +cbcca.112.2o7.net +cbcca.122.2o7.net +cbcincinnatienquirer.112.2o7.net +cbcnewmedia.112.2o7.net +cbglobal.112.2o7.net +cbldc.io +cbmsn.112.2o7.net +cbo.allinviews.com +cbo.beeviewd.com +cbo.placeyourview.com +cbpublishing.blueadvertise.com +cbronline.uk.intellitxt.com +cbs.112.2o7.net +cbscom.112.2o7.net +cbsdigitalmedia.112.2o7.net +cbsi.com.ssl.d2.sc.omtrdc.net +cbsi.com.ssl.sc.omtrdc.net +cbsi.demdex.net +cbsinteractive.hb.omtrdc.net +cbsncaasports.112.2o7.net +cbsnfl.112.2o7.net +cbspgatour.112.2o7.net +cbsspln.112.2o7.net +cbstelevisiondistribution.112.2o7.net +cbstv.us.intellitxt.com +cbtnuggets.tt.omtrdc.net +cbtopsites.com +cc-analytics.trafficmanager.net +cc-dt.com +cc.bridgetrack.com +cc.chango.com +cc.connextra.com +cc.gofile.io +cc.hb.omtrdc.net +cc.iwon.com +cc.simplereach.com +cc.ssacdn.com +cc.sys.intl.xiaomi.com +cc.sys.miui.com +cc.webpower.com +cc1.midasplayer.com +cc12797.counter.hackers.lv +cc5f.dnyp.com +cc9905.counter.hackers.lv +ccas.clearchannel.com +ccbilleu.com +ccc.sys.intl.xiaomi.com +ccc.sys.miui.com +ccc00.opinionlab.com +ccc01.opinionlab.com +ccde.events.marketo.com +ccinext.count.ly +ccleaner.fr +ccm-dev.urbaninsight.com +ccm-prod.urbaninsight.com +ccm-stage.urbaninsight.com +ccm-test.urbaninsight.com +ccpmo.com +ccrbudgetca.112.2o7.net +ccrgaviscom.112.2o7.net +ccs.infospace.com +ccsolutions.com.pl +cctldtest.google-analytics.com +cctv.adsunion.com +ccudl.com +ccvwtdtwyu.trade +cd-ads.com +cd.freecontent.win +cd8iw9mh.cricket +cda-bez-limitu.pl +cda-filmy.com.pl +cdata.carambo.la +cdb.hitbox.com +cdc.112.2o7.net +cdhmanager-prod.bronto.com +cdiabetes.com +cdjchpojgifwc.ru +cdjs.online +cdm.unnoticeablegangrene.com +cdn-01.yumenetworks.com +cdn-1.convertexperiments.com +cdn-a.amazon-adsystem.com +cdn-akamai.mookie1.com +cdn-analytics.ladmedia.fr +cdn-analytics.pl +cdn-c.amazon-adsystem.com +cdn-cc.taboola.com +cdn-code.host +cdn-d.amazon-adsystem.com +cdn-edgecast.optimizely.com +cdn-eu.dynamicyield.com +cdn-gl.imrworldwide.com +cdn-highwinds.unityads.unity3d.com +cdn-jp.gsecondscreen.com +cdn-jquery.host +cdn-lb.vungle.com +cdn-mirror.insnw.net +cdn-pci.optimizely.com +cdn-preview.dynamicyield.com +cdn-rtb.sape.ru +cdn-s-optional.optimizely.com +cdn-s.amazon-adsystem.com +cdn-sec.tacoda.at.atwola.com +cdn-settings.segment.com +cdn-social.janrain.com +cdn-ssl.pardot.com +cdn-staging.convertkit.com +cdn-t.amazon-adsystem.com +cdn-test.truconversion.com +cdn-usent.kampyle.com +cdn-view.c3tag.com +cdn-z.amazon-adsystem.com +cdn.8digits.com +cdn.accelerator.arsdev.net +cdn.ad.xiaomi.com +cdn.ad4game.com +cdn.adaptv.advertising.com +cdn.adasiaholdings.com +cdn.adbooth.net +cdn.adengage.com +cdn.adgear.com +cdn.adglare.net +cdn.adigniter.org +cdn.adikteev.com +cdn.adk2.co +cdn.adk2.com +cdn.adless.io +cdn.admitad.com +cdn.admixer.net +cdn.adnxs.com +cdn.adpacks.com +cdn.adplxmd.com +cdn.adpredictive.com +cdn.adquantix.com +cdn.adrotator.se +cdn.adrtx.net +cdn.ads.ookla.com +cdn.adsafeprotected.com +cdn.adserve.video +cdn.adserver.b2c.com +cdn.adservingsolutionsinc.com +cdn.adskeeper.co.uk +cdn.adspirit.de +cdn.adsrvmedia.net +cdn.adstatic.com +cdn.adstract.com +cdn.adtrace.org +cdn.adtradr.com +cdn.adtrue.com +cdn.adual.net +cdn.advancedmactools.com +cdn.advertserve.com +cdn.adx1.com +cdn.adx1.comcdn.adx1.com +cdn.airfind.com +cdn.airpr.com +cdn.ajcryptominer.com +cdn.ajillionmax.com +cdn.akubebas.com +cdn.alleliteads.com +cdn.altitudeplatform.com +cdn.amateurmatch.com +cdn.amgdgt.com +cdn.amplitude.com +cdn.app.exitmonitor.com +cdn.appdynamics.com +cdn.appround.biz +cdn.appsflyer.com +cdn.askosshunt.com +cdn.assets.craveonline.com +cdn.at.atwola.com +cdn.atdmt.com +cdn.atlassbx.com +cdn.atomex.net +cdn.atwola.com +cdn.auditude.com +cdn.augur.io +cdn.automatad.com +cdn.avmws.com +cdn.bandwidthx.net +cdn.banner.thumbplay.com +cdn.banners.scubl.com +cdn.beaconads.com +cdn.beaconpush.com +cdn.beginads.com +cdn.behavioralengine.com +cdn.best-tv.com.c.footprint.net +cdn.bestreviews.com +cdn.bestssaker.com +cdn.betrad.com +cdn.bidvertiser.com +cdn.bitmedianetwork.com +cdn.bizible.com +cdn.blueconic.net +cdn.boomtrain.com +cdn.branch.io +cdn.brcdn.com +cdn.broadstreetads.com +cdn.bronto.com +cdn.brsrvr.com +cdn.bttrack.com +cdn.buysellads.com +cdn.carbonads.com +cdn.celtra.com +cdn.chitika.net +cdn.classicdanube.info +cdn.clic2pub.com +cdn.clicktale.net +cdn.cloudcoins.co +cdn.cmp.advertising.com +cdn.comparemetrics.com +cdn.complexmedianetwork.com +cdn.constafun.com +cdn.content.exoticads.com +cdn.contentspread.net +cdn.conversant.mgr.consensu.org +cdn.convertkit.com +cdn.cookiescript.info +cdn.cpmstar.com +cdn.cpxinteractive.com +cdn.cquotient.com +cdn.creative.medialytics.com +cdn.crowdignite.com +cdn.crowdtwist.com +cdn.crwdcntrl.net +cdn.curalate.com +cdn.cxense.com +cdn.dabhit.com +cdn.demdex.net +cdn.dev.paperg.com +cdn.digitrust.mgr.consensu.org +cdn.directrev.com +cdn.directtrk.com +cdn.districtm.ca +cdn.districtm.io +cdn.dmpcounter.com +cdn.doublepimpssl.com +cdn.doubleverify.com +cdn.download.sweetpacks.com +cdn.dsultra.com +cdn.dustyorate.com +cdn.dynamicyield.com +cdn.earnify.com +cdn.easy-ads.com +cdn.elasticad.net +cdn.employchannel.info +cdn.engine.4dsply.com +cdn.engine.adsupply.com +cdn.engine.phn.doublepimp.com +cdn.engine.trklnks.com +cdn.epicgameads.com +cdn.epom.com +cdn.epommarket.com +cdn.eqads.com +cdn.evergage.com +cdn.evgnet.com +cdn.exactag.com +cdn.exoticads.com +cdn.eyewonder.com +cdn.fastclick.net +cdn.feeds.ibt.com +cdn.firstimpression.io +cdn.firstlook.com +cdn.flashtalking.com +cdn.flurry.com +cdn.fqtag.com +cdn.freefaits.com +cdn.freefarcy.com +cdn.freehalves.com +cdn.freehas.com +cdn.freehonor.com +cdn.freeimply.com +cdn.freeinfringe.com +cdn.freejabs.com +cdn.freejars.com +cdn.freejaw.com +cdn.freejax.com +cdn.freejlo.com +cdn.freelac.com +cdn.freelev.com +cdn.freshmarketer.com +cdn.fyber.com +cdn.g.promosrv.com +cdn.geni.us +cdn.getambassador.com +cdn.getambassador.com.sandbox.getambassador.com +cdn.getsmartcontent.com +cdn.go.arbo.bbelements.com +cdn.go.arbopl.bbelements.com +cdn.go.cz.bbelements.com +cdn.go.idmnet.bbelements.com +cdn.go.pol.bbelements.com +cdn.gumgum.com +cdn.hadj7.adjuggler.net +cdn.hanaging.info +cdn.hauleddes.com +cdn.heapanalytics.com +cdn.holdlads.com +cdn.iasrv.com +cdn.ibm.xtify.com +cdn.idtargeting.com +cdn.imgtty.com +cdn.innity.net +cdn.innovid.com +cdn.insta.playbryte.com +cdn.installationsafe.net.s3.amazonaws.com +cdn.intentmedia.net +cdn.interactivemedia.net +cdn.intermarkets.net +cdn.investingchannel.com +cdn.inwemo.com +cdn.ip.inpwrd.com +cdn.iqcontentplatform.de +cdn.iubenda.com +cdn.jivox.com +cdn.jquery-uim.download +cdn.komoona.com +cdn.krxd.net +cdn.lazymem.com +cdn.lazymic.com +cdn.levelaccess.net +cdn.lfstmedia.com +cdn.libraries.inpwrd.com +cdn.likeaced.com +cdn.linksmart.com +cdn.listrakbi.com +cdn.livefyre.com +cdn.lmiutil.com +cdn.luckyorange.com +cdn.mahmukhach.info +cdn.marketgid.com +cdn.matheranalytics.com +cdn.mdotm.com +cdn.media.innity.net +cdn.media6degrees.com +cdn.mediative.ca +cdn.mediavoice.com +cdn.mega-tags.com +cdn.mercent.com +cdn.merchenta.com +cdn.mgid.com +cdn.minescripts.info +cdn.mirageads.net +cdn.mobicow.com +cdn.mobileapptracking.com +cdn.moengage.com +cdn.mookie1.com +cdn.mplxtms.com +cdn.msdwnld.com +cdn.mxpnl.com +cdn.my-pc-cleaner.org +cdn.mypcbackup.com +cdn.n131adserv.com +cdn.nablabee.com +cdn.ndparking.com +cdn.nearbyad.com +cdn.nsimg.net +cdn.oas-c17.adnxs.com +cdn.oas-c18.adnxs.com +cdn.oas-eu1.adnxs.com +cdn.oas-training7.adnxs.com +cdn.oggifinogi.com +cdn.onescreen.net +cdn.onesignal.com +cdn.onscroll.com +cdn.onthe.io +cdn.opensubcontent.com +cdn.optimatic.com +cdn.optimizely.com +cdn.optmd.com +cdn.orbengine.com +cdn.palomatik.info +cdn.pardot.com +cdn.permutive.com +cdn.petametrics.com +cdn.pickyopahs.com +cdn.piwik.pro +cdn.polmontventures.com +cdn.popcash.net +cdn.popmyads.com +cdn.popwin.net +cdn.prod.paperg.com +cdn.program3.com +cdn.promo.pimproll.com +cdn.pubexchange.com +cdn.public.pushspring.com +cdn.publicidad.net +cdn.qa-ext.livefyre.com +cdn.qbaka.net +cdn.quantummetric.com +cdn.radiatewheel.info +cdn.ravenjs.com +cdn.redlightcenter.com +cdn.reporo.net +cdn.revcontent.com +cdn.rocks.io +cdn.roiq-vice.ranker.com +cdn.rollbar.com +cdn.rove.cl +cdn.sagent.io +cdn.sail-horizon.com +cdn.scarabresearch.com +cdn.segment.com +cdn.segment.io +cdn.selectablemedia.com +cdn.shoppingminds.net +cdn.siftscience.com +cdn.simpleanalytics.io +cdn.spectate.com +cdn.speedcurve.com +cdn.spoutable.com +cdn.springboard.gorillanation.com +cdn.springserve.com +cdn.staging.front.banners.advidi.com +cdn.staging.paperg.com +cdn.stat.easydate.biz +cdn.static-cnt.bid +cdn.static.zdbb.net +cdn.stickyadstv.com +cdn.streambeam.io +cdn.stroeerdigitalmedia.de +cdn.syn.verticalacuity.com +cdn.syndication.twitter.com +cdn.t402.livefyre.com +cdn.taboola.com +cdn.taboolasyndication.com +cdn.tagcommander.com +cdn.tapstream.com +cdn.targetfuel.com +cdn.teads.tv +cdn.teamskeetimages.com +cdn.threadloom.com +cdn.thunderhead.com +cdn.total-media.net +cdn.tracking.bannerflow.com +cdn.tradelab.fr +cdn.trafficforce.com +cdn.traffichunt.com +cdn.trafficstars.com +cdn.traq.li +cdn.triggertag.gorillanation.com +cdn.truconversion.com +cdn.tsyndicate.com +cdn.tt.omtrdc.net +cdn.turn.com +cdn.tynt.com +cdn.uc.atwola.com +cdn.udmserve.net +cdn.undertone.com +cdn.unityads.unity3d.com +cdn.us.goldspotmedia.com +cdn.usabilitytracker.com +cdn.userreplay.net +cdn.userreport.com +cdn.vdopia.com +cdn.vibratebefore.win +cdn.videmob.com +cdn.videoamp.com +cdn.viglink.com +cdn.visiblemeasures.com +cdn.vungle.com +cdn.westbaud.com +cdn.wg.uproxx.com +cdn.wootric.com +cdn.www1.pip-pip-pop.com +cdn.wwwpromoter.com +cdn.yb0t.com +cdn.yieldmedia.net +cdn.yldbt.com +cdn.yottos.com +cdn.ywxi.net +cdn.zarget.com +cdn.zeusclicks.com +cdn0.fyber.com +cdn01.mzbcdn.net +cdn1-marketplace.vntsm.com +cdn1.adadvisor.net +cdn1.adexprt.com +cdn1.ads.brazzers.com +cdn1.ads.contentabc.com +cdn1.ads.mofos.com +cdn1.adspace.4tube.com +cdn1.aniview.com +cdn1.clkoffers.com +cdn1.clkrev.com +cdn1.crispadvertising.com +cdn1.eyewonder.com +cdn1.fyber.com +cdn1.inner-active.mobi +cdn1.minestat.biz +cdn1.pebx.pl +cdn1.rmgserving.com +cdn1.skinected.com +cdn1.smartadserver.com +cdn1.steelhousemedia.com +cdn1.telemetryverification.net +cdn1.traffichaus.com +cdn1.tribalfusion.com +cdn1.vntsm.com +cdn1.xlightmedia.com +cdn1.zopiny.com +cdn1ht.traffichaus.com +cdn1sitescout.edgesuite.net +cdn2-marketplace.vntsm.com +cdn2.adsdk.com +cdn2.airfind.com +cdn2.amateurmatch.com +cdn2.crispadvertising.com +cdn2.emediate.eu +cdn2.fyber.com +cdn2.inwemo.com +cdn2.lfstmedia.com +cdn2.minestat.biz +cdn2.mxpnl.com +cdn2.tagcommander.com +cdn2.truconversion.com +cdn25.vizury.com +cdn2sitescout-a.akamaihd.net +cdn3.adexprts.com +cdn3.airfind.com +cdn3.emediate.eu +cdn3.fyber.com +cdn3.optimizely.com +cdn3.telemetryverification.net +cdn4.fyber.com +cdn454.telemetryverification.net +cdn4s.steelhousemedia.com +cdn5.js.ad.dotandad.com +cdn5.tribalfusion.com +cdn5.userzoom.com +cdn6.admatic.com.tr +cdn6.adspirit.de +cdn6.emediate.eu +cdn6.vizury.com +cdn8.emediate.eu +cdna.runadtag.com +cdna.tremormedia.com +cdnads.cam4.com +cdnapi.kaltura.com +cdnaws.mobidea.com +cdnc.pushspring.com +cdncounter.top +cdneast2-xch.media.net +cdneval.adnxs.com +cdnfile.xyz +cdnjs.cloudflane.com +cdnjs.tvpage.com +cdnmedia.xyz +cdns.amgdgt.com +cdns.mydirtyhobby.com +cdns.privatamateure.com +cdns.ws +cdnssl.clicktale.net +cdnstatic.detik.com +cdnt.meteorsolutions.com +cdnt.yottos.com +cdnw.ringtonepartner.com +cdreviews.us.intellitxt.com +cdrinfo.us.intellitxt.com +cdrom-guide.us.intellitxt.com +cds.adecn.com +cds26.ams9.msecn.net +cdslog.contextweb.com +cdsusa.veinteractive.com +cdx.ssacdn.com +cdxbin.vulnerap.com +cdxninteractive.blueadvertise.com +ce.lijit.com +ce.wielkanagroda.com +ce.wielkaniespodzianka.pl +cecash.com +ced.sascdn.com +celebitchy.us.intellitxt.com +celebrex.1.p2l.info +celebridiot.us.intellitxt.com +celebridoodle.us.intellitxt.com +celebrifi.us.intellitxt.com +celebrity-babies.us.intellitxt.com +celebrity-gossip.us.intellitxt.com +celebrity-rightpundits.us.intellitxt.com +celebrity-stripped.blogomer.com +celebritymound.us.intellitxt.com +celebritynation.us.intellitxt.com +celebrityodor.us.intellitxt.com +celebritypwn.us.intellitxt.com +celebritysmackblog.us.intellitxt.com +celebritytoob.us.intellitxt.com +celebrityviplounge.us.intellitxt.com +celebritywonder.us.intellitxt.com +celebrus.com +celebslam.tags.crwdcntrl.net +celebslam.us.intellitxt.com +celebuzz.us.intellitxt.com +celebwelove.com +celeritascdn.com +celestia.fr +celexa.1.p2l.info +celexa.3.p2l.info +celexa.4.p2l.info +cell-phone-giveaways.com +cellfun.mobi +cellphoneincentives.com +cengage.celebrus.com +cengagecsinfosec.112.2o7.net +cenome01-ssl.svc.insnw.net +cent.adbureau.net +center-message-mobile.com +centerfind.com +centerpointmedia.com +centertrk.com +central.iprom.net +centralwestwater.com.au +centricabritishgas.d3.sc.omtrdc.net +centro-indy.exacttarget.com +centro-vegas.exacttarget.com +centro.exacttarget.com +centro.pixel.ad +centrum-bezpiecznej-pozyczki.waw.pl +centrum-napraw-swojego-laptopa.warszawa.pl +centrum-pogotowie-komputerowe.warszawa.pl +centrum-ratuj-swojego-laptopa.warszawa.pl +centrumcz.hit.gemius.pl +centrummarek.pl +centrumofert.com +centrumplay.pl +cephalexin.ourtablets.com +cerberus-control.kargo.com +ceromobi.club +cert1.franklyinc.com +cert2.franklyinc.com +cert3.franklyinc.com +certbot-test.autopilothq.com +certificates.freecontent.win +certified-toolbar.com +certifiedwinners.info +certifiedwinners.today +certify-amp.alexametrics.com +certify-js.alexametrics.com +certify-stage.alexametrics.com +certify.alexametrics.com +certs.corp.mparticle.com +certs.optmnstr.com +ceskarepublika.net +ceskydomov.alias.ngs.modry.cz +cetelemportugal2.solution.weborama.fr +cetrk.com +cf-aws-adserver-origin-ap-northeast-1.adtechjp.com +cf-aws-adserver-origin-ap-southeast-1.adtechjp.com +cf-aws-adserver-origin.adtechjp.com +cf.addthis.com +cf.ads.kontextua.com +cf.adsttc.com +cf.c.msas.media.net +cf.cdn.inmobi.com +cf.d.msas.media.net +cf.effectivemeasure.net +cf.iadsdk.apple.com +cf.kampyle.com +cf.p.msas.media.net +cf.ssacdn.com +cfcd.duckdns.org +cfcdist.gdn +cfcdist.loan +cfceu.duckdns.org +cfcnet.gdn +cfcnet.top +cfcs1.duckdns.org +cfg.adsmogo.com +cfg.datafastguru.info +cflcs.media.net +cfr.112.2o7.net +cfrfa.112.2o7.net +cftrkstage.marketo.com +cfvod.kaltura.com +cg-global.maxymiser.com +cgi-view-item-co-uk.xf.cz +cgi.hitbox.com +cgi.honesty.com +cgi.hotstat.nl +cgi.sexlist.com +cgi1.sexlist.com +cgicounter.onlinehome.de +cgicounter.puretec.de +cgirm.greatfallstribune.com +cgm.adbureau.ne +cgm.adbureau.net +ch.browsermine.com +ch.questionmarket.com +chacha.112.2o7.net +chainblock.science +chainsawoffer.com +chairscrack.com +chameleon.ad +changduk26.com +changelog.confluence.piwik.pro +changelog.freshmarketer.com +changelog.piwik.pro +changelog.rollbar.com +changelog.survicate.com +channel1vids.com +channel4.com.ssl.sc.omtrdc.net +channelinsider.us.intellitxt.com +channelintelligence.com +chappel.videogamer.com +chardwardse.club +charging-technology.com +charlie.directprimal.com +charlie.noblock.pro +charlie2.directprimal.com +charlizetheron.1stok.com +charm.inmobi.com +charmedno1.com +charmflirt.com +charmstroy.info +chart.advinion.com +chart.dk +chartbeat.com +chartbeat.net +chartboost.com +charter.demdex.net +chaseonline.com +chat.adspaces.ero-advertising.com +chat.api.drift.com +chat.effectivebrand.com +chat.ero-advertising.com +chat.instartlogic.com +chat.trackalyzer.com +chat.urbanairship.com +chat2.livechatinc.com +chaveiro.bio.br +chchoice.112.2o7.net +cheap-adipex.hut1.ru +cheap-carisoprodol.polybuild.ru +cheap-hydrocodone.go.to +cheap-hydrocodone.polybuild.ru +cheap-phentermine.polybuild.ru +cheap-valium.polybuild.ru +cheap-viagra.polybuild.ru +cheap-web-hosting-here.blogspot.com +cheap-xanax-here.blogspot.com +cheapjerseysa.com +cheapjerseysbizwholesale.us +cheapjerseysfootballshop.com +cheapmarmot.online +cheapstickets.com +cheaptickests.com +cheapticketes.com +cheapticketsinc.com +cheapticketts.com +cheapticktes.com +cheapxanax.hut1.ru +cheatcc.us.intellitxt.com +cheatingdome.us.intellitxt.com +cheats4u.pl +chechla.cnixon.com +check.goodroundtoupdates.date +check.thealwaysnewandfreeupdating.stream +checkingfree.thebig-centeralplacecontentprepared.review +checkintocash.data.7bpeople.com +checkm8.com +checkstat.nl +checkupgrade24.thebigforeverupgrades.space +checkyourmoneybox98.loan +cheerfulrange.com +chef.iubenda.com +chef.rob.ops.kochava.com +chef.snackly.co +chefti.info +chelick.net +cherryclitz.com +cherryhi.app.ur.gcion.com +cherrylips.co.uk +cherryteen.com +cherrythread.com +cherubinimobili.it +cherylturner.net +chevelles.us.intellitxt.com +chevydashparts.com +chewbacca.cybereps.com +chewcoat.com +chezclara.biz +chezh1.popmarker.com +chghowardjohnson.112.2o7.net +chgsupereight.112.2o7.net +chgwyndham.112.2o7.net +chiamami.ch +chiatena.zxy.me +chicago01.electroneum.hashvault.pro +chicagobearsnfljerseys.us +chicagosuntimes.122.2o7.net +chicasboom.com +chicasdesnudas.info +chicasdiez.com +chicasintabus.com +chicasmanga.com +chicbang.com +chickensstation.com +chickhunt.com +chicklick.net +chickswithdicks.info +chidporn.com +chiefcurrent.com +chiefshore.net +chiennasse.org +chihuahuainvita.com +childrensimmunisation.com +chilicum.com +chillimobil.no +chillingvideos.com +chilyregistrycleaner.com +chimiver.info +china-cdn.unityads.unity3d.com +china-top.ru +china.inmobi.com +china.sizmek.com +chinabitch.com +chinacheapelitejerseys.com +chinaelitecheapjerseys.com +chinajerseyswholesalecoupons.com +chinamedicalnews.com +chinchoi.cn +chinese-amezon.com +chinese.ws +chinovalleyendo.com +chinsnakes.com +chip.de.intellitxt.com +chip.ivwbox.de +chip.popmarker.com +chitika.net +chixandmortar.com +chixnthemix.com +chizim.com +chkpt.zdnet.com +chlcotrk.com +chloe-silvers.us +chlooe.com +chlp.de +chmproxy.bid +chocoslim.pro +choice.atdmt.com +choicedealz.com +choicesurveypanel.com +chokertraffic.com +chomik-24.pl +chomik24.com.pl +chomikui.pl +chpoki.com +chra.org.au +chris-jasnowidz.pl +chris-ukorg.org +christianbroadcastne.tt.omtrdc.net +christianbusinessadvertising.com +christianlouboutinoutletstores.us +christianlouboutinsaleonline.us +christianlouboutinshoes.xyz +christianscience.tt.omtrdc.net +christianslouboutinoutlet.com +christianthai.net +christiantreatmentcenters.com +christine-young.info +christingel.com +christishake.freehost.pl +christophercreekcabin.com +chron-telefon.com +chronograf.adwyze.com +chs.ops.curalate.com +chsplantsales.co.uk +chuckfaganco.com +chuckguilford.com +chuknu.sokrati.com +chukweb.com +chumtv.122.2o7.net +chungmok.net +chunkytrunk.com +church-upskirt.info +church.comof.com +church18.org +chws.browsermine.com +ci-accountlock.iovation.com +ci-admin.iovation.com +ci-mpsnare.iesnare.co.uk +ci-mpsnare.iesnare.com +ci-mpsnare.iovation.com +ci-snare.iovation.com +ci.ad.yieldmanager.net +ci.adwyze.com +ci.adx1.com +ci.appboy.com +ci.beap.ad.yieldmanager.net +ci.liadm.com +ci.nuggad.net +ci.returnpath.net +ci.thirdpresence.com +ci.vungle.com +ci3ixee8.com +cialis-finder.com +cialis-levitra-viagra.com.cn +cialis-store.shengen.ru +cialis.1.p2l.info +cialis.3.p2l.info +cialis.4.p2l.info +cialis.ourtablets.com +cialisforsalecialiscostcye.com +cialismed.com +cialisovercounteratwalmartusa.com +cialiswithoutadoctor.net +ciao.ivwbox.de +ciaocom.122.2o7.net +ciaopeople.mgr.consensu.org +ciaoshopcouk.122.2o7.net +ciaoshopit.122.2o7.net +ciaplus.com.br +cibersexo.eu +ciceklioglu.com +ciclismovalenciano.com +cidc.org.ru +cieh.mx +ciekawinki.pl +ciel7.free.fr +cienum.fr +cif.su +cig-arrete.com +cigape.net +cigar.pt +cigarette-online.com +ciiycode.com +cimetrix.inmobi.com +cimrman.org +cindyhome.home.ml.org +cinedaily.com +cineface.com +cineitalia.top +cinema-online.pl +cinema3satu.com +cinemabio.com +cinemaenergy-hd.ru +cinematraffic.com +cinepornox.com +cinepro.com +cinepycusaw.eu +cingualr.com +cinnamonmaster.com +cinplex.oewabox.at +cinselkameralisohbet.com +cioco-froll.com +ciptakarya.pu.go.id +ciq.dmpxs.com +cira.login.cqr.ssl.igotmyloverback.com +circuit.advertserve.com +circuitovip.com +cis.silverpop.com +cisco.112.2o7.net +cisco.sc.omtrdc.net +ciscolearningnetwork.tt.omtrdc.net +ciscowebex.112.2o7.net +citepucevasuxuqesu.ga +cithingy.info +citi.bridgetrack.com +citi.bridgetrack.com.edgesuite.net +citimobile.d2.sc.omtrdc.net +citrio.com +citrix-pk2.force.com +citrix.market2lead.com +citrix.tradedoubler.com +cityads.ru +cityads.telus.net +citycash2.blogspot.com +citymediamagazin.hu +cj.com +cj.dotomi.com +cj.mplxtms.com +cjadsystems.dotomi.com +cjbmanagement.com +cjhq.baidu.com +cjlog.com +cjperso.dotomi.com +cjpersonalizer-dev.dotomi.com +cjpersonalizer.dotomi.com +cjt1.net +ck.bucksense.com +ck.juicyads.com +ckl.silverpush.co +cks.mynativeplatform.com +ckstatic.com +cl-c.netseer.com +cl.netseer.com +cl.s1.qa2.exacttarget.com +cl21.v4.adaction.se +cl320.v4.adaction.se +cl96rwprue.com +claimfreerewards.com +claimi8.com +claitors.com +claria.com +clarity.idsp.inmobi.com +clarity.inmobi.com +clarium.global.ssl.fastly.net +clashmediausa.com +class-act-clicks.com +classic-api.prod.adtech.de +classic-api.prod.adtechus.com +classic-rest-api.prod.adtech.de +classic-rest-api.prod.adtechus.com +classicallyabsurdphotography.com +classicjack.com +classicspeedway.com +classicvacations.112.2o7.net +classifiedscanada.112.2o7.net +classmatescom.112.2o7.net +clckcloud.com +cle.kr +clean-cracks.com +clean-mobilephone.com +clean-search.com +clean-space.com +clean-start.net +clean.gg +cleanallspyware.com +cleanallvirus.com +cleanchain.net +cleanersoft.com +cleaningformac.com +cleanmobilephone.com +cleanmypc.com +cleanpcnow.com +cleanproxy.com +cleansearch.net +cleansite.us +cleansofts.com +cleanuninstall.com +cleanup-your-computer.com +clearbit.com +clearchannel.adswizz.com +clearcomb.com +clearonclick.com +clearshieldredirect.com +clevergirlscollective.com +clevernt.com +clgserv.pro +clhctrk.com +clic2pub.adk2x.com +click-development.clrstm.com +click-find-save.com +click-rtb-useast.kobenetwork.com +click-see-save.com +click-west.acuityplatform.com +click.a-ads.com +click.absoluteagency.com +click.adbiq.com +click.adimmix.com +click.adpile.net +click.adpremium.org +click.adv.livedoor.com +click.am1.adm.cnzz.net +click.api.cp.tune.com +click.atdmt.com +click.avenuea.com +click.axiatraders.com +click.bounceads.net +click.buzzcity.net +click.cashengines.com +click.cheapstuff.com +click.clktraker.com +click.clrstm.com +click.content-ad.net +click.dealshark.com +click.dev.khingtracking.com +click.elixmedia.com +click.enatimedia.com +click.fivemtn.com +click.fool.com +click.get-answers-fast.com +click.go2net.com +click.gospect.com +click.grandonmedia.com +click.hotlog.ru +click.html.it +click.icetraffic.com +click.icptrack.com +click.inn.co.il +click.interactivebrands.com +click.investopedia.com +click.israelinfo.ru +click.jve.net +click.khingtracking.com +click.kidslivesafe.com +click.kmindex.ru +click.linkstattrack.com +click.maaxmarket.com +click.newviralmobistore.com +click.payserve.com +click.plista.com +click.pulse360.com +click.readme.ru +click.runcpa.com +click.s6.exacttarget.com +click.searchnation.net +click.sellmeyourtraffic.com +click.sexmoney.com +click.silvercash.com +click.top10sites.com +click.trafikkfondet.no +click.uamtrk.com +click.udimg.com +click.union.ucweb.com +click.virt.exacttarget.com +click.watchjmp.com +click.zeroclickdirect.com +click.zipcodez.com +click.zxxds.net +click1.mainadv.com +click1.rbc.magna.ru +click2.rbc.magna.ru +click2.yllix.com +click2freemoney.com +click2paid.com +click3.rbc.magna.ru +click4.rbc.magna.ru +clickability.com +clickad.eo.pl +clickadu.com +clickadz.com +clickagents.com +clickandbuy.review +clickandbuy.win +clickarrows.com +clickauditor.net +clickbangpop.com +clickbank.com +clickbank.net +clickbooth.com +clickboothlnk.com +clickbrokers.com +clickbux.ru +clickcash.com +clickcash.webpower.com +clickcdn.shareaholic.com +clickcompare.co.uk +clickconvertsell.com +clickdensity.com +clickedyclick.com +clickheat.topbucks.com +clickhereforcellphones.com +clickhouse.com +clickhouse.pfa.gcp.datamind.ru +clickhype.com +clickio.mgr.consensu.org +clickit.go2net.com +clicklink.jp +clickmedia.ro +clickmeter.com +clickonometrics.pl +clickopon.com +clickrtb-useast.kobenetwork.com +clicks.about.com +clicks.adhese.be +clicks.adultplex.com +clicks.beap.ad.yieldmanager.net +clicks.deskbabes.com +clicks.emarketmakers.com +clicks.equantum.com +clicks.eutopia.traffictrader.net +clicks.hurriyet.com.tr +clicks.izea.com +clicks.m4n.nl +clicks.minimob.com +clicks.mods.de +clicks.nastydollars.com +clicks.natwest.com +clicks.rbs.co.uk +clicks.roularta.adhese.com +clicks.totemcash.com +clicks.toteme.com +clicks.traffictrader.net +clicks.virtuagirl.com +clicks.virtuagirlhd.com +clicks.virtuaguyhd.com +clicks.walla.co.il +clicks.weselltraffic.com +clicks.zwaar.org +clicks11.geoads.com +clicks2.oxcash.com +clicks2.traffictrader.net +clicks2.virtuagirl.com +clicks3.traffictrader.net +clicksagent.com +clickserv.sitescout.com +clickserve.cc-dt.com +clickserve.dartsearch.net +clickserve.eu.dartsearch.net +clickserve.uk.dartsearch.net +clickserve.us2.dartsearch.net +clicksor.com +clicksotrk.com +clickspring.net +clickstatsview.chooseonlinecasino.com +clickstatsview.earnmoneycasinos.com +clickstatsview.hourfreeplaycasinos.com +clickstatsview.howdepositcasino.com +clickstatsview.howpickcasino.com +clickstatsview.instantcasinoswithdrawal.com +clickstatsview.internetcasinosforum.com +clickstatsview.microgamingcasinosites.com +clickstatsview.new2007casinobonus.com +clickstream-killswitch-api.hd-personalization-prod.gcp.homedepot.com +clickstream-killswitch.hd-personalization-prod.gcp.homedepot.com +clickstream-producer-api.hd-personalization-prod.gcp.homedepot.com +clickstream-producer.hd-personalization-prod.gcp.homedepot.com +clicktag.de +clicktalecdn.sslcs.cdngc.net +clickthru.net +clickthrunet.net +clickthruserver.com +clickthrutraffic.com +clicktorrent.info +clicktrace.info +clicktrack.onlineemailmarketing.com +clicktrack.premium-shops.net +clicktrack.savings-foryou.net +clicktrack.shopping-networks.net +clicktrack.wnu.com +clicktrack.ziyu.net +clicktracker.alloymarketing.com +clicktracker.iscan.nl +clicktracker.postmasterglobal.com +clicktracks.com +clicktracks.webmetro.com +clicktrade.com +clicktraq.mtree.com +clicktripz.com +clicktshirtprinting.co.uk +clickwith.bid +clickwith.date +clickxchange.com +clickz.com +clicmanager.fr +clien.info +clien.net +client-admin.marketing.qa-dest.imprev.net +client-admin.mc1.qa-dest.imprev.net +client-admin.qa-dest.imprev.net +client-admin.rg1.qa-dest.imprev.net +client-admin.rg2.qa-dest.imprev.net +client-analytics.braintreegateway.com +client-api.curalate.com +client-api.essads.com +client-error-log.dz.optimizely.com +client.a.pxi.pub +client.browseraccelerator.com +client.build.optimizely.com +client.cb.qa-dest.imprev.net +client.dotomi.com +client.marketing.qa-dest.imprev.net +client.mc1.qa-dest.imprev.net +client.optimizely.com +client.perimeterx.net +client.prudential.qa-dest.imprev.net +client.qa-dest.imprev.net +client.remax.qa-dest.imprev.net +client.rg1.qa-dest.imprev.net +client.rg2.qa-dest.imprev.net +client.rlp.qa-dest.imprev.net +client.rw.qa-dest.imprev.net +clientmanagement.lijit.com +clientmetrics-pa.googleapis.com +clients.adtouchlabs.com +clients.bluecava.com +clients.datamark.net +clients.pixel.marketing +clients.pointroll.com +clients.tbo.com +clientstats.advertising.com +clientstream.intuit.launchdarkly.com +cliggi.download +clik2008.popunder.ru +clikerz.net +cliksolution.com +clikz.mytvplayer.hop.clickbank.net +cliop.com +clips.coolerads.com +clipserv.adclip.com +clit.sextracker.com +clit1.sextracker.com +clit10.sextracker.com +clit11.sextracker.com +clit12.sextracker.com +clit120.outster.com +clit13.sextracker.com +clit14.sextracker.com +clit15.sextracker.com +clit16.sextracker.com +clit2.sextracker.com +clit3.sextracker.com +clit4.sextracker.com +clit5.sextracker.com +clit50.outster.com +clit6.sextracker.com +clit7.sextracker.com +clit8.sex-tracker.com +clit8.sextracker.com +clit9.sextracker.com +clix.superclix.de +clixgalore.com +clixtk.com +clk.aboxdeal.com +clk.addmt.com +clk.atdmt.com +clk.cloudyisland.com +clk.madisonlogic.com +clk.pointroll.com +clk.relestar.com +clk.track.tappx.com +clk.tradedoubler.com +clk2.track.tappx.com +clkads.com +clkde.tradedoubler.com +clkfeed.com +clkmon.com +clknsee.com +clkoffers.com +clkrev.com +clkrtrkr.com +clksite.com +clkuk.tradedoubler.com +cllckr.cn +clmforexeu.com +clo.footprintdns.com +cloaktime.com +clockskew.alphonso.tv +clod.pw +cloisteredhydrant.com +cloneshoes.com +clonezilla.fr +closeoutproductsreview.com +closeupsof.us +clothesforcash.com +cloud-observer.ip-label.net +cloud-us.analytics-egain.com +cloud.atosystem.com +cloud.count.ly +cloud.getpopunder.com +cloud.piwik.pro +cloud.rubiconproject.com +cloud.vuble.tv +cloudadservers.com +cloudcdn.gdn +cloudcoins.biz +cloudcoins.co +cloudconnectors.eloqua.com +cloudcreations.in +cloudcrown.com +cloudflane.com +cloudflare.cdneval.adnxs.com +cloudflare.solutions +cloudfront.loggly.com +cloudfront.zor.livefyre.com +cloudfront.zor.qa-ext.livefyre.com +cloudfront.zor.t402.livefyre.com +cloudmedia.gdn +cloudmediacdn.com +cloudonaut.com +cloudplace.net +cloudssd.net +cloudtracked.com +cloudwing.net +clownsong.com +clrstm.com +club-internet.de +club-musics.ru +club-saint-tropez.de +club-samodelkin.ru +club28.info +club69.nu +clubfeed.org +clubfemmesmatures.com +clubgirl.nl +clubjerk.com +clublingvo.ru +clubmed.112.2o7.net +clubmom.122.2o7.net +clubshag.com +clubsun.net +clubwinnerz.com +clubwot.com +cluster-03.topbucks.com +cluster-fuckz.girls-movies.com +cluster.ad-serverparc.nl +cluster.adultadworld.com +cluster.adultworld.com +cluster.adworldmedia.com +cluster3.adultadworld.com +clustrmaps.com +clxcaf.com +cm.adkmob.com +cm.everesttech.net +cm.eyereturn.com +cm.franklyinc.com +cm.g.doubleclick.net +cm.marketgid.com +cm.mgid.com +cm.myway.com +cm.need2find.com +cm.netseer.com +cm.npc-hearst.overture.com +cm.shareaholic.com +cm.the-n.overture.com +cm1.xmrminingproxy.com +cm1359.com +cm3.bnmq.com +cm8.lycos.com +cma-dev.stage.us-east-1.kops.kargo.com +cma-dev.staging.us-east-1.kops.kargo.com +cma-mgmt-dev.stage.us-east-1.kops.kargo.com +cma-mgmt-dev.staging.us-east-1.kops.kargo.com +cma-mgmt-new.stage.us-east-1.kops.kargo.com +cma-mgmt-staging.stage.us-east-1.kops.kargo.com +cma-mgmt-staging.staging.us-east-1.kops.kargo.com +cma-mgmt.kargo.com +cma-mgmt.stage.us-east-1.kops.kargo.com +cma-staging.stage.us-east-1.kops.kargo.com +cma-staging.staging.us-east-1.kops.kargo.com +cmads.sv.publicus.com +cmads.us.publicus.com +cmap.am.ace.advertising.com +cmap.an.ace.advertising.com +cmap.at.ace.advertising.com +cmap.dc.ace.advertising.com +cmap.ox.ace.advertising.com +cmap.pub.ace.advertising.com +cmap.rm.ace.advertising.com +cmap.rub.ace.advertising.com +cmccwlan.cn +cmd.customink.com +cme.adx1.com +cmhtml.overture.com +cmi.netseer.com +cmicapui.ce.gov.br +cml.sad.ukrd.com +cmn1lsm2.beliefnet.com +cmp-dev.advertising.com +cmp.112.2o7.net +cmp.advertising.com +cmp.madvertise.mgr.consensu.org +cmp.sibboventures.mgr.consensu.org +cmp.smartadserver.mgr.consensu.org +cmp.teads.mgr.consensu.org +cmp.uniconsent.mgr.consensu.org +cmp.us.intellitxt.com +cmpdotnetjunkiescom.112.2o7.net +cmpglobalvista.112.2o7.net +cmpmedica.112.2o7.net +cmps.mt50ad.com +cmrpolice.com +cms-xch.33across.com +cms.ad2click.nl +cms.advertising.com +cms.analytics.yahoo.com +cms.c1exchange.com +cms.quantserve.com +cms.springboard.gorillanation.com +cms.springboardplatform.com +cmtrading.ck-cdn.com +cmtvia.112.2o7.net +cmweb.ilike.alibaba.com +cn-wallet-generator.hashvault.pro +cn.ad.adon.vpon.com +cn.adserver.yahoo.com +cn.clickable.net +cn.coremetrics.com +cn.criteo.com +cn.criteo.net +cn.ecritel.bench.cedexis.com +cn.img.adon.vpon.com +cn2.adserver.yahoo.com +cnad.economicoutlook.net +cnad1.economicoutlook.net +cnad2.economicoutlook.net +cnad3.economicoutlook.net +cnad4.economicoutlook.net +cnad5.economicoutlook.net +cnad6.economicoutlook.net +cnad7.economicoutlook.net +cnad8.economicoutlook.net +cnad9.economicoutlook.net +cnbc.com-article906773.us +cnbnews.com +cncn.ssacdn.com +cndhit.xyz +cnet-wildcard.inscname.net +cnet.inscname.net +cnet.us.intellitxt.com +cnetasiapacific.122.2o7.net +cnetaustralia.122.2o7.net +cneteurope.122.2o7.net +cnetjapan.122.2o7.net +cnetnews.112.2o7.net +cnettech.112.2o7.net +cnetzdnet.112.2o7.net +cnf.adshuffle.com +cnheagletribune.112.2o7.net +cnhiautovertical.122.2o7.net +cnhibatesvilleheraldtribune.122.2o7.net +cnhibdtonline.122.2o7.net +cnhicrossvillechronicle.122.2o7.net +cnhidailyindependent.122.2o7.net +cnhieagletribune.122.2o7.net +cnhienid.122.2o7.net +cnhijohnstown.122.2o7.net +cnhijoplinglobe.122.2o7.net +cnhimcalesternews.122.2o7.net +cnhinewscourier.122.2o7.net +cnhinewsservicedev.122.2o7.net +cnhipicayuneitemv.112.2o7.net +cnhirecordeagle.122.2o7.net +cnhitribunestar.122.2o7.net +cnhitribunestara.122.2o7.net +cnhregisterherald.122.2o7.net +cnhv.co +cnn.122.2o7.net +cnn.cm +cnn.dyn.cnn.com +cnn.entertainment.printthis.clickability.com +cnn.sdk.beemray.com +cnnglobal.122.2o7.net +cnnireport.122.2o7.net +cnnmoney.tags.crwdcntrl.net +cnnnew.com +cnocanoecaprod.112.2o7.net +cnomy.com +cnoompprod.112.2o7.net +cnt.spbland.ru +cnt.statistic.date +cnt.sup.com +cnt.trafficstars.com +cnt.tyxo.bg +cnt.tyxo.com +cnt.xcounter.com +cnt1.pocitadlo.cz +cnt1.xhamster.com +cnt2.pocitadlo.cz +cntr.adrime.com +cnv.event.prod.bidr.io +cnzz.mmstat.com +co-uk-h-l.netmng.com +co.5.p2l.info +co.dcclan.co.uk +co.uk.vsassets.com +co1.qualtrics.com +co8vd.cn +coaha.frenchgerlemanelectric.com +coalimpex.com +cobalten.com +coconuts.boy.jp +code-server.biz +code.adengage.com +code.adsales.snidigital.com +code.adtlgc.com +code.checkstat.nl +code.d-agency.net +code.directadvert.ru +code.etracker.com +code.exacttarget.com +code.impresionesweb.com +code.mixpanel.com +code.murdoog.com +code.poptm.com +code.rtbsystem.com +code.superstats.com +code.theads.me +code.vihub.ru +code.visitor-track.com +code2.adtlgc.com +codead.impresionesweb.com +codeads.com +codeexplain.com +codegur.com +codeine.ourtablets.com +codeload.github.exacttarget.com +codenew.impresionesweb.com +codeotel.com +coderexception.com +codice.shinystat.com +codice.shinystat.it +codicebusiness.shinystat.com +codicefl.shinystat.com +codiceisp.shinystat.com +codiceisp.shinystat.it +coding.1100011.ir +cody.services +coed-d.openx.net +coedmagazine.us.intellitxt.com +cofeb13east.com +coffeehausblog.com +coffeol.com +cogivea.com +coihive.com +coin-ad.com +coin-cube.com +coin-have.com +coin-hive-proxy-ybydcnjgkl.now.sh +coin-hive-stratum-bqywuwxwij.now.sh +coin-hive-stratum-cilswgfvet.now.sh +coin-hive-stratum-fcwcduvpjs.now.sh +coin-hive-stratum-yvvbqoavck.now.sh +coin-hive.com +coin-service.com +coin-services.info +coin.bajarlo.net +coinad.com +coinblind.com +coiner.site +coinerra.com +coingive.com +coinhits.com +coinhive-manager.com +coinhive-proxy.party +coinhive.com +coinhive.info +coinhive.net +coinhive.org +coinhiveproxy.com +coinhiver.com +coinhives.com +coinhove.com +coinhub.win +coinimp.com +coinimp.net +coinive.com +coinjive.com +coinlab.biz +coinnebula.com +coinpirate.cf +coinpot.co +coinrail.io +cointraffic.io +coinurl.com +coinverti.com +coinwebmining.com +coinworker.com +coinzilla.io +col.eum-appdynamics.com +col.mobileads.msn.com +cold.localytics.com +cold2.53.localytics.com +coldcertainchannel.com +coldwellbanker.net +collect-us-east-1.tealiumiq.com +collect.adsorb.com +collect.rewardstyle.com +collect.tealiumiq.com +collectiable.com +collection.sv.d1.omtrdc.net +collection.sv.d2.omtrdc.net +collective.kochava.com +collectiveads.net +collector-1054.tvsquared.com +collector-184.tvsquared.com +collector-195.tvsquared.com +collector-2398.tvsquared.com +collector-428.tvsquared.com +collector-a.perimeterx.net +collector-pxel3l4xih.perimeterx.net +collector-pxhyx10rg3.perimeterx.net +collector-pxpmp8ilui.perimeterx.net +collector.a.pxi.pub +collector.deepmetrix.com +collector.githubapp.com +collector.leaddyno.com +collector.newsx.cc +collector.savvyads.com +collector.staging.pxi.pub +collegefootballnews.us.intellitxt.com +colnhive.com +colonize.com +colors-app.blogspot.com +columbahouse.com +columbianhouse.com +com-cdiscount.netmng.com +com-kia.netmng.com +com-kodak.netmng.com +com-mitsubishi.netmng.com +com-morningstar.netmng.com +com-msnbcnews.com +com-nbc-news.com +com-news24.com +com-notice.info +com-pro1.us +com-quidco.netmng.com +com-reports.com +com-sms-id.com +com-todaynews.com +com-vw.netmng.com +com.adv.vz.ru +com.com +com.cool-premiums-now.com +com.htmlwww.youfck.com +com.shc-rebates.com +com.tenjin.ios.api +com.vsassets.com +com2err.xyz +comadverts.bcmpweb.co.nz +comairairlines.com +combinationsmart.bid +comcast.demdex.net +comcast.tt.omtrdc.net +comcastresidentialservices.tt.omtrdc.net +comclick.com +comcluster.cxense.com +come-see-it-all.com +comfortablecheese.com +comfz.com +comicbookmovie.us.intellitxt.com +comicbookresources.us.intellitxt.com +comics.ign.us.intellitxt.com +comingsoon.us.intellitxt.com +commandwalk.com +commbau.com +comment-devenirriche.com +commerce-api.sprinklr.com +commerce-offer.com +commerce-rewardpath.com +commerce.www.ibm.com +commindo-media-ressourcen.de +commissionmonster.com +common.ziffdavisinternet.com +commonswing.com +communisave.co.za +community-old.dynamicyield.com +community-old2.dynamicyield.com +community-staging.appdynamics.com +community-staging.optimizely.com +community.adlandpro.com +community.allhiphop.com +community.appboy.com +community.appdynamics.com +community.appsflyer.com +community.dynamicyield.com +community.instartlogic.com +community.marketo.com +community.monerise.com +community.optimizely.com +communitypetclinicmanteca.com +comon.monlineserviceplc.com +compactbanner.com +compactiongames.gameaholic.com +companie.biz +companies-catalog.com +companion.adap.tv +company-target.com +company.com.ph +companycreators.co.uk +compass.eloqua.com +compassenergyservices.com +compitte.com +completecabbage.com +completelyfreeporn.biz +complex-media-d.openx.net +complex.us.intellitxt.com +complexcom.skimlinks.com +complextoad.com +compliance-barak.xyz +compliance-george.xyz +compliance.dev.pardot.com +compnet.us.intellitxt.com +compolice.com +compolice.net +compositefarming.com +comprabanner.it +comprafacil.com.br +compucelunlock.net +compufixshop.com +compulenta.ru.intellitxt.com +computer-offer.com +computer-offer.net +computeractive.uk.intellitxt.com +computerbase.de.intellitxt.com +computerbild.de.intellitxt.com +computerhilfen.de.intellitxt.com +computeridee.nl.intellitxt.com +computernama.ownsthis.com +computernetworksonline.com +computers-electronics-rewardpath.com +computersncs.com +computertechanalysis.com +computertotaal.nl.intellitxt.com +computerwoche.de.intellitxt.com +computerworldcom.112.2o7.net +computing.uk.intellitxt.com +comsalud360.com +comscoreresearch.com +comsprague.com +comsss-56.com +comsysnet.com +comvelgmbh.d1.sc.omtrdc.net +concash.pl +concede.fmtlib.net +concept.viewbix.com +concernedcondition.com +concernrain.com +condeconsumermarketing.112.2o7.net +condenast-d.openx.net +condenast.112.2o7.net +condenast.demdex.net +condenast.insight.omtrdc.net +conds.ru +conduit.com +conf.dco.advertising.com +config-ltvp.inmobi.com +config.dco.advertising.com +config.dfw1.vip.inmobi.com +config.getmyip.com +config.inmobi.com +config.parsely.com +config.pfa.gcp.datamind.ru +config.sensic.net +config.uca.cloud.unity3d.com +config.unityads.unity3d.com +config1.veinteractive.com +config2.mparticle.com +configuration.ma.tune.com +configusa.veinteractive.com +confirmed-profits.com +confluence-test.sizmek.com +confluence.insnw.net +confluence.office.imprev.net +confluence.sizmek.com +conhive.com +connatix.com +connect-testing.urbanairship.com +connect.247media.ads.link4ads.com +connect.adroll.com +connect.decknetwork.net +connect.fullstory.com +connect.mixpanel.com +connect.onlinesucces.nl +connect.returnpath.com +connect.scroll.com +connect.secure.ggj4m.wellsfarg0-onllne.net +connect.urbanairship.com +connect5364.com +connectionlead.com +connectionzone.com +connexionsafe.com +connexity.net +connexity.snowflakeproxy.connexity.net +connextra.com +conpst.112.2o7.net +consciouscabbage.com +consciouschairs.com +consensu.org +consent.cookiebot.com +consentag.mgr.consensu.org +consentmanager.mgr.consensu.org +console.adserve.video +console.backtrace.io +console.ibm.xtify.com +console.sekindo.com +console.truconversion.com +console.xtify.com +consoliad.consoliads.com +consoliads.com +constantcontact.tt.omtrdc.net +constructionskills.in +construfuturo.com.mx +construmac.com.mx +consul-us-west-1.mparticle.com +consulfrance-munich.de +consult.taboola.com +consultant-online.ru +consulting.adviserplus.com +consulting.mywebsite.com.askronwilliams.leadpages.co +consumedmedia.com +consumer-org.com +consumer.krxd.net +consumeralternatives.org +consumergiftcenter.com +consumerincentivenetwork.com +consumerinfo.tt.omtrdc.net +consumerjourney.exponential.com +consumerproductsusa.com +consumerreports.org.ssl.d2.sc.omtrdc.net +consumerreports.tt.omtrdc.net +consumerreview.us.intellitxt.com +contact.vicedata.com +contactmusic.uk.intellitxt.com +contactmusic.us.intellitxt.com +contactos-gay.com +contactosporno.net +contadores.miarroba.com +container.pointroll.com +containers.piwik.pro +containertags.belboon.de +contato183.danet.a78.org +contaxe.com +contaxe.de +contempty.com +content-acceptance.sharethrough.com +content-ad.net +content-cdn.swrve.com +content-js.tapjoy.com +content-library.demandbase.com +content-ssl.yieldmanager.com +content-staging.sharethrough.com +content.acc-hd.de +content.activision.swrve.com +content.ad +content.ad-flow.com +content.ad20.net +content.adriver.ru +content.adroll.com +content.adservingfactory.com +content.adspynet.com +content.adtegrity.net +content.agkn.com +content.aimatch.com +content.bannerconnect.net +content.budsinc.com +content.clipster.ws +content.cmp.advertising.com +content.codelnet.com +content.contextweb.com +content.cpxinteractive.com +content.devvm.imprev.net +content.exacttarget.com +content.exoticads.com +content.imprev.net +content.integral-marketing.com +content.ipro.com +content.jetlore.com +content.joinaxxess.com +content.linkoffers.net +content.mkt51.net +content.mkt922.com +content.mkt931.com +content.mkt932.com +content.mkt941.com +content.outbrain.com +content.pilot.silverpop.com +content.pop6.com +content.promoisland.net +content.qa-dest.imprev.net +content.qa.imprev.net +content.quantserve.com +content.rmxads.com +content.seerealgirls.com +content.sharethrough.com +content.staging.imprev.net +content.swrve.com +content.taboola.com +content.tapjoy.com +content.testcluster.imprev.net +content.thrixxx.com +content.videoclick.ru +content.womensforum.com +content.yieldmanager.com +content.yieldmanager.edgesuite.net +content.zemanta.com +content.zontera.com +contentcleaner.com +contentlocked.xyz +contentlockingnetworks.com +contentsearch.de.espotting.com +contentwidgets.net +contentz.mkt51.net +contentz.mkt61.net +contentz.mkt81.net +contentz.mkt8668.com +contentz.mkt912.com +contentz.mkt932.com +contentz.mkt941.com +context.adshadow.net +context3.kanoodle.com +context5.kanoodle.com +contextad.pl +contextlinks.netseer.com +contextual.media.net +contextualadsorigin.media.net +contextualyield.com +contextweb.com +contextweb.map.fastlylb.net +contexualsearch.com +continentialairline.com +contniental.com +contractor.wbinsights.com +contributor.google.com +control.adap.tv +control.kochava.com +control.media.net +control.springserve.com +controlhertoy.be +controller.foreseeresults.com +controlsecurity.net +conv.adengage.com +conversant.mgr.consensu.org +conversantmedia.com +conversation.dev.api.driftt.com +conversion-pixel.invitemedia.com +conversion.7search.com +conversion.ace.advertising.com +conversionruler.com +convert-sr.streamrail.net +convertro.com +convertwordtoexcel.com +convhkmp.taboola.com +convlatbmp.taboola.com +convnjmp.basebanner.com +convrse.media +convusmp.admailtiser.com +coocomall.com +cookevegas.com +cookie.altitude-arena.com +cookie.monster.com +cookie.pebblemedia.be +cookie.sync.ad.cpe.dotomi.com +cookieconsent.cloudapp.net +cookieconsent.trafficmanager.net +cookiecontainer.blox.pl +cookieinformation.mgr.consensu.org +cookielawblog.wordpress.com +cookiepixie.zemanta.com +cookies-dev.onetrust.mgr.consensu.org +cookies-prod.onetrust.mgr.consensu.org +cookies-staging.onetrust.mgr.consensu.org +cookies.cmpnet.com +cookies.onetrust.mgr.consensu.org +cookiescript.info +cookiescript.infos +cookiescriptcdn.pro +cookiesync-mynativeplatform-347915877.us-east-1.elb.amazonaws.com +cookiesync.mparticle.com +cookingcom.112.2o7.net +cookingmeat.ru +cookingtiprewards.com +cookingyourspanish.com +cooknfit.com +cookonsea.com +cooksrecipes.us.intellitxt.com +cool-premiums-now.com +cool-premiums.com +cool-technology.com +cool-wedding.net +cool4mob.com +coolbar.pro +coolbotsearch4.info +coolemailnames.com +coolfoto.dk +coolfreehost.com +coolgamechannel.com +coolinc.info +coolpremiumsnow.com +coolrastaman.free.fr +coolsavings.com +coolscience.co.uk +coolsvision.com +cooltechzone.us.intellitxt.com +cooltown.dk +coolvids.net +coolwebstats.com +coolyarddecorations.com +coop-gamers.ru +coop.crwdcntrl.net +cooper.logs.roku.com +coordinatedcub.com +coordino.com +copblock.org +cope.it +copperchickens.com +coppia.info +copro.pw +coprofam.org +copycarpenter.com +copyprintduplicate.com +copyright-reform.info +copyrightaccesscontrols.com +copyrightclaims.org +copythinker.com +coquettes.free.fr +coquettishgirls.com +coquin-voyeur.fr +coquine-dispo.com +coquins.tahiti.free.fr +cor.allinviews.com +cor.beeviewd.com +cor.bestcontentonline.com +cor.installfarm.com +cor.placeyourview.com +cor.shoofle.tv +coralmedia.rtb.adx1.com +coraltubbex.co.be +corba.adtech.de +corba.adtech.fr +corba.adtech.us +cordstrap.cc +core.ad20.net +core.adprotected.com +core.adtech.de +core.adtechjp.com +core.adtechus.com +core.adunity.com +core.bluefly.com +core.insightexpressai.com +core.royalads.net +core.videoegg.com +core.vntsm.com +core.zontera.com +core0.node12.top.mail.ru +core1.adservingfactory.com +core2.adtlgc.com +coreclickhoo.com +coreg.flashtrack.net +coreglead.co.uk +corelcom.112.2o7.net +coreluk.112.2o7.net +coremetrics.com +coreplays.com +coriandre10.free.fr +corinthiancolleges.112.2o7.net +coriolis.accuweather.com +corm.hit.gemius.pl +cornerstone-countertops.com +cornflakes.pathfinder.com +coroasnet.net +corp.appdynamics.com +corp.flurry.com +corp.inmobi.com +corp.midasplayer.com +corp.mparticle.com +corp.outbrain.com +corp.qualtrics.com +corp.returnpath.net +corp.sonobi.com +corp.tune.com +corp.viewbix.com +corp2.viewbix.com +corpopyme.cl +corporate.crakmedia.com +corps-accord.com +corpvpn.coremetrics.com +corroshield.estb.com.sg +corta.co +corusads.dserv.ca +corvus.co.be +corzz.pcloadletter.quhu.info +cosadclinic.com +cosale.peluqueriacaninamorocha.cl +cosiloon.com +cositos.com.mx +cosmetic.donna7753191.ru +cosmetice-farduri.ro +cosmeticscentre.uk.com +cosmi.gamerbots.hop.clickbank.net +cosmicshovel-d.openx.net +cosmofoods.com +cosmos.felago.es +cosmos.furnipict.com +costargroup.112.2o7.net +costcoworld.life +couhome.112.2o7.net +counselheal.us.intellitxt.com +count-server.sharethis.com +count.9yx.com +count.casino-trade.com +count.channeladvisor.com +count.daem0n.com +count.dba.dk +count.freett.com +count.im +count.ly +count.paycounter.com +count.pcpop.com +count.rbc.ru +count.rin.ru +count.rtl.de +count.spiegel.de +count.vivistats.com +count.west263.com +count.xhit.com +count.yandeg.ru +count1.compteur.fr +count10.51yes.com +count11.51yes.com +count12.51yes.com +count14.51yes.com +count15.51yes.com +count16.51yes.com +count17.51yes.com +count19.51yes.com +count20.51yes.com +count22.51yes.com +count24.51yes.com +count25.51yes.com +count27.51yes.com +count29.51yes.com +count3.51yes.com +count30.51yes.com +count31.51yes.com +count32.51yes.com +count33.51yes.com +count35.51yes.com +count37.51yes.com +count38.51yes.com +count4.51yes.com +count46.51yes.com +count47.51yes.com +count48.51yes.com +count5.51yes.com +count6.51yes.com +count8.51yes.com +counted.com +counter.123counts.com +counter.1stblaze.com +counter.24log.com +counter.24log.es +counter.24log.it +counter.24log.ru +counter.aaddzz.com +counter.adultcheck.com +counter.adultrevenueservice.com +counter.advancewebhosting.com +counter.aport.ru +counter.asexhound.com +counter.avp2000.com +counter.awempire.com +counter.bigli.ru +counter.bizland.com +counter.bloke.com +counter.cam-content.com +counter.clubnet.ro +counter.cnw.cz +counter.co.kz +counter.credo.ru +counter.cz +counter.dieit.de +counter.digits.com +counter.dreamhost.com +counter.dt07.net +counter.e-audit.it +counter.execpc.com +counter.fateback.com +counter.gamespy.com +counter.gemius.pl +counter.goingup.com +counter.hitbox.com +counter.hitmir.ru +counter.hitslink.com +counter.hitslinks.com +counter.htmlvalidator.com +counter.impressur.com +counter.inetusa.com +counter.inti.fr +counter.jasmin.hu +counter.joins.com +counter.kaspersky.com +counter.kmindex.ru +counter.letssingit.com +counter.marketgid.com +counter.megaindex.ru +counter.mgid.com +counter.mirohost.net +counter.mojgorod.ru +counter.mtree.com +counter.mycomputer.com +counter.netmore.net +counter.nope.dk +counter.nowlinux.com +counter.ok.ee +counter.paradise.net.nz +counter.pcgames.de +counter.personyze.com +counter.prohledat.cz +counter.rambler.ru +counter.rapidcounter.com +counter.relmaxtop.com +counter.scribblelive.com +counter.search.bg +counter.sexhound.nl +counter.sexsuche.tv +counter.snackly.co +counter.sparklit.com +counter.spylog.com +counter.superstats.com +counter.surfcounters.com +counter.times.lv +counter.top.dating.lt +counter.top.ge +counter.top100.penki.lt +counter.topphoto.ru +counter.topping.com.ua +counter.tripod.com +counter.uq.edu.au +counter.w3open.com +counter.web-marketolog.ru +counter.webcom.com +counter.webmedia.pl +counter.webservis.gen.tr +counter.webtrends.com +counter.webtrends.net +counter.xeanon.com +counter.xxxcool.com +counter.yadro.ru +counter.yakbucks.com +counter.yakcash.com +counter.yesky.com +counter.zone.ee +counter1.bravenet.com +counter1.fc2.com +counter1.sextracker.be +counter1.sextracker.com +counter10.bravenet.com +counter10.sextracker.be +counter10.sextracker.com +counter11.bravenet.com +counter11.sextracker.be +counter11.sextracker.com +counter12.bravenet.com +counter12.sextracker.be +counter12.sextracker.com +counter13.bravenet.com +counter13.sextracker.be +counter13.sextracker.com +counter14.bravenet.com +counter14.sextracker.be +counter14.sextracker.com +counter15.bravenet.com +counter15.sextracker.be +counter15.sextracker.com +counter16.bravenet.com +counter16.sextracker.be +counter16.sextracker.com +counter17.bravenet.com +counter18.bravenet.com +counter19.bravenet.com +counter2.blog.livedoor.com +counter2.bravenet.com +counter2.freeware.de +counter2.hitbox.com +counter2.hitslink.com +counter2.sextracker.be +counter2.sextracker.com +counter20.bravenet.com +counter21.bravenet.com +counter22.bravenet.com +counter23.bravenet.com +counter24.bravenet.com +counter25.bravenet.com +counter26.bravenet.com +counter27.bravenet.com +counter28.bravenet.com +counter29.bravenet.com +counter3.bravenet.com +counter3.sextracker.be +counter3.sextracker.com +counter30.bravenet.com +counter31.bravenet.com +counter32.bravenet.com +counter33.bravenet.com +counter34.bravenet.com +counter35.bravenet.com +counter36.bravenet.com +counter37.bravenet.com +counter38.bravenet.com +counter39.bravenet.com +counter4.bravenet.com +counter4.sextracker.be +counter4.sextracker.com +counter40.bravenet.com +counter41.bravenet.com +counter42.bravenet.com +counter43.bravenet.com +counter44.bravenet.com +counter45.bravenet.com +counter46.bravenet.com +counter47.bravenet.com +counter48.bravenet.com +counter49.bravenet.com +counter4all.dk +counter4u.de +counter5.bravenet.com +counter5.sextracker.be +counter5.sextracker.com +counter50.bravenet.com +counter6.bravenet.com +counter6.sextracker.be +counter6.sextracker.com +counter7.bravenet.com +counter7.sextracker.be +counter7.sextracker.com +counter8.bravenet.com +counter8.sextracker.be +counter8.sextracker.com +counter9.bravenet.com +counter9.sextracker.be +counter9.sextracker.com +counterad.de +counteraport.spylog.com +counterbot.com +countercrazy.com +counters.auctionhelper.com +counters.auctionwatch.com +counters.auctiva.com +counters.freewebs.com +counters.gigya.com +counters.honesty.com +counters.vendio.com +counters.xaraonline.com +counting.kmindex.ru +countryweekly.us.intellitxt.com +counts.tucows.com +coupling-media.de +coupon.bitcoin.siliconorchard.com +couponchief.122.2o7.net +coupongifts.life +courierpostonline.us.intellitxt.com +courses.appsee.com +cover.m2y.siemens.ch +cover9.adultfriendfinder.com +cowboy.contextuads.com +cowcotland.fr.intellitxt.com +cowledges.com +coxhsi.112.2o7.net +coxnet.112.2o7.net +coxnetmasterglobal.112.2o7.net +coxpalmbeachpost.112.2o7.net +coxtv.us.intellitxt.com +cp.abbp1.pw +cp.h-bid.com +cp.kargo.com +cp.promoisland.net +cp.tune.com +cpabuild.com +cpacampaigns.directtrack.com +cpaclickoffer.com +cpagrip.com +cpalead.com +cpanel.accessiblemetrics.com +cpanel.advertisingbox.com +cpanel.airvertiseme.com +cpanel.analyse.advertisingbox.com +cpanel.analyticson.com +cpanel.beacon.terratracker.com +cpanel.buypixelads.com +cpanel.chartboost.com +cpanel.clickconvertsell.com +cpanel.eazybiz.ng +cpanel.email.advertisingbox.com +cpanel.esttrk.com +cpanel.ezwebsitetraffic.com +cpanel.franklyinc.com +cpanel.intelsad.com +cpanel.marketing365.mk +cpanel.marketingmachine.co.za +cpanel.monerominer.rocks +cpanel.nativeads.com +cpanel.panadvert.com +cpanel.siliconorchard.com +cpanel.starkey.theappgrader.com +cpanel.terratracker.com +cpanel.topprotestsigns.com +cpanel.ttflb.com +cpanel.viewsignage.com +cpanel.yodelmobilecouk.yodelmobile.com +cpanel.yodelmobilelondon.yodelmobile.com +cpanel.yodelmobilemobi.yodelmobile.com +cpatrack.leadn.com +cpatraffictracker.com +cpaway.afftrack.com +cpays.com +cpbld.co +cpbldi.com +cpm.admob.com +cpm.adspine.com +cpm.marketo.net +cpm.super-links.net +cpm.tz4.com +cpm1.affiz.net +cpm10.com +cpm2.admob.com +cpm20.com +cpmadvisors.com +cpmaffiliation.com +cpmstar.com +cpp.imp.mpx.mopub.com +cpro.baidu.com +cps01-ssl.svc.insnw.net +cpu.firingsquad.com +cpu2cash.link +cpufan.club +cpusall.112.2o7.net +cpv.popxml.com +cpx.to +cpxdeliv.com +cpxinteractive.com +cqcounter.com +cqfnvznw.info +cqji.artidentalkurs.com +cquotient.com +cr.appsee.com +cra-arc-gc-ca.noads.biz +cra-arc.gc.ca.bioder.com.tr +crabbychin.com +crackfulldownload.com +crackguru.tk +crackle.demdex.net +crackle.hb.omtrdc.net +cracks.vg +crackspider.net +crackspider.us +cracksplanet.com +crackzone.net +crackzplanet.com +craftyenjoyments.co.uk +crain.d1.sc.omtrdc.net +crakmedia.com +craktraffic.com +crammer.dev.pardot.com +crana.ie +cranly.net +crash-day.ru +crash-metrics.sdk.inmobi.com +crashlytics.com +crawlability.com +crawlclocks.com +crazy-babes.com +crazyboost.pro +crazychimps.com +crazyclickstats.com +crazyegg.com +crazyeshop.com +crazygay.info +crazyheaven.de +crazylolitas.dorki.info +crazypopups.com +crazyporn.biz +crazyporndeals.com +crazyprotocol.com +crazyserialz.info +crazysex.nu +crazysex.org +crazysms.nl +crazywebcamsex.com +crbcdn.jsfiddle.net +crcdn.adnxs.com +crchaudhary.com +crd.clan.su +creadordedinero.com +creafi-online-media.com +creamdolls.com +creameet.com +creampie.afdss.info +creampiepornvideos.com +creampietraffic.com +creams.makeforum.eu +creamyfacial.com +crearmonia.com +create.leadid.com +create.lidstatic.com +create2fear.com +createfeartr3.com +createthegroup.122.2o7.net +creatiby1.unicast.com +creativationshow.com +creative-templates-api.gumgum.com +creative.ad121m.com +creative.ad131m.com +creative.adshuffle.com +creative.agkn.com +creative.ak.facebook.com +creative.cc-dt.com +creative.clicksor.com +creative.medianexusnetwork.com +creative.mock.exponential.com +creative.nscash.com +creative.placelocal.com +creative.wwwpromoter.com +creative.xtendmedia.com +creative1cdn.mobfox.com +creativeads.ro +creativeby1.unicast.com +creativeby2.unicast.com +creativecdn.com +creativecentral.advertising.com +creativehutindia.com +creativemarketingdigital.com +creativemindhacks.com +creatives.acceptance.sharethrough.com +creatives.adbetclickin.pink +creatives.ancoraplatform.com +creatives.as4x.tmcs.net +creatives.doubleclick.net +creatives.livejasmin.com +creatives.rgadvert.com +creatives.sharethrough.com +creatives.smaato.net +creatives.staging.sharethrough.com +creativeteam.it +creativos.ads.uigc.net +creatrixads.com +credibleartstherapies.org +crediblegfj.info +crediko.pl +credishe.com +credit-card-application.now-cash.com +credit-cards.shengen.ru +credit.finance.intuit.com +creditagricole.tt.omtrdc.net +creditauthpagev3.info +creditbootcamp.com +creditburner.blueadvertise.com +creditcardscom.112.2o7.net +creditsoffer.blogspot.com +credity.ucoz.ru +creview.adbureau.net +crewardscyprus.top +cri.d1.sc.omtrdc.net +cribdare2no.com +crimg.sv.publicus.com +crisptic01.net +criteo.com +criteo.net +critictruck.com +crllmzsy.top +crm-preview.dynamicyield.com +crm.adxtrem.com +crmapi.idsp.inmobi.com +crmbuyer.us.intellitxt.com +croissed.info +crops.dunight.eu +crossout.net +crosspixel.demdex.net +crosspromo.voodoo.io +crowd.fyber.com +crowd.rubiconproject.com +crowdgravity.com +crowdignite.com +crownclam.com +crta.dailymail.co.uk +crtl.aimatch.com +crtv.mate1.com +crucible.yieldmo.com +cruisecritic.112.2o7.net +crux.songline.com +cruyff.alphonso.tv +crv.clickad.pl +crwdcntrl.net +crypt.aws.branch.io +cryptaloot.pro +crypto-loot.com +crypto-pool.fr +crypto-webminer.com +crypto.csgocpu.com +cryptobara.com +cryptocoinabout.com +cryptocoinsad.com +cryptolabpro.com +cryptoloot.pro +cryptonoter.com +cryptosearch.site +cryptotab.net +cryptown.netlify.com +crystalshoot.in +crystalslot.com +crystalxxxmovies.com +cryto-nemesis.xyz +cs-gra.pl +cs-passion.pl +cs.adxpansion.com +cs.exitmonitor.com +cs.iadsdk.apple.com +cs.keen.io +cs.luckyorange.net +cs.montrealplus.ca +cs.prd.msys.playstation.net +cs.rubiconproject.com +cs.sexcounter.com +cs.shiporama.com +cs.spotlessweb.com +cs.yieldoptimizer.com +cs1.adxpansion.com +cs1g.com +cs340.wac.thetacdn.net +cs6hm.com +cs905.wac.systemcdn.net +cs936.wac.thetacdn.net +csaladiszex.eu +csc.beap.ad.yieldmanager.net +csc.beap.bc.yahoo.com +cserver.mii.instacontent.net +csgo-jackpot.net +csgo.itfb.name +csgocpu.com +csgoezknife.com +csgojackpot.im +csgoskinsproject.pl +csgoslayer.com +csh.actiondesk.com +cshacks.partycat.us +csharpcorner.us.intellitxt.com +csk.ru +csk2014.info +csm.rotator.hadj7.adjuggler.net +csma95349.analytics.edgesuite.net +csmail.iggcn.com +csmc.org +csnation.us.intellitxt.com +csoonlinecom.112.2o7.net +csp-collector.appspot.com +csp-dev1.timecommerce.net +csp-dev2.timecommerce.net +csp-dev3.timecommerce.net +csp-dev4.timecommerce.net +csp-dev5.timecommerce.net +csp-testsite.timecommerce.net +csp.criteo.com +csp.fastclick.net +csp.req.franklyinc.com +cspix.media6degrees.com +cspreporter-stage.optimizely.com +cspreporter.optimizely.com +csr.onet.pl +cstatic.weborama.fr +cstest.adtech.de +cstest.adtechus.com +cstrespsurvey.ca +cswilliamsburg.com +csync.smartadserver.com +ct.5.p2l.info +ct1.addthis.com +ct2.comclick.com +ctbdev.net +cti.w55c.net +ctibank.com +ctix8.cheaptickets.com +ctj.adx1.com +ctlrnwbv.ru +ctnet2.in +ctnetwork.hu +ctnsnet.com +ctologger01.analytics.go.com +ctr0181.pixel.printsites.net +ctrack.advidi.com +ctrack.optin-global.net +ctrack.trafficjunky.net +ctrack07.optin-global.net +ctrb.jscdndel.com +ctrck.com +ctrix.com +ctroneum.crypto-webminer.com +ctrps.ru +cts.channelintelligence.com +cts.qwapi.com +cts.w55c.net +ctsde01.wiredminds.de +cttracking08.com +ctv.monarchads.com +ctv.us.intellitxt.com +ctvcrimelibrary.112.2o7.net +ctvmaincom.112.2o7.net +ctvsmokinggun.112.2o7.net +ctvtsgtv.112.2o7.net +ctxt.tribalfusion.com +ctxtad.tribalfusion.com +cu.genesismedia.com +cualuoimientrung.com +cube.ign.us.intellitxt.com +cube.yext.com +cubedir.com +cubics.com +cubiertasbarcelona.es +cubook.supernew.org +cubs-jerseys.us +cucdn.genesismedia.com +cuckold-phone-sex.info +cudacorp.com +cuev.in +cuiland.info +cukesj20trk.marketo.com +cul-gratuit.biz +cul-gratuit.org +culs-fr.com +culturalblog.gumgum.com +culturalumnezia.ch +culturevie.info +culu.info +cum-facials.nu +cum2mommy.com +cumbersomecloud.com +cumfiesta-pics.info +cumfukme.com +cumgfs.info +cumguzler.nu +cumingayass.net +cumluv.com +cumsea.net +cumsexgirls.com +cumshot.gold10.com +cumshotx.net +cumslinger.com +cumslutsue.co.uk +cumspiracy.com +cuna.st +cunda.d3.sc.omtrdc.net +cunilingus.nu +cunilingusx.com +cuntonly.com +cuoie.com +cuoujvfi.angelcities.com +cupday.com +curalate-api-prod.us-east-1.elasticbeanstalk.com +curalate.com +curl.ru +currency.prebid.org +current-azure-ext.newrelic.com +current.app.optimizely.com +currentlyoffer.com +cursor.kvada.globescale.com +cursosobej.sslblindado.com +curtaincows.com +curtasgastronomia.pt +curvaplay.com +cuseemee.free.fr +cusors.io +cust-info.com +cust.agkn.com +cust.exacttarget.com +custodieva.ru +custom-audience.intentmedia.net +custom-electric-guitar.com +custom-redirect.getambassador.com +custom-wigs.com +custom-wrs.api.responsys.net +custom.allistracking.com +custom.bnc.lt +custom.crypto-webminer.com +custom3hurricanedigitalmedia.com +customad.cnn.com +custombi.sizmek.com +customboxes4less.com +customcatchcan.com +customcedarfencesofmichigan.com +customchopperstuff.com +customcollegeessays.net +customer-feedbacks.web.roku.com +customer-folder-eu.dynamicyield.com +customer-folder.dynamicyield.com +customer-videos.intercomcdn.com +customer.dev.api.driftt.com +customer.instartlogic.com +customerdispute.com +customerexchange-uat.thunderhead.com +customerexchange.thunderhead.com +customergrowthsystems.com +customerguru.in +customerpromos-a.akamaihd.net +customerscreensavers.com +customerservice-appleid.com +customerstatus.co +customersupporthelp.com +customrubbermolding.com +customsboysint.com +customsua.com.ua +customtrck.com +cutalltheshit.com +cutecushion.com +cutepornstars.us +cuteturkey.com +cuttings.com +cv.apprupt.com +cv.bsvideos.com +cvent.axiatraders.com +cvety24.by +cvp1.asvoxod.ru +cvp2.asvoxod.ru +cvp3.asvoxod.ru +cvp4.asvoxod.ru +cvp5.asvoxod.ru +cvp6.asvoxod.ru +cvp7.asvoxod.ru +cvp8.asvoxod.ru +cvs-p.shopcurbside.com +cvs-s.shopcurbside.com +cvs-t.shopcurbside.com +cvs.shopcurbside.com +cvt.mydas.mobi +cvvy.com +cw-international.com +cw.nu +cwcwcw.tk +cwmgaming.com +cwnetworkmparticle.112.2o7.net +cwpaving.com +cwportal.112.2o7.net +cws.conviva.com +cx.atdmt.com +cx.ssacdn.com +cx.wootric.com +cxcc.ssacdn.com +cxense.com +cxi-api-demo.wootric.com +cxi-api-staging.wootric.com +cxi-api.wootric.com +cxlaxexprswy01.smo.connexity.net +cxlaxexprswy02.smo.connexity.net +cxoadfarm.dyndns.info +cxociocom.112.2o7.net +cxocomdev.112.2o7.net +cxp.mxptint.net +cxpixel.bidsystem.com +cxpromote.com +cxtad.specificmedia.com +cya2.net +cyanintim.co.be +cyber-incentives.com +cyber-porn.nu +cyber-sluts.nu +cyberable.com +cyberacademy.ac.zm +cyberagent.122.2o7.net +cyberbike.free.fr +cyberbounty.com +cybercloud.info +cyberdefender.122.2o7.net +cyberdolls.de +cyberduck.fr +cybererotica.nu +cyberiatrading.com +cyberium.info +cybermecca.com +cybermix.info +cyberporno.de.vu +cyberscat.com +cybersexarea.com +cybersexwebsites.com +cybertown.ru +cyberwoot.com +cyberzine.com +cybilling.com +cyclobenzaprine.1.p2l.info +cyclobenzaprine.ourtablets.com +cyclone.aws.paperg.com +cyclops.prod.untd.com +cydoor.com +cyhners.ero-advertising.com +cylia666.de +cypernhuset.se +cyppolice.com +cyprusbuyproperties.com +cyril.pisselet.free.fr +cyrildavid1.free.fr +cyrillo2.free.fr +cyse.tk +cyseal.cyveillance.com +cz.adocean.pl +cz.bbelements.com +cz.hit.gemius.pl +cz.search.etargetnet.com +cz.static.etargetnet.com +cz11.clickzs.com +cz11.clickzzs.nl +cz2.clickzs.com +cz3.clickzs.com +cz4.clickzs.com +cz4.clickzzs.nl +cz5.clickzs.com +cz5.clickzzs.nl +cz6.clickzs.com +cz7.clickzs.com +cz7.clickzzs.nl +cz8.clickzs.com +cz8.clickzzs.nl +cz9.clickzs.com +czas-na-fb.blogspot.com +czat.wp.pl +czech-beauties.com +czech-girls.info +czerwonystoliczek.pl +czilladx.com +czmedia.com +cznshuya.ivnet.ru +cztbhd.cn +czyjtonr.info +czyjtonumertel.pl +d-and-h.com +d-cache.microad.jp +d-cache.microadinc.com +d-ns.ga +d-ouentai.com +d-track.send.microad.jp +d-track.send.microadinc.com +d.101m3.com +d.254a.com +d.aa.online-metrix.net +d.abnad.net +d.adgear.com +d.admob.com +d.admp.io +d.adnetxchange.com +d.adroll.com +d.ads.readwriteweb.com +d.adsbyisocket.com +d.adserve.com +d.adxcore.com +d.aggregateknowledge.com +d.agkn.com +d.analytics.yahoo.com +d.applovin.com +d.applvn.com +d.audienceiq.com +d.cfcdist.gdn +d.cfcnet.gdn +d.cfcnet.top +d.chango.com +d.cntv.cn +d.company-target.com +d.cpufan.club +d.dc121677.com +d.e0mn.com +d.gcp.msas.media.net +d.getaccss.com +d.greece-search.com +d.la1-c2-phx.salesforceliveagent.com +d.liadm.com +d.ligatus.com +d.lumatag.co.uk +d.msas.media.net +d.oix.com +d.peoplesearchads.com +d.phormlabs.com +d.rmgserving.com +d.rxthdr.com +d.serve-sys.com +d.shareaholic.com +d.skimresources.com +d.sspcash.adxcore.com +d.t.tailtarget.com +d.tailtarget.com +d.tds.adlabs.ru +d.thanksearch.com +d.turn.com +d.wiyun.com +d.zeroredirect.com +d.zeroredirect2.com +d077aa.r.axf8.net +d0t.ru +d1.24counter.com +d1.kuai8.com +d1.openx.org +d1.playboy.com +d1.sc.omtrdc.net +d1.sv.omtrdc.net +d1.zedo.com +d10.zedo.com +d1054130-28095.cp.blacknight.com +d11.zedo.com +d1171912.cp.blacknight.com +d12.zedo.com +d12tr1cdjbyzav.cloudfront.net +d13dhn7ldhrcf6.cloudfront.net +d14.zedo.com +d169bbxks24g2u.cloudfront.net +d1e1rbybdt265x.cloudfront.net +d1fc8wv8zag5ca.cloudfront.net +d1jikhx1ssl81z.cloudfront.net +d1l6p2sc9645hc.cloudfront.net +d1lxhc4jvstzrp.cloudfront.net +d1piupybsgr6dr.cloudfront.net +d1spgg7psata7d.cloudfront.net +d1v9u0bgi1uimx.cloudfront.net +d1xfq2052q7thw.cloudfront.net +d1z2jf7jlzjs58.cloudfront.net +d1zatounuylvwg.cloudfront.net +d2.sc.omtrdc.net +d2.sv.omtrdc.net +d2.zedo.com +d21j0tl4id6lf2.cloudfront.net +d24n15hnbwhuhn.cloudfront.net +d26b395fwzu5fz.cloudfront.net +d2bgg7rjywcwsy.cloudfront.net +d2c8v52ll5s99u.cloudfront.net +d2cgumzzqhgmdu.cloudfront.net +d2cmedia.ca +d2jsp.org +d2leoy3k16s14d.cloudfront.net +d2nq0f8d9ofdwv.cloudfront.net +d2o9ozfswytaqz.cloudfront.net +d2oh4tlt9mrke9.cloudfront.net +d2tgfbvjf3q6hn.cloudfront.net +d2vg62nuq66wql.cloudfront.net +d2vig74li2resi.cloudfront.net +d2zah9y47r7bi2.cloudfront.net +d3.sc.omtrdc.net +d3.sv.omtrdc.net +d3.zedo.com +d31qbv1cthcecs.cloudfront.net +d32k27yvyi4kmv.cloudfront.net +d33f10u0pfpplc.cloudfront.net +d342r80tvdrdhm.cloudfront.net +d3ahinqqx1dy5v.cloudfront.net +d3anogn3pbtk4v.cloudfront.net +d3dcugpvnepf41.cloudfront.net +d3ddidv77grh0f.cloudfront.net +d3fd89.r.axf8.net +d3iz6lralvg77g.cloudfront.net +d3kkw-6ch3c.ads.tremorhub.com +d3oltyb66oj2v8.cloudfront.net +d3qxwzhswv93jk.cloudfront.net +d3rxu0fywkpi6t.cloudfront.net +d3ujids68p6xmq.cloudfront.net +d4.cumshots.ws +d4.sv.omtrdc.net +d4.zedo.com +d4h.adx1.com +d4pz26d5itt3n.cloudfront.net +d4q8zgf756.com +d4x.org +d5.sv.omtrdc.net +d5.zedo.com +d5nxst8fruw4z.cloudfront.net +d5p.de17a.com +d6.c5.b0.a2.top.mail.ru +d6.zedo.com +d662653.u-telcom.net +d6ve.adx1.com +d6y5.ads.pof.com +d7.zedo.com +d8.zedo.com +d8acddffe978b5dfcae6.date +d8rk54i4mohrb.cloudfront.net +d8x.pl +d9.zedo.com +d925d6eb.amy.gs +d9d0e0.r.axf8.net +da-cdn.amazon-adsystem.com +da-v-eu.amazon-adsystem.com +da-v-fe.amazon-adsystem.com +da-v-na.amazon-adsystem.com +da-v-sin.amazon-adsystem.com +da.2000888.com +da.ce.bd.a9.top.list.ru +da.inmobi.com +da.midasplayer.com +da.newstogram.com +daaa.ero-advertising.com +dabaocaigou.com +dabcc.us.intellitxt.com +dable.io +dabulamanzi.co.za +dad-and-daughter.com +dad.adx1.com +dadf.com +dadparty.com +dads.new.digg.com +dadsexsonmovies.com +daea.ero-advertising.com +dafabonus.com +dafatiri.com +dagcoin.org +daia.ero-advertising.com +daily-saver.com +dailyadultnews.com +dailyanal.net +dailycaller.us.intellitxt.com +dailycelebz.com +dailygab.us.intellitxt.com +dailyheraldpaddockpublication.112.2o7.net +dailylegs.net +dailymotion.demdex.net +dailymovie.us +dailypetphoto.com +dailyplanet.com.au +dailystab.us.intellitxt.com +dailytech.us.intellitxt.com +dailyweather.dev.airfind.com +dailyweather.staging.airfind.com +daimlerag.122.2o7.net +daimlerag.d2.sc.omtrdc.net +dakhinerkonthosor.com +dakic-ia-300.com +dal.d.la +dalavia.ru +dalecom.com +dalepietra.ro +daliestotal1.com +dallasnews-d.openx.net +dalystone.ie +dam.cdn.kargo.com +dam.cloud.kargo.com +dam.ec.kargo.com +dam1.cloud.kargo.com +dam2.cloud.kargo.com +dam3.cloud.kargo.com +dam5.cloud.kargo.com +damacheights.com +damamaty.tk +damavandkuh.com +damdoor.com +dame-ns.kz +damedingel.ya.ru +damm.royalfootweardistrict.com +damnashcollege.edu.bd +damnimcute.us.intellitxt.com +dampozyczke.pl +danabazar.com +danasdirt.us.intellitxt.com +danashop.ru +danban.com +dance-alarm.de +dancecourt.com +dancemistake.com +dancestudioberlin.com +dandingo.go2jump.org +danger-phentermine.allforyourlife.com +dangerdave.org +daniaviation.com +daniel.yodelmobile.com +danish-girls.com +danish-girls.nu +daniweb.us.intellitxt.com +danschawbel.com +dansguardian.org +danskedamer.dk +daoudi4.mystagingwebsite.com +dap.criteo.com +dap.digitalgov.gov +dap.ntua.gr +dapics1.free.fr +dapper.net +daptravel.com +darakht.com +daralasnan.com +dardenrestaurants.112.2o7.net +darikspaceadbg.hit.gemius.pl +darkbooks.org +darkevening.com +darkhorizons.us.intellitxt.com +darking01.tk +darking02.tk +darking03.tk +darking04.tk +darking05.tk +darking06.tk +darking07.tk +darking08.tk +darking09.tk +darkpage.win +darksex.info +darksmodels.info +darlamack.us.intellitxt.com +darm.net +darmebel.com.ua +darmowe-doladowania.net.pl +darmowe-doladowanie.pl +darmowe-ebooki.com.pl +darmowe-ebooki.net +darmowe-filmy-erotyczne.biz +darmowe-filmy.eu +darmowe-liczniki.info +darmowe-zakupy.com +darmowedoladowania25.blogspot.com +darmowefilmy.eu +darmowetesty.com +darmowy-seks.pl +darmowygenerator.blogspot.com +darodar.com +darseo.popunder.ru +darsresearch.com +dart.chron.com +dartz.fr +darvocet.ourtablets.com +darxk.com +das-wichtigste-im-leben.de +das33.io +dascoin-info.pl +dascoin.com +dascoin.com.ng +dascoin.com.pl +dascoin.prowly.com +dascoingroup.com +dascoininfo.blogspot.com +dascoininvest.com +dascoinmanager.com +dascoinpolska.com.pl +dasdada.fu.ck +dasecosystem.pl +daselefonbuch.de +daserste.ivwbox.de +dash.parsely.com +dash001.prxio.site +dashbo15myapp.com +dashboard-demo.wootric.com +dashboard-staging-aws.fgl.com +dashboard-staging-rbankus.fgl.com +dashboard-staging.wootric.com +dashboard.1p.bugsnag.appstore.a2z.com +dashboard.aca.bugsnag.appstore.a2z.com +dashboard.adcalls.nl +dashboard.adrizer.com +dashboard.agkn.com +dashboard.alpha.branch.io +dashboard.appboy.com +dashboard.appsee.com +dashboard.beta.branch.io +dashboard.bom.test.appsee.com +dashboard.branch.io +dashboard.bugsnag.appstore.a2z.com +dashboard.fgl.com +dashboard.firetv.bugsnag.appstore.a2z.com +dashboard.fyber.com +dashboard.in.backtrace.io +dashboard.inwemo.com +dashboard.jetlore.com +dashboard.juicemobile.com +dashboard.localytics.com +dashboard.monerise.com +dashboard.qa.test.appsee.com +dashboard.staging-west-2.appboy.com +dashboard.swrve.com +dashboard.tvadsync.com +dashboard.tweet.test.appsee.com +dashboard.vpn.insnw.net +dashboard.whoisvisiting.com +dashboard.wootric.com +dashboardnew.adcalls.nl +dashboards.alphonso.tv +dashgreen.online +dashingdirt.com +dashingsweater.com +dasmycoin.com +dassystem.eu +daswallet.com +dat2.ero-advertising.com +data-ero-advertising.com +data-ext.vungle.com +data-failover.eroadvertising.com +data-mining.tk +data-processing.adswizz.com +data-tools-dev.tools.airpr.com +data-tools.tools.airpr.com +data.abebooks.com +data.ad-score.com +data.ad.yieldmanager.net +data.adsrvr.org +data.adtech.de +data.adtechus.com +data.advertising.com +data.adxcel-ec2.com +data.alexa.com +data.apn.co.nz +data.captifymedia.com +data.choice.atdmt.com +data.cmcore.com +data.cnn.com +data.coremetrics.com +data.countboy.com +data.cpalead.com +data.de.coremetrics.com +data.districtm.io +data.emimino.cz +data.ero-advertising.com +data.eroadvertising.com +data.flurry.com +data.franklyinc.com +data.gosquared.com +data.kataweb.it +data.livefyre.com +data.m-freeway.com +data.mistat.intl.xiaomi.com +data.mistat.xiaomi.com +data.mobclix.com +data.murdoog.com +data.nal.usda.gov +data.namesakeoscilloscopemarquis.com +data.netscope.marktest.pt +data.pathful.com +data.qa-ext.livefyre.com +data.queryly.com +data.ritzcarlton.com +data.sec.intl.miui.com +data.sharethis.com +data.t402.livefyre.com +data.vicedata.com +data.vtc.pw +data.vungle.com +data.webads.co.nz +data0.bell.ca +data1.scopich.com +data2.ero-advertising.com +data2.gosquared.com +data2.perf.overture.com +data3.aniview.com +dataasmierci.blogspot.com +databaseranch.com +datacapture.serving-sys.com +datacollect.vmall.com +datacollect3.abtasty.com +datacollect6.abtasty.com +datadog.a.sentry.io +dataexchange.inmobi.com +datahub.sizmek.com +dataloading.net +datamark.net +datamind.ru +dataroom.fyber.com +datasecu.download +dataservices.download +datasmierci.pl +datasmierci01.blogspot.com +datasop.com +datasponsors.com +dataswitch-ads-75496044.us-east-1.elb.amazonaws.com +date.ero-advertising.com +date.ventivmedia.com +datingadvertising.com +dats.ero-advertising.com +datt.ero-advertising.com +daua.ero-advertising.com +dava.ero-advertising.com +davor.io +dawa.ero-advertising.com +dawnframing.com +dawnnationaladvertiser.com +dax-rd.ad.yieldmanager.net +daylogs.com +db-rnd-prisma-storage.rnd.gcp.datamind.ru +db.advertising.com +db.qa-dest.imprev.net +db.riskwaters.com +db.xmrpool.net +db0.net-filter.com +db0.sitestats.com +db1.sitestats.com +db2.net-filter.com +db2.sitestats.com +db3.net-filter.com +db3.sitestats.com +db3aqu.atdmt.com +db4.net-filter.com +db4.sitestats.com +db5.net-filter.com +db5.sitestats.com +db6.net-filter.com +db6.sitestats.com +db7.net-filter.com +db7.sitestats.com +dbadk.nuggad.net +dbbsrv.com +dbcontrol.doubleclick.net +dbg52463.moatads.com +dbios.org +dbs.advertising.com +dbta.ero-advertising.com +dbtechno.us.intellitxt.com +dc-storm.com +dc.5.p2l.info +dc.ads.linkedin.com +dc.applicationinsights.microsoft.com +dc.arrivalist.com +dc.bizjournals.com +dc.kaboodle.com +dc.sabela.com.pl +dc.sify.com +dc.webtrends.com +dc.widespace.com +dc01.automatad.com +dc01vpn.thunderhead.com +dc02vpn.thunderhead.com +dc03vpn.thunderhead.com +dc04vpn.thunderhead.com +dc3.corp.appdynamics.com +dc43.s290.meetrics.net +dc56.s290.meetrics.net +dc61.s290.meetrics.net +dc8xl0ndzn2cb.cloudfront.net +dcads.sina.com.cn +dcanscapital.co.uk +dcapps.disney.go.com +dcdn.adnxs.com +dce.nextstat.com +dcinfos.abtasty.com +dckappa.widespace.com +dclk.haaretz.co.il +dclk.haaretz.com +dclk.themarker.com +dclk.themarketer.com +dco-sandbox-2.datamind.ru +dco-test.datamind.ru +dco.advertising.com +dco.pool.datamind.ru +dco.quantserve.com +dcos.lijit.com +dcproxy1.thrunet.com +dcrt.netseer.com +dcs-edge-va6-802167536.us-east-1.elb.amazonaws.com +dcs-vod.apis.anvato.net +dcs.netbiscuits.net +dcs.wtlive.com +dcsmarketing.directtrack.com +dcstest.wtlive.com +dctk.expedia.com +dctracking.com +dd.connextra.com +dd881.static-ex.epom.com +ddd.gouwuke.cn +ddev1.franklyinc.com +ddnk.advertur.ru +de-mi-nis-ner.info +de-mi-nis-ner2.info +de-ner-mi-nis4.info +de-nis-ner-mi-5.info +de.2.cqcounter.com +de.5.p2l.info +de.adcolony.com +de.ads.adviva.net +de.ads.justpremium.com +de.adserver.yahoo.com +de.at.atwola.com +de.blog.newrelic.com +de.cookiescript.info +de.coremetrics.com +de.demdex.net +de.doubleclick.net +de.grmtech.net +de.hosting.adjug.com +de.inmobi.com +de.ioam.de +de.moneroocean.stream +de.returnpath.com +de.returnpath.net +de.sitestat.com +de.tynt.com +de1.frosmo.com +de17a.com +deadpantruck.com +deadpool.ops.ir1.inmobi.com +deadwalking.tv +dealdotcom.com +dealitright.click +dealmanager.buysellads.com +dealnews.122.2o7.net +dearerfonder.info +debloedmooieblondesecretaressepijpthaarbaasophetkantoor.blog-paradijs.com +debonairway.com +debt.shengen.ru +debtbudgeting.com +debtbusterloans.com +debuackedhkvu.bid +debug.adx1.com +debug.api.activision.swrve.com +debug.api.swrve.com +debug.engine.mobileapptracking.com +debuttheatre.org +decapsuleurderonde.free.fr +decenttools.com +decide.mixpanel.com +decidedna1.247realmedia.com +decidedna2.247realmedia.com +decidesilver.net +decisivedrawer.com +decisiveducks.com +decknetwork.net +decografix.com +decorator.crabgrab.cl +decorazilla.com +decota.es +decouvre.la +decoycreation.com +decrolyschool.be +ded.gostats.com +dedicatedtobeauty.com +deeclub.com +deepc.cc +deeplink.mobileapptracking.com +def.5.p2l.info +defaull-auto-devops-rnd-gke-test.rnd.gcp.datamind.ru +defectivesun.com +defenderxtactical.com +definitial.info +defpush.com +degea.alphonso.tv +dekoder.ws +del1.phillyburbs.com +delawareonline.us.intellitxt.com +delb.mspaceads.com +delb.myspace.com +delb2.myspace.com +delconewsnetwork.us.intellitxt.com +delegatediscussion.com +deleondeos.com +deleted-hddrive-safety-error7.flu.cc +deletespyware-adware.com +delfi.spring-tns.net +delfiadee.hit.gemius.pl +delfiadlt.hit.gemius.pl +delfiadlv.hit.gemius.pl +delfiee.adocean.pl +delfilv.adocean.pl +delfilv.hit.gemius.pl +delfin-aqua.com.ua +delicate.jsfinances.com +delightdriving.com +delightful.112.2o7.net +deliv.lexpress.fr +deliver.marketo.com +delivery-cdn-cf.adswizz.com +delivery-forensics.snapads.com +delivery-insights.snapads.com +delivery-s3.adswizz.com +delivery-us-central-1.openx.net +delivery.a.switchadhub.com +delivery.ad.newsnow.net +delivery.adnetwork.vn +delivery.adrecover.com +delivery.ads-creativesyndicator.com +delivery.ads.gfsrv.net +delivery.adyea.com +delivery.analyticson.com +delivery.c.switchadhub.com +delivery.clickonometrics.pl +delivery.d.switchadhub.com +delivery.d1.sv.omtrdc.net +delivery.d2.sv.omtrdc.net +delivery.e.switchadhub.com +delivery.first-impression.com +delivery.g.switchadhub.com +delivery.hornyspots.com +delivery.loopingclick.com +delivery.myswitchads.com +delivery.optimatic.com +delivery.platform.switchads.com +delivery.reklamz.com +delivery.sv.d1.omtrdc.net +delivery.sv.d2.omtrdc.net +delivery.swid.switchadhub.com +delivery.swid.switchads.com +delivery.switch.whatculture.com +delivery.switchadhub.com +delivery.thebloggernetwork.com +delivery.trafficbroker.com +delivery.trafficforce.com +delivery.trafficjunky.net +delivery.uat.247realmedia.com +delivery.us.myswitchads.com +delivery.w00tads.com +delivery.way2traffic.com +delivery.yourfuckbook.com +delivery1.topad.mobi +deliveryengine.adswizz.com +deliziedelpassato.it +dellalimov.com +dellinc.tt.omtrdc.net +deloitte.122.2o7.net +deloitteca.com +delononline.com +deloo.de +deloton.com +delphicom.112.2o7.net +delrico.net +delta-promotion-usa.com +delta.celebrus.com +delta.rspcdn.com +delta.terratracker.com +deltadoes.com +deluxedumps.com +demand-service.adtech.de +demand-service.adtechus.com +demandbase.com +demandbase.demandbase.com +demarsnc.it +dembele.alphonso.tv +demdex.net +demenageur.com +demimoorenude.1stok.com +deming.it +demisuganda.org +demo-jp.adlearnop.advertising.com +demo-new.dev.kargo.com +demo-uk.adlearnop.advertising.com +demo.addesk.advertising.com +demo.adlearnop.advertising.com +demo.adportal.advertising.com +demo.adpredictive.com +demo.adserve.video +demo.advertising.com +demo.agkn.com +demo.alphonso.tv +demo.appdynamics.com +demo.celebrus.com +demo.convertro.com +demo.dmp.piwik.pro +demo.franklyinc.com +demo.getsitecontrol.com +demo.intercom.io +demo.kampyle.com +demo.kargo.com +demo.onedisplay.advertising.com +demo.outbrain.com +demo.pardot.com +demo.presage.io +demo.sizmek.com +demo.sp-kunde.de +demo.testing.piwik.pro +demo.vertexinfo.in +demo.vicedata.com +demo.wbinsights.com +demo.webxmr.com +demo.wootric.com +demo.zemanta.com +demo02.firstdigitalshowcase.com +demo1.use.dynamicyield.com +demonews.us.intellitxt.com +demopk.truconversion.com +demoq.use-trade.com +demos.intercom.io +demos.viewsignage.com +demosite.juicemobile.com +demr.mspaceads.com +demr.myspace.com +demr.opt.fimserve.com +den-ax01.marketo.net +den-dc01.marketo.net +den-dc02.marketo.net +den-noch24.ru +den.cdn.survey.medallia.com +den01.sync.search.spotxchange.com +dengekix.com +dengi-pod-zalog-nedvizhimosti.ru +denguru.us.intellitxt.com +denis928.000webhostapp.com +deniserichards.1stok.com +deniven.1bb.ru +denizlihorozusatisi.com +denkend.ru +denkwerkstatt.info +dennispearsondesign.com +dennispublishing.112.2o7.net +densart.com +dentairemalin.com +dental.gumgum.com +dentalbible.com +dentalcliniclondonontario.com +dentalpearls.com.au +dentistsouthyarra.com.au +denver.staging.sdx.xfinity.com +denverpost.112.2o7.net +deploy.adx1.com +deployads.com +deployer.53.localytics.com +depo.realist.gen.tr +depositfiles-porn.ga +depotorder.com +depraved.biz +depttake.ga +dequoisebranler.free.fr +derangedadage91wis.files.wordpress.com +dercocenteryusic.cl +dereban16.net +derechodefamiliacr.com +derekhail.us.intellitxt.com +derevesendeco.com +derinceozelders.com +derkeiler.com +dero.crypto-webminer.com +dero.monerise.com +derstand.oewabox.at +derstandard.nuggad.net +desb.mspaceads.com +descargar-musica-gratis.net +descargas2.tuvideogratis.com +descargasporno.bitacoras.com +desejo.com.br +deseosx.com +deseretdigitalmedia.tt.omtrdc.net +deseretnews.112.2o7.net +desertedbreath.com +desertedrat.com +desertsunlandscape.com +deshevo-nedorogo.ru +deshmedia.com +desifever.com +design-lands.ru +design.advidi.com +designbloxlive.com +designcenter.at +designdevise.com +designer.ski +designmeat.com +designtechnica.us.intellitxt.com +desk.adasiaholdings.com +desk.mspaceads.com +desk.opt.fimserve.com +dessous-chics.fr +destinationrealestate.com +destinationsrvmaine.com +destop.org +destore.com +destre45.com +destructoid.us.intellitxt.com +desv383oqqc0.cloudfront.net +deta.ero-advertising.com +detailedglue.com +detailedgovernment.com +detalizaciya-tut.biz +detectdiscovery.com +detective01.ru +detectorcarecenter.in +detik.serving-sys.com +detki-opt.ru +detox-kit.com +detox.shengen.ru +detroitexotics.com +detroithardcore.com +detskehry.cz +detskie-zabavi.ru +deurschebank.de +deutsche-banh.de +deutschehobbyhuren.net +deutschekamagra.com +deutscheporn.net +deutschepornofilme.info +deutscher-handwerker-service-mallorca.com +deutschland123.de +deutschlandscard.de +deutschporno.biz +dev-adservices.cmp.advertising.com +dev-airflow.drawbrid.ge +dev-cdn-2.getambassador.com.dev-sandbox.getambassador.com +dev-cdn-2.getambassador.com.sandbox.getambassador.com +dev-cdn.districtm.io +dev-cdn.getambassador.com.dev-sandbox.getambassador.com +dev-cdn.getambassador.com.sandbox.getambassador.com +dev-cx.foresee.com +dev-d1-rum-collector-2.pingdom.net +dev-d1-rum-static-2.pingdom.net +dev-dmx.districtm.io +dev-lb.foresee.com +dev-www.taboola.com +dev-x.flurry.com +dev.2open.facebook-ads.adtz.com +dev.adasiaholdings.com +dev.adbuilder.gumgum.com +dev.adforum.com +dev.adlightning.com +dev.adx1.com +dev.airfind.com +dev.amplitude.com +dev.ap-southeast-2.kops.kargo.com +dev.api.drift.com +dev.api.jivox.com +dev.api.speedcurve.com +dev.appboy.com +dev.applicationinsights.microsoft.com +dev.aws.fwmrm.net +dev.bladegame.midasplayer.com +dev.bnc.lt +dev.branch.io +dev.buzzdeck.com +dev.cdn.districtm.io +dev.cjadsystems.dotomi.com +dev.clickconvertsell.com +dev.coinlab.biz +dev.corp.mparticle.com +dev.cp.h-bid.com +dev.criteo.com +dev.cryptobara.com +dev.cyclone.aws.fwmrm.net +dev.dashboard.gumgum.com +dev.datamark.net +dev.demobuilder.gumgum.com +dev.display.khingtracking.com +dev.dmx.districtm.io +dev.doublepimp.com +dev.drift.com +dev.exacttarget.com +dev.extremereach.com +dev.facebook-ads.adtz.com +dev.flurry.com +dev.fortrader.ru +dev.franklyinc.com +dev.fwci.aws.fwmrm.net +dev.gumgum.com +dev.hitbox.com +dev.irganalytics.com +dev.jivox.com +dev.jwpltx.com +dev.kargo.com +dev.klotski.aws.fwmrm.net +dev.kochava.com +dev.lab.tune.com +dev.linear.aws.fwmrm.net +dev.media.adxpansion.com +dev.mexico.facebook-ads.adtz.com +dev.midasplayer.com +dev.msrv.saastest.appdynamics.com +dev.ngm.franklyinc.com +dev.pardot.com +dev.pfa.gcp.datamind.ru +dev.placed.com +dev.ppe.applicationinsights.microsoft.com +dev.ratingtoplist.com +dev.rubiconproject.com +dev.saastest.appdynamics.com +dev.sfbg.com +dev.sftp.extremereach.com +dev.snapchat.adtz.com +dev.speedcurve.com +dev.stage.us-east-1.kops.kargo.com +dev.static.display.khingtracking.com +dev.static.h-bid.com +dev.tapjoy.com +dev.targetpoint.com +dev.tools.aws.fwmrm.net +dev.trafficforce.com +dev.trial.facebook-ads.adtz.com +dev.ugdturner.com +dev.unir.facebook-ads.adtz.com +dev.us-east-1.kops.kargo.com +dev.us-west-1.kops.kargo.com +dev.us-west-2.kops.kargo.com +dev.visualwebsiteoptimizer.com +dev.vw.aws.fwmrm.net +dev.webapi.gumgum.com +dev.widget.databoxer.mgr.consensu.org +dev.wrathofshadows.net +dev.yottaa.com +dev0.autopilothq.com +dev1.api.content-ad.net +dev1.assasin.siliconorchard.com +dev1.autopilothq.com +dev1.exacttarget.com +dev101.hitbox.com +dev102.hitbox.com +dev103.hitbox.com +dev2.api.content-ad.net +dev2.autopilothq.com +dev2.bitcoin.siliconorchard.com +dev2.dev.linear.aws.fwmrm.net +dev3.api.content-ad.net +dev3.autopilothq.com +devapp.extremereach.com +devappgrant.space +devart.adbureau.net +devconnexity.snowflakeproxy.connexity.net +devdocs.drift.com +devel.adswizz.com +develop.adx1.com +developer-staging.fyber.com +developer.adroll.com +developer.ascend.ai +developer.engagio.com +developer.foresee.com +developer.franklyinc.com +developer.fyber.com +developer.jsecoin.com +developer.marketo.com +developer.mixpanel.com +developer.outbrain.com +developer.pardot.com +developer.qbicblack.com +developer.sharethis.com +developer.swrve.com +developer.test.vilynx.com +developer.vilynx.com +developer.xtify.com +developers.adroll.com +developers.autopilothq.com +developers.curalate.com +developers.dev.getambassador.com +developers.intercom.io +developers.marketo.com +developers.mopub.com +developers.optimizely.com +developers.sharethrough.com +developers.sizmek.com +developers.stage-one.heyzap.com +developers.stage-three.heyzap.com +developers.stage-two.heyzap.com +developers.survata.com +developers.tapjoy.com +developjapan.122.2o7.net +development.adx1.com +developmn.org +develrc-app.optimizely.com +develrc.app.optimizely.com +devfw.imrworldwide.com +devhome.traq.li +deviantart.crwdcntrl.net +device-api.urbanairship.com +device-fingerprintdb-v1.s3.amazonaws.com +device-metrics-us-2.amazon.com +device-metrics-us.amazon.com +device.maxmind.com +device42.svc.insnw.net +devlp1.linkpulse.com +devops-dashboard.mgmt.us-east-1.kops.kargo.com +devops-dashboard.ops.kargo.com +devops-dashboard.prod.paperg.com +devops.adswizz.com +devsecure.eloqua.com +devshed.us.intellitxt.com +devsvn.extremereach.com +devsync.graphly.io +devtest.celebrus.com +devvm.imprev.net +dex.k8s-prod.fiksu.com +dex.k8s-test.fiksu.com +dexdexprod.112.2o7.net +dexim.space +df-azure-ext.newrelic.com +dff7tx5c2qbxc.cloudfront.net +dfp.doubleclick.net +dfp.franklyinc.com +dft.cl.dynad.net +dfw01-nagios01.svc.insnw.net +dfw01-nagios01.vpn.insnw.net +dfw01-nagios02.svc.insnw.net +dfw01-nagios02.vpn.insnw.net +dfw01-nagios03.svc.insnw.net +dfw01-nagios03.vpn.insnw.net +dg.specificclick.net +dgag.112.2o7.net +dgit.com +dgm2.com +dgmaustralia.com +dhauzja511.co.cc +di-banner-se.c.richmetrics.com +di-se.c.richmetrics.com +di.rlcdn.com +di1.shopping.com +dialerporn.com +dialin.adx1.com +dialin.exacttarget.com +dialin.exponential.com +dialin.maxpoint.com +dialin.thunderhead.com +dianepiette.co.uk +dianomi.com +diaocsg.vn +diapi.webgains.com +diaporamaalacon.free.fr +diarioaconcagua.com +diaryofabloodray.blogspot.com +diaryofagameaddict.com +diaryofapeepshowgirl.blogspot.com +diazepam.ourtablets.com +diazepam.razma.net +diazepam.shengen.ru +dicallidesign.com.br +dichvuvesinhhanoi.com +dick-suckers.nu +dickersons.net +dickheadshit.com +dicksland.com +dicksluts.com +dickssportinggoods.com +dicksuckingbitch.com +dickwhacker.com +dicky.pl +diddland.free.fr +didnkinrab.com +didrex.1.p2l.info +didtal.com +didtheyreadit.com +didyou.info +dieanwaelte.de +diebold-schausteller.de +diego-fc.com +diegolopezcastan.com +diendanpokemon.com +dientumotcuocgoi.com +dieschnitter.de +diesel-parts28.ru +dieselbucks.com +dieselvehicles.com +dieswaene.com +diet-pills.hut1.ru +dieta-personalna.pl +diethealthresource4u.com +dietoftoday.ca.pn +dietpersonalized.com +dietpharmacyrx.net +dietsinreview.us.intellitxt.com +dietstars.pro +dieutribenhkhop.com +diewaescherei.de +diff.smartadserver.com +diff1.smartadserver.com +diff2.smartadserver.com +diff3.smartadserver.com +diff4.smartadserver.com +diff5.smartadserver.com +differentdesk.com +digest-project.ru +digg.analytics.live.com +digger.cryptobara.com +digi-box.com +digiaquascr.com +digiguia.com +digikulture-d.openx.net +digima.fi +digimart.info +digimonporn.com +diginet.112.2o7.net +diginetlt.hit.gemius.pl +digiquads.com +digisexxx.com +digistats.westjet.com +digit-life.uk.intellitxt.com +digital-ads.s3.amazonaws.com +digital-cable-descrambler.planet-high-heels.com +digital-menu.com +digital-sale.su +digital-world.de.intellitxt.com +digital.extremereach.com +digital.returnpath.com +digital4adro.hit.gemius.pl +digital4ro.adocean.pl +digitalageventures.com +digitaldsp.com +digitalfaq.com +digitalfirst-d.openx.net +digitalhome.us.intellitxt.com +digitalhomediscountptyltd.122.2o7.net +digitallyours.com +digitalmarketer3799.truconversion.com +digitalmarketing01.com +digitalmediaonline.us.intellitxt.com +digitalmediawire.us.intellitxt.com +digitalmerkat.com +digitalmonestary.com +digitalremedy.com +digitalsupersite.com +digitaltrends-d.openx.net +digitaltrends.us.intellitxt.com +digitrust.mgr.consensu.org +digsinfo.com +digxmr.com +diktatstarten.de +dilara.at +dildo.adultnet.in +dildobabes.net +dildobingo.com +dildodelers.nl +dildofotzen.net +dildofreaks.com +dildogeil.blog-paradijs.com +dildohomeparty.dk +dildosex.dk +dildosex.se +dildoteens.nl +dillards.112.2o7.net +dilogflow.com +dimaria.alphonso.tv +dimarsbg.com +dimenal.com.br +dimensionnail.ro +dimeprice.com +diminishedvalueoforegon.com +dimitraservice.info +dimkino.ru +dimsnetwork.com +dinajewel.dk +dinamik.az +dinastycoin.crypto-webminer.com +dingentis.com +dinhon.com +dinkolove.ya.ru +dinoadserver1.roka.net +dinoadserver2.roka.net +dinsalgsvagt.adservinginternational.com +dinternet.org +dinvej.dk +diosadelsexo.com +diosasclub.cl +diph.ru +diplomz.ru +diply-d.openx.net +dippitydome.com +dipstar.org +dir.opank.com +dir.yottaa.com +diramio.org +dirbg.hit.gemius.pl +direct-xxx-access.com +direct.ad.cpe.dotomi.com +direct.adx1.com +direct.cpufan.club +direct.maxpoint.com +directaclick.com +directads.mcafee.com +directhackerz.tk +directivepub.com +directleads.com +director.adcolony.com +director.maxpoint.com +directory.office.yext.com +directorym.com +directpowerrewards.com +directprimal.com +directrev.cloudapp.net +directtrack.com +directtv.tt.omtrdc.net +directxex.com +dirtyje.ws +dirtyrhino.com +dirtytalk101com.skimlinks.com +dis.as.criteo.com +dis.criteo.com +dis.d1.sc.omtrdc.net +dis.eu.criteo.com +dis.jp.as.criteo.com +dis.ny.us.criteo.com +dis.sv.us.criteo.com +dis.us.criteo.com +disable-uac.com +disccglobal.112.2o7.net +disccstats.112.2o7.net +discfile.pl +dischannel.112.2o7.net +disco.flashbannernow.com +discount-savings-more.com +discountclick.com +discourse.amplitude.com +discourse.vpn.mediavine.com +discover.buysellads.com +discover.kampyle.com +discover.mixpanel.com +discover.outbrain.com +discovercard.112.2o7.net +discoverdemo.com +discoverecommerce.tt.omtrdc.net +discovery.maxpoint.com +discovery.outbrain.com +discreetfield.com +discuss.appsflyer.com +discuss.newrelic.com +discussions.returnpath.com +dishdigital.sp1.convertro.com +dishpurchasingcorporation.hb-api.omtrdc.net +diskager.com +disneyinternational.hb.omtrdc.net +dispatch.admixer.co.kr +dispatcher.oewabox.at +dispensablestranger.com +dispenser-rtb.sape.ru +display.bfmio.com +display.digitalriver.com +display.gestionpub.com +display.khingtracking.com +display.provenpixel.com +displayadsmedia.com +disqus.rtb.adx1.com +disqusads.com +dist.belnk.com +dist.sekindo.com +dist42.shopcurbside.com +distillery.wistia.com +distractify-d.openx.net +distribuidoraderetentores.com.br +districtm.ca +districtm.io +districtm.net +distrilamadrid.com.ar +divavillage.advertserve.com +diveschool.engagio.com +divine.lunarbreeze.com +divisioncore.com +divx.112.2o7.net +divx.adbureau.net +divx.it +dixonscouk.112.2o7.net +dixonslnkcouk.112.2o7.net +diyfood.us.intellitxt.com +dizzcloud.com +djbanners.deadjournal.com +djeps.popunder.ru +djfhwosjck.bid +djsitepro.com +djsrp.com +djstools.com +djugoogs.com +djwnatural.go2cloud.org +dk-gmtdmp.mookie1.com +dk-sex.dk +dk-tonstudio.de +dk.adserver.yahoo.com +dk.gmads.net +dk1.siteimprove.com +dk4ywix.com +dkb01.webtrekk.net +dkbscuba.com +dkfslkqd.netikh.cdn.streamrail.net +dkhl.de +dkspqpprnsmmte.com +dktr.ru +dkvorota.ru +dl-plugin.com +dl.bestofupload.info +dl.downf468.com +dl.gameplaylabs.com +dl.heima8.com +dl.inmobi.com +dl.keywordstrategy.org +dl.liteflashedgemain.bid +dl.microsword.net +dl.ncbuy.com +dl.neodownload.webcam +dl.newflashenter.review +dl.provesoftware.review +dl01.faddmr.com +dl1blu.de +dl1d2m8ri9v3j.cloudfront.net +dlagier.com +dle-news.pw +dlldlldll.sytes.net +dlmag.us.intellitxt.com +dlmyfile.com +dlruifeng.com +dls.newplayerupdate.com +dls.nicdls.com +dlvr.readserver.net +dlya-android.org +dm.demdex.net +dm.mlstat.com +dm.travelocity.com +dm257.mparticle.com +dmc1acwvwny3.cloudfront.net +dmcontactmanagement.122.2o7.net +dmdamedia.hu +dmeserv.newsinc.com +dmg.crypto.csgocpu.com +dmitrievskiy.ru +dmn2.bjpeu.edu.cn +dmp-pixel.aolp-prd.public.aol.com +dmp-qai-pixel.advertising.com +dmp.adform.net +dmp.gravity4.com +dmp.theadex.com +dmp.tidaltv.com +dmp.vihub.ru +dmpm.ru +dmpxs.com +dmr.tw +dms-sw.ru +dms.netmng.com +dmtracker.com +dmtracking.alibaba.com +dmtracking2.alibaba.com +dmvguidecom.112.2o7.net +dmws.truconversion.com +dmx-dev.districtm.ca +dmx-docs.districtm.net +dmx.districtm.ca +dmx.districtm.io +dmx.tk.to +dn.adzerver.com +dn.c.richmetrics.com +dna1.mookie1.com +dna2.mookie1.com +dna3.mookie1.com +dnads.directnic.com +dnaturel.free.fr +dnepr-avtospar.com.ua +dnepropetrovsk.mistr-x.org +dneprsvet.com.ua +dnetshelter3.d.chango.com +dni.agcdn.com +dnizbiotrue.pl +dnjq.com +dnps.com +dnps.us.intellitxt.com +dns.automatad.com +dns.lc.wix.com +dns1.alestra.net.mx +dns2.alestra.net.mx +dns2.net1.it +dns3.alestra.net.mx +dnse.linkpulse.com +dnt.allinviews.com +dnt.beeviewd.com +dnt.bestcontentonline.com +dnt.installfarm.com +dnt.placeyourview.com +dnt.shoofle.tv +do-not-tracker.org +do-porn-stars.fastredirect.com +do-wn-lo-ad.com +do.whoisvisiting.com +do69ifsly4.me +doaware.com +dobre-programy.pl +dobre-programy.xyz +dobreprogramy.pro +doc.longbeierfs.cn +doc.talent.extremereach.com +doccu.000webhostapp.com +docdrive.info +docfetish.com +docfind.oewabox.at +dock.inmobi.com +docker-registry.adswizz.com +docker.adsrvr.org +docker.adwyze.com +docker.jfrog-poc.nj1.yext.com +docker.jfrog-poc.office.yext.com +docker.jfrog-poc.tx1.yext.com +docker.mktoweb.com +docksalmon.com +docloudy.com +docorstv.com +docs-dev.newrelic.com +docs-ra.newrelic.com +docs-staging.newrelic.com +docs.adwyze.com +docs.adx1.com +docs.agkn.com +docs.autopilothq.com +docs.developers.optimizely.com +docs.drift.com +docs.graphly.io +docs.inlocomedia.com +docs.intercom.io +docs.metrics.readme.io +docs.msas.media.net +docs.newrelic.com +docs.rollbar.com +docs.staging.wootric.com +docs.talent.extremereach.com +docs.trackjs.com +docs.urbanairship.com +docs.wootric.com +docs1.iwon.com +docs4all.com +docstoc.com +doctor-alex.com +doctorbon.ru +doctorbr.com +doctorbra.com +doctoror.ru +doctorpear.com +doctorsassociatesrx.112.2o7.net +doctorshe.com +doctorswe.com +doctorzing.com +documensllll.square7.ch +document-via-google-doc.bottlerockethq.com +documentation.appboy.com +documentation.backtrace.io +documentation.linode-nj1.backtrace.io +documentational.000webhostapp.com +documents-signature.com +documents.intermedhx.com +doda.redirectme.net +dodgedartsweepstakes.com +dodian.site50.net +dodoctors.com +dodostats.com +dodyexportwear.com +doeco.ru +doesok.top +dofeb.frenchgerlemanelectric.com +dofinancovani-vyukajazyku.cz +dofinansowania-jezykowe.pl +dog.ca +dogbreedspicture.net +dogcommerce.com +dogconnection.nu +dogexplosion.nu +doggystylepix.com +dogpial.com +dogpile.112.2o7.net +dogpoile.com +dogslesson.nu +doheth.co.uk +doingfine.net +doisamaisv.com.br +dojave-united.com +dojki-hd.com +dojoomla.com +dojx47ab4dyxi.cloudfront.net +dokfilms.net +doktester.orgfree.com +doktoronline.no +dokumentalkino.net +doladowania-telefonu.pl +doladowanie50pln.ujm.pl +doladowanieplus24.pl +doladujfona.net +doladujfona.org +dolar1.com +dolbak.com +dolite.com +dollania.ro +dollarrentcar.com +dollars-worldwide.com +dollarsluts.com +dollchick.com +dollyteens.nu +domain-submit.info +domain.webkeyit.com +domain2008.com +domainanalyzing.xyz +domainfwd.com +domainfwding.com +domaining.in +domainpark.sitelutions.com +domainplayersclub.com +domains.googlesyndication.com +domainsponsor.com +domainsteam.de +domdex.com +domini.cat +dominionenterprises.112.2o7.net +domino-s.ru +dominterior.org +domkultury.pl +domniespodzianek.com +domowysprzet.pl +domwpm.stream +donate.cpufan.club +donate.crypto-webminer.com +donbid.net +donerotik.de +donna7753191.ru +donnemature.org +donnez-votre-avis.org +donotwatch.org +donovan.alphonso.tv +donporni.de +dontblock.net +dontmakemethink.truconversion.com +dontwatch.us +donval.112.2o7.net +donvito.unas.cz +doo-interactive.com +doodle.oewabox.at +dookie.biz +doollli.erotic-place.org +doom-reborn.de +doorman.msas.media.net +doors.co.kr +dopasx.co.be +dope.ops.inmobi.com +dorki.info +dormaescort.com +dormantbankaccounts.com +dorminymedical.net +dornier-verlage.de +dorratex.tn +dortoirdesfilles.com +dos.velek.com +doska-vsem.ru +dostavka-v-krym.com +dostavka-v-ukrainu.ru +dosug-lux.ru +dosugcz.biz +dosugrostov.site +dosuperbeet.com +dot.wp.pl +dotacja-dolnoslaskie.pl +dotacja-lubelskie.pl +dotacja-lubuskie.pl +dotacje-kujawsko-pomorskie.pl +dotacje-lodzkie.pl +dotacje-malopolskie.pl +dotacje-mazowieckie.pl +dotacje-opolskie.pl +dotacje-podkarpackie.pl +dotacje-podlaskie.pl +dotacje-pomorskie.pl +dotacje-slaskie.pl +dotacje-swietokrzyskie.pl +dotacje-warminsko-mazurskie.pl +dotacje-wielkopolskie.pl +dotacje-zachodniopomorskie.pl +dotcomsecrets.com +dotnet.endai.com +dotomi.com +dotster.112.2o7.net +dotsterdomaincom.112.2o7.net +dotsterdotsteraug08.112.2o7.net +dotzup.com +doubleclick.com +doubleclick.de +doubleclick.ne.jp +doubleclick.net +doubleclick.rtb.adx1.com +doubleclick1.xyz +doubleclick2.xyz +doubleclick3.xyz +doubleclick4.xyz +doubleclick5.xyz +doubleclick6.xyz +doubleentered.com +doublepimp.com +doubleviking.us.intellitxt.com +doubleyourdating.directtrack.com +doubtfulrainstorm.com +doudounecanadagoosefemme.fr +doughlane.000webhostapp.com +douglas01.webtrekk.net +dougmlee.com +dove.saymedia.com +dowayhome.com +dowdenphotography.com +dowelsobject.com +dowjones.122.2o7.net +down.adx1.com +down.feiyang163.com +down.guangsu.cn +down.mykings.pw +down.unadnet.com.cn +down1.upanfile.com +down1oads.com +down2.feiyang163.com +down3.feiyang163.com +downads.com +downbepo.hostami.me +downbiefred.hostami.me +downblouse.tv +downgebud.hostami.me +downglener.hostami.me +downhelpcas.hostami.me +download-24.pl +download-24.tk +download-archiver.ru +download-bb.com +download-ez.com +download.247realmedia.com +download.56.com +download.abetterinternet.com +download.ascentive.com +download.bargain-buddy.net +download.browseraccelerator.com +download.cdn.sharelive.net +download.cdn.torchbrowser.com +download.dev.extremereach.com +download.extremereach.com +download.filmfanatic.com +download.fyxm.net +download.getitfastdownload.com +download.grandcloud.cn +download.hitbox.com +download.inboxace.com +download.realtimegaming.com +download.torchbrowser.com +download.ttrili.com +download.weatherblink.com +download.wholestuff.win +download.yesmessenger.com +download.ytdownloader.com +download2.marketengines.com +download207.mediafire.com +download32.us.intellitxt.com +downloadamigo.com +downloadapps.tech +downloadasianporn.com +downloadblackberry.com +downloadcdn.com +downloadcollegegirls.com +downloadcumshotvideos.com +downloaddy.net +downloaded.adeforsa.pl +downloadeer.net +downloadfile.eu +downloadfiles.pl +downloadfreepsvitagames.com +downloadhardcoreporn.com +downloaditalia.it +downloadju.com +downloadkakaotalk.com +downloadmefiranaratb1972.xpg.com.br +downloadmpplayer.com +downloadnet1048.com +downloadplayer.xyz +downloadporn.biz +downloads-finereader.ru +downloads-mobile.com +downloads-whatsapp.com +downloads.adx1.com +downloads.larivieracasino.com +downloads.mytvandmovies.com +downloads.pcsecurityshield.com +downloadtuesday.com +downloaduj.pl +downloadupload.com +downloadwarez.org +downloadz.us +downlobsmar.hostami.me +downrocu.hostami.me +downstorfi.hostami.me +downtane.hostami.me +downtiocan.hostami.me +downvientit.hostami.me +downviovi.hostami.me +dp-medien.eu +dp.bidswitch.net +dp.g.doubleclick.net +dp.specificclick.net +dp.yieldmanager.net +dp1.33across.com +dp2.specificclick.net +dpa.dc6.eloqua.com +dpa.tor6.eloqua.com +dpbolvw.net +dpm.demdex.net +dpu.yottaa.com +dq95d35.com +dqs001.adtech.de +dqs001.adtech.fr +dqs001.adtech.us +dqxaszsk.angelcities.com +dr.adservinginternational.com +dr.newrelic.com +dr.soso.com +dra-eu.amazon-adsystem.com +dra.amazon-adsystem.com +dra.iesnare.com +drabsize.com +dragonflym.com +dragzebra.com +drahtlosunterwegs.de +drainsninvx.square7.ch +drank.fa779.com +drawbrid.ge +drawgreat.com +drbedidentocare.com +drc-group.net +drcutrapalis.orge.pl +drdae.biz +drdavidlinks.net.au +drdobbs.us.intellitxt.com +dream-x.net +dreamad.org +dreamboys.nu +dreamerblue.info +dreameronline.de +dreamgals.net +dreamgirls.nu +dreamgirls.pandela.org +dreamhome.112.2o7.net +dreamittolife.com +dreammates.112.2o7.net +dreamoutloud.biz +dreamplay.movies01.hop.clickbank.net +dreams-island.com +dreamsexe.com +dreamville.lisnr.com +dreamwear.org +dreamwhistlerz.com +dreamyat.com +drei.oewabox.at +drewbarrymore.ca.tt +drift.com +driftt.com +drive.videoclick.ru +driverguide.us.intellitxt.com +drivotracker.com +drizzydrake.us.intellitxt.com +drmcmm.baidu.com +drone-ci.videoamp.com +drone.districtm.io +drone.dmx.districtm.io +dronml.ml +dropkick.oewabox.at +dropped.adx1.com +dropped.xml.adx1.com +drowle.com +drrt.h18.ru +drs2.veinteractive.com +drug-online.petrovka.info +drug-testing.shengen.ru +drugdetox.shengen.ru +drugscom.us.intellitxt.com +druid-broker.flurry.com +drumcash.com +drunkenstepfather.com +drupalupdates.tk +drvpn.thunderhead.com +drydrum.com +ds-aksb-a.akamaihd.net +ds-ll.serving-sys.com +ds-ui-mockups.dev.gumgum.com +ds.247realmedia.com +ds.advg.jp +ds.amateurmatch.com +ds.contextweb.com +ds.cybereps.com +ds.eyeblaster.com +ds.ign.us.intellitxt.com +ds.keshet-i.com +ds.metric.gstatic.com +ds.midasplayer.com +ds.onet.pl +ds.serving-sys.com +ds12.pl +ds2.contextweb.com +dserver.hw.net +dsnextgen.com +dsp-bidder-dev.demandbase.com +dsp-dev.demandbase.com +dsp-pixel.contextweb.com +dsp-preprod.inmobi.com +dsp-prod.demandbase.com +dsp-stg.demandbase.com +dsp.adfarm1.adition.com +dsp.adkernel.com +dsp.analyticson.com +dsp.demandbase.com +dsp.epom.com +dsp.face2trade.com +dsp.franklyinc.com +dsp.inmobi.com +dsp.io +dsp.smaato.net +dsp.videostat.com +dsp.xapads.com +dsparking.com +dspbuilder.rubiconproject.com +dsr.livefyre.com +dsr.qa-ext.livefyre.com +dsr.t402.livefyre.com +dsum-sec.casalemedia.com +dsum.casalemedia.com +dsys1.franklyinc.com +dt-cdn.net +dt.admission.net +dt.adsafeprotected.com +dt.linkpulse.com +dt.scanscout.com +dtm.advertising.com +dts.innovid.com +dts.startappservice.com +dtscout.rtb.adx1.com +dtta.ero-advertising.com +dua1.franklyinc.com +dualvaccine.com +dub-dc01.marketo.net +dub-dc02.marketo.net +dub.mobileads.msn.com +dubstep.onedumb.com +dubvpn.marketo.com +dujur.barginginfrance.net +duluthtrading.tt.omtrdc.net +dummy.112.2o7.net +dummysan1.247realmedia.com +dummysan2.247realmedia.com +dummysan3.247realmedia.com +dunandbradstreet.122.2o7.net +duplicatefilecleaner.com +dv-fw-a-nat.iovation.com +dvdhentai.net +dvdmanager-203.sv2.biz +dvrlists.com +dvsdfssffsssd.markeysgallery.com +dvzwh.voluumtrk.com +dw.lp.eu.emobi-sys.com +dwbnqhdfkvvybjw.usa.cc +dwclick.com +dwh-tracking.it.auth0.com +dwjobs.com +dwnlad.ws +dwnld.bonuspromooffer.com +dws.reporting.dnitv.com +dwtracking.sdo.com +dx.steelhousemedia.com +dxedge-prod-lb-946522505.us-east-1.elb.amazonaws.com +dxmhkisurxxxhm.ru +dy.admerize.be +dy.adserve.io +dy.testnet.nl +dy12.info +dyhh.com +dyn-beacon.akamaized.net +dyn.emetriq.de +dyn.loolav.space +dyn.naiadsystems.com +dyn.omnitagjs.com +dynad.website.bg +dynamic-template-engine.prod.paperg.com +dynamic-template-engine.production.paperg.com +dynamic-template-engine.staging.paperg.com +dynamic.adcrowd.com +dynamic.advertising.com +dynamic.aol.com +dynamic.cannedbanners.com +dynamic.exaccess.ru +dynamic.fmpub.net +dynamic1.anandtech.com +dynamic1.dailytech.com +dynamic2.anandtech.com +dynamicyield.com +dyntraq.mtree.com +dyntrk.com +dynya-may.github.io +dyode.dynamicyield.com +dyode.use.dynamicyield.com +dz.optimizely.com +dz1vmszs6rjp8.cloudfront.net +dz2fz0bgyq9tn.cloudfront.net +dzc-metrics.mzstatic.com +dzizsih.ru +dzl.baidu.com +dzxcq.com +dzzrenjanin.rs +e-2dj6wfk4ehd5afq.stats.esomniture.com +e-2dj6wfk4ggdzkbo.stats.esomniture.com +e-2dj6wfk4gkcpiep.stats.esomniture.com +e-2dj6wfk4skdpogo.stats.esomniture.com +e-2dj6wfkiakdjgcp.stats.esomniture.com +e-2dj6wfkiepczoeo.stats.esomniture.com +e-2dj6wfkikjd5glq.stats.esomniture.com +e-2dj6wfkiokc5odp.stats.esomniture.com +e-2dj6wfkiqjcpifp.stats.esomniture.com +e-2dj6wfkocjczedo.stats.esomniture.com +e-2dj6wfkokjajseq.stats.esomniture.com +e-2dj6wfkowkdjokp.stats.esomniture.com +e-2dj6wfkykpazskq.stats.esomniture.com +e-2dj6wflicocjklo.stats.esomniture.com +e-2dj6wfligpd5iap.stats.esomniture.com +e-2dj6wflikgdpodo.stats.esomniture.com +e-2dj6wflikiajslo.stats.esomniture.com +e-2dj6wflioldzoco.stats.esomniture.com +e-2dj6wfliwpczolp.stats.esomniture.com +e-2dj6wfloenczmkq.stats.esomniture.com +e-2dj6wflokmajedo.stats.esomniture.com +e-2dj6wfloqgc5mho.stats.esomniture.com +e-2dj6wfmysgdzobo.stats.esomniture.com +e-2dj6wgkigpcjedo.stats.esomniture.com +e-2dj6wgkisnd5abo.stats.esomniture.com +e-2dj6wgkoandzieq.stats.esomniture.com +e-2dj6wgkycpcpsgq.stats.esomniture.com +e-2dj6wgkyepajmeo.stats.esomniture.com +e-2dj6wgkyknd5sko.stats.esomniture.com +e-2dj6wgkyomdpalp.stats.esomniture.com +e-2dj6whkiandzkko.stats.esomniture.com +e-2dj6whkiepd5iho.stats.esomniture.com +e-2dj6whkiwjdjwhq.stats.esomniture.com +e-2dj6wjk4amd5mfp.stats.esomniture.com +e-2dj6wjk4kkcjalp.stats.esomniture.com +e-2dj6wjk4ukazebo.stats.esomniture.com +e-2dj6wjkosodpmaq.stats.esomniture.com +e-2dj6wjkouhd5eao.stats.esomniture.com +e-2dj6wjkowhd5ggo.stats.esomniture.com +e-2dj6wjkowjajcbo.stats.esomniture.com +e-2dj6wjkyandpogq.stats.esomniture.com +e-2dj6wjkycpdzckp.stats.esomniture.com +e-2dj6wjkyqmdzcgo.stats.esomniture.com +e-2dj6wjkysndzigp.stats.esomniture.com +e-2dj6wjl4qhd5kdo.stats.esomniture.com +e-2dj6wjlichdjoep.stats.esomniture.com +e-2dj6wjliehcjglp.stats.esomniture.com +e-2dj6wjlignajgaq.stats.esomniture.com +e-2dj6wjloagc5oco.stats.esomniture.com +e-2dj6wjlougazmao.stats.esomniture.com +e-2dj6wjlyamdpogo.stats.esomniture.com +e-2dj6wjlyckcpelq.stats.esomniture.com +e-2dj6wjlyeodjkcq.stats.esomniture.com +e-2dj6wjlygkd5ecq.stats.esomniture.com +e-2dj6wjmiekc5olo.stats.esomniture.com +e-2dj6wjmyehd5mfo.stats.esomniture.com +e-2dj6wjmyooczoeo.stats.esomniture.com +e-2dj6wjny-1idzkh.stats.esomniture.com +e-2dj6wjnyagcpkko.stats.esomniture.com +e-2dj6wjnyeocpcdo.stats.esomniture.com +e-2dj6wjnygidjskq.stats.esomniture.com +e-2dj6wjnyqkajabp.stats.esomniture.com +e-adimages.scrippsnetworks.com +e-ads.eqads.com +e-bannerx.com +e-cda.pl +e-debtconsolidation.com +e-dot.hut1.ru +e-hosting.hut1.ru +e-hpaces.ero-advertising.com +e-kasa.w8w.pl +e-ltvp.inmobi.com +e-m.fr +e-marketing.entelchile.net +e-matelco.com +e-n-t-e-r-n-e-x.com +e-n.y-1shz2prbmdj6wvny-1sez2pra2dj6wjmyepdzadpwudj6x9ny-1seq-2-2.stats.esomniture.com +e-netshoes.com +e-ny.a-1shz2prbmdj6wvny-1sez2pra2dj6wjny-1jcpgbowsdj6x9ny-1seq-2-2.stats.esomniture.com +e-planning.net +e-sextoys.fr +e-ssl.apsalar.com +e-zeitung.de +e-zshopper.activeshopper.com +e.abnad.net +e.ad.xiaomi.com +e.admob.com +e.adpower.bg +e.adx1.com +e.analytics.yahoo.com +e.as-eu.falkag.net +e.baidu.com +e.cquotient.com +e.crashlytics.com +e.dtscout.com +e.freewebhostingarea.com +e.invodo.com +e.kde.cz +e.maxtraffic.com +e.monetate.net +e.nexac.com +e.nspmotion.com +e.redbox.com +e.sexad.net +e.targetfuel.com +e.thanksearch.com +e.thirdpresence.com +e.yieldmanager.net +e.zeroredirect.com +e.zeroredirect2.com +e0.extreme-dm.com +e0mn.com +e1.addthis.com +e1.cdn.qnsr.com +e1.extreme-dm.com +e1.static.hoptopboy.com +e1.zedo.com +e100.yt.srs.doubleverify.com +e101.yt.srs.doubleverify.com +e102.yt.srs.doubleverify.com +e103.yt.srs.doubleverify.com +e104.yt.srs.doubleverify.com +e105.yt.srs.doubleverify.com +e106.yt.srs.doubleverify.com +e107.yt.srs.doubleverify.com +e108.yt.srs.doubleverify.com +e109.yt.srs.doubleverify.com +e110.yt.srs.doubleverify.com +e111.yt.srs.doubleverify.com +e112.yt.srs.doubleverify.com +e1i1t0updui0iqf.cc +e1r.net +e2.cdn.qnsr.com +e2.emediate.se +e2.extreme-dm.com +e2.molbuk.ua +e2.thirdpresence.com +e2.zedo.com +e24dp.tns-cs.net +e2b48.static-ex.epom.com +e2b8u3v8.map2.ssl.hwcdn.net +e2ecredentials.dev.pardot.com +e3.adpushup.com +e3.thirdpresence.com +e35fbf.t.axf8.net +e3f364.r.axf8.net +e4porn.com +e5a87pq.com +e705.net +e77c.com +e89.friendfinder.com +e8999.b.akamaiedge.net +ea-dfw5.exacttarget.com +ea.zebestof.com +eaccnj.org +eachdayisagift.review +ead-soft.popunder.ru +ead.sharethis.com +eadexchange.com +eads-adserving.com +eadsrv.com +eadult.de +eaeacom.112.2o7.net +eagamesuk.112.2o7.net +eagleexteriorsllc.com +eaglemiles.112.2o7.net +eam.pubocean.com +eandsgallery.com +eaplay.ru +eapogocom.112.2o7.net +earl-brown.info +earle2rise.000webhostapp.com +earncoins.club +earningsathome.ru +earnlivingonline.net +earnmygift.com +earnpointsandgifts.com +earthcontrolsys.com +earthequipments.com +earthlink.122.2o7.net +earthlnkpsplive.122.2o7.net +earthquakescarf.com +earthycopy.com +eas-seo.com +eas.almamedia.fi +eas.hitta.se +eas1.emediate.eu +eas2.emediate.eu +eas3.emediate.eu +eas3.emediate.se +eas4.emediate.eu +eas5.emediate.eu +eas8.emediate.eu +ease.su +east-s2s.1rx.io +east.05tz2e9.com +east.aod.extremereach.com +east.aspera.extremereach.com +east.aspera.extremereach.com.extremereach.com +east.cloud.ftp.extremereach.com +east.faspex.aspera.extremereach.com +east.faspex.aspera.extremereach.com.extremereach.com +east.ftp.dev.extremereach.com +east.ftp.extremereach.com +east.prtg.extremereach.com +east.sftp.extremereach.com +east.webftp.dev.extremereach.com +east.webftp.extremereach.com +eastboysex.com +eastmoney.allyes.com +eastsideboxing.us.intellitxt.com +easy-web-stats.com +easy.eu.ai +easyadservice.com +easyadvertonline.com +easyball.de +easydownload.pl +easyhash.io +easyhitcounters.com +easyhits4u.com +easyweb.tdcanadatrust.secureserver.host1.customer-identification-process.b88600d8.com +eatcunt.nu +eatingbosscream.blogspot.com +eatingwell.us.intellitxt.com +eatmyhairypussy.com +eatpaste.com +eatps.web.aol.com +eatpussy.nu +eatw.com +eavo.ru +eazybiz.ng +eb.3lift.com +eb.adbureau.net +eb.dd.bluelinecomputers.be +eb.prout.be +eb.trbas.com +eb2.3lift.com +ebackback.com +ebaumsworld.us.intellitxt.com +ebay.net.ua +ebay1.112.2o7.net +ebayadvertising.com +ebayadvertising.triadretail.net +ebaycn.doubleclick.net +ebayit-dp.nuggad.net +ebaynonreg.112.2o7.net +ebayreg.112.2o7.net +ebayrelevancead.webmasterplan.com +ebaytw.doubleclick.net +ebayus.112.2o7.net +ebcom.112.2o7.net +ebd.cda.pl +ebda-us-east.casalemedia.com +ebda-us-west.casalemedia.com +ebdr2.com +ebdr3.com +ebeautyportal.com +ebertandroeper.com +ebiads.ebiuniverse.com +ebjzz.super-promo.quhu.info +eblastengine.upickem.net +eblock.info +ebm.e.redbox.com +ebnet.info +ebocornac.com +ebonamama.com +ebony-amateur-girls.inhit.com +ebony-fantasy.inhit.com +ebony-hardcore.net +ebony.streamate.com +ebook4all.com.pl +ebookeo.pl +ebooks.localytics.com +ebsdev.cs.rubiconproject.com +ebsdevapex.cs.rubiconproject.com +ebsdr.cs.rubiconproject.com +ebsdrapex.cs.rubiconproject.com +ebsdrdisc.cs.rubiconproject.com +ebsdrdmz.cs.rubiconproject.com +ebsprod.cs.rubiconproject.com +ebsprodapex.cs.rubiconproject.com +ebsproddisc.cs.rubiconproject.com +ebsproddmz.cs.rubiconproject.com +ebstest.cs.rubiconproject.com +ebstestapex.cs.rubiconproject.com +ebsuat.cs.rubiconproject.com +ebsuatapex.cs.rubiconproject.com +ebtcpro.com +ebtmarketing.com +ebui.biz +ebuzzing.com +ec.atdmt.com +ec1-a.thirdpresence.com +ec1.hitbox.com +ec2-13-58-215-234.us-east-2.compute.amazonaws.com +ec2amaz-v34sjct.marketo.com +ec2wc-website04.insnw.net +ecadutaro.yadozalamom.pw +ecanadanow.us.intellitxt.com +ecard4all.com +ecarecosmetics.com +eccdn.yext.com +ecchi.nu +ecdn.firstimpression.io +ecdtrk.com +ece5stats1.theglobeandmail.com +ecess1.cdn.continent8.com +ecestats.theglobeandmail.com +echnaton.ru +echo.teasernet.ru +echoa.randbinternationaltravel.com +echocreativemarketing.com +echurchnetwork.net +ecialde.it +ecigbrandsonreview.com +ecigg.com +ecircle-ag.com +eclean.or.kr +eclick.vn +eclipsedomainservices.com +eclipsepix.com +eclkmpbn.com +eclkmpsa.com +eclkspbn.com +eclkspsa.com +ecoco2.free.fr +ecoelectric.com.pe +ecoencomputer.com +ecoledejauche.be +ecomadserver.com +ecomak.cl +ecomale.com +ecommerce-seo.com +ecommerce.roboinside.me +ecommercepartners.com.au +ecommercetimes.us.intellitxt.com +ecommstats.s3.amazonaws.com +ecomp3.ru +econocamp.com +econom.co +economicpizzas.com +economisttestcollect.insightfirst.com +economymoving.net +econtent.pl +ecookna.com.ua +ecos.e-mailcom.co.uk +ecoslimmer.pro +ecoupons.com +ecov.com.br +ecpmrocks.com +ecs.blismedia.com +ecs.demdex.net +ecs1.engageya.com +ecsaconceptos.com +ectestlampsplus1.112.2o7.net +ecto-stg.flurry.com +eczanecim.net +ed-shop01.ru +ed.at.is13.de +ed.at.thamaster.de +ed16c02e.amy.gs +edaa.eu +edb1.convertro.com +edb2.convertro.com +edb3.convertro.com +edb4.convertro.com +eddamedia.linkpulse.com +eddamedia.tns-cs.net +eddiegirl.com +edelstahlschornstein-123.de +eden-sexe.com +edf.fr.kfskz.com +edge-e-balw.customer.io +edge-va6.demdex.net +edge.analytics.brightedge.com +edge.aperture.displaymarketplace.com +edge.ayboll.com +edge.bnmla.com +edge.metroleads.com +edge.pixel.advertising.com +edge.quantserve.com +edge.reporo.net +edge.simplereach.com +edge2.pixel.advertising.com +edge2.uat.247realmedia.com +edgecdn.bizible.com +edgeio.com +edgeno.de +edgewaterconst.com +edgy-china-cdn-sproutbuilder.inmobi.com +edgy.inmobi.com +edgy.studioservices.inmobi.com +edibrooks.com +ediee.com +edietsmain.112.2o7.net +edipresse.adocean.pl +edipresse.hit.gemius.pl +edirect.hotkeys.com +edit-imprimerie.com +editmedios.com +editor.ascend.ai +editorial.outbrain.com +editoriasa.rda.it +editorsupport.s50.exacttarget.com +edits.mywebsearch.com +edivision.pl +edkl.in +edmedsnow.com +edmunds.112.2o7.net +edmundsinsideline.112.2o7.net +edmyth.com +edosushicresthill.com +edpills.ru +edplsrtjpxamr.bid +edrates.com +edreeams.com +eds.ca.matchbox.maruhub.com +edsa.112.2o7.net +edsa.122.2o7.net +edu-offer.com +edu-q.com +educatemetv.com +education-cz.ru +education-rewardpath.com +education1.free.fr +educationalmail.com +educationmanagementl.tt.omtrdc.net +educationmanagementllc.112.2o7.net +educationtree.com +educing.info +educontest.net +educs.in +edudktabmq.bid +edudocs.net +edukacja2018.pl +edusophia.org +edv-donner.com +edvme.de +edvzz.super-promo.quhu.info +edward.zemanta.com +ee.adocean.pl +ee.connextra.com +ee.hit.gemius.pl +ee0909.com +ee77ee.com +ee93d0dc.ngrok.io +eecky.butlerelectricsupply.com +eedclicks.ero-advertising.com +eedicjfwqhqr.bid +eedsgikkbtn.bid +eega.hit.gemius.pl +eegad.freeservers.com +eegde.adocean.pl +eekro.cruisingsmallship.com +eeliot.free.fr +eelsoup.net +eeme7j.win +eeocadeasettlment.com +eepn.us.intellitxt.com +eepohporrlejon.com +eeps.me +eeroo.frost-electric-supply.com +eetho.cruisingsmallship.com +eeu.pl +ef.enu.kz +efam4.info +efanguide.us.intellitxt.com +efashionsolutions.122.2o7.net +efeeders.com +effectivebrand.com +effectivemeasure.com +effectivemeasure.net +effexor-xr.1.p2l.info +efficaciouscactus.com +efficiencyempregos.com.br +eflbruwqt.ru +efluxmedia.uk.intellitxt.com +eforsa.pl +eforu.com +efreedom.net +eftps.com +efugl.iptvdeals.com +eg1n7.adx1.com +egine.zhengongfupills.com +eglantine.biz +egofiles.pw +egoldenglove.com +egotastic.us.intellitxt.com +egovaleo.it +egraffiti-d.openx.net +egvar.net +egypolice.com +egypolice.net +ehadvicedev.112.2o7.net +ehair4u.com +eharmony.112.2o7.net +eharmony.tt.omtrdc.net +eharmony.us.intellitxt.com +ehealthinsurance.tt.omtrdc.net +ehg-247internet.hitbox.com +ehg-accuweather.hitbox.com +ehg-acdsystems.hitbox.com +ehg-adeptscience.hitbox.com +ehg-affinitynet.hitbox.com +ehg-aha.hitbox.com +ehg-amerix.hitbox.com +ehg-apcc.hitbox.com +ehg-associatenewmedia.hitbox.com +ehg-ati.hitbox.com +ehg-attenza.hitbox.com +ehg-autodesk.hitbox.com +ehg-baa.hitbox.com +ehg-backweb.hitbox.com +ehg-bestbuy.hitbox.com +ehg-bizjournals.hitbox.com +ehg-bmwna.hitbox.com +ehg-boschsiemens.hitbox.com +ehg-bskyb.hitbox.com +ehg-cafepress.hitbox.com +ehg-careerbuilder.hitbox.com +ehg-cbc.hitbox.com +ehg-cbs.hitbox.com +ehg-cbsradio.hitbox.com +ehg-cedarpoint.hitbox.com +ehg-clearchannel.hitbox.com +ehg-closetmaid.hitbox.com +ehg-commjun.hitbox.com +ehg-communityconnect.hitbox.com +ehg-communityconnet.hitbox.com +ehg-comscore.hitbox.com +ehg-corusentertainment.hitbox.com +ehg-coverityinc.hitbox.com +ehg-crain.hitbox.com +ehg-ctv.hitbox.com +ehg-cygnusbm.hitbox.com +ehg-datamonitor.hitbox.com +ehg-dig.hitbox.com +ehg-digg.hitbox.com +ehg-eckounlimited.hitbox.com +ehg-esa.hitbox.com +ehg-espn.hitbox.com +ehg-fifa.hitbox.com +ehg-findlaw.hitbox.com +ehg-foundation.hitbox.com +ehg-foxsports.hitbox.com +ehg-futurepub.hitbox.com +ehg-gamedaily.hitbox.com +ehg-gamespot.hitbox.com +ehg-gatehousemedia.hitbox.com +ehg-gatehoussmedia.hitbox.com +ehg-glam.hitbox.com +ehg-groceryworks.hitbox.com +ehg-groupernetworks.hitbox.com +ehg-guardian.hitbox.com +ehg-hasbro.hitbox.com +ehg-hellodirect.hitbox.com +ehg-himedia.hitbox.com +ehg-hitent.hitbox.com +ehg-hollywood.hitbox.com +ehg-idg.hitbox.com +ehg-idgentertainment.hitbox.com +ehg-ifilm.hitbox.com +ehg-ignitemedia.hitbox.com +ehg-intel.hitbox.com +ehg-ittoolbox.hitbox.com +ehg-itworldcanada.hitbox.com +ehg-kingstontechnology.hitbox.com +ehg-knightridder.hitbox.com +ehg-learningco.hitbox.com +ehg-legonewyorkinc.hitbox.com +ehg-liveperson.hitbox.com +ehg-macpublishingllc.hitbox.com +ehg-macromedia.hitbox.com +ehg-magicalia.hitbox.com +ehg-maplesoft.hitbox.com +ehg-mgnlimited.hitbox.com +ehg-mindshare.hitbox.com +ehg-moma.hitbox.com.112.2o7.net +ehg-mtv.hitbox.com +ehg-mybc.hitbox.com +ehg-newarkinone.hitbox.com.hitbox.com +ehg-newegg.hitbox.com +ehg-newscientist.hitbox.com +ehg-newsinternational.hitbox.com +ehg-nokiafin.hitbox.com +ehg-novell.hitbox.com +ehg-nvidia.hitbox.com +ehg-oreilley.hitbox.com +ehg-oreilly.hitbox.com +ehg-pacifictheatres.hitbox.com +ehg-pennwell.hitbox.com +ehg-peoplesoft.hitbox.com +ehg-philipsvheusen.hitbox.com +ehg-pizzahut.hitbox.com +ehg-playboy.hitbox.com +ehg-presentigsolutions.hitbox.com +ehg-qualcomm.hitbox.com +ehg-quantumcorp.hitbox.com +ehg-randomhouse.hitbox.com +ehg-redherring.hitbox.com +ehg-register.hitbox.com +ehg-researchinmotion.hitbox.com +ehg-rfa.hitbox.com +ehg-rodale.hitbox.com +ehg-salesforce.hitbox.com +ehg-salonmedia.hitbox.com +ehg-samsungusa.hitbox.com +ehg-seca.hitbox.com +ehg-shoppersdrugmart.hitbox.com +ehg-sonybssc.hitbox.com +ehg-sonycomputer.hitbox.com +ehg-sonyelec.hitbox.com +ehg-sonymusic.hitbox.com +ehg-sonyny.hitbox.com +ehg-space.hitbox.com +ehg-sportsline.hitbox.com +ehg-streamload.hitbox.com +ehg-superpages.hitbox.com +ehg-techtarget.hitbox.com +ehg-tfl.hitbox.com +ehg-thefirstchurchchrist.hitbox.com +ehg-tigerdirect.hitbox.com +ehg-tigerdirect2.hitbox.com +ehg-topps.hitbox.com +ehg-tribute.hitbox.com +ehg-tumbleweed.hitbox.com +ehg-ubisoft.hitbox.com +ehg-uniontrib.hitbox.com +ehg-usnewsworldreport.hitbox.com +ehg-verizoncommunications.hitbox.com +ehg-viacom.hitbox.com +ehg-vmware.hitbox.com +ehg-vonage.hitbox.com +ehg-wachovia.hitbox.com +ehg-wacomtechnology.hitbox.com +ehg-warner-brothers.hitbox.com +ehg-wizardsofthecoast.hitbox.com.hitbox.com +ehg-womanswallstreet.hitbox.com +ehg-wss.hitbox.com +ehg-xxolympicwintergames.hitbox.com +ehg-yellowpages.hitbox.com +ehg-youtube.hitbox.com +ehg.commjun.hitbox.com +ehg.fedex.com +ehg.hitbox.com +ehg.mindshare.hitbox.com +ehnova.com.br +ehomeupgrade.us.intellitxt.com +ehow.us.intellitxt.com +ehui.info +ei.imbucurator-de-prost.com +ei.rlcdn.com +eighteeny.com +eireloom.com +eisenstein.dk +eitbglobal.ojdinteractiva.com +eiv.baidu.com +eixst.ru +ejacs.be.tc +ejaculateur.com +ejaculation69.com +ejaculationfemininex.com +ejs.hitbox.com +ejyymghi.com +ekmas.com +ekstrafilmy24.pl +ektatest.marketo.com +el2.convertkit.com +elasticchange.com +elastikube.vungle.com +elderlyscissors.com +elderlytown.com +eleconomista.d1.sc.omtrdc.net +electosake.com +electroneum.crypto-webminer.com +electroneum.hashvault.pro +electroneum.monerise.com +electronicarts.112.2o7.net +electronics-bonuspath.com +electronics-offer.net +electronics-rewardpath.com +electronicspresent.com +electronista.us.intellitxt.com +elektir.ru +elektrischeziga.livejournal.com +elektrischezigarette1.blog.pl +elektrischezigarette1.onsugar.com +elektrischezigarette2.devhub.com +elektrischezigarette2.onsugar.com +elektrischezigarettekaufen2.cowblog.fr +elektrischezigaretten2.beeplog.com +elektroheizung-direkt.de +elektromax-serwis.pl +elektronischezi.livejournal.com +elektronischezigarette2.mex.tl +elektronischezigarettekaufen1.beeplog.com +elektronischezigarettekaufen1.myblog.de +elektronischezigarettekaufen2.tumblr.com +elektrozigarette1.dreamwidth.org +elektrozigarette2.webs.com +elektrozigarettekaufen1.devhub.com +elephantqueue.com +elevateoperations.com +elew72isst.rr.nu +elidelcream.weebly.com +eliehabib.com +eliga88.com +eligibility.wootric.com +elile.ru +elimax.theappgrader.com +elimbi.com +elisakerr.com +elison.co.ke +elite-crack.ml +elite-sex-finders.com +elite.sextracker.com +elitedaily-d.openx.net +elitediplom.de +elitedollars.com +elitegfs.com +elitepcgames.com +eliteplatinum.com +eliteporngalleries.com +elitepornportal.com +elitepornzone.com +elitesnews.com +elitetoplist.com +elixmedia.com +elkjop.112.2o7.net +elliman.devvm.imprev.net +elliman.imprev.net +elliman.qa-dest.imprev.net +elliman.qa.imprev.net +elliman.staging.imprev.net +elliman.testcluster.imprev.net +elmissouri.fr +elocumjobs.com +eloqua.122.2o7.net +eloqua.com +elthamely.com +eluniversalmx.sc.omtrdc.net +elv3-tslogging.touchcommerce.com +em.dynamicyield.com +email-reflex.com +email.advertisingbox.com +email.bizible.com +email.branch.io +email.exacttarget.com +email.livefyre.com +email.optimizely.com +email.piwik.pro +email.placed.com +email.positionly.com +email.returnpath.com +email.tenjin.com +email.urbaninsight.com +email.videoamp.com +email.vizury.com +email00.com +emailadvantagegroup.com +emailchallenge.returnpath.com +emailmarketingguide.wix.com +emailproductreview.com +emapadserver.com +emarketer.com +emaxhealth.us.intellitxt.com +embed-stats.rbl.ms +embed.insticator.com +embed.sendtonews.com +embedded.demo.pardot.com +emc.122.2o7.net +emea-bidder.mathtag.com +emea.mxptint.net +emea.rel.msn.com +emediate.dk +emediate.eu +emenabrandsummit.exponential.com +emerse.com +eminemticket.freespaces.com +emisja.adsearch.pl +emisja.contentstream.pl +emisjawidgeet.onet.pl +emits.iptvdeals.com +emobi-sys.com +employ22.112.2o7.net +employ26.112.2o7.net +employee.siliconorchard.com +employment.112.2o7.net +emrlogistics.com +ems2bmen.com +en-studiotraining.inmobi.com +en-videos.com +en.cookiescript.info +en.crypto-webminer.com +en.dd.blueline.be +en.likefever.org +en.pymed.com.cn +en.ultrex.ru +en25.com +enatimedia.com +enbutique.com +encoding.ovh +encouragingwilderness.com +encrypt.branch.io +encyclocentral.us.intellitxt.com +end.scorecardresearch.com +endurableshop.com +energy-ua.com +energydiet24.ru +energysavingproductsinfo.com +enerweb.oewabox.at +enfys.me.uk +eng.appdynamics.com +eng.findadvertise.com +eng.localytics.com +eng.tapjoy.com +eng.trkcnv.com +engage.ascend.ai +engage.everyone.net +engage.exponential.com +engage.marketo.com +engage.speedera.net +engage0.silverpop.com +engage1.silverpop.com +engage2.advanstar.com +engage2.silverpop.com +engage3.silverpop.com +engage4.silverpop.com +engage5.silverpop.com +engage6.silverpop.com +engage7.silverpop.com +engage8.silverpop.com +engage9.silverpop.com +engager.tmg.nl +engagio.com +engblog.mixpanel.com +engblog.yext.com +engel69.de +engelfire.com +engenhoweb.com.br +engg.appdynamics.com +engine-dsa.fyber.com +engine.4chan-ads.org +engine.4dsply.com +engine.adbooth.com +engine.adclick.lv +engine.adglare.net +engine.adland.ru +engine.adspynet.com +engine.adsupply.com +engine.adzerk.net +engine.bitmedianetwork.com +engine.carbonads.com +engine.cmmeglobal.com +engine.espace.netavenir.com +engine.fyber.com +engine.goodadvert.ru +engine.influads.com +engine.letsstat.nl +engine.mobileapptracking.com +engine.monetate.net +engine.nectarads.com +engine.phn.doublepimp.com +engine.rbc.medialand.ru +engine.rorer.ru +engine.spotscenered.info +engine.spoutable.com +engine.trklnks.com +engine.turboroller.ru +engine.widespace.com +engine.xclaimwords.net +engine2.adzerk.net +enginebay.ru +engineercenter.kz +engineering.aweber.com +engineering.chartboost.com +engineering.innovid.com +engineering.intercom.io +engineering.mixpanel.com +engineering.outbrain.com +engineering.swrve.com +engineering.taboola.com +engineering.tapad.com +engineering.wootric.com +enginenetwork.com +engines-usa.com +englate.com +englishdictionaryfree.com +englishgamer.com +englishm8.info +enguzelpornolarii.biz +enguzelpornolarii.info +enhance-config.fgl.com +enhance.fgl.com +enhanced2trk.com +enhancedstats.com +enhancedtrk.com +enhancemysearch.com +enhand.se +enheqjtrvkn.bid +enhovesepdhxph.bid +enigmagirl.com +enigmasoftware.com +eniro.hit.gemius.pl +eniro.tns-cs.net +enirocode.adtlgc.com +enirodk.adtlgc.com +enjoy18.com +enjoyableoffers.club +enjoysexshop.nl +enjoywebcamsex.com +enklawy.pl +enlaceselectronicos.com.mx +enlarget.com +enn.advertserve.com +enogy.de +enolpharma.com +enoratraffic.com +enormousjugs.net +enoughmarket.com +enp1xfxf.top +enpresse.1.p2l.info +enquete-annuelle.info +enquisite.com +ensighten.com +enskedesquashclub.se +enstaruk.com +enter.7zsex.info +enter.sexlist.com +entercasino.com +enteredu.net +enternet.ee +enterprise-admin.hitbox.com +enterprise-box.count.ly +enterprise.hitbox.com +enterprise.telesat.com.co +enterprisemediagroup.112.2o7.net +enterprisenewsmedia.122.2o7.net +enterprisesupport.yext.com +entertainment-rewardpath.com +entertainment-specials.com +entertainment.msn.us.intellitxt.com +entertainment.msnbc.us.intellitxt.com +entertainmentwise.us.intellitxt.com +enteryouremail.net +enthuse.computernetworksonline.com +enthusiasticdad.com +entitatsambcor.org +entk.net +entrecard.s3.amazonaws.com +entrepreneur.122.2o7.net +entrepreneur.us.intellitxt.com +entrepreneurpoc.122.2o7.net +entry-stats.huffingtonpost.com +enva-systems.de +envaseslotusama.com +enviousthread.com +environmentalgraffiti.uk.intellitxt.com +enygay.com +eoccompany.de +eol1.egyptonline.com +eon.tags.sitetagger.co.uk +eonline.pl +eontarionow.us.intellitxt.com +ep-apsoutheast.ifc.inmobi.com +ep-euwest.ifc.inmobi.com +ep-useast.ifc.inmobi.com +ep-uswest.ifc.inmobi.com +ep.ifc.inmobi.com +ep.livefyre.com +ep.t402.livefyre.com +epebuild.112.2o7.net +eplans.112.2o7.net +epliki24.pl +epm.marketo.net +epmads.com +epmclk.com +epom.com +epomads2.4shared.com +epost.122.2o7.net +eps-analyzer.de +epsilon.6sense.com +epsilon.iad-03.braze.com +epson-printer-ink.beesearch.info +eqads.com +equallyyolked.com +eqv-rtb1.rfihub.net +eqx.smartadserver.com +er.criteo.com +erectile.byethost33.com +eremedia.112.2o7.net +eren.ecoencomputer.com +erie.smartage.com +ermail.pl +ermaseuc.ru +ero-advertising.com +ero-tv.pl +eroov.iptvdeals.com +erotik-bordelle.at +erotik-games.com +erotik-himmel.de +erotik-scout.de +erotik-sexchat.com +erotik-und-reisen.de +erotik-zonen.dk +erotik.at +erotika-x.com +erotikbilder.nu +erotikclup.net +erotikcorner.com +erotikfilm.nu +erotikfix.de +erotikguiden.dk +erotikhomepage.com +erotiknovellen.se +erotikplus.ch +erotikpunkt.de +erotikresim.info +erotikseiten.tk +erotiksonline24.de +erotikstories.ru +erotiktools.com +erotiktop.org +erotiktraum24.de +erotiktreff24.info +erotikvideofilme.de +erotikwelt.nu +erotique.fatgarry.org +erotiquement.fr +erotisch-daten.be +erotische-geschichten-xxl.com +erotische-leseproben.de +err.000webhost.com +err.agava.ru +err.chicappa.jp +err.lolipop.jp +err.spring-tns.net +err1.9939118.info +err2.9939118.info +err3.9939118.info +errdoc.gabia.net +error-warning-alert-critical-5x.com +error.000webhost.com +error.banan.cz +error.demdex.net +error.fc2.com +error.freewebsites.com +error.hostinger.eu +error.intuitext.ro +error.pimproll.com +error404.000webhost.com +errorception.com +errorfixing.space +errorfixing.tech +errornuker.software-phile.com +errors.adwyze.com +errors.client.optimizely.com +errors.mobile.optimizely.com +errors.perfectgonzo.com +errortablet.com +ers.ero-advertising.com +ertya.com +erupt.fernetmoretti.com.ar +es.adserver.yahoo.com +es.cookiescript.info +es.ero-advertising.com +es.gmads.net +es.nedstat.net +es.optimost.com +es.returnpath.com +es.returnpath.net +es.sitestat.com +es.wix.com +es.zemanta.com +escape.insites.eu +escapicon.net +escobar.pr0gramm.com +escorts-paradise.com +escortsphila.com +escortsprag.com +escortz.biz +esdy.info +eselfilme.org +esemeso.pl +esepc.com +eset.122.2o7.net +esg.hitbox.com +esgic.1.p2l.info +esherrugby.com +eshop.md +eshop4u.jp +eskk.pl +eslestir.com +esnm.ru +esoad.frost-electric-supply.com +esp.enriqueiglesias.com +espaceinventoristes.com +espaciotecno.com +espaziodesign.com +espdesign.com.au +espia.org +espinho.oksweb.com +espn-ak.starwave.com +espn.footprint.net +espn.hb.omtrdc.net +espndotcom.tt.omtrdc.net +espresso-reklam.eu +espritensemble.com +esqchamber.com +essads.com +estat.com +estelle.us.intellitxt.com +estoa.frost-electric-supply.com +estporno.info +estream.com.pl +estream.to +esttrk.com +estyleblog.xyz +et-code.ru +et-integration.dynamicyield.com +et.twyn.com +etacontent.com +etad.telegraph.co.uk +etahub.com +etappx.exacttarget.com +etappx.qa.exacttarget.com +etappx.s1.qa2.exacttarget.com +etappx.s4.exacttarget.com +etappx.test.exacttarget.com +etarget.mgr.consensu.org +etargetnet.com +etek.club +etemis.com +eten-users.us.intellitxt.com +eternal.reklamlab.com +eternitymobiles.com +eth-pocket.com +eth-pocket.de +eth-pocket.eu +ethan.wang +ethanslayton.com +ethereum-pocket.de +ethereum-pocket.eu +ethnic-porn.com +ethnicafrique.com +ethnicking.com +ethpolice.com +ethtrader.de +etilerveteriner.com +etinswdem01.exacttarget.com +etinteractive.exacttarget.com +etisalatebill.net +etlrsq.ru +etm-consult.de +etn.cpufan.club +etn.spacepools.org +etnpool.minekitten.io +etr-interac.com +etracker.de +etrk.asus.com +etype.adbureau.net +etzbnfuigipwvs.ru +eu-adcenter.net +eu-api.swrve.com +eu-content.swrve.com +eu-cookie-law.info +eu-geolookup.swrve.com +eu-gmtdmp.gd1.mookie1.com +eu-identity.swrve.com +eu-pn2.adserver.yahoo.com +eu-pn4.adserver.yahoo.com +eu-premiumanalytics.swrve.com +eu-px.steelhousemedia.com +eu-qa-log.swrve.com +eu-s2s.1rx.io +eu-sonar.sociomantic.com +eu-survey.com +eu-tools.247realmedia.com +eu-u.openx.net +eu-west-1.awstrack.me +eu-west-1.bid.bidr.io +eu-west-1.prod.curalate.com +eu-west-1.prod.internal.curalate.com +eu-west-1.stinger-ad.bidr.io +eu.a.intentmedia.net +eu.cdn.survey.medallia.com +eu.cfcdist.loan +eu.cfcnet.top +eu.content.cmp.advertising.com +eu.criteo.com +eu.criteo.net +eu.event.cmp.advertising.com +eu.hatevery.info +eu.ia.thunderhead.com +eu.kampyle.com +eu.monerise.com +eu.newrelic.com +eu.nuggad.net +eu.qualtrics.com +eu.rmevent.advertising.comus.rmevent.advertising.comeu.rmcontent.advertising.comus.rmcontent.advertising.com +eu.services.247realmedia.com +eu.track.digitaladsystems.com +eu.u.fastly-insights.com +eu.u.staging.fastly-insights.com +eu.u.test.fastly-insights.com +eu.xtms.net +eu.y.atwola.com +eu1.cfcnet.gdn +eu1.cpufan.club +eu1.heatmap.it +eu1.madsone.com +eu1.recompenses.win +eu1.snoobi.com +eu1.thunderhead.com +eu2.cdn.thunderhead.com +eu2.cfcnet.gdn +eu2.cpufan.club +eu2.madsone.com +eu2.monerise.com +eu2.thunderhead.com +eu2prepord.cdn.thunderhead.com +eu3.thunderhead.com +eu4.thunderhead.com +euadoroisso.com.br +euapi.ibm.xtify.com +euc1.dynamicyield.com +euconsole.ibm.xtify.com +euconsole.xtify.com +eucpviveusaprod.112.2o7.net +eucsoft.com +eue.collect-opnet.com +eugenevaultstorage.com +eukhostreview.org +eum.instana.io +euniverseads.com +euphoric.us +eupornstar.info +eur.a1.yimg.com +eurekagold.net +eurekster.com +eurico.org +eurifsiooyof.bid +euro-option.info +euro-rencontres.com +euro-vertrieb.com +euroad1.advantage.as +euroagd.net +euroclick.com +europcareer.com +europe-academy.net +europe.adserver.yahoo.com +europe.monerise.com +europol.europe.eu.france.id647744160-2176514326.h5841.com +europol.europe.eu.id214218540-7444056787.h5841.com +euros4click.de +eurospanker.com +eurostar.122.2o7.net +eurovisions.free.fr +euroxxx.nu +eus.rubiconproject.com +eusta.de +euuaa.com +euw.adserver.snapads.com +ev-elisabeth-krankenhaus.de +ev.ads.pointroll.com +ev.ib-ibi.com +ev.surveywall-api.survata.com +ev.yieldbuild.com +evaairline.com +evaangel.net +evangelische-heimstiftung.de +evania.adspirit.de +evanicole.com +evans.babajilab.in +evasfeet.info +evbeacon.networksolutions.com +eve-angel.info +eveals.com +eveley.club +evelynes.de +evengparme.com +evenmedia.com +event-log.videe.tv +event-tracker.k8s-prod.fiksu.com +event-tracker.k8s-test.fiksu.com +event-tracking.com +event.2leva.bg +event.ad.cpe.dotomi.com +event.api.cp.tune.com +event.cmp.advertising.com +event.ksosoft.com +event.prod.bidr.io +event.spotxchange.com +event.wbinsights.com +eventbeacon.ca +eventbrite.122.2o7.net +eventkalender.com +eventlog.adx1.com +eventlogger.soundcloud.com +events.adjust.com +events.advidi.com +events.adwidecenter.com +events.amplitude.com +events.appsflyer.com +events.boomtrain.com +events.branch.io +events.crazyclickstats.com +events.dynamicyield.com +events.exacttarget.com +events.fgol.mobi +events.foreseeresults.com +events.gumgum.com +events.iap.unity3d.com +events.kalooga.com +events.kiosked.com +events.marketo.com +events.mobile.optimizely.com +events.mparticle.com +events.redditmedia.com +events.stackshare.io +events.startappservice.com +events.streamamp.mgr.consensu.org +events.streamrail.net +events.tabmo.io +events.undertone.com +events.urbanairship.com +events.webflowmetrics.com +events.yext.com +events3.adcolony.com +events3alt.adcolony.com +eventtracker.videostrip.com +evepdaggiesports.112.2o7.net +evepdaikencom.112.2o7.net +evepdbrazossports.112.2o7.net +evepdcharleston.112.2o7.net +evepdeagledev.112.2o7.net +everestclick.com +everestjs.net +everesttech.net +everflow.adready.com +evergage.com +every-day.net +everybodyusethis.info +everydaygays.com +everydayhealth.demdex.net +everydresses.com +everyjoe.us.intellitxt.com +everytalk.tv +everythingisstory.com +evesaddictin.com +evgnet.com +eviboli576.o-f.com +evidencecleanergold.com +evidon.com +evidon.mgr.consensu.org +evil69.com +evilbeetgossip.us.intellitxt.com +evile.co.uk +evilsex.nu +eviltracker.net +evkc.com +evobill.biz +evogarage.com +evolvia.se +evs.jivox.com +evwr.hitbox.com +ewebcounter.com +eweek.us.intellitxt.com +ewr-rtb1.rfihub.net +ewr.vpn.sizmek.com +ewr01-nagios01.svc.insnw.net +ewr01-nagios01.vpn.insnw.net +ewr01-nagios02.svc.insnw.net +ewr01-nagios02.vpn.insnw.net +ewr01-nagios03.svc.insnw.net +ewr01-nagios03.vpn.insnw.net +ewr01-pcikeystore01.pci.insnw.net +ewr01-pcikeystore02.pci.insnw.net +ewsabilene.112.2o7.net +ewscorpuschristi.112.2o7.net +ewscripps.112.2o7.net +ewsmemphis.112.2o7.net +ewsnaples.112.2o7.net +ewstcpalm.112.2o7.net +ewstv.abc15.com +ewsventura.112.2o7.net +ewtuyytdf45.com +ex-traffic.com +ex.banner.t-online.de +ex.technor.com +ex10c1.tf-net.tribalfusion.com +ex10c2.tf-net.tribalfusion.com +ex13c1vm-01.tf-net.tribalfusion.com +ex13c1vm-02.tf-net.tribalfusion.com +exactadvertising.com +exacttarget.com +examinercom.122.2o7.net +examnotes.us.intellitxt.com +example.getambassador.com +example.optimizely.com +exasked.com +excas03.tf-net.tribalfusion.com +excas04.tf-net.tribalfusion.com +excellent.michaelanthonyrobinson.com +exch.quantserve.com +exchange-it.com +exchange.adswizz.com +exchange.analyticson.com +exchange.bg +exchange.contextweb.com +exchange.face2trade.com +exchange.inmobi.com +exchange.nativeads.com +exchange.panadvert.com +exchange.silverpop.com +exchange.staging-video-v2.fyber.com +exchange.video-v2.fyber.com +exchange.xbiz.com +exchangead.com +exchangecash.de +exchangeclicksonline.com +excite.us.intellitxt.com +exclaim.goldenteamacademy.cl +exclusiotv.be +exclusivebrass.com +exclusivegiftcards.com +exdynsrv.com +execulink.112.2o7.net +executivecoaching.co.il +exelate.rtb.adx1.com +exelator.com +exeos.ws +exgfsbucks.com +exgirls.biz +exgrafix.com +exhibe.org +exhibenfrance.com +exhibi-club.com +exhibicionismo-publico.com +exhibisionist.nu +exhibits4court.com +exhibsamateur.com +exit-ad.de +exit.oxcash2.com +exit.silvercash.com +exit.xpays.com +exit76.com +exita2.com +exitexchange.com +exitfuel.com +exitopolska.com +exits.adultcash.com +exits1.webquest.net +exits2.webquest.net +exitsplash.s3.amazonaws.com +exity.info +exityield.advertise.com +exmasters.com +exnjadgda1.doubleclick.net +exnjadgda2.doubleclick.net +exnjadgds1.doubleclick.net +exnjmdgda1.doubleclick.net +exnjmdgds1.doubleclick.net +exoclick.com +exogripper.com +exonline.info +exoogle.com +exosrv.com +exoticadverts.com +exoticaproductions.com +exoticclubhouse.com +exoticdancers.nu +exoticelaine.com +exoticpornshow.com +exoticstories.net +exoticvoyeur.com +exp.mxptint.net +exp0811.truconversion.com +exp1311.truconversion.com +expdom.com +expedia.ca.112.2o7.net +expedia1.112.2o7.net +expedia4.112.2o7.net +expedia6vt.112.2o7.net +expedia8.112.2o7.net +experianservicescorp.122.2o7.net +experience.tinypass.com +expertblog.info +experteerads.com +expertland.net +expertnaya-ocenka.ru +experts.us.intellitxt.com +expertsexchange.112.2o7.net +expired-targeted.com +explicitasianmovies.com +explicite-debutantes.com +explicite-xxx.com +explicitlatinamovies.com +exploitedmilf.com +explore.mixpanel.com +explore2be.com +explorer-staging.flurry.com +explorer.jsecoin.com +expo-max.com +expo9.exponential.com +exponea.com +exponential.com +exponento.truconversion.com +export.swrve.com +exportshop.us +expotask-dev.pcl.exponential.com +express-p.shopcurbside.com +express-s.shopcurbside.com +express-submit.de +express-t.shopcurbside.com +express.maxpoint.com +express.shopcurbside.com +express.uk.intellitxt.com +expressaffiliatesite.com +expressomatogrosso.com.br +expwye-rsw1.corp.er.extremereach.com +exscan.ads.scanapps.com +ext-tracker.presage.io +ext.dynamicyield.com +ext.host-tracker.com +ext.privacyassistant.net +ext.royalcactus.com +ext1.impresionesweb.com +ext2.impresionesweb.com +extend.tv +extended.dmtracker.com +extension.freshmarketer.com +external.dmtracker.com +external.monerise.com +external.stealthedeal.com +externos.impresionesweb.com +extinstalls.icu +extntechnologies.us.intellitxt.com +extole.io +extra.eboundservices.com +extractorandburner.com +extragenerators.xyz +extranet.bandwidthx.net +extranet.criteo.com +extranet.dotomi.com +extreembilisim.com +extrem-tabulos.de +extremal-blog.com +extreme-dm.com +extreme-object-insertion.com +extreme-sexe.net +extremeasianporn.com +extremedeal.de +extremegrannies.com +extremeoverclocking.us.intellitxt.com +extremepeeing.com +extremepics.nl +extremereach.com +extremetech.us.intellitxt.com +extremetracking.com +extrovert.122.2o7.net +eyeblaster.com +eyeota.net +eyereact.eyereturn.com +eyereturn.com +eyes.by +eyeviewads.com +eyewonder.com +ezboard.bigbangmedia.com +ezdownloadpro.info +ezgds.112.2o7.net +ezoic.net +ezthemes.com +eztracks.us.intellitxt.com +eztrck.com +ezula.com +ezwebsitetraffic.com +f-ads.pl +f-js1.spotsniper.ru +f-nod1.adsniper.ru +f-nod2.adsniper.ru +f.admob.com +f.as-eu.falkag.net +f.blogads.com +f.convertkit.com +f.gj555.net +f.monetate.net +f.nexac.com +f.qstatic.com +f.thanksearch.com +f.zeroredirect.com +f.zeroredirect2.com +f00kclan.de +f012.de +f03.smaato.net +f04.smaato.net +f05.smaato.net +f05098.privacy4browsers.com +f06.smaato.net +f07.smaato.net +f08.smaato.net +f0815.de +f09.smaato.net +f1.media.brightcove.com +f1.midasplayer.com +f1.p0y.com +f10.smaato.net +f11.smaato.net +f11098.privacy4browsers.com +f12.smaato.net +f13.smaato.net +f14.smaato.net +f15.smaato.net +f150123.privacy4browsing.com +f16.smaato.net +f17.smaato.net +f18.smaato.net +f18085.privacy4browsers.com +f19.smaato.net +f1rstfuck.com +f1tbit.com +f2.midasplayer.com +f2.p0y.com +f20.smaato.net +f21.smaato.net +f22.smaato.net +f23.smaato.net +f24.smaato.net +f25.smaato.net +f26.smaato.net +f27.smaato.net +f28.smaato.net +f29.smaato.net +f2communitynews.112.2o7.net +f2nbt.112.2o7.net +f2ncracker.112.2o7.net +f2network.112.2o7.net +f2nmycareer.112.2o7.net +f2nsmh.112.2o7.net +f2ntheage.112.2o7.net +f3.midasplayer.com +f3.p0y.com +f30.smaato.net +f31.smaato.net +f32.smaato.net +f33.smaato.net +f34.smaato.net +f35.de +f35.smaato.net +f36.smaato.net +f37.smaato.net +f38.smaato.net +f39.smaato.net +f4.p0y.com +f40.smaato.net +f41.smaato.net +f42.smaato.net +f43.smaato.net +f44.smaato.net +f45.smaato.net +f46.smaato.net +f47.smaato.net +f48.smaato.net +f49.smaato.net +f4u.pl +f50.smaato.net +f51.smaato.net +f52.smaato.net +f53.smaato.net +f54.smaato.net +f55.smaato.net +f56.smaato.net +f57.smaato.net +f58.smaato.net +f59.smaato.net +f5biz.com +f5mtrack.com +f60.smaato.net +faacebok.pl +fabalexgay.free.fr +fabbe86.free.fr +fabianomotta.com +fabiocaminero.com +fabiogoleirooficial.com +fabiy.fastcomet.site +fable.in.ua +fabre-aubrespy.fr +fabricakuhon.ru +fabrics-store.com +fabryka-chinczykow.blogspot.com +fabryka-nagrod.com +facadecleaners.com +face--viewer.blogspot.com +face-books.org +face-pounders.com +face-vip.ujm.pl +face.hostingx.eu +faceapp.eu +facebokznajomi.blogspot.com +facebook-ads.adtz.com +facebook-color.5v.pl +facebook-hacks.com +facebook-kolor.blogspot.com +facebook-proxy.hi5.com +facebook-repto1040s2.ahlamountada.com +facebook.cm +facebook.sizmek.com +facebook.urmas.tk +facebookaccounthack.net +facebookaplikacje.blogspot.com +facebookcolors24.blogspot.com +facebookcrawl.co.cc +facebookinc.122.2o7.net +facebookingester.livefyre.com +facebookkoloruj.blogspot.com +facebookkviewer.blogspot.com +facebookloginsignin.com +facebooks.app11.lacartelera.info +facebooksurfing.info +facebookszpieg.glt.pl +facebooktbtoolbar.ourtoolbar.com +facebookunblocking.com +faceboook-replyei0ki.montadalitihad.com +facecandy.com +facemail.com +facemebook.com +faceoff.112.2o7.net +faceow.com +faceportal.pl +faces.fiksu.com +faceyourbook.com +facial-cumshot.info +facial.de +facialbitch.com +facialcumshot.biz +facialdiary.com +facialme.com +facials.for.free.fr +facialurge.biz +facilitategrandfather.com +facilityservices.biz +factfully.com +factiva.122.2o7.net +factory.se +factorywheelstoday.com +factwest.com +faculdadecdl.edu.br +fadadosexo.com.br +fadedprofit.com +fades.biz +fadzulani.com +fae5ret.top +faeecb0ock.info +faeph6ax.com +fagas.biz +faggotry.com +fagtech.com +fahrrad.bikesshop.de +fahrschule-viersen.de +failmobile.net +fairfax.demdex.net +fairfaxau.d1.sc.omtrdc.net +fairfaxau.demdex.net +fairlight.dk +fairway-ford.com +faisaliya.com +faithit-d.openx.net +faiyazahmed.com +fajnefanty.com +faktopedia.com.pl +faktor.mgr.consensu.org +falconsafe.com.sg +falcoware.com +falkag.net +fallencrafts.info +falstaff.oewabox.at +familiarfloor.com +familienzahnaerzte.com +family-offer.com +family1st.ca +familyholiday.ml +familyhomefinance.com.au +familyinbed.com +familyupport1.com +famir.com +famobusca.com +famosasdesnudasx.com +famososdesnudos.org +famous-pics.com +famouslinks.com +famouslynaked.com +famousquarter.com +famvir.1.p2l.info +fanaticalfly.com +fanatics.112.2o7.net +fanbread.com +fandangollc.demdex.net +fandesophiemarceau.free.fr +fanfuxxx.com +fangoria.us.intellitxt.com +fanners.ero-advertising.com +fanrep.oewabox.at +fans.demandbase.com +fanserv-d.openx.net +faq-candrive.tk +faq.revcontent.com +faqts.us.intellitxt.com +farecastcom.122.2o7.net +farethief.com +fargofinanse.pl +farm.plista.com +farmergoldfish.com +farmius.org +fascinatedfeather.com +fashion-tube.be +fast-adv.it +fast-lost4tmz.world +fast-mac-upp.com +fast.adobe.demdex.net +fast.aexp.demdex.net +fast.bet.demdex.net +fast.bostonglobe.demdex.net +fast.cbsi.demdex.net +fast.condenast.demdex.net +fast.de.demdex.net +fast.dm.demdex.net +fast.ecs.demdex.net +fast.everydayhealth.demdex.net +fast.fairfax.demdex.net +fast.fairfaxau.demdex.net +fast.fedex.demdex.net +fast.ford.demdex.net +fast.gannett.demdex.net +fast.gm.demdex.net +fast.iyogi.demdex.net +fast.marthastewart.demdex.net +fast.mtvn.demdex.net +fast.nbcots.demdex.net +fast.nbcu.demdex.net +fast.nfl.demdex.net +fast.nrjgroup.demdex.net +fast.philly.demdex.net +fast.postmedia.demdex.net +fast.sears.demdex.net +fast.swa.demdex.net +fast.td.demdex.net +fast.telstra.demdex.net +fast.timeinc.demdex.net +fast.torontostar.demdex.net +fast.twc.demdex.net +fastclick.co +fastclick.com +fastclick.com.edgesuite.net +fastclick.ir +fastclick.net +fastcounter.bcentral.com +fastcounter.com +fastcounter.linkexchange.com +fastcounter.linkexchange.net +fastcounter.linkexchange.nl +fastcounter.onlinehoster.net +fastdownload10.com +fasterfiles.net +fastfixing.tech +fastlane-adv.rubiconproject.com +fastlane.rubiconproject.com +fastly-insights.com +fastly.cdneval.adnxs.com +fastnclick.com +fastonlineusers.com +fastpopunder.com +fastsexsearch.com +fastwebcounter.com +fastwebproxy.gq +fat-mature.com +fata.ero-advertising.com +fatbackandcollards.us.intellitxt.com +fatbackmedia.us.intellitxt.com +fatblackgirl.com +fatcatrewards.com +fatfasts-4tmz.world +fatfreekitchen.us.intellitxt.com +fatghettowhores.blogspot.com +fatisin.ru +fatmaelgarny.com +fatpussy.biz +fatqueens.com +fatta.info +fattylovers.com +fattypalace.com +fatwomen.nu +fatwomennaked.com +faucethubggrip.linkandzelda.com +faultycanvas.com +faultyfowl.com +faunusaff.afftrack.com +fauth.myago.tk +fauth.urmas.tk +faux.romhost.me +favicon.com +favino.ru +favorcosmetics.com +favoriteboys.info +favoritemoney.ru +favornews.com +fawcettinsurance.com +fawwadh0.truconversion.com +fawwadh00.truconversion.com +fax.pc.phone.sms13.de +faxinasja.com.br +fayesworld.com +faz.ivwbox.de +faz99.com +fb-iq.pl +fb-kolor.blogspot.com +fb-podglad.blogspot.com +fb-szpieguj.likesyou.org +fb.cashtraffic.com +fbapp1.theappgrader.com +fbcolor.blogspot.com +fbcpublications.com +fbdev.midasplayer.com +fbfredericksburgcom.112.2o7.net +fbfreegifts.com +fbhexa.com +fbi.gov.id402037057-8235504608.d9680.com +fbile.pl +fbjaki.pl +fbkmnr.112.2o7.net +fbku.com +fbl.s50.exacttarget.com +fbmarketingfaq.com +fbmev.de +fboffensive.000webhostapp.com +fbphotos.net +fbpodglad.blogspot.com +fbpodgladacz.wordpress.com +fbtc-audio.freebitco.in +fbtc-uab.freebitco.in +fbweryfikacja123.blogspot.com +fc.webmasterpro.de +fc.yahoo.com +fcanr.tracking.miui.com +fcds.affiliatetracking.net +fceq.com +fcg.casino770.com +fcolors.blogspot.com +fcstats.bcentral.com +fd1.eye.to +fd2.eye.to +fd4.eye.to +fdads.sv.publicus.com +fdbdo.com +fdc.tapjoy.com +fdetc.org +fdff44.r.axf8.net +fdff44.t.axf8.net +fdimages.fairfax.com.au +fdtpyqqsnzxvt.ru +fdzone.org +fe-au.imrworldwide.com +fe.brandreachsys.com +fe.lea.jubii.dk +fe.lea.lycos.de +fe.lea.lycos.es +fe.lea.spray.se +fe1-au.imrworldwide.com +fe1-fi.imrworldwide.com +fe1-it.imrworldwide.com +fe2-au.imrworldwide.com +fe3-au.imrworldwide.com +fe3-gc.imrworldwide.com +fe3-uk.imrworldwide.com +fe4-uk.imrworldwide.com +feaecebook.com +fearcrow.com +feature-issue-1-rnd-gke-test.rnd.gcp.datamind.ru +featureporn.com +featurestack136-mitm-api.swrve.com +fecabook.redirectme.net +fedchik.org.ua +federalcop.com +federaldata.io +federalexpresscareers.com +federalgovernmentauctions.org +federationlgbt.org +federicksofhollywood.com +fedex.com.ssl.d2.sc.omtrdc.net +fedex.demdex.net +fee-hydrocodone.bebto.com +feebleshock.com +feed-player-service.prod.ndnops.com +feed.4wnet.com +feed.afy11.net +feed.engage.im +feed.peakclick.com +feed.trafflow.com +feed.validclick.com +feedads.g.doubleclick.net +feedads.googleadservices.com +feedback.adrecover.com +feedback.adroll.com +feedback.keen.io +feedback.microsoft-hohm.com +feedback.uc.cn +feedbackcensus.com +feedbackexplorer.com +feedbackresearch.com +feedjit.com +feeds.global-intermedia.com +feeds.videosz.com +feeds.viewbix.com +feeds.weselltraffic.com +feeds.wise-click.com +feedsweep.us.intellitxt.com +feedx.bidsystem.com +feel-planet.com +feeladult.com +feelgoodschool.com +feet.nu +feetfetish.nu +feetjobwhores.com +fei.pro-market.net +feicht.com +feieo.com +fejs-colors.blogspot.com +fejsopodgladacz.blogspot.com +fejspodgllaadacz.blogspot.com +fejspodglladacz.blogspot.com +felceconserve.com +felipenetomegafest.com +felix.data.tm-awx.com +fellation.nu +fellations.be.tc +female-masturbation.org +female-sex-toys.com +female-v.1.p2l.info +femalefirst.uk.intellitxt.com +femalehealthblog.com +femalemasturbation.info +femaleuk.co.uk +femaleviagra.findmenow.info +femalewrestlingnow.com +femcocks.com +femcontrol.com +femdom-cafe.com +femdom.twiclub.in +femdomforum.net +femdomsinema.com +femdomstrapon.us +femeedia.com +femexbaile.com +femfootfetish.com +femininetouch.free.fr +femme-collant.com +femme-mature.sitecul.com +femme-noire-nue.com +fengfengtie.com.cn +fengfengtiecrv.com.cn +fengfengtiessp.com.cn +fengyixin.com +ferienwohnung-kueste.de +fermersovet.ru +fermosur.com +fernbahner.de +ferrago.uk.intellitxt.com +ferrari.org.ru +ferretsoft.com +ferrotodo.com +fertilitetsradgivningen.se +fervalaka.free.fr +fervortracer.com +fesrouge.free.fr +festival.lisnr.com +festival140caracteres.com +festivalbecause.org +fetisch-bizarr.info +fetisch-domain.de +fetisch-ladies.de +fetisch-schuhshop.de +fetischclips.de +fetischgeschichten-fetisch.cc.nu +fetischist.in +fetischvideo.de +fetischzentrale.de +fetish-factory.de +fetish-pics.nu +fetish-place.net +fetish-s.com +fetish-tempel.de +fetish-world.info +fetish-world.nu +fetish-x.com +fetish.petitecoquine.com +fetish.sms13.de +fetish1.com +fetish100.tk +fetish123.com +fetishads.info +fetishbull.com +fetishchateau.com +fetishclub.nl +fetishdreams.free.fr +fetishes.malespark.com +fetishexhibition.com +fetishfinder.net +fetishfitnessbabes.com +fetishgang.com +fetishgossip.com +fetishheaven.de +fetishhub.net +fetishinside.com +fetishist.nu +fetishix.net +fetishlocator.com +fetishmaniac.com +fetishmontreal.com +fetishonlinestore.com +fetishotel.com +fetishsex.dk +fetishsex.nu +fetiteprofesioniste.biz +fettefrauen.net +fettetitten.net +fettzeppelin.de +ff.connextra.com +ff.streamrail.net +ff1.telemetryverification.net +fff.dailymail.co.uk +ffinwwfpqi.gq +ffjk.space +fflotte.oewabox.at +ffmpeg.streamrail.net +fforum.pisz.pl +fftrack.pro +ffxcam.fairfax.com.au +ffxitrack.com +fg-set-my-cookie.adx1.com +fg.softguy.com +fgawegwr.chez.com +fge9vbrzwt.bid +fgl.com +fgoogle.com +fgtkmcby02.eu +fh1qa.midasplayer.com +fhatfee.ero-advertising.com +fhg.dacash.com +fhg.digitaldesire.com +fhg.sheanimale.com +fhgfffdsf9.appspot.com +fhm.uk.intellitxt.com +fhm.valueclick.net +fhmonline.us.intellitxt.com +fhukaja.pl +fhunter.inetport.com +fi.sitestat.com +fiberally.com +ficcionaliza.angelcities.com +fick-affairen.com +ficken.4iso.de +ficken.la +fickenprivat.info +fickenumsonst.de +fickenzz.net +fickkontakte.org +fickluder69.com +fickmichbitte.de +fickmovies.de +fickseite.de +fickvotze.com +fickzentrum.de +ficusoid.xyz +fidelity-media-ssp.rtb.adx1.com +fidgetspinner.5v.pl +fif49.info +fightline.us.intellitxt.com +figlobal.112.2o7.net +fiksu.com +fil.ru +file-error-09x38.gq +file-share.pl +file-share365.com +file.ipinyou.com.cn +filebay.org +filecdn2.dotandad.com +filecom.net +filedownload.com.pl +filedownloader.pl +filedownloads.pl +filedudes.us.intellitxt.com +fileengine.org +filefortune.com +fileice.net +fileman.pl +fileoasis.net +filerom.com +files-www2.adsnative.com +files.adbrite.com +files.adspdbl.com +files.bannersnack.com +files.brothersoft.com +files.ctnet4.space +files.dsnetwb.com +files.fortrader.ru +files.getambassador.com +files.goodadvert.ru +files.native.ad +files.revcontent.com +files.sharethrough.com +files.tailsweep.com +files4.securedownload01.com +files5.securedownload01.com +filescloud.pl +filesdock.com +filesdownloads.pl +filesenzu.com +fileshare.247realmedia.com +filespeedy.net +filespeedy.org +fileston.com +filestrue.com +fileup.com.pl +filezilla.fr +fili.cc +fili.tv +filionline.pl +film-base.pl +filmdrunk.us.intellitxt.com +filmes-hd.com +filmfanatic.com +filmforcedvd.ign.us.intellitxt.com +filmhd.ek1.pl +filmline.pl +filmobox.pl +filmonline.info.pl +filmoo-maniacy.blogspot.com +filmoosy.pl +filmowo.com.pl +filmowo24.pl +filmplay.pl +filmschoolrejects.us.intellitxt.com +filmstew.us.intellitxt.com +filmthreat.us.intellitxt.com +filmu.pl +filmwad.us.intellitxt.com +filmy-i-seriale.pl +filmy-premium.pl +filmy-xxx.pl +filmycda.pl +filmyiseriale.pw +filmynet.eu +filost.com +filosvybfimpsv.ru.gg +filoumektoub.free.fr +filter.adsparkmedia.net +filter.adxfactory.com +filter.bluemediappc.com +filter.eclickz.com +filter.mediacpc.com +filter.onwardclick.com +filterfixer.com +filthybabes.net +filthysociety.com +filunika.com.ru +filxbus.de +filzgalerie.de +fim.122.2o7.net +fimserve.askmen.com +fimserve.com +fimserve.ign.com +fimserve.myspace.com +fin.adbureau.net +fin.tips +finals.travian.com +finance-daily.ru +finance-offer.com +finance.vicedata.com +financeforum.ru +financetip.eu +financialnewsupdates.com +financialprovider-logos.platform.intuit.com +finanzmeldungen.com +finatime.ivwbox.de +findadvertise.engine.adglare.net +findcommerce.com +findepended.com +finder.cox.net +finders.hopto.org +findfavour.com +findgiftcode.com +findit-quick.com +findmenow.info +findsexguide.com +findyourcasino.com +fineclicks.com +finnhair.co.uk +fioe.info +fiona.ai.net +fioricet-online.blogspot.com +fioricet.1.p2l.info +fioricet.3.p2l.info +fioricet.4.p2l.info +fips.uimserv.net +firead.org +fireads.online +fireads.pl +firebid.pl +firecash.org +firecpa.com +firegifts.pl +firehound.dev.paperg.com +firehound.prod.paperg.com +firehound.staging.paperg.com +firehouse651.com +firesub.pl +firewall.juicemobile.com +firingsquad.us.intellitxt.com +firmware.center +firrectly.top +first.nova.cz +firstconsumers.com +firstfinda.info +firstgame.xyz +firstlightera.com +firstshowing.us.intellitxt.com +fishadz.pressflex.net +fishclix.com +fitges.oewabox.at +fitnesshealthreporter.com +five.partner.archive-it.org +fixbonus.com +fixcleaner.com +fixya.us.intellitxt.com +fizjoterapia.5v.pl +fk.adx1.com +fkooaee.angelcities.com +fl.5.p2l.info +fl.adpxl.co +fl01.ct2.comclick.com +flagcounter.com +flakyfeast.com +flamefolder.com +flappy-paul.juicemobile.com +flare-analytics.com +flare.nowupdflash.bid +flash.quantserve.com +flash.sec.intl.miui.com +flashadtools.com +flashbanners.static.ard.sexplaycam.com +flashbanners.static.ard.xxxblackbook.com +flashcasino.com +flashmagazine.us.intellitxt.com +flashmediaportal.com +flashsavant.com +flashtalking.com +flashtest.ero-advertising.com +flashx.co +flatdee.ero-advertising.com +flatfae.ero-advertising.com +flatfea.ero-advertising.com +flatfee.ero-advertising.com +flavordecision.com +fleshlightcash.com +flex.atdmt.com +flex.msn.com +flexbanner.com +flexeril.1.p2l.info +flextra.1.p2l.info +flightschool.autopilothq.com +flightsy.bid +flightsy.date +flightsy.win +flightzy.bid +flightzy.date +flightzy.win +flimsycircle.com +flip-flipflop.pingdom.net +flip.optimizely.com +flipkart.d1.sc.omtrdc.net +flirtarepertutti.com +fliteilex.com +fljgsht.ru +flnqmin.org +float.2693.bm-impbus.prod.ams1.adnexus.net +floatingads.madisonavenue.com +flonase.1.p2l.info +flonase.3.p2l.info +flonase.4.p2l.info +floodprincipal.com +flophous.cf +floridat.app.ur.gcion.com +florineff.ql.st +flower-online.petrovka.info +flower.bg +flowers-offer.com +flowgo.com +flowplayer.space +flowtec.com.br +fls-cn.amazon-adsystem.com +fls-eu.amazon-adsystem.com +fls-fe.amazon-adsystem.com +fls-na.amazon-adsystem.com +fls-na.amazon.com +fls.au.doubleclick.net +fls.doubleclick.net +fls.uk.doubleclick.net +flttracksecure.com +flu23.com +fluoxetine.1.p2l.info +flurry.com +flw.ero-advertising.com +flx367.lporirxe.com +flycast.com +flyerboard.prod.paperg.com +flyerboard.staging.paperg.com +flyers.www.paperg.com +flyertown.ca +flyingmag.com.122.2o7.net +flyingmag.us.intellitxt.com +fmads.osdn.com +fmcurling.org +fms2.eyewonder.speedera.net +fms2.pointroll.speedera.net +fmsads.com +fnacmagasin.solution.weborama.fr +fnatfee.ero-advertising.com +fnlpic.com +fo-api.omnitagjs.com +fo4n.com +fo5.a1-downloader.org +foamybox.com +focus.met.vgwort.de +focusbaiduafp.allyes.com +focusin.ads.targetnet.com +focustraining.intelsad.com +fodder.qq.com +fodder.tc.qq.com +folkd.put.omnimon.de +following-technology.com +folloyu.com +fonbet.auth.piwik.pro +fonbet.dmp.piwik.pro +fondazioneciampi.org +fondprof.oewabox.at +foo.cosmocode.de +food-drink-bonuspath.com +food-drink-rewardpath.com +food-offer.com +foodmixeroffer.com +footerroll.admedia.com +footprintdns.com +footymad.uk.intellitxt.com +forbes.us.intellitxt.com +forbesattache.112.2o7.net +forbesauto.112.2o7.net +forbesautos.112.2o7.net +forbescollect.247realmedia.com +forbescom.112.2o7.net +ford.112.2o7.net +ford.demdex.net +forecast.snapads.com +foreclousure.com +foreclousures.com +foreignpolicy.advertserve.com +foreman-a001-ash.krxd.net +foreman-a001-dub.krxd.net +foreman-a001-pdx.krxd.net +foreman-a002-ash.krxd.net +foreman-a002-dub.krxd.net +foreman-a002-pdx.krxd.net +foreman-a003-ash.krxd.net +foreman-a003-dub.krxd.net +foreman-a003-pdx.krxd.net +foreman-a004-ash.krxd.net +foreman-a004-dub.krxd.net +foreman-a004-pdx.krxd.net +foreman-ash.krxd.net +foreman-dub.krxd.net +foreman-internal-ash.krxd.net +foreman-internal-dub.krxd.net +foreman-internal-pdx.krxd.net +foreman-pdx.krxd.net +foreman.adsrvr.org +foreman.use.adsrvr.org +foresee.com +forex-affiliate.net +forex-broker.hut1.ru +forex-chart.hut1.ru +forex-instruments.info +forex-market.hut1.ru +forex-news.hut1.ru +forex-online.hut1.ru +forex-signal.hut1.ru +forex-trade.hut1.ru +forex-trading-benefits.blogspot.com +forexadv.eu +forextrading.hut1.ru +forgotten-deals.com +formalyzer.com +formessengers.com +forms.aweber.com +forms.earnmydegree.com +forms.help.clearbit.com +formula-api.adtech.de +formula-api.adtechus.com +formulawire.com +foroushi.net +fortnite-vbuck.com +fortnitehack2018.com +fortpush.com +fortrader.ru +fortunecity.us.intellitxt.com +forum-boost.site50.net +forum-windows.eu +forum.adspaces.ero-advertising.com +forum.ero-advertising.com +forumcomm-d.openx.net +forumediainc.us.intellitxt.com +forums.adspaces.ero-advertising.com +forums.data2.ero-advertising.com +forums.ero-advertising.com +forvideo.at +fotka10.ml +fotolog.crwdcntrl.net +fotologaso.miss-web.es +fotomonto.pl +fourarithmetic.com +fourthgate.org +fox.tags.newscgp.com +foxamw.112.2o7.net +foxcom.112.2o7.net +foxcounter.com +foxidol.112.2o7.net +foxinteractivemedia.122.2o7.net +foxnet.demdex.net +foxnews.com.d1.sc.omtrdc.net +foxnews.demdex.net +foxnews.dev.extremereach.com +foxnews.tt.omtrdc.net +foxnews.us.intellitxt.com +foxsimpsons.112.2o7.net +foxsports.hb.omtrdc.net +foxsports.us.intellitxt.com +foxtv.us.intellitxt.com +foxx.to +fp-analytics.hotstar.com +fp.oneshotdate.com +fp.uclo.net +fp.valueclick.com +fpa.ero-advertising.com +fpcclicks.com +fpctraffic.com +fpctraffic2.com +fpl.undertone.com +fqtag.com +fr.2.cqcounter.com +fr.64.clickintext.net +fr.85.clickintext.net +fr.a2dfp.net +fr.adserver.yahoo.com +fr.apple.com-services-assistance-recuperations-des-comptes.com +fr.at.atwola.com +fr.cim.clickintext.net +fr.classic.clickintext.net +fr.cookiescript.info +fr.doubleclick.net +fr.eu.criteo.com +fr.eu.criteo.net +fr.mediaplayercodecpack.com +fr.returnpath.com +fr.returnpath.net +fr.sitestat.com +fr.slidein.clickintext.net +fr1.monerise.com +fra-01.braze.eu +fra-photobox-tracking.adalyser.com +fra-rtb1.rfihub.net +fra01-nagios01.svc.insnw.net +fra01-nagios01.vpn.insnw.net +fra01-nagios02.svc.insnw.net +fra01-nagios02.vpn.insnw.net +fra01-nagios03.svc.insnw.net +fra01-nagios03.vpn.insnw.net +fra1-ib.adnxs.com +fra1.qualtrics.com +fraad.adtech.de +fraapi.ibm.xtify.com +frailoffer.com +frankfurt-1.xmrpool.net +frankfurt01.monero.hashvault.pro +franklyinc.com +fratz.oewabox.at +frauen-nackt.biz +frauen-pornos.com +frbizlist.com +frcls.fr +frcsgroup.com +frdessins.free.fr +frdom.free.fr +freakads.com +freakshack.com +freaksofcockporn.com +freaksofcocks.net +freaktropolis.com +freakycheats.com +fredefined.com +fredporn.com +fredrickfrank200.000webhostapp.com +free---porn.info +free-adult-links.biz +free-adult-porn-videos.net +free-adult-stories.com +free-adult-webcams.com +free-amatuer.nu +free-anal-sex-pictures.gocunt.com +free-anal.biz +free-arab-sex.com +free-banners.com +free-counter.5u.com +free-crochet-pattern.com +free-crypto.info +free-daily-porn-pics.com +free-dating-site.allmanpages.com +free-eroticsexstories.com +free-gay-movie.info +free-gay-porno-and-nude-celebrity-porn-stars.gocunt.com +free-gay-videos.info +free-gay.de +free-gay.info +free-gg.com +free-gift-cards-now.com +free-gifts-comp.com +free-gluten.ru +free-groupsex.com +free-hairy-pussy.net +free-indian-porn.info +free-interracial-porn.com +free-juicy.jamminweb.com +free-laptop-reward.com +free-latina.com +free-lesbian-movies.com +free-lesbian-sex-pictures.gocunt.com +free-money.host.sk +free-movie.info +free-moviez.com +free-nude-celebsite.com +free-online-dating-services.info +free-porn-art.com +free-porn-clips.biz +free-porn-cum-web-cam.komtoo.com +free-porn.hostrim.com +free-porn4u.biz +free-porno-films.com +free-porno-gals.info +free-porno-passwords.com +free-porno.nu +free-pornography.com +free-pornsex.com +free-rewards.com-s.tv +free-stats.com +free-stats.i8.com +free-steam-code.com +free-viagra.polybuild.ru +free-virus-scan.100gal.net +free.adultcomix.biz +free.aol.com +free.cartoonpornguide.com +free.content.streamray.com +free.hostdepartment.com +free.hotsocialz.com +free.internetspeedtracker.com +free.mobile.phone.picture.sms13.de +free.realtracker.com +free.thesocialsexnetwork.com +free.videodownloadconverter.com +free.xxxcounter.com +free1.usa.realtracker.com +free18teens.com +free411games.com +free4faucet.com +free4gay.com +freeact.info +freeadultgames.org +freeadultseries.com +freeanalsex.nu +freeandyoung.com +freeanzeigen.de +freeasianvideos.com +freeass.nu +freeassclips.com +freebanner.com +freebie-galleries.com +freebiegb.co.uk +freebiesms.co.uk +freebigtits.biz +freebitco.in +freebitmoney.com +freebrowser.info +freecamdollars.com +freecameraonus.com +freecameraprovider.com +freecamerasource.com +freecamerauk.co.uk +freecamsexposed.com +freecartoonxxx.com +freecast.ivwbox.de +freecex.com +freecharge.demdex.net +freechat.llil.de +freecodecs.us.intellitxt.com +freecontent.bid +freecontent.com +freecontent.date +freecontent.faith +freecontent.info +freecontent.loan +freecontent.net +freecontent.party +freecontent.racing +freecontent.science +freecontent.stream +freecontent.trade +freecontent.win +freecoolgift.com +freecumshots.nu +freedailydownload.com +freedailyxvids.com +freedesignerhandbagreviews.com +freedinnersource.com +freediversion.com +freedomart.cz +freedownloadcenter.uk.intellitxt.com +freedownloadmanager.uk.intellitxt.com +freedvddept.com +freeelectronicscenter.com +freeelectronicsdepot.com +freeelectronicsonus.com +freeelectronicssource.com +freeentertainmentsource.com +freefatsex.nu +freefblikes.phpnet.us +freefoodprovider.com +freefoodsource.com +freefootfetish.nu +freeforums.org +freeforumsorg.skimlinks.com +freefotovideo.com +freefotoz.com +freefuck.cz +freefuelcard.com +freefuelcoupon.com +freegamedl.net +freegamesgiveaways.com +freegasonus.com +freegasprovider.com +freegaygalls.com +freegayhardcoreporn.net +freegayporn.biz +freegeoip.net +freegiftcardsource.com +freegiftcode.com +freegiftreward.com +freegothicporn.org +freegroupsex.nu +freegroupvideo.popunder.ru +freehackpl.com +freehanbam.net +freehdmovies.biz +freehealthpoints.com +freehentai.biz +freehomosexual.com +freehornygirls.com +freehostservers.com +freeimghost.trafflow.com +freeindiangals.com +freeinvisiblecounters.com +freeipodnanouk.co.uk +freeipoduk.co.uk +freeipoduk.com +freeiqtest.blogspot.com +freeitunestvshow.siliconorchard.com +freelaptopgift.com +freelaptopnation.com +freelaptopreward.com +freelaptopwebsites.com +freelifeclub.org +freelogs.com +freelotto.com +freelyrics.win +freemags.cc +freemangasxxx.free.fr +freemidgetpornvideo.com +freeminecraft.cc +freeminecraftgiftcode.net +freemut.com +freemyfile.com +freenation.com +freenetflix.dlcodes.com +freenew.net +freenode.info +freenom.link +freenudes.nu +freeoffers-toys.com +freeolders.com +freeonlineusers.com +freepages.nu +freepattern.ru +freepay.com +freepayasyougotopupuk.co.uk +freepee.de +freepicksnfl.com +freepicsforyou.com +freeplasmanation.com +freeporn-mpegs.com +freeporn.com.mx +freeporn.dk +freeporn100.com +freeporn4all.net +freeporn4everyone.blogspot.ca +freeporn4everyone.blogspot.ch +freeporn4everyone.blogspot.co.id +freeporn4everyone.blogspot.co.uk +freeporn4everyone.blogspot.com +freeporn4everyone.blogspot.com.ar +freeporn4everyone.blogspot.com.br +freeporn4everyone.blogspot.com.es +freeporn4everyone.blogspot.com.tr +freeporn4everyone.blogspot.de +freeporn4everyone.blogspot.gr +freeporn4everyone.blogspot.it +freeporn4everyone.blogspot.mx +freeporn4everyone.blogspot.no +freeporn4everyone.blogspot.pt +freeporn4everyone.blogspot.sk +freeporngallerypost.com +freepornhubtube.com +freepornmoovies.info +freepornmov.com +freepornmoviestube.info +freepornomovie.biz +freepornopics.nu +freepornos.biz +freepornpics.nu +freepornpics.org +freepornsex.info +freerapid.fr +freerestaurantprovider.com +freerestaurantsource.com +freeserials.spb.ru +freeserials.ws +freeshoppingprovider.com +freeshoppingsource.com +freeskreen.com +freesms.pl +freestar-d.openx.net +freestats.com +freestats.tv +freevbucks-fortnite.pl +freevbuckx.com +freevideo-freefoto.eu +freevideo.biz.nf +freevideodownloadforpc.com +freewarehome.us.intellitxt.com +freewarepalm.uk.intellitxt.com +freewebcards.com +freewebcounter.com +freewebtown.com +freezemac.tech +frenchquiz.exponential.com +fresh-js.bitbucket.io +fresh-links.com +freshdz.com +freshfantasyfemales.com +freshfeed.jp +freshfood.com.pk +freshfuckin.com +freshiuz.com +freshmac.space +freshmarketer.com +freshpanties.biz +freshphotos.de +freshproxy.eu +freshrefresher.com +freshrefreshnerer186.info +freshrefreshnerer186rb.info +freshsex.nu +freshsuperbloop.com +freshteencuties.com +freundinnensex.de +freza-sverlo.ru +friend-request.com +friend-xxx.com +friendlyduck.com +friendsofchildren.net +friendsofolajones.org +friendtest.us.intellitxt.com +frightenedpotato.com +friket.com +frisdaz.co.be +friskyboys.com +frisssons.com +frivgame250.com +frizkon.com +frjap.free.fr +frntiernet.net +frog.wix.com +froggytest.fr.intellitxt.com +froggytube.com +frojdafsverige.se +froling.bee.pl +fromru.su +fromslowmactofastmac.com +front.ru +front.to +frontbeta.localytics.com +frontdoorporn.com +frontend-loadbalancer.meteorsolutions.com +frontend.snackly.co +frontpage-stats.rbl.ms +frontpagecash.com +frontpagemixtapes.com +frontrangedharmapunx.com +frranciscanalliance.org +frs7.com +frtya.com +frtyb.com +frtyj.com +fruitice.realnetwrk.com +fruitlauncher.com +fs-client-logger.herokuapp.com +fs.adviserplus.com +fs.corp.mparticle.com +fs.tidaltv.com +fs10.fusestats.com +fs2.corp.mparticle.com +fs7.adx1.com +fsalas.com +fsbook.us +fscout24.oewabox.at +fsl.sytes.net +fslt.wpm.neustar.biz +fspys.pl +fsres.advertising.com +fstatic.zemanta.com +fstbi.com +fsuser.advertising.com +ft2.autonomycloud.com +ftdownload.com +ftns.ru +ftp-api-01-prod.east.ftp.extremereach.com +ftp.advertising.com +ftp.adx1.com +ftp.bronto.com +ftp.cafeask.com +ftp.coinhive-manager.com +ftp.coinlab.biz +ftp.directprimal.com +ftp.flyfishusa.com +ftp.freecontent.info +ftp.freecontent.net +ftp.lpweb.altervista.org +ftp.onlinesucces.nl +ftp.std.com +ftpchi1.extremereach.com +ftpchi2.extremereach.com +ftpcontent.worldnow.com +ftpdal1.extremereach.com +ftpgil1.extremereach.com +ftplac1.extremereach.com +ftplac2.extremereach.com +ftpnyc1.extremereach.com +ftpnyc2.extremereach.com +ftpsfo1.extremereach.com +ftpsfo2.extremereach.com +fttcj.com +ftvcash.com +ftzivuesohvebj.ru +fu.golikeus.net +fubox.org +fucabook.cf +fuchsiasocks.com +fuck-force-five.fastredirect.com +fuck-net.de +fuck-suck.com +fuck-webcams.com +fuck.alt-fuck.com +fuck.org +fuck1.de +fuckableteens.net +fuckadmin.tk +fuckandsuck.nu +fuckbastard.com +fuckbuddybestgilf.info +fuckcasa.com +fuckcunt.nu +fuckdatmilf.com +fuckedandbound.info +fuckedcheating.com +fuckergalleries.com +fucking-machine-amateur.com +fuckingass.nu +fuckingbots.net +fuckingcrap.com +fuckinggirls.de +fuckingmachinepics.com +fuckingpics.nu +fuckingpink.com +fuckingteenblog.com +fuckleather.com +fucklotto.com +fuckme.please.net +fuckmill.com +fucknet.net +fuckphotos.nu +fuckpics.nu +fuckpost.nu +fuckpussy.net +fuckpussy.nu +fuckshow.nu +fuckshows.nu +fuckslit.com +fuckspy.biz +fuckstar.de +fuckstore.tk +fuckteens.nu +fucktesting.com +fuckthathole.com +fuckthebeast.nu +fuckvalentine.com +fuckvssuck.com +fuckwomen.nu +fuckz.net +fuckzone.free.fr +fuder.biz +fudgetv.com +fuerstin-domenica.de +fugarif.ga +fukkad.com +full-edition.info +full-movies-online.cba.pl +fullcopy-dishdigital.cs16.force.com +fulldownload.pl +fullplayer.pl +fullstory.com +fumey.snelop.pw +fun-clix.com +fun-e-cards.com +fun-mobi.pl +fun.lbn.ru +fun.snt24.de +fun2cell.net +funatyk.com +funchill.com +functional-business.com +functionalclam.com +functionalcrown.com +funfone.me +fungalor.com +funklicks.com +funkucck.bluerobot.cl +funky.staging.intercom.io +funnel0.adinfuse.com +funnelchair.com +funnyordie-d.openx.net +funnyreign.com +funpageexchange.com +funpics.free.fr +funponsel.com +funsilly.com +funsites.nl +funskan.pl +funsolo.net +funsquare.nl +funtabsafe.com +funtoonez.com +furniturecom.112.2o7.net +furnlevitz.112.2o7.net +fusetv.112.2o7.net +fusion.adtoma.com +fusionads.net +fusionquest.com +fusource.com +fussball.logos.sms13.de +fussfetisch.tk +futbolkin.ru +futbolkisales.ru +futeboltv.com +futurama-porn-blog.com +futurelooks.us.intellitxt.com +futuremeditation.de +futurenet.club +futurepay.globway.eu +futurepublications.uk.intellitxt.com +futuristicapparatus.com +futuristicfairies.com +fuuze.net +fuviseni.angelfire.com +fuzzyflavor.com +fuzzyweather.com +fvecare.com +fvid.atm.youku.com +fvzzz.pcloadletter.quhu.info +fw.ad-score.com +fw.adsafeprotected.com +fw.qq.com +fw1.aws.fwmrm.net +fw433.npic.ac.cn +fwbntw.com +fwcs01.casalemedia.com +fwd.redirecthere.com +fwdservice.com +fwg0b0sfig.s.ad6media.fr +fwmrm.net +fwsso.aws.fwmrm.net +fwxmscriszl.bid +fwzmxceibqmuvk.bid +fx-brokers-review.com +fx-sexe.com +fx96.com +fxgallery.com +fxlayer.net +fxnow.ru +fxstra.com +fxstyle.net +fxyc0dwa.com +fyber-marketplace.fyber.com +fyber.com +fynskemedieradmin.adservinginternational.com +fyxm.net +fz.adx1.com +g-content.bid +g-pixel.invitemedia.com +g-wizzads.net +g.0x1f4b0.com +g.3gl.net +g.admedia.com +g.admob.com +g.adnxs.com +g.adspeed.net +g.blogads.com +g.defold.com +g.doubleclick.net +g.dyntrk.com +g.ezoic.net +g.jwpsrv.com +g.msn.com +g.netmng.com +g.p.mybuys.com +g.promosrv.com +g.scorecardresearch.com +g.t.dyntrk.com +g.thinktarget.com +g.tracfone.staging.airfind.com +g.websponsors.com +g.zedo.com +g.zeroredirect.com +g1-globo.com-b4.info +g1-globosaude.com +g1-iad.qualtrics.com +g1.idg.pl +g1.v.fwmrm.net +g1thub.com +g2.112.2o7.net +g2.gumgum.com +g2.us.intellitxt.com +g27ve.adx1.com +g3.us.intellitxt.com +g3t4d5.madison.com +g4.us.intellitxt.com +g4p.grt02.com +g5.s.fwmrm.net +g5.us.intellitxt.com +ga.5.p2l.info +ga.clearbit.com +ga.optmnstr.com +ga87z2o.com +gaae.hit.gemius.pl +gaat.hit.gemius.pl +gaba.hit.gemius.pl +gabe.hit.gemius.pl +gabg.hit.gemius.pl +gabsmash.us.intellitxt.com +gaby.hit.gemius.pl +gacz.hit.gemius.pl +gad.impresionesweb.com +gadget.s1.exacttarget.com +gadget.s4.exacttarget.com +gadgeteer.pdamart.com +gadgets.fosfor.se.intellitxt.com +gadgetsytecnologia.com +gadk.hit.gemius.pl +gadnet.hit.gemius.pl +gads.pubmatic.com +gaeadata.com +gaee.hit.gemius.pl +gaf-company.clean.to +gagaholics.biz +gagasifm.co.za +gagedream.com +gagrasector.ru +gaguu.cn +gahu.hit.gemius.pl +gail.hit.gemius.pl +gainclick.biz +gainco.net +gais.allmanpages.com +gaja79.com +gajime.popunder.ru +gajo.hit.gemius.pl +gakz.hit.gemius.pl +galateiapress.com +galatransmisja.pe.hu +galaxien.com +galaxyerotica.com +galaxyflowers.ru +galaxyjet.com +galb.hit.gemius.pl +galeon.com +galindia.hit.gemius.pl +galleries.asianschoolfuck.com +galleries.chickauditions.com +galleries.dacash.com +galleries.thefattygirls.com +gallery.sharethrough.com +gallery.taboola.com +gallery.vicedata.com +gallys.nastydollars.com +gallysorig.nastydollars.com +galt.hit.gemius.pl +galv.hit.gemius.pl +gam.adnxs.com +gambero3.cs.tin.it +gamblerush.com +gambling-internet.org +gambling-search.com +gambling911.adrevolver.com +gamblingleaders.com +gamblingnerd.com +gamd.hit.gemius.pl +game-advertising-online.com +game-hack.biz +game-mmorpg.net +game-online-video.petrovka.info +game.cdcctv.net +game0516.cdn8-traffic68-server10.top +game300.ru +gameangel.com +gameatlas.com +gamebackyard.com +gameboy.ign.us.intellitxt.com +gamecenter.de +gameconsolerewards.com +gamedayassist.com +gamedayhouse.com +gamedev.us.intellitxt.com +gamefiles.qq494.cn +gamehacks.me +gamehouse.com +gameinaction.com +gameinstallfiles.com +gamelights.ru +gamemine.com +gameofthrones.pro +gameonasia.com +gameplaylabs.com +gameplexcity.com +gamepor.com +gameprimary.com +gamerevoluton.com +gamerextra.com +gamerland.de +gamersad.com +gamerstemple.us.intellitxt.com +gamerz123.com +games-solution.com +games-toys-bonuspath.com +games-toys-free.com +games-toys-rewardpath.com +games.kolossale.ru +games.siliconorchard.com +games.superappbox.com +games4u.ws +gamesalty.com +gamesfly.com +gamesforfriends.org +gamesharck.com +gamesindustry.uk.intellitxt.com +gamesiteads.com +gamesites100.net +gamesites200.com +gamesla.com +gamesprite.me +gamesradar.us.intellitxt.com +gamestopsite.com +gamestrack.com +gamestrick.org +gamesw.oewabox.at +gametorrents.io +gamevalue7.weebly.com +gamevance.com +gamewrath.com +gamezblox.com +gamezmelt.com +gaming-journal.com +gaming-online.petrovka.info +gaming.gamesplayground.com +gaming.md +gamingpartners.org +gamingspark.com +gamini.org +gamismodern.com +gamk.hit.gemius.pl +gammamaximum.com +gamofites.org +gamonig.com +gamroll.com +gamtelfc.gm +gan.doubleclick.net +ganamax.net +gandjaircraft.com +gandon.info +gang-bang.gocunt.com +gang-bang24.com +gang-bangs.nu +gangasperfumes.com +gangbang-party.com +gangbang-videos.com +gangbang.blog-paradijs.com +gangbangafspraak.blog-paradijs.com +gangbangsexpics.com +gangbangsquad-porn.info +gangbangvids.com +ganglia.palebrook.wbinsights.com +gangzalbani.pl +gannett-d.openx.net +gannett-heliosiq.adtechus.com +gannett.demdex.net +gannett.gcion.com +gannett.hb.omtrdc.net +gannettbroadcast.us.intellitxt.com +gannettwisconsin.us.intellitxt.com +gap.112.2o7.net +gap.sp1.convertro.com +gapl.hit.gemius.pl +gar-tech.com +garagegold.net +garatiespelreferendum.com +garciniacambogiaactives.pl +garciniacambogiascience.com +gardeeniacomfortes.com +gardene.ru +gardenhomesrealty.com +gardenweb.us.intellitxt.com +garlena.com +garnirwanda.com +garo.hit.gemius.pl +gars.hit.gemius.pl +garu.hit.gemius.pl +garudaairlines.com +gasasthe.freehostia.com +gask.hit.gemius.pl +gasolina.ml +gastrointestinal.1.p2l.info +gasurvey.gemius.com +gata.ero-advertising.com +gate.hws.ru +gate.hyperpaysys.com +gate.technopolis.kirov.ru +gatehousemedia.122.2o7.net +gateway.122.2o7.net +gateway.dynamicyield.com +gateway.foresee.com +gateway.ifc.inmobi.com +gatewaymedia-d.openx.net +gather.us.intellitxt.com +gator.com +gatr.hit.gemius.pl +gaua.hit.gemius.pl +gavzad.keenspot.com +gay-hotvideo.net +gay.adultgalls.com +gay.cybersteam.com +gay.fix.ac +gay1.nl +gay3gp.xtgem.com +gay3x.net +gayamateurworld.nl +gayanalclub.com +gayatlanta.org +gaybigmovies.com +gaybookworld.com +gayboy.biz +gayboyporn.org +gayboys.nu +gayboysmovies.com +gayboysnude.net +gaybremen.de +gaycabaret.com +gaycamchat.xxx +gaycartoons.info +gaycited.com +gaydates.be +gaydefrance.free.fr +gaydoctorexam.com +gaydvdsblog.com +gaydvdsexvideos.com +gayextra.blog-paradijs.com +gayfacialxxx.com +gayfuck-blog.com +gayxperience.com +gazanew.com +gazeta-pl.site +gazeta.adfox.ru +gazeta.hit.gemius.pl +gazetainfo.pl +gazetteextra.advertserve.com +gazzetta.adman.gr +gb.impresionesweb.com +gbanners.hornymatches.com +gbc.criteo.com +gbc.criteo.net +gbjfc.rsvpgenius.com +gbp.ebayadvertising.triadretail.net +gbr-7stars-tracking.adalyser.com +gbr-carat-tracking.adalyser.com +gbr-mbww-tracking.adalyser.com +gbr-smv-tracking.adalyser.com +gbr-tbh-tracking.adalyser.com +gbscript.com +gc.gcl.ru +gcads.osdn.com +gcdn.2mdn.net +gcdn.ssacdn.com +gcir.gannett-tv.com +gcirm.argusleader.com +gcirm.argusleader.gcion.com +gcirm.battlecreekenquirer.com +gcirm.burlingtonfreepress.com +gcirm.centralohio.com +gcirm.centralohio.gcion.com +gcirm.cincinnati.com +gcirm.citizen-times.com +gcirm.clarionledger.com +gcirm.coloradoan.com +gcirm.courier-journal.com +gcirm.courierpostonline.com +gcirm.customcoupon.com +gcirm.dailyrecord.com +gcirm.delawareonline.com +gcirm.democratandchronicle.com +gcirm.desmoinesregister.com +gcirm.detnews.com +gcirm.dmp.gcion.com +gcirm.dmregister.com +gcirm.dnj.com +gcirm.flatoday.com +gcirm.gannett-tv.com +gcirm.gannettnetwork.com +gcirm.greatfallstribune.com +gcirm.greenvilleonline.com +gcirm.greenvilleonline.gcion.com +gcirm.honoluluadvertiser.gcion.com +gcirm.idahostatesman.com +gcirm.idehostatesman.com +gcirm.indystar.com +gcirm.injersey.com +gcirm.jacksonsun.com +gcirm.laregionalonline.com +gcirm.lsj.com +gcirm.montgomeryadvertiser.com +gcirm.muskogeephoenix.com +gcirm.news-press.com +gcirm.newsleader.com +gcirm.ozarksnow.com +gcirm.pensacolanewsjournal.com +gcirm.press-citizen.com +gcirm.pressconnects.com +gcirm.rgj.com +gcirm.sctimes.com +gcirm.stargazette.com +gcirm.statesmanjournal.com +gcirm.tallahassee.com +gcirm.tennessean.com +gcirm.thedailyjournal.com +gcirm.thedesertsun.com +gcirm.theithacajournal.com +gcirm.thejournalnews.com +gcirm.theolympian.com +gcirm.thespectrum.com +gcirm.tucson.com +gcirm.wisinfo.com +gcirm2.indystar.com +gcounter.hosting4u.net +gd.geobytes.com +gd1.doubleclick.net +gd1.mookie1.com +gd10.doubleclick.net +gd11.doubleclick.net +gd12.doubleclick.net +gd13.doubleclick.net +gd14.doubleclick.net +gd15.doubleclick.net +gd16.doubleclick.net +gd17.doubleclick.net +gd18.doubleclick.net +gd19.doubleclick.net +gd2.doubleclick.net +gd20.doubleclick.net +gd21.doubleclick.net +gd22.doubleclick.net +gd23.doubleclick.net +gd24.doubleclick.net +gd25.doubleclick.net +gd26.doubleclick.net +gd27.doubleclick.net +gd28.doubleclick.net +gd29.doubleclick.net +gd3.doubleclick.net +gd30.doubleclick.net +gd31.doubleclick.net +gd4.doubleclick.net +gd5.doubleclick.net +gd7.doubleclick.net +gd8.doubleclick.net +gd9.doubleclick.net +gde-default.hit.gemius.pl +gde.adocean.pl +gdebg.hit.gemius.pl +gdecz.hit.gemius.pl +gdeee.hit.gemius.pl +gdeil.hit.gemius.pl +gdelt.hit.gemius.pl +gdelv.hit.gemius.pl +gders.hit.gemius.pl +gdesk.hit.gemius.pl +gdetr.hit.gemius.pl +gdeua.hit.gemius.pl +gdpr-dev.demandbase.com +gdpr-prod.demandbase.com +gdpr-requests.utils.appdynamics.com +gdpr-service.herokuapp.com +gdpr-stg.demandbase.com +gdpr.branch.io +gdpr.pushspring.com +gdtmdc.gaeadata.com +gdyn.cnn.com +gdyn.cnngo.com +gdyn.nascar.com +gdyn.nba.com +gdyn.trutv.com +gdyn.veryfunnyads.com +ge-0-0-1-edge1.sc9.admob.com +ge-0-0-43-crs1.sc9.admob.com +geek.us.intellitxt.com +geeksdrivesavers.com +geekstogo.us.intellitxt.com +geil.alon3.tk +geile-maedchen.cl.tc +geile-moesen.cl.tc +geile-nippel.cl.tc +geile-omas24.com +geile-paerchen.cl.tc +geile-schlampen.cl.tc +geile-sexkontakte.cl.tc +geile-sexkontakte.ve.tc +geile-sexshows.cl.tc +geizhals.oewabox.at +gekko.coinnebula.com +gem.pl +gemadhu.hit.gemius.pl +gemini.yahoo.com +gemius.mgr.consensu.org +gemius.pl +gemverify.com +gen-hydrocodone.polybuild.ru +gen2server.com +general.visualdna-stats.com +generalchemicalsupply.com +generalmediaadhu.hit.gemius.pl +generation-nt.fr.intellitxt.com +generationgirls.com +generator.qa-dest.imprev.net +generatorkodow.hpu.pl +genericdrugsinc.ru +genericlowlatencyasiodriverhq.aircus.com +genericsrxgroup.com +genericviagrasildenafiled.net +generousdeal-a.akamaihd.net +genetree.112.2o7.net +genetworx.com +genforumgenealogy.com +genie2u.com +geniusdisplay.com +geniuslab.ru +genmay.us.intellitxt.com +genration.ml +genrepet.se +genrugby.com +genuinetitlemlsettlment.com +genuss-massage.de +genvallaif.se +genymotion-001.infra-east-1.appboy.com +genymotion-001.staging-east-1.appboy.com +geo.airfind.com +geo.automatad.com +geo.connexionsecure.com +geo.crtracklink.com +geo.deepmetrix.com +geo.digitalpoint.com +geo.eu.h-bid.com +geo.gexo.com +geo.gorillanation.com +geo.hyperlinksecure.com +geo.interia.pl +geo.jetpackdigital.com +geo.moatads.com +geo.nbcsports.com +geo.offermatica.com +geo.precisionclick.com +geo.qualaroo.com +geo.query.yahoo.com +geo.safelinktracker.com +geo.sanoma.fi +geo.us.h-bid.com +geo.widdit.com +geo.xtify.com +geo.xxxblackbook.com +geo.yad2.co.il +geo.yahoo.com +geo.ziffdavis.com +geo200.airfind.com +geo500.airfind.com +geoaddicted.net +geoads.com +geoads.eurorevenue.com +geoads.osdn.com +geoadserving.coffeetree.info +geoapi.kargo.com +geoapi.production.us-east-1.kops.kargo.com +geoapi.staging.us-east-1.kops.kargo.com +geoapi123.appspot.com +geobanner.adultfriendfinder.com +geobanner.friendfinder.com +geobanner.getiton.com +geobanner.passion.com +geobanner.seniorfriendfinder.com +geobeacon.ign.com +geocdn.unityads.unity3d.com +geocounter.net +geofence.sys.miui.com +geoffshannon.com.au +geoip-db.com +geoip-lookup.vice.com +geoip-origin.insnw.net +geoip.edagames.com +geoip.p24.hu +geoip.securitetotale.com +geoip.thedailymeal.com +geoloc11.geovisite.com +geoloc12.geovisite.com +geoloc13.geovisite.com +geoloc14.geovisite.com +geoloc16.geovisite.com +geoloc17.geovisite.com +geoloc2.geovisite.com +geoloc4.geovisite.com +geolocation.t-online.de +geolookup.swrve.com +geonology.com +geopolice.com +georgewbush.112.2o7.net +georgewbushcom.112.2o7.net +georgiababes.com +geoservice.curse.com +geosign.112.2o7.net +geovisite.com +geoweb.e-kolay.net +gepzz.pcloadletter.quhu.info +ger.cdn.survey.medallia.com +gerla.ru +german-porn-clips.com +german-porn-tube.com +germanfreiporno.com +germanisabel.com +germanlis.com.gr +germanmoviebabes.com +germanwinge.de +germanxtube.com +germes-trans.com +germetiki.com.ua +gernewt.info +geros.org +gerrit-staging.corp.mixpanel.com +gerrit.corp.mixpanel.com +gerronnimo.free.fr +gesanet.net +geschlecht.nu +gese.nu +geseduma.es +gesgc.com +gesika.info +gespensterwelt.de +get-answers-fast.com +get-avast.com +get-quadcleaner.com +get.amplitude.com +get.appsee.com +get.appsflyer.com +get.backtrace.io +get.hitbox.com +get.mirando.de +get.mycounter.com.ua +get.mycounter.ua +get.newrelic.com +get.qualtrics.com +get.webxmr.com +get.whitesmoke.com +get.x-link.pl +getacool100.com +getacool500.com +getacoollaptop.com +getacooltv.com +getadvancenow.com +getafreeiphone.org +getagiftonline.com +getambassador.com +getapussy.com +getbynow.com +getcarisoprodol.polybuild.ru +getcashloansnowhere.com +getclicky.com +getcoding.advertising.com +getcryptotab.com +getdataback.pl +getdatanetukscan.info +getfatburn.com +getfilesfrom.net +getgamecheats.com +getiton.com +getleads.pl +getlink.pw +getmailcounter.com +getmyads.com +getmyads24.com +getmyfreebabystuff.com +getmyfreegear.com +getmyfreegiftcard.com +getmyfreelaptop.com +getmyfreelaptophere.com +getmyfreeplasma.com +getmylaptopfree.com +getmynumber.net +getmyplasmatv.com +getrank.net +getrockerbox.com +getsearchlist.com +getsitecontrol.com +getsoftnow.smallandprecise2upgradesnew.review +getsoftnow.smallandprecise2upgradingnew.review +getspecialgifts.com +getstatistics.se +gettate.date +gettate.faith +gettate.racing +gettyimages.122.2o7.net +getupdate.thebiggestandmoststabletocontentsafe.bid +getwisdom.io +getyour5kcredits0.blogspot.com +getyourfreecomputer.com +getyourfreetv.com +getyourgiftnow2.blogspot.com +getyourgiftnow3.blogspot.com +gezinti.com +gflinks.industrybrains.com +gfx.webmasterprofitcenter.com +gg.adocean.pl +gg.hit.gemius.pl +gglcash4u.info +ghacks.de.intellitxt.com +ghalibaft.com +ghm_bulgaria.hit.gemius.pl +ghmbg.hit.gemius.pl +ghmhu.hit.gemius.pl +ghmme.hit.gemius.pl +ghmpl.hit.gemius.pl +ghmrs.hit.gemius.pl +ghmtr.hit.gemius.pl +ghostboard.io +ghostbook.siliconorchard.com +giantdsp-env-2.us-west-2.elasticbeanstalk.com +giants.yourzip.co +giddycoat.com +gifastcompanycom.112.2o7.net +gifspics.com +gift-cards.co.pl +gift-today85.online +giftcardchallenge.com +giftcardsurveys.us.com +giftrewardzone.com +gifts-flowers-rewardpath.com +giftscom.122.2o7.net +giftsofsnowdown.com +giftwine.ru +giftxxx.com +giga.logs.roku.com +gigababes.dk +gigabitdownloads.com +gigaclips.com +gigamon.sc.omtrdc.net +gigamon.tt.omtrdc.net +gigantictits.org +gigaonclick.com +gigaporno.biz +gigaxchange.com +gigistar.tv +gigoloioslo.tk +gigup.net +gigwise.us.intellitxt.com +gilbertbanda.net +gillout.oewabox.at +gilutech.com +gilvir.free.fr +gilvision.com +gimail.top +gimg.baidu.com +gimmethatreward.com +gin-gliders.com +ginamature.com +gingert.net +ginnyphillipsphotography.com +giomovies.com +giraffebank.com +girl-es.com +girl4you.net +girlgamerdaily.com +girlownedbypolicelike.blogspot.com +girls.for.free.fr +girlsaskguys.us.intellitxt.com +girlsfeet1.free.fr +girlsfucking.nu +girlsgonebad.biz +girlshavefun.biz +girrrly.com +gist-assets.github.exacttarget.com +gist-raw.github.exacttarget.com +gist.github.exacttarget.com +git-pages.adotmob.com +git.adotmob.com +git.corp.mparticle.com +git.dev.fwmrm.net +git.drawbrid.ge +git.extremereach.com +git.lisnr.com +git.petametrics.com +gitgrub.pro +github.exacttarget.com +gitlab.adotmob.com +gitlab.gitlab.gcp.datamind.ru +gitlab.vuble.tv +giu9aab.bid +givememyremote.us.intellitxt.com +giveskincs.nd.pl +gizmo-s.sizmek.com +gizmo.sizmek.com +gj.applog.uc.cn +gj.mmstat.com +gj.track.uc.cn +gjapplog.uc.cn +gjenkins.placed.com +gjfastcompanycom.112.2o7.net +gjincscobleizer.112.2o7.net +gjtrack.ucweb.com +gk.rts.sparkstudios.com +gkkzngresullts.com +gkueche.oewabox.at +gl-7001dc16.curalate.com +glados.urbanairship.com +glancecdn.net +glasslytics.com +glb.adtechus.com +glb1.perimeterx.net +glbad.adtech.de +glbad.adtechjp.com +glbad.adtechus.com +glbimg.adtech.de +glbimg.adtechus.com +glean.pop6.com +glen-mhor.com +glenm.mtxcapital.com +glenroyvic.com +glicol.kz +glinkss.com +glissbio.com +glitter.services.disqus.com +glize.theappgrader.com +global-ics.co.za +global-promotions.internationalredirects.com +global.appsflyer.com +global.crypto.csgocpu.com +global.ekmpinpoint.com +global.event.prod.bidr.io +global.exacttarget.com +global.mgr.consensu.org +global.msads.net +global.msmtrakk03a.com +global.px.quantserve.com +global.returnpath.net +global.ymtrack.com +globalaidsale.ru +globalapi.ad.xiaomi.com +globalcharge.com +globalcns.com +globalgutz.com +globalismedia.com +globalmagazine24.eu +globalnetworkanalys.com +globalops.exacttarget.com +globalsight.adx1.com +globaltakeoff.net +globalwebads.com +globatur.ru +globe7.com +globeontehweb.com +globetrotting-culture.ru +globile.co +globus-inter.com +globus.virt.exacttarget.com +globusdate.com +glopages.ru +gloriajeans.de +glosowanie.ujm.pl +glossysense.com +glove-love.com +glovefight.com +glsenpgh.org +gm.demdex.net +gm.mmstat.com +gm.preferences.com +gm.touchclarity.com +gmads.mookie1.com +gmads.net +gmchevyapprentice.112.2o7.net +gmdtrk.com +gmf.celebrus.com +gmglobalt3sites.112.2o7.net +gmgmacfs.112.2o7.net +gmgmacmortgage.112.2o7.net +gmgmcom.112.2o7.net +gmgoodwrench.112.2o7.net +gmgoodwrenchdmaprod.112.2o7.net +gmhummer.112.2o7.net +gms1.ru +gmtdmp.mookie1.com +gmx.oewabox.at +gne8.com +gneill.com +gninstruments.com.au +gnptijuana.com +gnrdomimplementation.com +gntbcstglobal.112.2o7.net +gntbcstkare.112.2o7.net +gntbcstksdk.112.2o7.net +gntbcstkthv.112.2o7.net +gntbcstkusa.112.2o7.net +gntbcstkxtv.112.2o7.net +gntbcstwbir.112.2o7.net +gntbcstwcsh.112.2o7.net +gntbcstwfmy.112.2o7.net +gntbcstwkyc.112.2o7.net +gntbcstwlbz.112.2o7.net +gntbcstwltx.112.2o7.net +gntbcstwmaz.112.2o7.net +gntbcstwtlv.112.2o7.net +gntbcstwtsp.112.2o7.net +gntbcstwusa.112.2o7.net +gntbcstwxia.112.2o7.net +gntbcstwzzm.112.2o7.net +gntenergy.com +gnuetella.com +go-clicks.de +go-free-gifts.com +go-gal.com +go-in-search.net +go-mpulse.net +go-quicky.com +go-rank.de +go.33across.com +go.accmgr.com +go.ad1data.com +go.ad2up.com +go.ad2upapp.com +go.adbiq.com +go.adee.bbelements.com +go.adinfuse.com +go.adjust.com +go.adlt.bbelements.com +go.adlv.bbelements.com +go.admulti.com +go.adnet.bbelements.com +go.adversal.com +go.affec.tv +go.amplitude.com +go.aniview.com +go.arbo.bbelements.com +go.arbopl.bbelements.com +go.arboru.bbelements.com +go.automatad.com +go.aweber.com +go.bb007.bbelements.com +go.bestmobiworld.com +go.biz +go.branch.io +go.bronto.com +go.conversionmasters.com +go.corp.mixpanel.com +go.curalate.com +go.cz.bbelements.com +go.data1rtb.com +go.deliverymodo.com +go.demo.pardot.com +go.drift.com +go.driftt.com +go.eu.bbelements.com +go.evolutionmedia.bbelements.com +go.ezoic.net +go.fullstory.com +go.game2me.cn +go.gba.bbelements.com +go.goldbachpoland.bbelements.com +go.goroost.com +go.idmnet.bbelements.com +go.idnes.bbelements.com +go.ihned.bbelements.com +go.intact.bbelements.com +go.jetswap.com +go.kargo.com +go.kochava.com +go.lfstmedia.com +go.lotech.bbelements.com +go.marketo.com +go.megabanners.cf +go.mobisla.com +go.mobpartner.mobi +go.mobtrks.com +go.mobytrks.com +go.mooncklick.com +go.mparticle.com +go.oclaserver.com +go.oclasrv.com +go.onclasrv.com +go.oneund.ru +go.padsdel.com +go.padsdelivery.com +go.padstm.com +go.paradym.com +go.pl.bbelements.com +go.playoosh.com +go.pol.bbelements.com +go.pub2srv.com +go.realvu.net +go.redirectingat.com +go.searchlock.com +go.sonobi.com +go.spaceshipads.com +go.stirshakead.com +go.straightresults.com +go.taboola.com +go.tapad.com +go.tracksz.co +go.trkreward.com +go.urbanairship.com +go.valassisdigital.com +go.verymuchad.com +go.viewbix.com +go.vrvm.com +go.xhamsterlive.com +go.yieldmo.com +go.youlamedia.com +go1.aniview.com +go2.hit.gemius.pl +go2.mercy.ga +go2.qualtrics.com +go2affise.com +go2album.com +go2cloud.org +go2jump.org +go2myspace.com +go777site.com +goal.us.intellitxt.com +goandsmile.pl +goat.cx +goatminer.com +goatpiss.com +goatse.bz +goatse.ca +goatse.cx +goatse.ru +goatsegirl.org +goautofinance.com +goawos.com +gob.curalate.com +gobba.myeffect.net +gobettygo.com +gobusinessloan.com +gobuyersupport.rubiconproject.com +gocarisoprodol.polybuild.ru +gocitytext.com +goclick.com +godaddy.sp1.convertro.com +goddessvip.com +godegodage.com +godesses.nu +godfather3movies.blogs-blogs.com +godfatherallparts.blogs-blogs.com +godmode-traders.de +godoc.corp.mixpanel.com +godrix.com +godsadvice.com +goebook.co.kr +gofem.oewabox.at +goforexvps.com +gofreegifts.com +gofun.info +gogalleryawesome.com +gogameportal.com +gogetgorgeous.com +goggl.com +goggle.com +gogglwe.de +gogirl.info +gogodot.com +gogole.com.hk +gogps.me +goingplatinum.com +gojiberry500.pl +gojnox.boxtomarket.com +gokano.com +goku.brightcove.com +gold.adroll.com +goldadpremium.com +goldbach-targeting.ch +goldbach.hit.gemius.pl +goldbye.vicp.net +goldenmark.com +goldfish.svc.insnw.net +goldnova.crypto.csgocpu.com +goldoffer.online +golds.lp.mydas.mobi +goldsaver.pl +goldstats.com +golem.de.intellitxt.com +gom-player.gooofull.com +gondolagnome.com +gonintendo.us.intellitxt.com +gonzogrape.gumgum.com +goo.freelogs.com +goobbe.com +goodbizez.com +goodblock.gladly.io +goodbookbook.com +goodkino.biz +goodmenonthego.com +goodsblock.marketgid.com +goodsurprises.top +goody-garage.com +goodyear.122.2o7.net +goodyield.com +googfle.com +google-analytics.com +google-docs.info +google-docs.org +google.tucows.com +googleads.g.doubleclick.net +googleads2.g.doubleclick.net +googleads4.g.doubleclick.net +googleadservices.com +googleanalytcs.com +googlenews.xorg.pl +googlesyndication.com +googletagservices.com +googlew.com +googlewordpad.info +googlre.com +googlus.com +googlwe.com +goolegames.com +goolges.com +gooqleapi.com +gopeds.com +goplayz.com +gopogle.com +goredirect.party +gorensin.info +gorgeousground.com +gorillanation.us.intellitxt.com +gosciniec-paproc.pl +goska.siol.net +gossipcenter.us.intellitxt.com +gossipmiser.com +gossiponthis.us.intellitxt.com +gossipteen.us.intellitxt.com +gostats.com +gostats.ir +gostats.pl +gostats.ro +gostats.ru +got2goshop.com +gotagy.adk2x.com +goto.mystreamdelivery.xyz +goto.trafficmultiplier.com +gotomontenegro.net +gotorussia.com +gotowka-doreki.eu +gotowkatutaj.pl +gotoyoutube.us +gotporn.info +gottabemobile.us.intellitxt.com +gottensikisx.net +gotwebsite1.com +gourcy.altervista.org +gourmetgiftbaskets.112.2o7.net +gov.aniview.com +gov.appdynamics.com +gov.yanao.ru +gov1.qualtrics.com +gov1.siteintercept.qualtrics.com +govahoyuge.itup.pw +govops.appdynamics.com +govpro.us.intellitxt.com +gowin7.com +goxmrminer.com +gozatar.com +gozing.directtrack.com +gp.dejanews.com +gpaper104.112.2o7.net +gpaper105.112.2o7.net +gpaper107.112.2o7.net +gpaper108.112.2o7.net +gpaper109.112.2o7.net +gpaper110.112.2o7.net +gpaper111.112.2o7.net +gpaper112.112.2o7.net +gpaper113.112.2o7.net +gpaper114.112.2o7.net +gpaper115.112.2o7.net +gpaper116.112.2o7.net +gpaper117.112.2o7.net +gpaper118.112.2o7.net +gpaper119.112.2o7.net +gpaper120.112.2o7.net +gpaper121.112.2o7.net +gpaper122.112.2o7.net +gpaper123.112.2o7.net +gpaper124.112.2o7.net +gpaper125.112.2o7.net +gpaper126.112.2o7.net +gpaper127.112.2o7.net +gpaper128.112.2o7.net +gpaper129.112.2o7.net +gpaper131.112.2o7.net +gpaper132.112.2o7.net +gpaper133.112.2o7.net +gpaper138.112.2o7.net +gpaper139.112.2o7.net +gpaper140.112.2o7.net +gpaper141.112.2o7.net +gpaper142.112.2o7.net +gpaper144.112.2o7.net +gpaper145.112.2o7.net +gpaper147.112.2o7.net +gpaper149.112.2o7.net +gpaper151.112.2o7.net +gpaper154.112.2o7.net +gpaper156.112.2o7.net +gpaper157.112.2o7.net +gpaper158.112.2o7.net +gpaper162.112.2o7.net +gpaper164.112.2o7.net +gpaper166.112.2o7.net +gpaper167.112.2o7.net +gpaper169.112.2o7.net +gpaper170.112.2o7.net +gpaper171.112.2o7.net +gpaper172.112.2o7.net +gpaper173.112.2o7.net +gpaper174.112.2o7.net +gpaper176.112.2o7.net +gpaper177.112.2o7.net +gpaper180.112.2o7.net +gpaper183.112.2o7.net +gpaper184.112.2o7.net +gpaper191.112.2o7.net +gpaper192.112.2o7.net +gpaper193.112.2o7.net +gpaper194.112.2o7.net +gpaper195.112.2o7.net +gpaper196.112.2o7.net +gpaper197.112.2o7.net +gpaper198.112.2o7.net +gpaper202.112.2o7.net +gpaper204.112.2o7.net +gpaper205.112.2o7.net +gpaper212.112.2o7.net +gpaper214.112.2o7.net +gpaper219.112.2o7.net +gpaper223.112.2o7.net +gpapercareer.112.2o7.net +gpapermom104.112.2o7.net +gparted.fr +gpe.midasplayer.com +gpu4001.ds.ams1.inmobi.com +gpu4001.ds.ev1.inmobi.com +gr.adserver.yahoo.com +gr.linkwi.se +grab.nastydollars.com +grabberporno.com +grabbersex.com +grabbit-rabbit.com +grabfile.co +grabraeuber.de +grabsnow.com +grabtrk.com +grace-teen-lesbians-mara.blogomer.com +gracecore.com +graceevents.org +gracefulsock.com +grach.biz +grafana.demandbase.com +grafana.dmx.districtm.io +grafana.k8s-test.fiksu.com +grafana.msas.media.net +grafana.prd.fyber.com +grafana.prod.us-east-1.gcs.kargo.com +grafana.xmrpool.net +grafana.yieldmo.com +graffcolor.net +grafit.pl +grafix.xxxcounter.com +grafpnt.com +graft.crypto-webminer.com +graft.monerise.com +graftpool.ovh +grahainterieur.com +grainedesexe.com +gramombird.com +grand-chlen.ru +grandesbottees.com +grandgirl.com +grandioseguide.com +grandonmedia.com +grandprizecaterers.com +grandtraf.com +grannieslist.com +granny-phone-sex.com +granny-sex.nl +grannyjoin.com +grannyporn.name +grannyporno.net +grannypussy.blogspot.com +grannytopporn.com +grapeshot.co.uk +grapeshot.kargo.com +graph.accountkit.com +graph.instagram.com +graph.m-freeway.com +graphics.adultfriendfinder.com +graphics.medleyads.com +graphics.nastydollars.com +graphics.pop6.com +graphics.streamray.com +graphics1.sextracker.com +graphics2.sextracker.com +graphicsolutionsok.com +graphicwe.org +graphid.com +graphite.drawbrid.ge +graphite.insnw.net +graphite.vpn.insnw.net +graphly.io +grappigeplaatjes.nl +grasswalk.com +gratification.nu +gratis-livechat.com +gratis-pc.de +gratis-porno.biz +gratis-pornos.org +gratis-sex-zoeken.nl +gratis-sexkontakte.com +gratis-tgp.com +gratis.nl.sms.sms13.de +gratis.nom.es +gratis.sms.senden.sms13.de +gratisbacklink.de +gratiscamsex.dk +gratiscontacten.nl +gratisgeil.nl +gratisgeilesexfilms.com +gratisman.com +gratisporn.nl +gratispornokijken.be +gratispornoplaatjes.com +gratissexfilme.info +gratissexfilmpjes.eu +gratistienersexfilms.com +gratisweb.com +gratkapl.adocean.pl +gravitron.chron.com +gravityexp.com +gravygirls.com +graylog.ops.ams1.inmobi.com +graylog.ops.dfw1.inmobi.com +graylog.ops.dfw2.inmobi.com +graylog.ops.pek1.inmobi.com +graytv.us.intellitxt.com +greasypalm.com +great-comics.com +great-health.ru +great-voipphoneoption.com +greatamericansexdiet.com +greatarcadehits.com +greatest-store.com +greatfind-a.akamaihd.net +greatfireoflondon.org.uk +greatgrace.ru +greatlakessurveillance.com +greatmacsoft.tech +greatpussies.com +greatsex.nu +greatsexcontent.dk +greatshoesever.com +greatsimplicity.com +greatwork.info +greatzip.com +gredinatib.info +gredinatib.org +greedymouth.com +green-guy.com +green-tea.tv +green.erne.co +greenbarleyplus.pl +greenbird.info +greencircleart.com +greenindex.dynamic-dns.net +greeninst.com +greenpanel.corp.mixpanel.com +greenshot.fr +greerlies.pro +greetzebra.com +greev.randbinternationaltravel.com +gremimedia.pl +grendizer.biz +grey.soju.openx.net +greyinstrument.com +greystripe.com +grfx.mp3.com +grid.bidswitch.net +gridcash.net +gridiogrid.com +grmtech.net +grooveshark.fr +groovylover.nu +gros-seins.org +grosirkecantikan.com +gross-kleeberg.de +grossechattex.free.fr +grosses-femmes-nues.com +group11.iperceptions.com +groupfetish.com +groupielovedvd.com +groupm.com +groupmoney.ru +grouppics.allmanpages.com +groupsexxx.com +grove-p.shopcurbside.com +grove-s.shopcurbside.com +grove.shopcurbside.com +growingconfidence.org +growmyfunds.ca +growth.adroll.com +growth.api.driftt.com +growth.branch.io +growth.sumo.com +grp.dynamicyield.com +grtb-nj.lfstmedia.com +grunerandjahr.112.2o7.net +grvoflsctenq.bid +grz67.com +gs.spylog.ru +gs.wixapps.net +gs1.idsales.co.uk +gsaranyjanos.ro +gsasearchengineranker.pw +gsasearchengineranker.site +gsasearchengineranker.space +gsasearchengineranker.top +gsasearchenginerankerdiscount.com +gscontxt.net +gscounters.eu1.gigya.com +gscounters.gigya.com +gscounters.us1.gigya.com +gserv.cneteu.net +gserv.zdnet.co.uk +gsf-cf.softonic.com +gsicpbs.112.2o7.net +gslb.demdex.net +gslbeacon.lijit.com +gsm-mobile-phone.beesearch.info +gsmarena.us.intellitxt.com +gsmtop.net +gspro.adocean.pl +gspro.hit.gemius.pl +gtb19.acecounter.com +gtb5.acecounter.com +gtcc1.acecounter.com +gtg02.bestsecurepractice.com +gtlt.hit.gemius.pl +gtlv.hit.gemius.pl +gtm.intercom.io +gtmedia.us.intellitxt.com +gtop100.com +gtp1.acecounter.com +gtp16.acecounter.com +gtradersoft.com +gts-ads.twistbox.com +gtsdk.batmobi.net +gttlj.adx1.com +gttr.hit.gemius.pl +gu.5.p2l.info +gu.dyntrk.com +guanjia.baidu.com +guannan.3322.net +guaranty.com.cn +guardedgovernor.com +guardedschool.com +guardianlv.us.intellitxt.com +guce.adaptv.advertising.com +guce.adtech.de +guce.adtechjp.com +guce.adtechus.com +guce.advertising.com +guce.convertro.com +guce.tacoda.at.atwola.com +guerria-skateboard-tommy.tabrays.com +guest.adultfriendfinder.com +guestportal.rubiconproject.com +guestwifi.marketo.net +gug.ku6cdn.com +guiaconsumidor.com +guide2poker.com +guided.ss-omtrdc.net +guides.clearbit.com +guildofangels.net +guitarbelieve.com +guj.122.2o7.net +gulf-industrial.com +gulf.moneroocean.stream +gulli.de.intellitxt.com +gum.criteo.com +gumgum.com +gumpolice.com +gunggo.com +guptamedianetwork.com +gurde.tourstogo.us +gurgle.zdbb.net +guru.sitescout.netdna-cdn.com +guru3d.us.intellitxt.com +guruads.de +gustaver.ddns.ne +gustaver.ddns.net +guthyrenker.112.2o7.net +guthyrenker.tt.omtrdc.net +guyscards.com +gvc.vn +gw.firesub.pl +gw.flurry.com +gw.localytics.com +gw.youmi.net +gw.zedo.com +gw003.lphbs.com +gwa.lphbs.com +gwallet.com +gwb.lphbs.com +gwc.lphbs.com +gwd.lphbs.com +gwmtracker.com +gwmtracking.com +gwp.nuggad.net +gwynethpaltrow.ca.tt +gx-in-f109.1e100.net +gxplugin.com +gyboo.cruisingsmallship.com +gylra.cruisingsmallship.com +gyros.es +gyrotrash.com +gz2.bbsoldes.fr +gz7.adx1.com +gzyuhe.com +gzyuxiao.com +h-adachi.org +h-adashx.ut.taobao.com +h-adashx4ae.ut.taobao.com +h-afnetwww.adshuffle.com +h-api-jpmc-even.online-metrix.net +h-api-jpmc.online-metrix.net +h-api-ms.online-metrix.net +h-api-sb.online-metrix.net +h-api-test.online-metrix.net +h-api.online-metrix.net +h-bid.com +h-fail-test.online-metrix.net +h-homedepot.online-metrix.net +h-intuit.online-metrix.net +h-m-s-babes.blogomer.com +h-sdk.online-metrix.net +h-villamotel.com +h-visa2.online-metrix.net +h-walmart.online-metrix.net +h.admob.com +h.atdmt.com +h.hollywood.com +h.nexac.com +h.online-metrix.net +h.ppjol.com +h.spill.com +h.verticalscope.com +h.waudit.cz +h.zedo.com +h.zeroredirect.com +h06.hotrank.com.tw +h0rnd0g.popunder.ru +h0t.free.fr +h1.fastly-insights.com +h1.msn.com +h1.ripway.com +h1317070.stratoserver.net +h1666015.stratoserver.net +h2.fastly-insights.com +h21.ru +h2monline.com +h33c.com +h62-213-20-50.ip.syzran.ru +h78xb.pw +h81.org +h8vzwpv.com +haapamaenluomu.fi +haartezenglish.redirectme.net +habermetre.com +hack.in.backtrace.io +hackairtel.tk +hackathon.dynamicyield.com +hackcandycrushsaga.com +hackearya.com +hackedgadgets.us.intellitxt.com +hackershell.org +hackerz.ir +hackhero.tk +hackidogier.pl +hackidomsp.blogspot.com +hacking-facebook.com +hacking-tools.info +hacking.mysteria.cz +hackkitarena.tk +hackmyaccount.com +hacktougroup.ru +hades.bubblestat.com +hadik.info +haedong.es.kr +haelen.com +haevern.de +hahashka.ru +hai2u.com +hair-dos.resourcesarchive.com +hairboutique.us.intellitxt.com +hairy.nichetoplist.com +hairymen.allmanpages.com +hairysearchengine.com +hairywomenvideos.net +hakerzy.net +hakuba.janis.or.jp +halem.eu +halfords.ukrpts.net +hallaert.online +halleberrynude.ca.tt +hallmarkibmcom.112.2o7.net +hallmarkteam.com +hallwaystreetsigns.com +halodzwonek.pl +halopozyczka.pl +hamburg-tonight.de +hamburggirls.de +hamedori.org +hamilton.ca +hamletdental.dk +hammerhearing.com +hamptonapartmentsgy.com +hamptonoaks.ca +hamsatours.com +hanaos.co.kr +handbag.uk.intellitxt.com +handbagcom.skimlinks.com +handbl.ivwbox.de +handelbot.com +handelsblatt.met.vgwort.de +handelsblatt01.webtrekk.net +handler.fiksu.com +handlerhackz.tk +handyarchive.com +handyfield.com +hanulsms.com +haouzy.info +hapjes-maken.eu +happybang.net +happycam.net +happyclipz.de +happycrazy.weboldala.net +happydiscountspecials.com +happygays.de +happyhour.dk +happytails.getambassador.com +harconsumer.112.2o7.net +hardcorepornparty.com +hardcoreware.us.intellitxt.com +hardforum.us.intellitxt.com +hardhat.drawbrid.ge +hardocp.us.intellitxt.com +hardtofindmilk.com +hardware.metrics.mozilla.com +hardwaregeeks.us.intellitxt.com +hardwarezone.us.intellitxt.com +harlandclarke.d1.sc.omtrdc.net +harmony-central.us.intellitxt.com +harmonyhollow.net +haroldcdn.hlserve.com +harpo.122.2o7.net +harrahs.112.2o7.net +harrahscom.112.2o7.net +harrenmedia.com +harrenmedianetwork.com +harshwhispers.com +hartim.com +harvest.adgardener.com +harvest.surge.sh +harvest176.adgardener.com +harvest284.adgardener.com +harvest285.adgardener.com +has1.midasplayer.com +hash.minexmr.stream +hashforcash.us +hashing.win +hashto.cash +hashvault.pro +haso.pubmatic.com +hasoffers.disqus.com +hata.ero-advertising.com +hatcalter.com +hatevery.info +hathor.eztonez.com +hatrecord.ru +havakhosh.com +havamedia.net +havemeforfree.com +haveuheard.us.intellitxt.com +havijrat.zapto.org +haymarketbusinesspublications.122.2o7.net +haynet.adbureau.net +hb-analytics.hotstar.com +hb-api.omnitagjs.com +hb-api.omtrdc.net +hb-config.vntsm.com +hb-fa-1.omtrdc.net +hb-fa-stage.omtrdc.net +hb.1rx.io +hb.adx1.com +hb.docs.msas.media.net +hb.gammaplatform.com +hb.kumma.com +hb.omtrdc.net +hb.sekindo.com +hb.undertone.com +hb.vntsm.com +hbads.eboz.com +hbadz.eboz.com +hbeuwgqt.ru +hbevents.1rx.io +hbogo.com.102.122.2o7.net +hbonow.com.ssl.sc.omtrdc.net +hbopenbid.pubmatic.com +hbopenbid88000nf.pubmatic.com +hc.baidu.com +hc.tags.newscgp.com +hc2.humanclick.com +hc2izgmnmnqs.lwfjd.today +hcg82f2b.com +hchrmain.112.2o7.net +hd.serial.h2g.pl +hdl1.midasplayer.com +hdmovies.pl +hdporium.com +hdseriale.pl +header.mathtag.com +headless.ebkfwd.com +health-beauty-rewardpath.com +health-beauty-savingblvd.com +health-line.me +health.msnbc.us.intellitxt.com +healthbeautyncs.com +healthclicks.co.uk +healthgrades.112.2o7.net +healthination.122.2o7.net +healthybloodpressure.info +heap.com +heapanalytics.com +heaptickets.com +hearstdigital.122.2o7.net +hearstmagazines.112.2o7.net +hearstugo.112.2o7.net +heartbeat-uploads.fiksu.com +heartbeats.omtrdc.net +heartrevitalized.com +heat-gallery.com +heathergraham.ca.tt +heathersroom.com +heathertristany.com +heatmap.buzzdeck.com +heatmap.it +heatpower.ru +heaven-leigh.com +heavenly-babes.com +heavenlytits.com +heavycom.112.2o7.net +heavycom.122.2o7.net +heavymouse.com +hebdotop.com +heberge.identite.free.fr +hebita.com +hebr.myddns-flir.com +hedefzirve.com.tr +heelshoes.info +hef.net +hefigo.com +hegirls.nu +hegongchang.cloud +hegrinhar.com +heias.com +heightblog.com +heilit-woerner.de +heisenberg-uswest.cdn.inmobi.com +heisenberg.cdn.inmobi.com +heisenberg.inmobi.com +heisse-cams.com +hela.vn +helathearizona.org +hele51wan.com +helenhunt.nu +helenroche.net +helesouurusa.cjb.com +helicalpile.us +heliko.no +helios.adtechus.com +helios.finn.no +helios.fvn.no +helios3000.net +heliosiq.adtech.de +heliosiq.adtechus.com +helium.us.intellitxt.com +helix.inmobi.com +helixuat.inmobi.com +hellmann-eickeloh.de +hello.adroll.com +hello.kochava.com +hello.mparticle.com +hello.optimizely.com +hello.sexer.com +helloabby.com +hellobaby.dk +hellobar.com +hellomagazine.uk.intellitxt.com +hellowel.com +helltraffic.com +hellwert.biz +help-page-report-notification-in.hostreo.com +help.adjust.com +help.adroll.com +help.adtech.de +help.adtech.fr +help.adtech.us +help.appdynamics.com +help.aweber.com +help.backtrace.io +help.brightfunnel.com +help.clearbit.com +help.convertro.com +help.curalate.com +help.drift.com +help.fullstory.com +help.imprev.net +help.innovid.com +help.marketo.com +help.mixpanel.com +help.mysearch.com +help.onlinesucces.nl +help.optimizely.com +help.privy.com +help.returnpath.com +help.rollbar.com +help.sharethis.com +help.sumo.com +help.survata.com +help.taboola.com +help.tapad.com +help.tst.returnpath.net +help.yext.com +helpbatteryov1.ksmobile.com +helpdesk.marketbill.com +helper-stats.wondershare.com +helpingtrk.com +helpint.mywebsearch.com +helpme.rubiconproject.com +helpmedb.com +helpmedownload.com +helpmen24.com +helpmymacfaster.club +helps-confrim1777.suport-acount-confrim12.ga +helpsfind.com +helpshop.org +helvetia.com.ua +hem.passagen.se +hemensex.info +hemnes.win +henkie.nu +hensnightout.com +hensus.com +hentai-anime-sex-porn.com +hentai-art.info +hentai-bomb.com +hentai-flashj.maclenet.com +hentai-playground.0my.net +hentai.mms.sms13.de +hentai.rioweb.org +hentai4all.com +hentai4max.com +hentaicounter.com +hentaidatabase.com +hentaiheroes.com +hentaiindex.com +hentailesbians.info +hentaimanga.biz +hentaioasis.com +hentaiorg.com +hentaiporno.org +hentairadar.com +hentairapeporn.com +hentaiservices.com +hentaisexonline.com +hentaisphere.com +hentaisuperporno.com +hentaitubegratuit.com +hentaizone.net +hentia.biz +hepsisaglikli.com +hepsisizeozel.com +heraldgroup.com.ge +herbalaffiliateprogram.com +herbalpharmvalue.ru +herbeauty.co +heredatetime.com +herezera.com +hermes.airad.com +heroku.jsrdn.com +herpes.1.p2l.info +herpes.3.p2l.info +herpes.4.p2l.info +herphemiste.com +hertz.122.2o7.net +hertzsales.com +heute.ivwbox.de +heute.oewabox.at +hexa.silverpush.co +hexadl.line55.net +hexus.uk.intellitxt.com +hexusads.fluent.ltd.uk +heyos.com +heyzap.com +hf.themafia.info +hfc195b.com +hfm.checkm8.com +hg1.hitbox.com +hg10.hitbox.com +hg11.hitbox.com +hg12.hitbox.com +hg13.hitbox.com +hg14.hitbox.com +hg15.hitbox.com +hg16.hitbox.com +hg17.hitbox.com +hg2.hitbox.com +hg3.hitbox.com +hg4.hitbox.com +hg5.hitbox.com +hg6.hitbox.com +hg6a.hitbox.com +hg7.hitbox.com +hg8.hitbox.com +hg8dc7bm.com +hg9.hitbox.com +hgads.com +hgm.world +hgtzz.com +hhb123.tk +hhbekxxw5d9e.pflexads.com +hhdbbixxs.bid +hhl.adx1.com +hhnamywutsvovm.bid +hhnvtfiiitzf.bid +hhtransports.pk +hi.5.p2l.info +hi.pacehillel.org +hi1001.co.kr +hibids10.com +hibition.free.fr +hibtgsibarfg.bid +hichalk.com +hickoryfarms.112.2o7.net +hicpm5.com +hidden-files.com +hidden.gogoceleb.com +hiddenheaven.nu +hiddenjack.com +hiddenmysterypackdlc.sharezips.info +hiddenteens.com +hiddenvillage.info +hide.ovh +hideagent.com +hidebux.com +hidefiles.org +hideme.vcp.ir +hidemyass.com +hieruu.apicultoresweb.com +highbeam.122.2o7.net +higher.dwebsi.tk +highereddemo.eloqua.com +higheredgallery.eloqua.com +highfalutinroom.com +highlandder.com +highnotesgifts.com +highpro1.com +highproxy.info +highscanprotect.com +highschool-girlsex.freehostia.com +highschool18.com +highspeed.duckcrypt.info +highspeed5.net +highstairs-a.akamaihd.net +hightrafficads.com +highweb.info +highwinds.cdneval.adnxs.com +hihyp.com +hikesearch.net +hilariouszinc.com +hilltopads.net +himedia.112.2o7.net +himediads.com +hinsib.com +hipaa-p01.releasetesting.eloqua.com +hipaa-p02.releasetesting.eloqua.com +hipaa-p03.releasetesting.eloqua.com +hipaa-p04.releasetesting.eloqua.com +hipaa-p06.releasetesting.eloqua.com +hipaa-p07.releasetesting.eloqua.com +hipersushiads.com +hiphopdx.us.intellitxt.com +hiphopgalaxy.fr.intellitxt.com +hiphoplead.us.intellitxt.com +hiphoprx.us.intellitxt.com +hippo.adultadworld.com +hiq.fotolog.com +hira.hopto.org +hiro.mgr.consensu.org +his.112.2o7.net +hisnakiamotors.122.2o7.net +histats.com +histats2014.simply-webspace.it +histock.info +historicalrequest.com +historykill.com +hit-counter.5u.com +hit-counter.udub.com +hit-log.viva.co.id +hit-now.com +hit-parade.com +hit.8digits.com +hit.bg +hit.clickaider.com +hit.gemius.pl +hit.hotlog.ru +hit.reference-sexe.com +hit.topc.org +hit.ua +hit.webcentre.lycos.co.uk +hit1.hotlog.ru +hit10.hotlog.ru +hit13.hotlog.ru +hit14.hotlog.ru +hit15.hotlog.ru +hit16.hotlog.ru +hit17.hotlog.ru +hit18.hotlog.ru +hit19.hotlog.ru +hit2.hotlog.ru +hit20.hotlog.ru +hit21.hotlog.ru +hit22.hotlog.ru +hit23.hotlog.ru +hit24.hotlog.ru +hit25.hotlog.ru +hit26.hotlog.ru +hit27.hotlog.ru +hit28.hotlog.ru +hit29.hotlog.ru +hit3.hotlog.ru +hit30.hotlog.ru +hit32.hotlog.ru +hit33.hotlog.ru +hit35.hotlog.ru +hit37.chark.dk +hit37.chart.dk +hit38.hotlog.ru +hit39.chart.dk +hit39.hotlog.ru +hit4.hotlog.ru +hit40.hotlog.ru +hit41.hotlog.ru +hit5.hotlog.ru +hit6.hotlog.ru +hit7.hotlog.ru +hit8.hotlog.ru +hit9.hotlog.ru +hitbox.com +hitboxbenchmarker.com +hitboxcentral.com +hitboxenterprise.com +hitboxwireless.com +hitcounter01.xspp.com +hitcounters.miarroba.com +hitfarm.com +hitfilm.pl +hitiz.com +hitlist.ru +hitlog2.chosun.com +hitlounge.com +hitmax.pl +hitmodel.net +hitometer.com +hitpro.us +hits-i.iubenda.com +hits.convergetrack.com +hits.e.cl +hits.eluniversal.com.mx +hits.epochstats.com +hits.europuls.eu +hits.guardian.co.uk +hits.gureport.co.uk +hits.icdirect.com +hits.informer.com +hits.iubenda.com +hits.netgeography.net +hits.nextstat.com +hits.puls.lv +hits.spylog.com +hits.theguardian.com +hits.top.lv +hits.truehits.in.th +hits.webstat.com +hits3.truehits.net +hits4me.com +hits4pay.com +hitslap.com +hitslink.com +hitslog.com +hitstatus.com +hittail.com +hitvisit.com +hitwastedgarden.com +hitwebcounter.com +hitx.statistics.ro +hitx.waudit.cz +hitzhita.pl +hive.tubetitties.com +hiy.vidzi.tv +hj.flxpxl.com +hjnbvg.ru +hk.adserver.yahoo.com +hk.as.criteo.com +hk.as.criteo.net +hk.cn.criteo.com +hk.cn.criteo.net +hk.rs +hksfa.org +hlamedia.adk2x.com +hlcc.ca +hlok.qertewrt.com +hlpidkr.ru +hls-us2.stripcdn.com +hls.stripcdn.com +hlserve.com +hlu9tseh.men +hm-content.vergic.com +hm.baidu.com +hm.console.xtify.com +hm.d1.sc.omtrdc.net +hm.l.qq.com +hm.webtrends.com +hmora.fred-build.tk +hmortensen.tns-cs.net +hnfwg.voluumtrk.com +hngn.com.us.intellitxt.com +hnskorea.co.kr +ho-prod-a.us-east-1.k8s.tune.com +hoawy.frost-electric-supply.com +hobbat.fvds.ru +hobby-hangar.net +hobbytotaalservice.nl +hodlers.party +hodling.faith +hoerbird.net +hogani.com +hogsandheifers.com +hohful.com +hohohost.net +hoholikik.club +hohoporn.com +hoiv.com +holaporn.com +holdenavenue.pl +holdquick.com +holiday-gift-offers.com +holiday.exponential.com +holidayarte.com +holidayparty.urbaninsight.com +holidaypics.org +holidayproductpromo.com +holidayshoppingrewards.com +holidayvillasmallorca.com +holidayvoucher.us +holidayxxx.com +holika.com +holishit.in +holland-sex.nu +hollandbusinessadvertising.nl +hollandseneukers.nl +hollandsluts.com +hollandteens.nu +hollowshake.com +hollyrude.us.intellitxt.com +hollywood.122.2o7.net +hollywood.us.intellitxt.com +hollywoodbackwash.us.intellitxt.com +hollywoodchicago.us.intellitxt.com +hollywooddame.us.intellitxt.com +hollywoodstreetking.us.intellitxt.com +hollywoodtuna.us.intellitxt.com +hollywoodwish.nu +holoam.com +holobumo.info +holspi.com +holyeros.com +home-garden-premiumblvd.com +home-garden-rewardempire.com +home-garden-rewardpath.com +home-staging.fgl.com +home.about.com +home.fgl.com +home.hit.stat.pl +home.hit.stat24.com +home.tapjoy.com +home.traq.li +home4bizstart.ru +homeandhealth.ru +homebath.ru +homecams.co.uk +homedecoguide.info +homedepoy.com +homedo.fabpage.com +homeelectronicproducts.com +homegardening.de +homegrownpornmovies.com +homehre.bravehost.com +homehre.ifrance.com +homehre.tripod.com +homeimprovementonus.com +homeinns.com +homejailbreak.com +homepageking.de +homepjlconline.com.112.2o7.net +homepproav.112.2o7.net +homes.bg +homesclick.112.2o7.net +homeslice.appboy.com +homesteadtechnologies.122.2o7.net +homestore.122.2o7.net +hometheaterhifi.us.intellitxt.com +hometheaterreview.advertserve.com +homevideo.b2c.com +homewares.org +homrdepot.com +honarkhabar.com +honarkhaneh.net +honestsun.top +honeygoldfish.com +hongkiat.us.intellitxt.com +honolulu.alphonso.tv +honolulu.app.ur.gcion.com +honor.agitaattori.fi +honorroll.adroll.com +honouncil.info +hoodia.kogaryu.com +hook.yieldbuild.com +hookedmediagroup.com +hooks.1p.bugsnag.appstore.a2z.com +hooks.aca.bugsnag.appstore.a2z.com +hooks.bugsnag.appstore.a2z.com +hooks.firetv.bugsnag.appstore.a2z.com +hooli.adrizer.com +hoopsworld.us.intellitxt.com +hooqy.com +hoovers.us.intellitxt.com +hop.clickbank.net +hopto.org +horizon.mashable.com +hornytraffic.com +horoscope.us.intellitxt.com +horrorscopeme.ml +hos1.cnzz.com +host-it.co.uk +host.d-ns.ga +host2.adhese.be +host207.ewtn.com +host3.adhese.be +host4.adhese.be +host4.list.ru +host6.hitbox.com +hostboard.us.intellitxt.com +hostdomainpeople.112.2o7.net +hostdomainpeopleca.112.2o7.net +hosted.stats.com +hosted.stats.com.edgesuite.net +hostedads.realitykings.com +hostedaje14.thruport.com +hostedbannerads.aebn.net +hostedcart.buysellads.com +hosting-controlid1.tk +hosting-controlnext.tk +hosting-controlpin.tk +hosting-controlpr.tk +hosting.adjug.com +hosting.bronto.com +hosting.conduit.com +hosting.exacttarget.com +hosting.sextracker.com +hostingcloud.accountant +hostingcloud.bid +hostingcloud.date +hostingcloud.download +hostingcloud.faith +hostingcloud.loan +hostingcloud.science +hostingprod.com +hostplik.pl +hostpowermedium.112.2o7.net +hostujmy.pl +hot-bot.com +hot-daily-deal.com +hot-product-hangout.com +hot-sex-movies.info +hot-sex.nu +hot-sexpower.com +hot-supermodel.com +hot-video-x.com +hot-vip.cn +hot-voice.com +hot.free.fr +hot2.53.localytics.com +hot2015rewards.com +hotawards.pl +hotbar.dgndesign.com +hotchatdate.com +hotchix.servepics.com +hoteing.intelsad.com +hotel-las-vegas.gloses.net +hotelscom.122.2o7.net +hotelsunndaram.com +hotelworx.gr +hotenergy.ru +hotfacesitting.com +hotfix.adswizz.com +hotforlove.com +hotfreexxx.info +hotfuckflix.com +hotgame.free.fr +hotgayssex.org +hotgiftzone.com +hotgirl.cz +hotgirlsx.info +hotguystgp.com +hothardware.us.intellitxt.com +hothardwarecom.skimlinks.com +hothor.se +hothorneygirls.com +hothotbabes.info +hothub.pl +hotindianteens.com +hotjar.com +hotkeys.com +hotkinkybabes.com +hotlatinasporn.com +hotlesbianseatingpussy.com +hotlink.nu +hotlinx.nu +hotlipshoneys.com +hotloans.ru +hotlog.ru +hotlynx.net +hotlynxxx.com +hotmail.com.es +hotmial.com +hotmoll.com +hotmommagossip.us.intellitxt.com +hotnakedamateurs.com +hotnakedbbw.info +hotnfree.com +hotokazje.com +hotonlinenews.us.intellitxt.com +hotpatricia.blogspot.com +hotpix.org +hotporno.nu +hotpornoseries.com +hotpornvids.net +hotprizes.pl +hotpussy.nu +hotrank.com.tw +hotremedialmart.ru +hotsexpictures.org +hotsextheater.com +hotsexygalleries.com +hotsexypages.com +hotsexywomen.nu +hotshoppymac.com +hotshotsex.com +hotsinglesdate.com +hotslutz.com +hotspot.cz +hotspotshield.com +hotstar.pubnub.net +hotstar.worldgravity.com +hotstreams.de +hotsuds.nu +hottest-asians.com +hottestdreams.com +hottieamateurs.com +hottiegirlfriendpics.com +hottvescort.com +hottyland.com +hotusanewx.blogspot.com +hotvideosx.com +hotweb.free.fr +hotwebcamgirls.org +hotwetbitches.com +hotwhores.biz +hotxnights.info +hotxxx4you.com +hotyoungteens.nu +houdom.net +hous.pl +house.sieraddns.com +housediz.com +housedman.com +housefly.uk +housekuba.org +housemilan.ru +houseofgaga.ru +houseofniche.com +houseofravissant.com +houseofrose.com +houseofsmut.com +hoverboard360.se +hoverboardforsaledirect.com +hoverowl.com +how-tosolve.com +howardchui.us.intellitxt.com +howbeats.com +howcanweprotectyou.co.za +howigotporn.com +howler.shareaholic.com +howopen.ru +howpl.com +howtobuildsoftware.com +howtocleanacomputervirus.com +howtotroll.org +howtowinlotteryguaranteed.com +howupdateworks.amazingupdates4youtoday.website +hoy.com.co +hpad.www.infoseek.co.jp +hpglobal.112.2o7.net +hphqglobal.112.2o7.net +hphqsearch.112.2o7.net +hpr.outbrain.com +hq-celebrity.us.intellitxt.com +hq.appsflyer.com +hq.traq.li +hq1.appsflyer.com +hqhome.traq.li +hqsecurity.insnw.net +hqsexmovies.com +hr-engine.xclaimwords.net +hr-shanghai.com +hr.adocean.pl +hr.hit.gemius.pl +hr.search.etargetnet.com +hr.static.etargetnet.com +hrdcvn.com.vn +hreade.com +hrfziiddxa.ru +hrgde.adocean.pl +hrtrain.net +hrtya.com +hs-analytics.net +hs-scripts.com +hs.interpolls.com +hsb-canada.com +hsbconline.ca +hsbconlineuk.com +hscmail.com +hscsscotland.com +hspline.com +hst-19-33.splius.lt +hst.tradedoubler.com +hstde.tradedoubler.com +hstes.tradedoubler.com +hstfr.tradedoubler.com +hstgb.tradedoubler.com +hstit.tradedoubler.com +hstno.tradedoubler.com +hstpl.tradedoubler.com +hstpnetwork.com +hstraffa.com +hstus.tradedoubler.com +hsw-d.openx.net +hswmedia.122.2o7.net +ht-lb-sec.casalemedia.com +ht-lb.casalemedia.com +ht.casalemedia.com +ht.pornhub.com +ht.tube8.com +ht.xtube.com +htl.bid +htldvsrwwx.bid +htm.freelogs.com +html.agkn.com +html.atm.youku.com +html.centralmediaserver.com +html5adkit.plusmo.s3.amazonaws.com +htmlads.ru +htmlads.s3.amazonaws.com +htmlcorner.com +htmlhubing.xyz +htmlpro.ru +htmltopdf.in +htmlwww.youfck.com +htpcapital.com +htppmnu.com +htrtb.adx1.com +hts2.adpremium.org +hts4.adpremium.org +httmsamn.com +http-proxy.aweber.com +http300.content.ru4.com +http300.edge.ru4.com +httpads.com +httpool.com +httpp.gdn +httppp.com +httpring.qq.com +https-legalrc.biz +httpwwwadserver.com +hu.2.cqcounter.com +hu.hit.gemius.pl +hu.search.etargetnet.com +hu.static.etargetnet.com +huadn.hit.gemius.pl +huahuashucheng.com +huangjintawujin.cn +huangjun.info +huanqiucaijing.cn +huawei.theappgrader.com +hub.adlpartner.com +hub.appsflyer.com +hub.automatad.com +hub.com.pl +hubbble.com +hubertus-hotel.de +hubexchange.exacttarget.com +hubi8.com +hubnt.com +huddlecare.com +hudson.adx1.com +hue.palebrook.wbinsights.com +huffingtonpost.crwdcntrl.net +huffproperties.net +hugde.adocean.pl +huge-cocks.biz +huge-gay-cock.com +huge2tits.com +hugeandfat.com +hugeclitsplanet.com +hugenaturalknockers.info +hugersoft.com +hugo-brasserie.de +hugoparisescort.com +huhmag.com +huhn.altervista.org +huis.istats.nl +huisvrouwen.be +huit.re +huiwiw.hit.gemius.pl +hujii.qplanner.cf +hukbo.com +huliq.us.intellitxt.com +hully.altervista.org +hulu.112.2o7.net +huludev.112.2o7.net +humanelydrew.com +humanistiskhalsoforskning.se +humanverify.net +humorcartoes.com.sapo.pt +humorflow.com +humorpool.com +humortadelacartoes.com.sapo.pt +humption.info +humraaz.com +hundejo.com +hundpolen.se +hunger.xyz +hungergame.com +hunks-hardcore.com +hunks-naked.com +hunktoons.com +hunshop.natureflower.com +hunt4porn.com +hunterboots.online +huntingtonbank.tt.omtrdc.net +huomdgde.adocean.pl +hurricanedigitalmedia.com +hurtownia.kolrise.com +hurtteeth.com +husky-shop.cz +hustler-life.com +hustler-models.com +hustlercash.hit.bg +hustlervip.net +hustoon.over-blog.com +hut1.ru +hutchmedia.t.domdex.com +hv3.webstat.com +hvd-store.com +hveportal.org +hvetdfqh.sufx.net +hvtzz.pcloadletter.quhu.info +hvvxxszxslome.bid +hwkxtltut.bid +hwoqbjouvfn.bid +hwtdpeihsszrl.bid +hwvvhsnjj.bid +hx.hexun.com +hxtrack.holidayextras.co.uk +hy-brasil.mhwang.com +hy-tec.com +hybl9bazbc35.pflexads.com +hybrid.ru +hydramedia.com +hydraulicpowerpack.com +hydraulicscylinders.com +hydro.polybuild.ru +hydrocodone-buy-online.blogspot.com +hydrocodone.irondel.swisshost.by +hydrocodone.on.to +hydrocodone.shengen.ru +hydrocodone.t-amo.net +hydrocodone.visa-usa.ru +hydropneuengg.com +hydropump.su +hygar.com +hyggefis.dk +hygromycin-b-50mg-ml-solution.com +hyiphunter.org +hyipmanager.in +hyjxtz.com +hymen-defloration.info +hympsvtktvtm.biz +hypel.ru +hyperbanner.net +hyperion.adtech.de +hyperion.adtech.fr +hyperion.adtech.us +hyperlinktech.122.2o7.net +hypersex.net +hypertracker.com +hypnoseterapi.com +hypnotone.com +hyrlastbilgoteborg.se +hystericalhelp.com +hystersister.com +hz.mmstat.com +hzdoctor.com +hzs1.cnzz.com +hzs10.cnzz.com +hzs13.cnzz.com +hzs15.cnzz.com +hzs2.cnzz.com +hzs22.cnzz.com +hzs4.cnzz.com +hzs8.cnzz.com +hzsod71wov.me +i-c-c-c.com +i-cda.pl +i-chomik.pl +i-clicks.net +i-dating.info +i-games.biz +i-gay.ru +i-hacked.us.intellitxt.com +i-hobot.ru +i-int.com +i-mobi.pl +i-podgladacz.pl +i.11zz.com +i.admob.com +i.adwise.bg +i.bigmir.net +i.bksn.se +i.blogads.com +i.bucksense.com +i.casalemedia.com +i.cdn.openx.com +i.cdnpark.com +i.clean.gg +i.ctnsnet.com +i.hotkeys.com +i.imedia.cz +i.interia.pl +i.isohunt.to +i.jsrdn.com +i.jumptap.com +i.jwpltx.com +i.kissmetrics.com +i.l.cnn.net +i.laih.com +i.ligatus.com +i.lsimg.net +i.media.cz +i.n.jwpltx.com +i.nuseek.com +i.pcp001.com +i.plug.it +i.qitrck.com +i.radzolo.com +i.securecontactinfo.com +i.simpli.fi +i.smartwebads.com +i.static.zaplata.bg +i.tapit.com +i.total-media.net +i.track112.site +i.trkjmp.com +i.w.inmobi.com +i.w55c.net +i.xx.openx.com +i.yldbt.com +i.zemanta.com +i.zeroredirect.com +i1.dl-ad.com +i1.teaser-goods.ru +i18n.newrelic.com +i1img.com +i1media.no +i3.putags.com +i4eg76.vindicated-shelter.space +i4track.net +i4u.us.intellitxt.com +i4you.pl +ia.5.p2l.info +ia.iinfo.cz +ia.spinbox.net +ia.warnet-thunder.net +ia1.7search.com +iacas.adbureau.net +iacpromotion.s3.amazonaws.com +iact.atdmt.com +iad-01.braze.com +iad-02.braze.com +iad-03.appboy.com +iad-03.braze.com +iad-04.braze.com +iad-06.braze.com +iad-feed.qwapi.com +iad-login.dotomi.com +iad-usadmm.dotomi.com +iad.anm.co.uk +iad.appboy.com +iad.mediaplex.bfp.dotomi.weighted.com +iad01-avlog01.vpn.insnw.net +iad01-avlog02.vpn.insnw.net +iad01-avlog03.vpn.insnw.net +iad01-avserv01.vpn.insnw.net +iad01-avserv02.vpn.insnw.net +iad01-avserv03.vpn.insnw.net +iad01-avserv04.vpn.insnw.net +iad01-ayeaye01.vpn.insnw.net +iad01-ayeaye02.vpn.insnw.net +iad01-bfp02.mediaplex.com +iad01-dashboard01.vpn.insnw.net +iad01-device42.vpn.insnw.net +iad01-geodborigin01.insnw.net +iad01-geodborigin01.vpn.insnw.net +iad01-gerrit01.vpn.insnw.net +iad01-gerrit02.vpn.insnw.net +iad01-ldap01.insnw.net +iad01-ldap01.vpn.insnw.net +iad01-nagios04.vpn.insnw.net +iad01-nagios05.svc.insnw.net +iad01-nagios05.vpn.insnw.net +iad01-nagios06.svc.insnw.net +iad01-nagios06.vpn.insnw.net +iad01-nagios07.svc.insnw.net +iad01-nagios07.vpn.insnw.net +iad01-netmonitor01.vpn.insnw.net +iad01-opsci01.vpn.insnw.net +iad07-bfp01.mediaplex.com +iad08-bfp01.mediaplex.com +iad08-login-ds.dotomi.com +iad1.qualtrics.com +iadasa.qwapi.com +iadc-origin.qwapi.com +iadc.qwapi.com +iadcpreview.qwapi.com +iadctest-origin.qwapi.com +iadctest.qwapi.com +iadfeed.qwapi.com +iadfeedtest.qwapi.com +iadmfeed.qwapi.com +iadmsoak.qwapi.com +iadnet.com +iadsdk.apple.com +iadsdk.apple.com.edgekey.net +iadsdk.qwapi.com +iadsoak.qwapi.com +iaheyftbsn.review +ialaddin.genieesspv.jp +iam-heliosiq.adtech.de +iam-iq.adtech.de +iam.inmobi.com +iamagameaddict.com +iamnotageek.us.intellitxt.com +ias.avidmedia.net +ias.hitbox.com +ias2.hitbox.com +iasds01.com +iau.adsiduous.com +ib-test.mookie1.com +ib.3lift.com +ib.adnxs.com +ib.anycast.adnxs.com +ib.mookie1.com +ib.reachjunction.com +ibaveh.yadozalamom.pw +ibeat.indiatimes.com +ibeu2.mookie1.com +ibg.hitbox.com +ibibo.112.2o7.net +ibis.lgappstv.com +ibm-notebook-battery.wp-club.net +ibm.xtify.com +ibmvideo.com +ibn.adx1.com +ibox.green +ibrainer.net +ibv.doubleclick.rtb.adx1.com +ic.tynt.com +icanoptout.com +iccee.com +ice.112.2o7.net +icecars.com +icentric.us.intellitxt.com +ichef.us.intellitxt.com +ichgcp.com +ici-sexe-gratuit.com +ici-sexe.tk +icipourtoi.com +icityfind.com +icloud-ifor.com +icloudlocate.info +iclsas.com +icltessfskwle.bid +ico.freelogs.com +ico.re +icompass.insightexpressai.com +icon.clickthru.net +icon.cnzz.com +icon.cubics.com +iconadserver.com +iconhealthfitness.tt.omtrdc.net +icoocash.com +icorpadro.hit.gemius.pl +icptrack.com +icracks.net +ics.hitbox.com +icydk.us.intellitxt.com +id-cdn.effectivemeasure.net +id.5.p2l.info +id.get35.com +id.kbmg.cz +id.mediavine.com +id11938.luxup.ru +id3103.com +id405441215-8305493831.h121h9.com +id5576.al21.luxup.ru +idas-sex-story.gocunt.com +idb.hitbox.com +idc.com.ua +iddpmiram.org +idea21.org +ideablog.biz +idealtits.net +idearc.tt.omtrdc.net +ideas.com.uy +ideascore.biz +ideationary.com +ideawheel.com +idecoideas.com +idegenvezeto.eu +ideibiznesa2015.ru +identads.com +identity-staging.appdynamics.com +identity.ae1.mparticle.com +identity.appdynamics.com +identity.aw2.mparticle.com +identity.dev.extremereach.com +identity.extremereach.com +identity.livefyre.com +identity.mparticle.com +identity.qa.corp.mparticle.com +identity.qa2.corp.mparticle.com +identity.swrve.com +ideoclick.com +ideoworld.org +idev.online-metrix.net +idg.hit.gemius.pl +idg.tns-cs.net +idgenterprise.112.2o7.net +idgenterprise.d1.sc.omtrdc.net +idguk1-d.openx.net +idkom.com +idm.hit.gemius.pl +idm.us.intellitxt.com +ido3.com +idolax.com +idolhairsalon.com +idolight.net +idontlikeyouinthatway.us.intellitxt.com +idp.adsrvr.org +idpix.media6degrees.com +idqsygpvizjp.bid +idrct.com +idspaces.ero-advertising.com +idsync.mparticle.com +idsync.rlcdn.com +idtargeting.com +idvipteam.com +idx.c3tag.com +idx.imprev.net +idx.qa-dest.imprev.net +idx1.qa-dest.imprev.net +ie.57883.net +ie.unityads.unity3d.com +ie3wisa4.com +ie6.biz +iebar.baidu.com +iebei5v.bid +iece1vi.top +ieee.adbureau.net +ieginc.com +ientrymail.com +ieplugin.com +iesb.us.intellitxt.com +iesnare.co.uk +iesnare.com +if.bbanner.it +ifa.camads.net +ifa.empflixlive.com +ifa.hardsexmate.com +ifa.keezlive.com +ifa.maxpornlive.com +ifa.pornhublive.com +ifa.slutloadlive.com +ifa.streamateaccess.com +ifa.tnaflixlive.com +ifa.tube8live.com +ifa.xhamstercams.com +ifa.yobtcams.com +ifa.youjizzlive.com +ifa.youpornmate.com +ifastnet.com +ifc-ep.inmobi.com +ifc-iip.w.inmobi.com +ifc.auth.inmobi.com +ifc.inmobi.com +ifc3.inmobi.com +ifd.et.w.inmobi.com +ifilefinder.com +iflycapetown.co.za +iforgotappple.com +iframe-dsa.fyber.com +iframe.adultfriendfinder.com +iframe.cc +iframe.fyber.com +iframe.sharethrough.com +iframe911.com +iframecash.biz +iframes.awempire.com +iframes.perfectgonzo.com +iframes.pornprosnetwork.com +iframes.prettyincash.com +iframes.us +iftarvakitleri.net +ifuckshemales.com +ifwry.yeslaptop.win +ig.fp.oix.net +ig.insightgrit.com +igadgetsworld.com +igagh.tourstogo.us +igame4free.com +igdxzzeglrlqm.ru +iglu.newscgp.com +ign.us.intellitxt.com +ignitad.com +ignorantfishing.com +igoby.frost-electric-supply.com +igrid.org +igroo.barginginfrance.net +igrovyeavtomaty777.ru +igru-xbox.net +igrulca174.ru +igum.net +igutgembqnw.bid +ih.adscale.de +ih.constantcontacts.com +ih2.gamecopyworld.com +ihackgame.com +ihc.112.2o7.net +ihdvilappuxpgiv.ru +ihm01.ct2.comclick.com +ihmevshz.bid +ihoi.adx1.com +iisl7wpf.me +ikcode.baidu.com +il-vpn.taboola.com +il.5.p2l.info +ilav.sizmek.com +ilbanner.com +ildialin.sizmek.com +ilead.itrack.it +ilgde.adocean.pl +ilinks.industrybrains.com +illfatedsnail.com +illustriousoatmeal.com +illyncweb.sizmek.com +ilmeet.sizmek.com +ilovecheating.com +ilovemobi.com +iloveporn.org +iloveporn.us +ilovetosquirt.nichedsites.com +ilovevitaly.com +ilovevitaly.ru +ilsfbweb.sizmek.com +ilsip.sizmek.com +ilte.info +ilumigrafias.adriancugar.com +iluv.clickbooth.com +ilwebapps.sizmek.com +ilwebconf.sizmek.com +ilxhsgd.com +im.52441.com +im.adtech.de +im.adtechus.com +im.afy11.net +im.banner.t-online.de +im.of.pl +im.xo.pl +im2.smartadserver.com +ima3vpaid.appspot.com +imadedinner.net +imads.ero-advertising.com +imads.integral-marketing.com +imaduras.com +imadworks.rediff.com +imafangirl.net +image.admedo.com +image.adv.livedoor.com +image.atdmt.com +image.boa.exacttarget.com +image.cecash.com +image.click.livedoor.com +image.exacttarget.com +image.i1img.com +image.linkexchange.com +image.masterstats.com +image.pd1.s1.qa1.exacttarget.com +image.s1.qa1.exacttarget.com +image.s1.qa2.exacttarget.com +image.s1.qa3.exacttarget.com +image.s10.exacttarget.com +image.s11.exacttarget.com +image.s2.qa1.exacttarget.com +image.s2.qa2.exacttarget.com +image.s2.qa3.exacttarget.com +image.s4.exacttarget.com +image.s50.exacttarget.com +image.s6.exacttarget.com +image.s7.exacttarget.com +image.s8.exacttarget.com +image.s91.exacttarget.com +image.test.exacttarget.com +image.tx.redbox.com +image1.cecash.com +image2.pubmatic.com +image5.pubmatic.com +imageads.canoe.ca +imageads.sexmoney.com +imagec05.247realmedia.com +imagec07.247realmedia.com +imagec08.247realmedia.com +imagec09.247realmedia.com +imagec10.247realmedia.com +imagec11.247realmedia.com +imagec12.247realmedia.com +imagec14.247realmedia.com +imagec15.247realmedia.com +imagec16.247realmedia.com +imagec17.247realmedia.com +imagecache.directtrack.com +imagecash.net +imageceu1.247realmedia.com +imagecoolpub.com +imagegalleries.org +imagenen1.247realmedia.com +imageprostyle-communication.fr +images-72-26-207-6.assets.qhosted.com +images-aud.freshmeat.net +images-aud.slashdot.org +images-aud.sourceforge.net +images-cdn.azoogleads.com +images-cdn.bucksense.com +images-graphics-pics.com +images-pw.secureserver.net +images.about.com +images.adrime.com +images.ads.fairfax.com.au +images.ads.supplyframe.com +images.ads.whaleads.com +images.adsttc.com +images.adsyndication.msn.com +images.adviews.de +images.affiliator.com +images.agkn.com +images.blogads.com +images.blogomer.com +images.bluetime.com +images.bmnq.com +images.bnmq.com +images.brainfox.com +images.bravenet.com +images.bucksense.com +images.ccbill.com +images.clickfinders.com +images.cnomy.com +images.conduit-banners.com +images.cybereps.com +images.dable.io +images.dailydiscounts.com +images.ddc.com +images.directtrack.com +images.domainsponsor.com +images.dynamicyield.com +images.e-mailcom.co.uk +images.edgeads.org +images.emapadserver.com +images.enhance.com +images.eu.criteo.net +images.gyffu.com +images.hitwise.co.uk +images.host.bannerflow.com +images.indiads.com +images.intellitxt.com +images.itchydawg.com +images.jambocast.com +images.jp.as.criteo.net +images.kolmic.com +images.linkwithin.com +images.mbuyu.nl +images.millennialmedia.com +images.mpression.net +images.mxpnl.com +images.netcomvad.com +images.newsx.cc +images.ny.us.criteo.net +images.outbrain.com +images.outbrain.org +images.parked.com +images.people2people.com +images.persgroepadvertising.be +images.primaryads.com +images.rambler.ru +images.revtrax.com +images.s50.exacttarget.com +images.sexlist.com +images.skenzo.com +images.sohu.com +images.specificclick.net +images.steamray.com +images.sv.us.criteo.net +images.taboola.com +images.topguncustomz.com +images.trafficmp.com +images.v3.com +images.webads.co.uk +images.webads.it +images.webads.nl +images1.cliqueclack.com +images1.paycounter.com +images2.laih.com +images2.zemanta.com +images3.linkwithin.com +imagescroll.detik.com +imageserv.adtech.de +imageserv.adtech.fr +imageserv.adtech.us +imageserver1.thruport.com +imagesmovies.com +imagesrv.adition.com +imagevenue.advertserve.com +imajicommunications.com +imallweb.com +imap.adx1.com +imap.anoxa.de +imap.creativity.it +imap.dpsl.net +imap.drbill.de +imap.eiakr.com +imap.hamnail.net +imap.hotmial.com +imap.kuje.com +imap.nyron.com +imap.secci.it +imap.seznnam.cz +imap.spamcero.com +imap.xtream.com +imarker.com +imarker.ru +imarketservices.com +imax3d.info +imaxxe.com +imbattibili.com +imc.l.qq.com +imc2.122.2o7.net +imces.inmobi.com +imdaginea.cf +imdb.amazon-adsystem.com +imedia.com.mt +imeds.ero-advertising.com +imeem.112.2o7.net +img-a2.ak.imagevz.net +img-cdn-1.heyzap.com +img-cdn-2.heyzap.com +img-cdn.mediaplex.com +img-dc2.adtech.de +img-eu.stripcdn.com +img-origin.adtechus.com +img.2leva.bg +img.7search.com +img.adecorp.co.kr +img.admaster.net +img.adnet.com.tr +img.adplan-ds.com +img.ads.huntmad.com +img.ads.mobilefuse.net +img.ads.mocean.mobi +img.ads.mojiva.com +img.ads.sanomamobileads.nl +img.ads.taptapnetworks.com +img.ads1.mocean.mobi +img.ads1.mojiva.com +img.ads2.mocean.mobi +img.ads2.mojiva.com +img.ads3.mocean.mobi +img.ads3.mojiva.com +img.ads4.mocean.mobi +img.ads4.mojiva.com +img.adtech.de +img.adverticum.net +img.adzs.nl +img.alibaba.com +img.atdmt.com +img.avatraffic.com +img.awr.im +img.bet-at-home.com +img.blogads.com +img.casalemedia.com +img.clicksagent.com +img.coldstoragemn.com +img.cqcounter.com +img.dev.paperg.com +img.directtrack.com +img.discovery.com +img.dt00.net +img.en25.com +img.jizzads.com +img.jsecoin.com +img.layer-ads.de +img.liczniki.org +img.linkstorm.net +img.marketgid.com +img.metaffiliation.com +img.msgtag.com +img.neogen.ro +img.network.affiliando.com +img.parked.ru +img.prod.paperg.com +img.prohardver.hu +img.pulsemgr.com +img.readme.ru +img.revcontent.com +img.royal-cash.com +img.ruclicks.com +img.sedoparking.com +img.skenzo.com +img.sn00.net +img.soulmate.com +img.speedcurve.com +img.staging.paperg.com +img.stripcdn.com +img.tradedoubler.com +img.xnxx.com +img.zemanta.com +img0.ru.redtram.com +img001.com +img04.en25.com +img1.adsttc.com +img1.ncsreporting.com +img1.ru.redtram.com +img1.zergnet.com +img100-321.xvideos.com +img2.adsttc.com +img2.ru.redtram.com +img2.sankakustatic.com +img2.zergnet.com +img3.adsttc.com +img3.aweber.com +img3.zergnet.com +img4.adsttc.com +img4.cdn.adjuggler.com +img4.zergnet.com +img5.adsttc.com +img6.adspirit.de +img7.adspirit.de +imgad1.3conline.com +imgad2.3conline.com +imgad3.3conline.com +imgc.psychcentral.com +imgg-cdn.adskeeper.co.uk +imgg-cdn.steepto.com +imgg.adskeeper.co.uk +imgg.dt00.net +imgg.dt07.net +imgg.marketgid.com +imgg.mgid.com +imglinks.industrybrains.com +imgn.dt00.net +imgn.dt07.com +imgn.marketgid.com +imgpromo.easyrencontre.com +imgs.adverticum.net +imgserv.adbutler.com +imh.boa.exacttarget.com +imh.exacttarget.com +imh.poc.exacttarget.com +imh.s1.exacttarget.com +imh.s1.qa1.exacttarget.com +imh.s1.qa2.exacttarget.com +imh.s1.qa3.exacttarget.com +imh.s100.exacttarget.com +imh.s2.qa1.exacttarget.com +imh.s2.qa2.exacttarget.com +imh.s2.qa3.exacttarget.com +imh.s4.exacttarget.com +imh.s5.exacttarget.com +imh.s6.exacttarget.com +imhvlhaelvvbrq.ru +imiliving.122.2o7.net +imitrex.1.p2l.info +imitrex.3.p2l.info +imitrex.4.p2l.info +immanalytics.com +immediadement-arretez-ezhez-identfcie-jasdasd1233-9057.com +immediateresponseforcomputer.com +immensehoney.com +immobili.oewabox.at +immosct.wemfbox.ch +immosuch.oewabox.at +imms1.macau.ctm.net +imnotobsessed.us.intellitxt.com +imonitor.nethost.cz +imp.admarketplace.net +imp.adsmogo.com +imp.clickability.com +imp.control.kochava.com +imp.double.net +imp.euroads.no +imp.partner2profit.com +imp.startappservice.com +imp.track.tappx.com +imp.tradedoubler.com +imp2.track.tappx.com +impact.cossette-webpact.com +impacts.alliancehub.com +impactwrestling.us.intellitxt.com +impat.tradedoubler.com +impbe.tradedoubler.com +impch.tradedoubler.com +impcz.tradedoubler.com +impde.tradedoubler.com +impdk.tradedoubler.com +impes.tradedoubler.com +impfi.tradedoubler.com +impfr.tradedoubler.com +impgb.tradedoubler.com +impie.tradedoubler.com +impit.tradedouble.com +impit.tradedoubler.com +impl.onscroll.com +implt.tradedoubler.com +impnl.tradedoubler.com +impno.tradedoubler.com +import.globalsources.com +importedincrease.com +impossibleexpansion.com +imppl.tradedoubler.com +imprammp.taboola.com +imprese.cz +impresionesweb.com +impressionaffiliate.com +impressionaffiliate.mobi +impressionlead.com +impressionmedia.cz +impressionperformance.biz +impressionz.co.uk +impressoras-cartoes.com.pt +imprev.com +imprev.net +imprhkmp.taboola.com +imprlatbmp.taboola.com +impru.tradedoubler.com +impse.tradedoubler.com +impsnare.iesnare.com +impulsehands.com +imreportcard.us.intellitxt.com +imrk.net +imrkcrv.net +imrworldwide.com +imserv001.adtech.de +imserv001.adtech.fr +imserv001.adtech.us +imserv002.adtech.de +imserv002.adtech.fr +imserv002.adtech.us +imserv003.adtech.de +imserv003.adtech.fr +imserv003.adtech.us +imserv004.adtech.de +imserv004.adtech.fr +imserv004.adtech.us +imserv005.adtech.de +imserv005.adtech.fr +imserv005.adtech.us +imserv006.adtech.de +imserv006.adtech.fr +imserv006.adtech.us +imserv00x.adtech.de +imserv00x.adtech.fr +imserv00x.adtech.us +imspro.adtech.de +imspro.adtechus.com +imssl01.adtech.de +imssl01.adtech.fr +imssl01.adtech.us +imstore.bet365affiliates.com +imysurvey.com +in-appadvertising.com +in-cdn.effectivemeasure.net +in-gmtdmp.mookie1.com +in-star.videoplaza.tv +in-starlive-preroll.videoplaza.tv +in-starlive.videoplaza.tv +in-viacom18.videoplaza.tv +in.11zz.com +in.5.p2l.info +in.adserver.yahoo.com +in.analytics.glance.inmobi.com +in.api.glance.inmobi.com +in.cdn.automatad.com +in.cybererotica.com +in.ff5.com +in.getclicky.com +in.joinourwebsite.com +in.paycounter.com +in.riskymail4free.com +in.treasuredata.com +in.webcounter.cc +in.yimg.com +in.zog.link +in3.zog.link +in4.zog.link +in8.zog.link +inaccused.com +inagrody.pl +inapi.posst.co +inbound.leadback.advertising.com +inbound.sprymetrics.com +inbox.exacttarget.com +inboxdollars.com +incentaclick.com +incentive-scene.com +incentivegateway.com +incentiverewardcenter.com +inceptionads.go2cloud.org +incestland.com +incisivemedia.112.2o7.net +inclk.com +include.reinvigorate.net +inclusivediversity.co.uk +incoctel.cl +incognitosearches.com +incoming.telemetry.mozilla.org +incrediblesugar.com +indecisive.nu +independent.co.uk.ssl.sc.omtrdc.net +independentdigital.d3.sc.omtrdc.net +independentescortservices.com +independientecd.com +indetiske.ya.ru +index.buckshost.com +indexhu.adocean.pl +indexstats.com +indexth.com +indexww.com +india-forums.us.intellitxt.com +indiads.com +indiakino.net +indiana.phone.directory.sms13.de +indianapolis.hosted.xms.keynote.com +indiaonclick.com +indieclick.com +indigio.122.2o7.net +indisancal.com +indium.openx.net +indpolice.com +indumag.oewabox.at +industry-deals.com +industrybrains.com +induweb.oewabox.at +indy.fjmu.edu.cn +inetlog.ru +infamylists.com +infinite-ads.com +infinityads.com +infinityid.condenastdigital.com +influx.authoritynutrition.h-bid.com +influx.dmv-written-test.h-bid.com +influx.h-bid.com +influx.landwirt.h-bid.com +influx.marktcom.h-bid.com +influx.notebookcheck.h-bid.com +influx.webcams.h-bid.com +influx.woxikon.h-bid.com +influxdb2.vungle.com +info-images.rambler.ru +info.adviserplus.com +info.airpr.com +info.amplitude.com +info.appdynamics.com +info.bizible.com +info.chartboost.com +info.convertro.com +info.datamark.net +info.engagio.com +info.fiksu.com +info.innovid.com +info.instartlogic.com +info.intelli-direct.com +info.localytics.com +info.sizmek.com +info.tapjoy.com +info.telstra.com +info.tritondigital.com +info.undertone.com +info.videoamp.com +info.vizury.com +info.vsassets.com +info.wootric.com +info2.bizible.com +infolinia-kontakt-telefon.pl +infolinks.com +infomart.ca.112.2o7.net +infopackets.us.intellitxt.com +infopaypal.com +infor.marketolive.com +informacja-dnia.com +informacjeszok24.blogspot.com +information.com +informatyk-centrum.warszawa.pl +informatyk-dla-domu.pl +informatyk-dla-firmy.pl +informer.yandex.ru +informujemy24h.cba.pl +infos-bourses.com +infos-du-net.fr.intellitxt.com +infosec.corp.inmobi.com +infospace.com.112.2o7.net +infospace.tk +infoweb-coolinfo.tk +infoworldmediagroup.112.2o7.net +infra.by +infrastrategy.122.2o7.net +infrastructure.k8s.tst.returnpath.net +infratotalduicom.122.2o7.net +ing-district.clicktale.net +ingameads.gameloft.com +ingest-qa.kube-prod.vungle.com +ingest.advertising.com +ingest.at.atwola.com +ingest.sentry.io +ingest.vungle.com +ingorob.com +ininmacerad.pro +init.startappservice.com +init.supersonicads.com +inklineglobal.com +inkscape.fr +inl.adbureau.net +inleadership.co.nz +inlearn.ru +inline.admedia.com +inlinea.co.uk +inlocomedia.com +inm.affinitymatrix.com +inmate-locator.us +inmobi.com +innatek.com +inndl.com +inneractive-assets.s3.amazonaws.com +innergywear.com +innity.net +innmg.com +inno.bisrv.com +innocentwax.com +innodgfdriverhm.aircus.com +innovatemontana.leadpages.co +innovativedigitalmedia.com +innovid.com +innylon.com +ino.directtrack.com +inome.com.ua +inpagevideo.nl +inpath.info +inporno.biz +input.insights.gravity.com +inquake.de.intellitxt.com +inquisitiveinvention.com +inqzz.super-promo.quhu.info +inringtone.com +ins-086.inscname.net +ins-offer.com +ins.track.tappx.com +ins2.track.tappx.com +insanity2.thezeroworld.com +insc.info +inscapedesign.in.cp-3.webhostbox.net +inscname.net +inscreen.widespace.com +insdrbot.com +insecta.nu +inserimentodati.me +insert.gloadmarket.com +inside.getambassador.com +insideintercom.wpengine.com +insidemacgames.us.intellitxt.com +insiderp.rubiconproject.com +insiderpagescom.122.2o7.net +insidescandinavia.se +insight-760077375.us-east-1.elb.amazonaws.com +insight.adsrvr.org +insight.eloqua.com +insight.omtrdc.net +insight.p03.eloqua.com +insight.p07.eloqua.com +insight.secure.eloqua.com +insight.ucweb.com +insight.www02.secure.eloqua.com +insightenterprises.tt.omtrdc.net +insightexpress.com +insightexpressai.com +insightexpresserdd.com +insightfirst.com +insights-dev.datamark.net +insights-eu.swrve.com +insights.adsttc.com +insights.adviserplus.com +insights.algolia.io +insights.alphonso.tv +insights.celebrus.com +insights.creativeallies.com +insights.datamark.net +insights.evidon.com +insights.foresee.com +insights.goodyield.com +insights.gumgum.com +insights.integralads.com +insights.irganalytics.com +insights.juicemobile.com +insights.marketingmachine.co.za +insights.marketolive.com +insights.maxpoint.com +insights.sustainablebrands.com +insights.swrve.com +insights.vip.aetnd.com +insightsstg.foresee.com +insightxe.looksmart.com +insightxe.pittsburghlive.com +insightxe.vtsgonline.com +inskinad.com +insnw.net +insolvencysolutions.com.au +insomniagamingfestival.com +insomniatguide.com +inspectlet.com +inspectorclick.com +instadia.112.2o7.net +instaflow.eu +instahookupalert.ru +install.myvideotab.com +installer.betterinstaller.com +installer.filebulldog.com +installer.zutrack.com +installfarm.com +installm.net +installmac.com +installnow.org +instana.io +instantdownloadsz.com +instantfuckrequest.ru +instantgiftcodes.com +instantmadness.com +instantonlineloanss.com +instartlogic.com +instasexmatch.ru +insticator-d.openx.net +instinctiveads.com +institut-ronflement.net +institutomariadapenha.org.br +instorm.com +instory-log.ucnews.ucweb.com +instream.casalemedia.com +instrumentsponge.com +instruminahui.edu.ec +instytut-pomocy.pl +instytutmed.pl +insurance-rewardpath.com +insurancejournal.freestats.com +insurple.com +insytagram.com +int.appdynamics.com +int.drift.com +int.midasplayer.com +int.sitestat.com +int.tritondigital.com +intabulations.org +intactoffers.club +intactro.adocean.pl +intbrands.t.domdex.com +intcar.de +integratiesex.nl +integration-asa-api.aws.rubiconproject.com +integration-hub-dev.svc.kargo.com +integration.corp.mixpanel.com +integration.one-demo.convertro.com +integration.one-integration.ci.convertro.com +integration.sharethrough.com +integrations-hub-dev.svc.kargo.com +integrations-hub-testing.svc.kargo.com +integrations-hub.staging.us-east-1.kops.kargo.com +integrations.atom.adjust.com +integritybuilding.net +intel-dev-api.dynamicyield.com +intel-mock-api.dynamicyield.com +intel-mock.dynamicyield.com +intela.com +intelcorp.demdex.net +intelcorpchan.112.2o7.net +intelcorpcim.112.2o7.net +intelcorperror.112.2o7.net +intelcorpsupp.112.2o7.net +intelglobal.112.2o7.net +intelhdgraphicsgtdrive6w.metroblog.com +intelibroker.com +intellecthosting.net +intellekt21.ru +intellektmedia.at +intelliads.com +intellicampaign.com +intelligence.maxpoint.com +intelligentphonesex.com +intellimize.co +intellitxt.com +intelsad.com +intenalco.edu.co +intense.hashvault.pro +intensecoin.crypto-webminer.com +intensedigital.adk2x.com +intentmedia.com +intentmedia.net +intera-x.com +interac.refund-canada.com +interactive.forthnet.gr +interactivearea.ru +interactivepussy.com +interaxxx.com +interbuty.pl +interchangecorporation.122.2o7.net +intercom-assets.wootric.com +intercom.io +intercomcdn.com +intercomm01.backtrace.io +intercont1.de +interesnie-faktu.ru +interest.maxpoint.com +interestingz.pw +interfucks.net +intergi.com +interia-ek.ru +interia.adsearch.adkontekst.pl +interia.hit.gemius.pl +interior-stickers.ru +interkredyty.pl +interland.122.2o7.net +intermaids.com +intermare.it +intermaterials.net +intermediaceli.com +intermediads.com +intermesh.net +intermix.us.intellitxt.com +intermrkts.vo.llnwd.net +internal-clarity.idsp.inmobi.com +internal.33across.com +internal.adroll.com +internal.dev.kargo.com +internal.fuckyoucash.com +internal.fullstory.com +internal.instartlogic.com +internal.intentmedia.net +internal.intercom.io +internal.revcontent.com +internal.s50.exacttarget.com +internal.staging.fullstory.com +internal.staging.kargo.com +internal.undertone.com +internalads.gammae.com +internals.instartlogic.com +internationalmarble.com +internet-apteka.ru +internet-bb.tk +internet-cleaning-tool.capital-software.qarchive.org +internet-lte-5gb.blogspot.com +internet.billboard.cz +internet.marsmediachannels.com +internetartfair.com +internetautoguide.us.intellitxt.com +internetfuel.com +internethistorycleaner.ws +internetoboz.ru +internetowy-sklep.net +internetpornbible.com +internetretailer.d2.sc.omtrdc.net +internetsecurity.com +internetslet.nl +interracial-anal1.com +interracial-dating-services.info +interracial-sex.org +interracial.nu +interracialfuckingporn.com +interracialpussy.com +interracialraw.com +interracialsex.nu +interracialslutsex.com +interracialxporn.com +interreklame.de +intersite.adrizer.com +interstat.hu +interstitial-broker.fyber.com +interstitial.fyber.com +intervsem.ru +interyield.jmp9.com +interyield.td553.com +interyield.td563.com +interyield.td573.com +intext.billboard.cz +intext.ero-advertising.com +intext.lookit.cz +inthevip-sex.com +intimbutik.hu +intimerrance.jepose.com +intimshop-fantasy.ru +intljs.rmtag.com +intnet-offer.com +intogossip.us.intellitxt.com +intomobile.us.intellitxt.com +intouch.adinfuse.com +intouchsolutions.112.2o7.net +intra.fyber.com +intrack.pl +intranet.adtech.de +intucoin.crypto-webminer.com +intuit.sp1.convertro.com +intuitinc.122.2o7.net +inv-nets.admixer.net +invenio.sgn.com +invention.festinolente.cl +inventionpassenger.com +inventive.ca +inventory.allinviews.com +inventory.beeviewd.com +inventory.bestcontentonline.com +inventory.installfarm.com +inventory.shoofle.tv +inventorysvc.adlearnop.advertising.com +inveseting.com +invest-pamm.ru +investigate.ru +investingchannel.us.intellitxt.com +investingclub.ru +investmac.com +investment-advisors.com +investments.com +investopedia.us.intellitxt.com +investoradbg.hit.gemius.pl +investorbg.adocean.pl +investors.fyber.com +investors.healthysmileclub.com +investors.yext.com +investpamm.ru +investsuccess.org +investyb.com +investzalog.ru +invideo.ero-advertising.com +invisiblehide.com +invitation.opinionbar.com +invite.gezinti.com +invitefashion.com +inviterabbits.com +invitesugar.com +invivo.hu +invoice-template.org +inw-rtb1.rfihub.net +inwemo.com +inzn.ru +io-cdn.bfmio.com +io-stage.truconversion.com +io.truconversion.com +ioads.ero-advertising.com +ioam.de +iocdn.coremetrics.com +iodatadevice.d2.sc.omtrdc.net +ioit.iovation.com +ioita.com +iomibarcameno.it +iomoio.net +ioms.bfmio.com +ionamin.1.p2l.info +ionamin.t35.com +ionergize.com +ionicmsm.in +ionproxy.com +iontau.com +iooopsadd.info +ioops.com +iopeninghours.co.uk +ios-cheats.net +ios-icloud1.com +ios.bugly.qq.com +ios.fyber.com +ios.tenjin.com +iosads24.adcolony.com +iotiot.cf +ioubes.press +iovation.co.uk +iovation.com +iownit.optimizely.com +ip-182-50-129-164.ip.secureserver.net +ip-182-50-129-181.ip.secureserver.net +ip-geo.appspot.com +ip-sec.casalemedia.com +ip.casalemedia.com +ip.nuggad.net +ip.ro +ip.testing.piwik.pro +ip193.cn +ipacc1.adtech.de +ipacc1.adtech.fr +ipacc1.adtech.us +ipad2free4u.com +ipadzu.net +ipbc.crypto-webminer.com +ipblocker.info +ipbsgpm4.top +ipcloak.org +ipcmarieclaireprod.122.2o7.net +ipcmedia.122.2o7.net +ipcnowprod.122.2o7.net +ipcom.ru +ipcuncut.122.2o7.net +ipcwebuserprod.122.2o7.net +ipcyachtingworldprod.122.2o7.net +ipdata.adtech.de +ipdata.adtech.fr +ipdata.adtech.us +ipdcgsdjkz.bid +iperceptions.com +iperporno.com +iphant.de +iphone-avril.offreflash.xyz +iphone.stage-one.heyzap.com +iphone.stage-three.heyzap.com +iphone.stage-two.heyzap.com +iphonegames3g.com +iphwttyqzuhucw.bid +ipintu.com.cn +ipl.hk +iplogger.org +iplookup.adready.com +ipm-provider.ff.avast.com +ipmsc.com +ipndulsempjgb.bid +ipornservice.com +iposhq.com +ipostroika.ru +ipproxy.biz +ipro.com +iprocollect.realmedia.com +iprofile.bandwidthx.net +ipromsi.iprom.net +iproxee.com +ips-invite.iperceptions.com +ipshougou.com +ipsite.net +iptoo.cruisingsmallship.com +iptool.xyz +iptrack.io +ipv6.freebitco.in +ipw.me +ipw13.free.fr +ipzd.pl +iq-test.dk +iq-testuj.pl +iq.adtech.de +iq.adtechjp.com +iq.adtechus.com +iq001.adtech.de +iq001.adtech.fr +iq001.adtech.us +iqdigitalmediamarketinggmbh.sc.omtrdc.net +iqoption.com +iqoption.pro +iqreport-dc1.adtech.de +iqreport-dc2.adtech.de +iqreport-us-ec.adtechus.com +iqreport.adtech.de +iqreport.adtechus.com +iqs.biz.ua +iqtestuj.glt.pl +iquality.ru +iqupdatetmz.win +iqwbqjnst.bid +ir-br.amazon-adsystem.com +ir-ca.amazon-adsystem.com +ir-cn.amazon-adsystem.com +ir-de.amazon-adsystem.com +ir-es.amazon-adsystem.com +ir-fr.amazon-adsystem.com +ir-in.amazon-adsystem.com +ir-it.amazon-adsystem.com +ir-jp.amazon-adsystem.com +ir-mx.amazon-adsystem.com +ir-na.amazon-adsystem.com +ir-uk.amazon-adsystem.com +ir.audience.newscgp.com +ir.doubleclick.net +ir.franklyinc.com +ir.maxpoint.com +ir.newrelic.com +ir.pixel.newscgp.com +ir.tags.newscgp.com +ir2-beap.cb.g01.yahoodns.net +ir2.beap.gemini.yahoo.com +ir34gri.51p.ru +iracomparison.com +iradiology.ru +iranproxy.info +ircasia.org +ircleaner.com +ireklama.cz +ireklama.mk +irfantrading.com +irganalytics.com +irondel.swisshost.by +irrrymucwxjl.ru +irs01.net +irv-sslvpn.silverpop.com +is-gateway.supersonicads.com +is.casalemedia.com +is.luxup.ru +is.mediadelivery.fi +is.vsassets.com +is2.websearch.com +isaca.sc.omtrdc.net +isaca.tt.omtrdc.net +isamuxpompapsc50.6ka.info +isettatech.com +isg01.casalemedia.com +isg02.casalemedia.com +isg03.casalemedia.com +isg04.casalemedia.com +isg05.casalemedia.com +isg06.casalemedia.com +isg07.casalemedia.com +isg08.casalemedia.com +isg09.casalemedia.com +islamicmarketing.net +islamipedia.org +islandmob.com +ism2trk.com +ism6.emediate.eu +isonomia.com.ar +ispot-mx.ispot.tv +ispot.tv +isralink.net +issges.oewabox.at +issue-2-rnd-gke-test.rnd.gcp.datamind.ru +istartsurf.com +istlandoll.com +istockbargains.com +isuzi.com +iswwwup.com +it-vcenter-01.corp.appdynamics.com +it.adserver.yahoo.com +it.altervista.org +it.bannerout.com +it.cookiescript.info +it.erosadv.com +it.globalsweeps.info +it.returnpath.com +italy.scorecardresearch.com +itc.2081.blueseek.com +itcg3.c5369.blueseek.com +itcn.ssacdn.com +itcompany.com +itemagic.net +itempana.site +itfarm.com +ithyk.frenchgerlemanelectric.com +itmcash.com +itmedia.122.2o7.net +itns.cpufan.club +itop.cz +itpro.uk.intellitxt.com +itrackerpro.com +itreviews.uk.intellitxt.com +its-that-easy.com +itsfree123.com +itsmyturn.nablabee.com +itsupport.outbrain.com +ittoolbox.us.intellitxt.com +itunesdownloadstore.com +itv.112.2o7.net +itwititer.com +itworld.us.intellitxt.com +itx5-publicidad.smartadserver.com +itx5.smartadserver.com +itxt.vibrantmedia.com +itxt2.us.intellitxt.com +itxt3.us.intellitxt.com +ity.elusmedic.ru +iubenda.com +iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com +iuqerfsodp9ifjaposdfjhgosurijfaewrwergwff.com +iusacomlive.112.2o7.net +iv.doubleclick.net +iv24.pl +iva.dev.extremereach.com +iva.extremereach.com +ivillage.us.intellitxt.com +ivillageglobal.112.2o7.net +ivitrine.buscape.com +ivox.socratos.net +ivuovhsn.ru +ivwbox.de +ivykiosk.com +iwa.hit.interia.pl +iwantmy-freelaptop.com +iwantmyfree-laptop.com +iwantmyfreecash.com +iwantmyfreelaptop.com +iwantmygiftcard.com +iwgtest.co.uk +iwhab.randbinternationaltravel.com +iwon.us.intellitxt.com +iwstat.tudou.com +ixoox.csheaven.com +ixvenhgwukn.ru +iybasketball.info +iyfnzgb.com +iyogi.demdex.net +izarc.fr +izitracking.izimailing.com +izzy-cars.nl +j-video.com +j.2004cms.com +j.6sc.co +j.adlooxtracking.com +j.admob.com +j.clickdensity.com +j.flxpxl.com +j.pioneeringad.com +j.theadsnet.com +j.traffichunt.com +j.zemanta.com +j.zeroredirect.com +j3safetyismyname.com +j93557g.com +ja.revolvermaps.com +jabu.popunder.ru +jaccs.122.2o7.net +jackbootedroom.com +jacketspolska.cn +jackpot.112.2o7.net +jacksonsun.us.intellitxt.com +jact.atdmt.com +jadcenter.com +jade01.webtrekk.net +jade853gmbh.tt.omtrdc.net +jadeitite.com +jadserve.postrelease.com +jadserve.postrelease.com.akadns.net +jaeger.vungle.com +jagi.buypixelads.com +jahisope45.bid +jajajaj-thats-you-really.com +jakeludington.us.intellitxt.com +jakpodrywacnatinderze.pl +jamba.pl +jambocast.com +jamecoelectronics.sc.omtrdc.net +jamster.pl +janeaustenjoy.com +janezk.50webs.co +japan.inmobi.com +japanese-girl-xxx.com +japanesevehicles.us +japanmadchen.com +japscat.org +japtron.es +japveny.ru +jarsquatter.com +jarvis.adwyze.com +jasmine.directprimal.com +jasmine.noblock.pro +jasmine2.directprimal.com +jat01.iwantyourightnow.info +java-games.bestxs.de +javascriptobfuscator.com +jb.revolvermaps.com +jb9clfifs6.s.ad6media.fr +jbaventures.cjt1.net +jbeet.cjt1.net +jbit.cjt1.net +jc.revolvermaps.com +jcarter.spinbox.net +jcb.sc.omtrdc.net +jcb.tt.omtrdc.net +jcollegehumor.cjt1.net +jcom.122.2o7.net +jcontent.bns1.net +jcount.com +jcrew.tt.omtrdc.net +jcrewcom.112.2o7.net +jcwhiney.com +jcwhintey.com +jcwhitey.com +jcwhitney.112.2o7.net +jd.revolvermaps.com +jdfabrication.com +jdownloadacc.cjt1.net +jdownloader.fr +je.revolvermaps.com +jeansvixens.com +jedz-eco.pl +jejuskypension.com +jelly.mdhv.io +jen01.zemanta.com +jenkins-devops.thunderhead.com +jenkins.adwyze.com +jenkins.adx1.com +jenkins.gce.petametrics.com +jenkins.kargo.com +jenno.adsb4all.com +jennycraig.112.2o7.net +jerichoplay.com +jersey-offer.com +jerzyzieba.com +jesnyxa.beep.com +jessisjewels.com +jetbluecom2.112.2o7.net +jetbluepkgcs.112.2o7.net +jetlore.com +jetparty.net +jetstar.sizmek.com +jezyk500plus.pl +jf.revolvermaps.com +jf71qh5v14.com +jg.hack-inter.net +jg.revolvermaps.com +jgedads.cjt.net +jgen1.cjt1.net +jgen10.cjt1.net +jgen11.cjt1.net +jgen12.cjt1.net +jgen13.cjt1.net +jgen14.cjt1.net +jgen15.cjt1.net +jgen16.cjt1.net +jgen17.cjt1.net +jgen18.cjt1.net +jgen19.cjt1.net +jgen2.cjt1.net +jgen20.cjt1.net +jgen21.cjt1.net +jgen22.cjt1.net +jgen23.cjt1.net +jgen24.cjt1.net +jgen25.cjt1.net +jgen26.cjt1.net +jgen27.cjt1.net +jgen28.cjt1.net +jgen29.cjt1.net +jgen3.cjt1.net +jgen30.cjt1.net +jgen31.cjt1.net +jgen32.cjt1.net +jgen33.cjt1.net +jgen34.cjt1.net +jgen35.cjt1.net +jgen36.cjt1.net +jgen37.cjt1.net +jgen38.cjt1.net +jgen39.cjt1.net +jgen4.cjt1.net +jgen40.cjt1.net +jgen41.cjt1.net +jgen42.cjt1.net +jgen43.cjt1.net +jgen44.cjt1.net +jgen45.cjt1.net +jgen46.cjt1.net +jgen47.cjt1.net +jgen48.cjt1.net +jgen49.cjt1.net +jgen5.cjt1.net +jgen6.cjt1.net +jgen7.cjt1.net +jgen8.cjt1.net +jgen9.cjt1.net +jgoyk.cjt1.net +jh.revolvermaps.com +jhfdmiwcgnty.ru +jhondi33.duckdns.org +jhumour.cjt1.net +ji.revolvermaps.com +jijsonline.112.2o7.net +jijsonline.122.2o7.net +jiktnv.122.2o7.net +jingjia.qq.com +jinkads.de +jira-dev.digitalremedy.com +jira-test.sizmek.com +jira-testing.districtm.net +jira.247realmedia.com +jira.digitalremedy.com +jira.districtm.net +jira.face2trade.com +jira.infra.inmobi.com +jira.insnw.net +jira.office.imprev.net +jira.sizmek.com +jira.vpn.insnw.net +jitmj4.122.2o7.net +jivox.com +jiwire.112.2o7.net +jiwtmj.122.2o7.net +jiztini.com +jizzads.com +jk.revolvermaps.com +jkearns.freestats.com +jkontherun.us.intellitxt.com +jl29jd25sm24mc29.com +jlinks.industrybrains.com +jlzebszkilcz.ru +jmbi58.cjt1.net +jmm.livestat.com +jmn.jangonetwork.com +jmp2click.com +jmsyap.112.2o7.net +jmvjmgofvxnu.com +jn.redirectme.net +jnova.cjt1.net +jnpzz.1445tzvxq.firc.gdn +job-online.petrovka.info +joblo.us.intellitxt.com +jobs-online.petrovka.info +jobs.marketing365.mk +jobs.nuwerk.monsterboard.nl +jobs.taboola.com +jobs.thirdpresence.com +jobwohn.oewabox.at +jobzdk.nuggad.net +joe.freelogs.com +joecartonn.com +joellina.free.fr +joelosteenministries.112.2o7.net +joelosteenministries.tt.omtrdc.net +joessmogtestonly.com +joetec.net +joetoons.com +joeynizuk.com +jogiwogi.com +johnchow.us.intellitxt.com +johnfrieda.lisnr.com +johnlewis.112.2o7.net +johnsmithsmethod.com +join.pro-gaming-world.com +join1.winhundred.com +joincreditexpert.co.uk +joinourwebsite.com +joomla.viewbix.com +jordenmadsen.com +josip-stadler.org +journal-des-bourses.com +journalism.uk.smarttargetting.com +journalregistercompany.122.2o7.net +jp-gmtdmp.gd9.mookie1.com +jp-u.openx.net +jp.adlearnop.advertising.com +jp.admob.com +jp.adnxs.com +jp.advertising.com +jp.as.criteo.com +jp.as.criteo.net +jp.at.atwola.com +jp.doubleclick.net +jp.marketo.com +jp.marketolive.com +jpdk.nuggad.net +jpirate.cjt1.net +jpush.io +jpx-d3.openxenterprise.com +jqassets.download +jqcdn.download +jqcdn01.herokuapp.com +jqcdn03.herokuapp.com +jqcdn2.herokuapp.com +jqmrqgaunex.ru +jqr-cdn.download +jqrcdn.download +jque.net +jquerrycdn.download +jquery-cdn.download +jquery-uim.download +jqueryscript.net +jqwww.download +jqxrrygqnagn.ru +jrcdelcotimescom.122.2o7.net +jrcom.112.2o7.net +jroqvbvw.info +jrpfekf.angelfire.com +js-agent.newrelic.com +js-at.goldbach.com +js-cdn.dynatrace.com +js-sec.casalemedia.com +js-sec.indexww.com +js.ad-score.com +js.ad.mediamond.it +js.adlink.net +js.admngr.com +js.adpremium.org +js.ads.ero-advertising.com +js.adscale.de +js.adserverpub.com +js.adsonar.com +js.adsrvr.org +js.affiliatelounge.com +js.agkn.com +js.alexametrics.com +js.analytics.yahoo.com +js.apxlv.com +js.betburdaaffiliates.com +js.bizographics.com +js.bronto.com +js.bunchofads.com +js.casalemedia.com +js.clickequations.net +js.coinhive.com +js.coinisrsdelivery.com +js.convertale.com +js.cybermonitor.com +js.driftt.com +js.e-generator.com +js.en.redtram.com +js.ero-advertising.com +js.ftp0118.info +js.geoads.com +js.goods.redtram.com +js.himediads.com +js.hotkeys.com +js.hotlog.ru +js.hs-analytics.net +js.hs-scripts.com +js.hscollectedforms.net +js.hscta.net +js.hsforms.net +js.hsleadflows.net +js.hubspot.com +js.indexww.com +js.intercomcdn.com +js.iodo.com +js.juicyads.com +js.livehelper.com +js.matheranalytics.com +js.moatads.com +js.nahnoji.cz +js.octopuspop.com +js.pascal1.science +js.redtram.com +js.revsci.net +js.ru.redtram.com +js.selectornews.com +js.smartredirect.de +js.smi2.ru +js.softreklam.com +js.spotx.tv +js.srcsmrtgs.com +js.stats.de +js.stormiq.com +js.stroeermediabrands.de +js.tongji.linezing.com +js.ua.redtram.com +js.users.51.la +js.vidoza.net +js.zevents.com +js1.bloggerads.net +js1.hitbox.com +js11.clickzs.com +js11.clickzzs.nl +js3.clickzs.com +js34dc10.gamooga.com +js4.clickzs.com +js4.ringrevenue.com +js5.clickzs.com +js6.clickzs.com +js7.clickzs.com +js7.clickzzs.nl +js77.neodatagroup.com +js8.clickzs.com +js9.clickzs.com +jsads.sina.com.hk +jsandboxer.cjt1.net +jsc.adskeeper.co.uk +jsc.dt07.net +jsc.madisonlogic.com +jsc.marketgid.com +jsc.mgid.com +jsccnn.com +jscdndel.com +jsecoin.com +jsfp.coremetrics.com +jsg.dt07.net +jshosting.bid +jshosting.date +jshosting.download +jshosting.loan +jshosting.party +jshosting.racing +jshosting.review +jshosting.stream +jshosting.trade +jshosting.win +jsing.net +jsl.revsci.net +jsn.dt00.net +jsn.dt07.net +jsn.marketgid.com +jsn.mgid.com +json4.ringrevenue.com +jsonip.com +jsonlinecollect.247realmedia.com +jsp.clickzs.com +jsp.clickzzs.nl +jsp2.clickzs.com +jsp2.clickzzs.nl +jsrdn.com +jss.adroll.com +jss.aweber.com +jssdk.beetv.net +jssdkcdns.mparticle.com +jssdks.mparticle.com +jssourcetest-bg.web.analytics.yahoo.com +jstaikos.com +jsu.mgid.com +jsv.adserve.video +jt.india.com +jt.ms +jtt.sc.omtrdc.net +jtt.tt.omtrdc.net +ju2g8tzj.com +judaismart.com +judgesel.com +judo-steinbach.de +judo.salon.com +jue0jc.lukodorsai.info +juedische-kammerphilharmonie.de +juegospopulares.org +juegosporno.aeromodelnet.com.ar +juggler.inetinteractive.com +juggler.services.disqus.com +juggsmovs.com +juh.in +juicecleanse.com.au +juicemobile.com +juicy-news.blogspot.us.intellitxt.com +juicyads.com +juicyceleb.us.intellitxt.com +juicypussyclips.com +juicywin.pl +jujitsu-ostrava.info +julia--from-crimson-teens-black-lingerine.blogomer.com +juliannas957.000webhostapp.com +juliannmore.com +juliaworld.net +julie82.free.fr +jumcna.cjt1.net +jumhqsxgnkuvfn.bid +jump.aragontrack.com +jump.ewoss.net +jump.ogtrk.net +jumpers.mobi +jumpman.office.imprev.net +jumptap.com +jumptolove.org +junecleeland.com +junglenet-a.akamaihd.net +junior.apk.net +juniorhandling.pl +juoyynafgp.bid +jupiter.appads.com +jupiter.us.intellitxt.com +jupiter1.appads.com +jupiter2.appads.com +jupiter3.appads.com +jupitersatellites.biz +jupyter.playdemic.wbinsights.com +jupyter.wbinsights.com +jur.unn.ac.ru +juriscorp.com.br +jurty.ml +jurtym.cf +just10s.com +just69.com +justamateurteens.com +justask.com.au +justbcause.com +justbii.com +justbrowse.net +justdate.net +justdating.online +juste.ru +justicejudo.com +justinterracialsex.com +justintimetac.com +justjared.crwdcntrl.net +justjared.us.intellitxt.com +justmoresex.com +justmovietrailers.us.intellitxt.com +justos.com +justpleasure.biz +justprofit.xyz +justredirect24.com +justrelevant.com +justsayingbro.com +juststatic.info +justteenmovie.com +justtrck.com +justwebads.com +jutiagroup.us.intellitxt.com +jwduahujge.ru +jwebbsense.cjt1.net +jwn.hansel.cquotient.com +jwpltx.com +jwwhsqz.ru +jxliu.com +jyhfuqoh.info +jyknnhll.yearbrazil.com +jzclick.soso.com +jzigsobgsmxdmr.bid +jzrvquay.angelcities.com +k-auth-dev.staging.us-east-1.kops.kargo.com +k-lite.tk +k-serve.svc.kargo.com +k.admob.com +k.adx1.com +k.h.a.d.free.fr +k.iinfo.cz +k.intellitxt.com +k.libre.free.fr +k.streamrail.com +k.zeroredirect.com +k1.midasplayer.com +k1qa.midasplayer.com +k1s.nl +k2001.free.fr +k5ads.osdn.com +k5market.com +k5zoom.com +k8dev.adsrvr.org +k8int.adsrvr.org +k8prd.adsrvr.org +k8s.dev.kargo.com +k8s.jenkins.infra-east-1.braze.com +k8s.staging.kargo.com +k8s.stc-001.s-euc-1.braze.eu +k9europe.com +ka.bar.need2find.com +ka04b.com +kaartenhuis.nl.site-id.nl +kabannihon.biz +kabey.000webhostapp.com +kaboose.112.2o7.net +kaboose.us.intellitxt.com +kace.exacttarget.com +kacstserv.kacst.edu.sa +kadikoyden.com +kadinlaragore.com +kadirzerey.com +kadman.net +kafune.theappgrader.com +kaie.pl +kaizentraffic.com +kalantzis.net +kalipasindra.online +kamasutra.popunder.ru +kampyle.com +kancelariakufieta.pl +kanoodle.com +kansas.valueclick.com +kantarmedia.guardian.co.uk +kapcotool.com +karachev-city.ru +karadene.com +karaganda.xkaz.org +karbowanec.crypto-webminer.com +kargo.com +kargonaut.dev.stage.us-east-1.kops.kargo.com +karisimbi.net +karma.mdpcdn.com +karonty.com +karpet.cloud.kargo.com +karriere.oewabox.at +kartavisa.pl +kasa-sms.pl +kaspar.free.fr +kaspersky-shop.ch +kaspersky.122.2o7.net +kaspersky.d3.sc.omtrdc.net +kasperthreatpostprod.112.2o7.net +kassabravo.com +kassandra-bibby.us +kasterborous.us.intellitxt.com +katariyaconsultancy.com +katastof.nu +katespadeoutlets.biz +katewinslet.nu +katharina-von-bora.de +kathy.foceni.org +katia-paliotti.com +katiagirl.free.fr +katjimej.blog.fc2.com +katrinashotline.net +katu.adbureau.net +katushka.net +katzdev.com +kaviar-dreams.be.tc +kaviar-video-foto.de +kavkazporno.com +kayakingtrips.info +kayfie.com +kaykk.com +kaylaxxx.com +kaytri.com +kaz.kz +kazaa.adserver.co.il +kazaa.com +kazaki.az +kazan.xrus.org +kazan.zrus.org +kazinogames.lv +kazrent.com +kb.criteo.com +kb.silverpop.com +kba.ch +kbbmain.112.2o7.net +kbd1.kpns.ijinshan.com +kbd2.kpns.ijinshan.com +kbgphmpg.bid +kbipxydhakpdwj.bid +kbr-builder-dev.staging.us-east-1.kops.kargo.com +kbr-builder-staging.staging.us-east-1.kops.kargo.com +kbr-builder.dev.kargo.com +kbr-builder.production.us-east-1.kops.kargo.com +kbr-builder.staging.kargo.com +kbr-builder.staging.us-east-1.kops.kargo.com +kbta.kr +kbthai.com +kbxkcmpd.bid +kbxxd5.close.futureisready.com +kbzdxt.com +kc.mv.bidsystem.com +kc.search.need2find.com +kc.xmlsearch.miva.com +kchaxton.com +kcta.or.kr +kczambians.com +kddi.122.2o7.net +kdev.kargo.com +kdmkauchahynhrs.ru +kdowqlpt.info +kdrhb.com +kds-miit.ru +kds-pixel-dev.stage.us-east-1.kops.kargo.com +kds-reklam.rtb.adx1.com +kds.ero-advertising.com +kdsmedia-ibv.rtb.adx1.com +kdsmedia.rtb.adx1.com +kdsmedianative.rtb.adp3.rtb.adx1.com +kebbe.co.be +kecap.cn +kedtise.com +keemy.butlerelectricsupply.com +keen.io +keepaneyeadmk.hit.gemius.pl +keepaneyemk.adocean.pl +keepass.fr +keepcolletive.com +keephide.com +keepongoing.info +keepvacom.com +keepyoungphone.bid +keihard.be +kein-brd-personal.de +keisu02.eproof.com +kekuko.com +keller-gmbh.de +kelleybluebook.112.2o7.net +kellicardoso.com +kellie-eicher.us +kellnerengenharia.com.br +kelly-arrant.us +kellyholmes.leadpages.co +kellykarousi.gr +kentsucks.youcanoptout.com +kergaukr.com +kermit.macnn.com +kerplat.112.2o7.net +keshefoundation.org +kestrel.ospreymedialp.com +ketchapp.org +keybank.112.2o7.net +keybinary.com +keygen.us +keymedia.hu +keys.dmtracker.com +keytarget.adnet.lt +keyupgrade.stableupdate.space +keyupgrade.thecentral2updating.bid +keyways.pt +keywordblocks.com +keywordmax.com +keywords.adtlgc.com +keywords.fmpub.net +kfc.i.illuminationes.com +kg.snapads.com +kgile.grejt.pl +kgv-am-teich.de +kh-mi-lk.de +khafre.us +khalto.info +khancademy.com +kharagpur.in +khawatire.com +khingtracking.com +khios.net +kho3au7l4z.me +khpgychzfdmpm.bid +kibana.prd.fyber.com +kibana.tracker.fyber.com +kickass-porn.com +kickass.cd +kickasscash.biz +kickassratios.com +kickasstorrents.website +kickassvids.com +kickeer.de +kicker.ivwbox.de +kidd.reunionwatch.com +kideng.ml +kidporno.com +kidportal.com +kids-fashion.dk +kids-in-sandbox.com +kidsangel.com +kidsinsandbox.info +kidslanguageresources.com +kidswithfoodallergies.cdn.adglare.net +kidswithfoodallergies.engine.adglare.net +kiel-automeile.de +kieselmann.su +kiiksafety.co.id +kiken.jp +kikilll0009.000webhostapp.com +kikoo-gaysexe.blogspot.com +kiks.yandex.ru +killergramvideo.com +killersex.nu +killerstartups.us.intellitxt.com +kilomniadst.info +kimandkristine.tv +kimberleywhitchurch.com +kimcurlrvsms.com +kimera.pl +kimeto.de +kimeunjung.com +kimexfinances.ci +kims-free-porno-pictures-and-gay-sex.gocunt.com +kimsvids.com +kimvonmartin.com +kindads.com +kinder.oewabox.at +kinderporno.de +kindler-knuettel.de +kinesismotorsport.com +kingbabes.com +kingdomporn.info +kingproxy.info +kingskillz.ru +kinhtexaydung.biz +kinkswap.com +kinky-kate.com +kinkyhampers.com +kinkyhardcore.nu +kinkyindex.com +kinkylivegirls.com +kinkyonly.com +kinkysex.nu +kinkyshop.nu +kinkystars.com +kino-key.info +kino-rating.ru +kino-tv.pl +kino2018.club +kinobaks.com +kinofree.popunder.ru +kinohabr.net +kinohit1.ru +kinoman-tv.pl +kinoplen.ru +kinopolet.net +kinostorm.net +kinotek.pl +kinotorka.ru +kinowelt.oewabox.at +kinsalehistorysociety.com +kinsmanrewards.com +kinujemy.pl +kinzigtalradio.de +kiosked-d.openx.net +kip5j.com +kipasdenim.com +kiplinger-d.openx.net +kiplinger.112.2o7.net +kipo.info +kippbeak.cf +kiprinform.com +kiptis.ru +kirdugunu.com.tr +kirgo.at +kirmesfun.de +kirov.zrus.org +kisakuku.ru +kissdoujin.com +kisshentai.net +kissingsuzykolber.us.intellitxt.com +kissmetrics.com +kisssass.com +kissyou.co.uk +kit-opt.ru +kitabagi.id +kitaj.dk +kitaramarketplace.com +kitaramedia.com +kitaratrk.com +kitchen-island.mensk.us +kithrup.matchlogic.com +kitschy.nl +kitsjim.com +kittyscash.com +kittyscontent.com +kittystore.net +kiviksaif.se +kiwe-analytics.com +kiwi237au.tk +kiwifarms.net +kiwinija.com +kixer.com +kizlar.info +kj2hy.com +kjbbc.net +kjhkgh.skroc.pl +kjli.fi +kkd-consulting.com +kl21.pl +kladrus.ru +klakka.com +klbu.com +klick.prod.us-east-1.gcs.kargo.com +klikasz-i-masz.com +klikbonus.com +klikk.linkpulse.com +klikmoney.net +kliks.affiliate4you.nl +kliks.nl +kliksaya.com +klingeltoene.eintippen.sms13.de +klingeltoene.ericsson.sms13.de +klipads.dvlabs.com +klipmart.dvlabs.com +klipmart.forbes.com +klmfvshct.bid +klosetkitten.com +kloshpro.com +klowns4phun.com +kls.secure-cart.biz +klsex.info +kmavj.ab4all.com +kmdl101.com +knac.us.intellitxt.com +knc.lv +knifeoctopus.com +knight.economist.com +kniverto.com +knorex.com +knowledge.digitalremedy.com +knowledge.tapjoy.com +knowledge.vergic.com +known.counsellor.gov.cn +knowyourmobile.uk.intellitxt.com +kobetai.org +kobeteppanyakiandsushi.com +kocham-cie.c0.pl +kochanelli.com +kochava.com +kochsfarmservice.com +koddenberg.com +kodyrabatowe.16mb.com +kodyumyslu.pl +koho.in +kohsarmangla.com +koi4ever.de +kokinoo.com +kol-energo.ru +kolath.in +koleso24.com.ua +kolibri-store.de +kollagen4you.se +kollesa.ru +kollory-fejsa.blogspot.com +kolloryfejsa.blogspot.com +kolorfacebooka24.blogspot.com +kolorowo.grupki.com +kolorowy-f-b.blogspot.com +kolorowy-fejs.blogspot.com +koloryfejsa.blogspot.com +kolotiloff.ru +komdan.nl +komklaar.nu +komodia.com +komoona-d.openx.net +komoona.com +komp-pomosch.ru +kompasads.com +komputernaya-pomosh-moscow.ru +komputers-best.ru +komvet.eu +kon.hit.gemius.pl +kona.kontera.com +kona2.kontera.com +kona3.kontera.com +kona33.kontera.com +kona4.kontera.com +kona5.kontera.com +kona6.kontera.com +kona7.kontera.com +kona8.kontera.com +konax.kontera.com +konecrenes.com +konferencje.vantis.pl +konflow.com +kongoultry.net +kongruan.com +konicaminoltahd.122.2o7.net +konkurs.mtrend.ru +konkursbiedronka.5v.pl +konkursnafb.firmowo.net +konkursov.net +konkursy.de +konkursy24.ml +konnect.videoplaza.tv +konoplisemena.com +konstantin.freespaces.com +konteiner24.com +kontera.com +konturkrasoty.ru +koopilka.com +kopies.info +kopticom.122.2o7.net +koptims.tiu.ru +koral.se +korea.inmobi.com +koreanfox.com +koreatojapan.com +korkeaoja.org +korngiebel.de +koronirealestate.gr +korsikafreunde.de +korstnatont.ee +korturl.com +kos.interseek.si +kosdyvore.angelcities.com +kosova.de +koszykrd.wp.pl +koudas.alphonso.tv +kowasaki.com +kpfu.ru +kplusd.far.ru +kpopstarz.us.intellitxt.com +kpremium.com +kqzyfj.com +kr.phorm.com +krafteurope.112.2o7.net +krater.iprom.net +krb.devphp.org.ua +krdn.pl +kreaffiliation.com +kreativci.marketing365.mk +krebsmethod.com +krk.kargo.com +kroger.sc.omtrdc.net +kroger.tt.omtrdc.net +krone.nuggad.net +krone.oewabox.at +kronehit.oewabox.at +kropka.onet.pl +krs.ymxpb.com +krsa2gno.congrats-sweepstakes-winner.com +krsa2gno.important-security-brower-alert.com +krsa2gno.internet-security-alert.com +krsa2gno.todays-sweepstakes-winner.com +krsa2gno.youre-todays-lucky-sweeps-winner.com +krxd.net +kryptochemik.pl +ks.5.p2l.info +ks4-com.travian.com +kserv.krldysh.ru +ksias.adx1.com +ksiazka-telefoniczna-online.pl +ksimdw.ru +kt.tns-gallup.dk +kt4.kliptracker.com +ktopodgladamnienafacebooku.wordpress.com +ktrackdata.com +ktu.sv2.biz +ktva.112.2o7.net +ku6.allyes.com +ku6afp.allyes.com +kubana.vungle.com +kube-qa.nj1.yext.com +kube-qa.tx1.yext.com +kube-sbx.nj1.yext.com +kube-sbx.tx1.yext.com +kube.app.api.jivox.com +kube.app.jivox.com +kube.brb.api.jivox.com +kube.nj1.yext.com +kube.office.yext.com +kube.tx1.yext.com +kuber.dsp-bidder-dev.demandbase.com +kuhdi.com +kuikdelivery.com +kulro.csheaven.com +kumma-hb.hb.adx1.com +kunay.nullrefexcep.com +kupzytax.pl +kuriero.pl +kushat.roboinside.me +kustenshundklubb.com +kut.je +kutikomi.net +kutjevullen.nu +kutpomp.nl +kutt.nl +kutwijf.info +kuvars.org +kuwaitils.com +kuyhee.com +kuyxjgf.ga +kvartiry-remont.ucoz.ru +kvfdhsmrrwamt.bid +kvinit-prod.api.kochava.com +kvismaren.se +kvors.com +kvtek.in +kvvijrmu.angelcities.com +kw21.org +kwantm.nl +kwbro6gf.free.fr +kwbtgame.com +kwery.com +kwistal.nl +kwiz.biz +kwjam.com +kwovwwkevyu.bid +kwserver.adhispanic.com +kwzf.net +kwzuhmpwvsbsc.bid +kx686.com +kxrcjhogag.ru +kxrzz.superpromo.7112531.com +ky.5.p2l.info +kyegtutis.bid +kylacole.biz +kylbshaqo.bid +kyliebaby.com +kylin.gaeadata.com +kyoto.com.br +kyrsu.frost-electric-supply.com +kz.search.need2find.com +kz.tns-counter.ru +l-shop.nullrefexcep.com +l-sspcash.adxcore.com +l-v1.presage.io +l.5min.com +l.admob.com +l.adxcore.com +l.betrad.com +l.com +l.heatmap.it +l.kavanga.ru +l.linkpulse.com +l.lp4.io +l.ohmyad.co +l.qq.com +l.sharethis.com +l.socialsexnetwork.net +l.wix.com +l.yieldmanager.net +l.zeroredirect.com +l1.cdn.qnsr.com +l1.qsstats.com +l1.zedo.com +l2.l.qq.com +l2.visiblemeasures.com +l2.zedo.com +l2pdus.mookie1.com +l3.zedo.com +l33tsite.info +l4.zedo.com +l5.zedo.com +l6.zedo.com +l66.info +l7.zedo.com +l8.zedo.com +l9tdhe6.com +la-debutante.com +la-fa.ru +la-jeune-fille.com +la-tex.de +la-trc.taboola.com +la.5.p2l.info +la.morgane.free.fr +lab.braze.com +lab.petametrics.com +lab.tune.com +lab88inc.112.2o7.net +labaronnedelanuit.free.fr +labelleheloise.free.fr +labelwater.se +labmen.com +laboratories.net +laboratoriosanangel.mx +laboratorysafe.com +laborem.ca +laboroflove.us.intellitxt.com +labout.info +labplus.ru +labs-cdn.revcontent.com +labs-s1.revcontent.com +labs-s2.revcontent.com +labs-s4.revcontent.com +labs-stg.revcontent.com +labs.criteo.com +labs.natpal.com +labs.revcontent.com +labs.tabmo.io +labs.tune.com +labtags.com +labvis.host.sk +lacableshaw.com +lachattepoilue.net +lachicadelmes.com +laclinicdelachatte.free.fr +lacloop.info +lacoccinella.info +lacuesta.com +lacv.co.in +ladaproxy.info +ladesnuda.com +ladies-in-lingerie.com +ladieshj.112.2o7.net +ladiessite.ru +ladov.ru +lady-lara.de +lady-masquerade.com +lady-raya.de +ladyboyparis.free.fr +ladyclicks.ru +ladyconstancez.com +ladydeefragrances.com +ladyfick.de +ladyhentai.free.fr +ladymargaux.com +ladypandora.co.uk +ladyporn.net +ladyshemale.com +laexotic.com +laferia.cr +lagubox.net +laineygossip.us.intellitxt.com +lakeecogroup.com +lakemedelsvarket.se +lakequincy.com +lakeshore.d1.sc.omtrdc.net +lakita.com +lalaglam.free.fr +laleh.itrc.ac.ir +lamaindanslecul.free.fr +lamaisondelaforet.net +lambdafoobar.de +lamecaniquedesfemmes.free.fr +lamictal.about-tabs.com +lamiflor.xyz +lamisil.about-tabs.com +lampband.com +lan.datasecu.download +lan.free-lyrics-online.com +land.pckeeper.software +land.purifier.cc +land.retailtoriches.com +landground.com +landing.analyticson.com +landing.paradym.com +landing.piwik.pro +landing.returnpath.com +landing.trafficz.com +landingpages.sunnytoolz.com +landings.trafficz.com +landingtest.mixpanel.com +landisbaptist.com +landolakescomprod.112.2o7.net +landreferat.ru +landscaping.center +landsend.112.2o7.net +landtrades.co.uk +landwirt.oewabox.at +langehomosexfilms.nl +langkawi.name +languagecode.com +languages-online.org.uk +langzeitwetter.de +lank.ru +lankamailads.info +lankarns.com +lannuairex.free.fr +lanonna.co.uk +lanticoforno.it +lanzar.publicidadweb.com +lanzarotehoppa.com +laparfumotec.com +lapiden.com +lapitec.eu +lapkowo.pl +laptoper.net +laptoplogic.us.intellitxt.com +laptopmag.122.2o7.net +laptopmag.us.intellitxt.com +laptopreportcard.com +laptoprewards.com +laptoprewardsgroup.com +laptoprewardszone.com +lararquitectura.com +laredoute.solution.weborama.fr +largeloot.com +larion.in +larivieracasino.com +larodimas.top +larosaantica.com +larose.jb2c.me +larutti.ru +las-rp.pl +laser-kunst.de +laserveradedomaina.com +lashandlashes.hu +lasherzlinks.com +laski.qii.pl +lastampa01.webtrekk.net +lasthr.info +lastmeasure.zoy.org +lastminengb.112.2o7.net +lat34.us.intellitxt.com +lateecapes.com +latency.ttrraacckkrr.com +latest.app.optimizely.com +latestpromotions.club +latestsearch.website +latin3.directtrack.com +latinoreview.us.intellitxt.com +latinpost.us.intellitxt.com +latribune.electronicpromotions2015.com +laughablecopper.com +laughcloth.com +laumauna.com +launch.adserver.yahoo.com +launchbit.com +lauralust.blog-paradijs.com +laurel.rovicorp.com +laurentia.ca +laurex.free.fr +lavenderlounge.biz +lavideodujour.fr +lavo.info +lawfirmediscovery.com +lax-rtb1.rfihub.net +laxnws.112.2o7.net +laxprs.112.2o7.net +laxpsd.112.2o7.net +laxtrb.112.2o7.net +laxwht.112.2o7.net +laxwht.122.2o7.net +lay.elticket.com.ar +layer-ad.de +layer-ad.org +layer-ads.de +layerads.ero-advertising.com +layers.ero-advertising.com +layout1.realtracker.com +lazyprofits.go2jump.org +lb-adserver.ig.com.br +lb-delivery.us-east-1.applifier.info +lb-test-int.pxi.pub +lb.fruitflan.com +lb.hitbox.com +lb.infinity.blismedia.com +lb.midasplayer.com +lb.usemaxserver.de +lb.web-stat.com +lb0-telemetry-prod-us-east-1.servers.getgo.com +lb1.www.ms.akadns.net +lbn.ru +lc.livefyre.com +lcbcad.co.uk +lci1a.voluumtrk.com +ld1.criteo.com +ld2.criteo.com +ldap-2.adotmob.com +ldap-admin.gaeadata.com +ldap.adotmob.com +ldap.gaeadata.com +ldap.insnw.net +ldap.vpn.insnw.net +ldap01.adroll.com +ldaps.taboola.com +ldglob01.adtech.de +ldglob01.adtech.fr +ldglob01.adtech.us +ldglob02.adtech.de +ldglob02.adtech.fr +ldglob02.adtech.us +ldimage01.adtech.de +ldimage01.adtech.fr +ldimage01.adtech.us +ldimage02.adtech.de +ldimage02.adtech.fr +ldimage02.adtech.us +ldschurch.tt.omtrdc.net +ldserv01.adtech.de +ldserv01.adtech.fr +ldserv01.adtech.us +ldserv02.adtech.de +ldserv02.adtech.fr +ldserv02.adtech.us +ldsfch.112.2o7.net +le1er.net +lead-123.com +lead-analytics.nl +lead.dev.khingtracking.com +lead.khingtracking.com +lead.network +lead.program3.com +lead.soperson.com +leadback.advertising.com +leadback.netseer.com +leadboltads.net +leadclick.com +leader.linkexchange.com +leadgenetwork.com +leadingedgecash.com +leadmy.pl +leadn.pl +leadnationmedia.com +leadpages.co +leadplace.fr +leadpub.com +leads.demandbase.com +leads.theappgrader.com +leadsynaptic.go2jump.org +leadvisualdesigner.intercom.io +leadzu.com +leadzupc.com +leaitworldprod.112.2o7.net +leaplunchroom.com +learn-dev.newrelic.com +learn-new.optimizely.com +learn-ra.newrelic.com +learn-staging.newrelic.com +learn.adjust.com +learn.bizible.com +learn.curalate.com +learn.foresee.com +learn.keen.io +learn.marketo.com +learn.mixpanel.com +learn.newrelic.com +learn.optimizely.com +learn.survicate.com +learn.thirdpresence.com +learn.thunderhead.com +learnadmin.marketo.com +learning-offer.com +learning.braze.com +leave.exacttarget.com +lecap-services.fr +ledhenone.com +ledinund.com +leeenterprises.112.2o7.net +lefos.net +legacy-reports.arrivalist.com +legacy.adswizz.com +legacy.demandbase.com +legacy.foresee.com +legacy.fqtag.com +legacy.urbaninsight.com +legacydocs.fyber.com +legal-rewardpath.com +legal.livefyre.com +legalizacja.5v.pl +legalzoom.tt.omtrdc.net +legendofdragoon.com +legendsdtv.com +legitreviews-uk.intellitxt.com +legsfetish.blogspot.pt +legsfetish.blogspot.sk +leidosheathcare.com +leiods.com +leisure-offer.com +leivonta.leadpages.co +lekkereborsten.nl +lekkerlikken.com +lekkerporno.nl +lekkerzeg.nl +lelivedeslive.com +lelogo.net +lemarche.pf +lemeilleurdelhumour.free.fr +lemke-collection.de +lemondedebisous.com +lemondeduporno.com +lemonparty.biz +lemonparty.org +lemur.pci.insnw.net +lemurpci.svc.insnw.net +lemurpci.vpn.insnw.net +lennoxcollections.com +lenovo.112.2o7.net +lenovoappssystemupdateprod.112.2o7.net +lenovosimpletapdev.112.2o7.net +lens.data.inmobi.com +lens.secondry.data.dfw1.inmobi.com +lepodownload.mediatek.com +lesbian-erotica.hitbox.com +lesechos.ezakus.net +lesview.com +letitbefaster.website +letjo.adx1.com +letmacwork.world +letmacworkfaster.world +letmefind.co +letolove.ru +letopdux.free.fr +lets-get-naked.com +letsallhide.info +letsart.ru +letschat.adroll.com +letsextube.com +letsfinder.com +letsgodigital.uk.intellitxt.com +letsgoemkt.info +letsite.ru +letslowbefast.site +letslowbefast.today +letspartynaked.com +letspee.com +letsrun.us.intellitxt.com +letssearch.com +letteshop.com +letto.by +lettucelimit.com +letusbrowse.com +letzonke.com +level.turboads.de +level3.applifier.com +levelrate.de +levenshteinanswer.com +leveragemarketing.112.2o7.net +levexis.com +levitra.1.p2l.info +levitra.3.p2l.info +levitra.4.p2l.info +levzeya.com.ua +lewd.ninja +lewd.tech +lex8.com +lexapro.1.p2l.info +lexapro.3.p2l.info +lexapro.4.p2l.info +lexid-dev.staging.us-east-1.kops.kargo.com +lexid.production.us-east-1.kops.kargo.com +lexid.production.us-west-1.kops.kargo.com +lexid.staging.us-east-1.kops.kargo.com +lexingtonkentuckyescorts.tk +lexoi.com +lextrim.com +lexu.goggendorf.at +lexvidhi.com +leyuetuan.com +lezbiyanki.net +lezcuties.info +lezrotic.com +lezzyporn.com +lflash.ru +lfscpttracking.com +lfstmedia.com +lg.brandreachsys.com +lg1.brandreachsys.com +lga-bid-bgp.contextweb.com +lga-rts-kube-test.contextweb.com +lga.contextweb.com +lga1.admarketplace.net +lgelectronics.122.2o7.net +lgkzmjfu.bid +lgogujahrnxr.bid +lhs-mhs.org +lhsmidatlantic.com +lhuy.com +lhxgdmcyropacl.bid +li-dermakine.com.tr +li-er.ru +li.pxl.ace.advertising.com +li122.cn +liadm.com +liapentruromania.ro +lib.bmst.pw +lib.browserhawk.com +lib.coin-hive.com +lib.xmrm.pw +lib4.libstat.com +lib6.libstat.com +libaa.com +libange.free.fr +libdgel.net +libecki.net +liberteen1.free.fr +libertin-club.net +libertinord.free.fr +libertins.nu +liberty.gedads.com +libertybell.biz +libertybilisim.com +libertyglobalpaneu.tt.omtrdc.net +libertymutual.exacttarget.com +libido2.free.fr +libidoo.net +library.247realmedia.com +library.cowley.edu +librenms.svc.insnw.net +libs.coremetrics.com +libs.de.coremetrics.com +licasd.com +lichtundliebeistleben.de +lickcunt.nu +lickpussy.nu +liczbawiadomosci.pl +liczniki.org +lider-zhaluzi.kiev.ua +lideragro.ru +liders.biz +lidl-dsl.de +lidlretargeting.adspirit.de +lie2anyone.com +lie4anyone.com +liens-sexe-gratuit.com +lietaer.com +liezelotte.tk +life.biz.ua +lifeeverest.com +lifehackz.net +lifemediahouse1.onlinewelten.com +lifescience.sysu.edu.cn +lifesciencesb2c.eloqua.com +lifescript.us.intellitxt.com +lifestreet.com +lifewireless.dev.airfind.com +lifewireless.staging.airfind.com +liftdna.com +ligatus.com +ligatus.de +light.browsermine.com +lightcloud.pl +lightcushion.com +lighthouse2k.com +lightminer.co +lightspeedcash.com +ligtv.kokteyl.com +liin.ml +lijit.com +like.likewut.net +like2buy.curalate.com +likeminer.nablabee.com +likeportal.com +likes.gisnetwork.net +likespike.com +likethis.mbosoft.com +likethislist.biz +lilian.redirectme.net +lilovakia.info +limg.adspirit.de +limpingline.com +lin-d.openx.net +lin31.metriweb.be +linconpark.com +line.s50.exacttarget.com +linear-dev-v2.dev.linear.aws.fwmrm.net +linear-dev.dev.linear.aws.fwmrm.net +linear-stg-v1.stg.linear.aws.fwmrm.net +lineate-grafana.dev.dmx.districtm.io +ling.expert +ling.express +link-booster.de +link.activision.swrve.com +link.alpha.branch.io +link.bannersystem.cz +link.beta.branch.io +link.dynamicyield.com +link.ixs1.net +link.krxd.net +link.link.ru +link.masterstats.com +link.ru +link.swrve.com +link2me.ru +link4ads.com +link4link.com +link4win.net +linkadd.de +linkbucks.com +linkbuddies.com +linkcounter.com +linkcounter.pornosite.com +linkdebrideur.xyz +linkerd.pfa.gcp.datamind.ru +linkexchange.com +linkforme.tk +linkjumps.com +linknotification.com +linkprice.com +linkrain.com +linkreferral.com +links-and-traffic.com +links-ranking.de +links.e2e.mint.com +links.ibotta.com +links.industrybrains.com +links.mint.com +links.mkt81.net +links.onlinedownloads.org +links.outster.com +links.services.disqus.com +links.sexlist.com +links.sextracker.com +links.worldbannerexchange.com +links.xxxcounter.com +linkshighway.com +linkstorms.com +linkswaper.com +linktarget.com +linktrack.bravenet.com +linktracker.angelfire.com +linkz.it +lintv.122.2o7.net +linuxdevcenter.us.intellitxt.com +linuxforums.us.intellitxt.com +linuxjournal.us.intellitxt.com +linuxpark.adtech.de +linuxpark.adtech.fr +linuxpark.adtech.us +lionstracking.com +liportal.oewabox.at +liquidad.narrowcastmedia.com +liquify.truconversion.com +liqwid.mgr.consensu.org +liqwid.net +lisnr.com +list.ru +listat.biz +listennewsnetwork.com +lite.adtech.de +lite.adtechus.com +lite.atom.adjust.com +lite.automatad.com +litec-fr.com +littlesturgisrally.com +liu1n.adx1.com +live-cams-0.livejasmin.com +live-cams-1.livejasmin.com +live.4480.org +live.api.drift.com +live.chartboost.com +live.monitus.net +live.rads.msn.com +live.sekindo.com +live.viewsignage.com +liveadexchanger.com +liveapi.yext.com +liveblogeditor.livefyre.com +livecamgirls.streamray.com +livecams.nl +livecheck.theperfectsystoupdating.date +livecheck2update.thepointofforcontentingclear.bid +livedealcom.112.2o7.net +livedownloadnet.pl +livefyre.com +liveintent.com +livejasmin.com +livejournal.tags.crwdcntrl.net +livelnternet.net +livelyoffers.club +livenation.122.2o7.net +livenation.sp1.convertro.com +livenudechat.us +liveporn.de +livepornusa.com +livepornworld.com +liver-chintai.org +liverail.com +liversely.com +livescience.us.intellitxt.com +liveseek.de +livesegmentservice.com +livestats.atlanta-airport.com +livestatsnet.services +livestrong.us.intellitxt.com +livetracker.voanews.eu +liveupdate.feednowforbrandnewcontestdistributor.win +livewell.net +livingnet.adtech.de +livingsocial.sp1.convertro.com +livioon.com +livre.wasastation.fi +lizardslaugh.com +ll.atdmt.com +lladinserts.us.publicus.com +llaredlrgn.angelcities.com +llnw.ssacdn.com +lmcd.us.intellitxt.com +lmeeulcfttqv.ru +lmodr.biz +lmqh.ecoencomputer.com +ln.doubleclick.net +lnads.osdn.com +lnktk.com +lnpush.pl +lo.extole.io +lo.ljkeefeco.com +lo2.me +load.exelator.com +load.focalex.com +load.instinctiveads.com +load.jsecoin.com +load.s3.amazonaws.com +load.scanscout.com +load.staging.sumo.com +load.staging2.sumo.com +load.stg1.sumo.com +load.stg2.sumo.com +load.stg3.sumo.com +load.stg4.sumo.com +load.sumo.com +load.sumome.com +loader-io.districtm.io +loader.topadvert.ru +loadeu.exelator.com +loading321.com +loadm.exelator.com +loadus.exelator.com +loady.de.intellitxt.com +loan.aol.msk.su +loan.maybachexelero.org +lobby.sexlist.com +loboclick.com +loc1.hitsprocessor.com +local.api.speedcurve.com +local.promoisland.net +local.unityads.unity3d.com +localh0st.info +localytics.com +location.placed.com +locations.yext.com +lockerdome.com +lockergnome.us.intellitxt.com +lod.admin.spotxchange.com +lod.admindash.spotxchange.com +lod.api.publisher.spotxchange.com +lod.api.spotxchange.com +lod.event.spotxchange.com +lod.publisher-api.spotxchange.com +lod.publisher.spotxchange.com +lod.pubtools.spotxchange.com +lod.search.spotxchange.com +loestrin.1.p2l.info +loft2126.dedicatedpanel.com +log-c-907025318.us-east-1.elb.amazonaws.com +log.adap.tv +log.adx1.com +log.aebn.net +log.aimtell.com +log.apk.v-mate.mobi +log.btopenworld.com +log.clickstream.co.za +log.client.optimizely.com +log.fc.yahoo.com +log.feedjit.com +log.gds.mmstat.com +log.getadblock.com +log.getdropbox.com +log.hankooki.com +log.idg.no +log.intellimize.co +log.logrocket.io +log.mmstat.com +log.newsvine.com +log.olark.com +log.optimizely.com +log.outbrain.com +log.pinion.gg +log.pladform.ru +log.quora.com +log.snapdeal.com +log.statistici.ro +log.tagcade.com +log.trafic.ro +log.uniconsent.mgr.consensu.org +log.zoom.us +log1.countomat.com +log3.optimizely.com +log4.quintelligence.com +log999.goo.ne.jp +loga.hit-parade.com +loga.xiti.com +logc1.xiti.com +logc11.xiti.com +logc111.xiti.com +logc13.xiti.com +logc135.xiti.com +logc138.xiti.com +logc14.xiti.com +logc142.xiti.com +logc146.xiti.com +logc149.xiti.com +logc15.xiti.com +logc16.xiti.com +logc169.xiti.com +logc173.xiti.com +logc175.xiti.com +logc180.xiti.com +logc181.xiti.com +logc187.xiti.com +logc189.xiti.com +logc19.xiti.com +logc2.xiti.com +logc202.xiti.com +logc205.xiti.com +logc206.xiti.com +logc209.xiti.com +logc210.xiti.com +logc218.xiti.com +logc22.xiti.com +logc238.xiti.com +logc25.xiti.com +logc252.xiti.com +logc253.xiti.com +logc26.xiti.com +logc279.xiti.com +logc3.xiti.com +logc31.xiti.com +logc32.xiti.com +logc35.xiti.com +logc400.xiti.com +logc407.xiti.com +logc7.xiti.com +logc8.xiti.com +logc89.xiti.com +logger-01.vty.dailymotion.com +logger-02.vty.dailymotion.com +logger-03.vty.dailymotion.com +logger-04.vty.dailymotion.com +logger-05.vty.dailymotion.com +logger-06.vty.dailymotion.com +logger-07.vty.dailymotion.com +logger-08.vty.dailymotion.com +logger-09.vty.dailymotion.com +logger-10.vty.dailymotion.com +logger-prod-us-east-1-vpc-alb-1251201355.us-east-1.elb.amazonaws.com +logger.cash-media.de +logger.cloudmobi.net +logger.snackly.co +logger.virgul.com +logging.53.localytics.com +logging.ar.atwola.com +logging.at.atwola.com +logging.vungle.com +loghost.in.backtrace.io +loghouse.pfa.gcp.datamind.ru +logi10.xiti.com +logi103.xiti.com +logi104.xiti.com +logi11.xiti.com +logi118.xiti.com +logi12.xiti.com +logi125.xiti.com +logi13.xiti.com +logi141.xiti.com +logi150.xiti.com +logi151.xiti.com +logi162.xiti.com +logi163.xiti.com +logi242.xiti.com +logi4.xiti.com +logi5.xiti.com +logi6.xiti.com +logi7.xiti.com +logi8.xiti.com +logi9.xiti.com +login-apps.eloqua.com +login-canary.flurry.com +login-dev.instartlogic.com +login-qa1.exacttarget.com +login-qa2.exacttarget.com +login-qa3.exacttarget.com +login-test.exacttarget.com +login.adtech.de +login.adtechus.com +login.adx1.com +login.auth.mparticle.com +login.console.unrulymedia.com +login.dotomi.com +login.dotomi.net +login.drawbrid.ge +login.driftt.com +login.eloqua.com +login.exacttarget.com +login.flurry.com +login.instartlogic.com +login.k8s-test.fiksu.com +login.linkpulse.com +login.marketo.com +login.poc.exacttarget.com +login.qa.exacttarget.com +login.rubiconproject.com +login.s1.exacttarget.com +login.s2.qa2.exacttarget.com +login.s4.exacttarget.com +login.s5.exacttarget.com +login.test.exacttarget.com +login.tracking101.com +login.vergic.com +login0.silverpop.com +login1.silverpop.com +login2.silverpop.com +login3.silverpop.com +login4.silverpop.com +login5.silverpop.com +login6.silverpop.com +login7.silverpop.com +login8.silverpop.com +login9.silverpop.com +logitechlogitechglobal.112.2o7.net +logliberation.xiti.com +lognormal.net +logo.onlinewebstat.com +logo.webservis.gen.tr +logos.libstat.com +logos.x-traceur.com +logoworksdev.112.2o7.net +logp.hit-parade.com +logp.xiti.com +logp2.xiti.com +logp3.xiti.com +logs-01.loggly.com +logs.comics.com +logs.eresmas.com +logs.eresmas.net +logs.gaana.com +logs.getsitecontrol.com +logs.loggly.com +logs.logrocket.com +logs.palebrook.wbinsights.com +logs.roku.com +logs.sexy-parade.com +logs.spilgames.com +logs.supersonic.com +logs.thebloggernetwork.com +logs.videmob.com +logs.viewbix.com +logs1122.xiti.com +logs1125.xiti.com +logs1204.xiti.com +logs1242.xiti.com +logs1285.xiti.com +logserver.insight.ucweb.com +logua.com +logv.xiti.com +logv1.xiti.com +logv10.xiti.com +logv11.xiti.com +logv12.xiti.com +logv13.xiti.com +logv14.xiti.com +logv143.xiti.com +logv144.xiti.com +logv145.xiti.com +logv15.xiti.com +logv16.xiti.com +logv17.xiti.com +logv18.xiti.com +logv19.xiti.com +logv2.xiti.com +logv20.xiti.com +logv21.xiti.com +logv22.xiti.com +logv23.xiti.com +logv24.xiti.com +logv25.xiti.com +logv26.xiti.com +logv27.xiti.com +logv28.xiti.com +logv29.xiti.com +logv3.xiti.com +logv30.xiti.com +logv31.xiti.com +logv32.xiti.com +logv4.xiti.com +logv5.xiti.com +logv6.xiti.com +logv7.xiti.com +logv8.xiti.com +logv9.xiti.com +logw312.ati-host.net +logw349.ati-host.net +logx.optimizely.com +lohud.us.intellitxt.com +lokalavisendk.nuggad.net +loktrk.com +lol.to +lolhello.com +lolshock.com +loltrain.com +lon01-nagios01.svc.insnw.net +lon01-nagios01.vpn.insnw.net +lon01-nagios02.svc.insnw.net +lon01-nagios02.vpn.insnw.net +lon01-nagios03.svc.insnw.net +lon01-nagios03.vpn.insnw.net +lon5.ss-omtrdc.net +london01.monero.hashvault.pro +lonelywifehookup.com +longhornblogs.us.intellitxt.com +longinglettuce.com +longtraffic.com +longup.co +looker.corp.mparticle.com +looker.dev.corp.mparticle.com +looker.int.midasplayer.com +looker.monetate.net +looker.wbinsights.com +looker.yieldmo.com +looksmartcollect.247realmedia.com +lookup.hitbox.com +lookup.kargo.com +lookup2.hitbox.com +lookvision.info +looool.pl +lootsie.com +lop.com +lopsidedspoon.com +lortab-cod.hut1.ru +lortab.hut1.ru +losangeles01.monero.hashvault.pro +losas.cabanaslanina.com.ar +losda.com.pl +loseweight.asdjiiw.com +losital.ru +losos.caliane.com.br +losowa-gra.pl +lostartofbeingadame.com +losu.112.2o7.net +lottery-lists.freebitco.in +lottoga.com +lottoland.pl +loudloss.com +loudlunch.com +louisvil.app.ur.gcion.com +louisvil.ur.gcion.com +love-sex-girls.de +love-teen.com +love-token.nu +loveaholics.com +lovematch123.com +lovemy.ch +loveourwaters.com +lovers-day.com +lovestory24.de +loveswoman.com +lovethatasianpussy.com +lovevideo.biz +lovi-moment.com.ua +lovpoint.de +low-format.ru +low-hacker.popunder.ru +lowcountrytile.com +lowephotos.info +lowes.tt.omtrdc.net +lowmol.com +lowrider.ru +lp.cleanmymac.online +lp.curalate.com +lp.empire.goodgamestudios.com +lp.jeux-lk.com +lp.maccleanuptools.com +lp.mp.mydas.mobi +lp.mydas.mobi +lp.outbrain.com +lp.rewardhub2.club +lp.sekindo.com +lp.sexyadults.eu +lp.sharelive.net +lp.supersonic.com +lp.torchbrowser.com +lp.zemanta.com +lp1.linkpulse.com +lp3tdqle.com +lp4.linkpulse.com +lp7.mobilescaner.today +lpage.piwik.pro +lpcloudsvr302.com +lpcloudsvr405.com +lpm-francetv.nuggad.net +lpm-lagardere.nuggad.net +lpm-tf1.nuggad.net +lpo.optimizely.com +lpuq.com +lpweb.altervista.org +lrp.mxptint.net +lrt7a.coldcertainchannel.com +lrytasadlt.hit.gemius.pl +lrytaslt.adocean.pl +ls-magazine.biz +ls.hit.gemius.pl +ls.webmd.com +lsassoc.com +lsb2cdemo.eloqua.com +lsb2cgallery.eloqua.com +lse.uk.intellitxt.com +lsg.me +lsgystgg.bid +lsimg.net +lskoncepts.com +lsp-awak-perikanan.com +lstat.youku.com +lstats.qip.ru +lt.adocean.pl +lt.andomedia.com +lt.angelfire.com +lt.hit.gemius.pl +lt.retargeter.com +lt200.tritondigital.com +lt201.tritondigital.com +lt202.tritondigital.com +lt3.hit.stat24.com +lt500.tritondigital.com +lt501.tritondigital.com +lt502.tritondigital.com +lt503.tritondigital.com +lt504.tritondigital.com +ltgde.adocean.pl +ltstyov.ru +ltv-bot.5rocks.io +ltv-data-api.kube-prod.vungle.com +ltv-spark-webui.kube-prod.vungle.com +ltvperf.com +lubahegre.info +lubbockcleaningservices.com +lubetube.com +lucent.122.2o7.net +luchtenbergdecor.com.br +lucibad.home.ro +luciddiagnostics.in +lucidmedia.com +lucidsexdreams.com +lucklayed.info +lucky-day-uk.com +lucky-go.com +lucky-models.com +luckybastardsclub.com +luckyblank.info +luckyboy.cc +luckyclean.info +luckyclear.info +luckycn.cn +luckyeffect.info +luckyguy.biz +luckyhalo.info +luckylesbiansfuck.com +luckypure.info +luckyshine.info +luckyshop.net.ua +luckystarmusic.se +luckysuccess.info +luckysure.info +luckytidy.info +luesojz.angelcities.com +lufhansa.com +lufthansaairlines.com +lufthanza.com +luggage-tv.com +luggagecast.com +luggagepreview.com +luj.sdsjweb.com +lukaszuk.com.pl +lukluk.net +luksona.popunder.ru +lukya.com +lumanajaska.ml +lumb.co +lumpyleaf.com +luna-lane.com +lunamujer.net +lunarsex.com +lunaticjazz.com +lunettenoire.com +lusciousbutts.com +lusha.co.uk +lussuria.biz +lust-fick.de +lustcastle.com +lusted.biz +lustfick.de +lustfulamateurs.com +lustfulgirl.com +lustrausch.net +lustville.com +lustweb.de +lusty-lesbians.boinkers.com +lustymodels.com +lutherstable.org +luvamac.com.br +luvtheboobs.com +luvur-body.com +luwyou.com +luxcart.ro +luxgamez.com +luxmagazine.cf +luxpolice.com +luxpolice.net +luxup.ru +luxury-girl.ru +luycos.com +lv.adocean.pl +lv.hit.gemius.pl +lvbet.pl +lvescore.com +lvs.truehits.in.th +lvxg.com +lw1.gamecopyworld.com +lw2.gamecopyworld.com +lwfjd.today +lxer.us.intellitxt.com +ly66.adx1.com +lyca.us +lycos-eu.imrworldwide.com +lycos.247realmedia.com +lycoscollect.247realmedia.com +lycoscollect.realmedia.com +lycosgamesville.com +lycosu.com +lync.adx1.com +lync.thunderhead.com +lync10.adx1.com +lyncaccess.adx1.com +lyncaccess01.adx1.com +lyncaws2.exponential.com +lyncdiscover.adx1.com +lyncdiscover.exacttarget.com +lyncdiscover.exponential.com +lyncdiscover.foresee.com +lyncdiscover.maxpoint.com +lyncdiscover.sekindo.com +lyncdiscover.sizmek.com +lyncdiscover.thunderhead.com +lyncdiscover.undertone.com +lyncdiscoverinternal.exacttarget.com +lyncdiscoverinternal.foresee.com +lyncext.adx1.com +lyncpoolwebext.america.exacttarget.com +lyncshare.exponential.com +lyncweb.adx1.com +lyncwebapp.exponential.com +lyncwsext.foresee.com +lyncwsint.foresee.com +lyneroy.com +lyngdalhudterapi.no +lynkedin.it +lynx.cjestel.net +lyrics.us +lyrics.us.intellitxt.com +lyrster.com +lyssh.gw.localytics.com +lytics.io +lzjl.com +m-99.co.uk +m-barati.de +m-display.rtb.adx1.com +m-fb-security.000webhostapp.com +m-freeway.com +m.2mdn.net +m.adbridge.de +m.addthis.com +m.addthisedge.com +m.admedia.com +m.admob.com +m.adnxs.com +m.adsymptotic.com +m.adx.bg +m.adx1.com +m.agkn.com +m.anyfiles.ovh +m.b00kmarks.com +m.burt.io +m.de.2mdn.net +m.doubleclick.net +m.exactag.com +m.facebook.com----------------securelogin----acount-confirm.aggly.com +m.fr.2mdn.net +m.fr.a2dfp.net +m.franklyinc.com +m.friendlyduck.com +m.mc.exacttarget.com +m.miricommunity.net +m.openv.tv +m.pl.failmobile.net +m.pl.pornzone.tv +m.pr0gramm.com +m.preapps.com +m.quantcount.com +m.quantserve.com +m.rkdms.com +m.sancdn.net +m.servebom.com +m.servedby-buysellads.com +m.smsquiz.pl +m.tidebuy.com +m.trb.com +m.tribalfusion.com +m.uk.2mdn.net +m.usersonline.com +m.v.fwmrm.net +m.zeroredirect.com +m.zlotysms.pl +m0-s.san.ru +m001.monerise.com +m01.oix.com +m01.oix.net +m01.webwise.com +m01.webwise.net +m01.webwise.org +m02.oix.com +m02.oix.net +m02.webwise.com +m02.webwise.net +m02.webwise.org +m1.2mdn.net +m1.ae.2mdn.net +m1.au.2mdn.net +m1.be.2mdn.net +m1.br.2mdn.net +m1.ca.2mdn.net +m1.cn.2mdn.net +m1.de.2mdn.net +m1.dk.2mdn.net +m1.doubleclick.net +m1.emea.2mdn.net +m1.emea.2mdn.net.edgesuite.net +m1.es.2mdn.net +m1.fi.2mdn.net +m1.fr.2mdn.net +m1.fwmrm.net +m1.it.2mdn.net +m1.jp.2mdn.net +m1.monerise.com +m1.nedstatbasic.net +m1.nedstatpro.net +m1.nl.2mdn.net +m1.no.2mdn.net +m1.nz.2mdn.net +m1.pl.2mdn.net +m1.se.2mdn.net +m1.sg.2mdn.net +m1.stream.vidzi.tv +m1.streaming.estream.to +m1.torrenti.al +m1.uk.2mdn.net +m1.ve.2mdn.net +m1.videos.vidto.me +m1.webstats.motigo.com +m1.webstats4u.com +m1.za.2mdn.net +m1crosoft.com +m1crosoft.info +m1videos.com +m2.ae.2mdn.net +m2.au.2mdn.net +m2.be.2mdn.net +m2.br.2mdn.net +m2.ca.2mdn.net +m2.cdn-jquery.host +m2.cn.2mdn.net +m2.cn.doubleclick.net +m2.de.2mdn.net +m2.dk.2mdn.net +m2.doubleclick.net +m2.es.2mdn.net +m2.fi.2mdn.net +m2.fr.2mdn.net +m2.franklyinc.com +m2.fwmrm.net +m2.it.2mdn.net +m2.jp.2mdn.net +m2.media-box.co +m2.nl.2mdn.net +m2.no.2mdn.net +m2.nz.2mdn.net +m2.pl.2mdn.net +m2.se.2mdn.net +m2.sexgarantie.nl +m2.sg.2mdn.net +m2.stream.vidzi.tv +m2.streaming.estream.to +m2.uk.2mdn.net +m2.ve.2mdn.net +m2.videos.vidto.me +m2.xhamster.com +m2.za.2mdn.net +m2132.ehgaugysd.net +m2k.ru +m2m1.inner-active.mobi +m3.2mdn.net +m3.ae.2mdn.net +m3.au.2mdn.net +m3.be.2mdn.net +m3.br.2mdn.net +m3.ca.2mdn.net +m3.cdn-jquery.host +m3.cn.2mdn.net +m3.de.2mdn.net +m3.dk.2mdn.net +m3.doubleclick.net +m3.es.2mdn.net +m3.fi.2mdn.net +m3.fr.2mdn.net +m3.franklyinc.com +m3.it.2mdn.net +m3.jp.2mdn.net +m3.nl.2mdn.net +m3.no.2mdn.net +m3.nz.2mdn.net +m3.pl.2mdn.net +m3.se.2mdn.net +m3.sg.2mdn.net +m3.uk.2mdn.net +m3.ve.2mdn.net +m3.za.2mdn.net +m32.media +m3e46.com +m4.ae.2mdn.net +m4.afs.googleadservices.com +m4.au.2mdn.net +m4.be.2mdn.net +m4.br.2mdn.net +m4.ca.2mdn.net +m4.cdn-jquery.host +m4.cn.2mdn.net +m4.de.2mdn.net +m4.dk.2mdn.net +m4.doubleclick.net +m4.es.2mdn.net +m4.fi.2mdn.net +m4.fr.2mdn.net +m4.it.2mdn.net +m4.jp.2mdn.net +m4.media-box.co +m4.nl.2mdn.net +m4.no.2mdn.net +m4.nz.2mdn.net +m4.pl.2mdn.net +m4.se.2mdn.net +m4.sg.2mdn.net +m4.uk.2mdn.net +m4.ve.2mdn.net +m4.za.2mdn.net +m4ever.net +m4f.adx1.com +m4hkota.jw.lt +m4mny.com +m4n.nl +m4ymh0220.tech +m5.ae.2mdn.net +m5.au.2mdn.net +m5.be.2mdn.net +m5.br.2mdn.net +m5.ca.2mdn.net +m5.cdn-jquery.host +m5.cn.2mdn.net +m5.de.2mdn.net +m5.dk.2mdn.net +m5.doubleclick.net +m5.es.2mdn.net +m5.fi.2mdn.net +m5.fr.2mdn.net +m5.it.2mdn.net +m5.jp.2mdn.net +m5.nl.2mdn.net +m5.no.2mdn.net +m5.nz.2mdn.net +m5.pl.2mdn.net +m5.se.2mdn.net +m5.sg.2mdn.net +m5.uk.2mdn.net +m5.ve.2mdn.net +m5.za.2mdn.net +m57ku6sm.com +m5home.ru +m6.ae.2mdn.net +m6.au.2mdn.net +m6.be.2mdn.net +m6.br.2mdn.net +m6.ca.2mdn.net +m6.cn.2mdn.net +m6.de.2mdn.net +m6.dk.2mdn.net +m6.doubleclick.net +m6.es.2mdn.net +m6.fi.2mdn.net +m6.fr.2mdn.net +m6.it.2mdn.net +m6.jp.2mdn.net +m6.nl.2mdn.net +m6.no.2mdn.net +m6.nz.2mdn.net +m6.pl.2mdn.net +m6.se.2mdn.net +m6.sg.2mdn.net +m6.uk.2mdn.net +m6.ve.2mdn.net +m6.za.2mdn.net +m6dqx-ad3hl.ads.tremorhub.com +m7.ae.2mdn.net +m7.au.2mdn.net +m7.be.2mdn.net +m7.br.2mdn.net +m7.ca.2mdn.net +m7.cn.2mdn.net +m7.de.2mdn.net +m7.dk.2mdn.net +m7.doubleclick.net +m7.es.2mdn.net +m7.fi.2mdn.net +m7.fr.2mdn.net +m7.it.2mdn.net +m7.jp.2mdn.net +m7.nl.2mdn.net +m7.no.2mdn.net +m7.nz.2mdn.net +m7.pl.2mdn.net +m7.se.2mdn.net +m7.sg.2mdn.net +m7.uk.2mdn.net +m7.ve.2mdn.net +m7.za.2mdn.net +m8.ae.2mdn.net +m8.au.2mdn.net +m8.be.2mdn.net +m8.br.2mdn.net +m8.ca.2mdn.net +m8.cn.2mdn.net +m8.de.2mdn.net +m8.dk.2mdn.net +m8.doubleclick.net +m8.es.2mdn.net +m8.fi.2mdn.net +m8.fr.2mdn.net +m8.it.2mdn.net +m8.jp.2mdn.net +m8.nl.2mdn.net +m8.no.2mdn.net +m8.nz.2mdn.net +m8.pl.2mdn.net +m8.se.2mdn.net +m8.sg.2mdn.net +m8.uk.2mdn.net +m8.ve.2mdn.net +m8.za.2mdn.net +m9.ae.2mdn.net +m9.au.2mdn.net +m9.be.2mdn.net +m9.br.2mdn.net +m9.ca.2mdn.net +m9.cn.2mdn.net +m9.de.2mdn.net +m9.dk.2mdn.net +m9.doubleclick.net +m9.es.2mdn.net +m9.fi.2mdn.net +m9.fr.2mdn.net +m9.it.2mdn.net +m9.jp.2mdn.net +m9.nl.2mdn.net +m9.no.2mdn.net +m9.nz.2mdn.net +m9.pl.2mdn.net +m9.se.2mdn.net +m9.sg.2mdn.net +m9.uk.2mdn.net +m9.ve.2mdn.net +m9.za.2mdn.net +ma.5.p2l.info +ma.baidu.com +ma.herphemiste.com +ma.tune.com +ma.wp.pl +ma1310-r.analytics.edgekey.net +ma156-r.analytics.edgekey.net +ma156-r.analytics.edgesuite.net +ma204-r.analytics.edgesuite.net +ma211-r.analytics.edgesuite.net +ma312-r.analytics.edgesuite.net +ma74-r.analytics.edgesuite.net +ma76-c.analytics.edgesuite.net +ma76-r.analytics.edgesuite.net +ma85-r-analytics.akamaized.net +maaikeonline.nl +maatch.com +maawikdimuaro.000webhostapp.com +maaxmarket.com +mabanque-bnpparibas-fr.net +maboneng.com +mac-helper.site +mac-os.apple.com-secured.online +mac-osx.message-warning.net +mac-protection.info +mac.system-alert1.com +macaddictads.snv.futurenet.com +macads.net +macaxpower.com.br +maccity.it.intellitxt.com +maccleanersecurity.com +macdaddypimp.com +macdailynews.us.intellitxt.com +macdamaged.space +macdamaged.tech +macfix.life +macfixingsoftware.space +macgamefiles.us.intellitxt.com +machicon-ueno.info +machieved.com +mackeeper-center.club +mackeeperapp.mackeeper.com +mackeeperapp.zeobit.com +mackeeperapp1.zeobit.com +mackeeperapp2.mackeeper.com +mackeeperapp3.mackeeper.com +macleaner.space +macleaner.work +macmeasurmenthub.club +macmeasurmentpro.club +macmegasite.us.intellitxt.com +macnewsworld.us.intellitxt.com +macnn.us.intellitxt.com +macobserver.us.intellitxt.com +maconbraves.com +macpurifier.com +macshield8.club +macuser.uk.intellitxt.com +macwelt.de.intellitxt.com +macworld.uk.intellitxt.com +mad.uk.intellitxt.com +mad2.brandreachsys.com +madadsmedia.com +madamenoire.us.intellitxt.com +madclient.uimserv.net +madisonavenue.com +madpenguin.us.intellitxt.com +mads-eu.amazon-adsystem.com +mads-fe.amazon-adsystem.com +mads.advertising.com +mads.amazon-adsystem.com +mads.amazon.com +mads.aol.com +mads.at.atwola.com +mads.bnet.com +mads.cbs.com +mads.cbsnews.com +mads.chow.com +mads.cnet.com +mads.cnettv.com +mads.dailymail.co.uk +mads.download.com +mads.gamefaqs.com +mads.mp3.com +mads.theinsider.com +mads.tv.com +mads.zdnet.com +madserver.net +madseu.advertising.com +madsuk.at.atwola.com +madvertise.de +maendo.tv +magadownloader.com +magazines.sp1.convertro.com +magda-gadalka.ru +magellen.com +magento-crew.net +magento.marketolive.com +magic-analytics.magmic.com +magic.engagio.com +magicalfind-a.akamaihd.net +magiskmanager.com +magnetic.domdex.com +magnetic.t.domdex.com +magnificentmist.com +magviz-secondsz.com +mahindrainsurance.com +mahrez.alphonso.tv +mail-gw.jbic.go.jp +mail.accessiblemetrics.com +mail.ads.wsrs.net +mail.adswizz.com +mail.advertisingbox.com +mail.adviserplus.com +mail.agkn.com +mail.airvertiseme.com +mail.analyse.advertisingbox.com +mail.analyticson.com +mail.avis.cm +mail.bangla.net +mail.beacon.terratracker.com +mail.bms.qa-dest.imprev.net +mail.buypixelads.com +mail.celebrus.com +mail.chartboost.com +mail.clickconvertsell.com +mail.cnn.cm +mail.consoliads.com +mail.criteo.com +mail.cyberh.fr +mail.datamark.net +mail.demandbase.com +mail.eazybiz.ng +mail.edi.edu.cn +mail.email.advertisingbox.com +mail.esttrk.com +mail.eu.advertising.com +mail.exacttarget.com +mail.ezwebsitetraffic.com +mail.franklyinc.com +mail.hallym.ac.kr +mail.hangzhouit.gov.cn +mail.hz.zh.cn +mail.imamu.edu.sa +mail.intelsad.com +mail.interq.or.jp +mail.ioc.ac.ru +mail.issas.ac.cn +mail.juicemobile.com +mail.marketing365.mk +mail.marketingmachine.co.za +mail.marketo.com +mail.maxpoint.com +mail.midasplayer.com +mail.ny.contextweb.com +mail.panadvert.com +mail.pixel.marketing +mail.pmo.ac.cn +mail.poker.cm +mail.radar.imgsmail.ru +mail.search.advertisingbox.com +mail.siliconorchard.com +mail.siom.ac.cn +mail.starkey.theappgrader.com +mail.tagcommander.com +mail.target.cm +mail.terratracker.com +mail.tmathtag.com +mail.topprotestsigns.com +mail.tritondigital.com +mail.tropmet.res.in +mail.tsinghua.edu.cn +mail.ttflb.com +mail.viewsignage.com +mail.whoisvisiting.com +mail.yodelmobile.com +mail.yottaa.com +mail.youcanoptout.com +mail.youcanoptout.net +mail.youcanoptout.org +mail.zzu.edu.cn +mail02.eloqua.com +mail1.371.net +mail1.aweber.com +mail1.datamark.net +mail2.datamark.net +mail3.datamark.net +mailatl.tritondigital.com +mailboto.com +mailcheckisp.biz +mailfoogae.appspot.com +mailforfreedom.com +mailgate.sbell.com.cn +mailgw.thtf.com.cn +mailhog.kargo.com +mailhub.minaffet.gov.rw +mailing.extremereach.com +mailla.tritondigital.com +mailonline-d.openx.net +mails.cneic.com.cn +mailscan3.cau.ctm.net +mailsrv02.macau.ctm.net +mailsvra.macau.ctm.net +mailtrack.me +mailtrack1313.com +mailtribune.112.2o7.net +mailtribunecom.112.2o7.net +main.clicksor.com +main.exoclick.com +main.exosrv.com +main.minero.cc +main.rampidads.com +main.vodonet.net +main.xmrpool.net +mainetoday-d.openx.net +mainstream.topbucks.com +mainstreet.us.intellitxt.com +mainteck-fr.com +majorgeeks-d.openx.net +majorgeeks.us.intellitxt.com +make-money.shengen.ru +makeherup.us.intellitxt.com +makeitworkfaster.life +makemeheal.us.intellitxt.com +makemoneyrobot.com +makemytrip.tt.omtrdc.net +makeushot.us.intellitxt.com +mal-ware-domain-list-2.tinker.pureleads.sendori.com +malest.com +malictuiar.com +malkm.com +malware-live-pro-scanv1.com +mama128.valuehost.ru +mamamia.au.intellitxt.com +mamamidia.com +mamilade.oewabox.at +mamka.aviasales.ru +manage-api.s50.exacttarget.com +manage.ext.s50.exacttarget.com +manage.s50.exacttarget.com +manage.sharethrough.com +manage001.adtech.de +manage001.adtech.fr +manage001.adtech.us +manager.rovion.com +manager.tagcommander.com +mangler1.generals.ea.com +mangler10.generals.ea.com +mangler2.generals.ea.com +mangler3.generals.ea.com +mangler4.generals.ea.com +mangler5.generals.ea.com +mangler6.generals.ea.com +mangler7.generals.ea.com +mangler8.generals.ea.com +mangler9.generals.ea.com +manifest.53.localytics.com +manifest.fwmrm.net +manifest.localytics.com +manila-1.xmrpool.net +mannela.info +manntv.oewabox.at +manoske.com +mansmith.net +mantodea.mantisadnetwork.com +manuel.theonion.com +manufacturing2.eloqua.com +map.media6degrees.com +map.vicedata.com +map2.adsniper.ru +mapleway2profit.com +mapqueat.com +mapquestt.com +mapquuest.com +maps-antivert58.eksuziv.net +maps-spyware251-300.eksuziv.net +mapscom2.112.2o7.net +mapstats.blogflux.com +marathon.prd.fyber.com +marchen-toy.co.jp +marchex.com +marchex.io +marchofdimes.d2.sc.omtrdc.net +marcopolo.uk.net +marcycoin.org +marekporwol.pl +marfeel.mgr.consensu.org +marialorena.com.br +marinermarketing.112.2o7.net +marinsm.com +mariuspetrescu.gq +markbruinink.nl +markedcrayon.com +markedpail.com +market-buster.com +market.epom.com +market2.the-adult-company.com +marketaff.com +marketer-next-release.monetate.net +marketer.monetate.net +marketer1.silverpop.com +marketer2.silverpop.com +marketer3.silverpop.com +marketer4.silverpop.com +marketgid.com +marketing-internet-solution.naix.pureleads.sendori.com +marketing-rewardpath.com +marketing.888.com +marketing.beesearch.info +marketing.criteo.com +marketing.devvm.imprev.net +marketing.doubleclickindustries.com +marketing.dropbox.com +marketing.dynamicyield.com +marketing.extremereach.com +marketing.hearstmagazines.nl +marketing.imprev.net +marketing.nyi.net +marketing.osijek031.com +marketing.outbrain.com +marketing.piwik.pro +marketing.qa-dest.imprev.net +marketing.qa.imprev.net +marketing.staging.imprev.net +marketing.testcluster.imprev.net +marketing.vicedata.com +marketing365.mk +marketingblog.gumgum.com +marketingenhanced.com +marketingmachine.co.za +marketingsolutions.yahoo.com +marketlive.122.2o7.net +marketo.com +marketo.net +marketolive.com +marketplace-dev.stage.us-east-1.kops.kargo.com +marketplace-dev.svc.kargo.com +marketplace-test.kargo.com +marketplace.adtech.de +marketplace.adtechjp.com +marketplace.adtechus.com +marketplace.analyticson.com +marketplace.drawbrid.ge +marketscore.com +marketworksinc.122.2o7.net +marksandspencer.122.2o7.net +marriott.console.xtify.com +marriottinternationa.tt.omtrdc.net +martdiamonds.pl +martgage.com +marthastewart.demdex.net +martony.ittest.33across.com +marx-brothers.mhwang.com +maryscott.angelcities.com +mas-sdk.amazon-adsystem.com +mas.sector.sk +masalatalk.us.intellitxt.com +masari.crypto-webminer.com +masenkotrkr.com +mashable.d2.sc.omtrdc.net +mashinkhabar.com +mason.kargo.com +mason.svc.kargo.com +mason2.svc.kargo.com +mass-traffic.com +massage-v-almaty.kz +master.stage.us-east-1.kops.kargo.com +mastertarget.ru +mastertracks.be +mata.ero-advertising.com +mataharirama.xyz +match-us-east-1.sharethrough.com +match.ads.betweendigital.com +match.adsrvr.org +match.basebanner.com +match.deepintent.com +match.prod.bidr.io +match.rundsp.com +match.sharethrough.com +match.sync.ad.cpe.dotomi.com +match.taboola.com +match.xg4ken.com +match33.info +matchbin-assets.s3.amazonaws.com +matchcows.com +matchcraft.com +matcher-adx.bidder7.mookie1.com +matcher-aml.bidder7.mookie1.com +matcher-apx.bidder7.mookie1.com +matcher-apx.bidder9.mookie1.com +matcher-cwb.bidder7.mookie1.com +matcher-fb.bidder7.mookie1.com +matcher-opx.bidder7.mookie1.com +matcher-pbm.bidder7.mookie1.com +matcher-pbm.bidder9.mookie1.com +matcher-rbc.bidder7.mookie1.com +matcher-rbc.bidder9.mookie1.com +matcher-rmx.bidder7.mookie1.com +matcher.bidder10.mookie1.com +matcher.bidder7.mookie1.com +matcher.bidder8.mookie1.com +matcher.bidder9.mookie1.com +matcher.idtargeting.com +matchmyip.com +materiais.inlocomedia.com +mathenea.com +matheranalytics.com +mathtag.com +matomy.adk2.co +matrix.mediavantage.de +mattermost.gitlab.gcp.datamind.ru +matthew-testing-something.intercom.io +mattressusa.122.2o7.net +matts-celebs.com +mature-galleries.biz +mature-gay-porn.com +mature-lady.biz +mature-models.com +mature-models.net +mature-porn-city.com +mature-porn-sites.info +mature-sex-hunter.com +mature-sex-logger.blogspot.com +mature-woman-hardcore.com +mature.petitecoquine.com +mature.xxxcounter.com +mature2porn.blogspot.ca +mature2porn.blogspot.ch +mature2porn.blogspot.co.id +mature2porn.blogspot.co.uk +mature2porn.blogspot.com +mature2porn.blogspot.com.ar +mature2porn.blogspot.com.br +mature2porn.blogspot.com.es +mature2porn.blogspot.com.tr +mature2porn.blogspot.de +mature2porn.blogspot.gr +mature2porn.blogspot.it +mature2porn.blogspot.mx +mature2porn.blogspot.no +mature2porn.blogspot.pt +mature2porn.blogspot.sk +matureamateuraction.com +matureamateurs.net +maturebondage.galleryprogram.com +matureflirts.com +maturefreeporn.info +maturehardcore.galleryprogram.com +matureinc.com +maturelog.biz +maturemelons.net +maturenudeladies.com +maturenudewomen.net +matureporn6.com +maturepornmovs.com +matureporno.info +maturepornstars.galleryprogram.com +matureporntop.com +maturepornvids.net +matures.biz +maturesandcoeds.blogspot.com +maturesex.optus.nu +maturesex365.com +maturesexdreams.com +maturespornmovies.com +maturesuper.com +matureteam.com +maturewomenpics.org +mau.sextracker.com +mauriziobonanomi.it +maurobb.freecounter.it +maven.livefyre.com +maven.optimizely.com +mavenrestin.com +mavericks.marketo.com +max-eclat.men +max-host.pl +max.bannermanager.gr +max.gunggo.com +max.i12.de +maxads.ruralpress.com +maxadserver.corusradionetwork.com +maxbounty.com +maxcdn.quantserve.com +maxchicks.com +maxcrot.com +maxi4.firstvds.ru +maxiforum.ru +maxigame.info +maxim.122.2o7.net +maximafitness.com +maximilitary.ru +maximpartnerspr.com +maximumcash.com +maximumpcads.imaginemedia.com +maximumxxx.galleryprogram.com +maxiproteccion.com +maxis.krxd.net +maxisoft.co.uk +maxmedia.sgaonline.com +maxmusics.com +maxonclick.com +maxpoint.com +maxregistrycleaner.com +maxregistrycleaner.net +maxs.dk +maxsdome.de +maxserving.com +maxthon.com +maxtracker.net +maxvr.112.2o7.net +maxwealthy.com +maxxaffiliate.directtrack.com +maxxisproduct.com +maxxkonzept.de +maxxporno.com +maxxtor.eu +maxxxsex.com +maxymiser.net +may-js.github.io +maya18.com +mayasexe.net +maylasia.com +mayr-software.de +mayumix.chu.jp +mazda-roadsters.com +mazdaworld.us.intellitxt.com +mazowieckiecentrummedyczne.pl +mb.5.p2l.info +mb.datingadzone.com +mb.moatads.com +mb.zam.com +mb01.com +mb140.ru +mba-online.petrovka.info +mbabnk.pl +mbank.hit.gemius.pl +mbe-cdn-rtb-staging.fyber.com +mbe-cdn-rtb.fyber.com +mbe-cdn-staging.fyber.com +mbe-cdn.fyber.com +mbe-monitoring.fyber.com +mbi3.kuicr.kyoto-u.ac.jp +mbiologi.ru +mbn.com.ua +mbox.offermatica.intuit.com +mbox12.offermatica.com +mbox2.offermatica.com +mbox3.offermatica.com +mbox3e.offermatica.com +mbox4.offermatica.com +mbox4e.offermatica.com +mbox5.offermatica.com +mbox6.offermatica.com +mbox9.offermatica.com +mbox9e.offermatica.com +mbs.megaroticlive.com +mbuyu.nl +mc-ford.exacttarget.com +mc-login-qa2.exacttarget.com +mc-login-qa3.exacttarget.com +mc-redbox.exacttarget.com +mc-sony.exacttarget.com +mc.boa.exacttarget.com +mc.exacttarget.com +mc.login-qa1.exacttarget.com +mc.login-qa2.exacttarget.com +mc.login-qa3.exacttarget.com +mc.login-test.exacttarget.com +mc.login.exacttarget.com +mc.poc.exacttarget.com +mc.s1.exacttarget.com +mc.s1.qa1.exacttarget.com +mc.s1.qa2.exacttarget.com +mc.s1.qa3.exacttarget.com +mc.s1.qa5.exacttarget.com +mc.s10.exacttarget.com +mc.s100.exacttarget.com +mc.s11.exacttarget.com +mc.s2.qa1.exacttarget.com +mc.s2.qa2.exacttarget.com +mc.s2.qa3.exacttarget.com +mc.s4.exacttarget.com +mc.s5.exacttarget.com +mc.s50.exacttarget.com +mc.s6.exacttarget.com +mc.s7.exacttarget.com +mc.s8.exacttarget.com +mc.s91.exacttarget.com +mc.test.exacttarget.com +mc.tritondigital.com +mc.yandex.ru +mc1.devvm.imprev.net +mc1.imprev.net +mc1.qa-dest.imprev.net +mc1.qa.imprev.net +mc1.staging.imprev.net +mc1.testcluster.imprev.net +mcadamssupplyco.com +mcafee-home.7eer.net +mcafee12.tt.omtrdc.net +mcagbtdcwklf.com +mccafee-orientador.com-br.site +mccf.tritondigital.com +mcclatchy.112.2o7.net +mcd-su-2.mos.ru +mcdemo.exacttarget.com +mcdonaldscorporation.sc.omtrdc.net +mcdonaldscorporation.tt.omtrdc.net +mcfg.sandai.net +mci12.clicksor.com +mckinseyknowledge.122.2o7.net +mcleanvahomes.com +mclient.ivwbox.de +mcmads.mediacapital.pt +mcopolice.com +mct.rkdms.com +md-i-s.apptimize.com +md.5.p2l.info +mdamarillo.112.2o7.net +mdash.svc.insnw.net +mdctrail.com +mdjacksonville.112.2o7.net +mdn1.phluantmobile.net +mdn2.phluantmobile.net +mdn3.phluantmobile.net +mdn3origin.phluantmobile.net +mdnhinc.com +mdotm.com +mdpparents.112.2o7.net +mds.centrport.net +mdstaugustine.112.2o7.net +mdtopeka.112.2o7.net +mdwardmore.112.2o7.net +mdwathens.112.2o7.net +mdwaugusta.112.2o7.net +mdwjuneau.112.2o7.net +mdwoakridge.112.2o7.net +mdwsavannah.112.2o7.net +mdwskirt.112.2o7.net +mdx.sizmek.com +me-cdn.effectivemeasure.net +me-ssl.effectivemeasure.net +me.5.p2l.info +me.effectivemeasure.net +meabuilding.com +mearns-tractors.co.uk +measure.mobileapptracking.com +measuread.com +measuread.com.edgekey.net +measuremap.com +measurement-staging.snapads.com +measurement.snapads.com +meatspin.biz +meatspin.com +meatyourmaker.com.au +mebablo.com +mebel-alait.ru +mebel-vstroika.ru +mebelcomplekt.ru +mebeldekor.com.ua +mecash.ru +mechanicfuckers.com +mechausa.com +mecz.ujm.pl +mecze24.6ka.info +meczykilive.pl +med-tek.tns-cs.net +medaille.it +medanestesia.ru +medate.com +medbroadcast.112.2o7.net +meddesk.ru +mederotica.com +medhavi.tpf.org.in +medhelpinternational.112.2o7.net +medi-fitt.hu +media-0.vpptechnologies.com +media-1.vpptechnologies.com +media-2.vpptechnologies.com +media-4.vpptechnologies.com +media-5.vpptechnologies.com +media-6.vpptechnologies.com +media-8.vpptechnologies.com +media-a.vpptechnologies.com +media-adrunner.mycomputer.com +media-adserver.de +media-b.vpptechnologies.com +media-c.vpptechnologies.com +media-convert.com +media-d.vpptechnologies.com +media-e.vpptechnologies.com +media-f.vpptechnologies.com +media-fire.org +media-match.com +media-playerz.com +media-router-flurry3.prod.media.wg1.b.yahoo.com +media-router-flurry7.prod.media.wg1.b.yahoo.com +media-servers.net +media.888.com +media.adasiaholdings.com +media.adcarousel.pl +media.adcentriconline.com +media.adfrontiers.com +media.adlegend.com +media.admob.com +media.adrcdn.com +media.adrevolver.com +media.adrime.com +media.ads.gfsrv.net +media.adservinginternational.com +media.adshadow.net +media.adtech.de +media.adtechus.com +media.adxpansion.com +media.affiliatelounge.com +media.analyticson.com +media.ascend.ai +media.b.lead.program3.com +media.baventures.com +media.betburdaaffiliates.com +media.bidr.io +media.bonnint.net +media.boomads.com +media.brandreachsys.com +media.brightcove.map.fastly.net +media.cashcownetworks.com +media.charter.com +media.complex.com +media.contextweb.com +media.easyads.bg +media.elb-kind.de +media.espace-plus.net +media.exchange-it.com +media.exchange.bg +media.fairlink.ru +media.fastclick.net +media.fiksu.com +media.foundry42.com +media.ftv-publicite.fr +media.funpic.de +media.github.exacttarget.com +media.go2speed.org +media.gsimedia.net +media.hauptbruch.de +media.hw.adxpansion.com +media.intelia.it +media.lead.program3.com +media.livepromotools.com +media.lovercash.com +media.m-adx.com +media.markethealth.com +media.mobpartner.mobi +media.mopub.com +media.mydas.mobi +media.naked.com +media.net +media.netrefer.com +media.netseer.com +media.nk-net.pl +media.nubile-art.com +media.ontarionorth.com +media.playhaven.com +media.pointroll.com +media.popmarker.com +media.popunder.com +media.popuptraffic.com +media.primalforce.net +media.pussycash.com +media.quantserve.com +media.rbl.ms +media.scanscout.com +media.sexinyourcity.com +media.sharethrough.com +media.superstats.com +media.syndicaster.tv +media.the-adult-company.com +media.trafficfactory.biz +media.trafficjunky.net +media.travelzoo.com +media.ventivmedia.com +media.viwii.net +media.xxxnavy.com +media.yesmessenger.com +media01-ssl.svc.insnw.net +media01.adservinghost.com +media1.ancestry.com +media1.fastclick.net +media1.popmarker.com +media10.fastclick.net +media10.popmarker.com +media101.sitebrand.com +media11.fastclick.net +media12.fastclick.net +media122-d.openx.net +media13.fastclick.net +media14.fastclick.net +media15.fastclick.net +media16.fastclick.net +media17.fastclick.net +media18.fastclick.net +media19.fastclick.net +media2.adshuffle.com +media2.fastclick.net +media2.legacy.com +media2.netrefer.com +media2.popmarker.com +media2.travelzoo.com +media20.fastclick.net +media2021.videostrip.com +media21.fastclick.net +media22.fastclick.net +media23.fastclick.net +media24.fastclick.net +media25.fastclick.net +media26.fastclick.net +media27.fastclick.net +media28.fastclick.net +media29.fastclick.net +media3.fastclick.net +media3.popmarker.com +media30.fastclick.net +media31.fastclick.net +media32.fastclick.net +media33.fastclick.net +media34.fastclick.net +media35.fastclick.net +media36.fastclick.net +media37.fastclick.net +media38.fastclick.net +media39.fastclick.net +media4.fastclick.net +media4.popmarker.com +media40.fastclick.net +media4021.videostrip.com +media41.fastclick.net +media42.fastclick.net +media43.fastclick.net +media44.fastclick.net +media45.fastclick.net +media46.fastclick.net +media47.fastclick.net +media48.fastclick.net +media49.fastclick.net +media5.fastclick.net +media5.popmarker.com +media50.fastclick.net +media5021.videostrip.com +media51.fastclick.net +media52.fastclick.net +media53.fastclick.net +media54.fastclick.net +media55.fastclick.net +media56.fastclick.net +media57.fastclick.net +media58.fastclick.net +media59.fastclick.net +media6.fastclick.net +media6.popmarker.com +media6.sitebrand.com +media60.fastclick.net +media6021.videostrip.com +media61.fastclick.net +media62.fastclick.net +media63.fastclick.net +media64.fastclick.net +media65.fastclick.net +media66.fastclick.net +media67.fastclick.net +media68.fastclick.net +media69.fastclick.net +media6degrees.com +media7.fastclick.net +media7.popmarker.com +media70.fastclick.net +media71.fastclick.net +media72.fastclick.net +media73.fastclick.net +media74.fastclick.net +media75.fastclick.net +media76.fastclick.net +media77.fastclick.net +media78.fastclick.net +media79.fastclick.net +media8.fastclick.net +media8.popmarker.com +media80.fastclick.net +media81.fastclick.net +media82.fastclick.net +media83.fastclick.net +media84.fastclick.net +media85.fastclick.net +media86.fastclick.net +media87.fastclick.net +media88.fastclick.net +media89.fastclick.net +media9.fastclick.net +media9.popmarker.com +media90.fastclick.net +media91.fastclick.net +media92.fastclick.net +media93.fastclick.net +media94.fastclick.net +media95.fastclick.net +media96.fastclick.net +media97.fastclick.net +media98.fastclick.net +media99.fastclick.net +mediaarea.eu +mediabarterexchange.com +mediabistro.112.2o7.net +mediabistrocom.112.2o7.net +mediabong.net +mediabridge.cc +mediacces.com +mediacharger.com +mediacorp.112.2o7.net +mediadc-d.openx.net +mediadelivery.fi +mediadirectx.com +mediafaze.com +mediafile.pl +mediafr.247realmedia.com +mediageneral.com +mediaiqdigital.com +mediakds.rtb.adx1.com +medialand.relax.ru +medialogic.122.2o7.net +mediamath.com +mediamatters.112.2o7.net +mediamax.in.net +mediamgr.ugo.com +mediamond.nuggad.net +mediaoffers.click +mediaparade.net +mediaplanet.112.2o7.net +mediaplanet.azureedge.net +mediaplanner.inmobi.com +mediaplanner.uat.inmobi.com +mediaplayercodecpack.com +mediaplazza.com +mediaplex.com +mediapst-images.adbureau.net +mediapst.adbureau.net +mediaregad.hit.gemius.pl +medias.analyticson.com +medias.clicks4ads.com +medias.europacash.com +medias.presage.io +mediascale.de +mediaserver.bwinpartypartners.com +mediaserver.bwinpartypartners.it +mediashakers.rtb.adx1.com +mediatext.com +mediation.fyber.com +mediative.ca +mediative.com +mediatrack.revenue.net +mediatrade.h19.ru +mediatrking.com +mediauk.247realmedia.com +mediaupdate41.com +mediavideo.pl +mediaview.globalmailer.com +mediavine-d.openx.net +mediavine-res.cloudinary.com +mediavine.com +mediavoice.com +mediawhirl.net +mediax.angloinfo.com +mediaxpart.com +mediaz.angloinfo.com +medicaidchoice.com +medical-offer.com +medical-rewardpath.com +medical-systems.de +medical.carway.net +medicalbillingschools17.com +medicalfetishpics.com +medicinacom.ru +medicine-4u.org +medicinenet.us.intellitxt.com +medicineseasybuy.com +medicovi.com +medicreporters.com +medictube.ru +medienhaus.nuggad.net +medikamenten-per-klick.de +medindia.us.intellitxt.com +medispainstitute.com.au +medizinreisen.de +medkletki.ru +medleyads.com +medpop.oewabox.at +medrx.sensis.com.au +medtecchina.com +medusa.reklamlab.com +medya.e-kolay.net +medyanetads.com +meet.adx1.com +meet.exacttarget.com +meet.exponential.com +meet.foresee.com +meet.maxpoint.com +meet.mixpanel.com +meet.piwik.pro +meet.sekindo.com +meet.thunderhead.com +meetingrooms.juicemobile.com +meetings.amplitude.com +meetupcom.112.2o7.net +meetupdev.122.2o7.net +meetyourmessenger.co.uk +meevehdar.com +mega-galerie.com +mega-gry.com +mega-proxy.com +mega.vast.mega-tags.com +megaapteka.ru +megabanners.cf +megacash.de +megacloud.com.pl +megacloudz.net +megadown.net +megadown.us +megadownloader.co +megaflixxx.com +megagalleries.net +megahdporno.net +megaindex.ru +megapanel.gem.pl +megaplex.oewabox.at +megapopads.com +megaporno.biz +megasexe.net +megasexgirls.de +megasexporn.com +megasexworld.com +megastats.com +megasurfin.com +megawerbung.de +meiluziai.info +mein.monster.de +melding-technology.com +melizzamore.blog-paradijs.com +mellow.rdy.jp +mellowads.com +meltwater.com +member-quiz.com +memberpower.de +members.11.exacttarget.com +members.admedia.com +members.boa.exacttarget.com +members.commissionmonster.com +members.exacttarget.com +members.poc.exacttarget.com +members.rolodex.exacttarget.com +members.s1.qa1.exacttarget.com +members.s1.qa2.exacttarget.com +members.s1.qa3.exacttarget.com +members.s1.qa5.exacttarget.com +members.s10.exacttarget.com +members.s100.exacttarget.com +members.s11.exacttarget.com +members.s2.qa1.exacttarget.com +members.s2.qa2.exacttarget.com +members.s2.qa3.exacttarget.com +members.s4.exacttarget.com +members.s5.exacttarget.com +members.s50.exacttarget.com +members.s6.exacttarget.com +members.s7.exacttarget.com +members.s8.exacttarget.com +members.s91.exacttarget.com +members.sexroulette.com +members.test.exacttarget.com +members2.hookup.com +memberservicesinc.122.2o7.net +mememakers.mobi +memoclic.fr.intellitxt.com +memorizeneck.com +memorycobweb.com +memphisrap.us.intellitxt.com +mens.1.p2l.info +menshealthweb.co +mepirtedic.com +mepra.blautechnology.cl +mercury.bravenet.com +mercy.ga +mercycar.org +mercyfuck.com +mere.host.sk +meredithlocal-d.openx.net +meredithtv.us.intellitxt.com +mericnakliyat.com +meridia.1.p2l.info +meridia.3.p2l.info +meridia.4.p2l.info +meridiameridia.3xforum.ro +merryholidays.org +merrymilkfoods.com +mesopotemia222.zapto.org +mesotherapy.jino-net.ru +messagenovice.com +messagent.duvalguillaume.com +messagent.sanomadigital.nl +messagetag.com +messagia.adcentric.proximi-t.com +messardu.com +mesterads.com +mesto-x.com +met-art.biz +met.adwhirl.com +meta.7search.com +meta.openx.net +meta.osqa.net +metaapi.bulletproofserving.com +metabar.ru +metacafe.122.2o7.net +metacount.com +metadata.dynamicyield.com +metaffiliation.com +metagaua.hit.gemius.pl +metalkecil.com +metalprof.ee +metaltrades.com +metaltripshop.com +metanetwork.com +metaps.com +metarip.ru +metascephe.com +metcoc5cm.clarent.com +meter-svc.nytimes.com +metering.pagesuite.com +methodcash.com +methodshop.us.intellitxt.com +metric-agent.i10c.net +metric-public-service-prod.ol.epicgames.com +metric.10best.com +metric.allrecipes.com +metric.angieslist.com +metric.bizjournals.com +metric.gstatic.com +metric.infoworld.com +metric.makemytrip.com +metric.marthastewart.com +metric.modcloth.com +metric.nationalgeographic.com +metric.nwsource.com +metric.olivegarden.com +metric.petinsurance.com +metric.rent.com +metric.starz.com +metric.superpages.com +metric.thenation.com +metric.trulia.com +metric.volkswagen.com +metric.worldcat.org +metric.yellowpages.com +metrics-api.librato.com +metrics-collector-1584522448.us-east-1.elb.amazonaws.com +metrics-collector.onscroll.com +metrics.aarp.org +metrics.accessiblemetrics.com +metrics.accuweather.com +metrics.acehardware.com +metrics.adage.com +metrics.adidas.com +metrics.adswizz.com +metrics.aetn.com +metrics.al.com +metrics.amd.com +metrics.americancityandcounty.com +metrics.ancestry.com +metrics.apartmentfinder.com +metrics.ariba.com +metrics.att.com +metrics.autobytel.com +metrics.automobilemag.com +metrics.autotrader.co.uk +metrics.aviasales.ru +metrics.azfamily.com +metrics.babycenter.com +metrics.babycentre.co.uk +metrics.backtrace.io +metrics.barclaycardus.com +metrics.beachbody.com +metrics.bestbuy.com +metrics.bet.com +metrics.bhg.com +metrics.bitdefender.com +metrics.blackberry.com +metrics.bloomberg.com +metrics.boostmobile.com +metrics.bose.com +metrics.boston.com +metrics.brightcove.com +metrics.car.com +metrics.caranddriver.com +metrics.carbonite.com +metrics.carphonewarehouse.com +metrics.cars.com +metrics.cbc.ca +metrics.centex.com +metrics.chacha.com +metrics.chron.com +metrics.cleveland.com +metrics.clickconvertsell.com +metrics.cloudflarebolt.com +metrics.cnn.com +metrics.compactappliance.com +metrics.corus.ca +metrics.cosmopolitan.co.uk +metrics.crateandbarrel.com +metrics.creditreport.com +metrics.crystalcruises.com +metrics.csmonitor.com +metrics.ctv.ca +metrics.ctvdigital.net +metrics.cvshealth.com +metrics.cvshealth.com.edgekey.net +metrics.dailystrength.org +metrics.dallasnews.com +metrics.daveandbusters.com +metrics.dc.ad.msft.net +metrics.deloitte.com +metrics.delta.com +metrics.dentonrc.com +metrics.dickssportinggoods.com +metrics.digicert.com +metrics.discovery.com +metrics.divinecaroline.com +metrics.diy.com +metrics.dockerhub.us +metrics.doctoroz.com +metrics.dollargeneral.com +metrics.dunkindonuts.com +metrics.elle.com +metrics.ems.com +metrics.experts-exchange.com +metrics.express.com +metrics.expressen.se +metrics.fandome.com +metrics.fe.apple-dns.net +metrics.fedex.com +metrics.fidelity.com +metrics.finishline.com +metrics.fitnessmagazine.com +metrics.flyingmag.com +metrics.fnac.es +metrics.ford.com +metrics.foreignpolicy.com +metrics.foxnews.com +metrics.freecreditscore.com +metrics.gap.com +metrics.gcimetrics.com +metrics.gfycat.com +metrics.gnc.com +metrics.govexec.com +metrics.harley-davidson.com +metrics.hbogo.com +metrics.hbonow.com +metrics.health.com +metrics.hhgregg.com +metrics.homebase.co.uk +metrics.hoovers.com +metrics.howstuffworks.com +metrics.hrblock.com +metrics.hsbc.com.au +metrics.icloud.com +metrics.iconfitness.com +metrics.ikea.com +metrics.ilsole24ore.com +metrics.impactengine.com +metrics.imvu.com +metrics.ioffer.com +metrics.ireport.com +metrics.kampyle.com +metrics.kbb.com +metrics.kgw.com +metrics.kochava.com +metrics.ksl.com +metrics.ktvb.com +metrics.landolakes.com +metrics.laredoute.fr +metrics.lawyers.com +metrics.lehighvalleylive.com +metrics.lexus.com +metrics.lhj.com +metrics.marketing365.mk +metrics.maxim.com +metrics.mcafee.com +metrics.mercola.com +metrics.mlive.com +metrics.mms.mavenapps.net +metrics.moneymart.ca +metrics.more.com +metrics.mozilla.com +metrics.mpora.com +metrics.mysanantonio.com +metrics.mzstatic.com +metrics.natmags.co.uk +metrics.nba.com +metrics.necn.com +metrics.newcars.com +metrics.nextgov.com +metrics.nfl.com +metrics.nissanusa.com +metrics.nj.com +metrics.nola.com +metrics.npr.org +metrics.nutrisystem.com +metrics.oclc.org +metrics.olivegarden.com +metrics.oregonlive.com +metrics.pagerduty.com +metrics.pagoda.com +metrics.panadvert.com +metrics.parallels.com +metrics.parents.com +metrics.pe.com +metrics.pennlive.com +metrics.penton.com +metrics.performancing.com +metrics.performgroup.com +metrics.petsmart.com +metrics.philly.com +metrics.phonegap.com +metrics.politico.com +metrics.post-gazette.com +metrics.premiere.com +metrics.protectmyid.com +metrics.radioshack.com +metrics.ralphlauren.com +metrics.ranklocal.com +metrics.rcsmetrics.it +metrics.readme.io +metrics.reebok.com +metrics.rent.com +metrics.retailmenot.com +metrics.robinhood.org +metrics.rottentomatoes.com +metrics.rubiconglobal.com +metrics.sdkbox.com +metrics.seattlepi.com +metrics.seenon.com +metrics.sephora.com +metrics.sfr.fr +metrics.sharecare.com +metrics.shoedazzle.com +metrics.shopoon.fr +metrics.silive.com +metrics.sky.com +metrics.slate.com +metrics.solarwinds.com +metrics.sony.com +metrics.soundandvision.com +metrics.soundandvisionmag.com +metrics.southwest.com +metrics.speedousa.com +metrics.sprymetrics.com +metrics.starwoodhotels.com +metrics.starz.com +metrics.stjude.org +metrics.store.irobot.com +metrics.sun.com +metrics.svd.se +metrics.syracuse.com +metrics.target.com +metrics.td.com +metrics.teambeachbody.com +metrics.technologyreview.com +metrics.tgw.com +metrics.theatlantic.com +metrics.thedailybeast.com +metrics.thefa.com +metrics.thefrisky.com +metrics.thenation.com +metrics.thepointsguy.com +metrics.theweathernetwork.com +metrics.thinkgeek.com +metrics.three.co.uk +metrics.ticketmaster.com +metrics.timewarnercable.com +metrics.tlc.com +metrics.tmz.com +metrics.toptenreviews.com +metrics.toyota.com +metrics.toysrus.com +metrics.traderonline.com +metrics.tulsaworld.com +metrics.turner.com +metrics.tvguide.com +metrics.uol.com.br +metrics.us.levi.com +metrics.us.playstation.com +metrics.vividseats.com +metrics.vodafone.co.uk +metrics.washingtonpost.com +metrics.which.co.uk +metrics.whitepages.com +metrics.windowsitpro.com +metrics.winsupersite.com +metrics.womansday.com +metrics.worldmarket.com +metrics.yellowpages.com +metrics.yousendit.com +metrics01.linode-ca1.backtrace.io +metrics01.linode-de1.backtrace.io +metrics2.pricegrabber.com +metrics2.shopkick.com +metricscollector.lp.xcal.tv +metrika.ron.si +metrilo.com +metriweb.be +metro.uk.intellitxt.com +metrocuadro.com.ve +metropol-party.de +metropol.oewabox.at +metropolis.adwyze.com +metzgerei-joerg.de +meu.pl +meutorrent.org +mevaa.com +mew.com.au +mex-annushka.ru +mexico-mmm.net +mexico.prepaid.phone.card.sms13.de +mexicosleevegastrectomy.com +mexicotravelnet.com +mezczyzna-trendy.pl +mf.advantage.as +mf.sitescout.com +mfad1.advantage.as +mfio.cf +mfm.marketo.com +mfr.247realmedia.com +mfr.a2dfp.net +mg.3lift.com +mg.adskeeper.co.uk +mg.dt00.net +mg.marketgid.com +mg.mgid.com +mg2connext.com +mgba.org +mgdothaneagle.112.2o7.net +mgfd1b.petrix.net +mggraffiti.de +mghickoryrecord.112.2o7.net +mgid.com +mgid.rtb.adx1.com +mgjmp.com +mgjournalnow.112.2o7.net +mgmforex.com +mgmt-angular.dev.stage.us-east-1.kops.kargo.com +mgmt-angular.dev.staging.us-east-1.kops.kargo.com +mgmt-angular.stage.us-east-1.kops.kargo.com +mgmt.auth.mparticle.com +mgmt.us-east-1.kops.kargo.com +mgoanow.112.2o7.net +mgp.wbinsights.com +mgr.consensu.org +mgstarexponent.112.2o7.net +mgt.midasplayer.com +mgtbo.112.2o7.net +mgtbopanels.112.2o7.net +mgtimesdispatch.112.2o7.net +mgtricities.112.2o7.net +mgwcbd.112.2o7.net +mgwjar.112.2o7.net +mgwnct.112.2o7.net +mgwsav.112.2o7.net +mgwsls.112.2o7.net +mgwspa.112.2o7.net +mh.ogercron.com +mh.pip-pip-pop.com +mhi-systems.ru +mhiobjnirs.gq +mhlnk.com +mhot.sextgem.com +mi-de-ner-nis3.info +mi.5.p2l.info +mi.adinterax.com +mi1.midasplayer.com +mi2.midasplayer.com +mi3.midasplayer.com +mia.lisnr.com +miadomore.net +miami.ero-advertising.com +micardiss.ql.st +micasainvest.com +mice.pl +michaeldelugg.com +michaelgibbs.com +michaelkorsoutlet.store +michicoshot.com +michiganescorts.info +micmusik.com +micraamber.net +micro.rkdms.com +microoportunidades.com +microsearch.ru +microsend.hosting.exacttarget.com +microsmut.nu +microsof.wemfbox.ch +microsoft-sql-server.wp-club.net +microsoft-update.name +microsoft.com-it2-dye1.premi-fedelta-degli-utenti.us +microsoft.com-msoft52.info +microsoft.hosting.exacttarget.com +microsoftconsumermarketing.112.2o7.net +microsofteup.112.2o7.net +microsoftgamestudio.112.2o7.net +microsoftinternetexplorer.112.2o7.net +microsoftmachinetranslation.112.2o7.net +microsofto.sytes.net +microsoftoffice.112.2o7.net +microsoftofficehome.com +microsoftonlineportal.com +microsoftportal.net +microsoftsto.112.2o7.net +microsoftsupport.com-support0206.info +microsoftuk.122.2o7.net +microsoftwga.112.2o7.net +microsoftwindows.112.2o7.net +microsoftwindowscom.tt.omtrdc.net +microsoftwindowsmobile.122.2o7.net +microsoftwllivemkt.112.2o7.net +microsoftwlmailmkt.112.2o7.net +microsoftwlmessengermkt.112.2o7.net +microsoftwlmobilemkt.112.2o7.net +microsoftwlsearchcrm.112.2o7.net +microsoftxbox.112.2o7.net +microspec.co.uk +microstatic.pl +microticker.com +micrsoftupgradex.1apps.com +micuentoes.intelsad.com +mid.rkdms.com +midala.112.2o7.net +midar.112.2o7.net +midasplayer.com +midcru.112.2o7.net +middledress.net +middleportfreight.co.zw +middlerush-a.akamaihd.net +midget-sex-video.com +midget-xxx.com +midialeto.com +midiasomeluz.com.br +midsen.112.2o7.net +miercuri.gq +miespaciopilates.com +mieszkania-pokoje-wynajem.pl +mig.nexac.com +mightymagoo.com +mii-image.adjuggler.com +mikeboffer.mytvplayer.hop.clickbank.net +mil-colores.com +milbglobal.112.2o7.net +milf.gabriola.cl +milfseiten.com +milfswantcock.com +milioner.popunder.ru +military.us.intellitxt.com +militarysale.pro +militaryverse.com +milkeat.com +milkfountain.com +milleniumpapelaria.com.br +millennium-teens.com +millhousecorals.com +millionare.com +milliontrees.com +millseagle.com +milwebcams.com +milyondolar.com +mima-hosp.com +mimageads.googleadservices.com +mimageads1.googleadservices.com +mimageads2.googleadservices.com +mimageads3.googleadservices.com +mimageads4.googleadservices.com +mimageads5.googleadservices.com +mimageads6.googleadservices.com +mimageads7.googleadservices.com +mimageads8.googleadservices.com +mimageads9.googleadservices.com +mimascotafiel.com +mimicrice.com +min.imageflux.cf +mindbox.co.za +mindeyegames.com +mindflash-api.cs.keen.io +mindstormstudio.ro +mindwarp0.ml.org +mine.gay-hotvideo.net +mine.nahnoji.cz +mine.torrent.pw +mine.xmrpool.net +mine2-party.nablabee.com +mineback.com +minecraft-neo.ru +minecraftmodification.com +minecraftstar.tk +minecrunch.co +minegam.com +minekitten.io +minemytraffic.com +miner.cinemafacil.com +miner.cryptobara.com +miner.nablabee.com +miner.oozing.co +miner.pr0gramm.com +miner.shareasale.com +minerad.com +minerclaim.net +minercry.pt +minero-proxy-01.now.sh +minero-proxy-02.now.sh +minero-proxy-03.now.sh +minero.cc +minero.pw +minerva.healthcentral.com +minescripts.info +minestat.biz +minexmr.com +minexmr.stream +ming-dun.com.tw +minharevisao.com +minhman.vn +mini.7zap.com +mini.activeshopper.com +mini.videostrip.com +miniads.ca +minigameplanet.com +mining.best +mining.coin-hive.com +mining.freebitco.in +mining711.com +ministerio-publi.info +minormeeting.com +minr.browsermine.com +minr.nullrefexcep.com +minr.pw +mint.finance.intuit.com +mintsurvey.api.intuit.com +mipsa.ciae.ac.cn +miracema.rj.gov.br +mirageads.net +mirandolasrl.it +mirror.pointroll.com +mirrorcoukcelebs.skimlinks.com +mirrors.site50.net +mirrorsearch.speedbit.com +miscws002.coinhive.com +miscws005.coinhive.com +miscws009.coinhive.com +miscws013.coinhive.com +miscws016.coinhive.com +miscws018.coinhive.com +miscws027.coinhive.com +miscws029.coinhive.com +missjia.us.intellitxt.com +misstrends.com +mitobeb.yadozalamom.pw +mitsubishi.112.2o7.net +mitsubishielectric.112.2o7.net +mix-test.uts.ngdata.com +mix.kinostuff.com +mixedreading.com +mixedtraffic.com +mixmarket.biz +mixpanel.com +mixtraffic.com +mjx.ads.nwsource.com +mjxads.internet.com +mk.marketing365.mk +mkcthehomemarketplace.112.2o7.net +mklik.gazeta.pl +mkt.adx1.com +mkt.tune.com +mkt10.122.2o7.net +mkt81.net +mkt8668.com +mktg-offer.com +mktg.actonsoftware.com +mktg.tvpage.com +mktgcdn.de.coremetrics.com +mkto-ab040164.com +mkto-ab060029.com +mkto-ab090106.com +mkto-ab100012.com +mkto-ab110094.com +mkto-ab120024.com +mkto-ab120109.com +mkto-ab130158.com +mkto-ab160178.com +mkto-ab210183.com +mkto-ab220122.com +mkto-ab220160.com +mkto-ab230119.com +mkto-ab260057.com +mkto-ab260082.com +mkto-ab280131.com +mkto-ab290078.com +mkto-ab290138.com +mkto-ab290158.com +mkto-ab300027.com +mkto-ab300112.com +mkto-ab310019.com +mkto-ab310065.com +mkto-aba0380.com +mkto-abm0208.com +mkto-b0065.com +mkto-e0185.com +mkto-f0054.com +mkto-i0026.com +mkto-lon020055.com +mkto-lon020292.com +mkto-lon030316.com +mkto-lon070016.com +mkto-lon080014.com +mkto-p0016.com +mkto-pages.power.com +mkto-panda123.music.blog +mkto-q0059.com +mkto-q0111.com +mkto-sj020094.com +mkto-sj050263.com +mkto-sj060082.com +mkto-sj070017.com +mkto-sj090022.com +mkto-sj090253.com +mkto-sj110140.com +mkto-sj150030.com +mkto-sj150039.com +mkto-sj190133.com +mkto-sj200005.com +mkto-sj210180.com +mkto-sj220006.com +mkto-sj220031.com +mkto-sj220032.com +mkto-sj250060.com +mkto-sjf0310.com +mkto-sjg0058.com +mkto-sji0011.com +mkto-sji0026.com +mkto-sjl0027.com +mkto-sjp0016.com +mkto-sn010179.com +mkto-sn020052.com +mkto-sn030095.com +mkto-sn030096.com +mkto-sn030097.com +mkto-sn030098.com +mkto-sn030185.com +mkto-sn040160.com +mkto-sn040178.com +mkto-test.com +mktopodab01.marketo.com +mktopodab011.marketo.com +mktopodab0111.marketo.com +mktoresp.com +mktossl.com +mktoweb.com +mktrkr.com +ml-attr.com +ml.adrelevantis.com +ml.ia.thunderhead.com +ml.optimizely.com +ml314.com +mlarmani.122.2o7.net +mlbam.112.2o7.net +mlbastros.112.2o7.net +mlbatlanta.112.2o7.net +mlbcincinnati.112.2o7.net +mlbcolorado.112.2o7.net +mlbcom.112.2o7.net +mlbglobal.112.2o7.net +mlbglobal08.112.2o7.net +mlbhouston.112.2o7.net +mlbsanfrancisco.112.2o7.net +mlbstlouis.112.2o7.net +mlbtoronto.112.2o7.net +mlc.maxpoint.com +mlc.mxptint.net +mlib.browsermine.com +mlinktracker.com +mlm.de +mlntracker.com +mlpoint.pt +mlsglobal.112.2o7.net +mlvc4zzw.space +mm-syringe.com +mm.admob.com +mm.chitika.net +mm.marketo.com +mm.mkto-test.com +mm.zubovskaya-banya.ru +mm1.vip.sc1.admob.com +mm26.com +mmafighting.us.intellitxt.com +mmajerski.pl +mmapquest.com +mmarkt.oewabox.at +mmc.122.2o7.net +mmc.center +mmfiles.amp.mcafee.com +mmgads.com +mmile.com +mmismm.com +mmm.vindy.com +mmmag.appsee.com +mmnetwork.mobi +mmoframes.com +mmofreegames.online +mmotraffic.com +mmpool.org +mmptrack.com +mms.cnn.com +mms.gmbh.sms13.de +mms.handys.sms13.de +mms.versand.sms13.de +mmsms.net +mmsolar.pl +mmsshopcom.112.2o7.net +mmstat.com +mmtracking.com +mmtrkpy.com +mmtro.com +mmv.admob.com +mn.5.p2l.info +mn.mn.co.cu +mncrftpcs.com +mnet-ad.net +mnfidnahub.112.2o7.net +mng1.clickalyzer.com +mngi.112.2o7.net +mngidailybreeze.112.2o7.net +mngidmn.112.2o7.net +mngimercurynews.112.2o7.net +mngimng.112.2o7.net +mngirockymtnnews.112.2o7.net +mngislcnac.112.2o7.net +mngislctrib.112.2o7.net +mngisv.112.2o7.net +mngitwincities.112.2o7.net +mngiyhnat.112.2o7.net +mngiyrkdr.112.2o7.net +mno.tns-cs.net +mnogabukaff.net +mnogolok.info +mo.5.p2l.info +mo.bfox.com +moandbo.com +moatads.com +moatads.com.edgekey.net +mob.adnxs.com +mob.adwhirl.com +mobaplayer.ru +mobatory.com +mobclix.com +mobcontentxx.com +mobfactory.info +mobi-hack.tk +mobi29x.sextgem.com +mobiapp-games.com +mobicpi.com +mobila.pl +mobile-antivirus.club +mobile-app.pl +mobile-browser.me +mobile-collector.newrelic.com +mobile-crash.newrelic.com +mobile-demo.outbrain.com +mobile-redirection.com +mobile-sdk-api.intercom.io +mobile.ace.advertising.com +mobile.activeshopper.com +mobile.adx1.com +mobile.analytics.yahoo.com +mobile.banzai.it +mobile.bet.pt +mobile.bitterstrawberry.org +mobile.juicyads.com +mobile.lc.wix.com +mobile.optimizely.com +mobile.pipe.aria.microsoft.com +mobile.smartadserver.com +mobile9.us.intellitxt.com +mobileads.ero-advertising.com +mobileads.msn.com +mobileadtrading.com +mobileanalytics.us-east-1.amazonaws.com +mobileanalytics.us-east-2.amazonaws.com +mobileanalytics.us-west-1.amazonaws.com +mobileanalytics.us-west-2.amazonaws.com +mobileapi.advertising.com +mobileapptracking.com +mobileaps.co +mobileburn.us.intellitxt.com +mobilecomputermag.uk.intellitxt.com +mobiledl.adobe.com +mobileforhero.com +mobileiconnect.com +mobileleads.msn.com +mobileofferplace.site +mobilerewards.io +mobiletechreview.us.intellitxt.com +mobilewhack.us.intellitxt.com +mobilityguru.us.intellitxt.com +mobisex.pieprz.pl +mobistos.com +mobpartner.mobi +mobpushup.com +mobrevflwms.com +mobscan.info +mobsfun.com +mobstarr.com +mobularity.com +mobverify.com +mobyapps.net +moc.silk.com +mochibot.com +mocka.frost-electric-supply.com +model.telstra.inscname.net +modescrips.info +modifiedlife.us.intellitxt.com +modifyeyes.com +modimoda.pl +modnakolekcja.com +modules-prod.franklyinc.com +modules.franklyinc.com +modules.ngm.franklyinc.com +modules.wcax.com +moggattice.com +moiawsorigin.clo.footprintdns.com +mojadietanamase.pl +moje-iq.pl +mojekumpele.blogspot.com +mojepvpweryfikacja.tk +mojezakupy.net +mojn.com +mojofarm.mediaplex.com +mola77.mobilenobo.com +moldyicicle.com +molla.gato1000.cl +mollnia.com +mom.freelogs.com +moments.advertising.com +mommyish.us.intellitxt.com +momonitor.mopub.com +momoxxio.com +moms-lessons.blogspot.com +moms-onfilm.blogspot.com +momsgirlsboys.blogspot.com +momsgotofuck.com +momsonfuck.com +momssex.info +momstryanal.blogspot.com +momwentthere.cf +mon.ibm.xtify.com +mon.trackmysales.website +mon24.l2pdus.mookie1.com +monad.network +monarchads.com +monarchfind-a.akamaihd.net +monarchslo.com +monarhs.info +monclercheap.xyz +moncleroutletonline.pw +monclervests.xyz +mondaynightpoker.com +mondo-animali.it +mondo-porno.nu +mondoads.s3.amazonaws.com +monenzo.com +moneone.ga +monerise.com +monero-miner.com +monero-miner.net +monero.crypto-pool.fr +monero.crypto-webminer.com +monero.hashvault.pro +monero.monerise.com +monerominer.rocks +moneroocean.stream +monetarycard.com +monetate.net +monetisetrk.co.uk +monetisetrk2.co.uk +monetisetrk3.co.uk +monetisetrk4.co.uk +monetisetrk5.co.uk +monetisetrk6.co.uk +monetization-framework.bsa.netdna-cdn.com +monetizationking.net +monetize-me.com +monetizer.com-01.site +monetizer.info +monetizer101.com +money-every-day.com +money-maker-default.info +money-maker-script.info +money4links.com +moneybot.net +moneychord.com +moneyexpert.com +moneyfree.ru +moneyh.wemfbox.ch +moneylookout.yeahlinks.com +moneymaster.ru +moneynews24.com +moneyraid.com +moneysos.com +moneytree.sextracker.com +monitor-oma.bandwidthx.net +monitor-preprod.sddan.mgr.consensu.org +monitor.oewabox.at +monitor.phorm.com +monitor.returnpath.net +monitor.sddan.mgr.consensu.org +monitor1.returnpath.net +monitor2.returnpath.net +monitoring.adwyze.com +monitoring.eloqua.com +monitoring.mediavine.com +monitoring.profi-webhosting.cz +monitoring.vungle.com +monitoringservice.co +monkey-broker-d.openx.net +monkeyball.osa.pl +monkeyminer.net +monofeel.com +monster-ads.net +monster.gostats.com +monster.gostats.ru +monsterpops.com +monstersandcritics.advertserve.com +monstersandcritics.uk.intellitxt.com +montblanc.122.2o7.net +montblanccom.122.2o7.net +montezuma.spb.ru +monthlywinners.com +montrealgazette.stats.com +moo.sitescout.com +moodle.viewbix.com +moodoo.com.cn +moodoocrv.com.cn +mookie1.com +moonbit.co.in +moonify.io +moonsade.com +mopub.com +mopub.ssapi.ad.cpe.dotomi.com +morefastermac.trade +morefreecamsecrets.com +morehitserver.com +morenews3.net +morevisits.info +morgpost.ivwbox.de +mormonorg.112.2o7.net +morningdigit.com +morningnewsonline.112.2o7.net +morningstar.us.intellitxt.com +mortgage-memphis.hotmail.ru +mortgage-rates.now-cash.com +moscow05.electroneum.hashvault.pro +most.cob.net.ba +motd.pinion.gg +motifcdn.doubleclick.net +motifcdn2.doubleclick.net +motifiles.com +motleyfool-d.openx.net +motoren.ru +motorl.oewabox.at +motortrend.us.intellitxt.com +motosal.net +mottnow.adk2x.com +motyw-fb.blogspot.com +mouads.com +mouseflow.com +mousestats.com +movie-list.us.intellitxt.com +movieads.ero-advertising.com +movieads.imgs.sapo.pt +moviehole.us.intellitxt.com +movies.701pages.com +movies.us.intellitxt.com +moviesonline.ca.intellitxt.com +moviestarplanet-hack.org.pl +moviestarplanet-haki-i-kody.crazylife.pl +moviestarplanetcheatstool.com +moviestarplanethackers.co +moviestarplanethacks.pl +movieweb.us.intellitxt.com +movitex.122.2o7.net +movsflix.com +mowfruit.com +mozebyctwoje.com +mp.5.p2l.info +mp.adnxs.com +mp.advertising.com +mp.apmebf.com +mp.clicksor.net +mp.pianomedia.eu +mp.tscapeplay.com +mp3playerprovider.com +mp3playersource.com +mp3red.cc +mparticle.com +mparticle.containers.piwik.pro +mpartner.googleadservices.com +mpc.mxptint.net +mpc.nl.mxptint.net +mpd.mxptint.net +mpd.nl.mxptint.net +mpintelligence.maxpoint.com +mpire.112.2o7.net +mpkhi-bk.multi.net.pk +mplayerdownloader.com +mplxtms.com +mpmotrk.com +mpp.emea.mxptint.net +mpp.mxptint.net +mpp.specificclick.net +mpp.vindicosuite.com +mproxy.banner.linksynergy.com +mprptrk.com +mps-ws.adtechus.com +mps.mxptint.net +mpsnare.iesnare.co.uk +mpsnare.iesnare.com +mpstat.us +mpv.sandai.net +mpxxtrk.com +mr-rank.de +mr4evmd0r1.s.ad6media.fr +mra-aus.returnpath.net +mra-ci.returnpath.net +mra-d1.returnpath.net +mra-d2.returnpath.net +mra-fbl.returnpath.net +mrace.hopto.org +mrb-aus.returnpath.net +mrb-ci.returnpath.net +mrb-d1.returnpath.net +mrb-d2.returnpath.net +mrb-fbl.returnpath.net +mreg.hit.gemius.pl +mri.hosting.exacttarget.com +mrjeweller.us +mrp.rubiconproject.com +mrskincash.com +mrtg.hitbox.com +ms-mvp.org +ms.5.p2l.info +ms.adpremium.org +ms.ligatus.com +ms.onscroll.com +ms.pages.test.exacttarget.com +ms.test.exacttarget.com +ms.vsassets.com +ms.ws.test.exacttarget.com +ms.yandex.ru +ms1.midasplayer.com +ms11.net +ms127.0.0.101341.club +mscom.demdex.net +msdns.online +mseuppremain.112.2o7.net +mseupwinxpfam.112.2o7.net +msfn.us.intellitxt.com +msg-2.me +msg-media.valueclick.akadns.net +msg.dotomi.com +msg.i.dotomi.com +msgstore2.pldtprv.net +msgtag.com +mshelp247.weebly.com +msk-diplomat.com +mskara.org.uk +msmetrics.ws.sonos.com +msmobiles.de.intellitxt.com +msn-cdn.effectivemeasure.net +msn.allyes.com +msn.inscname.net +msn.oewabox.at +msn.serving-sys.com +msn.tns-cs.net +msn.uvwbox.de +msn.wrating.com +msn1.com +msna1com.112.2o7.net +msnaccountservices.112.2o7.net +msnad.nuggad.net +msnads-wm9.fplive.net +msnbc.112.2o7.net +msnbc.us.intellitxt.com +msnbcnewsvine.112.2o7.net +msnbcom.112.2o7.net +msnbe-hp.metriweb.be +msnbot-65-55-108-23.search.msn.com +msneshopbase.112.2o7.net +msninvite.112.2o7.net +msninviteprod.112.2o7.net +msnlivefavorites.112.2o7.net +msnm.com +msnmercom.112.2o7.net +msnmercustacqprod.112.2o7.net +msnonecare.112.2o7.net +msnportal.112.2o7.net +msnportalaffiliate.112.2o7.net +msnportalaunews.112.2o7.net +msnportalbeetoffice2007.112.2o7.net +msnportalgame.112.2o7.net +msnportalhome.112.2o7.net +msnportallatino.112.2o7.net +msnportallive.112.2o7.net +msnportalmsgboardsrvc.112.2o7.net +msnportalscp.112.2o7.net +msnportalvideo.112.2o7.net +msnsearch.srv.girafa.com +msnservices.112.2o7.net +msnsports.com +msntest.serving-sys.com +msntrademarketing.112.2o7.net +msnwinonecare.112.2o7.net +msphack.com.pl +msphack.pl +msphackonline.com +msphacks.net +msr.cpufan.club +msrv.saas.appdynamics.com +msrv.saastest.appdynamics.com +mssbcprod.112.2o7.net +mssl.fwmrm.net +msstonojstechnet.112.2o7.net +mssystem.info +mstr.sharethrough.com +mstrlytcs.com +msvy0.ml +msw-technologies.de +mswindowswolglobal.112.2o7.net +mswlspcmktdev.112.2o7.net +mswmwpapolloprod.122.2o7.net +msxml.info.com +msxml.us.info.com +mt.5.p2l.info +mt.adquality.ch +mt.rtmark.net +mt1.mtree.com +mt10.mtree.com +mt103.mtree.com +mt11.mtree.com +mt113.mtree.com +mt12.mtree.com +mt122.mtree.com +mt124.mtree.com +mt127.mtree.com +mt15.mtree.com +mt2-fire.com +mt2.mtree.com +mt32.mtree.com +mt34.mtree.com +mt35.mtree.com +mt37.mtree.com +mt4.mtree.com +mt55.mtree.com +mt58.mtree.com +mt83.mtree.com +mt94.mtree.com +mta-sts.adx1.com +mtccsun.imtech.ernet.in +mtcount.channeladvisor.com +mtg.tns-cs.net +mtldesigns.ca +mtpleasantwaterworks.com +mtrcs.popcap.com +mtrcs.redhat.com +mtrcs.samba.tv +mtree.com +mtrx.go.sonobi.com +mtsoft.net +mttwtrack.com +mturkcontent.com +mtv.247realmedia.com +mtv.nuggad.net +mtv2.telemedia.la +mtvbrazil-services.vimn.com +mtvn.112.2o7.net +mtvn.demdex.net +mtvnlatservices.com +mtvp05j.com +mtvu.112.2o7.net +mu-in-f167.1e100.net +muabancantho.info +mudfall.com +mudmonster.org +mueller-holz-bau.com +multi.xnxx.com +multi1.rmuk.co.uk +multimedia-projector.katrina.ru +multioptik.com +multiply.112.2o7.net +multiply.crwdcntrl.net +multipops.com +multiregionca.intentmedia.net +multiverse.tune.com +multiview.122.2o7.net +mun.122.2o7.net +munchkin.brightfunnel.com +munchkin.marketo.net +mundialove.pl +munero.me +munki.aws.branch.io +munkireport.aws.branch.io +mup.amp.mcafee.com +murbil.hostei.com +murcia-ban.es +murdoog.com +muscle-relaxers.1.p2l.info +muscleandfitnesshers.us.intellitxt.com +music.getyesappz1.com +music.ign.us.intellitxt.com +music.myappzcenter.com +music102.awardspace.com +music611.com +musical-queen.de +musiccounter.ru +musicmembersarea.com +musicstock.me +musicvidz.ru +musicweek.lt +musikverein-karlburg.de +musikzoo.com +musiquesarts.ch +musirc.com +musoba.com +mustangevolution.us.intellitxt.com +mustat.com +muster-sandbox.intercom.io +mustwineblog.com +mutterfick.com +muttertochter.net +mutuza.win +muurtjeover.nl +muwmedia.com +muygordas.com +muyzorras.com.es +muz-baza.net +muz-shoes.ru +muz-tracker.net +muzaporn.com +muznachas-service.ru +muztops.ru +mv.bidsystem.com +mv.treehousei.com +mv0129.stream +mvduk.kiev.ua +mvfree.com +mvonline.com +mvpicton.co.uk +mvreservations.com +mvs.mediavantage.de +mvtracker.com +mwadeef.com +mwc.velti.com +mwnodes.viaxmr.com +mwor.gq +mx.adserver.yahoo.com +mx.ero-advertising.com +mx.iesnare.com +mx.iovation.com +mx.maxpoint.com +mx.tst.returnpath.net +mx01.openinternetexchange.com +mx01.openinternetexchange.net +mx01.webwise.com +mx03.phorm.com +mx1.absum.ru +mx1.freemail.ne.jp +mx2.absum.ru +mx3.absum.ru +mxa-ci.returnpath.net +mxa-d1.returnpath.net +mxa-d2.returnpath.net +mxb-d1.returnpath.net +mxb-d2.returnpath.net +mxc-d1.returnpath.net +mxc-d2.returnpath.net +mxcdn1.now.sh +mxcdn2.now.sh +mxgetcode.com +mxl.connexity.net +mxmacromedia.112.2o7.net +mxpnl.com +mxptint.net +my-bc.ru +my-big-family.com +my-cash-bot.co +my-cdn.effectivemeasure.net +my-facial.com +my-great-mobilephone.com +my-jobhunter.com +my-pc-cleaner.org +my-porno.biz +my-rent-to-own-homes-options.com +my-retrospace.sbhmn-miner.com +my-reward-channel.com +my-rewardsvault.com +my-rigs.com +my-surf.info +my-uq.com +my.adocean.pl +my.blueadvertise.com +my.coolestmobi.com +my.effectivemeasure.net +my.evidon.com +my.iheartradio.com +my.iwon.com +my.mobfox.com +my.mystreamdelivery.xyz +my.pcsecurityshield.com +my.putlocker.to +my.rtmark.net +my.statcounter.com +my.surveypopups.com +my.trackjs.com +my.trgino.com +my2.hizliizlefilm.net +my2.teknoter.com +my8.statcounter.com +myad.clicksor.net +myadstats.com +myadultdiary.com +myadultempire.com +myaff.pl +myaffiliateprogram.com +myaloevera.com +myamateurvideos.com +myamateurvids.com +myanmardream.com +myanyone.net +myao.adocean.pl +myap.liveperson.com +myasianfetish.com +myasiantv.gsspcln.jp +myaviatorcar.com +mybadgirls.net +mybb.ero-advertising.com +mybbwporn.com +mybestgay.com +mybinaryoptionsrobot.com +myblacklesbians.net +myblankit.com +mybloglog.com +myblogporn.com +myblogregistercm.tk +myboobies.net +mybuys.com +mycaf.it +mycamdenliving.com +mycamptrack.com +mycashback.co.uk +mycasinoonnet.com +mycelloffer.com +mychoicerewards.com +mycleanerpc.com +mycleanpc.com +mycleanpc.tk +myclicknet.ro +myclicknet.romtelecom.ro +mycooch.com +mycounter.tinycounter.com +mycounter.ua +mycouponizemac.com +mycreditrepairfix.com +mydaddy.b0x.com +mydailymoment.us.intellitxt.com +mydancexpress.com +mydanfoss.com +mydas.mobi +mydascoin.pl +mydati.com +mydeathspace.com +mydemopk11.truconversion.com +mydigitallife.us.intellitxt.com +mydirtyhobby.com +mydirtystuff.com +mydld.com +mydmp.exelator.com +mydownloadengine.com +mydownlodablefiles.com +mydreamdegree.com +myeforsa.pl +myeros.co.uk +myeurosexparties.com +myexclusiverewards.com +myfamilyancestry.112.2o7.net +myfamilycominc.tt.omtrdc.net +myfavoritegames.us.intellitxt.com +myfetish.info +myfhology.sbhmn-miner.com +myfight.info +myfreecams.com +myfreedinner.com +myfreegifts.co.uk +myfreemp3player.com +myfukbuddy.com +myfuncards.com +myghillie.info +mygiftcardcenter.com +mygiftresource.com +mygirls.nl +mygransearch.com +mygreatrewards.com +myhdradio.ca +myhealthcare.com +myhitbox.com +myhitmp3.club +myhornyteens.com +myhotsamples.com +myhousetechnews.com +myindospace.com +myiptest.com +myitdetective.com +mylabsrl.com +mylead.eu +mylead.pl +mylike.co.uk +mylocker.pl +mylondon.hc0.me +mylovelymommy.tk +mylovesister.gq +mymediarecommendations.com +mymoneymakingapp.com +mymoralcode.com +mymountnittanyheath.com +mynakedgirls.com +mynatenpolicy.com +mynatgenpoicy.com +mynatgenpolocy.com +mynatgepolicy.com +mynativeplatform.com +myoffers.bid +myoffers.co.uk +myoffers.party +myoffertracking.com +myonline2018softwarefree.win +mypagerank.net +mypagerank.ru +myperiod.club +myphentermine.polybuild.ru +mypornbest.com +mypornogames.com +mypornoo.com +mypornozone.com +mypornsearcher.com +mypornstarlife.com +mypowermall.com +myprintscreen.com +myprivateemails.com +myprizes.net +myproxy.in +myregeneaf.com +myrseth-multimedia.no +mysagagame.com +mysavings.directtrack.com +myscan.info +myscholl.de +myscholli.com +myschooltab.in +mysearch-engine.com +mysearchweb.net +myseostats.com +mysex-story.com +mysex.pl +mysexpics.ru +myshopmarketim.com +myshovel.com +mysite.eloqua.com +mysite.irkdsu.ru +mysite.myfamilymobile.staging.airfind.com +mysite.net10.staging.airfind.com +mysite.pagepluscellular.staging.airfind.com +mysite.safelink.staging.airfind.com +mysite.simplemobile.staging.airfind.com +mysite.telcelamerica.staging.airfind.com +mysite.totalwireless.staging.airfind.com +mysite.tracfone.staging.airfind.com +mysites.net10.staging.airfind.com +mysites.simplemobile.staging.airfind.com +mysites.telcelamerica.staging.airfind.com +mysites.totalwireless.staging.airfind.com +mysites.tracfone.staging.airfind.com +mysmallcock.com +myspace.truconversion.com +myss.eloqua.com +mystat-in.net +mystat.pl +mystats.com +mysteriousmonth.com +mysterysnooper.com +mysuicidegf.com +mytest.truconversion.com +mytestminer.xyz +mytimerpro.com +mytop-in.net +mytotalsearch.com +mytraf.info +mytraf.ru +mytrafficads.com +mytrannydream.com +mytx.org +mytyx.com +myusenet.youth-and-beauty.net +myusersonline.com +myvailladebitcard.com +myvenus.org +myvideopost.com +myvideostv.com +myvintageisland.com +myvksaver.ru +mywebsearch.com +mywedding.md +mywgu.org +mywhorewife.com +mywot.com +mywot.net +myxdate.info +myxxxclip.info +myxxxnet.com +myyearbookdigital.checkm8.com +myyour.eu +mzbcdn.net +n-mobile.net +n-tv.met.vgwort.de +n-u-n.com +n.ad-back.net +n.admagnet.net +n.admob.com +n.adonweb.ru +n.ads1-adnow.com +n.ads2-adnow.com +n.ads3-adnow.com +n.ap1.dyntrk.com +n.ap2.dyntrk.com +n.as1.dyntrk.com +n.betus.com +n.bodybuilding.com +n.dyntrk.com +n.eu1.dyntrk.com +n.eu2.dyntrk.com +n.mplxtms.com +n.pcads.ru +n.targetbtracker.com +n.targetctracker.com +n.us.dyntrk.com +n.us1.dyntrk.com +n.us2.dyntrk.com +n.zeroredirect.com +n01d05.cumulus-cloud.com +n02.unternehmen.com +n131adserv.com +n149adserv.com +n1internet.com +n2.smartyads.com +n214adserv.com +n24se.nuggad.net +n3302ad.doubleclick.net +n3349ad.doubleclick.net +n339.asp-cc.com +n4052ad.doubleclick.net +n4061ad.doubleclick.net +n4061ad.hk.doubleclick.net +n4403ad.doubleclick.net +n479ad.doubleclick.net +n4g.us.intellitxt.com +n4p.ru.redtram.com +n4p.ua.redtram.com +n69.com +na-ab13.marketo.com +na-ab23.marketo.com +na-eb2.3lift.com +na-qa.marketo.com +na-qe.marketo.com +na-sjqe.marketo.com +na.ads.yahoo.com +na.hitbox.com +na.monerise.com +na.tns-cs.net +na1.thunderhead.com +na15.ru +na2.thunderhead.com +na3.thunderhead.com +na4.thunderhead.com +na5.cdn.thunderhead.com +na5.thunderhead.com +na5preprod.cdn.thunderhead.com +naaktsporten.be +nabke.com +nablabee.com +nabosex.dk +nabu-neckar-fils.de +nac-bearings.ru +nacap.ru +nachbarschaftspost.com +nacktefrau.eu +nacktgirls.de +nactx.com +nadegda-95.ru +nadirshoes.com +naenticle.info +naftemporiki.nuggad.net +nagdak.ru +nagios.dynamicyield.com +nagios.svc.insnw.net +nagios.syndicaster.tv +nagoya-net.com +nagroda-dla-ciebie.com +nagroda-sms.pl +naijahacking.tk +naijahacklord.tk +nailbytes1.com +naj.sk +najlepszedlaciebie.com +najlepszenarynku.pl +najlepszewrozby.pl +najprzydatniejsze.blogspot.com +najsiejfnc.win +nam.ia.thunderhead.com +nameguess.com +nametests.com +nametraff.com +namierz-telefon.com.pl +namierz-telefon.pl +namierzanie-telefonu.pl +namso.butlerelectricsupply.com +nan.netmng.com +nana10.checkm8.com +nana10digital.checkm8.com +nandomedia.112.2o7.net +nanoadexchange.com +nanocluster.reklamz.com +nanovisor-ssl.svc.insnw.net +nanovisor01-ssl.svc.insnw.net +nanovisor01.svc.insnw.net +napi.lanistaads.com +napi.thirdpresence.com +napraw-laptopa.waw.pl +napraw-swojego-laptopa.pl +narativ.theappgrader.com +narrow.azenergyforum.com +narwhal.hitbox.com +narzedzia-fb.blogspot.com +nasacort.1.p2l.info +nascardigitalsap.d2.sc.omtrdc.net +nasdaq.122.2o7.net +nasioc.us.intellitxt.com +nasonex.1.p2l.info +nastydollars.com +naszasa.pl +naszesprawdziany.pl +nata.ero-advertising.com +natashyabaydesign.com +natgeoedit.112.2o7.net +natgeoeditco.112.2o7.net +natgeoeditcom.112.2o7.net +natgeoglobal.112.2o7.net +natgeohomepage.112.2o7.net +natgeonavcom.112.2o7.net +natgeonews.112.2o7.net +natgeongkidsmagccom.112.2o7.net +natgeongmcom.112.2o7.net +natgeopeopleplaces.112.2o7.net +natgeophoto.112.2o7.net +natgeotravelermagcom.112.2o7.net +natgeovideo.112.2o7.net +nathetsof.com +nation.marketo.com +nationalbankofnewzea.tt.omtrdc.net +nationalenquirer.us.intellitxt.com +nationalgeographic.112.2o7.net +nationalissuepanel.com +nationalledger.us.intellitxt.com +nationalpost-com.c.richmetrics.com +nationalpost.112.2o7.net +nationalpost.adperfect.com +nationalsurveypanel.com +nationwide.sc.omtrdc.net +native-staging.sharethrough.com +native.sharethrough.com +native.vindicosuite.com +nativead.tech +nativeads-display.rtb.adx1.com +nativeadsfeed.rtb.ak-is.net +nativecdn.vindicosuite.com +nativeroll.tv +nativesdks.ae1.mparticle.com +nativesdks.eu1.mparticle.com +nativesdks.mparticle.com +nats4.fetishbucks.com +natural.buckeyeenergyforum.com +naturalhealth.us.intellitxt.com +natureworldnews.us.intellitxt.com +naturist-photos.com +natursektparty.com +nauczycielkasex.blogspot.com +naufaldaou.com +naughtyadserve.com +naughtyasiansex.com +naughtyaudrey.com +naughtybdsm.com +nautilus.122.2o7.net +nautilus.d2.sc.omtrdc.net +nautilus.tt.omtrdc.net +navdmp.com +navegador.oi.com.br +navegador.telefonica.com.br +navigator.io +navrcholu.cz +nb-us.wal.co.revdn.net +nb.5.p2l.info +nb.myspace.com +nb.netbreak.com.au +nba.112.2o7.net +nbads.com +nbagametimeprod.112.2o7.net +nbc.adbureau.net +nbc.interpolls.com +nbcnewyork.us.intellitxt.com +nbcots.demdex.net +nbcsports.us.intellitxt.com +nbcu.demdex.net +nbcu.tags.crwdcntrl.net +nbcume.sc.omtrdc.net +nbcuniversal.122.2o7.net +nbcuniversaltv.us.intellitxt.com +nbcustr.netmng.com +nbe-api.optimizely.com +nbimg.dt00.net +nbjmp.com +nbook.far.ru +nbriskerry.com +nbrtrack.com +nc-s.jwpltx.com +nc.5.p2l.info +nc.ru.redtram.com +nc2199.eden5.netclusive.de +ncads.s3.amazonaws.com +ncaudienceexchange.com +nctbonline.co.uk +nctracking.com +nd.5.p2l.info +nd1.gamecopyworld.com +nd11mx1-a-fixed.sancharnet.in +ndash.svc.insnw.net +nddmcconmqsy.ru +ndl1mc1-a-fixed.sancharnet.in +ndl1mx1-a-fixed.sancharnet.in +ndl1pp1-a-fixed.sancharnet.in +ndn-lb-analytics-125540806.us-east-1.elb.amazonaws.com +ndn.cdn.auditude.com +ndparking.com +ne.5.p2l.info +nearbyad.com +nebabrop.com +neber.112.2o7.net +nebnr.112.2o7.net +nebula-cdn.kampyle.com +neccorp.112.2o7.net +neccorp.tt.omtrdc.net +nedstat.com +nedstat.net +nedstat.nl +nedstat.s0.nl +nedstat.tripod.com +nedstatbasic.net +nedstatpro.net +nedstats.xs4all.nl +needadvertising.com +needforfile.net +nefib.tourstogo.us +negadbg.hit.gemius.pl +nei.hitbox.com +neighborlywatch.com +neirong.baidu.com +neki.org +nellyticket.beast-space.com +nelsongod.ca +nend.net +neo.go.sonobi.com +neocounter.neoworx-blog-tools.net +neoffic.com +neogenadro.hit.gemius.pl +neophyte.sandbox53.localytics.com +neopozyczki.pl +neoseeker.us.intellitxt.com +neowin.us.intellitxt.com +neptune.appads.com +neptune1.appads.com +neptune2.appads.com +neptune3.appads.com +ner-de-mi-nis-6.info +nerdorium.org +neref.112.2o7.net +nerez-schodiste-zabradli.com +nero-us.com +nerohut.com +nervoussummer.com +nestorconsulting.net +nestscape.com +net-filter.com +net-radar.com +net-web-techie-software.win +net.softonicads.com +net.vsassets.com +netadclick.com +netads.hotwired.com +netads.sohu.com +netadsrv.iworld.com +netaffiliation.com +netagent.cz +netappinc.tt.omtrdc.net +netclickstats.com +netcomm.spinbox.net +netcommunities.com +netcscape.com +netdirect.nl +netdna.reporo.net +neteco.fr.intellitxt.com +netflix.apple-green.net +netgear.122.2o7.net +nethit-free.nl +netincap.com +netleaders.com +netmag.co.uk +netmng.com +netmoncanaryrdfe.footprintdns.com +netpalnow.com +netpool.netbookia.net +netpromoter.getambassador.com +netrp.112.2o7.net +netscae.com +netsdartboards.122.2o7.net +netseer.com +netshelter.adtrix.com +netshelter.net +netspiderads2.indiatimes.com +netsponsors.com +netsprint.hit.gemius.pl +netsr.softonicads.com +netstorage.taboola.com +nettno.nuggad.net +network-ca.247realmedia.com +network-stg.bazaarvoice.com +network.adsmarket.com +network.advertise.com +network.advplace.com +network.clickconversion.net +network.leadpub.com +network.qualtrics.com +network.realmedia.com +network.realtechnetwork.net +network2admin.247realmedia.com +network3reporting.247realmedia.com +network4admin.247realmedia.com +networkad.net +networkadmin.247realmedia.com +networkads.net +networkmedical.com.hk +networksolutions.112.2o7.net +networkstats.advidi.com +netzeitu.ivwbox.de +netzmarkt.ivwbox.de +neudesicmediagroup.com +neumashop.cl +never.ovh +nevergreen.net +new-address.tk +new-ads.eurogamer.net +new-bannertest.adtech.de +new-dating-2012.info +new-iq.adtech.de +new-iq.adtechus.com +new-vid-zone-1.blogspot.com.au +new-www.outbrain.com +new.api.ad.xiaomi.com +new.browsermine.com +new.cetrk.com +new.chokertraffic.com +new.datamark.net +new.fqtag.com +new.minr.pw +new.panadvert.com +new.smartcontext.pl +newads.bangbros.com +newads.cmpnet.com +newadserver.interfree.it +newalways.easyfetmoredonefasterbysubmiting.download +newapp1.graphly.io +newarena.netmng.com +newark01.monero.hashvault.pro +newbie.com +newbritmoneymethod.com +newbrowse.livehelper.com +newbs.hutz.co.il +newcarnet.uk.intellitxt.com +newclick.com +newclicks.appsflyer.com +newclk.com +newcom.122.2o7.net +newcracks.net +neweed.org +neweggstats.com +neweratickets61-t.neolane.net +newip427.changeip.net +newjobs.d1.sc.omtrdc.net +newjunk4u.com +newlaunches.uk.intellitxt.com +newlimitedoffer.com +newliveupdate.thereadycentercontentingplacefree.download +newlook.112.2o7.net +newmediaz.com +newnet.qsrch.com +newnudecash.com +newopenx.detik.com +newpassporn.com +newrelic.com +newrevive.detik.com +news-finances.com +news.adviserplus.com +news.de.intellitxt.com +news.iadsdk.apple.com +news.msnbc.us.intellitxt.com +news.nero-emea.com +news.nero-us.com +news.yext.com +news4cars.com +news6health.com +newsblock.marketgid.com +newscgp.com +newsclic.ivwbox.de +newsday.122.2o7.net +newsinteractive.112.2o7.net +newsinternational.122.2o7.net +newsite.instartlogic.com +newsite.yieldmo.com +newsletter.adsonar.com +newsletter.adsttc.com +newsletter.marketing365.mk +newsletters.panadvert.com +newsnetw.oewabox.at +newsok.112.2o7.net +newsoxy.us.intellitxt.com +newsprofin.com +newsquestdigitalmedia.122.2o7.net +newsreport.com-alerts.info +newsroom-help.taboola.com +newsroomhelp.taboola.com +newssourceoftoday.com +newstarads.com +newsterminalvelocity.com +newstimeslivecom.112.2o7.net +newstoob.us.intellitxt.com +newsupport.dynamicyield.com +newsweek.theappgrader.com +newsy-ben24.ml +newt1.adultadworld.com +newt1.adultworld.com +newtest4pc.thebiggestandmoststableforcontenteclear.review +newtger.info +newtips.co +newtopsites.com +newversionupdate.space4update.pw +newversionupdate.space4updating.win +newwayscanner.info +newyork.cbslocal.us.intellitxt.com +newyorkandcompany.112.2o7.net +newyorkmagazine.112.2o7.net +nexage.com +nexage.mads.advertising.com +nexioniect.com +nexium.1.p2l.info +next-azure-ext.newrelic.com +nextbdom.ru +nextbestgame.org +nextel-ringtone.komi.su +nextel-ringtone.spb.su +nextgenstats.com +nextlnk2.com +nextoptim.com +nextround.us.intellitxt.com +nexttime.ovh +nexttrk.com +nexus-testing.intercom.io +nexus-websocket-a.intercom.io +nexus-websocket-b.intercom.io +nexus.ensighten.com +nexus.exacttarget.com +nexus.intercom.io +nexus.officeapps.live.com +nexus.svc.insnw.net +nexusrules.officeapps.live.com +nexys404.us.intellitxt.com +neymar.alphonso.tv +neyscape.com +nf.5.p2l.info +nfl.demdex.net +nfl.sp1.convertro.com +nfwebminer.com +ng.virgul.com +ng3.ads.warnerbros.com +ngacm.com +ngads.go.com +ngads.smartage.com +ngastatic.com +ngd.thesun.co.uk +ngdp-staging.flurry.com +nginx-ad-stacka-1467818758.us-east-1.elb.amazonaws.com +nginx-auction-prd.ads.internal.unity3d.com +nginx.prod.us-east-1.gcs.kargo.com +ngw-static.franklyinc.com +nh.5.p2l.info +nhl.112.2o7.net +nht-2.extreme-dm.com +nht-3.extreme-dm.com +nicappazaza.com +nickde.oewabox.at +nickleplatedads.com +nielsen.112.2o7.net +niematego.tk +nihoncar.us.intellitxt.com +nihonkogakuin.122.2o7.net +nike.112.2o7.net +nikefootball.112.2o7.net +nikefootballglobal.112.2o7.net +nikegoddess.112.2o7.net +nikehome.112.2o7.net +nikeplus.112.2o7.net +nikerunning.112.2o7.net +nikerunningglobal.112.2o7.net +nikitinskysport.ru +nikkei.112.2o7.net +nikkei.d1.sc.omtrdc.net +nikonjp.112.2o7.net +nimiq.watch +nimiqpool.com +nimiqtest.net +nimoc.com +nimp.org +ninemsn.imrworldwide.com +ninfetasvideosporno.com +ningessaybe.me +ningtoldrop.ru +ninja-red.com +ninja.onap.io +ninjaa.info +ninjadude.us.intellitxt.com +ninjaweb.info +ninjawebproxy.com +nip-nip.com +nippel.at +nipple-sex.com +nippon-bearings.ru +nipponairline.com +nir.regmedia.co.uk +niroo.info +nisikai.com +nisssan.de +niteflirt.directtrack.com +nitratory.com +nitroclicks.com +nitropayouts.directtrack.com +nitrous.exitfuel.com +nitrous.internetfuel.com +nitsche.top +niunie.info +niunie.qii.pl +niuxian.com +nivendas.net +nix-admin.ru +nixrox.com +niyiijaola.com +nj-com.c.richmetrics.com +nj.5.p2l.info +nj1.yext.com +njadxrtb.lfstmedia.com +njkmznnb.ru +njmvc.112.2o7.net +njtgsd.attackthethrone.com +nkcache.brandreachsys.com +nkgamers.com +nkxdyorwbt.com +nl-moneyou.netmining.com +nl-saab.netmining.com +nl.ads.justpremium.com +nl.adserver.yahoo.com +nl.cookiescript.info +nl.cqcounter.com +nl.eu.criteo.com +nl.eu.criteo.net +nl.mediaplayercodecpack.com +nl.nedstatbasic.net +nl.nedstatpro.net +nl.netlog.com +nl1.ero-advertising.com +nl1.monerise.com +nl2.ero-advertising.com +nl4.hit.stat24.com +nlbanner.nl +nlconsulateorlandoorg.siteprotect.net +nlfjjunb5.ru +nm.5.p2l.info +nm.contextweb.com +nmanchorage.112.2o7.net +nmapquest.com +nmbakersfieldca.112.2o7.net +nmbeaufort.112.2o7.net +nmbelleville.112.2o7.net +nmbradenton.112.2o7.net +nmbrampton.112.2o7.net +nmcharlotte.112.2o7.net +nmcolumbia.112.2o7.net +nmcommancomedia.112.2o7.net +nmcomnancomedia.112.2o7.net +nmeprod.122.2o7.net +nmfortworth.112.2o7.net +nmfresno.112.2o7.net +nmhiltonhead.112.2o7.net +nmkansascity.112.2o7.net +nmkawartha.112.2o7.net +nmlexington.112.2o7.net +nmmclatchy.112.2o7.net +nmmerced.112.2o7.net +nmmiami.112.2o7.net +nmminneapolis.112.2o7.net +nmmississauga.112.2o7.net +nmmodesto.112.2o7.net +nmnandomedia.112.2o7.net +nmraleigh.112.2o7.net +nmrockhill.112.2o7.net +nmsacramento.112.2o7.net +nmsanluisobispo.112.2o7.net +nmsbaseball.com +nmstatecollege.112.2o7.net +nmtacoma.112.2o7.net +nmthatsracin.112.2o7.net +nmtoronto.112.2o7.net +nmtricity.112.2o7.net +nmyork.112.2o7.net +nn.advertising.com +nn8g.adj.st +nners.ero-advertising.com +no-rx.info +no.2.cqcounter.com +no.adserver.yahoo.com +no.counter.mtgnewmedia.se +no1.unternehemen.com +no1proxy.info +no3.unternehmen.org +noah.reddion.com +nobases.net +nobelesse.com +noblock.pro +noblockme.info +nobody.kr +nobodyspeakstruth.narod.ru +nobrain.dk +noc-request.hitbox.com +noc.hitbox.com +nocboard.hitbox.com +noclegonline.info +nocreditcardsporn.com +nocreepware.com +noctoo.com +node-express-ssl-lb.global.prod1.sharethis.net +node-ssl-lb.global.prod1.sharethis.net +node.cfcdist.gdn +node.coin-hive.com +node.pixel.optimalq.net +node.viaxmr.com +nodes.viaxmr.com +nodevice.uk.intellitxt.com +nodup.ru +nodvmmtniokbz.bid +noemail.uklinux.net +noen.oewabox.at +nofeiaviv.viewbix.com +nofreezingmac.click +nofreezingmac.space +nofreezingmac.work +noham.com +noiselessplough.com +noithatchauau.vn +nojobby.com +nojsstats.appspot.com +nol.website +nol.yahoo.com +noleggioautopadova.it +nolllluma.com +non-nude-video.com +non-nude.info +nondescriptcrowd.com +nondescriptsmile.com +nondescriptstocking.com +none.nu +nonews.co +nonotv.net +nonprod.flurry.com +nonsi.csheaven.com +nonstopvideos.pl +noob.zerx.la +noobgirls.com +noordlabcenter.com +nootrino.com +nordeea.fi +nordette.1.p2l.info +nordette.3.p2l.info +nordette.4.p2l.info +nordiccountry.cz +nordiwellness.se +nordsee-ferienwohnungen-blog.de +nordstar.pro +nordstrorms.com +noredirecto.redirectme.net +norespar.ru +normalegal.ru +normour.com +normygvd.bid +noroadblock.com +nortelcom.112.2o7.net +northendtrains.com +northernleasing.bz +northjersey.112.2o7.net +northwestairlines.112.2o7.net +norton-antivirus-trial.searchservice.info +norton.pl +nortonfire.co.uk +nosexe.com +nospartenaires.com +nossl.aafp.org +notaria-desalas.com +notebook-batteries.ca +notebook-memory.searchservice.info +notebook-pro.ru +notebookservisru.161.com1.ru +noteupgrade.themainplacesetnowforcontentsgo.win +notfastfood.ru +nothing-but-value.com +noticias.life +noticiasftpsrv.com +notification-browser.com +notification-browser.tools +notification-system.tools +notifications-online.systems +notify.1p.bugsnag.appstore.a2z.com +notify.aca.bugsnag.appstore.a2z.com +notify.bugsnag.appstore.a2z.com +notify.firetv.bugsnag.appstore.a2z.com +notify.nuviad.com +notify1.brucelead.com +notifyday.com +notori.oewabox.at +notrack.vindicosuite.com +notrecommended.co.uk +nourteenthp.angelcities.com +nova.collect.igodigital.com +novafinanza.com +novaminers.tk +novastarled.com +novell.112.2o7.net +novellcom.112.2o7.net +novem.onet.pl +novem.pl +novemberrainx.com +noveslovo.com +novumedical.pl +now.eloqua.com +nowaupadlosc.pl +nowcheck.seethisamazinguogradeswinmacawesome.win +nowgetsoft.pushingnewforcontentsafeload.download +nowina.info +nowinstallupgrade.clickforultimateandbest2updatingpc.top +nowinstallupgrade.goodcentralupdatesall.bid +nowruzbakher.com +nowtestpc.updatenewfresh4u.top +np.adproxy.ndmdhs.com +np.lexity.com +npcdn1.now.sh +npdaqy6x1j.me +npm.districtm.ca +nps1.getsitecontrol.com +npttech.com +nqm.blackcurranthumidifiers.site +nqs.nice264.com +nr.taboola.com +nrads.1host.co.il +nrb.footprintdns.com +nrd.adsttc.com +nrg.checkm8.com +nrgdigital.checkm8.com +nri.cdn.automatad.com +nrk.tns-cs.net +nrkno.linkpulse.com +nrs.wbinsights.com +nryb.com +ns-cdn.neustar.biz +ns-vip1.hitbox.com +ns-vip2.hitbox.com +ns-vip3.hitbox.com +ns.5.p2l.info +ns.cac.com.cn +ns.huawei.com.cn +ns.hws.ru +ns.leadback.ace.advertising.com.adcom.akadns.net +ns.nint.ac.cn +ns.zdbb.net +ns0.freecontent.com +ns1.123go.net +ns1.2911.net +ns1.freecontent.com +ns1.hitbox.com +ns1.lalibco.com +ns1.multi.net.pk +ns1.mutuza.win +ns1.ntkrnlpa.info +ns1.oix.com +ns1.oix.net +ns1.openinternetexchange.com +ns1.phorm.com +ns1.primeinteractive.net +ns1.stripcdn.com +ns1.the-sinner.net +ns1.updatesdns.org +ns1.vicp.net +ns1.webwise.com +ns1.webwise.net +ns1.webwise.org +ns1p.net +ns2.cryptosearch.site +ns2.cryptotab.net +ns2.freecontent.com +ns2.hitbox.com +ns2.lalibco.com +ns2.mutuza.win +ns2.ntkrnlpa.info +ns2.oix.com +ns2.oix.net +ns2.openinternetexchange.com +ns2.phorm.com +ns2.primeinteractive.net +ns2.rosprint.ru +ns2.stripcdn.com +ns2.vicp.net +ns2.w3open.com +ns2.webwise.com +ns2.webwise.net +ns2.webwise.org +ns2.xidian.edu.cn +ns2.youcanoptout.com +ns3.ishosting.net +ns3.openinternetexchange.com +ns3.stripcdn.com +ns4.stripcdn.com +nsads.hotwired.com +nsads.sv.publicus.com +nsads.us.publicus.com +nsads4.us.publicus.com +nsandru.test.backtrace.io +nsandru1.test.backtrace.io +nsandru2.test.backtrace.io +nsandru3.test.backtrace.io +nsclick.baidu.com +nsdldlese.112.2o7.net +nsis.bisrv.com +nsm.dell.com +nsof-web.dynamicyield.com +nspmotion.com +nsrecord.org +nst.broadcast.pm +nstat.tudou.com +nt-associates.com +nt-es.imrworldwide.com +nt.criteo.com +nt.extole.io +nt.jp.as.criteo.com +nt.ny.us.criteo.com +nt.sv.us.criteo.com +ntas6.ads.scanapps.com +ntbanner.digitalriver.com +ntcompatible.us.intellitxt.com +ntellicast.com +ntkrnlpa.info +ntlligent.info +ntracking.optimatic.com +nttcommunications.122.2o7.net +ntv.io +ntv.ivwbox.de +ntvk1.ru +ntweb.org +nu7.pl +nubolabs.com +nucia.biz.ly +nucleus.adrizer.com +nude-adults.nu +nude-asian.nu +nude-asians.nu +nude-boys.nu +nude-celebs-galleries.com +nude-erotica.nu +nude-females.com +nude-girlfriends.org +nude-girls.nu +nude-imps.biz +nude-links.de +nude-models.nu +nude-nudes.nu +nude-photography.biz +nude-photos.nu +nude-pics.nu +nude-picture-network.com +nude-pictures.nu +nude-porno.nu +nude-pussy.net +nude-teen-ass-pics.com +nude-teen.nu +nude-teens-porn.com +nude-teens-pussy-naked-models-sex.com +nude-teens.nu +nude-teenworld.de +nude-webcams.com +nude-wife.com +nude-woman.nu +nude.screensaver.sms13.de +nudebeachgalleries.net +nufindings.info +nugenix.co +nuggad.net +nuggad.nuggad.net +nugly.barginginfrance.net +nuit-artisanale.com +nuker.com +nulik.net +nulledstore.com +nullrefexcep.com +numax.nu-1.com +number44.net +nunu-001.now.sh +nuptialimages.com +nuseek.com +nutabuse.com +nutnet.ir +nuttyorganization.com +nuwerk.monsterboard.nl +nv.5.p2l.info +nw-ads.gslb.ace.advertising.com +nx-adv0005.247realmedia.com +nx.frosmo.com +nxs.kidcolez.cn +nxtck.com +nxtscrn.adbureau.net +ny.5.p2l.info +ny.us.criteo.com +ny.us.criteo.net +ny5expe.fwmrm.net +ny7f6goy.bid +nyads.ny.publicus.com +nyandcompany.com.ssl.sc.omtrdc.net +nyctrk.com +nydailynews.d1.sc.omtrdc.net +nym1-ib.adnxs.com +nym1.b.adnxs.com +nym1.ib.adnxs.com +nymphodolls.com +nymphofuck.com +nysubwayoffer.com +nysun.com.112.2o7.net +nytadvertising.nytimes.com +nytbglobe.112.2o7.net +nytglobe.112.2o7.net +nythglobe.112.2o7.net +nytimesglobal.112.2o7.net +nytimesnonsampled.112.2o7.net +nytimesnoonsampled.112.2o7.net +nytmembercenter.112.2o7.net +nytrflorence.112.2o7.net +nytrgadsden.112.2o7.net +nytrgainesville.112.2o7.net +nytrgainseville.112.2o7.net +nytrhendersonville.112.2o7.net +nytrhouma.112.2o7.net +nytrlakeland.112.2o7.net +nytrlexington.112.2o7.net +nytrocala.112.2o7.net +nytrsantarosa.112.2o7.net +nytrsarasota.112.2o7.net +nytrthibodaux.112.2o7.net +nytrtuscaloosa.112.2o7.net +nytrwilmington.112.2o7.net +nytrwinterhaven.112.2o7.net +nytrworcester.112.2o7.net +nyttechnology.112.2o7.net +nz-cdn.effectivemeasure.net +nz-ssl.effectivemeasure.net +nz.2.cqcounter.com +nz.adserver.yahoo.com +nzaza.com +nzelcorporation.com +nzfilecloud.weebly.com +nzssjqjv.bid +nztv.prod.untd.com +nzz.d3.sc.omtrdc.net +nzz.wemfbox.ch +o-2-s-f.win +o-cv.com +o-dachnik.ru +o-oe.com +o.addthis.com +o.adgear.com +o.admob.com +o.agentanalytics.com +o.analytics.yahoo.com +o.bluewin.ch +o.detik.com +o.dev.criteo.com +o.fandango.com +o.ibg.bg +o.ibotta.com +o.opentable.com +o.sa.aol.com +o.staging.criteo.com +o.webmd.com +o.webmd.com.ssl.d2.sc.omtrdc.net +o.zeroredirect.com +o0.winfuture.de +o0bc.com +o1.inviziads.com +o1.qnsr.com +o2.eyereturn.com +o2.hit.gemius.pl +o2adpl.hit.gemius.pl +o333o.com +o365.foresee.com +o8.aus.cc +oacentral.cepro.com +oads.cracked.com +oakda.com +oakleyglassesonline.us +oakridgemo.com +oakso.tourstogo.us +oakwood.mobile.home.inc.sms13.de +oakwoodparkassociation.com +oampa.csheaven.com +oamsrhads.us.publicus.com +oamtrk.com +oao-d.openx.net +oapsa.tourstogo.us +oas-1.rmuk.co.uk +oas-central.east.realmedia.com +oas-central.realmedia.com +oas-eu-admin.247realmedia.com +oas-eu.247realmedia.com +oas-fr.video.on.nytimes.com +oas.247sports.com +oas.ad-vice.biz +oas.adservingml.com +oas.adx.nu +oas.aurasports.com +oas.autotrader.co.uk +oas.benchmark.fr +oas.dallasnews.com +oas.deejay.it +oas.dispatch.com +oas.dn.se +oas.five.tv +oas.foxnews.com +oas.greensboro.com +oas.guardian.co.uk +oas.heise.de +oas.hitbox.com +oas.ibnlive.com +oas.ilsecoloxix.it +oas.lee.net +oas.maktoobblog.com +oas.monster.com +oas.northernandshell.co.uk +oas.nrjlink.fr +oas.nzz.ch +oas.offremedia.com +oas.populisengage.com +oas.portland.com +oas.providencejournal.com +oas.publicitas.ch +oas.rcsadv.it +oas.repubblica.it +oas.rivals.com +oas.roanoke.com +oas.salon.com +oas.sciencemag.org +oas.signonsandiego.com +oas.startribune.com +oas.stv.tv +oas.tidningsnatet.se +oas.toronto.com +oas.trustnet.com +oas.uniontrib.com +oas.villagevoice.com +oas.vtsgonline.com +oasads.whitepages.com +oasc-es1.247realmedia.com +oasc-eu1.247realmedia.com +oasc-eu1b.247realmedia.com +oasc-eu1c.247realmedia.com +oasc-training7.247realmedia.com +oasc02.247realmedia.com +oasc02014.247realmedia.com +oasc02023.247realmedia.com +oasc03.247realmedia.com +oasc03012.247realmedia.com +oasc03049.247realmedia.com +oasc04.247.realmedia.com +oasc04012.247realmedia.com +oasc04052.247realmedia.com +oasc05.247realmedia.com +oasc05024.247realmedia.com +oasc05050.247realmedia.com +oasc05134.247realmedia.com +oasc05135.247realmedia.com +oasc05139.247realmedia.com +oasc06.247realmedia.com +oasc06006.247realmedia.com +oasc06020.247realmedia.com +oasc07.247realmedia.com +oasc08.247realmedia.com +oasc08006.247realmedia.com +oasc08008.247realmedia.com +oasc08011.247realmedia.com +oasc08024.247realmedia.com +oasc09.247realmedia.com +oasc10.247realmedia.com +oasc10015.247realmedia.com +oasc11.247realmedia.com +oasc11009.247realmedia.com +oasc12.247realmedia.com +oasc12001.247realmedia.com +oasc12016.247realmedia.com +oasc12056.247realmedia.com +oasc14.247realmedia.com +oasc14008.247realmedia.com +oasc15.247realmedia.com +oasc16.247realmedia.com +oasc17.247realmedia.com +oasc17m.247realmedia.com +oasc17w.247realmedia.com +oasc17y.247realmedia.com +oasc18.247realmedia.com +oasc18005.247realmedia.com +oasc18033.247realmedia.com +oasc18065.247realmedia.com +oasc18d.247realmedia.com +oasc18f.247realmedia.com +oasc18u.247realmedia.com +oasc18w.247realmedia.com +oasc18x.247realmedia.com +oasc18y.247realmedia.com +oascenral.phoenixnewtimes.com +oascentral.123greetings.com +oascentral.abclocal.go.com +oascentral.adage.com +oascentral.adageglobal.com +oascentral.aeroplan.com +oascentral.aircanada.com +oascentral.alanicnewsnet.ca +oascentral.alanticnewsnet.ca +oascentral.americanheritage.com +oascentral.arkansasonline.com +oascentral.artistdirect.com +oascentral.artistirect.com +oascentral.askmen.com +oascentral.autoweek.com +oascentral.aviationnow.com +oascentral.beliefnet.com +oascentral.bigfishgames.com +oascentral.blackenterprise.com +oascentral.blackenterprises.com +oascentral.blogher.org +oascentral.bostonherald.com +oascentral.bostonphoenix.com +oascentral.bristolpress.com +oascentral.broadway.com +oascentral.browardpalmbeach.com +oascentral.businessinsider.com +oascentral.businessinsurance.com +oascentral.businessweek.com +oascentral.businessweeks.com +oascentral.buy.com +oascentral.buysell.com +oascentral.canadaeast.com +oascentral.canadianliving.com +oascentral.capecodonline.com +oascentral.careerbuilder.com +oascentral.charleston.net +oascentral.chicagobusiness.com +oascentral.chron.com +oascentral.citypages.com +oascentral.citypaper.com +oascentral.clearchannel.com +oascentral.comcast.net +oascentral.comics.com +oascentral.construction.com +oascentral.consumerreports.org +oascentral.covers.com +oascentral.crainsdetroit.com +oascentral.crainsnewyork.com +oascentral.crimelibrary.com +oascentral.cybereps.com +oascentral.cygnusb2b.com +oascentral.dailybreeze.com +oascentral.dailyherald.com +oascentral.dailylocal.com +oascentral.datasphere.com +oascentral.dilbert.com +oascentral.discovery.com +oascentral.dollargeneral.com +oascentral.dominionenterprises.com +oascentral.drphil.com +oascentral.eastbayexpress.com +oascentral.emarketer.com +oascentral.emedicine.com +oascentral.encyclopedia.com +oascentral.escapistmagazine.com +oascentral.fashionmagazine.com +oascentral.fayettevillenc.com +oascentral.feedroom.com +oascentral.fiercemarkets.com +oascentral.forsythnews.com +oascentral.fortunecity.com +oascentral.fosters.com +oascentral.foxnews.com +oascentral.freedom.com +oascentral.g4techtv.com +oascentral.ggl.com +oascentral.gigex.com +oascentral.globalpost.com +oascentral.goerie.com +oascentral.gotriad.com +oascentral.grandparents.com +oascentral.greenevillesun.com +oascentral.hamptonroads.com +oascentral.hamptoroads.com +oascentral.hamtoroads.com +oascentral.healthletter.mayoclinic.com +oascentral.herald-dispatch.com +oascentral.herenb.com +oascentral.hispanicbusiness.com +oascentral.hitfix.com +oascentral.hollywood.com +oascentral.hosted.ap.org +oascentral.houstonpress.com +oascentral.inq7.net +oascentral.internetretailer.com +oascentral.investingmediasolutions.com +oascentral.investmentnews.com +oascentral.investors.com +oascentral.investorwords.com +oascentral.itbusiness.ca +oascentral.katv.com +oascentral.killsometime.com +oascentral.laptopmag.com +oascentral.law.com +oascentral.laweekly.com +oascentral.lifetimetv.com +oascentral.looksmart.com +oascentral.lycos.com +oascentral.mailtribune.com +oascentral.mayoclinic.com +oascentral.medbroadcast.com +oascentral.metro.us +oascentral.metrowestdailynews.com +oascentral.miaminewtimes.com +oascentral.minnpost.com +oascentral.mochila.com +oascentral.modernhealthcare.com +oascentral.motherjones.com +oascentral.movietickets.com +oascentral.nationalunderwriter.com +oascentral.necn.com +oascentral.nephrologynews.com +oascentral.nerve.com +oascentral.netnewscheck.com +oascentral.news-record.com +oascentral.newsmax.com +oascentral.newstimeslive.com +oascentral.nowtoronto.com +oascentral.onthesnow.com +oascentral.onwisconsin.com +oascentral.oprah.com +oascentral.phoenixnewtimes.com +oascentral.phoenixvillenews.com +oascentral.pitch.com +oascentral.planetatv.com +oascentral.poconorecord.com +oascentral.politico.com +oascentral.post-gazette.com +oascentral.pottsmerc.com +oascentral.pressdemocrat.com +oascentral.princetonreview.com +oascentral.prodivnet.com +oascentral.publicradio.org +oascentral.radaronline.com +oascentral.rcrnews.com +oascentral.record-eagle.com +oascentral.recordnet.com +oascentral.recordonline.com +oascentral.recroom.com +oascentral.recyclebank.com +oascentral.red7media.com +oascentral.redherring.com +oascentral.redorbit.com +oascentral.redstate.com +oascentral.reference.com +oascentral.regalinterative.com +oascentral.register.com +oascentral.registerguard.com +oascentral.registguard.com +oascentral.riverfronttimes.com +oascentral.s-t.com +oascentral.sacurrent.com +oascentral.salemweb.net +oascentral.salon.com +oascentral.samsclub.com +oascentral.santacruzsentinel.com +oascentral.sciam.com +oascentral.scientificamerican.com +oascentral.seacoastonline.com +oascentral.seattleweekly.com +oascentral.sfgate.com +oascentral.sfweekly.com +oascentral.sina.com +oascentral.sina.com.hk +oascentral.southjerseylocalnews.com +oascentral.sparknotes.com +oascentral.spineuniverse.com +oascentral.sportsfanlive.com +oascentral.sptimes.com +oascentral.stackmag.com +oascentral.stansberryresearch.com +oascentral.starbulletin.com +oascentral.stripes.com +oascentral.suntimes.com +oascentral.superpages.com +oascentral.surfline.com +oascentral.thechronicleherald.ca +oascentral.thehockeynews.com +oascentral.thenation.com +oascentral.theonion.com +oascentral.theonionavclub.com +oascentral.thephoenix.com +oascentral.thepostgame.com +oascentral.thesmokinggun.com +oascentral.thespark.com +oascentral.theweek.com +oascentral.timesfreepress.com +oascentral.tmcnet.com +oascentral.tnr.com +oascentral.tophosts.com +oascentral.tourismvancouver.com +oascentral.townhall.com +oascentral.traffic.com +oascentral.travelzoo.com +oascentral.trentonian.com +oascentral.tribe.net +oascentral.trutv.com +oascentral.tvnewscheck.com +oascentral.upi.com +oascentral.urbanspoon.com +oascentral.videodome.com +oascentral.villagevoice.com +oascentral.virtualtourist.com +oascentral.walmartwom.com +oascentral.warcry.com +oascentral.washtimes.com +oascentral.wciv.com +oascentral.westword.com +oascentral.where.ca +oascentral.wickedlocal.com +oascentral.wjla.com +oascentral.wkrn.com +oascentral.wwe.com +oascentral.xfinity.com +oascentral.yakimaherald.com +oascentral.yellowpages.com +oascentral.ywlloewpages.ca +oascentral.zwire.com +oascentralnx.comcast.net +oascentreal.adcritic.com +oascetral.laweekly.com +oasis.411affiliates.ca +oasis.nysun.com +oasis.promon.cz +oasis.realbeer.com +oasis.zmh.zope.com +oasis.zmh.zope.net +oasis2.advfn.com +oasjs.kataweb.it +oasn-en1.247realmedia.com +oasn03.247realmedia.com +oasn04.247realmedia.com +oasroanoke.com +oasrtx-eu.247realmedia.com +oasrtx.247realmedia.com +oassis.zmh.zope.com +oata.ero-advertising.com +oawoo.frenchgerlemanelectric.com +obada-konstruktiwa.org +oballergiya.ru +obentobelfast.com +obenunten.de +oberonincredig.112.2o7.net +oberoniplay.112.2o7.net +obeus.com +obeyter.com +obi.addesk.advertising.com +obi.adportal.advertising.com +obi.dev.advertising.com +obi.qat.addesk.advertising.com +objects.abcvisiteurs.com +objects.designbloxlive.com +objects.tremormedia.com +objeto.com +obkom.net.ua +obkzrcclean2.az.pl +obnal.org +obozua.adocean.pl +obs.nnm2.ru +obscene.nu +obscene42.com +obscenesidewalk.com +obsedee.com +observantice.com +observare.de +observer.advertserve.com +observium.prd.fyber.com +obuv-kupit.ru +obyz.de +obzession.com +oc.monerise.com +ocdn.adsterra.com +ocean.cryptaloot.pro +ocean.cryptoloot.pro +ocean.directprimal.com +ocean.webmine.pro +ocean2.authcaptcha.com +ocean2.directprimal.com +oceaneyes.net +oceania.es +oceanicart.net +oceanshort.com +oceanup.us.intellitxt.com +ochistka-stokov.ru +ocick.frost-electric-supply.com +ocio365.com +oclasrv.com +oconto.ru +ocp.bnet.com +ocp.cbsnews.com +ocpersian.com +ocruzeiro.com +ocs.websponsors.com +ocse.it +ocslab.com +octools.us.intellitxt.com +octopusgirl.com +ocworkbench.us.intellitxt.com +ocxxx.com +oda.as +odaroc.ru +odat.info +odb.outbrain.com +odbierz-paysafecard.ujm.pl +odbierzdarmowedoladowanie.wordpress.com +odc.cb.qa-dest.imprev.net +odc.marketing.qa-dest.imprev.net +odc.mc1.qa-dest.imprev.net +odc.prudential.qa-dest.imprev.net +odc.qa-dest.imprev.net +odc.remax.qa-dest.imprev.net +odc.rg1.qa-dest.imprev.net +odc.rg2.qa-dest.imprev.net +odc.rlp.qa-dest.imprev.net +odc.rw.qa-dest.imprev.net +odc.starwave.com +odchudzaniezpasja.pl +oddamzadarmo.eu +oddbanner.bet-at-home.com +oddogg.com +odds.optimizely.com +oddswhiz.com +odesproperty.com +odessa.com.pl +odessa.metaps.com +odkryjfb.pl +odliczamy.net +odontix.com +odowugego.easyfreehosting.com +odpicujfure.pl +odpowiedzialni-rodzice.pl +odr.mookie1.com +odywpjtw.bloger.index.hr +odzb5nkp.com +odzyskajsnapy.blogspot.com +oe24.oewabox.at +oeamtc.oewabox.at +oecnhs.info +oedet.com +oei1.gq +oeinerge.pt +oem.inmobi.com +oewa.at +oewa.oewabox.at +of.inviziads.com +ofc.com.pe +oferta4you.com.pl +ofertadomes.com +ofertasdi.sslblindado.com +ofertasdi5.sslblindado.com +ofertassa.sslblindado.com +oferte.pl +ofertehlc.theappgrader.com +oferty-online.com +off.free-lyrics-online.com +offcnt.intuit.com +offer-mediaservices.download +offer-pills.ru +offer-today.com +offer.alibaba.com +offer.camp +offer.fyber.com +offerfactory.click +offerforge.com +offermatica.com +offermeet.com +offerreality.com +offers-dev.svc.kargo.com +offers-testing.svc.kargo.com +offers.affiliatetraction.com +offers.bycontext.com +offers.impower.com +offers.nordvpn.com +offers.royalvegascasino.com +offers.yext.com +offerscience.go2jump.org +offersquest.directtrack.com +offertrakking.info +offertunity.click +offerx.co.uk +offerzone.click +offf.info +office-365.life +office-sex.biz +office-windows.ru +office.ad1.ru +office.analyticson.com +office.imprev.net +office.maxpoint.com +office.officenet.co.kr +office.yext.com +office.zemanta.com +officebusinesspark.com +officecolor.com +officeon.ch.ma +officer.us.intellitxt.com +officewebapps.foresee.com +officialbroncosfootball.com +offlinehbpl.hbpl.co.uk +offre-de-credit.com +ofni.al0ne.info +ofw-client-cdn.fyber.com +ogdp-staging.flurry.com +ogladaj.online +ogladamy24.pl +oglasnikadhr.hit.gemius.pl +ogondkskyahxa.ru +ogrid.org +ogulzxfxrmow.com +ogury.mgr.consensu.org +oh.5.p2l.info +ohgizmo.us.intellitxt.com +ohiomm.com +ohmydating.com +ohtulehtadee.hit.gemius.pl +oi.webnavegador.com.br +oidiscover.com +oik.mactechinfo.info +oilwrestlingeurope.com +oimg.nbcuni.com +oimsgad.qq.com +oinadserve.com +oinkinns.tk +oix-rubyem.net +oix-rubytest.net +oix-stage.net +oix.com +oix.net +oix.phorm.com +oix0.net +oix1.net +oix2.net +oix3.net +oix4.net +oix5.net +oix6.net +oix7.net +oix8.net +oix9.net +oixchina.com +oixcrv-lab.net +oixcrv-rubyem.net +oixcrv-rubytest.net +oixcrv-stage.net +oixcrv.net +oixpre-stage.net +oixpre.net +oixssp-lab.net +oixssp-rubyem.net +oixssp.net +oj.likewut.net +ojolink.fr +ojtobu.angelcities.com +ok.5.p2l.info +ok.internetmedia.si +ok.uk.intellitxt.com +okaleczenie15laatkii.blogspot.com +okaleczon15-lattka.blogspot.com +okaleczona15--latka.blogspot.com +okaleczona15-llatka.blogspot.com +okcounter.com +okeanbg.com +okel.co +okexysylgzo.ru +okeyletsgo.ml +oklahomadepartmentofcommerce.112.2o7.net +okmagazine.us.intellitxt.com +oknarai.ru +ol.at.atwola.com +ol.jp.at.atwola.com +ol.uk.at.atwola.com +old-darkroast.adknowledge.com +old.advidi.com +old.browsermine.com +oldgames.zp.ua +oldui.adswizz.com +oleg.adx1.com +olivebrandresponse.com +ollando.com +olqdh.top +olx.hit.gemius.pl +olxro-d.openx.net +om-dev.flurry.com +om.api.ispot.tv +om.blockbuster.com +om.businessweek.com +om.cbsi.com +om.cnet.co.uk +om.craftsman.com +om.dowjoneson.com +om.elvenar.com +om.expedia.com +om.lonelyplanet.com +om.metacrawler.com +om.neimanmarcus.com +om.nuggad.net +om.onlineshoes.com +om.rogersmedia.com +om.sfgate.com +om.symantec.com +om.truecar.com +om.webcrawler.com +oma.xt5.de +omanko1.com +omasex-porno.nl +omega.od.ua +ometrics.netapp.com +ometrics.warnerbros.com +omine.org +omn.crackle.com +omn.sonypictures.com +omni.basspro.com +omni.canadiantire.ca +omni.cash.ch +omni.csc.com +omni.dispatch.com +omni.focus.de +omni.sportingnews.com +omnicleaningservices.com +omnikool.discovery.com +omniproject.net +omniscbt.112.2o7.net +omniscientspark.com +omnitagjs.com +omniture.112.2o7.net +omniture.artinstitutes.edu +omniture.chip.de +omniture.com +omniture.secure.miisolutions.net +omniture.shopstyle.com +omniture.stuff.co.nz +omniture.theglobeandmail.com +omniturebanners.112.2o7.net +omniturecom.112.2o7.net +omnitureglobal.112.2o7.net +omnituretrack.local.com +omosessuali.net +omrdatacapture.com +oms.com.np +oms.nuggad.net +omsego.com +omsimplex.com +omsk.xrus.org +omt.honda.com +omtrdc.net +omvisidtest1.112.2o7.net +on.5.p2l.info +on.agkn.com +on.animeteatr.ru +on.exacttarget.com +on.nimp.org +on.qa.exacttarget.com +on.test.exacttarget.com +onadstracker.com +onanizma.net +onaudience.com +onavisit.com +onawaylodge.com +onboarding.theappgrader.com +onceambientstore.com +onclasrv.com +onclickads.net +onclickmega.com +onclickprediction.com +onclickpredictiv.com +onclicksuper.com +onclkds.com +onderpalet.com +one-and-lonely.com +one-demo-dup.one-demo.convertro.com +one-demo.convertro.com +one-demo.one-demo.convertro.com +one-demo.one-integration.ci.convertro.com +one-demo2.one-demo.convertro.com +one-demo2.one-integration.ci.convertro.com +one-jj.github.io +one.123counters.com +one.advertising.com +one.cam4ads.com +one.ru +oneandonlynetwork.com +oneapi-qa.advertising.com +oneapp.telstra.inscname.net +oneappmodel.telstra.inscname.net +onebiz.cl +onecoin.eu +onecommunity-uat.thunderhead.com +onecommunity.thunderhead.com +onecreative.advertising.com +onedemo.cdn.thunderhead.com +onedemo.thunderhead.com +onedevperf.cdn.thunderhead.com +onef.cf +oneluckyvisitor.org +onenetworkdirect.com +onestat.com +onestatfree.com +onet.hit.gemius.pl +onet.hit.stat.pl +onetag.mgr.consensu.org +onetoone.112.2o7.net +oneund.ru +onlamp.us.intellitxt.com +onlgc.voluumtrk.com +onliine.pl +onlinadverts.com +online-antispym4.com +online-auto-insurance.petrovka.info +online-bingo.petrovka.info +online-broker.petrovka.info +online-cash.petrovka.info +online-casino.shengen.ru +online-casino.webpark.pl +online-cigarettes.hitslog.net +online-college.petrovka.info +online-degree.petrovka.info +online-florist.petrovka.info +online-forex-trading-systems.blogspot.com +online-forex.hut1.ru +online-gaming.petrovka.info +online-job.petrovka.info +online-loan.petrovka.info +online-metrix.net +online-mortgage.petrovka.info +online-personal.petrovka.info +online-personals.petrovka.info +online-pharmacy-online.blogspot.com +online-pharmacy.petrovka.info +online-phentermine.petrovka.info +online-poker-gambling.petrovka.info +online-poker-game.petrovka.info +online-poker.shengen.ru +online-prescription.petrovka.info +online-school.petrovka.info +online-schools.petrovka.info +online-sex-video.com +online-sex.eu +online-single.petrovka.info +online-tarot-reading.beesearch.info +online-templatestore.com +online-travel.petrovka.info +online-university.petrovka.info +online-viagra.petrovka.info +online-xanax.petrovka.info +online.miarroba.com +online.pro +online.sh.cn +online.tapjoy.com +online1.webcams.com +online2018codeopen.win +online2018softwarefree.win +onlineadmin.net +onlineads.magicvalley.com +onlineapi.youappi.com +onlinebestoffers.net +onlinecash.com +onlinecashmethod.com +onlinedownloads.org +onlinegurupopularsitecom.112.2o7.net +onlineindigoca.112.2o7.net +onlineloan-personal.net +onlinerekruter.com +onlinereserchstatistics.online +onlinerewardcenter.com +onlineserialy.ru +onlinesexfinder.com +onlineslotmaschine.com +onlinesucces.nl +onlinetherapymagazine.com +onlineupdate.smallandprecise4update.download +onlineusagesurveys.com +onlinewebfind.com +only-valium.go.to +only-valium.shengen.ru +only.best-games.today +only2date.com +onlyfiles.net +onlypreteens.com +onmops.com +onocollect.247realmedia.com +onrio.com.br +onscroll.com +ontheflix.us.intellitxt.com +onvis.ivwbox.de +onward.yext.com +onwardclick.com +onwey.com +oo-na-na-pics.com +oo.waw.pl +oocenter.us.intellitxt.com +oodpreprod.122.2o7.net +ooen.oewabox.at +oofun.com +oofuv.cruisingsmallship.com +oojee.barginginfrance.net +ooksu.frost-electric-supply.com +oolsi.frost-electric-supply.com +oopt.fr +oosee.barginginfrance.net +oovqsvi.angelcities.com +oowhe.frost-electric-supply.com +op.standartnews.com +opads.ero-advertising.com +opcwdns.opcw.nl +open-hive-server-1.pp.ua +open.4info.net +open.ad.yieldmanager.net +open.oneplus.net +openad.infobel.com +openad.tf1.fr +openad.travelnow.com +openadext.tf1.fr +openadid.adnxs.com +openads.dimcab.com +openads.flagman.bg +openads.friendfinder.com +openads.hiphopsite.com +openads.motorrad-net.at +openads.nightlifemagazine.ca +openads.org +openads.smithmag.net +openads.zeads.com +openadstream-en1.247realmedia.com +openadstream-eu1.247realmedia.com +openadstream-eustage1.247realmedia.com +openadstream-se.247realmedia.com +openadstream.247realmedia.com +openadstream10.247realmedia.com +openadstream11.247realmedia.com +openadstream12.247realmedia.com +openadstream14.247realmedia.com +openadstream15.247realmedia.com +openadstream16.247realmedia.com +openadstream17.247realmedia.com +openadstream18.247realmedia.com +openadstream8.247realmedia.com +openadstream9.247realmedia.com +opencandy.com +opendownloadmanager.com +opengdpr.mparticle.com +openinternetexchange.com +openinternetexchange.net +openkatalog.com +openload.info +openoverflow.com +openrtb.allinviews.com +openrtb.contextweb.com +openrtb.shoofle.tv +opensharecount.com +opensoftwareupdate.com +opensoftwareupdater.com +opensource.cquotient.com +openstat.net +opentable.tt.omtrdc.net +opentag-stats.qubit.com +openx.4shared.com +openx.adfactor.nl +openx.ajur.info +openx.angelsgroup.org.uk +openx.apollo.lv +openx.blindferret.com +openx.bmwpower-bg.net +openx.camelmedia.net +openx.cnews.ru +openx.co.za +openx.coolconcepts.nl +openx.diena.lv +openx.engagedmediamags.com +openx.iamexpat.nl +openx.imoti.net +openx.itsmassive.com +openx.kokoma.pl +openx.mercatormedia.com +openx.net +openx.net.hr +openx.omniton.net +openx.sexsearchcom.com +openx.shinyads.com +openx.stand.bg +openx.trellian.com +openx.utv.bg +openx.vizzia.bg +openx.vsekiden.com +openx.watchmygf.net +openx.xenium.pl +openx2-match.dotomi.com +openx2.fotoflexer.com +openxxx.viragemedia.com +operationkettle.com +operations.curalate.com +operations.yottaa.com +opienetwork.com +opinionlabcc.122.2o7.net +oplaca-sie.pl +opps.taboola.com +oprahsearch.com +ops-dev.yottaa.com +ops-prod-a.us-east-1.k8s.tune.com +ops-prod-a.us-west-1.k8s.tune.com +ops-prod-a.us-west-2.k8s.tune.com +ops-prod.us-west-2.k8s.ops.tune.com +ops-self-service.adsrvr.org +ops-stage-a.us-east-1.k8s.tune.com +ops-stage-a.us-west-2.k8s.tune.com +ops-stage.us-west-2.k8s.ops.tune.com +ops.appdynamics.com +ops.kargo.com +ops.kochava.com +ops.pardot.com +ops.tune.com +ops.yottaa.com +opsci.vpn.insnw.net +opserver01.iti.net.pk +opsgerrit.vpn.insnw.net +opt.hit.gemius.pl +opt.use.dynamicyield.com +opt.ximad.com +optiforce.optimizely.com +optiker-michelmann.de +optilogus.com +optimallimit.com +optimask-pro.com +optimeze.com +optimezer.com +optimization-methods.com +optimize-stats.voxmedia.com +optimize.adpushup.com +optimize.buysellads.com +optimize.doubleclick.net +optimize.indieclick.com +optimize.innity.com +optimized-by-adv.rubiconproject.com +optimized-by.4wnetwork.com +optimized-by.rubiconproject.com +optimized-by.vitalads.net +optimized.by.vitalads.net +optimizedby.brealtime.com +optimizedby.openx.com +optimizely.com +optimost.112.2o7.net +optimost.com +optimum-hits.com +optimzedby.rmxads.com +option9.adultfriendfinder.com +optmd.com +optmnstr.awesomemotive.netdna-cdn.com +optmnstr.com +optmstr.com +optnmstr.com +optout.1rx.io +optout.agkn.com +optout.alphonso.tv +optout.b3-uk.mookie1.com +optout.b3.mookie1.com +optout.ib.mookie1.com +optout.inmobi.com +optout.kochava.com +optout.mxptint.net +optout.yieldmo.com +optout3.adaptv.advertising.com +optout3.adtech.de +optout3.adtechjp.com +optout3.adtechus.com +optout3.advertising.com +optout3.ar.atwola.com +optout3.convertro.com +optout3.tacoda.at.atwola.com +opttracker.com +optvdo.com +oqnsnzwwnm6zb7y.optionpaymentprak.com +or.5.p2l.info +oracle.112.2o7.net +oraclecom.112.2o7.net +oracleglobal.112.2o7.net +oral-delight.boinkers.com +oral-phonesex-numbers.com +oral.pl +oralbondage.com +oralcravings.com +oralfun.net +oralse.ca +oralse.cx +oralsexfilme.net +oralsexpics.nu +oralsilk.com +oralyx.com +oranga.host.sk +orange-fr.adinfuse.com +orange-kodzik.890m.com +orange.fr-enqueteannuelle.xyz +orange.fr-enqueteofficielle.online +orange.fr-enqueteofficielle2015.xyz +orange.fr-felicitations.xyz +orange.fr-votre-opinion.xyz +orange.fr-votreopinion.xyz +orange.npix.net +orange.recompenses.win +orange.recompenses.xyz +orange.salesmanago.pl +orange.weborama.fr +orangebtl.com.pe +orangeuk-mc.adinfuse.com +orangmm.ultimatefreehost.in +orango.redirectme.net +oranla.info +orbidapparels.com +orbiyz.com +orbmarketplace.com +orbowlada.strefa.pl +orca.qubitproducts.com +ord01-nagios01.svc.insnw.net +ord01-nagios01.vpn.insnw.net +ord01-nagios02.svc.insnw.net +ord01-nagios02.vpn.insnw.net +ord01-nagios03.svc.insnw.net +ord01-nagios03.vpn.insnw.net +ordabeille.fr +order-hydrocodone.polybuild.ru +order-phentermine.polybuild.ru +order-valium.polybuild.ru +order.carbonads.net +orderadipex.findmenow.info +ordercheapestamoxilhere.com +ordercheapestpriligyhere.com +orders.webpower.com +ordersildenafil.com +ordie.adbureau.net +ordingly.com +oreck.tt.omtrdc.net +orencia.pflexads.com +oreo.iawsnetwork.com +oreware.com +orf.oewabox.at +org.uk.vsassets.com +org.vsassets.com +oriceline.com +oriel.mgr.consensu.org +orientation.internal.intercom.io +origer.info +origin-0.extole.io +origin-0.qa.extole.io +origin-0.st.extole.io +origin-1.extole.io +origin-1.qa.extole.io +origin-1.st.extole.io +origin-2.extole.io +origin-2.qa.extole.io +origin-2.st.extole.io +origin-3.extole.io +origin-3.qa.extole.io +origin-3.st.extole.io +origin-4.extole.io +origin-4.qa.extole.io +origin-4.st.extole.io +origin-5.extole.io +origin-5.qa.extole.io +origin-5.st.extole.io +origin-6.extole.io +origin-6.qa.extole.io +origin-6.st.extole.io +origin-7.extole.io +origin-7.qa.extole.io +origin-7.st.extole.io +origin-akamai-members.s50.exacttarget.com +origin-auth.s1.exacttarget.com +origin-auth.s7.exacttarget.com +origin-console.backtrace.io +origin-get.backtrace.io +origin-gizmo.sizmek.com +origin-mc.s50.exacttarget.com +origin-members.s50.exacttarget.com +origin-tracking.trulia.com +origin-vlibs.advertising.com +origin.chron.com +origin.craft.advertising.com +origin.demo.sizmek.com +origin.extole.io +origin.home.tapjoy.com +origin.lo.extole.io +origin.pr.extole.io +origin.qa.extole.io +origin.st.extole.io +origin.tapjoy.com +origin.uac.advertising.com +origin2.adsdk.com +originau.audience.newscgp.com +originau.pixel.newscgp.com +originus.audience.newscgp.com +originus.pixel.newscgp.com +orion.iad.appboy.com +orion.platino.gov.ve +orionhttp.s50.exacttarget.com +orionimg.adkmob.com +orionims.s50.exacttarget.com +orkut.krovatka.su +orlandoinfocom.112.2o7.net +ortaklik.mynet.com +ortc-ws2-useast1-s0005.realtime.co +ortho-tri-cyclen.1.p2l.info +ortshk.tapas.net +os.dev.midasplayer.com +osc.optimize.webtrends.com +oscar.alphonso.tv +osdir.us.intellitxt.com +oshoa.iptvdeals.com +oshoo.iptvdeals.com +osiristrading.112.2o7.net +osqa.com +osqa.net +oss-content.securestudies.com +oss-crules.marketscore.com +oss-survey.marketscore.com +ostats.mozilla.com +ostg.us.intellitxt.com +osxserver1.oit.lijit.com +oszukacruletke.blogspot.com +oszukacruletke.like.pl +ota.cartrawler.com +otclick-adv.ru +otf.msn.com +other.xxxcounter.com +otherinbox.com +otherossettlement.com +otherprofit.com +otosponsorki.pl +otracking.com +otrs.fyber.com +ots.optimize.webtrends.com +otsserver.com +ottacknet.112.2o7.net +ottdailytidingscom.112.2o7.net +otto-images.developershed.com +otylkaaotesanek.cz +ou.shutterfly.com +oui.cdn.optimizely.com +our.affiliatetracking.net +ourtoolbar.com +out-lok.hpage.com +out.popads.net +out.true-counter.com +outbrain.com +outbrain.org +outcome.snapads.com +outcome.supersonicads.com +outerinfo.com +outils.yes-messenger.com +outils.yesmessenger.com +outlets-online.pl +outlook.ads.scanapps.com +outlook.foresee.com +outloud.outbrain.com +outofsightmedia.us.intellitxt.com +outporn.com +outstream.casalemedia.com +outwar.com +outweb.nudt.edu.cn +ov2ochu.bid +ovc2-ustokyyneikyfasnm.stackpathdns.com +overblog.ezakus.net +overclockersonline.us.intellitxt.com +overflow.adsoftware.com +overlay.ringtonematcher.com +overstock.com.112.2o7.net +overstock.tt.omtrdc.net +overstockcom.112.2o7.net +overthelimit.us.intellitxt.com +overture.com +overturecom.112.2o7.net +overturecomvista.112.2o7.net +owa.adx1.com +owa.coremetrics.com +owa.dotomi.com +owa.exacttarget.com +owa.exponential.com +owa.tmathtag.com +owa.whoisvisiting.com +owa.xml.adx1.com +owa13.exacttarget.com +owabgxis.wp.pl +owebmoney.ru +owlsr.us +owner01company.truconversion.com +owner03company.truconversion.com +owner03companynew.truconversion.com +owner05company.truconversion.com +owneriq.net +owpuuzea.angelcities.com +ox-d.apax.servedbyopenx.com +ox-d.ask.servedbyopenx.com +ox-d.bauer.servedbyopenx.com +ox-d.beforeitsnews.com +ox-d.bizjournals.servedbyopenx.com +ox-d.boston.servedbyopenx.com +ox-d.buddytv.com +ox-d.cheezburger.servedbyopenx.com +ox-d.cloud9-media.net +ox-d.concourse.servedbyopenx.com +ox-d.curse.servedbyopenx.com +ox-d.digiday.com +ox-d.eluniversal.com +ox-d.evolvemedia.servedbyopenx.com +ox-d.footballmedia.com +ox-d.futurenet.servedbyopenx.com +ox-d.gamer-network.net +ox-d.gamerpublishing.com +ox-d.globalpost.com +ox-d.hbr.org +ox-d.hdcmedia.nl +ox-d.hulkshare.com +ox-d.hypeads.org +ox-d.ibt.servedbyopenx.com +ox-d.iflscience.com +ox-d.imgur.servedbyopenx.com +ox-d.johnstonpress.co.uk +ox-d.leessp.servedbyopenx.com +ox-d.majorgeeks.com +ox-d.mediavine.servedbyopenx.com +ox-d.mirror-digital.com +ox-d.mm1x.nl +ox-d.mmaadnet.com +ox-d.newstogram.com +ox-d.nydailynews.servedbyopenx.com +ox-d.officer.com +ox-d.openxadexchange.com +ox-d.philly.servedbyopenx.com +ox-d.photobucket.com +ox-d.popmatters.com +ox-d.publisherdesk.servedbyopenx.com +ox-d.ranker.servedbyopenx.com +ox-d.rantsports.com +ox-d.realtor.servedbyopenx.com +ox-d.sidereel.com +ox-d.sinclair.servedbyopenx.com +ox-d.sltrib.servedbyopenx.com +ox-d.socialknowledge.servedbyopenx.com +ox-d.thechive.servedbyopenx.com +ox-d.venturebeat.servedbyopenx.com +ox-d.verivox.de +ox-d.viralnova.com +ox-d.washingtonpost.servedbyopenx.com +ox-d.zenoviagroup.com +ox-i.zenoviagroup.com +ox-s.e-card.bg +ox.dateland.co.il +ox.e-card.bg +ox.eurogamer.net +ox.fashion.bg +ox.furaffinity.net +ox.hoosiertimes.com +ox.invia.cz +ox.pigu.lt +ox.tossoffads.com +ox2.sterta.pl +oxado.com +oxcash.com +oxen.hillcountrytexas.com +oxfam.intelli-direct.com +oxjapan-d.openx.net +oxp.emea.mxptint.net +oxp.mxptint.net +oxwwoeukjispema.ru +oxybe.com +oz.ministryofads.com +oz.valueclick.com +oz.valueclick.ne.jp +ozertesa.com +ozil.alphonso.tv +ozon.122.2o7.net +ozonemedia.adbureau.net +p-bot.net +p-business.ru +p-eu4.stripcdn.com +p-o-r-n.nu +p-us1.stripcdn.com +p.24-7.help +p.6sc.co +p.ace.advertising.com +p.addthis.com +p.admob.com +p.adnxs.com +p.adpdx.com +p.ads.roku.com +p.adsymptotic.com +p.agentanalytics.com +p.algovid.com +p.ato.mx +p.bm23.com +p.chango.com +p.com +p.cpm360.com +p.cpx.to +p.cquotient.com +p.d.e0mn.com +p.ebdr2.com +p.estream.to +p.gcp.msas.media.net +p.hemnes.win +p.ic.tynt.com +p.iovation.com +p.l.qq.com +p.liadm.com +p.lp4.io +p.medialytics.com +p.midasplayer.com +p.msas.media.net +p.nexac.com +p.nxtck.com +p.placed.com +p.placemypixel.com +p.profistats.net +p.publico.es +p.raasnet.com +p.reuters.com +p.rfihub.com +p.securedownload01.com +p.silverpush.co +p.tidafors.xyz +p.twitter.com +p.vibrant.co +p.yotpo.com +p.zeroredirect.com +p0.raasnet.com +p0.stripcdn.com +p0.tribl.io +p01.eloqua.com +p01.t.eloqua.com +p01.t.en25.com +p02.eloqua.com +p03.eloqua.com +p04.eloqua.com +p06.eloqua.com +p07.eloqua.com +p0rnuha.com +p1.adhitzads.com +p1.assetscdn.stream +p1.gnrdomimplementation.com +p1.interestingz.pw +p1.midasplayer.com +p1.stripcdn.com +p1.tcr21.tynt.com +p1.zemanta.com +p128902.clksite.com +p13178.adskape.ru +p13n-results-api.optimizely.com +p13nlog.dz.optimizely.com +p1574.adskape.ru +p2.assetscdn.stream +p2.interestingz.pw +p2.l.qq.com +p2.placed.com +p232207.mybestmv.com +p2408.adskape.ru +p2p.adv.vz.ru +p3.assetscdn.stream +p3.interestingz.pw +p30839.clksite.com +p3nlhclust404.shr.prod.phx3.secureserver.net +p3p.alibaba.com +p3p.mmstat.com +p4010.adskape.ru +p4dt2-scyd6.ads.tremorhub.com +p4psearch.china.alibaba.com +p543.adskape.ru +p69523.clksite.com +p78878.adskape.ru +p9762.adskape.ru +pa.5.p2l.info +pa.rxthdr.com +paas-san1.exacttarget.com +pacan.gofreedom.info +pacific-poker.e-online-poker-4u.net +pacificnet.host +pacificnet.xyz +packages.backtrace.io +paclitor.com +pacman.gkgar.com +padsdel.cdnads.com +pag.eloqua.com +page.0ffer.eu +page.app15.in +page.sumo.com +pagead-googlehosted.l.google.com +pagead.googlesyndication.com +pagead.l.doubleclick.net +pagead.l.google.com +pagead.topobiavi.com +pagead1.googlesyndication.com +pagead2.googleadservices.com +pagead2.googlesyndication.com +pagead3.googlesyndication.com +pagead46.l.doubleclick.net +pagefair.com +pagefair.net +pagepeel.ero-advertising.com +pagepeels.sexmoney.com +pager.site50.net +pagerank-ranking.de +pagerank-submitter.de +pagerank-united.de +pagerank.jklir.net +pagerank.scambiositi.com +pagerank4you.com +pageranktop.com +pagerduty-bot.corp.mixpanel.com +pages-stats.rbl.ms +pages.adroll.com +pages.boa.exacttarget.com +pages.convertkit.com +pages.datamark.net +pages.etology.com +pages.exacttarget.com +pages.getambassador.com +pages.github.exacttarget.com +pages.paradym.com +pages.pd1.qa.exacttarget.com +pages.pd1.s1.qa2.exacttarget.com +pages.pd1.s2.qa2.exacttarget.com +pages.qualtrics.com +pages.returnpath.com +pages.s1.qa3.exacttarget.com +pages.s4.exacttarget.com +pages.s50.exacttarget.com +pages.sumo.com +pages.taboola.com +pages.virt.boa.exacttarget.com +pagesecurityinbox5621.000webhostapp.com +pagesense.com +pagespeed.report.qq.com +pagestat.mmi.bemobile.ua +pagetracking.popmarker.com +paginasporno.net +pagosapower.com +paid.outbrain.com +paid.zemanta.com +paidstats.com +paidsurvey.in +paifemouchoa.com +paige18.com +paime.com +pain-relief.1.p2l.info +pain.uhcanesthesia.com +painaddicts.com +paincake.yoll.net +paincult.com +painfulxxx.com +painolympics.info +painolympics.org +painprison.com +paintball-gun.tripod.com +paintnet.fr +paix1.sc1.admob.com +pajama-playtime-felicity-fey-and-her-huge-teen-boobies.blogomer.com +pakeleman.trade +pakiet-steam.pl +pakiety-lte-5gb.blogspot.com +pakiety-pokemon-go.blogspot.com +pakistanelevators.pk +pakpolice.com +pal-item.us.intellitxt.com +palaiswachsberg.de +paldaw.com +palebrook.wbinsights.com +paleleaf.com +palmebi.popunder.ru +paloaltonetworks.d1.sc.omtrdc.net +pamietnikiwampirow.tv +pamoran.net +pampopholf.com +pan.whathyx.com +panadvert.com +pandasoftware.112.2o7.net +pandoramedia-mkt-prod1-lb.campaign.adobe.com +pandoramedia-mkt-prod1-t.campaign.adobe.com +pandoramedia.campaign.adobe.com +pandoramedia.sc.omtrdc.net +panel.adtify.pl +panel.piwik.pro +panel.research-int.se +panel.testing.piwik.pro +panel.veeplay.com +panel.veeso.co +panel2.research-int.se +paneles.impresionesweb.com +panelsave.com +panther1.cpxinteractive.com +pao03-avaio01.vpn.insnw.net +pao03-avserv01.vpn.insnw.net +pao03-device42.svc.insnw.net +pao03-device42.vpn.insnw.net +pao03-gerrit02.vpn.insnw.net +pao03-halb05.vpn.insnw.net +pao03-nagios01.svc.insnw.net +pao03-nagios01.vpn.insnw.net +pao03-nagios02.svc.insnw.net +pao03-nagios02.vpn.insnw.net +pao03-nagios03.svc.insnw.net +pao03-nagios03.vpn.insnw.net +pao03-pathway01.vpn.insnw.net +pao03-sslprov02.vpn.insnw.net +pao03-thruk01.vpn.insnw.net +pao03-vault01.vpn.insnw.net +pao03-vault02.vpn.insnw.net +papajohns.webservices.exacttarget.com +papap1.midasplayer.com +paperg.com +papi.mynativeads.com +papi.mynativeplatform.com +papi.silverpush.co +papla.pl +papoto.com +paques-2016.offre-exceptionnelle.xyz +parade.122.2o7.net +paradoxfactor.com +paradym.com +parallel.qwapi.com +parallels.silverpush.co +paraskov.com +parchedangle.com +pardot.com +parent.oewabox.at +paris01.monero.hashvault.pro +park.above.com +park.parkingpanel.com +parkacanadagoosepascher.fr +parkcloud.dynadot.com +parketsy.pro +parking.dmtracker.com +parking.parklogic.com +parking.reg.ru +parkingcrew.net +parsely.com +parserworld.info +parship.122.2o7.net +parsimoniouspolice.com +parskabab.com +participant.ascend.ai +particle.appdynamics.com +partner-ads.com +partner-ts.groupon.be +partner-ts.groupon.co.uk +partner-ts.groupon.com +partner-ts.groupon.de +partner-ts.groupon.fr +partner-ts.groupon.net +partner-ts.groupon.nl +partner-ts.groupon.pl +partner.ah-ha.com +partner.alerts.aol.com +partner.ceneo.pl +partner.glance.inmobi.com +partner.googleadservices.com +partner.join.com.ua +partner.loveplanet.ru +partner.magna.ru +partner.pelikan.cz +partner.pobieraczek.pl +partner.sbaffiliates.com +partner.shareaholic.com +partner.tagscreator.com +partner.wapacz.pl +partner.wapster.pl +partner01.oingo.com +partner02.oingo.com +partner03.oingo.com +partnerad.l.doubleclick.net +partnerad.l.google.com +partnerads.ysm.yahoo.com +partnercash.de +partnerearning.com +partnerlab.braze.com +partnerportal.marketo.com +partnerprogramma.bol.com +partners-1732315393.us-east-1.elb.amazonaws.com +partners.10bet.com +partners.adklick.de +partners.adultadworld.com +partners.analyticson.com +partners.appsflyer.com +partners.badongo.com +partners.celebrus.com +partners.content.ad +partners.drawbrid.ge +partners.fanduel.com +partners.marketolive.com +partners.mysavings.com +partners.pantheranetwork.com +partners.popmatters.com +partners.priceline.com +partners.privy.com +partners.realgirlsmedia.com +partners.sprintrade.com +partners.tremorhub.com +partners.web.analytics.yahoo.com +partners.webmasterplan.com +partners.xhamster.com +partnerships.clearbit.com +partnerwebsites.mistermedia.nl +party-nngvitbizn.now.sh +party-vqgdyvoycc.now.sh +partygaming.122.2o7.net +partygamingglobal.122.2o7.net +pascal3.science +pasoherb.gq +passbook.xtify.com +passion-4.net +passpport.com +paste-d.openx.net +pastie.org +pat.ron.si +pata.ero-advertising.com +patagonia.122.2o7.net +pathforpoints.com +pathful.com +patio-furniture.dreamhoster.com +patrickhickey.eu +patrickhillery.112.2o7.net +patterntrader.biz +paulinajanowicz.pl +paulsnetwork.com +pave.elisecries.com +paxil.1.p2l.info +paxito.sitetracker.com +pay-ads.com +pay-day-loans.beesearch.info +pay-per-search.com +pay.mobiltek.pl +pay2me.pl +paycounter.com +payday-loans.now-cash.com +payload.yieldbuild.com +payments.aweber.com +payn.me +paypai.org +paypal-exchange.com +paypal-info.billsliste.com +paypal-s.com +paypal.112.2o7.net +paypal.confirmation-card.moneymakerworldwide.com +paypal.de.secure-account-check.com +paypalcridit.com +paypalcz.cz +paypalssl.doubleclick.net +paypalvsgooglecheckout.com +payperclickadvertising.org.uk +paypertext.com +paypopup.com +paypornsites.net +paypyr.org +paysagiste-isere.com +paysefeed.com +payserve.com +payusatax.com +pazl1.ru +pazorial.com +pb-dv.ru +pb-webdesign.net +pb.h-bid.com +pb.tynt.com +pbc.automatad.com +pbg2cs01.doteasy.com +pbhzz.pcloadletter.quhu.info +pbid.pro-market.net +pbnet.ru +pbphgwbr.in +pbs.fkip.unja.ac.id +pbs01.automatad.com +pbterra.com +pc-data.pl +pc-detox.com +pc-geeks.info +pc-gizmos-ssl.com +pc-infopratique.fr.intellitxt.com +pc-scanner16.com +pc-services.ru +pc-test.net +pc-virus-d0l92j2.pw +pc-virus-k7d4v9.online +pc-wallpapers.co.uk +pc.adonweb.ru +pc.club +pc.ljyzwk.com +pc.sharethrough.com +pc2.yumenetworks.com +pca.admarketplace.net +pcads.ru +pcadvisor-uk.intellitxt.com +pcadvisor.uk.intellitxt.com +pcash.globalmailer5.com +pcash.imlive.com +pcash.wildmatch.com +pcboa.se +pcbutts1-therealtruth.blogspot.com +pcbutts1.ourtoolbar.com +pcbutts1.software.informer.com +pccleaner.com +pccleanerpro.com +pcconnection.hosting.exacttarget.com +pcconnectioncom.112.2o7.net +pcejuyhjucmkiny.ru +pcfaster.info +pcgamer.uk.intellitxt.com +pcgameshardware.de.intellitxt.com +pcgroup.com.uy +pch.122.2o7.net +pchealthcheckup.net +pcinpact.fr.intellitxt.com +pcissl001.insnw.net +pcissl002.insnw.net +pcizz.pcloadletter.quhu.info +pcl.exponential.com +pcloadletter.quhu.info +pcmag.us.intellitxt.com +pcmatic.com +pcmban.com +pcmedico.com +pcmightymax.net +pcnawa.com +pcnetworkreliablecloudservices.online +pcookie.aliexpress.com +pcookie.cnzz.com +pcookie.taobao.com +pcper.us.intellitxt.com +pcpitstop.com +pcpro.uk.intellitxt.com +pcregistrycleaner.com +pcrl.co +pcsecurityshield.com +pcspeedup.com +pctoolscom.112.2o7.net +pctuzing.php5.cz +pcw.uk.intellitxt.com +pcwelt.de.intellitxt.com +pcworldcommunication.122.2o7.net +pcworldcommunication.d2.sc.omtrdc.net +pd1.funnyhost.com +pd1.s1.qa1.exacttarget.com +pda.mv.bidsystem.com +pdamods.ru +pddung93.net +pdf-1.infamylists.com +pdf-platinum.info +pdfbooksfree.us +pdheuryopd.loan +pdn-4.com +pdn.applovin.com +pdns.cz +pdns.nudt.edu.cn +pdsecurity.pl +pe.5.p2l.info +pe.adx1.com +peace-power.de +peaceperfect.com +peacepowder.com +peachempire.com +peaches.nu +peachescams.com +peachsun.com +peachtgp.com +peakclick.com +peaky.tags.yield-atx.com +pearlisland.ru +pearno.com +pearsonacessnext.com +pebble-adhese.gva.be +pebble-adhese.hbvl.be +pebblecreekgolfcourse.com +pebed.dm-event.net +pebi.co +pebx.pl +pece.com.br +pechikamini.ru +pedo-porn.ok975.com +pedvsonic.com +pee-pantie.com +pee-pantie.info +pee-sex24.com +pee-top.info +peecom.com +peedvd.com +peeg.fronterarq.cl +peeing-sex.ok975.com +peeing-top.info +peeinggirlsonly.com +peekyou.com +peelads.hustler.com +peelcomms.org +peep-auktion.de +peepee.biz +peepguide.com +peepshowx.com +peer39.com +peerfly.com +peeshot.com +peespy.com +pegase-carburant.com +pegasus.ads.scanapps.com +pegasuswebco.com +pei-ads.playboy.com +pei-ads.thesmokingjacket.com +peiceline.com +peitui.com +pejtviwezfzvo.bid +pekori.to +pele.alphonso.tv +pelfind.me +peliculas-xxx.com +peliculaspornogratis.info +pelmorexmedia.122.2o7.net +peloclub.com +pema.cl +pembohong.com +pendencia21.com.sapo.pt +penix.nl +pennmutual.hosting.exacttarget.com +pennwellco.tt.omtrdc.net +pennwellcorp.112.2o7.net +pennyweb.com +pension-helene.cz +penton.us.intellitxt.com +pentonmedia.122.2o7.net +penwithian.co.uk +people-choice-sites.com +peoplegraph.firstpartyapps.oaspapps.com +pepelacer.computingservices123.com +pepipo.com +pepperjamnetwork.com +pepperp1.midasplayer.com +pepsico.demdex.net +perceivequarter.com +percentmobile.com +perezhilton.us.intellitxt.com +perf-optimized-by.rubiconproject.net.akadns.net +perf.mmstat.com +perf.ngm.franklyinc.com +perf.pardot.com +perfectaudience.com +perfectionautorepairs.com +perfex.inmobi.com +perfiliate.com +performance.cdn.tappx.com +performance.intentmedia.net +performance.tappx.com +performanceadexchange.com +performancerevenue.com +performancerevenues.com +performancetrck.com +performancing.com +perfspot.crwdcntrl.net +perimeterx.net +periphery.adrizer.com +permissioninteractiv.tt.omtrdc.net +permutive.com +perrege.ru +persgroepadvertising.nl +perso.estat.com +personagraph.com +personal.editura-amsibiu.ro +personal.test.vilynx.com +personal.vilynx.com +personalantispy.com +personalcare-offer.com +personalcashbailout.com +personalization.demandbase.com +pertholin.com +pertosj.ru +pespn.chartbeat.net +petakfc.112.2o7.net +petamain.112.2o7.net +petametrics.com +peter-north-cum-shot.blogspot.com +petfooddirect.d1.sc.omtrdc.net +petiteumbrella.com +petra.nic.gov.jo +petrafashion.com +petrenko.biz +pets.finaltips.com +petsmovies.com +pf.tradedoubler.com +pfa.levexis.com +pfaltzgraf.com +pfcuay.o-f.com +pffn.pl.tn +pfizer.122.2o7.net +pfsense.ops.videoamp.com +pg2.solution.weborama.fr +pg308-zmbra.ads.tremorhub.com +pgalvaoteles.pt +pgcollect.com +pgl.example +pgmediaserve.com +pgpartner.com +pgssl.com +ph-ad01.focalink.com +ph-ad02.focalink.com +ph-ad03.focalink.com +ph-ad04.focalink.com +ph-ad05.focalink.com +ph-ad06.focalink.com +ph-ad07.focalink.com +ph-ad08.focalink.com +ph-ad09.focalink.com +ph-ad10.focalink.com +ph-ad11.focalink.com +ph-ad12.focalink.com +ph-ad13.focalink.com +ph-ad14.focalink.com +ph-ad15.focalink.com +ph-ad16.focalink.com +ph-ad17.focalink.com +ph-ad18.focalink.com +ph-ad19.focalink.com +ph-ad20.focalink.com +ph-ad21.focalink.com +ph-cdn.effectivemeasure.net +phabricator.adwyze.com +phabricator.optimizely.com +pharmacy-canada.forsearch.net +pharmacy-news.blogspot.com +pharmacy-online.petrovka.info +pharmacy.hut1.ru +pharmacyrxone.com +pharmadeal.gr +phatthalung.go.th +pheedo.com +phendimetrazine.1.p2l.info +phentermine-buy-online.hitslog.net +phentermine-buy.petrovka.info +phentermine-online.iscool.nl +phentermine-online.petrovka.info +phentermine.1.p2l.info +phentermine.3.p2l.info +phentermine.4.p2l.info +phentermine.aussie7.com +phentermine.petrovka.info +phentermine.polybuild.ru +phentermine.shengen.ru +phentermine.t-amo.net +phentermine.webpark.pl +phg.hitbox.com +philadelphia_cbslocal.us.intellitxt.com +philips.112.2o7.net +philipslighting.d3.sc.omtrdc.net +philly-d.openx.net +philly.demdex.net +philly.staging.sdx.xfinity.com +phillyburbscom.112.2o7.net +phillycom.112.2o7.net +phillymedia.112.2o7.net +phish.curalate.com +phitenmy.com +phlpolice.com +phoaz.cruisingsmallship.com +phoenix-adrunner.mycomputer.com +phoenixads.co.in +phone-calling-card.exnet.su +phone.sf.adroll.com +phonearena.us.intellitxt.com +phonejapan.com +phonesecure.mobi +phoneysoap.com +phorm.biz.tr +phorm.ch +phorm.cl +phorm.co.in +phorm.co.uk +phorm.com +phorm.com.br +phorm.com.es +phorm.com.mx +phorm.com.tr +phorm.dk +phorm.es +phorm.hk +phorm.in +phorm.info.tr +phorm.jp +phorm.kr +phorm.nom.es +phorm.org.es +phorm.ro +phorm.tv.tr +phorm.web.tr +phormchina.com +phormdev.com +phormdiscover.com +phormkorea.com +phormlabs.com +phormprivacy.com +phormservice.com +phormsolution.com +phormstandards.com +photobox-tracking.adalyser.com +photobucket.adnxs.com +photographpan.com +photook.vxm.pl +photos-bazaar-use1.nexus.bazaarvoice.com +photos-us.bazaarvoice.com +photos.daily-deals.analoganalytics.com +photos.pop6.com +photos0.pop6.com +photos1.pop6.com +photos2.pop6.com +photos3.pop6.com +photos4.pop6.com +photos5.pop6.com +photos6.pop6.com +photos7.pop6.com +photos8.pop6.com +photoscape.ch +phox2ey.bid +php-mag.de.intellitxt.com +php-magnet.de.intellitxt.com +php.fark.com +php.genesismedia.com +php4you.biz +phpads.astalavista.us +phpads.cnpapers.com +phpads.flipcorp.com +phpads.foundrymusic.com +phpads.i-merge.net +phpads.macbidouille.com +phpadsnew.abac.com +phpadsnew.gamefolk.de +phpadsnew.new.natuurpark.nl +phpadsnew.wn.com +phpancake.com +phpmyadmin.ads.ero-advertising.com +phpmyadmin.ero-advertising.com +phpmyadmin.js.ero-advertising.com +phpmyvisites.net +phuketscreen.com +phunko.com +phx-2.xmrpool.net +phx-3.xmrpool.net +phx-4.xmrpool.net +physfunc.ru +physorg.uk.intellitxt.com +physorg.us.intellitxt.com +physpayments.com +phytolast.com +pi.adx1.com +pi.demo.pardot.com +pi.pardot.com +pibgalleries.com +pic-store.com +pic.casee.cn +pic.starsarabian.com +pic2fly.com +picadmedia.com +picantemexicancuisine.com +piccave.com +piccdata.com +piccelebs.com +piccolaosteria.de +piccshare.com +picescape.com +pick-savings.com +pick-your-poison.com +pickawebcam.com +pickmeupnews.us.intellitxt.com +picksonfootball.com +pickytime.com +picphotos.net +picranch.com +picreel.com +pics.avs.io +pics.cnomy.com +pics.free-hentai.info +pics.hu +pics.kolmic.com +pics.skenzo.com +pics.yad2.co.il +picsearch.com +picsfair.com +picture-uploads.com +pierwszaligablog.wordpress.com +piet2eix3l.com +pietexture.com +pigra.csheaven.com +pigredoben12.sytes.net +pijpenendeepthroat.blog-paradijs.com +pila-dziedzictwo-2017-online.5v.pl +pilkanozna.yolasite.com +pillager.inverse.com +pillscash.com +pillsmoney.com +pilltabletsrxbargain.net +pilmedia.ads.visionweb.no +pimproll.com +ping.chartbeat.net +ping.crowdscience.com +ping.getadblock.com +ping.hellobar.com +ping.onscroll.com +ping.qbaka.net +ping.ublock.org +ping1.unicast.com +pingdom.net +pingfore.qq.com +pingfore.soso.com +pingomatic.com +pings.blip.tv +pings.conviva.com +pinion.gg +pink-chocolate.com +pink-porn.com +pink.demo.dmp.piwik.pro +pink.habralab.ru +pinkbox.pl +pinkduck.ga +pinkisthenewblog.us.intellitxt.com +pinklolitas.nu +pinkmovs.com +pinkpartsporn.com +pinkpussy.ch +pinkstar.pl +pinkteens.nu +pinktoys.biz +pinkwire.net +pinkxporno.com +pinky-movies.com +pinkymart.com +pinkyslondonescorts.co.uk +pinkysplayhouse.com +pinoyputang.com +pinsdaddy.com +pinstake.com +pintattoos.com +pio.polytopesexempt.com +pioaltkirch.bloxode.com +piohbdisp.hb.adx1.com +pionirbooks.co.id +pipedream.wistia.com +pipelinedb.sp.backtrace.io +piper-fox.com +pipki.r.acdnpro.com +pippio.com +piquantpigs.com +piraraku.com +piratebayproxy.eu +piratebays.eu +piratecams.com +pirateday.ru +pirateproxybay.co +pirater-facebook-gratuit.net +pirilay.com +pisanieprac.info +pisciculturachang.com.br +piski.top +piss-top.info +pissandsperm.com +pissandsquirt.com +pissbilder.de +pissblog.info +pissing-phonesex.com +pissing-sex.com +pissing-women.com +pissingandscat.com +pissingteengirlsfreemovies.blogbugs.org +pissingtop.dk +pissingwars.com +pissnmoan.com +pissvideo.de +pisvlek.com +pitaya-organicos.com +pitbull-video.ujm.pl +pitbull.ek1.pl +piter.xrus.org +pitfield.co.uk +pittsburghpostgazette.112.2o7.net +pituitosus.com +piuminiita.com +piwik.adspaces.ero-advertising.com +piwik.cam-content.com +piwik.datawrapper.de +piwik.denik.cz +piwik.ero-advertising.com +piwik.fobos.de +piwik.ientry.com +piwik.jccm.es +piwik.medienhaus.com +piwik.mortgageloan.com +piwik.n24.de +piwik.onlinemagasinet.no +piwik.org +piwik.pokerlistings.com +piwik.privacytools.io +piwik.pro +piwik.redtube.com +piwik.wsws.org +pix-hd.com +pix.com.au +pix.dco.advertising.com +pix.impdesk.com +pix.lfstmedia.com +pix.pulsemgr.com +pix.revsci.net +pix.silverpush.co +pix.tagcdn.com +pix01.revsci.net +pix02.revsci.net +pix03.revsci.net +pix04.revsci.net +pix2017.adcrowd.com +pix360.co.nf +pix521.adtech.de +pix521.adtech.fr +pix521.adtech.us +pix522.adtech.de +pix522.adtech.fr +pix522.adtech.us +pixadult.com +pixblast.ml.org +pixel-a.basis.net +pixel-a.sitescout.com +pixel-eu.rubiconproject.com +pixel-geo.prfct.co +pixel-origin.mathtag.com +pixel-secure.solvemedia.com +pixel-static.spotify.com +pixel-test.tapad.com +pixel-us-east.rubiconproject.com +pixel-us-west.rubiconproject.com +pixel-use201-lighttpd-elb-1612913623.us-east-2.elb.amazonaws.com +pixel-user-1039.everesttech.net +pixel.33across.com +pixel.absum.ru +pixel.adadvisor.net +pixel.adasiaholdings.com +pixel.adbiq.com +pixel.adblade.com +pixel.adcrowd.com +pixel.admedia.com +pixel.adpredictive.com +pixel.adrizer.com +pixel.adsafeprotected.com +pixel.adsniper.ru +pixel.adssafeprotected.com +pixel.advertising.com +pixel.advidi.com +pixel.adxtrem.com +pixel.affcamp.co.in +pixel.alexametrics.com +pixel.analyticson.com +pixel.app-cast.com +pixel.app.returnpath.net +pixel.aspirei.com +pixel.audienceinsights.net +pixel.audiensis.com +pixel.beap.ad.yieldmanager.net +pixel.bilinmedia.net +pixel.blog.hu +pixel.buypixelads.com +pixel.buzzdeck.com +pixel.captora.com +pixel.carambo.la +pixel.clrstm.com +pixel.collosteam.com +pixel.condenastdigital.com +pixel.cpex.cz +pixel.criteo.net +pixel.crosspixel.net +pixel.digitru.st +pixel.duckduckgo.com +pixel.eazybiz.ng +pixel.everesttech.net +pixel.facebook.com +pixel.geotex.uk.com +pixel.getchute.com +pixel.impresionesweb.com +pixel.inbox.exacttarget.com +pixel.indieclick.com +pixel.industrybrains.com +pixel.ingest.at.atwola.com +pixel.intelsad.com +pixel.interactivesales.ru +pixel.invitemedia.com +pixel.jumptap.com +pixel.keywee.co +pixel.kiitties.com +pixel.leadnationmedia.com +pixel.marketing +pixel.mathtag.com +pixel.meteora.us +pixel.moatads.com +pixel.monetize-me.com +pixel.monitor1.returnpath.net +pixel.monitor2.returnpath.net +pixel.mtrcs.samba.tv +pixel.nc0.co +pixel.netseer.com +pixel.newscgp.com +pixel.newscred.com +pixel.nymag.com +pixel.onaudience.com +pixel.optimalq.net +pixel.parsely.com +pixel.pcworld.com +pixel.perceptlink.com +pixel.pgcollect.com +pixel.placed.com +pixel.pool.datamind.ru +pixel.printsites.net +pixel.quantserve.com +pixel.realclever.com +pixel.realtor.com +pixel.reddit.com +pixel.redditmedia.com +pixel.rubiconproject.com +pixel.rubiconproject.net +pixel.servebom.com +pixel.shodan.me +pixel.sitescout.com +pixel.socialtyze.com +pixel.sojern.com +pixel.solvemedia.com +pixel.spotify.com +pixel.staticworld.net +pixel.surpasshosting.com +pixel.tagdelivery.com +pixel.tapad.com +pixel.theagency.com +pixel.tmathtag.com +pixel.trackverify.com +pixel.traffiliate.com +pixel.tree.com +pixel.urbaninsight.com +pixel.vicedata.com +pixel.watch +pixel.wmadv.com +pixel.wp.com +pixel.yabidos.com +pixel.yola.com +pixel1.returnpath.net +pixel1097.everesttech.net +pixel1324.everesttech.net +pixel1350.everesttech.net +pixel1370.everesttech.net +pixel1553.everesttech.net +pixel1739.everesttech.net +pixel2.realclever.com +pixel2.returnpath.net +pixelbox.uimserv.net +pixelcounter.elmundo.es +pixelcounter.marca.com +pixeljs.test.admedo.com +pixeljson.test.admedo.com +pixelrz.com +pixels.livingsocial.com +pixels.mentad.com +pixels.mparticle.com +pixelservice.apphb.com +pixgood.com +pixhunters.com +pixie.fyber.com +pixiedust.buzzfeed.com +pixlist.info +pixlporn.com +pixpix.in +pixrr.com +pixshark.com +pixxur.com +pixxxpost.com +pizazzint.com +pizda.lol +pizdopletka.club +pizza-imperia.com +pizza-tycoon.com +pizza.com.my +pizzeria-kinna.se +pizzeriavillagio.se +pj.l.admedo.com +pk-cdn.effectivemeasure.net +pk-pomosch.ru +pk-prom.ru +pk-services.ru +pk.adlandpro.com +pkescueladesexo.com.ar +pkfi.net +pkpinfra.fi +pkpojhc.com +pkr1hand.com +pl-engine.intextad.net +pl-v2.presage.io +pl.aasoldes.fr +pl.ads.justpremium.com +pl.adx1.com +pl.allinviews.com +pl.bbelements.com +pl.beeviewd.com +pl.bestcontentonline.com +pl.betclic.com +pl.bustcream-pro.com +pl.centrumofert.com +pl.fmworld.com +pl.gamemine.com +pl.gmads.net +pl.health-line.me +pl.id-forex.com +pl.installfarm.com +pl.longup.co +pl.mevida.me +pl.mobile-redirection.com +pl.mysafesmartphone.com +pl.oriflame.com +pl.patterntrader.biz +pl.placeyourview.com +pl.princessmask.pro +pl.search.etargetnet.com +pl.shoofle.tv +pl.slimg0ji-berry.com +pl.spanel.gem.pl +pl.superando.net +pl.team +pl.testony.com +pl.titan-man.pro +pl.web.toleadoo.com +pl.yumenetworks.com +pl1.slimg0ji-berry.com +pl1.the-titanium.com +pl1.titan-man.pro +pl1.yumenetworks.com +pl106067.puhtml.com +pl107977.puhtml.com +pl108062.puhtml.com +pl109504.puhtml.com +pl11074444.puhtml.com +pl120422.puhtml.com +pl12258511.puhtml.com +pl136883.puhtml.com +pl137937.puhtml.com +pl176754.puhtml.com +pl1978.puhtml.com +pl2.slimg0ji-berry.com +pl2.titan-man.pro +pl3087.puhtml.com +pl3861661.puhtml.com +pl5102.puhtml.com +pl5318.puhtml.com +pl6429510.puhtml.com +placed.com +placelocal.com +placements.tapjoy.com +placeres.net +placeresporno.com +placeryerotismo.com +places.aviasales.ru +places.placed.com +placeyourview.com +placez-cazino-winnerz.in +pladform.ru +plaff-go.ru +plaimedia.com +plaisir-live.com +plaisir-sensuel.com +plaisirdujour.com +plaisirsxxl.zannuaire.com +plajerek.pl +planebaby.com +planet-sex.de +planet.erotieklinks.nl +planetarelax.com +planetatierra.cl +planetazdrowia.com +planetcancerfree.se +planetdesign3.com +planeteporno.com +planetmedia.mgr.consensu.org +planetother.com +planetout.122.2o7.net +planetscum.com +planetspunk.com +plank.duplicolor.cl +planmedpanama.com +planproduct.com +planself.com +plantaardigebrandstof.nl +planthisweekend.com +plantinum.de +plarium.com +plasmaarraak.nl +plasmatv4free.com +plasmatvreward.com +plasterher.nichedsites.com +plastgran.com +plastgranar.nu +plastiv.com +plastjulgranar.se +plastweb.ru +platads.com +plater-emilii.naszebanki.pl +platesauto.com +platform-api.allinviews.com +platform-api.beeviewd.com +platform-api.placeyourview.com +platform-api.sharethis.com +platform-api.supersonic.com +platform.adasiaholdings.com +platform.adwyze.com +platform.bidgear.com +platform.blismedia.com +platform.communicatorcorp.com +platform.drawbrid.ge +platform.ifc.inmobi.com +platform.jsecoin.com +platform.mobileapptracking.com +platform.shoofle.tv +platform.sizmek.com +platfrom-api.beeviewd.com +platfrom-api.placeyourview.com +platfrom-api.vidazoo.com +platinum-girls.com +platinumcpr.com +plattangsborste.se +plavix.shengen.ru +play-cda.pl +play-dates.net +play-logic-games.com +play-mp3.com +play-poker-free.forsearch.net +play-qa.syndicaster.tv +play-tube.pl +play.alt.indigital.lt +play.aniview.com +play.anyname.zelfo.pw +play.appiq.mobi +play.assets.shentaiesp.asia +play.cc.gofile.io +play.coin.bajarlo.net +play.dsd.everydayporn.co +play.estream.nu +play.estream.to +play.estream.xyz +play.feesocrald.com +play.flowplayer.space +play.freebsd.nnna.ru +play.go.cloot.ga +play.gramombird.com +play.istlandoll.com +play.js.vidoza.net +play.leadzu.com +play.leadzupc.com +play.malictuiar.com +play.mine.gay-hotvideo.net +play.miner.oozing.co +play.mix.kinostuff.com +play.mm.zubovskaya-banya.ru +play.mnr.dorama.site +play.mobsfun.net +play.mysite.irkdsu.ru +play.nexioniect.com +play.on.animeteatr.ru +play.pampopholf.com +play.pc.belicimo.pw +play.play.estream.nu +play.play.estream.to +play.play.estream.xyz +play.play.tainiesonline.pw +play.play.tainiesonline.stream +play.play.vidzi.tv +play.play1.videos.videos.vidto.me +play.play1.videos.vidto.me +play.pocketgolf.host +play.power.tainiesonline.pw +play.proxy.multikonline.ru +play.s01.vidtod.me +play.s01.vidtodo.pro +play.s02.vidtod.me +play.scripts.mrpiracy.xyz +play.site.flashx.cc +play.star.dexim.space +play.stat.miraben.pw +play.strdef.world +play.stream.vidzi.tv +play.streaming.estream.to +play.syndicaster.tv +play.tainiesonline.pw +play.tainiesonline.stream +play.traffpartners.com +play.vb.wearesaudis.net +play.video.estream.nu +play.video2.stream.vidzi.tv +play.videos.videos.vidto.me +play.videos.vidto.me +play.videosongplayer.com +play.vidzi.tv +play.web.flashx.co +play.wm.yololike.space +play.www.intellecthosting.net +play.xmr.101010.pl +play.xmr.e-libra.ru +play1.videos.videos.vidto.me +play1.videos.vidto.me +play4traffic.com +play65-tournaments.com +playablepblysef.blogspot.com +playbiy.com +playboy-playmates.info +playboyfiles.xblog.in +playboyshow.com +playdemic.jupyter.wbinsights.com +playdemic.r.wbinsights.com +playdemic.wbinsights.com +playdemic.zeppelin.wbinsights.com +playe.vidto.se +player-galleries.com +player.allinviews.com +player.aniview.com +player.beeviewd.com +player.bestcontentonline.com +player.innovid.com +player.installfarm.com +player.logs.videmob.com +player.mediabong.net +player.movenetworks.com +player.placeyourview.com +player.shoofle.tv +player.videos.vidto.me +playerassets.info +playerassist.com +playercdn.jivox.com +playerhost.aniview.com +playerotica.com +playersaid.com +playfilm.pl +playfulerotica.com +playfuls.uk.intellitxt.com +playfulshemale.com +playgames4u.com +playgay.org +playgirl.sk +playgirl75.free.fr +playgril.com +playground.optimizely.com +playhaven.com +playinvaders.com +playlink.pl +playlist.ma.tune.com +playlott.com +playmatelookout.yeahlinks.com +playmax.co +playmobia.com +playmobileads.com +playmovie.pl +playnow.guru +playnowunlimited.biz +playrotic.com +playsataion.com +playstatation.com +playstream.co +playtime-tm.everesttech.net +playtime.tubemogul.com +playtimecasino.net +playvids.com +playweez.pl +pldbygg.se +pldev.112.2o7.net +plds4001.grid.dfw1.inmobi.com +pleasantdates.com +pleasebangmenow.com +pleasebangmywife.biz +pleasewait.co +plengeh.wen.ru +plexcoin.info +pliczek.pw +plik-pobierz.pl +pliki.pw +pliks.pl +plikson.pl +plikson24.pl +plista.com +ploaz54.com +ploy.batmobi.net +plsoyfoods.112.2o7.net +plug.plugerr.com +plugin.2easydroid.com +plugin.mediavoice.com +pluginx.perfectgonzo.com +plugrush.com +plumsoftware.co.uk +plus.iwon.com +plus.link4link.com +pluto.adcycle.com +pluto.mgr.consensu.org +pm.adsafeprotected.com +pm.appsee.com +pm.w55c.net +pmc-d.openx.net +pmelon.com +pmetrics.getclicky.com +pmetrics.performancing.com +pmg.ad-logics.com +pmm.prd-aws.fyber.com +pmm.stg-aws.fyber.com +pmp.mxptint.net +pmp.yottaa.com +pmstrk.mercadolivre.com.br +pn1.adserver.yahoo.com +pn2.adserver.yahoo.com +pnc-rtb1.rfihub.net +pntm-images.adbureau.net +pntm.adbureau.net +po.fyybox.com +poacprod.122.2o7.net +pobeiranie.pl +pobieralnia.com.pl +pobieram-plik.pl +pobierane.pl +pobierz-online.co.pl +pobierz.biz +pobierz123.pl +pobierz24.pl +pobierzgo.pl +pobierzplik.net +pobierzpliki.pl +pobierzse.pl +pobierzteraz.mobi +pobraniowo.pl +poc.exacttarget.com +poc10.celebrus.com +poc11.celebrus.com +poc7.celebrus.com +poc8.celebrus.com +poc9.celebrus.com +pocketgolf.host +pocketlint.uk.intellitxt.com +poconorecordcom.112.2o7.net +pod.infinitypersonals.com +pod.manplay.com +pod.sexsearch.com +podgladfacebokaa.blogspot.com +podrltid.info +podzemi.myotis.info +pogotowie-komputerowe-warszawa.com.pl +pogotowie-komputerowe24h.warszawa.pl +pogotowiekomputerowe.net +pogruz.wanyizhao.net +pointclicktrack.com +pointroll.com +pokachi.net +pokemon-go-pakiety.blogspot.com +pokemon-vip.rdx.pl +pokemon2k16go.blogspot.com +pokemonporno.com +poker-games.e-online-poker-4u.net +poker.cm +pokolorujfb.glt.pl +pol.bbelements.com +pol.boobs-xl.com +polakuleczsiesam.pl +poland.gift-today85.online +polaris.tns-cs.net +poldk.nuggad.net +pole.6rooms.com +police11.provenprotection.net +politicalopinionsurvey.com +polkawlesie.blogspot.com +pollserver.interpolls.com +poloralphlaurenlotusstg.112.2o7.net +polsatboxingnight-transmisjahd.ujm.pl +polska-nagroda.com +polska-nagroda.off.ltd +polska-tv.pl +polskasupermarkecie.website +polskieinfo365.wordpress.com +pon.ewtuyytdf45.com +pong.qubitproducts.com +pool-colruytgroup.adhese.com +pool-de.supportxmr.com +pool-nrc.adhese.com +pool-roularta.adhese.com +pool.adhese.be +pool.adhsm.adhese.com +pool.admedo.com +pool.ads.netlog.com +pool.aeon.hashvault.pro +pool.bmnr.pw +pool.cloudcoins.co +pool.coinblind.com +pool.coinimp.com +pool.coinlab.biz +pool.coinrail.io +pool.cryptonoter.com +pool.datamind.ru +pool.dichtbij.adhese.com +pool.distilled.ie +pool.electroneum.hashvault.pro +pool.etn.spacepools.org +pool.euroads.no +pool.graft.hashvault.pro +pool.hws.ru +pool.intense.hashvault.pro +pool.maxpoint.com +pool.minexmr.com +pool.monero.hashvault.pro +pool.nrc.adhese.com +pool.pebblemedia.adhese.com +pool.persgroep.adhese.com +pool.roularta.adhese.com +pool.sanoma.adhese.com +pool.sumokoin.hashvault.pro +pool.supportxmr.com +pool1.moatads.com +pool2.coinimp.com +pool3.moatads.com +pool4.moatads.com +pool6.moatads.com +pool8.moatads.com +pool9.moatads.com +pop-under.ru +pop-under.xml.adx1.com +pop-up.xml.adx1.com +pop.dnparking.com +pop.egi.biz +pop.net21pk.com +pop.redirect.adsjudo.com +pop.revimedia.com +pop.zompmedia.com +pop6.adultfriendfinder.com +popacs.ero-advertising.com +popads.ero-advertising.com +popads.net +popadscdn.net +popcapgames.122.2o7.net +popcash.net +popclick.net +popcounter.com +popdirt.us.intellitxt.com +popfill.us.intellitxt.com +popflawlessads.com +popfree.adultcash.com +popit.mediumpimpin.com +popmyads.com +popmycash.com +popoholic.us.intellitxt.com +poponclick.com +poponthepop.us.intellitxt.com +poppers-rush.ru +pops.ero-advertising.com +pops.fastly-insights.com +pops.sec.fastly-insights.com +pops.staging.fastly-insights.com +pops.test.fastly-insights.com +popsci.com.122.2o7.net +popub.com +popularmechanics.us.intellitxt.com +popunder.adsrevenue.net +popunder.com +popunder.fpctraffic.com +popunder.loading-delivery1.com +popunder.net +popunder.paypopup.com +popunder.popcde.com +popunder.ru +popunderonly.com +popup.matchmaker.com +popup.msn.com +popup.oxcash.com +popup.softreklam.com +popup.taboola.com +popupclick.ru +popupdomination.com +popupmoney.com +popupnation.com +popups.ad-logics.com +popups.afftrack001.com +popups.infostart.com +popuptraf.ru +popuptraffic.com +porn-movies.org +porn-net.de +porn-pay-per-minute.com +porn-portal.net +porn-pussy.nu +porn-review-site.com +porn-sex-free.com +porn-sex-sluts-webcams-movies.com +porn-sluts.com +porn-star.nu +porn-stop.com +porn-tubes.net +porn-video.nu +porn-w.org +porn-x-videos.com +porn-xxx.nu +porn.marvin-vibez.in +porn.mtree.com +porngraph.com +pornik.biz +porninsight.com +pornjus.com +pornlabs.net +pornlander.com +pornliament.com +pornlim.com +pornlinksandmore.com +pornlivestream.com +pornlolita.net +pornlolitas.com +pornlovex.com +pornls.com +pornmagnat.com +pornmania.org +pornmania.pl +pornmasters.nu +pornmasterz.com +pornministry.com +pornmovies-unlimited.com +pornmovies.dk +pornnasty.com +pornnography.com +pornnymphos.com +porno-arabe.org +porno-pics.nu +porno-pix.nu +porno-play.net +porno-porn.nu +porno-pub.net +porno-pussy.nu +porno-rama.nu +porno-raskazy.ru +porno-service.com +porno-sex.biz +porno-sexportal.com +porno-star-dvd.com +porno-star.de +porno-stars.nu +porno-supreme.com +porno-teen.de +porno-teens.nu +porno-transsexuals.ru +porno-v1.com +porno.be.tc +porno.bekijkmenu.nl +porno.sexraj.pl +porno.simple-image.com.ua +pornoduel.com +pornogay.com.br +pornogig.com +pornogirls.thumblogger.com +pornoglamour.com +pornographo.blogspot.com.br.blogspot.sk +pornographo.blogspot.com.tr.blogspot.com.tr +pornographo.blogspot.com.tr.br.blogspot.com.tr +pornographo.blogspot.de.blogspot.ch +pornographo.blogspot.de.blogspot.co.id +pornographo.blogspot.de.blogspot.co.uk +pornographo.blogspot.de.blogspot.com +pornographo.blogspot.de.blogspot.com.ar +pornographo.blogspot.de.blogspot.com.es +pornographo.blogspot.de.blogspot.com.tr +pornographo.blogspot.de.blogspot.gr +pornographo.blogspot.de.blogspot.it +pornographo.blogspot.de.blogspot.mx +pornographo.blogspot.de.blogspot.pt +pornographo.blogspot.de.blogspot.sk +pornographo.blogspot.de.br.blogspot.ch +pornographo.blogspot.de.br.blogspot.co.id +pornorost.com +pornoroxx.com +pornorss.com +pornorules.info +pornorus.net +pornorussia.net +pornos-on-demand.com +pornos.name +pornosad.com +pornosay.net +pornosee.info +pornoseed.com +pornoseite.thumblogger.com +pornosex.nu +pornosex2000.com +pornosexevideo.com +pornosexmaniac.com +pornosexo.org +pornosexovideos.com +pornosexpages.com +pornosexpics.net +pornosextop.com +pornosfilme.eu +pornoshed.com +pornoshok-dir.com +pornoshop.nu +pornosikistv.net +pornosite.tv +pornositeonline.com +pornositi.com +pornoskar.com +pornosmola.info +pornosor.com +pornosta.com +pornostars.biz +pornostarsxxx.free.fr +pornostory.biz +pornostrapon.com +pornosu.ru +pornosubee.com +pornosucher.de +pornosuk.com +pornosuki.com +pornoteeny.com +pornoteenz.nu +pornotempel.com +pornotide.com +pornotomia.com +pornoton.net +pornotoon.net +pornotr3.net +pornotr5.net +pornotr6.net +pornotrans.free.fr +pornotum.com +pornotuvo.com +pornotv.nu +pornoups.com +pornozaak.nl +pornozvezda.info +pornpalace.nu +pornparty.org +pornpic.nl +pornpictures.de +pornpix.nu +pornpix.org +pornpixx.com +pornplace.net +pornplay.net +pornpopulation.com +pornpost.in +pornpro.biz +pornpussy.org +pornpx.com +pornracks.com +pornrealitysite.com +pornrealm.net +pornsaves.com +pornseksvideo.com +pornsentinel.com +pornsexandpussy.com +pornshop.ca +pornshop.se +pornsickle.com +pornsite.sextgem.com +pornsites2000.com +pornsitespass.com +pornsitevideos.com +pornstar-fantasy.com +pornstar-haven.com +pornstar-links.net +pornstar-pix.com +pornstar4you.com +pornstaragent.com +pornstarbliss.com +pornstarclassicgalleries.com +pornstarinsider.com +pornstarlab.com +pornstarlookout.yeahlinks.com +pornstarpalace.com +pornstars-passion.com +pornstars24-7.com +pornstarsgonewild.com +pornstarsibang.com +pornstarspic.com +pornstarss.tk +pornstarswearingstockings.com +pornstartits.xblog.in +pornstarwap.com +porntrack.com +porntraff.com +porntubevideos.net +pornturksex.com +porntvx.info +pornuncut.com +pornvalve.com +pornvideo.wap.sh +pornvideosday.com +pornvillas.com +pornvtope.blogspot.ca +pornvtope.blogspot.ch +pornvtope.blogspot.co.id +pornvtope.blogspot.co.uk +pornvtope.blogspot.com +pornvtope.blogspot.com.ar +pornvtope.blogspot.com.br +pornvtope.blogspot.com.es +pornvtope.blogspot.com.tr +pornvtope.blogspot.de +pornvtope.blogspot.gr +pornvtope.blogspot.it +pornvtope.blogspot.mx +pornvtope.blogspot.no +pornvtope.blogspot.pt +pornwindows.com +porny.fr +pornyway.com +pornzone.tv +porodasobak.net +porr-filmer.net +porrcity.se +porrdejting.com +porrfilm.vuxenvaruhuset.nu +porrmannen.com +port.aconti.net +port.bg +portablevaporizer.com +portafolio.intelsad.com +portail-sexy.info +portal-eu.ru +portal.a.pxi.pub +portal.adthrive.com +portal.airfind.com +portal.dev14.pxi.pub +portal.lisnr.com +portal.reports.extremereach.com +portal2.jsrdn.com +portalfiremasters.com.br +portalgrupobuaiz.com.br +portallsmiles.com +portraitphotographygroup.com +portuguesehotels.com +pos-kupang.com +pos.baidu.com +posed2shade.com +poserstore.com +poshiv-chehol.ru +posible.net +posing.biz +positiv-hiv-aids.de +positive2b.ru +positivity.it +pospr.waw.pl +possessivebucket.com +possibleboats.com +post.agentanalytics.com +post.netchina.com.cn +post.rmbn.ru +post.securestudies.com +post.update.3lift.com +post.update.adroll.com +post.update.adsrvr.org +post.update.altitude-arena.com +post.update.clrstm.com +post.update.contextweb.com +post.update.criteo.com +post.update.ib.adnxs.com +post.update.mopub.com +post.update.morgdog.springserve.com +post.update.rubiconproject.com +post.update.spotxchange.com +post.update.tidaltv.com +post.update.wo.gumgum.com +post.update.wtag.adaptv.advertising.com +postbank.ssl-zertifikat.mobi +postbox.mos.ru +postchronicle.us.intellitxt.com +postclass.com +postclick.adcentriconline.com +poster-op2joygames.me +poster.gamesprite.me +postgazettecollect.247realmedia.com +postlog.supersonic.com +postmaster.returnpath.net +postmasterdirect.com +postmedia.demdex.net +postmedia.sc.omtrdc.net +postmedia.us.janrainsso.com +postmediamontrealgazette2.files.wordpress.com +postquampro.com +postrelease.com +postrelease.com.akadns.net +potandpussy.com +potdlinks.com +potenza.cz +potop.info +potvaporizer.com +poudreschools.hosting.exacttarget.com +pousadaalohajeri.com.br +poushaketabriz.ir +powabcyfqe.com +powellsbooks.122.2o7.net +powenlite24.ru +power-antivirus-2009.com +power-internet.net +power-surge.com +power.info.com +power.tainiesonline.pw +powercms.ru +poweredbycock.com +poweredbyebony.com +poweredbyfacials.com +poweredbylooker.yieldmo.com +poweredbymilfs.com +poweredbysex.com +powerfactorsaver.com +poweronemedia.122.2o7.net +powershopnet.net +powerspicks.com +powertradeprofit.com +powitania.pl +powr-counter.herokuapp.com +powwowok.com +poxy.me +pozdravleniya-c.ru +pozdrawleniya.com +pozdrawleniya.ru +pozvonim.com +pozyczka-minutowa.pl +pozyczki-inwestor.pl +pozyczki-prywatne.com +pozyczki-prywatne.com.pl +pp-budpostach.com.ua +pp.alphonso.tv +pp.free.fr +pp.lp4.io +pp.nrelate.com +pp2.pptv.com +ppc-parked.domainsite.com +ppc.clickconvertsell.com +ppcbuzznative.rtb.adx1.com +ppcexpertclasses.com +ppd.clrstm.com +ppd2.clrstm.com +ppe.applicationinsights.microsoft.com +ppjs.alphonso.tv +ppl3.pl +pple.com.virus-mac.com +ppms.piwik.pro +ppoi.org +pptm-wp-dev01.piwik.pro +pptm-wp-tmteam.piwik.pro +pq-direct.revsci.net +pq.stat.ku6.com +pqwaker.altervista.org +pr-a.adtech.de +pr-a.adtechus.com +pr-bh.ybp.yahoo.com +pr-cy.ru +pr-iq.adtech.de +pr-iq.adtechus.com +pr-star.de +pr.20min.es +pr.5.p2l.info +pr.atwola.com +pr.extole.io +pr.realvu.net +pr.ydp.yahoo.com +pr0gram.org +pr5600.infusionsoft.com +praceline.com +pracowniaciala.pl +practicetoothpaste.com +pracuj.adocean.pl +pracuj.hit.gemius.pl +pradakomechanicals.com +praddpro.de +pratutor.com +pravoholding.ru +prawdziwyrozwoj.pl +praximoto.se +praxis.fra-01.braze.eu +praxisww.com +prchecker.info +prclick.inmobi.com +prd.klotski.aws.fwmrm.net +prd.linear.aws.fwmrm.net +pre-usermatch.targeting.unrulymedia.com +preapps.com +prebid-server.rubiconproject.com +prebid.adnxs.co +prebid.adnxs.com +prebid.appnexusgslb.net +prebid.districtm.ca +prebid.fqtag.com +prebid.media.net +prebid.org +precisioncounter.com +predictad.com +predictiondisplay.com +predictivadnetwork.com +predictivesearch.com +preferences.returnpath.com +preferredhotelgroup.d2.sc.omtrdc.net +prefersurvey.net +prefix.hit.gemius.pl +preflight.stage-one.heyzap.com +preflight.stage-three.heyzap.com +preflight.stage-two.heyzap.com +prefs.zemanta.com +preland.softmonetize.com +preligions.com +prem.qa1.exacttarget.com +prem.qa2.exacttarget.com +prem.qa3.exacttarget.com +premierfarnell.tt.omtrdc.net +premium-live-scan.com +premium-offers.com +premium-offers.space +premium-reward-club.com +premium.ascensionweb.com +premium.aws.wix.com +premium.mookie1.com +premium.wix.com +premiumanalytics.swrve.com +premiumholidayoffers.com +premiumlink.7tools.eu +premiumlinkgenerator.online +premiumpedia.com +premiumproductsonline.com +premiumprovide.com +premiumstats.xyz +premiumtv.122.2o7.net +premiumvideoupdates.com +preparevideosafesystem4unow.space +preprod.api.adswizz.com +preprod.criteo.com +preprod.criteo.net +preprod.sddan.mgr.consensu.org +prepschoolsluts.com +presage.io +preschooltc.com +prescription-drugs.easy-find.net +prescription-drugs.shengen.ru +presence-pc.fr.intellitxt.com +presentation-atl1.turn.com +presentation.analyticson.com +preservisa.cl +presetrabbits.com +presidentproxy.com +press-gallery.com +press.airpr.com +pressurespot.com +prestige-intl.com +prestigehackforghosts.dlcodes.com +prestitoprotestati.it +presto-gdpr-dev-encrypted.wbinsights.com +presto-internals.adotmob.com +presto-ldap.adotmob.com +presto-prod.adotmob.com +prestoris.com +preteen-models.biz +preteenland.com +preteens.nu +preteensite.com +pretty-girls.biz +pretty-girls.org +pretty-mart.com +pretty-models.info +pretty-n-pink.com +pretty-youngs.com +prettyarchive.com +prettyasianbabes.com +prettyboring.us.intellitxt.com +prettycum.com +prettyinporn.com +prettys.biz +prettyteenager.com +prevacid.1.p2l.info +prevent-asian-flu.com +preventheadacheguide.info +preventionsante.com +preventivogratuito.it +preview.demo.franklyinc.com +preview.demo.pardot.com +preview.dev.franklyinc.com +preview.dsys1.franklyinc.com +preview.dua1.franklyinc.com +preview.exacttarget.com +preview.franklyinc.com +preview.leadmediapartners.com +preview.msn.com +preview.platform.sizmek.com +preview.prod.sizmek.com +preview.qa.franklyinc.com +preview.quantserve.com +preview.returnpath.net +preview.sharethrough.com +preview.xapi.xfinity.com +preview.yieldmo.com +preview1.thunderhead.com +preview2.thunderhead.com +preview3.thunderhead.com +preview4.thunderhead.com +previewna2.thunderhead.com +previewna3.thunderhead.com +previewna4.thunderhead.com +previousplayground.com +previouspotato.com +prexyone.appspot.com +prezent.odchudzaniezpasja.pl +prg-dev.kargo.com +prg-image-dr.global.exacttarget.com +prg-image.global.exacttarget.com +prg-mc-dr.global.exacttarget.com +prg-mc.global.exacttarget.com +prg-members-dr.global.exacttarget.com +prg-members.global.exacttarget.com +prg.kargo.com +prg.smartadserver.com +pricefbcf.gq +pricheski-video.com +pricing-admin.autopilothq.com +pricing-admin.stage.autopilothq.com +pride-u-bike.com +pridesource.advertserve.com +priestlakeuncorked.com +prieurecoussac.com +priiceline.com +prilosec.1.p2l.info +primaryads.com +primecups.info +primediabusiness.122.2o7.net +primeerotica.com +primemensfitness.112.2o7.net +primepornstars.com +primeproducoes.com.br +primestarmagazine.112.2o7.net +primetime.ad.primetime.net +primetime.net +primetimesolutions.tt.omtrdc.net +primosearch.com +princessmask.pro +print-kom.com +print.dev.khingtracking.com +print.khingtracking.com +printdirectforless.com +printingpeach.com +printmail.biz +priora-2.com +priority.innovid.com +prioritygirls.com +prisa.mgr.consensu.org +prisacom.112.2o7.net +prisacom.sc.omtrdc.net +priusonline.us.intellitxt.com +privacy-center.org +privacy-staging.pixel.advertising.com +privacy.yieldmo.com +privacyassistant.net +privacycollector-production-457481513.us-east-1.elb.amazonaws.com +privatamateure.com +private-id.tk +private.atlanticgam.es +private.hotelcesenaticobooking.info +privatecash.com +privatkunden.datapipe9271.com +privdog.com +privitize.com +privy.com +prizefestival.mobi +prizelava.com +prizemachine.games.iwon.com +prizes.co.uk +prizestohandle.club +prjcq.com +prk.roverinvolv.bid +prm-ext.phorm.com +prm.europacash.com +prmtracking.com +prnewswire.122.2o7.net +pro-advertising.com +pro-networks.us.intellitxt.com +pro-okis.ru +pro-schiesssport.de +pro.clanweb.cz +pro.hit.gemius.pl +pro.hit.stat24.com +pro.ip-api.com +pro.letv.com +pro.marinsm.com +pro.vsassets.com +probe.yieldlab.net +probes.cedexis.com +problem-check-700.com +probolan50.pl +probusinesshub.com +prod-a.applovin.com +prod-airflow.drawbrid.ge +prod-d.openx.com +prod-e.sprtad.com +prod-hzeu-tj-2.datamind.ru +prod-infra-vpn01.rxthdr.com +prod-js.aws.y-track.com +prod-services.interactiveone.com +prod.adlightning.com +prod.ap-southeast-2.kops.kargo.com +prod.appnexus.map.fastly.net +prod.bidr.io +prod.branch.io +prod.contextweb.map.fastlylb.net +prod.curalate.com +prod.cyclone.aws.fwmrm.net +prod.internal.curalate.com +prod.kargo.com +prod.ngm.franklyinc.com +prod.outbrain.map.fastlylb.net +prod.paperg.com +prod.pixel.printsites.net +prod.snackly.co +prod.sonobi-go.map.fastly.net +prod.ugdturner.com +prod.us-east-1.kops.kargo.com +prod.us-west-1.kops.kargo.com +prod.wbinsights.com +prod0.autopilothq.com +prod1.autopilothq.com +prod2.autopilothq.com +prod3.autopilothq.com +product-reviews.uk.intellitxt.com +product.adrelevantis.com +product.atom.adjust.com +product.beta.adwyze.com +product.braze.com +product.sizmek.com +product.staging.adwyze.com +productads.hlserve.com +production-adserver-666328397.us-east-1.elb.amazonaws.com +production-analytics-collector-592917094.us-east-1.elb.amazonaws.com +production-bidding-agent.fyber.com +production.ap-southeast-2.kops.kargo.com +production.cjadsystems.dotomi.com +production.eu-west-2.kops.kargo.com +production.kargo.com +production.paperg.com +production.site.mediavine.com +production.us-east-1.kops.kargo.com +production.us-west-1.kops.kargo.com +production.wootric.com +productopinionpanel.com +productpartnersllc.tt.omtrdc.net +productresearchpanel.com +products-gold.net +products.hlserve.com +producttestpanel.com +produla.czatgg.pl +prodxnews1blob.blob.core.windows.net +proext.com +prof.beta.estat.com +prof.estat.com +profbhack.com +profero.com +proficredit.pl +profile.citrix.com +profile.localytics.com +profile.uproxx.com +profiles.hitslink.com +profileview.localytics.com +profiling.avandor.com +profiling.veoxa.com +profitboosterapp.com +profitmaximizer.co +profitmaximizerpl.com +profitrumour.com +profitshare.bg +profitshare.emag.ro +profitshare.ro +profitsitesbiz.com +proflashdata.com +profolan.pl +profootballweekly.us.intellitxt.com +progettocrea.org +programdarmowy.pl +programme-tv.fr.intellitxt.com +programmerworld.us.intellitxt.com +programyfb.blogspot.com +programyhakerskie.pl +proj2018.xyz +project2.realtracker.com +projectorpeople.112.2o7.net +projectorreviews.advertserve.com +projectorreviews.us.intellitxt.com +projectpoi.com +projects.marketo.com +projectw.skimlinks.com +projectwonderful.com +prokino.pl +prolapseman.com +prom.fullstory.com +prometheus.fullstory.com +prometheus.gitlab.gcp.datamind.ru +prometheus.msas.media.net +prometheus.staging.fullstory.com +promo-m.bongacash.com +promo.amplitude.com +promo.awempire.com +promo.badoink.com +promo.begun.ru +promo.betcity.net +promo.bongacash.com +promo.buzzclicks.com +promo.cams.com +promo.cityads.ru +promo.clickcash.com +promo.clicnscores.com +promo.content.premiumpass.com +promo.easy-dating.org +promo.enatimedia.com +promo.freshdirect.com +promo.hdvbucks.com +promo.intuitext.ro +promo.kobenetwork.com +promo.lifeselector.com +promo.lonelywifehookup.com +promo.love-money.de +promo.mes-meilleurs-films.fr +promo.mobile.de +promo.passioncams.com +promo.pimproll.com +promo.profxbrokers.com +promo.sensationalcash.com +promo.streaming-illimite.net +promo.twistyscash.com +promo.ulust.com +promo.webmasterprofitcenter.com +promo.worldprofitcenter.com +promobenef.com +promocionesparati.com +promos.bwin.it +promos.camsoda.com +promos.fling.com +promos.meetlocals.com +promos.naked.com +promos.wealthymen.com +promote-bz.net +promote.pair.com +promotion-campaigns.com +promotion.com-rewards.club +promotion.partnercash.com +promotion.partnercash.de +promotions.betfred.com +promotions.monthlywinners.com +promotions.skype.com +promotions.sportingbet.com +promotions.yourfirstmillion.biz +promotools.globalmailer.com +promotools.islive.nl +promotools.vpscash.nl +promotools3.globalmailer.com +promotools4.globalmailer.com +promotrucks.com +promover.org +promoviral.com +pron.pro +pronekut.com +pronetadvertising.com +pronorm.fr +pronto.insnw.net +pronto.svc.insnw.net +prontox.insnw.net +proofly.win +propanegrills.biz +propecia.1.p2l.info +propellerads.com +propellerpops.com +propermedia-d.openx.net +property-place.com +propertymanagementoffice.com +propertyxchange.pk +prophett.net +propixel7-768394228.us-east-1.elb.amazonaws.com +proportionalgames.com +proposal-engine.com +proposal.tw +propro.mystagingwebsite.com +proprostatit.com +proproxy.biz +props.id +proranktracker.com +prorodeosportmed.com +proserve-stag.urbanairship.com +proserve.urbanairship.com +prosieben01.webtrekk.net +prosmibank.ru +prospeaker.com +prosperent.com +prosperityhangout.com +prostitutki-almata.org +prostitutki-astana.org +prostitutki-belgoroda.org +prostitutki-kharkova.org +prostitutki-kiev.org +prostitutki-novgoroda.org +prostitutki-odessa.org +prostitutki-rostova.org +prostitutki-tolyatti.org +prostitutki-tyumeni.org +protect-x.com +protect-your-privacy.net +protect.advancedcleaner.com +protect.urbanairship.com +protection.alpolice.com +protection.aspolice.com +protection.aupolice.com +protection.azpolice.com +protection.bspolice.com +protection.btpolice.com +protection.bypolice.com +protection.capolice.com +protection.ccpolice.com +protection.dkpolice.com +protection.espolice.com +protection.frpolice.com +protection.fxpolice.com +protection.gapolice.com +protection.grpolice.com +protection.hkpolice.com +protection.hnpolice.com +protection.idpolice.com +protection.ilpolice.com +protection.iqpolice.com +protection.itpolice.com +protection.itpolice.net +protection.jmpolice.com +protection.kppolice.com +protection.kypolice.com +protection.lapolice.com +protection.lapolice.net +protection.lbpolice.com +protection.lcpolice.com +protection.lipolice.com +protection.lrpolice.com +protection.lspolice.com +protection.lvpolice.com +protection.mapolice.com +protection.mcpolice.com +protection.mdpolice.com +protection.mepolice.com +protection.mnpolice.com +protection.mopolice.com +protection.mspolice.net +protection.napolice.com +protection.napolice.net +protection.ncpolice.com +protection.nzpolice.com +protection.papolice.com +protection.pfpolice.com +protection.pgpolice.com +protection.phpolice.com +protection.pkpolice.com +protection.prpolice.com +protection.ptpolice.com +protection.sbpolice.com +protection.scpolice.com +protection.sdpolice.com +protection.sipolice.com +protection.skpolice.com +protection.stpolice.com +protection.tkpolice.com +protection.tnpolice.com +protection.topolice.com +protection.vapolice.com +protection.vipolice.com +protectionupdatecenter.com +protizer.ru +proton-int.flurry.com +proton-tm.com +proton.flurry.com +protonix.shengen.ru +protraffic.com +protvadmd.hit.gemius.pl +protvmd.adocean.pl +proudclick.com +prov.alphonso.tv +provalist.info +provanto.pl +provenfeedback.com +provexia.com +provideplant.com +proximityads.flipcorp.com +proxy-ajcryptominer.ajplugins.com +proxy-ddsjfhkmnk.now.sh +proxy-khlizawelj.now.sh +proxy-ssl.allinviews.com +proxy-ssl.beeviewd.com +proxy-ssl.bestcontentonline.com +proxy-ssl.installfarm.com +proxy-ssl.placeyourview.com +proxy-ssl.shoofle.tv +proxy.adnxs.com +proxy.ajcryptominer.com +proxy.allinviews.com +proxy.alphonso.tv +proxy.ascend.ai +proxy.beeviewd.com +proxy.bestcontentonline.com +proxy.blogads.com +proxy.dynamicyield.com +proxy.ia2.marketscore.com +proxy.ia3.marketscore.com +proxy.ia4.marketscore.com +proxy.installfarm.com +proxy.multikonline.ru +proxy.mytestminer.xyz +proxy.nullrefexcep.com +proxy.or3.marketscore.com +proxy.or4.marketscore.com +proxy.placeyourview.com +proxy.shoofle.tv +proxy.sj3.marketscore.com +proxy.sj4.marketscore.com +proxy.softonicads.com +proxy01.backtrace.io +proxy01.sp.backtrace.io +proxy2.nullrefexcep.com +proxy3.nullrefexcep.com +proxy5.nullrefexcep.com +proxy7.nullrefexcep.com +proxy8.nullrefexcep.com +proxy9.nullrefexcep.com +proxycfg.marketscore.com +proxytest1.sptest.backtrace.io +prpops.com +prriceline.com +prs1.midasplayer.com +prs3.midasplayer.com +prscripts.com +prsitecheck.com +prsrjdr.ru +prstats.postrelease.com +prudential.qa-dest.imprev.net +prywatne-pozyczki-24.pl +przepismix.pl +przyspiesz.pl +przyspieszkomputer.pl +ps-eu.amazon-adsystem.com +ps-jp.amazon-adsystem.com +ps-us.amazon-adsystem.com +ps.adpredictive.com +ps.eyeota.net +ps.interpolls.com +ps.l.admedo.com +ps.ns-cdn.com +ps2.ign.us.intellitxt.com +ps2.interpolls.com +ps3news.us.intellitxt.com +ps7894.com +pscore-beta.pixel.printsites.net +psfeed.qwapi.com +psialapka.pl +pso-imbot.inmobi.com +pso.inmobi.com +pso.ws.ev1.inmobi.com +psooz.tourstogo.us +psorias.atspace.com +psp.ign.us.intellitxt.com +psp3d.us.intellitxt.com +pspcave.uk.intellitxt.com +pstatic.datafastguru.info +pstats.blogworks.com +psx.ign.us.intellitxt.com +psy.mtree.com +psyduck-limiter-prod.snapads.com +psyduck-limiter-shadow.snapads.com +psyduck-limiter-staging.snapads.com +pt-gmtdmp.mookie1.com +pt.beststreams.club +pt.ispot.tv +pt.lijit.com +pt.peerius.com +pt.trafficjunky.net +pt21na.com +pt2tracker.com +pt5.titans-gel.net +ptads.sv.publicus.com +ptewh.iptvdeals.com +ptgame.eu +ptool.barginginfrance.net +ptrack.betaout.com +ptrads.mp3.com +ptreklam.com +ptreklam.com.tr +ptreklam.net +ptreklamcrv.com +ptreklamcrv.com.tr +ptreklamcrv.net +ptreklamssp.com +ptreklamssp.com.tr +ptreklamssp.net +pttsite.com +ptuph.barginginfrance.net +ptush.iptvdeals.com +pu.gcp.msas.media.net +pu.plugrush.com +pu.trafficshop.com +pub.automatad.com +pub.axiatraders.com +pub.chez.com +pub.clicksor.net +pub.club-internet.fr +pub.contextweb.com +pub.ftv-publicite.fr +pub.grandonmedia.com +pub.hardware.fr +pub.oxado.com +pub.pgssl.com +pub.realmedia.fr +pub.s50.exacttarget.com +pub.sapo.pt +pub.softonic.com +pub.sv2.biz +pub.weatherbug.com +pub.web.sapo.io +pub12.bravenet.com +pub13.bravenet.com +pub16.bravenet.com +pub17.bravenet.com +pub2.bravenet.com +pub23.bravenet.com +pub26.bravenet.com +pub27.bravenet.com +pub28.bravenet.com +pub29.bravenet.com +pub30.bravenet.com +pub31.bravenet.com +pub34.bravenet.com +pub39.bravenet.com +pub40.bravenet.com +pub42.bravenet.com +pub43.bravenet.com +pub45.bravenet.com +pub47.bravenet.com +pub49.bravenet.com +pub50.bravenet.com +pub7.bravenet.com +pub9.bravenet.com +pubaccess.advertising.com +pubads.g.doubleclick.net +pubdirecte.com +pubhelp.taboola.com +pubimgs.sapo.pt +publiads.com +public-analytics.us-east-1.prod.public.atl-paas.net +public-analytics.useast.atlassian.io +public.billing.master.postgres.mopub.com +public.fe.master.postgres.mopub.com +public.test.vilynx.com +public.vilynx.com +public2.zz.ha.cn +publicationsunbound.112.2o7.net +publicidad.adlead.com +publicidad.elmundo.es +publicidad.entelchile.net +publicidades.redtotalonline.com +publicidees.com +publicis.adcentriconline.com +publir-d.openx.net +publish.bonzaii.no +publisher-api.spotxchange.com +publisher-config.unityads.unity3d.com +publisher-reporting-api.fyber.com +publisher.advertising.com +publisher.lead.network +publisher.media.net +publisher.spotxchange.com +publisher.taboola.com +publisher.videmob.com +publisherhub.plaimedia.com +publishers-api.allinviews.com +publishers-new.allinviews.com +publishers.adasiaholdings.com +publishers.adscholar.com +publishers.allinviews.com +publishers.bidtraffic.com +publishers.brokertraffic.com +publishers.clickbooth.com +publishers.domainadvertising.com +publishers.media.net +publishers.yext.com +publishersummit.exponential.com +publishing.kalooga.com +pubmatic.com +pubocean.com +pubportal.advertising.com +pubpress.net +pubs.hiddennetwork.com +pubs.lemonde.fr +pubs.mgn.net +pubs2-asia.creativecdn.com +pubserver.xl.pt +pubshop.img.uol.com.br +pubsupport.yext.com +pubted.com +pubtools.spotxchange.com +pubx.ch +pudukkottai.in +puenteaereo.info +puffy-nipples-paradise.com +puffyloss.com +puffypull.com +puffypurpose.com +pug44000nf.pubmatic.com +pulharktheherald.112.2o7.net +puliquan.com +pulkauaiworld.112.2o7.net +pull-3045.kxcdn.com +pull.docker.adsrvr.org +pulley-qa.samplicio.us +pulley.samplicio.us +pulpantagraph.112.2o7.net +pulpeuses.net +pulse-uat.inmobi.com +pulse.boa.exacttarget.com +pulse.casalemedia.com +pulse.flurry.com +pulse.inmobi.com +pulse33.ru +pulseonclick.com +pulsepoint-platform.rtb.adx1.com +pulsix.com +pulso.butlerelectricsupply.com +pultheworldlink.112.2o7.net +pump.msas.media.net +pumpkin.brisik.net +pumpkin.co.uk +punchjump.us.intellitxt.com +punchsub.net +punishedgay.info +punkfuckers.com +punkrocksex.com +puntercentral.com +puoliso.info +puppet.aws.branch.io +puppetdb.aws.branch.io +puppy-dog.ru +puppytoob.us.intellitxt.com +purch.mgr.consensu.org +purchase.hut1.ru +purchasepillsnorx.com +pure.hitbox.com +pure.snippet-local.dev-sandbox.getambassador.com +pure.snippet-local.getambassador.com.sandbox.getambassador.com +pure.snippet-local.sandbox.getambassador.com +pureadexchange.com +puredildo.com +purefuck.com +puregoldxxx.com +pureleads.com +puremodels.info +pureplatinum.com.au +puresick.com +purethc.com +puretoons.com +purgecolon.net +purmovies.com +puroclean.com +purplesphere.in +purplestats.com +purredheanb.online +purryowl.com +puserving.com +push-ad.com +push-notification.tools +push.api.drift.com +push.docker.adsrvr.org +push.poptm.com +push.sumo.com +pushbank.services.adx1.com +pushdata.sendpulse.com +pushedwebnews.com +pushengage.com +pushno.com +pushpop.keen.io +pushspring.com +pussl10.com +pussl14.com +pussl16.com +pussl18.com +pussl2.com +pussl21.com +pussl22.com +pussl23.com +pussl26.com +pussl30.com +pussy-virgin.com +pussypool.com +pussypornos.nu +pussysaga.com +pussysowet.com +pussytakeout.com +pussytap.com +pussytsunami.com +pustoaice.erotic-place.org +putacasualidad.com +putags.com +putain.org +putana-moskva.ru +putariaonline.info +putas-xxx.net +putascubanas.com +putasgolfas.com +putasysexo.com +pute-porno.com +pute-salope.com +puteshestvennik.com +putevka24.ru +putitin.me +putlockers.ist +putrr10.com +putrr11.com +putrr12.com +putrr13.com +putrr14.com +putrr15.com +putrr16.com +putrr17.com +putrr18.com +putrr19.com +putrr20.com +putrr3.com +putrr5.com +putrr6.com +putrr7.com +putrr8.com +putrr9.com +putty.ch +puush.in +puzo2arbuza.ru +puzzleweb.ru +puzzlingfall.com +pv.wantsfly.com +pvypal.com +pw.cnzz.com +pwc.tidaltv.com +pweaatek.com +pwinsider.us.intellitxt.com +pwp.netcabo.pt +pwrfcia.com +pwvita.pl +pwwysydh.com +px-conf.perimeterx.net +px.adhigh.net +px.ads.linkedin.com +px.airpr.com +px.at.atwola.com +px.cdn.creative.medialytics.com +px.content-ad.net +px.dynamicyield.com +px.gfycat.com +px.moatads.com +px.owneriq.net +px.powerlinks.com +px.quantserve.com +px.sharethis.com +px.splittag.com +px.steelhousemedia.com +px.tvadsync.com +px1.papoto.com +px10.net +px1alsry.com +px2.papoto.com +px24.com +pxc.otto.de +pxcel.sharethis.com +pxhdwsm.com +pxi.pub +pxl.ace.advertising.com +pxl.adroll.com +pxl.adx1.com +pxl.connexity.net +pxl.ibpxl.com +pxl.pmsrvr.com +pxlgnpgecom-a.akamaihd.net +py1.midasplayer.com +py100.ru +pyas.net +pybul.bestfrozenporn.nl +pyna.in +pynio.pl +pypi.livefyre.com +pyq6n.com +pyracity.info +pyramidlitho.webs.com +pyrodesigns.com.au +pz21.pl +pzest.com +pzoifaum.info +q-moto.ru +q-venture.com +q.aa.online-metrix.net +q.admob.com +q.azcentral.com +q.b.h.cltomedia.info +q.zeroredirect.com +q1mediahydraplatform.com +q28840.nb.host127-0-0-1.com +qa-ads-ban.advertising.com +qa-ads-web.advertising.com +qa-adservices.cmp.advertising.com +qa-cdn.cmp.advertising.com +qa-dest.imprev.net +qa-ext.livefyre.com +qa-log.swrve.com +qa-moments.advertising.com +qa-tracker.marinsm.com +qa-uk.adlearnop.advertising.com +qa.ace.advertising.com +qa.api.curalate.com +qa.app.optimizely.com +qa.bladegame.midasplayer.com +qa.bnc.lt +qa.campaign.adobe.com +qa.cdn.survey.medallia.com +qa.conf.dco.advertising.com +qa.config.dco.advertising.com +qa.corp.mparticle.com +qa.curalate.com +qa.drift.com +qa.exacttarget.com +qa.extole.io +qa.franklyinc.com +qa.ftp.advertising.com +qa.imprev.net +qa.internal.curalate.com +qa.lijit.com +qa.midasplayer.com +qa.netmng.com +qa.ngm.franklyinc.com +qa.ops.curalate.com +qa.optimizely.com +qa.origin.craft.advertising.com +qa.pix.dco.advertising.com +qa.pixel.printsites.net +qa.rubiconproject.com +qa.srv.dco.advertising.com +qa.stats.webs.com +qa.syndicaster.tv +qa.tacoda.at.atwola.com +qa.traq.li +qa.us.rmcontent.advertising.com +qa.us.rmevent.advertising.com +qa.yieldmo.com +qa1.app.api.jivox.com +qa1.app.jivox.com +qa1.brb.api.jivox.com +qa1.exacttarget.com +qa1.pfa.gcp.datamind.ru +qa2-h-api.online-metrix.net +qa2.exacttarget.com +qa2.pfa.gcp.datamind.ru +qa20console.xtify.com +qa3.app.api.jivox.com +qa3.app.jivox.com +qa3.brb.api.jivox.com +qa3.exacttarget.com +qa3.pfa.gcp.datamind.ru +qa4.pfa.gcp.datamind.ru +qa5.app.api.jivox.com +qa5.app.jivox.com +qa5.brb.api.jivox.com +qaapi.ibm.xtify.com +qaconsole.ibm.xtify.com +qacupuzute.angelcities.com +qadynamics.marketo.com +qai-uk.adlearnop.advertising.com +qal-cx.foresee.com +qal-lb.foresee.com +qalab.com.au +qantasfly.com +qap.it +qaperf2-h-api.online-metrix.net +qaperf2-h.online-metrix.net +qauiab02autodev1.marketo.com +qaweb.thunderhead.com +qaykb.com +qazsex.com +qbittorrent.com +qbvwcrtsyur.bid +qc.5.p2l.info +qci.me +qcopnsmjo.bid +qcs-inc.com +qcstrtvt.bloger.index.hr +qctop.com +qcx.quantserve.com +qcxhpohiwawnmo.bid +qdae.com +qdx.it +qenabled.com +qikdownloads.com +qip.magna.ru +qip.ru +qitmall.com +qitrck.com +qitt.ru +qj.us.intellitxt.com +qjjto.com +qkie.com +qksrv.com +ql6.biz +qld10000.net +qlik-dev.ispot.tv +qlipso.checkm8.com +qlipsodigital.checkm8.com +qlog.adap.tv +qlzwfzfatjth.ru +qnko-kura-mi.poohthebear.com +qnsr.com +qoe-1.yottaa.net +qpmsybxqvlje.ru +qpodgladacz.glt.pl +qpqnbnsnosdss.com +qpypcx.com +qqhacks.net +qqlogo.qq.com +qqproxy.info +qrcdownload.ibcustomerzone.com +qring-tms.qq.com +qs.ivwbox.de +qs.wemfbox.ch +qss-client.qq.com +qtczaglj.bid +qto.reprintingstakeholder.com +quacksquirrel.com +quad-cleaner.com +quad-passion.zannuaire.com +quad.yadro.ru +quaintcan.com +qualifiedourspecialoffer.com +qualitop.com +quality-traffic.com +quality.gold +qualityair.bm +qualityamateurs.com +qualityindustrialcoatings.com +qualityinterracialmovies.com +qualityporn.biz +qualtrics.com +quangcaons.com +quantcast.com +quantcast.mgr.consensu.org +quantcast584928381.s.moatpixel.com +quantify.dev.paperg.com +quantify.prod.paperg.com +quantify.staging.paperg.com +quantserve.com +quantummetric.com +quantumwomanentrepreneur.com +quareclk.com +quark.plaimedia.com +quarkkeulchen.de +quarterbean.com +quarterserver.de +qubble.com +quckoemdypxoiq.bid +quebec-bin.com +quebec-franceteam.com +queenfacials.com +queenofzanzibar.com +queerspace.com +quelle.ru +query-165j91bg09ddqoru.petametrics.com +query-1nj2akm8j8to357c.petametrics.com +query-2mm073va85k9qv6f.petametrics.com +query-8rdn4098jn202336.petametrics.com +query-ensur7m1u4oompev.petametrics.com +query-eu-west-1.petametrics.com +query-europe-west1.petametrics.com +query-fb6cjraf9cejut2a.petametrics.com +query-gce.petametrics.com +query-lkdk9usg5av95fvs.petametrics.com +query-ofpar94pul5j6qhu.petametrics.com +query-r8klqv4fq0bp9ued.petametrics.com +query-us-east1.petametrics.com +query-us-west1.petametrics.com +query.fqtag.com +query.petametrics.com +query1.petametrics.com +questaffiliates.net +questdsgsupport.112.2o7.net +questiacom.112.2o7.net +question2answer.com +questionfly.com +questionmarque.ch +questraworld.es +questraworld.ru +questsoftware.112.2o7.net +questsoftware.sc.omtrdc.net +quick-decor-dz.com +quick-eye.pl +quick-offer.com +quick-seeker.com +quickbrowsersearch.com +quickbuck.com +quickcash-system.com +quickchange.cc +quickcreditscore.co.uk +quickfilmz.com +quickgreat.com +quickme.org +quickpayportaal.com +quickpwn.us.intellitxt.com +quicksandear.com +quicktrck.com +quickupdateserv.com +quietknowledge.com +quik-serv.com +quik2link.com +quiksearchgenealogy.com +quill.livefyre.com +quiltsr4u.com +quindecim.de +quinnwealth.com +quinst.com +quinstreet.us.intellitxt.com +quintana.impresionesweb.com +quirkycoolliving.com +quisesso.com +quisma.com +quixbar.com +quiz-fun.com.my +quizzicalzephyr.com +quizzitch.net +quizzstar.com +quo-vadimus.net +quoka-d.openx.net +quoo4ae.top +quoram.com +quotidiennokoue.com +quxcfcv5-ios.mobile-sdk-api.intercom.io +qveoxhidesgy.bid +qvjql3e.com +qvxgghoisvifyu.bid +qwapi.com +qwarckoine.com +qwas0.trackvoluum.com +qwebirc.swiftirc.net +qwer3.pl +qwertycoin.crypto-webminer.com +qwesa.ru +qwestfull.112.2o7.net +qwfwimquecfw.bid +qwgafzaujn.bid +qxqtejyqkypfz.bid +qxxru.linknotification.com +qy.corrmedic.ru +qz.informs.com +qzip.cjb.net +r-sec.casalemedia.com +r-ssl.casalemedia.com +r.254a.com +r.4at1.com +r.ace.advertising.com +r.ad6media.fr +r.adc-serv.net +r.admob.com +r.adrolays.de +r.adserver01.de +r.bat.bing.com +r.bid4keywords.com +r.casalemedia.com +r.chitika.net +r.clickdensity.com +r.dir.bg +r.dlx.addthis.com +r.domob.cn +r.edge.inmobicdn.net +r.eu-west-1.awstrack.me +r.fullstory.com +r.ibg.bg +r.ligatus.com +r.looksmart.com +r.mobpartner.mobi +r.nexac.com +r.offnews.bg +r.online-metrix.net +r.openx.net +r.refinedads.com +r.reklama.biz +r.remarketingpixel.com +r.rxthdr.com +r.skimresources.com +r.staging.fullstory.com +r.turn.com +r.turn.com.akadns.net +r.us-east-1.awstrack.me +r.us-west-2.awstrack.me +r.w.inmobi.com +r.xyz1.pl +r.yieldkit.com +r01.ibg.bg +r1-ads.ace.advertising.com +r1-t.trackedlink.net +r1.ace.advertising.com +r1.affiliatefuel.com +r1.literotica.com +r1.zedo.com +r1.zemanta.com +r18porn.com +r2.adwo.com +r3.gslb.ace.advertising.com +r5.dir.bg +r6---sn-5ualdne7.c.2mdn.net +r7mediar.com +r8nu86wg.me +r9accelerator.co.nz +raagjat.com +raahenseutu.jainos.fi +rabbit.adwyze.com +rabot.host.sk +rack.cryptaloot.pro +racktables.svc.insnw.net +rad.atdmt.com +rad.live.com +rad.msn.com +rad.rad.atdmt.com +radar.cedexis.com +radaronline.advertserve.com +radarurl.com +radiate.com +radioat.oewabox.at +radius.bandwidthx.net +rads.stackoverflow.com +rahulthehacker.tk +railsplitter-e2e.flurry.com +railsplitter-stg.flurry.com +railwayrainstorm.com +rainbow-geo-p.mythings.com +rainbow-uk.mythings.com +rainbow-us.mythings.com +rainbow.mythings.com +rainbow.topbucks.com +rainbowclub.hitbox.com +rainbowcolours.me.uk +rainbowedge.com +rainbowmedia.122.2o7.net +rakuten.112.2o7.net +rakuten.digitrust.mgr.consensu.org +rallyeair.com +ralphreed.com +rampagegramar.com +rampidads.com +ramsayandwellington.one-integration.ci.convertro.com +rancher.mgmt.us-east-1.kops.kargo.com +rand.com.ru +randevumads.com +randi.adswizz.com +randki-sex.com +randmcnally.112.2o7.net +raneevahijab.id +rank-checker.online +rank-master.com +rank-master.de +rankchamp.de +ranker.sc.omtrdc.net +ranker.springboardplatform.com +ranking-charts.de +ranking-hits.de +ranking-id.de +ranking-links.de +ranking-liste.de +rankingchart.de +rankingscout.com +rankmytattoos.us.intellitxt.com +ranks.boardtracker.com +ranks.sextracker.com +ranksays.com +ranksonic.info +rankyou.com +rantsports.us.intellitxt.com +rapax.it +rape-sex.nl +rapedpussy.com +rapefiles.nu +rapeforcedsex.com +rapein.com +rapeporn.biz +raperoom.com +rapesexfilmpjes.nl +rapesexlinks.nl +rapesexvideos.net +rapestar.com +rapetimes.com +rapevideosmovies.com +rapexxx.org +rapid-host.pl +rapidcounter.com +rapideo.pw +rapidgator-porn.ga +rapidkittens.com +rapidlyserv.com +rapidprototypeservice.com +rapidresponse.directtrack.com +rapidvideo.com +rapsubs.popunder.ru +raresummer.com +raskrutka.ucoz.com +rasmussenreports.us.intellitxt.com +rat-on-subway.mhwang.com +rata.ero-advertising.com +rate.opinionlab.com +rate.ru +ratemodels.net +ratings.lycos.com +ratingtoplist.com +ratkoqa.midasplayer.com +ratuj-swojego-laptopa.pl +ratujlaptopa.pl +ravel-rewardpath.com +ravm.tv +raw.github.exacttarget.com +raw.oggifinogi.com +rawoo.barginginfrance.net +rawstory.us.intellitxt.com +rayo.pereira.multi.net.co +rb-net.com +rb.adnxs.com +rb.burstway.com +rb.insightexpressai.com +rb.newsru.com +rb.revolvermaps.com +rb.theappgrader.com +rb1.design.ru +rbcgaru.hit.gemius.pl +rbk.netmng.com +rbkshort.info +rbl.ms +rbmods.se.intellitxt.com +rbp.emea.mxptint.net +rbp.mxptint.net +rbqip.pochta.ru +rbxfree.com +rc-app.optimizely.com +rc-au.imrworldwide.com +rc-studio.inmobi.com +rc.api.adx1.com +rc.app.optimizely.com +rc.asci.freenet.de +rc.bt.ilsemedia.nl +rc.de.adlink.net +rc.hotkeys.com +rc.revolvermaps.com +rc.rlcdn.com +rc.tr.blismedia.com +rc.wl.webads.nl +rc2.tr.blismedia.com +rcci.122.2o7.net +rccl.bridgetrack.com +rcdna.gwallet.com +rckymtnnws.112.2o7.net +rcm-cn.amazon-adsystem.com +rcm-eu.amazon-adsystem.com +rcm-fe.amazon-adsystem.com +rcm-images.amazon.com +rcm-it.amazon.it +rcm-na.amazon-adsystem.com +rcm.amazon.com +rcntelecom.112.2o7.net +rcom-staging.dynamicyield.com +rcom.dynamicyield.com +rcpmag.us.intellitxt.com +rctfgrazkha.ru +rd-direct.com +rd.alphabirdnetwork.com +rd.campaign.adobe.com +rd.clickshift.com +rd.intl.doubleclick.net +rd.revolvermaps.com +rd1.hitbox.com +rdb.adx1.com +rdp42mms.wavesecure.com +rdraff.com-app1.site +rdrs.ad-score.com +rdsa2012.com +rdsportal.adviserplus.com +re-directme.com +re-electshadqadri.com +re.directrev.com +re.kontera.com +re.revolvermaps.com +re.rutan.org +reacherinst.com +reachjunction.com +reachms.bfmio.com +reachspaces.adx1.com +reactads.cdn.adglare.net +reactads.com +reactads.engine.adglare.net +reactor.xtify.com +reactx.com +readersdigest.tt.omtrdc.net +readgoldfish.com +readheadstick.biz +readingguilt.com +readingopera.com +readserver.net +readyfile.pl +readymoon.com +readyupdate.thelatestmostreadytocontentgetnowfast.top +readywind.rtb.adx1.com +reagroup.122.2o7.net +real-app.date +real.sp.analytics.yahoo.com +realads.realmedia.com +realaudio.cimedia.net +realbannerads.com +realcastmedia.com +realclever.com +realclix.com +realcouponnow.com +realestate2.deshmedia.com +realgfsbucks.com +realgift.men +realitateadro.hit.gemius.pl +realitytea.us.intellitxt.com +realitytvmagazine.us.intellitxt.com +realizemobicom.com +realizmobi.com +realmedia-a592.d4p.net +realmedia-a800.d4p.net +realmedia.advance.net +realmedia.channel4.com +realmedia.nana.co.il +realnetwrk.com +realtechnetwork.com +realtime.crashlytics.com +realtime.deximedia.com +realtimeads.com +realtor.com.ssl.d2.sc.omtrdc.net +realtouchbannerwidget.aebn.net +realtracker.com +reaper.pulse.inmobi.com +reasedoper.pw +reauthenticator.com +rebelsubway.com +rebevengwas.com +reboot.sitescout.com +rebtelnetworks.112.2o7.net +rebuildxxsdrfght.yodelmobile.com +receive.inplay.scanscout.com +receptiveink.com +receptivereaction.com +recipeland.us.intellitxt.com +recl.kulinar.bg +reclamus.com +recommendation-hybrid.wpdigital.net +recommendation-newsletter.wpdigital.net +recommendation.algolia.com +recommendation.citrix.com +recommendedforyou.xyz +recommendedlab.com +recommender.scarabresearch.com +recommenderprodwestus.cloudapp.net +record.affiliatelounge.com +record.affiliates.karjalakasino.com +record.bonniergaming.com +record.commissionlounge.com +record.foresee.com +record.mrwin.com +recordeaglecom.112.2o7.net +recordnetcom.112.2o7.net +recordonlinecom.112.2o7.net +recreation-leisure-rewardpath.com +recruit.112.2o7.net +recruiting.adrizer.com +recruiting.shareasale.com +recs.richrelevance.com +rectangledownloads.com +red-js.github.io +red-page.com +red.as-eu.falkag.net +red.as-us.falkag.net +red.dmpxs.com +red01.as-eu.falkag.net +red01.as-us.falkag.net +red02.as-eu.falkag.net +red02.as-us.falkag.net +red03.as-eu.falkag.net +red03.as-us.falkag.net +red04.as-eu.falkag.net +red04.as-us.falkag.net +redbalcony.us.intellitxt.com +redbox.tt.omtrdc.net +redefine.hit.stat24.com +redefine2.hit.stat24.com +redemptionengine.com +redhat.sc.omtrdc.net +redherring.ngadcenter.net +redhotchilli.co.uk +redhotfreebies.co.uk +redir.adap.tv +redir.adsonar.com +redir.bebi.com +redir.juicyads.com +redirect.click2net.com +redirect.clickshield.net +redirect.ero-advertising.com +redirect.hotkeys.com +redirect.site50.net +redirect.todayreward.net +redirect.tracking202.com +redirect.trafficreceiver.club +redirect.xmlheads.com +redirectcpv.com +redirectingat.com +redirectlnk.redirectme.net +redirectme.net +redirects.coldhardcash.com +redirects.ero-advertising.com +redirectvoluum.com +redirectzone.com +redirlock.com +redlight.nu +redlightavenue.com +redlightranch.com +rednecksluts.com +rednise.com +redonetype.com +redrct.online +redroofing.com +redroomnetwork.com +redrunner.com +redsex.net +redsexo.org +redshell.io +redsheriff.com +redtigger.com +redtube.net.br +redtube7.com +redtubesexy.com +reducelant.com +reducelnk.com +reduxads.valuead.com +reduxmedia.com +redzon.com +reed-cw.grapeshot.co.uk +reelheroes.net +reelmovienews.us.intellitxt.com +reelwhirltv.proimageguide.com +reeyanaturopathy.com +ref-sexe.net +refads.pro +refer.ccbill.com +refer1.outster.com +refer100.outster.com +refer102.outster.com +refer20.outster.com +refer25.outster.com +refer46.outster.com +refer85.outster.com +referal.begun.ru +reference-x.com +reference.fyber.com +referencemoi.com +refererx.com +referral.supersonic.com +referral.topbucks.com +referral.vod.topbucks.com +referralware.com +referrer.disqus.com +refinance.shengen.ru +refinejmegahair.com.br +reflectivereward.com +refresh-js.bitbucket.io +refreshnerer27.info +refreshnerer27rb.info +refunding-server.wap.sh +refunevent.com +reg.coolsavings.com +reg11ster088.fanspage-confrim3.ml +regardens.info +regclean.software-phile.com +regcure.software-phile.com +regdefense.com +regflow.com +regie.espace-plus.net +regio.adlink.de +regionshop.biz +register-90.d3v-fanpag3.tk +register-acunt-fanpage89.suportconfrim76.ml +register.appsflyer.com +register.cinematrix.net +register.consensu.org +register.silverscreen.cc +registercom.122.2o7.net +registercom.tt.omtrdc.net +registratciya-v-moskve.ru +registry-clean-up.net +registry-cleaner.net +registry-cleaners-compared.com +registry-dev.svc.insnw.net +registry-error-cleaner.com +registry-internal.svc.insnw.net +registry-prod.svc.insnw.net +registry-stable.svc.insnw.net +registry.dev.fwmrm.net +registry.gitlab.gcp.datamind.ru +registrycleaner-reviews.net +registrycleaner.onlinedownloads.org +registrycleanerforvista.com +registrycleanerfree.blogspot.com +registrycleanerpro.net +registrycleanersreviewed.com +registrycleanertechnology.com +registrycleanertop.com +registrydefender.com +registrydomainservices.com +registryfix.com +registrysweeper.com +regme.pl +regnow.com +regrep.reclean.hop.clickbank.net +rehabretie.com +reichertgmbh.de +reico-hundenahrung.de +reife-frauen-nackt.thumblogger.com +reife-ladies.thumblogger.com +reimageplus.com +rein-federn.de +reinotransexual.com +reinvigorate.net +reisegruppen.com +reiselinksammlung.de +reisenburo.de +reishus.de +reiten-live.de +rek.adtotal.pl +rek.www.wp.pl +rek2.tascatlasa.com +reklam-1.com +reklam-adfries.rtb.adx1.com +reklam-adsiduous.rtb.adx1.com +reklam-one.com +reklam.arabul.com +reklam.ebiuniverse.com +reklam.memurlar.net +reklam.milliyet.com.tr +reklam.misli.com +reklam.mynet.com +reklam.rfsl.se +reklam.softreklam.com +reklam.star.com.tr +reklam.vogel.com.tr +reklam.yonlendir.com +reklama.botevgrad.com +reklama.mironet.cz +reklama.neg.bg +reklama.offmedia.bg +reklama.onet.pl +reklama.reflektor.cz +reklama.ve.lt +reklama.wisdom.bg +reklama1.ru +reklamagaci.com +reklamanet.net +reklamcsere.hu +reklame.unwired-i.net +reklamer.com.ua +reklamtrk.com +reklamuss.ru +reklamy.sfd.pl +rekoveryy1.recovery-fanpagee.tk +rekrutacja.zafriko.pl +relatable.top +relationshipqia.com +relatorioserasa.webcindario.com +relatos-porno.gxgm.com +relatos.us +relax.ru +relaxsearch.uphero.com +relay-ba.ads.httpool.com +relay-ba.toboads.com +relay-bg.ads.httpool.com +relay-bg.toboads.com +relay-cz.ads.httpool.com +relay-ks.ads.httpool.com +relay-mk.ads.httpool.com +relay-rs.ads.httpool.com +relay-si.toboads.com +relay.drawbrid.ge +relay.mobile.toboads.com +releases.backtrace.io +relenza.asian-flu-vaccine.com +relestar.com +relevantknowledge.com +relevanz10.de +relief-for-toe-nail-fungus.com +relmaxtop.com +rem.rezonmedia.eu +remarketingpixel.com +remax.devvm.imprev.net +remax.imprev.net +remax.qa-dest.imprev.net +remax.qa.imprev.net +remax.staging.imprev.net +remax.testcluster.imprev.net +remistrainew.club +remodelingonlinecom.112.2o7.net +remote-data.urbanairship.com +remote.demandbase.com +remote.extremereach.com +remote.vergic.com +remote.yodelmobile.com +remotead-internal.cnet.com +remotead.cnet.com +remotrk.com +removearrest.com +remox.com +rencohep.com +rencontreavenue.com +rencontres.france-pa.com +rencontrex.biz +render.github.exacttarget.com +rene.dev.adsttc.com +renewablewealth.com +renhertfo.com +renova.1.p2l.info +renovaremedlab.com.br +rentascoot.net +rentcom.112.2o7.net +rentcom.tt.omtrdc.net +rentehno.ru +rentfromart.com +rentszone.com +rep-am.com +rep-ibi.adtech.de +rep-ibi.adtechus.com +repair21.com +repapi-apac.web.analytics.yahoo.com +repapi-bg.web.analytics.yahoo.com +repapi-eu.web.analytics.yahoo.com +repapi-ono.web.analytics.yahoo.com +repapi-us.web.analytics.yahoo.com +repeatlogo.co.uk +replacement-windows.gloses.net +replay.outbrain.com +replica-watch.ru +replicaclub.ru +replicated.aca.bugsnag.appstore.a2z.com +replicated.firetv.bugsnag.appstore.a2z.com +reply.github.exacttarget.com +reply.s50.exacttarget.com +repo.thunderhead.com +report-ads-to.pubnation.com +report.adtech.de +report.broadcastpc.tv +report.footprintdns.com +report.mitsubishicars.com +report02.adtech.de +report02.adtech.fr +report02.adtech.us +reporter.adtech.de +reporter.adtech.fr +reporter.adtech.us +reporter001.adtech.de +reporter001.adtech.fr +reporter001.adtech.us +reportimage.adtech.de +reportimage.adtech.fr +reportimage.adtech.us +reporting-large.campaign-tracking-service.prod.paperg.com +reporting.aatkit.com +reporting.adtouchlabs.com +reporting.api.tappx.com +reporting.campaign-tracking-service.prod.paperg.com +reporting.campaign-tracking-service.staging.paperg.com +reporting.monarchads.com +reporting.p03.eloqua.com +reporting.p07.eloqua.com +reporting.qualtrics.com +reporting.secure.eloqua.com +reporting.singlefeed.com +reporting.www02.secure.eloqua.com +reportingsales.com +reports-apac.web.analytics.yahoo.com +reports-as.web.analytics.yahoo.com +reports-bg.web.analytics.yahoo.com +reports-ci.web.analytics.yahoo.com +reports-ono.web.analytics.yahoo.com +reports-portal.web.analytics.yahoo.com +reports.advertising.com +reports.crashlytics.com +reports.datamark.net +reports.dna.247realmedia.com +reports.extreme-dm.com +reports.inmobi.com +reports.jp.advertising.com +reports.leadnationmedia.com +reports.sem.advertising.com +reports.vizury.com +reports.web.analytics.yahoo.com +reports.wes.df.telemetry.microsoft.com +reports.zemanta.com +reportsharing.qa.campaign.adobe.com +reportx.web.analytics.yahoo.com +repostuj.push-ad.com +repression.at +reprise.com.tr +reptilien.ch +republer.com +republika.onet.pl +req.adsmogo.com +req.appads.com +req.franklyinc.com +req.startappservice.com +req.tidaltv.com +req1.appads.com +req2.appads.com +req3.appads.com +request-tracker.k8s-prod.fiksu.com +request-tracker.k8s-test.fiksu.com +request.api.cp.tune.com +rereddit.com +res.adplus.co.id +res.levexis.com +res.rbl.ms +res1.applovin.com +resanium.com +research.a.pxi.pub +research.vilynx.com +researchnow.co.uk +researchsucks.com +reseaux-telecoms.fr.intellitxt.com +reseller.hitbox.com +reseller.sexyads.com +resellerclub.com +resellers.nu +resellersrating.com +reservedoffers.club +reset-helm-tiller-rnd-gke-test.rnd.gcp.datamind.ru +resize.rbl.ms +resoltados.com +resolutekey.com +resolvethem.com +resolvingserver.com +resonantbrush.com +resource.inmobi.com +resources.adroll.com +resources.autopilothq.com +resources.aweber.com +resources.count.ly +resources.engagio.com +resources.eyereturn.com +resources.fiksu.com +resources.hitbox.com +resources.infolinks.com +resources.inmobi.com +resources.kiosked.com +resources.marketo.com +resources.presage.io +resources.tapjoy.com +resources.tenjin.com +responsecollector.247realmedia.com +responsive.viewbix.com +rest.agkn.com +rest.dynamicyield.com +rest.qa.exacttarget.com +rest.s50.exacttarget.com +restapi.boa.exacttarget.com +restapi.s50.exacttarget.com +restaurant-altes-theater.de +restaurant-symposion.de +restaurant-yagodka.ru +restaurant.viewsignage.com +restaurantcom.tt.omtrdc.net +restaureant.com +restof.ru +restorator-msk.ru +restore-pc.com +restoredchurchofgod.112.2o7.net +restoschinois.com +restricted.pl +resultadoselecciones2016.com +results.adworldmedia.com +results.cafefind.net +results.optimizely.com +resultshub-a.akamaihd.net +resume-help-queen.com +retadint.com +retailers-s.shopcurbside.com +retailers.shopcurbside.com +retailwith.com +retaraga.ru +retargeter.com +retargeting.bksn.se +retin-a.1.p2l.info +retracker.com +retratart.com +retreatia.com +retrocafe.se +retrogayporn.com +return.bs.domainnamesales.com +return.domainnamesales.com +return.uk.domainnamesales.com +returnpath.com +returnpath.eloqua.com +returnpath.net +reunion.tt.omtrdc.net +reunioncom.112.2o7.net +reuters-d.openx.net +rev.adip.ly +rev.avsforum.com +rev.lanistaads.com +revcontent.com +reveal.clearbit.com +revee.outbrain.com +revelations.trovus.co.uk +revenue.com +revenue.net +revenuedirect.com +revenuegateway.directtrack.com +reverse-mortgage-info.com +reverse.phone.check.sms13.de +reverselogistics.in +reversing.cc +reverso.refr.adgtw.orangeads.fr +revforecasting.advertising.com +review.yext.com +reviewboard.insnw.net +reviewcentrecom.skimlinks.com +reviewer.de +reviews.domainplayersclub.com +revistaelite.com +revistaindustria.com +revive.vkushti.tv +reviveads.faktor.bg +revolution.ign.us.intellitxt.com +revotrack.revotas.com +revsci.net +revsci.tvguide.com +revstats.com +reward-survey.net +rewardblvd.com +rewardhotspot.com +rewardpoll.com +rewardsflow.com +rewardsnow.co.uk +rewardszoneusa.com +rex.co.pl +rey3935.112.2o7.net +rezrezwhistler.112.2o7.net +rfihub.com.akadns.net +rfihub.net +rfv.pl +rg.revolvermaps.com +rg1.devvm.imprev.net +rg1.imprev.net +rg1.qa-dest.imprev.net +rg1.qa.imprev.net +rg1.staging.imprev.net +rg1.testcluster.imprev.net +rg2.devvm.imprev.net +rg2.imprev.net +rg2.qa-dest.imprev.net +rg2.qa.imprev.net +rg2.staging.imprev.net +rg2.testcluster.imprev.net +rh.adscale.de +rh.qq.com +rh.revolvermaps.com +rhads.sv.publicus.com +rhtag.com +ri.5.p2l.info +ri.clickability.com +ri.nuggad.net +ri.revolvermaps.com +riafinancial.d2.sc.omtrdc.net +ribcagebags.com +ric.info +ricaricheelettricheauto.com +ricebistrochicago.com +rich.qq.com +richard.ittest.33across.com +richaudience.mgr.consensu.org +richinvestmonitor.com +richmails.com +richmedia.yimg.com +richmedia247.com +richsportsmgmt.com +richstring.com +richwebmaster.com +rickey.us.intellitxt.com +rickparty.com +rickrolling.com +ridepush.com +rig.idg.no +rightmedia.net +rightstats.com +riju.ittest.33across.com +rilocia.info +rimi.org +rincondescargas.com +rineventrec.com +ringcentral.112.2o7.net +ringcentral.tt.omtrdc.net +ringhotel-reichenbach.de +ringieradro.hit.gemius.pl +ringieradrs.hit.gemius.pl +ringierag.112.2o7.net +ringierro.adocean.pl +ringierrs.adocean.pl +ringporno.com +ringsrecord.com +ringstedmodellerne.dk +ringsurf.us.intellitxt.com +ringtonegold.com +ringtonematcher.com +ringtonepartner.com +rinitis.com +rintindown.com +rintinwa.com +riotpoints.gamesject.com +riotpointscodes.info +riowebsites.com.br +ripom.com +riptownmedia.122.2o7.net +ripuli.net +rique.host.sk +rirakukan.sakura.ne.jp +riscorp.com +rise-media.ru +rishabh.co.in +riskpreventionsystems.com +riskymail4free.com +risparmiocasa.bz.it +riss.no +rita-g-busty-bombshell-babe-bares-all.blogomer.com +ritzykey.com +ritzysponge.com +rivalo.network +rivasearchpage.com +river-hunters.ru +rivera.co.id +riverdeep.112.2o7.net +rivisteporno.nu +rizfilm.com +rjig.com +rk.revolvermaps.com +rkcconsultants.com +rkdms.com +rl8vd.kikul.com +rlcdn.com +rle.ru +rlec-use.dynamicyield.com +rlgroup.me +rlp.qa-dest.imprev.net +rm-admin-demo.iovation.com +rm.inmobi.com +rm.tapuz.co.il +rmads.eu.msn.com +rmads.msn.com +rmawm7mw.top +rmbn.net +rmbn.ru +rmcdn.2mdn.net +rmcdn.f.2mdn.net +rmcv.us +rmd.atdmt.com +rmedia.adonnetwork.com +rmedia.boston.com +rmevent.advertising.com +rmgparcelforcecom.112.2o7.net +rmgroyalmailcom.112.2o7.net +rmm1u.checkm8.com +rmmembshxxtd.com +rmms.net.au +rms.admeta.com +rmsi.nuggad.net +rn-to-bsn.com +rnaenterprises.com +rnbdirt.us.intellitxt.com +rncgopcom.122.2o7.net +rnd-gke-test.rnd.gcp.datamind.ru +rnd-prisma-storage.rnd.gcp.datamind.ru +rndporn.com +rnews.focus-news.net +rngetek.com +ro.adocean.pl +ro.bbelements.com +ro.hit.gemius.pl +ro.search.etargetnet.com +ro1adro.hit.gemius.pl +ro1ro.adocean.pl +ro2.biz +roac-wagn.org +road-hogs.com +roadmap.prod.paperg.com +roalgames.com +roar.com +roaringcash.com +robe-de-soiree-fr.com +robie.it +robloxhack.pl +roboinside.me +robointel.com +robot-forex.biz +robot.royalcactus.com +robotreplay.com +robspornos.com +robtopol.in +rock-you-d.openx.net +rock.cryptaloot.pro +rock.cryptoloot.pro +rock.directprimal.com +rock.reauthenticator.com +rock.webmine.pro +rock2.authcaptcha.com +rock2.directprimal.com +rockabox.co +rocketadt.com +rocketadv.com +rocketadx.com +rocketspaceks.com +rockingclicks.com +rockma.se +rocks.io +rocksresort.com.au +rockstaenergy.com +rockyinstincts.com.au +rocnation.lisnr.com +rodale.d1.sc.omtrdc.net +rodania.be +roderoad.com.au +rodjebacken.se +rodoabc.pl +rodstewart.blackapplehost.com +roemerbad.ch +rogde.adocean.pl +rogervivierforsale.com +rohrbau-melle.de +roi.airpr.com +roi.bizible.com +roia.biz +roifmd.info +roiq-vice.ranker.com +rojakpot.us.intellitxt.com +rok.com.com +rokeyafabrics.com +roks.ua +roktb.adx1.com +rokus-tgy.hu +rolasato.com +rolaxia.com +roleforum.ru +rolemodelstreetteam.invasioncrew.com +roleplaymusic.com +roll123.com +rollbar.com +rollhands.adroll.com +rollizug.de +roma-kukareku.livejournal.com +romance-101.com +romdiscover.com +rome.specificclick.net +romepartners.com +romsigmed.ro +romtek.theappgrader.com +romulobrasil.com +romvarimarton.hu +ron.si +roneum.crypto-webminer.com +roofers.org.uk +roorbong.com +roosevelt.gjbig.com +roosterfirework.com +root--servers.org +root.adx1.com +root.dns.bz +rootbuzz.com +ropesta.com +ros-ctm.ru +rosalieeve.pl +rose.ixbt.com +roseandcrownhiston.com +rosebuds.allmanpages.com +rosemcgowan.nu +rosettastone.tt.omtrdc.net +roshanavar.com +roskatrack.roskadirect.com +rospromtest.ru +ross.starvingmillionaire.org +rossanasaavedra.net +rossel.mgr.consensu.org +rossettoedutra.com.br +rossmark.ru +rost-digital.de +rostov.xrus.org +rosy-girl.com +rot.ron.si +rot2.imoti.net +rotabanner.com +rotabanner.utro.ru +rotabanner100.utro.ru +rotabanner234.utro.ru +rotabanner468.utro.ru +rotaryalkemade.nl +rotaryd1650.org +rotate.infowars.com +rotation.affiliator.com +rotator.7x3.net +rotator.adjuggler.com +rotator.axiatraders.com +rotator.beginads.com +rotator.buzzclicks.com +rotator.juggler.inetinteractive.com +rotator.nbjmp.com +rotator.offpageads.com +rotator.tradetracker.net +rotator.tradetracker.nl +rotator.trafficstars.com +rotgerinc.com +rotobanner468.utro.ru +rotor6.newzfind.com +rottenwhorememe.cf +rotumal.com +rotvast.nl +roughroll.com +roulette-online.petrovka.info +roulettenumber.com +route.carambo.la +router.adlure.net +router.googlecom.biz +rove.cl +rovion.com +rowanmclean.com +rowherthat.ru +roxio.112.2o7.net +roxr.net +rp-online.met.vgwort.de +rp.gwallet.com +rp.hit.gemius.pl +rp.zemanta.com +rpc-php.trafficfactory.biz +rpc-tapjoy-com-lb-1378811527.us-east-1.elb.amazonaws.com +rpc.ant.com +rpc.tapjoy.com +rpc.trafficfactory.biz +rpg.us.intellitxt.com +rpm-instart.newrelic.com +rpm.newrelisc.com +rpm.syndicaster.tv +rpm2.syndicaster.tv +rpmdo.com +rpnyanc01.corp.returnpath.net +rpt.anchorfree.net +rpt.atdmt.com +rpt.footlocker.com +rpt.rad.atdmt.com +rptrcks.walmart.com +rq.adfox.ru +rq.adtrackdirect.com +rq.trackingadirect.com +rqtrk.eu +rr1.outster.com +rr1.xxxcounter.com +rr2.xxxcounter.com +rr3.xxxcounter.com +rr4.xxxcounter.com +rr5.xxxcounter.com +rr7.xxxcounter.com +rrpartners.122.2o7.net +rs-staticart.ybcdn.net +rs.adocean.pl +rs.ero-advertising.com +rs.gwallet.com +rs.instantservice.com +rs.search.etargetnet.com +rs.static.etargetnet.com +rs1.qq.com +rs2.ero-advertising.com +rs2.qq.com +rsc.scmspain.com +rscdn.cxense.com +rscounter10.com +rsense-ad.realclick.co.kr +rsgde.adocean.pl +rsiuk.co.uk +rss.buysellads.com +rsscloud.zemanta.com +rt.applicationinsights.microsoft.com +rt.applovin.com +rt.globalmailer.com +rt.liftdna.com +rt.udmserve.net +rt.visilabs.com +rt2.infolinks.com +rt3.infolinks.com +rta.auth.mparticle.com +rta.dailymail.co.uk +rta.pubocean.com +rtab.adx1.com +rtax.criteo.com +rtb-ads.avazu.net +rtb-adsterra.flshtrk.store +rtb-csync.smartadserver.com +rtb-lb-event-iad-1a-tm.everesttech.net +rtb-lb-event-sjc.tubemogul.com +rtb-lb1.impresionesweb.com +rtb-lbdns.impresionesweb.com +rtb-us.impresionesweb.com +rtb-useast.kobenetwork.com +rtb.adx1.com +rtb.ak-is.net +rtb.districtm.io +rtb.gcp.msas.media.net +rtb.gumgum.com +rtb.infinity.blismedia.com +rtb.metrigo.com +rtb.msas.media.net +rtb.nativeads.com +rtb.pclick.yahoo.com +rtb.tubemogul.com +rtb1.adscience.nl +rtb1.impresionesweb.com +rtb10.adscience.nl +rtb10.impresionesweb.com +rtb11.adscience.nl +rtb11.impresionesweb.com +rtb12.adscience.nl +rtb12.impresionesweb.com +rtb13.adscience.nl +rtb13.impresionesweb.com +rtb14.adscience.nl +rtb14.impresionesweb.com +rtb15.adscience.nl +rtb15.impresionesweb.com +rtb16.adscience.nl +rtb16.impresionesweb.com +rtb17.adscience.nl +rtb17.impresionesweb.com +rtb18.adscience.nl +rtb18.impresionesweb.com +rtb19.adscience.nl +rtb19.impresionesweb.com +rtb2.adscience.nl +rtb2.impresionesweb.com +rtb20.adscience.nl +rtb20.impresionesweb.com +rtb21.adscience.nl +rtb21.impresionesweb.com +rtb22.adscience.nl +rtb22.impresionesweb.com +rtb23.adscience.nl +rtb23.impresionesweb.com +rtb24.adscience.nl +rtb24.impresionesweb.com +rtb25.adscience.nl +rtb25.impresionesweb.com +rtb26.adscience.nl +rtb26.impresionesweb.com +rtb27.adscience.nl +rtb28.adscience.nl +rtb29.adscience.nl +rtb3.adscience.nl +rtb3.doubleverify.com +rtb3.impresionesweb.com +rtb30.adscience.nl +rtb4.adscience.nl +rtb4.impresionesweb.com +rtb5.adscience.nl +rtb5.impresionesweb.com +rtb6.adscience.nl +rtb6.impresionesweb.com +rtb7.adscience.nl +rtb7.impresionesweb.com +rtb8.adscience.nl +rtb8.impresionesweb.com +rtb9.adscience.nl +rtb9.impresionesweb.com +rtbc-waardex.rtb.adx1.com +rtbcaptain-republer-banner.rtb.adx1.com +rtbcc.fyber.com +rtbcdn.doubleverify.com +rtbdash.impresionesweb.com +rtbdev4.alphonso.tv +rtbdsp.inmobi.com +rtbhouse.mgr.consensu.org +rtblbtr.alphonso.tv +rtbpop.com +rtbpopd.com +rtbproxy.mgid.com +rtc.romdiscover.com +rtd-tm.everesttech.net +rtd.tubemogul.com +rte-img.nuseek.com +rtk.io +rtl.ivwbox.de +rtl.oewabox.at +rtmark.net +rtr.innovid.com +rtrgt2.com +rtrx.innovid.com +rts.contextweb.com +rts.doublepimp.com +rts.pgmediaserve.com +rts.phn.doublepimp.com +rts.revfusion.net +rts.sparkstudios.com +rtst.122.2o7.net +rtv-delta.com +rtvagdpro.net +rtve.d1.sc.omtrdc.net +rtw.monerise.com +ru-traffic.com +ru.bbelements.com +ru.redtram.com +ru.theswiftones.com +ru.velti.com +ru.wix.com +ru2.hit.stat24.com +ru4.com +rubanners.com +rubi4edit.com +rubibid.rubiconproject.com +rubiccrum.com +rubiconproject.com +rubiconproject.dyns.net +rubiconproject.us +rubiks.ca +rubriccrumb.com +rubyfortune.com +rubylan.net +rubytag.net +ruclicks.com +rudy.adsnative.com +ruemedia.adspirit.net +rufex.ajfingenieros.cl +ruiyangcn.com +rulerabbit.com +rules.atgsvcs.com +rules.quantcount.com +rules.securestudies.com +ruletka-systemy.com +ruletkasystem.eu +rum-collector-2.pingdom.net +rum-collector.pingdom.net +rum-collector.wpm.neustar.biz +rum-static-2.pingdom.net +rum-static.pingdom.net +rum.conde.io +rum.optimizely.com +rum.perfops.net +rumcollector-lb-304223083.us-east-1.elb.amazonaws.com +rumds.wpdigital.net +rumog.frost-electric-supply.com +rumorfix.us.intellitxt.com +run.admost.com +run.adrizer.com +runads.com +runcpa.com +rundeck.bi.fyber.com +rundeck.dynamicyield.com +rundeck.outbrain.com +rundsp.com +runslin.com +runtime.lemonpi.io +rupor.info +ruptly-d.openx.net +rusads.toysrus.com +ruspolice.com +ruspolice.net +russ-shalavy.ru +russian-sex.com +ruthlessrobin.com +rutrk.org +ruvuryua.ru +rv-gateway.supersonicads.com +rv.adcpx.v1.de.eusem.adaos-ads.net +rv.furaffinity.net +rw-ip-yieldmo-com-1332066544.us-east-1.elb.amazonaws.com +rw.devvm.imprev.net +rw.imprev.net +rw.qa-dest.imprev.net +rw.qa.imprev.net +rw.staging.imprev.net +rw.testcluster.imprev.net +rw.yieldmo.com +rw1.marchex.io +rw13q.adx1.com +rx8club.us.intellitxt.com +rxr.ravm.tv +rxthdr.com +ry.znvzzptgblovers.download +rya.rockyou.com +ryanrhodes.net +rydium.us.intellitxt.com +ryke4peep.com +rzeczyzadarmo.pl +rzte.adj.st +s-39.predictvideo.com +s-41.algovid.com +s-adobeanalytics.vice.com +s-adserver.cxad.cxense.com +s-adserver.sandbox.cxad.cxense.com +s-beta-opf.amazon-adsystem.com +s-beta.amazon-adsystem.com +s-et-rc-w.inmobi.com +s-et.w.inmobi.com +s-eu.btstatic.com +s-files.innovid.com +s-iwantyou.com +s-mail02.eloqua.com +s-static.innovid.com +s-usweb.dotomi.com +s.206ads.com +s.206solutions.com +s.6sc.co +s.ad121m.com +s.ad131m.com +s.adexpert.cz +s.adframesrc.com +s.admathhd.com +s.admob.com +s.admulti.com +s.adnxtr.com +s.adroll.com +s.ads-twitter.com +s.advertiserurl.com +s.agentanalytics.com +s.amazon-adsystem.com +s.analytics.blue +s.analytics.yahoo.com +s.arclk.net +s.as-us.falkag.net +s.atemda.com +s.ato.mx +s.baidu.com +s.boom.ro +s.btstatic.com +s.c.jwpltx.com +s.clickability.com +s.clicktale.net +s.cxt.ms +s.di.com.pl +s.domob.cn +s.dpmsrv.com +s.dynad.net +s.effectivemeasure.net +s.ero-advertising.com +s.estat.com +s.flite.com +s.fqtag.com +s.fwmrm.net +s.go-mpulse.net +s.ibotta.com +s.idio.co +s.innovid.com +s.ivillage.us.intellitxt.com +s.jpush.cn +s.jsrdn.com +s.jwpltx.com +s.ktxtr.com +s.media-imdb.com +s.megaclick.com +s.ml-attr.com +s.moatads.com +s.mobclix.com +s.mopub.com +s.n.jwpltx.com +s.ntv.io +s.oroll.com +s.pixsrvcs.com +s.ppjol.net +s.pubmine.com +s.rev2pub.com +s.sa.aol.com +s.shopify.com +s.skimresources.com +s.spoutable.com +s.statistici.ro +s.stats.wordpress.com +s.tagsrvcs.com +s.tcimg.com +s.thebrighttag.com +s.tribalfusion.com +s.tyxo.com +s.uadx.com +s.update.3lift.com +s.update.adroll.com +s.update.adsrvr.org +s.update.altitude-arena.com +s.update.clrstm.com +s.update.contextweb.com +s.update.criteo.com +s.update.ib.adnxs.com +s.update.mopub.com +s.update.morgdog.springserve.com +s.update.rubiconproject.com +s.update.spotxchange.com +s.update.tidaltv.com +s.update.wo.gumgum.com +s.update.wtag.adaptv.advertising.com +s.visilabs.com +s.visilabs.net +s.webtrends.com +s.youtube.com +s.zeroredirect.com +s.zkcdn.net +s0.2mdn.net +s001.monerise.com +s002.monerise.com +s003.monerise.com +s003.papoto.com +s01-delivery.addynamo.net +s01.delivery.addynamo.com +s01.flagcounter.com +s01.vidtod.me +s01.vidtodo.pro +s02.flagcounter.com +s02.vidtod.me +s03.flagcounter.com +s04.flagcounter.com +s05.flagcounter.com +s06.flagcounter.com +s07.flagcounter.com +s08.flagcounter.com +s09.flagcounter.com +s0b.bluestreak.com +s1-tracking.adalyser.com +s1.2mdn.net +s1.adform.net +s1.b1-prv.qualtrics.com +s1.buysellads.com +s1.cnzz.com +s1.cz.adocean.pl +s1.czgde.adocean.pl +s1.edipresse.adocean.pl +s1.exacttarget.com +s1.fanbread.com +s1.g1-iad.qualtrics.com +s1.gratkapl.adocean.pl +s1.hit.stat.pl +s1.hit.stat24.com +s1.hqq.tv +s1.inviziads.com +s1.listrakbi.com +s1.my.adocean.pl +s1.myao.adocean.pl +s1.pracuj.adocean.pl +s1.qa1.exacttarget.com +s1.qa2.exacttarget.com +s1.qa3.exacttarget.com +s1.qa5.exacttarget.com +s1.rotaban.ru +s1.shinystat.com +s1.shinystat.it +s1.sk.adocean.pl +s1.skgde.adocean.pl +s1.st3.qualtrics.com +s1.thecounter.com +s1.tribl.io +s1.vidtod.me +s10.cnzz.com +s10.exacttarget.com +s10.flagcounter.com +s10.hiadspaces.ero-advertising.com +s10.hipaces.ero-advertising.com +s10.his.ero-advertising.com +s10.hispaces.ero-advertising.com +s10.histas.ero-advertising.com +s10.histats.com +s10.histats.com.ero-advertising.com +s10.sitemeter.com +s100.exacttarget.com +s101.cnzz.com +s102.cnzz.com +s103.cnzz.com +s105.cnzz.com +s106.cnzz.com +s108.cnzz.com +s109.cnzz.com +s10paces.ero-advertising.com +s11.cnzz.com +s11.exacttarget.com +s11.flagcounter.com +s11.histats.com +s11.sitemeter.com +s110.cnzz.com +s111.cnzz.com +s112.cnzz.com +s113.cnzz.com +s115.cnzz.com +s116.cnzz.com +s118.cnzz.com +s1184.t.eloqua.com +s12.cnzz.com +s12.sitemeter.com +s12.urbaninsight.com +s120.cnzz.com +s128.histats.com +s129js.histats.com +s13.cnzz.com +s13.sitemeter.com +s130.cnzz.com +s131.cnzz.com +s132.cnzz.com +s1325.t.eloqua.com +s137.cnzz.com +s14.cnzz.com +s14.sitemeter.com +s14.urbaninsight.com +s1415903351.t.eloqua.com +s142.cnzz.com +s1471.t.eloqua.com +s1481.t.eloqua.com +s15.cnzz.com +s15.sitemeter.com +s1516.t.eloqua.com +s1516.t.en25.com +s16.cnzz.com +s16.sitemeter.com +s17.sitemeter.com +s18.cnzz.com +s18.sitemeter.com +s19.cnzz.com +s19.sitemeter.com +s1a.dynamicyield.com +s2-test.go-mpulse.net +s2.analytics.blue +s2.appelamule.com +s2.buysellads.com +s2.fanbread.com +s2.flowplayer.space +s2.go-mpulse.net +s2.hit.stat.pl +s2.hit.stat24.com +s2.hqq.tv +s2.login-qa2.exacttarget.com +s2.myregeneaf.com +s2.play.estream.nu +s2.play.estream.to +s2.play.estream.xyz +s2.play.tainiesonline.pw +s2.play.vidzi.tv +s2.play1.videos.videos.vidto.me +s2.play1.videos.vidto.me +s2.qa1.exacttarget.com +s2.qa2.exacttarget.com +s2.qa3.exacttarget.com +s2.shinystat.com +s2.shinystat.it +s2.soodatmish.com +s2.statcounter.com +s2.thersprens.com +s2.tracemyip.org +s2.trafficmaxx.de +s2.tribl.io +s2.video.doubleclick.net +s2.video.estream.nu +s2.video2.stream.vidzi.tv +s2.videos.videos.vidto.me +s2.videos.vidto.me +s2.vidtod.me +s2.web.flashx.co +s2.wm.yololike.space +s2.youtube.com +s20.cnzz.com +s20.sitemeter.com +s21.sitemeter.com +s212.ucoz.net +s2150.t.eloqua.com +s22.cnzz.com +s22.sitemeter.com +s23.cnzz.com +s23.crypto-loot.com +s23.sitemeter.com +s24.cnzz.com +s24.sitemeter.com +s248.meetrics.net +s25.sitemeter.com +s26.cnzz.com +s26.sitemeter.com +s27.sitemeter.com +s28.cnzz.com +s28.sitemeter.com +s282.meetrics.net +s29.cnzz.com +s29.sitemeter.com +s290.mxcdn.net +s2d6.com +s2p.estream.to +s2s.ae1.mparticle.com +s2s.eu1.mparticle.com +s2s.lfstmedia.com +s2s.mparticle.com +s2s.msas.media.net +s2s.prebid.org +s2trade.mtxcapital.com +s3.adbers.com +s3.addthis.com +s3.analytics.blue +s3.buysellads.com +s3.cnzz.com +s3.crypto-webminer.com +s3.flowplayer.space +s3.gasolina.ml +s3.hit.stat.pl +s3.hit.stat24.com +s3.malictuiar.com +s3.minexmr.com +s3.myregeneaf.com +s3.pageranktop.com +s3.pampopholf.com +s3.phluant.com +s3.play.estream.nu +s3.play.estream.to +s3.play.estream.xyz +s3.play.tainiesonline.pw +s3.play.vidzi.tv +s3.play1.videos.videos.vidto.me +s3.play1.videos.vidto.me +s3.shinystat.com +s3.shinystat.it +s3.thersprens.com +s3.trafficmaxx.de +s3.video.estream.nu +s3.video2.stream.vidzi.tv +s3.videos.videos.vidto.me +s3.videos.vidto.me +s3.vidtod.me +s3.web.flashx.co +s3.wm.yololike.space +s30.cnzz.com +s30.sitemeter.com +s300.meetrics.net +s3015.t.eloqua.com +s31.sitemeter.com +s32.bilsay.com +s32.research.de.com +s32.sitemeter.com +s323.t.eloqua.com +s33.cnzz.com +s33.sitemeter.com +s34.cnzz.com +s34.sitemeter.com +s35.sitemeter.com +s36.sitemeter.com +s37.cnzz.com +s37.sitemeter.com +s38.cnzz.com +s38.sitemeter.com +s39.sitemeter.com +s3p.estream.to +s4.cnzz.com +s4.exacttarget.com +s4.histats.com +s4.hit.stat.pl +s4.hit.stat24.com +s4.shinystat.com +s4.shinystat.it +s41.sitemeter.com +s42.cpmaffiliation.com +s42.sitemeter.com +s43.sitemeter.com +s44.sitemeter.com +s45.sitemeter.com +s46.sitemeter.com +s47.cnzz.com +s47.sitemeter.com +s48.cnzz.com +s48.sitemeter.com +s4d.in +s4is.histats.com +s4le.net +s4udash2.alphonso.tv +s5.addthis.com +s5.cnzz.com +s5.exacttarget.com +s5.spn.ee +s50.cnzz.com +s50.exacttarget.com +s50.login.exacttarget.com +s51.cnzz.com +s54.cnzz.com +s55.cnzz.com +s6-pixel.c1exchange.com +s6.exacttarget.com +s6.lebenna.com +s61.cnzz.com +s62.cnzz.com +s62.research.de.com +s63.cnzz.com +s65.cnzz.com +s66.cnzz.com +s68.cnzz.com +s69.cnzz.com +s7.adaces.ero-advertising.com +s7.addthis.com +s7.cnzz.com +s7.exacttarget.com +s70.cnzz.com +s76.cnzz.com +s7clean.com +s7ven.com +s8.cnzz.com +s8.exacttarget.com +s80.cnzz.com +s83.cnzz.com +s84.cnzz.com +s85.cnzz.com +s88.cnzz.com +s89.cnzz.com +s9.addthis.com +s9.cnzz.com +s9.shinystat.com +s91.exacttarget.com +s92.cnzz.com +s94.cnzz.com +s95.cnzz.com +s99.cnzz.com +s9kkremkr0.com +sa.aol.com.122.2o7.net +sa.bbc.co.uk +sa.entireweb.com +sa.hlserve.com +sa.jumptap.com +sa.monerise.com +sa.scorecardresearch.com +sa1.ipon.lt +sa144gl.wpc.thetacdn.net +sa2.ipon.lt +sa21gl.adn.thetacdn.net +sa230gl.wpc.thetacdn.net +sa314gl.wpc.thetacdn.net +sa386gl.wpc.thetacdn.net +saa.cbsi.com +saas.appdynamics.com +saas.webmine.pro +saastest.appdynamics.com +sacdcad01.salon.com +sacdcad02.salon.com +sacdcad03.salon.com +sacredphoenix.com +sact.atdmt.com +sad.sharethis.com +sade-ecrivain.com +sadiqtv.com +saemark.is +safari-critical-alert.com +safaribooks.112.2o7.net +safe-es.imrworldwide.com +safe.bestapps.com-protection.info +safe.hyperpaysys.com +safebrowse.com +safedownloadcenter.com +safedownloadsrus166.com +safelink.staging.airfind.com +safelinkconverter.com +safelinking.net +safemobilelink.com +safenyplanet.in +safepay2.interactivebrands.com +safepccleaner.com +safety.amw.com +sag7.adx1.com +sageanalyst.net +sagedigital.checkm8.com +sagent.io +sai-ascenseurs.fr +sail-horizon.com +sailor-moon.biz +saitevpatorii.com +sajatvelemeny.com +saksfifthavenue.122.2o7.net +sal.aws.branch.io +salamaleyum.com +salasexo.com +sale-japan.com +sales-cloud.com +sales-express.eu +sales-link.dynamicyield.com +sales-live-events1.use.dynamicyield.com +sales.mparticle.com +sales.outbrain.com +salescandidate.atom.adjust.com +salesforce.122.2o7.net +salesforcecom.tt.omtrdc.net +saletool.ru +saligopasr.com +salle.biz +salliemaecom.112.2o7.net +salmonfishingsacramentoriver.com +saloboy.popunder.ru +salon77.co.uk +salonbelladonnaandspa.com +salonlimalimon.com +salonspasakura.ru +salope-soumise.com +saltysailer.com +salutmontreal.com +salzburg.oewabox.at +sam.snapads.com +samaclub.com +saml.backtrace.io +saml00.backtrace.io +saml01.backtrace.io +saml02.backtrace.io +sammys-world.com +sammyweaver.com +samo-soznanie.ru +samoiedo.it +samolet.fr +sample.adthrive.com +sampleapp.appdynamics.com +sampleletters.net +samplicio.us +samsaracorbett.com +samsclub.112.2o7.net +samsclub33.pochta.ru +samsung-win-1k.com +samsung-win-2k.com +samsung-win-3k.com +samsung.flip.phone.sms13.de +samsung.insnw.net +samsung.usb.sms13.de +samsung3.solution.weborama.fr +samsungacr.com +samsungads.com +samtrack1.com +samvaulter.com +san.casalemedia.com +san.coremetrics.com +san.fyber.com +sana.newsinc.com +sanalreklam.com +sanalytics.verizonwireless.com +sanatorioesperanza.com.ar +sanatorrii.ru +sand.api.adnxs.com +sandbox-hzeu-rtb-3.datamind.ru +sandbox.adswizz.com +sandbox.agkn.com +sandbox.ia.thunderhead.com +sandbox.keen.io +sandbox53.localytics.com +sandfish.com +sandhillsonline.com +sandiegosecuritiesattorney.com +sandra.stone.sms13.de +saniceramics.com +sanimex.com +sanjosecatreeservice.com +sankakustatic.com +sankt-peterburg.nodup.ru +sanluisobispowineclubs.com +sanmartin-tr.com.br +sansetrevu.com +sansil.eu +sansungpromotions.com +santacatalina.org.pe +santacruzsentinel.112.2o7.net +santacruzsentinelcom.112.2o7.net +santacruzsuspension.com +santacruzvillage.com +santander-cadastro.ga +sante-habitat.org +santechnik.jimdo.com +santissimo.it +santosemota.com +santosis.zeeblo.com +sanya.vipc2f.com +sanyuprojects.com +sapato01.webtrekk.net +sapatoru.widget.criteo.com +sapi.zemanta.com +sapphireerotica.com +sarae.se +sarafangel.ru +sarah.dntrx.com +sarahcams.com +sarahdaniella.com +sarahswebsite.com +sarajay.info +saralaska.org +saratov.xrus.org +sardahcollege.edu.bd +sardinie.us +sarf3omlat.com +sarmangroup.com +sas.decisionnews.com +sascentral.com +sascu.org +sasdiskcleaner.com +sashablonde.info +sashagreyblog.ga +saskiasteele.net +sass.cryptaloot.pro +sass.cryptoloot.pro +sass.directprimal.com +sass.webmine.pro +sass2.authcaptcha.com +sass2.directprimal.com +sasson-cpa.co.il +sassynslim.com +sat-city-ads.com +sat.scoutanalytics.com +satact.com +satanbabes.com +satelitni-technika.cz +satellite.phone.price.sms13.de +satgurun.com +sativasluts.com +satpix.de +saturn.appads.com +saturn.tiser.com.au +saturn1.appads.com +saturn2.appads.com +saturn3.appads.com +saturncoffee.com +satyriasis.net +saugatuck.com +savageteens.com +save-plan.com +save-your-pc.info +savefrom.com +saveindex.xyz +savemanny.us.intellitxt.com +savings-specials.com +savings-time.com +savings2phone.siliconorchard.com +savvyads.com +saxobutlereagle.122.2o7.net +saxoconcordmonitor.122.2o7.net +saxoeverett.122.2o7.net +saxofosters.122.2o7.net +saxogoerie.122.2o7.net +saxogreensboro.122.2o7.net +saxoorklamedia.122.2o7.net +saxopeninsuladailynews.122.2o7.net +saxorutland.122.2o7.net +saxosumteritem.122.2o7.net +saxotech.122.2o7.net +saxotechtylerpaper.122.2o7.net +saxotelegraph.122.2o7.net +saxotoledo.122.2o7.net +saxounionleader.112.2o7.net +saxowatertowndailytimes.122.2o7.net +saxowenworld.122.2o7.net +saxowesterncommunications.122.2o7.net +saxp.zedo.com +sayac.hurriyet.com.tr +sayac.onlinewebstat.com +sayac.onlinewebstats.com +sayfabulunamadi.com +sayhello.popunder.ru +sayherbal.com +saymedia-d.openx.net +saysidewalk.com +sazadubo48.bid +sb.freeskreen.com +sb.monetate.net +sb.scorecardresearch.com +sb.scorecardresearch.com.edgekey.net +sb.voicefive.com +sb1.aws.fwmrm.net +sb2.monetate.net +sbhmn-miner.com +sbnationbidder-d.openx.net +sbnc.hak.su +sbsblukgov.112.2o7.net +sbx.pagesjaunes.fr +sbx1.2o7.net +sc-analytics.appspot.com +sc-forbes.forbes.com +sc-spyware.com +sc.5.p2l.info +sc.independent.co.uk +sc.intellitxt.com +sc.omtrdc.net +sc.vmware.com +sc1.admob.com +sc10.net +sc21.pl +sc9.admob.com +scaler.rtb.adx1.com +scaleway.ovh +scambiobanner.altervista.org +scambiobanner.aruba.it +scan.antispyware-free-scanner.com +scaner-figy.tk +scaner-or.tk +scaner-sbite.tk +scaner-sboom.tk +scanner.best-click-av1.info +scanner.best-protect.info +scannet.ads.scanapps.com +scanscout.com +scanspyware.net +scanty.colormark.cl +scanwith.us.intellitxt.com +scarcesign.com +scarcestream.com +scatteredheat.com +scc.ssacdn.com +scd.ingest.at.atwola.com +scdn.cxense.com +scdn.mm.atwola.com +scdn.uc.atwola.com +scdown.qq.com +scdsfdfgdr12.tk +scenicmissouri.us +schaeffers.112.2o7.net +scheduler.foresee.com +scheduler.maxpoint.com +schemas.microsoft.akadns.net +schlager.oewabox.at +schoorsteen.geenstijl.nl +schuelvz.ivwbox.de +schumacher.adtech.de +schumacher.adtech.fr +schumacher.adtech.us +schwab.demdex.net +schwab.tt.omtrdc.net +sci.intuit.com +sciamcom.112.2o7.net +sciamglobal.112.2o7.net +scienceworldreport.us.intellitxt.com +scintillatingscissors.com +scintillatingspace.com +sclk.org +scmetrics.exacttarget.com +scnt.rambler.ru +scomcluster.cxense.com +sconsentit9.trafficmanager.net +sconsentit903.cloudapp.net +sconsentit904.cloudapp.net +sconsentit910.cloudapp.net +scopelight.com +score.zeroclickfraud.com +scorecardresearch.com +scorecardresearch.com.edgekey.net +scoremygift.com +scorepconline.club +scottishstuff-online.com +scottrade.112.2o7.net +scounter.rambler.ru +scout-cdn.salesloft.com +scout.salesloft.netdna-cdn.com +scout.scoutanalytics.net +scout24.wemfbox.ch +scpweb.s1.exacttarget.com +scpweb.s1.qa1.exacttarget.com +scpweb.s10.exacttarget.com +scpweb.s2.qa3.exacttarget.com +scpweb.s3.qa2.exacttarget.com +scpweb.s4.exacttarget.com +scpweb.s5.exacttarget.com +scpweb.s50.exacttarget.com +scpweb.s6.exacttarget.com +scpweb.s7.exacttarget.com +scpweb.s8.exacttarget.com +scr.kliksaya.com +scratch.eqads.com +scratch2cash.com +scream.garudamp3.com +screechingfurniture.com +screen-mates.com +screenaddict.thewhizproducts.com +screensavers.us.intellitxt.com +scribe.logs.roku.com +scribe.twitter.com +scripps.demdex.net +scripps.petametrics.com +scrippsbathvert.112.2o7.net +scrippsdiy.112.2o7.net +scrippsfineliving.112.2o7.net +scrippsfoodnet.112.2o7.net +scrippsfoodnetnew.112.2o7.net +scrippsfrontdoor.112.2o7.net +scrippsgac.112.2o7.net +scrippshgtv.112.2o7.net +scrippshgtvpro.112.2o7.net +scrippsrecipezaar.112.2o7.net +scrippswfts.112.2o7.net +scrippswxyz.112.2o7.net +script.banstex.com +script.crazyegg.com +script.crsspxl.com +script.dotmetrics.net +script.idvert.cz +script.ioam.de +script.netminers.dk +script.opentracker.net +script.tailsweep.com +scripte-monster.de +scriptproxy.pie.net.pk +scripts.chitika.net +scripts.demandbase.com +scripts.host.bannerflow.com +scripts.kataweb.it +scripts.kiosked.com +scripts.kissmetrics.com +scripts.linkz.net +scripts.mediavine.com +scripts.mofos.com +scripts.mrpiracy.xyz +scripts.mycounter.com.ua +scripts.mycounter.ua +scripts.psyma.com +scripts.sophus3.com +scripts.the-group.net +scripts.verticalacuity.com +scripts.webspectator.com +scrollbelow.com +scrollingads.hustlermegapass.com +scrooge.channelcincinnati.com +scrooge.channeloklahoma.com +scrooge.click10.com +scrooge.clickondetroit.com +scrooge.nbc11.com +scrooge.nbc4.com +scrooge.nbc4columbus.com +scrooge.nbcsandiego.com +scrooge.newsnet5.com +scrooge.thebostonchannel.com +scrooge.thedenverchannel.com +scrooge.theindychannel.com +scrooge.thekansascitychannel.com +scrooge.themilwaukeechannel.com +scrooge.theomahachannel.com +scrooge.wesh.com +scrooge.wftv.com +scrooge.wnbc.com +scrooge.wsoctv.com +scrooge.wtov9.com +scrserv.ad.yieldmanager.net +scrubsky.com +scrubswim.com +scs.webtrends.com +scuba-marin.de +scubadivingtv.com +scuolaartispettacolo.it +scysvr03.r.us-east-1.awstrack.me +scz.hit.gemius.pl +sd.5.p2l.info +sdadimkvartiru.ru +sdc.acc.org +sdc.ca.com +sdc.caranddriver.com +sdc.dishnetwork.com +sdc.dn.no +sdc.entertainment.com +sdc.flysas.com +sdc.lef.org +sdc.livingchoices.com +sdc.mako.co.il +sdc.mcafee.com +sdc.netiq.com +sdc.prudential.com +sdc.radio-canada.ca +sdc.rbistats.com +sdc.roadandtrack.com +sdc.sanofi-aventis.us +sdc.shawinc.com +sdc.tele.net +sdc.traderonline.com +sdc.usps.com +sdc.vml.com +sdc.windowsmarketplace.com +sdc2.sakura.ad.jp +sdc8prod1.wiley.com +sdcexecs.us.intellitxt.com +sddan.mgr.consensu.org +sdelai-prosto.ru +sdelatmebel.ru +sdengineers.in +sdfsf.freecontent.date +sdgya.com +sdhack.com +sdk-analytics.inlocomedia.com +sdk-analytics.metaps.com +sdk-api-ssl.playhaven.com +sdk-assets.localytics.com +sdk-cl.privacy-center.org +sdk-config.fyber.com +sdk-controller.widespace.com +sdk-orion.appboy.com +sdk-test.fiksu.com +sdk.adincube.com +sdk.api.xtify.com +sdk.beemray.com +sdk.casalemedia.com +sdk.consoliads.com +sdk.fiksu.com +sdk.ibm.xtify.com +sdk.inlocomedia.com +sdk.placed.com +sdk.privacy-center.org +sdk.streamrail.com +sdk.xtify.com +sdk3.ibm.xtify.com +sdkconfig.ad.intl.xiaomi.com +sdkconfig.ad.xiaomi.com +sdklogs.avocarrot.com +sdkm.inmobi.com +sdkm.w.inmobi.com +sdktm.w.inmobi.com +sdkupgrade.insight.ucweb.com +sdo.oewabox.at +sdogiu.bestamazontips.com +sds.livesegmentservice.com +sdscdn.userreport.com +sdx.xfinity.com +sdx.xfinity.com.edgekey.net +se-welding.ru +se.adserver.yahoo.com +se.cqcounter.com +se.gcp.msas.media.net +se.monetate.net +se.msas.media.net +se.sitestat.com +se2.monetate.net +sea-dc01.marketo.net +sea-dc02.marketo.net +sea.cryptaloot.pro +sea.cryptoloot.pro +sea.directprimal.com +sea.effectivemeasure.net +sea.net.edu.cn +sea.webmine.pro +sea1.cdn.survey.medallia.com +sea2.authcaptcha.com +sea2.directprimal.com +seacoastonlinecom.112.2o7.net +seal.ranking.com +seal.validatedsite.com +sean.ittest.33across.com +seans24.com.pl +seanse24.pl +search-phentermine.hpage.net +search.addthis.com +search.advertisingbox.com +search.airfind.com +search.brainfox.com +search.buzzdock.com +search.clicksor.com +search.conduit.com +search.dmtracker.com +search.eclickz.com +search.effectivebrand.com +search.etargetnet.com +search.freeonline.com +search.in +search.info.com +search.ipromote.com +search.keywordblocks.com +search.livefyre.com +search.mediatarget.com +search.mywebsearch.com +search.netseer.com +search.privitize.com +search.rub.to +search.sextracker.com +search.smokaz.com +search.spotxchange.com +search.tc +search2007.info +search34.info.com +search4you.50webs.com +searchacross.com +searchadv.com +searchassistant.iwon.com +searchatomic.com +searchdiscovered.com +searchforit.com +searchfwding.com +searchignited.com +searchinquire.com +searchinterneat-a.akamaihd.net +searchitnow.info +searchitquick.com +searchkut.com +searchlock.com +searchmachine.com +searchmagna.com +searchmagnified.com +searchmarketing.com +searchmywindow-a.akamaihd.net +searchnet.com +searchnigeria.net +searchnut.com +searchpill.boom.ru +searchportal.information.com +searchramp.com +searchrapid.pl +searchremagnified.com +searchresultsguide.com +searchstats.usa.gov +searchtoexplore.com +searchtooknow-a.akamaihd.net +searchwe.com +searchwebknow-a.akamaihd.net +searchxxx.org +searclhe-poisc.ru +sears.112.2o7.net +sears.demdex.net +searschicerewards.com +searscom.112.2o7.net +searsgoldmastercard.com +searsholdings.tt.omtrdc.net +searskmartcom.112.2o7.net +searsspabenefits.com +seasonale.1.p2l.info +seasonaloffers.club +seasonalsamplerspecials.com +seasonsgreetings.com.au +seat-guru.de +seattle01.monero.hashvault.pro +seattleroundup.com +seavideo-ak.espn.go.com +seb.d1.sc.omtrdc.net +seb.scorecardresearch.com +sebar.thand.info +sebastianluetzig.de +sebcotrk.com +sebder.roboinside.me +sec-bd.com +sec.fastly-insights.com +sec.hit.gemius.pl +sec.levexis.com +seccdn-gl.imrworldwide.com +seccioncontrabajo.com +seceretary-movies.com +secfld.vmmpxl.com +secimage.adtech.de +secimage.adtech.fr +secimage.adtech.us +secimg.vmmpxl.com +secondchancecoaching.com +secondnaturehypnosis.com +secops.returnpath.net +secret-tunnel.com +secret.xn--oogle-wmc.com +secretbaby.com.br +secretdoors.net +secretfantasyboutique.com +secretivecub.com +secretlanguage.co +secretlolita.com +secretmanager.adviserplus.com +secretscook.ru +secretspiders.com +secserv.adtech.de +secserv.adtech.fr +secserv.adtech.us +secumine.net +secure-account-update-information.com +secure-accountunlocked.com +secure-ads.pictela.net +secure-ams.adnxs.com +secure-as.jivox.com +secure-asia.imrworldwide.com +secure-assets.rubiconproject.com +secure-au.imrworldwide.com +secure-cdn.atwola.com +secure-cdn.mm.atwola.com +secure-cdn.mplxtms.com +secure-cert.imrworldwide.com +secure-dcr.imrworldwide.com +secure-dev2.confrim-fanpage111.tk +secure-dk.imrworldwide.com +secure-drm.imrworldwide.com +secure-ds.serving-sys.com +secure-eu.imrworldwide.com +secure-gg.imrworldwide.com +secure-gl.imrworldwide.com +secure-id.impressiondesk.com +secure-it.imrworldwide.com +secure-jp.imrworldwide.com +secure-js.kontera.com +secure-leadback.asda.db.advertising.com +secure-leadback.bmi.db.advertising.com +secure-leadback.buycom.db.advertising.com +secure-leadback.callme.db.advertising.com +secure-leadback.drugstore.db.advertising.com +secure-leadback.firstchoice.db.advertising.com +secure-leadback.fossil.db.advertising.com +secure-leadback.ihg.db.advertising.com +secure-leadback.jet2.db.advertising.com +secure-leadback.pccity.db.advertising.com +secure-leadback.petmeds.db.advertising.com +secure-leadback.rumbo.db.advertising.com +secure-leadback.stubhub.db.advertising.com +secure-leadback.ticketsnow.db.advertising.com +secure-leadback.tradera.db.advertising.com +secure-leadback.tui.db.advertising.com +secure-msg.dotomi.com +secure-nz.imrworldwide.com +secure-processingcenter.com +secure-sg.imrworldwide.com +secure-uk.imrworldwide.com +secure-us.imrworldwide.com +secure-yt.imrworldwide.com +secure-za.imrworldwide.com +secure.160117rd.xyz +secure.33across.com +secure.accessiblemetrics.com +secure.ace-lb.advertising.com +secure.ace-tag.advertising.com +secure.ace.advertising.com +secure.ace1.advertising.com +secure.addthis.com +secure.adnxs.com +secure.advertising.com +secure.adviserplus.com +secure.adwebster.com +secure.adx1.com +secure.audienceinsights.net +secure.audiensis.com +secure.bannerfarm.ace.advertising.com +secure.bannerfarm.advertising.com +secure.bidvertiser.com +secure.bidvertiserr.com +secure.blismedia.com +secure.cardtransaction.com +secure.clients.credentials.message.update.jekerpay.com +secure.directtrack.com +secure.eastftp.extremereach.com +secure.eloqua.com +secure.exoclick.com +secure.fhserve.com +secure.flashtalking.com +secure.footprint.net +secure.gaug.es +secure.ifbyphone.com +secure.img-cdn.mediaplex.com +secure.impresionesweb.com +secure.insightexpressai.com +secure.leadback.advertising.com +secure.leadforensics.com +secure.lijit.com +secure.marketengines.com +secure.media6degrees.com +secure.medleyads.com +secure.netscope.marktest.pt +secure.p03.eloqua.com +secure.p07.eloqua.com +secure.postrelease.com +secure.quantserve.com +secure.ryke4peep.com +secure.sr.mads.advertising.com +secure.statcounter.com +secure.thirdpresence.com +secure.tmathtag.com +secure.uac.advertising.com +secure.vidhack.com +secure.w3track.com +secure.webconnect.net +secure.webresint.com +secure.westftp.extremereach.com +secure.widget.dynamic.advertising.com +secure.xml.adx1.com +secure0.adswizz.com +secure01chasewebauthdashboard.electoralshock.com +secure3.marketengines.com +secure4app.com +secure6.platinumbucks.com +secureads.ft.com +securecontactinfo.com +securedliveuploads.com +securedocumentdownload.usa.cc +securedr.33across.com +secureimage.exacttarget.com +securemacfix.com +securemail.rubiconproject.com +securemetrics.apple.com +securemypc.co.uk +securepubads.g.doubleclick.net +secureredirect101.com +securerr.com +securerunner.com +securesignupoffers.org +securetracking2.com +securetrk1.com +securitas232maximus.xyz +securitas25maximus.xyz +securitas493maximus.xyz +securitas611maximus.xyz +securite.01net.com +security-alert.kej8i8i69v.top +security-alert.wz6l9nmd.top +security-alert.zs2vm.top +security-check-551.com +security.fblaster.com +security.instartlogic.com +security60-e.com +securityallianceservices.com +securityandroidupdate.dinamikaprinting.com +securityinbox6876.000webhostapp.com +securityinfo6467.000webhostapp.com +securityinfonuman.000webhostapp.com +securityjam.000webhostapp.com +securityscan.us +securityteamuin.000webhostapp.com +securityterm68451.000webhostapp.com +securityterms-info99011wt.000webhostapp.com +securityterms13131.000webhostapp.com +securitywebservices.com +secuurity.net +sedesol.sedesol.gob.mx +sedoparking.com +sedotracker.com +sedu.adhands.ru +seduction-zone.com +see.hit.gemius.pl +seed1.nimiqtest.net +seed2.nimiqtest.net +seed3.nimiqtest.net +seed4.nimiqtest.net +seek.hosting.exacttarget.com +seekbang.com +seekinstantly.com +seemlessfixing.tech +seen-on-screen.thewhizmarketing.com +seeques.com +seet10.jino.ru +seethisinaction.com +seg-server-lb.global.prod1.sharethis.net +seg.sharethis.com +segapi.quantserve.com +segment-data-us-east.zqtk.net +segment-pixel.invitemedia.com +segment.babynamewizard.com +segment.hotstar.com +segment.io +segment.kilometer.io +segment.mamaslatinas.com +segment.prod.bidr.io +segment.revelist.com +segmentation.condenastdigital.com +segmentation.k8s.us-east-1--production.containers.aws.conde.io +segments.adaptv.advertising.com +segments.company-target.com +segob.gob.mx +seibli.oewabox.at +sejaadiferenca.com +sejs.moatads.com +sekel.ch +sekindo.com +seks-foto.com +seks-partner.com +seks-sex.nl +sekscell.com +seksitv.fi +seksmovie.net +seksms.nl +seksotur.ru +sekspornocu.org +sekstotaal.nl +sel.as-eu.falkag.net +sel.as-us.falkag.net +sele.co +select001.adtech.de +select001.adtech.fr +select001.adtech.us +select002.adtech.de +select002.adtech.fr +select002.adtech.us +select003.adtech.de +select003.adtech.fr +select003.adtech.us +select004.adtech.de +select004.adtech.fr +select004.adtech.us +selectablemedia.com +selectionsugar.com +selective-business.com +selectivesummer.com +selfdefense.tk +selfpwn.org +selfserve.buysellads.com +selfserve.rubiconproject.com +selfservice.sizmek.com +selfsurveys.com +sellanannuity.com +sellers-dev.srv.kargo.com +sellers-dev.svc.kargo.com +sellers-testing.svc.kargo.com +sellmeyourtraffic.com +sem.advertising.com +semblueinc.viewmyplans.com +semengineers.com +semensippers.com +seminolecreativegroup.com +semiyun.com +semp.net +semprofile.com +sen-to-zdrowie.ml +send.microad.jp +sender.hipersushiads.com +sender.megapopads.com +sendet.com +sendfwd.com +sendmepixel.com +sendo.d800.sms13.de +sendori.com +sendspace.pw +senger.atspace.co.uk +seniorcommunityapartments.com +seniorlivinglistings.review +sennen.org.uk +senshukai.122.2o7.net +sensic.net +sensismediasmart.com.au +sensual2000.com +sensualidade.com.br +sensualsamateurs.com +sensuel.dk +sensuellement.com +sentemanactri.com +sentierdesindes.com +sento.122.2o7.net +sentrol.cl +sentry-web-lb-160711358.us-east-1.elb.amazonaws.com +sentry.adthrive.com +sentry.adwyze.com +sentry.io +sentry.livefyre.com +sentry.nullrefexcep.com +seo-2-0.com +seoanalyses.com +seocheckupx.com +seocheki.net +seoholding.com +seoic.cn +seomatrix.webtrackingservices.com +seonetwizard.com +seorank.info +seorankinglinks.xyz +seorevival.com +seosmart.net +seosoftware.onlinedownloads.org +separatesilver.com +separm.com +septembersno.com +seralf.com +serdcenebolit.com +serenescreen-marine-aquarium.en.softonic.com +serenitykathu.com +sergarius.popunder.ru +sergiorossistore.online +seriale.org.pl +serialefilmy.pl +serials.ws +serialsway.ucoz.ru +serialz.nl +serialzdb.com +serie-vostfr.com +serieseries.fr +serieverpasst.de +seriousjugs.com +serisex.com +serpihan7711at.000webhostapp.com +serptehnika.ru +serteens.com +serv-load.com +serv.ad-rotator.com +serv.adspeed.com +serv.clicksor.net +serv.shoofle.tv +serv.tooplay.com +serv0.com +serv1.vizury.com +serv1swork.com +serv2.ad-rotator.com +serv2ssl.vizury.com +servad.mynet.com +servads.aip.org +servads.fansshare.com +serve-east.acuityplatform.com +serve.adplxmd.com +serve.ads.chaturbate.com +serve.adworldmedia.com +serve.freegaypix.com +serve.getpopunder.com +serve.mediayan.com +serve.oxcluster.com +serve.popads.net +serve.prestigecasino.com +serve.williamhill.com +servebom.com +servedby-buysellads.com +servedby.adcombination.com +servedby.advertising.com +servedby.dm3adserver.com +servedby.edgeads.org +servedby.flashtalking.com +servedby.indiads.com +servedby.informatm.com +servedby.ipromote.com +servedby.netshelter.net +servedby.o2.co.uk +servedby.precisionclick.com +servedby.proxena-adserver.com +servedby.studads.com +servedby.valuead.com +servedbyadbutler.com +servedbyopenx.com +server-au.imrworldwide.com +server-br.imrworldwide.com +server-by.imrworldwide.com +server-ca.imrworldwide.com +server-de.imrworldwide.com +server-dk.imrworldwide.com +server-ee.imrworldwide.com +server-fi.imrworldwide.com +server-fr.imrworldwide.com +server-hk.imrworldwide.com +server-it.imrworldwide.com +server-jp.imrworldwide.com +server-lt.imrworldwide.com +server-lv.imrworldwide.com +server-no.imrworldwide.com +server-nz.imrworldwide.com +server-observer.com +server-oslo.imrworldwide.com +server-pl.imrworldwide.com +server-ru.imrworldwide.com +server-se.imrworldwide.com +server-sg.imrworldwide.com +server-ssl.allinviews.com +server-ssl.beeviewd.com +server-ssl.bestcontentonline.com +server-ssl.installfarm.com +server-ssl.placeyourview.com +server-ssl.shoofle.tv +server-ssl.yieldmanaged.com +server-stockh.imrworldwide.com +server-ua.imrworldwide.com +server-uk.imrworldwide.com +server-us.imrworldwide.com +server-za.imrworldwide.com +server.adform.net +server.adformdsp.net +server.adless.io +server.allinviews.com +server.as5000.com +server.beeviewd.com +server.bestcontentonline.com +server.bittads.com +server.cpmstar.com +server.extend.tv +server.installfarm.com +server.jsecoin.com +server.pixel.marketing +server.placeyourview.com +server.popads.net +server.shoofle.tv +server.siteamplifier.net +server.vidazoo.com +server.zoiets.be +server01.popupmoney.com +server03new.dot.at +server1.adpolestar.net +server1.affiz.net +server1.beaconpush.com +server1.extra-web.cz +server1.opentracker.net +server1.web-mania.com +server10.opentracker.net +server11.opentracker.net +server12.opentracker.net +server13.opentracker.net +server14.opentracker.net +server15.opentracker.net +server16.opentracker.net +server17.opentracker.net +server18.opentracker.net +server2.allinviews.com +server2.as5000.com +server2.beeviewd.com +server2.bestcontentonline.com +server2.discountclick.com +server2.installfarm.com +server2.mediajmp.com +server2.opentracker.net +server2.placeyourview.com +server2.shoofle.tv +server2.web-stat.com +server3.opentracker.net +server3.web-stat.com +server3.yieldmanaged.com +server4.nullrefexcep.com +server4.opentracker.net +server4.web-stat.com +server5.opentracker.net +server6.opentracker.net +server7.opentracker.net +server8.opentracker.net +server821.com +server9.opentracker.net +serveradobe.co.cc +serverc-ssl.allinviews.com +serverc.allinviews.com +serverc.shoofle.tv +servercin.allinviews.com +servercin.shoofle.tv +serverd.allinviews.com +servethis.com +service-dev.sp.advertising.com +service.adtech.de +service.adtech.fr +service.adtech.us +service.bfast.com +service.clicksvenue.com +service.crypto-webminer.com +service.dr.newrelic.com +service.eu.newrelic.com +service.face2trade.com +service.fyber.com +service.maxymiser.net +service.mm-r-prop-11-16-2.com +service.multi-pops.com +service.newrelic.com +service.pca.admarketplace.net +service.persianstat.com +service.sp.advertising.com +service.stg-aws.fyber.com +service.urchin.com +service.videoplaza.tv +service001.adtech.de +service001.adtech.fr +service001.adtech.us +service002.adtech.de +service002.adtech.fr +service002.adtech.us +service003.adtech.de +service003.adtech.fr +service003.adtech.us +service004.adtech.fr +service004.adtech.us +service00x.adtech.de +service00x.adtech.fr +service00x.adtech.us +service1.predictad.com +service2.predictad.com +service4refresh.info +servicedesk.adviserplus.com +serviceo.comcast.net +servicer.adskeeper.co.uk +servicer.mgid.com +services.247realmedia.com +services.53.localytics.com +services.adroll.com +services.adtech.de +services.adtech.fr +services.adtech.us +services.adx1.com +services.cmp.advertising.com +services.dev.extremereach.com +services.extremereach.com +services.extremereach.com.extremereach.com +services.hearstmags.com +services.iad.appboy.com +services.krxd.net +services.syndicaster.tv +services.webspectator.com +services.x-traceur.com +services1.adtech.de +services1.adtech.fr +services1.adtech.us +serving-sys.com +serving.adsrevenue.clicksor.net +serving.bepolite.eu +serving.plexop.net +serving.xxxwebtraffic.com +servserv.generals.ea.com +servustv.oewabox.at +serw.clicksor.com +serw.myroitracking.com +serwis-laptopow-powisle.pl +serwis-laptopow.org.pl +serwis-laptopow.warszawa.pl +serwis-laptopow24.pl +serwis.kb.help +serwislaptopowwarszawa.com.pl +serwisy.gremimedia.pl +ses.adx1.com +session.timecommerce.net +sessioncam.com +sessions.aca.bugsnag.appstore.a2z.com +sessions.bugsnag.appstore.a2z.com +sessions.bugsnag.com +sessions.firetv.bugsnag.appstore.a2z.com +set.tidaltv.com +settings-win.data.microsoft.com +settings.crashlytics.com +settings.luckyorange.net +setup.advancedcleaner.com +setupdate24.updateworkfreshandnew.space +setupdate24.updateworkfreshandnew.website +setupnow.amazinglysafeistallsforeveryonethisweek.review +setupupgrade12.thepointofforcontentingperfect.win +sevenoneintermedia.112.2o7.net +sevenstars7.com +sex-adult-xxx.nu +sex-and-flirt.com +sex-asian.nu +sex-asian.sextgem.com +sex-fabryka.blogspot.com +sex-games.dk +sex-games.nl +sex-girl.info +sex-gold.nu +sex-haus.de +sex-here.com +sex-homepage.info +sex-joy.nu +sex-lesbians.nu +sex-lingerie.nu +sex-links.nu +sex-live.nu +sex-machine.nu +sex-master.nu +sex-masturbation.com +sex-me.nu +sex-moms.com +sex-movie.nu +sex-movies.nu +sex-n-porn.com +sex-nl.nl +sex-now5.com +sex-sex-sex5.com +sex-tarts.com +sex-teen.nu +sex-teens-xxx.nu +sex-teens.biz +sex-toons.info +sex-video.nu +sex-videos.dk +sex-videos.gocunt.com +sex-viedos.com +sex-watch.com +sex-xxx-girls.nu +sex-yes.com +sex-you.com +sex.germany.sms13.de +sex.hotblog.top +sex.klingeltoene.sms.sms13.de +sex.kuncsaft.hu +sex.md +sex.per.sms.sms13.de +sex.phone.sms13.de +sex.whodoyouthinkweare.com +sex.xx1.ch +sex4.us +sex4enjoy.com +sex4free.nu +sex4you.nu +sex666sex.de +sex69.com.br +sexad.de +sexad.net +sexaddicts.us +sexadult.nu +sexadultmovies.com +sexafari.com +sexaholic.nu +sexaids.nu +sexaktion.de +sexalarm.nl +sexamine.com +sexanal.nu +sexandme.net +sexandsubmission.info +sexandtoys.dk +sexanimals.nu +sexaporter.com +sexaround.org +sexartikel-versand.de +sexcounter.com +sexdzieci.blogspot.com +sexfabryka.blogspot.com +sexfrm.com +sexfucking.nu +sexfxxx.com +sexgadol.co.il +sexgeilefrauen.de +sexgeiz.info +sexgeld.nl +sexgiga.com +sexgirls-live.de +sexgirlsvideos.xyz +sexgirlx.com +sexgirlz.net +sexgratos.biz +sexgroup.nu +sexguiden.dk +sexharassed.com +sexheaven.nu +sexhell.nu +sexhexen.at +sexhibition.nu +sexinuniforms.com +sexinyourcity.com +sexisland.it +sexitnow.com +sexkamerki.biz +sexkings.nu +sexkinky.nu +sexkiss-24.web-go.net +sexkogal.com +sexkontakte-seite.com +sexkontakteao.info +sexkrasivo.net +sexkupon.com +sexkurier.com +sexlaughs.com +sexlesbian.nu +sexlist.com +sexmonsters.nl +sexmovie.nu +sexmovievault.com +sexnax.com +sexnew.org +sexnewsbot.com +sexntoyz.com +sexnudes.nu +sexnudity.nu +sexnymphos.nu +sexnymphs.com +sexo-animal.org +sexo.com.py +sexo.gay.allmanpages.com +sexo234.com +sexoamateur.info +sexobzor.info +sexochat.org +sexodegays.com +sexodigital.info +sexoengrupo.net +sexoextraterrestre.com +sexofogo.info +sexogratis.la +sexogratis.nu +sexogratis69.com +sexogratistgp.com +sexointimo.com +sexoloko.com +sexoma.info +sexondvd.com +sexonroad.com +sexonthebeach.me +sexoo.biz +sexoparaadultos.com +sexopia.pl +sexoporcorreo.com +sexoporno.org +sexowne-szparki.pl +sexox.org +sexoxxxx.com +sexozoofilia.org +sexpage.nu +sexpages.nu +sexpark.info +sexpartnerx.com +sexpartygirls.net +sexpasses.nu +sexpasswords.nu +sexpasswordz.nu +sexpeeks.com +sexperimente.de +sexphoto.site +sexpics-xxx.com +sexpics.nu +sexpicsgalore.com +sexpictures.dk +sexpills4u.com +sexsponsors.com +sextassy.com +sextracker.com +sexvicious.com +sexvideo-sex.com +sexvideo-top100.com +sexvideo.dk +sexvideoblog.net +sexvideohq.com +sexvideosbabes.com +sexvideosgratuit.fr +sexville.nu +sexvirus.nu +sexvisio.com +sexvporno.ru +sexvsporn.com +sexwaiter.com +sexwank.com +sexwars.pl +sexway.cidadeinternet.com.br +sexweb.nl +sexwebcamsblog.com +sexwithanimals.nu +sexwithbabes.nu +sexwithpregnant.info +sexwithshemales.com +sexworld-total.com +sexworld.nu +sexworld69.com +sexwp.pl +sexx.work +sexxx-sites.net +sexxx4all.com +sexxx888.com +sexxxacts.com +sexxxcapades.com +sexxxfarm.nu +sexxxkitten.com +sexxxstart.org +sexxxstasy.com +sexxxtalk.com +sexxxtropolis.com +sexxxuniversity.com +sexxxxpics.nu +sexxxystories.com +sexy-angels.com +sexy-asian-babes.blogomer.com +sexy-asses.com +sexy-cartoon-porn.0my.net +sexy-everyday.com +sexy-femmes.com +sexy-frauen.thumblogger.com +sexy-girls.nu +sexy-guys-naked.com +sexy-julia.com +sexy-liebe.com +sexy-links.nu +sexy-live.biz +sexy-mom.com +sexy-n-mature.com +sexy-nudes.nu +sexy-pictures.info +sexy-porn-linksland.com +sexy-porn.nu +sexy-pussy.nu +sexy-screen-savers.com +sexy-seitensprung.info +sexy-stocking.com +sexy-stories.nu +sexy-stuttgart.de +sexy-teacher.info +sexy-teen.biz +sexy-teen.org +sexy-teens.nu +sexy-toys.dk +sexy.ch +sexy.hintergrundbilder.sms13.de +sexy.legratuit.com +sexy0204.com +sexy13.webgourou.com +sexy3dgirls.com +sexy4.de +sexyali.com +sexyams.com +sexyasianbabes.net +sexyasians.nu +sexyass.nu +sexyatwork.com +sexybabe.nu +sexybabes.nu +sexybills.be +sexyblackhot.com +sexyblonde.net +sexyblondecum.com +sexyblondes.nu +sexybot.net +sexybrunettes.nu +sexybustybabes.blogspot.com +sexycarbabes.com +sexycatalogo.com +sexycrystals.com +sexydanger.com +sexyday.biz +sexydeesse.com +sexydialogues.com +sexydirty.nu +sexyeyeglasses.com +sexyfaith.nu +sexyfuck.nu +sexygallerie.com +sexygate.org +sexygayplace.com +sexygifts.org +sexygirlies.nu +sexygirlphoto.asia +sexygirlx.com +sexykiss.org +sexylife.info +sexylittlefeet.com +sexylondonkeys.com +sexylux.com +sexymachin.com +sexymarissa.net +sexynaked.nu +sexynude.nu +sexyoilwrestling.com +sexyperfectgirl.blogspot.com +sexypics.nu +sexypictures.nu +sexypix.nu +sexyplanet.nu +sexyporn.nu +sexyporngirls.blogspot.ca +sexyporngirls.blogspot.ch +sexyporngirls.blogspot.co.id +sexyporngirls.blogspot.co.uk +sexyporngirls.blogspot.com +sexyporngirls.blogspot.com.ar +sexypreteens4u.com +sexyredheads.nu +sexyrusse.com +sexysakura.com +sexysaturday.vacuity.de +sexyscholiertjes.nl +sexysearch.nu +sexyservicio.com +sexysex.nu +sexysexy.nu +sexyshoppe.com +sexyshowoffs.com +sexystarz.nu +sexyster.tk +sexystore.nu +sexystrippe.info +sexysupermodel.nu +sexyteen.nu +sexyteeners.com +sexzavod.com +sexzoznamka.eu +seznam.hit.gemius.pl +sf-3.east.kobenetwork.com +sf-3.st.adtekmedia.com +sf.bizible.com +sf.mm.vungle.com +sf.vserv.mobi +sf14g.com +sf3.east.kobenetwork.com +sfads.osdn.com +sfbweb.sekindo.com +sfd-chess.ru +sfdc.clearbit.com +sffh.de +sfj-ror.no +sfmc-dev.urbanairship.com +sfmc-docker-prod-local.artifactory-qa-p01.exacttarget.com +sfmc-docker-prod-local.artifactory-qa-p02.exacttarget.com +sfmc-docker-prod-local.artifactory-qa-p03.exacttarget.com +sfmc-docker-prod-local.artifactory-xt-p01.exacttarget.com +sfmc-docker-prod-local.artifactory-xt-p02.exacttarget.com +sfmc-docker-prod-local.artifactory-xt-p03.exacttarget.com +sfmc-docker-prod-local.artifactory-xt-p04.exacttarget.com +sfmc-docker-prod-local.artifactory-xt-p05.exacttarget.com +sfmc-docker-prod-local.artifactory-xt-p06.exacttarget.com +sfmc-docker-prod-local.artifactory-xt-s50.exacttarget.com +sfmc-docker-qa-local.artifactory-qa-p01.exacttarget.com +sfmc-docker-qa-local.artifactory-qa-p02.exacttarget.com +sfmc-docker-qa-local.artifactory-qa-p03.exacttarget.com +sfmc-stag.urbanairship.com +sfmc.urbanairship.com +sfo1.admarketplace.net +sfondami.com +sfool.com +sftk.net +sftp.clickability.com +sftp.dev.extremereach.com +sftp.extremereach.com +sftp.snapads.com +sftrack.searchforce.net +sg-cdn.effectivemeasure.net +sg-gmtdmp.gd2.mookie1.com +sg.adserver.yahoo.com +sg.mmstat.com +sg.yimg.com +sgc.urbanairship.com +sgmedia.adspirit.net +sgn.exacttarget.com +sgp.o2o.api.xiaomi.com +sgqcvfjvr.onet.pl +sgrunt.biz +sgs.us.com +sgs001.adtech.de +sgs001.adtech.fr +sgs001.adtech.us +sgsdata.adtech.de +sgsdata.adtechus.com +sh.cn.criteo.com +sh.cn.criteo.net +sh.creativcdn.net +sh4sure-images.adbureau.net +shadow.bid.snapads.com +shadow.cloud.fyber.com +shadow.forecast.snapads.com +shadow.outcome.snapads.com +shadow.targeting-insight.snapads.com +shafou.com +shagaddict.com +shagmywife.co.uk +shakesea.com +shakesuggestion.com +shakhtar-doneck.ru +shakira2.lisnr.com +shakytaste.com +shallownation.us.intellitxt.com +shallowschool.com +shallowsmile.com +shama-rc.net +shame-on-you.com +shamsuljewel.com +shanding.ucoz.es +shapado.com +shaptech.net +share-buttons-for-free.com +share-server.com +share.autopilothq.com +share.driftt.com +share.paradym.com +shareadspace.com +shareagree.com +shareaholic.com +shareasale.com +shareaza.com +sharebar.addthiscdn.com +sharebutton.net +sharebutton.org +sharebutton.to +sharecast.uk.intellitxt.com +shared.iad.appboy.com +sharefile365.com +sharelog-qa.midasplayer.com +sharelog.midasplayer.com +sharelog.qa.midasplayer.com +sharepoint.sonobi.com +sharepointads.com +sharetherake.com +sharethis.com +sharethis.mgr.consensu.org +sharethis.net +sharethrough.com +shariki-zuma-lines.ru +sharing-is-caring.info +sharingnewhope.net +sharon.stone.kuss.sms13.de +sharon.stone.sms13.de +sharpchallenge.com +sharppatch.com +sharpvisionconsultants.com +sharrepoint.com +shavedbush.com +shavedpoodle.com +shaw.analytics.xcal.tv +shawinternets.com +shawnewspapers.112.2o7.net +shaybrennanconstructions.com.au +shaylarentube.com +shc-rebates.com +shchaoneng.cn +shcpa2011.com +shdfsdf.info +she-rotica.com +she.said.districtm.io +shebudgets.us.intellitxt.com +sheeda.consoliads.com +sheeweknits.com +shegot.info +shehuge.com +sheknows.us.intellitxt.com +shell.tt.omtrdc.net +shell.xhhow4.com +shellbeachsalonspa.com +shellstore.info +shelookgood.com +shelovesmehd.com +shelterstraw.com +shemale-lovers.com +shemale-pics.indianshemales.com +shemale-pics.net +shemale-porn.biz +shemale-sex.net +shemale-sex.nu +shemale-sissifications.com +shemalebdsmvids.com +shemalebuzz.com +shemalefuckparty.com +shemalegalls.blogporn.in +shemalehentaistore.com +shemalelinkdump.com +shemalemov.biz +shemalemovietheater.com +shemalepornclub.com +shemaleporndir.com +shemales-free-porn.com +shemales-gallery.com +shemales.indianshemales.com +shemaleseks.be +shemaleset.com +shemalesexfilms.nl +shemalesjapan.net +shemalespornblog.com +shemalesstunners.com +shemalestreams.com +shemalevideos.amazingpass.com +shenaaz.com +shenzhengarden.com +sher.index.hu +sherkatkonandeh.com +sherkconstruction.ca +sherkhundi.com +shermore.info +shijian.ac.cn +shiksabd.com +shimeisai.com +shinikiev.com.ua +shiningtrends.com +shinystat.com +shinystat.it +shinystat.mgr.consensu.org +shinystat.shiny.it +shinyworld.co.uk +shiporama.com +ships.zapto.org +shisha-swag.de +shit-love.com +shit4shit.com +shiteater.de +shitmovs.com +shitpissfuck.com +shivafurnishings.com +shiveringsail.com +shlinks.industrybrains.com +shlyahten.ru +shmetall.com.ua +shoal.grahanusareadymix.com +shockinganals.com +shockingbjs.com +shockingswing.com +shodanhq.com +shoes-4u.pl +shoesonlinebuy.cn +shoesonlinebuy.xyz +shohanb.com +shoofle.tv +shop-electron.ru +shop.acim.org +shop.adx1.com +shop.analyticson.com +shop.justguam.com +shop.kauffes.de +shop.shopcurbside.com +shop.skin-safety.com +shopalliedpools.com +shopbitcoin.ru +shopcurbside.com +shopiconboutiqe.com +shopify-app.heatmap.it +shopkick.com +shoplvlv.us +shopnexus.de +shopperpromotions.com +shopping-offer.com +shopping.112.2o7.net +shoppingads.com +shoppingbox.partner.leguide.com +shoppingminds.net +shoppingsiterewards.com +shoppstop.comood.opsource.net +shops-malls-rewardpath.com +shoptosaveenergy.com +shore-view.com +shortby.tk +shorte.st +shoutwire.us.intellitxt.com +shovi.frost-electric-supply.com +show-msgch.qq.com +show.adclick.lv +show.adzpower.com +show.buzzcity.net +show.onenetworkdirect.net +show.smartcontext.pl +show.targead.com +showads.pubmatic.com +showads1000.pubmatic.com +showadsak.pubmatic.com +showcount.honest.com +showmeflix.com +showsplash.com +showup-tv.com.pl +shredder.adwyze.com +shrek.6.cn +shrink-service.it +shutterfly.narvar.com +si-unique.com +si.2.cqcounter.com +si.adocean.pl +si.hit.gemius.pl +si.nuggad.net +si.wemfbox.ch +siads.sv.publicus.com +sibboventures.mgr.consensu.org +sickrage.ca +sicksmash.com +sidebar.angelfire.com +sidekiq-status.appboy.com +sidekiq-status2.appboy.com +sideshow.directtrack.com +siemens.d1.sc.omtrdc.net +sifomedia.aftonbladet.se +sifomedia.citypaketet.se +sifomedia.idg.se +sighash.info +sigil.outwar.com +signatures.returnpath.com +signin-ebay-com-ws-ebayisapi-dll-signin-webscr.ocom.pl +signoredom.com +signready.com +signup.advance.net +signup.taboola.com +signup.urbaninsight.com +sijmp.com +silawejherowo.pl +sildenafil-tadalafil.info +silentplanet.in +siliconera.us.intellitxt.com +siliconorchard.com +siliconorchard.siliconorchard.com +siliconorchardau.siliconorchard.com +silikonepatter.dk +silimbompom.com +silkysquirrel.com +sillyscrew.com +silurian.cn +silva.alphonso.tv +silver.crypto.csgocpu.com +silverage.ru +silveragesoftware.com +silvercash.com +silverenkruis.nl +silveris.net +silvermature.net +silvermountholidays.com +silverpop.com +silverporn.mobi +silverpush.co +silvets.pl +simage2.pubmatic.com +simba.6.cn +simg.sinajs.cn +simg.zedo.com +similardeals.net +similarsabine.com +simon3.ru +simpatiaose.com +simpi.tourstogo.us +simple-image.com.ua +simpleads.net +simpleco.in +simplehitcounter.com +simpletrck.com +simpli.fi +simplisticnose.com +simplyfwd.com +sin.ero-advertising.com +sin01-nagios01.svc.insnw.net +sin01-nagios01.vpn.insnw.net +sin01-nagios02.svc.insnw.net +sin01-nagios02.vpn.insnw.net +sin01-nagios03.svc.insnw.net +sin01-nagios03.vpn.insnw.net +sin1.g.adnxs.com +sincentre.info +sincerebuffalo.com +sincerespy.com +sinera.org +sinettrk.com +singapore01.monero.hashvault.pro +single-online.petrovka.info +singular-cy.com +siniature.com +sinkhole-00.shadowserver.org +sinoa.com +sinuatemedia.com +sionicmedia.com +sip.exacttarget.com +sip.exponential.com +sip.foresee.com +sip.maxpoint.com +sip.sekindo.com +sip.sizmek.com +sip.thunderhead.com +sip.undertone.com +sipaof.mgr.consensu.org +sipext.america.exacttarget.com +sipext.exacttarget.com +sipexternal.foresee.com +sipexternal.maxpoint.com +siri.adwyze.com +sirius-expedition.com +sis.jpush.io +sisco.hit.stat.pl +sissymaid.info +sistemacentral.xpg.com.br +sisterincest.com +sisyfos.se +sit.com.tr +sit.newscgp.com +sitbiztut.ru +site-analyzer.com +site-checksite.tk +site-stats.i8.com +site-stats.rbl.ms +site.adform.com +site.coinnebula.com +site.falconbucks.com +site.flashx.cc +site.freecontent.com +site.johnlewis.com +site3.free-share-buttons.com +siteadvisor.com-br.site +siteanalytics.compete.com +sitebeam.net +sitecdn.tvpage.com +sitedataprocessing.com +siteduzero.net +siteexpress.co.il +siteg.com.br +siteimproveanalytics.com +siteintercept.qualtrics.com +siteinterceptco1.qualtrics.com +sitemeter.com +siteonline.stream +siteonomy.com +siterecruit.comscore.com +sites.asianschoolfuck.com +sitesearch.hitbox.com +sitesgratuits.fr +sitestat.com +sitestat.kpn-is.nl +sitestats.com +sitestats.tiscali.co.uk +sitetracker.com +siteunblocker.biz +sitevaluation.com +sitevalued.com +siteverification.online +siteverification.site +sitevictoria.com +sitiomonicaemarcia.com.br +sitionne.pro +sitiospornograficos.com +sitiosxxx.com +sito-porno.it +sito.tv +sitopreferito.it +situ.it +sivs.ru +sixapart.112.2o7.net +sixapart.adbureau.net +sixcooler.de +sixscissors.com +sixsigmatraffic.com +sixstitch.win +sizesidewalk.com +sizmek.com +sizzle-savings.com +sizzlecams.net +sj-dc02.marketo.net +sj88.com +sjc-rtb1.rfihub.net +sjc-usadmm.dotomi.com +sjc.ads.nexage.com +sjc.contextweb.com +sjc01-avlog01.vpn.insnw.net +sjc01-avlog02.vpn.insnw.net +sjc01-avlog03.vpn.insnw.net +sjc01-avserv01.vpn.insnw.net +sjc01-avserv02.vpn.insnw.net +sjc01-avserv03.vpn.insnw.net +sjc01-avserv04.vpn.insnw.net +sjc01-dcops01.vpn.insnw.net +sjc01-device42.vpn.insnw.net +sjc01-insight01.vpn.insnw.net +sjc01-ldap01.insnw.net +sjc01-ldap01.vpn.insnw.net +sjc01-monitor01.vpn.insnw.net +sjc01-nagios01.svc.insnw.net +sjc01-nagios01.vpn.insnw.net +sjc01-nagios02.svc.insnw.net +sjc01-nagios02.vpn.insnw.net +sjc01-nagios03.svc.insnw.net +sjc01-nagios03.vpn.insnw.net +sjc01-nagiosdash01.vpn.insnw.net +sjc01-nexus01.vpn.insnw.net +sjc01-thruk01.vpn.insnw.net +sjc02-prontox01.insnw.net +sjc02-wpt01.insnw.net +sjc1.qualtrics.com +sjguild.com +sjrtp5-cdn.marketo.com +sjs.bizographics.com +sk.5.p2l.info +sk.adocean.pl +sk.golden-praga.ru +sk.hit.gemius.pl +sk.search.etargetnet.com +ska.energia.cz +skachat-besplatno-obrazcy.ru +skandicfire.de +skanninge.se +skassets.com +skd.midasplayer.com +skelaxin.1.p2l.info +skelaxin.3.p2l.info +skelaxin.4.p2l.info +skencituer.com +skf-fag-bearings.com +skgde.adocean.pl +skgroup.kiev.ua +skidki-yuga.ru +skidrowcrack.com +skidrowreloaded.pl +skiholidays4beginners.com +skill.skilljam.com +skimlinkscom.skimlinks.com +skimresources.com +skin-care.1.p2l.info +skinbynulastin.com +skinmedica.122.2o7.net +skinny-sluts.com +skinsycs.89.pl +skinycs.pl +skip.oewabox.at +skippyfile.com +sklad-24.ru +sklandscap.com +skleplara.pl +skm-fertigungstechnik.de +skocz.pl +skroc-link.ga +skunklist.com +skuteczna-dieta.co.pl +skutecznesrodki-tabletkinapotencje.ovh +skutecznetabletkinaporostwlosow.pl +sky-connect.adinfuse.com +sky-mine.ru +sky.adinfuse.com +sky.estat.com +sky.kies.co.kr +skyauction.122.2o7.net +skybo.co +skylarkproductions.com +skylinemasr.com +skylink-datacenter.de +skylink.vn +skylopez.net +skylta.com +skype.dw.land.to +skype.maxpoint.com +skype.tt.omtrdc.net +skypeclass.com +skypedong.com +skypefr.com +skyperec.com +skysport.oewabox.at +skysticker.com +skyteens.com +skytraf.xyz +skyway24.ru +sl-native-android-hm-logging.appspot.com +sl-retargeting.adsonar.com +sl.advertising.com +slaafh.freehomepage.com +sladkoevideo.com +slammyass.com +slash-bot.corp.mixpanel.com +slashfilm.us.intellitxt.com +slashphone.us.intellitxt.com +slate-ad-scripts.s3.amazonaws.com +slate-demo.jivox.com +slate.jivox.com +slatercorp.co.za +slavetown.com +slavic-magic.ru +slavishgals.com +slavkokacunko.de +slayergirl.com +slayinglance.com +slbbbcom.112.2o7.net +slckg-2p3vy.ads.tremorhub.com +sledstvie-veli.net +sledujuporno.cz +sleep-aids.1.p2l.info +sleep.vermontteddybear.com +sleepcartoon.com +sleeper-sofa.dreamhoster.com +slf5cyd.info +slickdeals.sc.omtrdc.net +slickrocksoftware.com +slickwit.com +slider.plugrush.com +slightlyoffcenter.net +slimcdn.com +slimetalk.com +slimspots.com +slimxxxtubeacn.dnset.com +slimxxxtubealn.ddns.name +slimxxxtubeanr.ddns.name +slimxxxtubeaxy.ddns.name +slimxxxtubeayv.ddns.name +slimxxxtubebej.dnset.com +slimxxxtubebgp.ddns.name +slimxxxtubebmq.dnset.com +slimxxxtubebnd.ddns.name +slimxxxtubecgl.ddns.name +slimxxxtubectk.dnset.com +slimxxxtubecty.ddns.name +slimxxxtubeczp.ddns.name +slimxxxtubedgv.dnset.com +slimxxxtubedjm.ddns.name +slimxxxtubedlb.ddns.name +slimxxxtubedvj.dnset.com +slimxxxtubedxc.ddns.name +slimxxxtubedya.ddns.name +slimxxxtubeejs.ddns.name +slimxxxtubeemz.dnset.com +slimxxxtubefdr.ddns.name +slimxxxtubefel.ddns.name +slimxxxtubeftb.dnset.com +slimxxxtubefzc.ddns.name +slimxxxtubehan.ddns.name +slimxxxtubehdn.dnset.com +slimxxxtubehli.dnset.com +slimxxxtubeidv.ddns.name +slimxxxtubeijc.dnset.com +slimxxxtubeiqb.dnset.com +slimxxxtubejie.dnset.com +slimxxxtubejlp.ddns.name +slimxxxtubejpe.ddns.name +slimxxxtubejvh.ddns.name +slimxxxtubejyk.ddns.name +slimxxxtubekad.ddns.name +slimxxxtubekgj.ddns.name +slimxxxtubekgv.ddns.name +slimxxxtubeklg.dnset.com +slimxxxtubekpn.ddns.name +slimxxxtubekrn.ddns.name +slimxxxtubelap.ddns.name +slimxxxtubelat.ddns.name +slimxxxtubelfr.ddns.name +slimxxxtubelzv.ddns.name +slimxxxtubemue.dnset.com +slimxxxtubeneg.ddns.name +slimxxxtubeneu.ddns.name +slimxxxtubengt.dnset.com +slimxxxtubenqp.ddns.name +slimxxxtubentf.dnset.com +slimxxxtubeocr.dnset.com +slimxxxtubeonf.dnset.com +slimxxxtubeopy.ddns.name +slimxxxtubeoxo.ddns.name +slimxxxtubeoxy.ddns.name +slimxxxtubeppj.dnset.com +slimxxxtubeqfo.ddns.name +slimxxxtubeqsh.ddns.name +slimxxxtubeqve.dnset.com +slimxxxtubeqwr.dnset.com +slimxxxtuberau.ddns.name +slimxxxtuberea.ddns.name +slimxxxtuberep.dnset.com +slimxxxtuberfe.dnset.com +slimxxxtuberjj.ddns.name +slimxxxtuberme.dnset.com +slimxxxtuberue.dnset.com +slimxxxtubesrs.dnset.com +slimxxxtubesrw.ddns.name +slimxxxtubesun.ddns.name +slimxxxtubetmf.ddns.name +slimxxxtubetmg.dnset.com +slimxxxtubetns.ddns.name +slimxxxtubetts.dnset.com +slimxxxtubeubp.dnset.com +slimxxxtubeujh.ddns.name +slimxxxtubeull.dnset.com +slimxxxtubeuvd.dnset.com +slimxxxtubevdn.ddns.name +slimxxxtubevih.dnset.com +slimxxxtubevjk.ddns.name +slimxxxtubewfl.ddns.name +slimxxxtubewiq.ddns.name +slimxxxtubewis.ddns.name +slimxxxtubewmt.dnset.com +slimxxxtubexei.ddns.name +slimxxxtubexiv.dnset.com +slimxxxtubexvq.ddns.name +slimxxxtubexwb.dnset.com +slimxxxtubexxq.dnset.com +slimxxxtubeyge.ddns.name +slimxxxtubeyhz.ddns.name +slimxxxtubeyza.ddns.name +slipperyelmhurst.com +slipperysack.com +slipperyserpent.com +slkrm.ru +slo-engine.intextad.net +slo.sk +sloi1.com +slonechka.ru +slopeaota.com +sloppyhoes.com +slorent.com +slovakia.hit.gemius.pl +slowmac.tech +slowmacfaster.trade +slt.hit.gemius.pl +sltravelcom.112.2o7.net +sluganarodu.ru +slujbauborki.ru +slut-factory.com +slut-tee.com +slut.teenage-girl.nu +slutcock.com +slutcorner.com +slutloadlive.com +slutmachine.net +slutmila.com +slutmodel.com +sm.sprymetrics.com +sm1.sitemeter.com +sm2.sitemeter.com +sm3.sitemeter.com +sm3na.com +sm4.sitemeter.com +sm45mailtrack.com +sm4ll.in +sm5.sitemeter.com +sm6.sitemeter.com +sm7.sitemeter.com +sm8.sitemeter.com +sm9.sitemeter.com +sma-lac1.remote.extremereach.com +sma-lac2.remote.extremereach.com +sma-rsw1.remote.extremereach.com +sma-rsw2.remote.extremereach.com +smaato.mads.advertising.com +smaato.net +smallbusiness.maxpoint.com +smart-scripts.com +smart.besonders.ru +smart.brvaffs.com +smart.hola.com +smart.qualtrics.com +smart.styria-digital.com +smart.synergy-e.com +smart4ads.com +smartabouthealth.us.intellitxt.com +smartad.mercadolibre.com.ar +smartad.mercadolivre.com.br +smartadserver.com +smartadserver.mgr.consensu.org +smartbalanceworld.com +smartbounce.returnpath.com +smartcarfinder.us.intellitxt.com +smartclip.com +smartclip.net +smartcontext.pl +smartdevicecentral.us.intellitxt.com +smartfixer.software-phile.com +smartgiveaway.com +smartinit.webads.nl +smartlifeguides.com +smartlinks-e2e.intuit.com +smartlinks.intuit.com +smartlook.com +smartmoney.112.2o7.net +smartoffer.site +smartshare.lgtvsdp.com +smartstats.com +smartxads.com +smartyads.rtb.adx1.com +smartyadsdisplay.rtb.adx1.com +smashsurprise.com +smbc.sc.omtrdc.net +smc.silvercash.com +smectapop12.pl +smedia.webcollage.net +smedizin.oewabox.at +smellsliketeenpussy.com +smetrics.aetn.com +smetrics.att.com +smetrics.babycenter.com +smetrics.bestbuy.com +smetrics.boston.com +smetrics.capitalone.com +smetrics.cnn.com +smetrics.consumerreports.org +smetrics.creditreport.com +smetrics.ctv.ca +smetrics.fedex.com +smetrics.freecreditreport.com +smetrics.hbogo.com +smetrics.hbonow.com +smetrics.realtor.com +smetrics.tesco.com +smetrics.walgreens.com +smetrics.washingtonpost.com +smetrics.yellowbook.com +smf-modellismo.net +smibk.mookie1.com +smibs.112.2o7.net +smichovbike.cz +smiercidata.5v.pl +smile-angel.com +smile.modchipstore.com +smileapparels.com +smiles.org.il +smilingboys.com +smilingwaves.com +smilll.depozit.hr +smithwick.net +smkn1muaraenim.sch.id +smkn2ponorogo.sch.id +smm.sitescout.com +smmu-ipv6.smmu.edu.cn +smo.connexity.net +smokersblogs.com +smokersopinionpoll.com +smokesonstate.com +smokingeverywhere.122.2o7.net +smokinggun.122.2o7.net +smp.adviva.net +smp.specificmedia.com +smpopmech.112.2o7.net +smrcek.com +smrtb.com +smrtpxl-staging.advertising.com +smrtpxl.advertising.com +sms-ads.com +sms-z-internetu.pl +sms-za-darmo.pl +sms.oewabox.at +sms.test.exacttarget.com +sms4all.pl +smsiaki.eu +smsmovies.net +smtp-aus.returnpath.net +smtp.2911.net +smtp.adx1.com +smtp.corp.returnpath.com +smtp.corp.returnpath.net +smtp.ero-advertising.com +smtp.macau.ctm.net +smtp.potinsnews.com +smtp.returnpath.net +smtp.saas.appdynamics.com +smurf.crypto.csgocpu.com +smvpn.marketo.com +smwww.112.2o7.net +smy.iheart.com +sn-gate.com +sn-gzzx.com +sn.baventures.com +sn.moatads.com +snackly.co +snagajob.122.2o7.net +snahome.com +snakesort.com +snap.adsrvr.org +snap.cba.pl +snapads.com +snapchat-save.blogspot.com +snapfish.112.2o7.net +snaps.vidiemi.com +snare.iesnare.com +sneaklevel.com +sneakyboy.com +sneakystamp.com +snekdeal.com +sng-vpn.appdynamics.com +sngapi.ibm.xtify.com +snib53agl.wpc.thetacdn.net +snib53bgl.wpc.thetacdn.net +snib53cgl.wpc.thetacdn.net +snib53egl.wpc.thetacdn.net +sniff.visistat.com +snip.answers.com +snip.bronto.com +snipjs.answcdn.com +snippet-fork-one.herokuapp.com.dev-sandbox.getambassador.com +snippet-fork-one.herokuapp.com.sandbox.getambassador.com +snippet-fork-two.getambassador.com.dev-sandbox.getambassador.com +snippet-fork-two.getambassador.com.sandbox.getambassador.com +snippet-fork-two.herokuapp.com.dev-sandbox.getambassador.com +snippet-fork-two.herokuapp.com.sandbox.getambassador.com +snjatie-geroinovoy-lomki.ru +snkschool.com +snomer1.ru +snoobi.com +snooze.de +snow.nvr163.com +snowforce.sharethrough.com +snwmedia.adk2x.com +so.2mdn.net +so.extremereach.com +soap.iovation.com +soap17.leadpages.co +sobar.baidu.com +sobartop.baidu.com +sobolev.net.ru +soccergaming.us.intellitxt.com +sochr.com +social.bidsystem.com +socialanxietysupport.us.intellitxt.com +socialapi.digitalremedy.com +socialitelife.us.intellitxt.com +socialize.eu1.gigya.com +sociallitelife.tags.crwdcntrl.net +socialme.tk +socialproxy.livefyre.com +socialpull.silverpop.com +socialspark.com +socialviewapp.com.pl +societe.mgr.consensu.org +sock.s50.exacttarget.com +soclone.com +socpixel.bidsystem.com +socrates.alphonso.tv +soda1.midasplayer.com +soellas.com +sofa01.webtrekk.net +sofeminine.uk.intellitxt.com +sofiaaxelsson.se +sofit-dmd.ru +sofmap.112.2o7.net +sofortsexx.com +soft-program.com +soft-terminal.ru +soft1.ru +soft32.us.intellitxt.com +soft4click.com +soft4update.forfreeupgrades.org +softairmegastore.de +softbank.tt.omtrdc.net +softbankbb.122.2o7.net +softbankbb.d2.sc.omtrdc.net +softbanktechnology.112.2o7.net +softclick.com.br +softclit.com +softcore.xxxcounter.com +softfeather.nu +softlayer.d1.sc.omtrdc.net +softlinesolutions.me +softlinkers.popunder.ru +softnewready.systemgeneratorofbrandnewcontent.date +softomix.com +softonic-analytics.net +softonic.112.2o7.net +softonic.com +softonic.de.intellitxt.com +softonic.it +softpedia.uk.intellitxt.com +softpedia.us.intellitxt.com +softreadynow.thebigforeverupgrade.review +softreadynow.thereadysetandgoforcontentprepared.trade +softreadynow.thespaceupdatespcandmac.info +softservebusiness.com +softsmart.mobi +softtor.com +softupdate.net +software-phile.com +software-updates.co +software-wenc.co.cc +software.instant-income-app.com +softwareoutfit.com +softwarepiset.com +softwareschmiede.de +softwaretrend.net +softwareupdate.thebestevercentralsystoupdate.stream +softwareupdaterlp.com +softxaker.ru +sogostosas.net +soheavyblog.com +sohh.us.intellitxt.com +soju.openx.net +soka-adserver.c1exchange.com +sokrates.adtech.de +sokrates.adtech.fr +sokrates.adtech.us +sokratesolkusz.pl +sol-images.adbureau.net +sol.adbureau.net +solamor.com +solariumcams.de +solarwinds.tt.omtrdc.net +soldens.ru +solicita.info +solidallianzemfb.com +solidbau.oewabox.at +solitaire-game.ru +solitairetime.com +solnplast.ru +solution.weborama.fr +solutionscore.com +solveseek.com +solvusoft.com +som.aeroplan.com +soma-assets.smaato.net +soma-store.visa-usa.ru +soma.1.p2l.info +soma.3xforum.ro +soma.smaato.net +sombersea.com +sombersquirrel.com +sombersurprise.com +somethingawful.crwdcntrl.net +somethingawful.us.intellitxt.com +somethingnice.hc0.me +somniture.stuff.co.nz +somnoy.com +somoreq-track-west-1951866777.us-west-1.elb.amazonaws.com +sompuserve.com +sonar.dev.fwci.aws.fwmrm.net +sonar.sociomantic.com +sonar.vuble.tv +sonarqube.mparticle.com +sonata.1.p2l.info +sonatns.sonatrach.dz +sondheim.appboy.com +songbird.fr +sonic-dev.supersonicads.com +sonic-us.supersonicads.com +sonic.rubiconproject.com +sonoa.aweber.com +sonobi-go.map.fastly.net +sonobi.com +sony.tcliveus.com +sonychina.112.2o7.net +sonycomputerentertai.tt.omtrdc.net +sonycorporate.112.2o7.net +sonycorporate.122.2o7.net +sonyelectronicssupportus.112.2o7.net +sonyglobal.112.2o7.net +sonygs.112.2o7.net +sonymediasoftware.112.2o7.net +sonypanasia.112.2o7.net +sonyscei.112.2o7.net +soongu.info +soperson.com +sophang8.com +sophos-secure.247realmedia.com +soros.departamentosejecutivos.cl +sortable.com +soski.popunder.ru +sostats.mozilla.com +soundcloud.adswizz.com +sourcecreative.dev.extremereach.com +sourceforgemedia-computing.t.domdex.com +sourcegraph.uc1.yext.com +sourcepoint.mgr.consensu.org +sourmath.com +sousay.info +southcoasttoday.112.2o7.net +southcoasttodaycom.112.2o7.net +sovereign.sitetracker.com +sovrn.mgr.consensu.org +soxorok.ddospower.ro +sp-api.analytics.yahoo.com +sp-ycpi.analytics.yahoo.com +sp.adbrn.com +sp.analytics.yahoo.com +sp.backtrace.io +sp.escapicon.net +sp1.convertro.com +sp10050c00.guided.ss-omtrdc.net +sp1cluster.cxense.com +spa-login-ui.sandbox53.localytics.com +spa-orch-ui.sandbox53.localytics.com +spacash.com +space.us.intellitxt.com +spaceforyou.cc +spacepools.org +spaces.ero-advertising.com +spaces.slimspots.com +spads.yamx.com +spam.juicemobile.com +spam.maxpoint.com +spamfighter.112.2o7.net +spamnuker.com +spanel.gem.pl +spanids.dictionary.com +spanids.thesaurus.com +spanishdict-d.openx.net +spankbang.co.uk +spankdatass.com +spanking-images.com +spanking-sex.com +spankingvideo.us +spankme.info +spankmedaddy.blogspot.com +spanktown.com +sparc.nour.net.sa +sparechange.io +spark-cluster.svc.kargo.com +spark.palebrook.wbinsights.com +spark.svc.kargo.com +sparkass-ansbach.de +sparkcognition.co +sparkinfosystems.com +sparknetworks.112.2o7.net +sparkstudios.com +sparnove.com +spasswelt.net +spasswelt.xyz +spatsz.com +spawn.syndicaster.tv +spb-plitka.ru +spbchampionat.ru +spc-maker.com +spc.cefhdghhafdgceifiehdfdad.iban.telemetryverification.net +spc.cekfmeoejdbfcfichgbfcgjf.vast2as3.glammedia-pubnet.northamerica.telemetryverification.net +spcode.baidu.com +spd.atdmt.com +spd.atdmt.speedera.net +spe.atdmt.com +special-alerts.com +special-porn.com +special-promotion.online +specialfinanceoffers.com +specialgiftrewards.com +specially4u.net +specialoffers.aol.com +specialonlinegifts.com +specials-rewardpath.com +specialsections.siteseer.ca +specialtyclub.hitbox.com +specialvipaccess.com +specificmedia.co.uk +specificmedia.com +specificpop.com +specilized.com +spectacularsnail.com +speed.lstat.youku.com +speed.pointroll.com +speed4cksa.ero-advertising.com +speed4up.com +speedaf.de +speedbar.myway.com +speedbd.com +speedboink.com +speedclecks.ero-advertising.com +speedclicks.ero-advertising.com +speedclics.ero-advertising.com +speedcounts.com +speedcurve.com +speedfile.info +speedguide.us.intellitxt.com +speediest.net +speedlicks.ero-advertising.com +speednetwork14.adk2.co +speednetwork14.adk2x.com +speednetwork6.adk2x.com +speedomizer.com +speedrep.com +speedshiftmedia.com +speedtestbeta.com +speedtv.us.intellitxt.com +speedynewsclips.com +speedyshare.com +speeuclicks.ero-advertising.com +speising.oewabox.at +spekband.com +spencergifts.112.2o7.net +spensa.co +spezialreporte.de +spi.domainsponsor.com +spiderbait.com +spidersboats.com +spiegel-de.spiegel.de +spiegel.ivwbox.de +spiegel.met.vgwort.de +spiffymachine.com +spike669.popunder.ru +spikemedia-d.openx.net +spiketv.112.2o7.net +spillvacation.com +spin.spinbox.net +spinbox.com +spinbox.consumerreview.com +spinbox.freedom.com +spinbox.maccentral.com +spinbox.macworld.com +spinbox.techtracker.com +spinbox.versiontracker.com +spine-insights.appspot.com +spinmedia-d.openx.net +spir.hit.gemius.pl +spirebaboon.com +spixel.adsafeprotected.com +spklds.com +spl.hit.gemius.pl +splashnews.uk.intellitxt.com +split.mixedtraffic.com +splitter.ndsplitter.com +spns.seriousads.net +spokeo.pl +spolecznosci.mgr.consensu.org +sponge.creditkarma.com +sponsor1.com +sponsorads.de +sponsoredlinks.nationalgeographic.com +sponsorpro.de +sponsors.behance.com +sponsors.ezgreen.com +sponsors.thoughtsmedia.com +sponsorships.net +spoor-api.ft.com +sport-betting-online.hitslog.net +sport1.wemfbox.ch +sport5.checkm8.com +sport5digital.checkm8.com +sportaladbg.hit.gemius.pl +sportalbg.adocean.pl +sportat.oewabox.at +sportingbeteur.adsrv.eacdn.com +sportingnews.122.2o7.net +sportingnews.us.intellitxt.com +sportowy-stream.pl +sports-bonuspath.com +sports-fitness-rewardpath.com +sports-offer.com +sports-offer.net +sports-premiumblvd.com +sports.ign.us.intellitxt.com +sports.msnbc.us.intellitxt.com +sports.rightpundits.us.intellitxt.com +sportscarillustrated.us.intellitxt.com +sportsillustrated.tags.crwdcntrl.net +sportsinteraction.com +sportsulsan.co.kr +spot.fitness.com +spotfront.mathtag.com +spotify.backtrace.io +spotify.sp.backtrace.io +spotlessweb.com +spots.ah-me.com +spotsniper.ru +spottysense.com +spotx-jinni.rtb.adx1.com +spotx2eventsbidder-east.extend.tv +spotxcdn.com.streamrail.net +spotxchange-a.akamaihd.net +spotxchange.com +spravki-online.hit.bg +sprawdz-ogladaj.bo.pl +sprawdziany-odpowiedzi.bo.pl +sprawdzianyodpowiedzi.pl +sprawdzianyonline.pl +sprawdzianyszkolne.pl +sprawdzktopodgglada.blogspot.com +spread.diadanoivabh.com.br +spreadyourtentacles.com +springaftermath.com +springclick-ads.s3.amazonaws.com +springserve.com +sprintglobal.112.2o7.net +sprintusers.us.intellitxt.com +sprymetrics.com +sps01.office.ctm.net +sptlkiyjsglayc.ru +spurioussteam.com +spx.owneriq.net +spyarsenal.com +spyhunter-download.s3.amazonaws.com +spykemediatrack.com +spylog.com +spylog.ru +spymac.us.intellitxt.com +spytrack.tic.ru +spyware-removers.shengen.ru +spyware-scan.100gal.net +spyware.usafreespace.com +spywarebegone.com +spywareit.com +spywarelabs.com +spywarenuker.com +spywarespy.com +spywords.com +sq2trk2.com +sq7.co.uk +sql-server-driver.beesearch.info +sqlservercentral.us.intellitxt.com +sqm.telemetry.microsoft.com +squarefootball.uk.intellitxt.com +squartera.info +squeamishscarecrow.com +squid.diepresse.com +squirrelhands.com +squirting-pussys.com +sr-rekneskap.no +sr.cookiescript.info +sr.rlcdn.com +sr2.liveperson.net +src-coaching.fr +src.kitcode.net +srch.atdmt.com +srcip.com +srcu.com +srcu.pw +srepdata.desmoinesregister.com +srepdata.usatoday.com +srodmiescie-napraw-laptopa.warszawa.pl +sroomafp.allyes.com +srs.targetpoint.com +srslogisticts.com +srta.pubocean.com +srv-us.znaptag.com +srv-wa.ad.yieldmanager.net +srv.adengage.com +srv.admailtiser.com +srv.adngin.com +srv.bebi.com +srv.bidvertiser.com +srv.buysellads.com +srv.carbonads.net +srv.clickfuse.com +srv.dco.advertising.com +srv.dynamicyield.com +srv.jt.ms +srv.juiceadv.com +srv.pixel.parsely.com +srv.sayyac.com +srv.sayyac.net +srv.stackadapt.com +srv.uk.znaptag.com +srv01.bitcoiner.win +srv02.bitcoiner.win +srv1.rapidstats.de +srv1.ricin.im +srv2.admedit.me +srv2.twittercounter.com +srv2trking.com +srv7.admedit.net +srvpub.com +srwww1.com +ss-01.com +ss-omtrdc.net +ss.aws.fwmrm.net +ss.drift.com +ss.hitbox.com +ss.klotski.aws.fwmrm.net +ss.mtree.com +ss.prod.paperg.com +ss.staging.paperg.com +ss.tiscali.com +ss.tiscali.it +ss1.zedo.com +ss2.zedo.com +ss3.zedo.com +ss7.zedo.com +ssacdn.com +ssads.osdn.com +ssapi.ad.cpe.dotomi.com +ssapi.dynamicyield.com +ssativewear.com +ssc.33across.com +ssc.independent.co.uk +sscdn.banners.advidi.com +ssd.speedcurve.com +ssdc.icelandair.com +sse-demo.dz.optimizely.com +ssearch.biz +ssend.microad.jp +ssg.ch +ssh.curalate.com +ssiapawz.com +ssl-6582datamanager.de +ssl-avd.innity.net +ssl-cdn.media.innity.net +ssl-cdn.multibrand3.pgsitecore.com.c.footprint.net +ssl-compass.oewabox.at +ssl-geizhals.oewabox.at +ssl-helpgvat.oewabox.at +ssl-karriere.oewabox.at +ssl-msn.oewabox.at +ssl-munchkin.marketo.net +ssl-sl-retargeting.adsonar.com +ssl-top.oewabox.at +ssl-uspgvat.oewabox.at +ssl-vg03.met.vgwort.de +ssl-willhab.oewabox.at +ssl-wko.oewabox.at +ssl.adtouchlabs.com +ssl.adx1.com +ssl.clickbank.net +ssl.d2.sc.omtrdc.net +ssl.eroscomix.com +ssl.google-analytics.com +ssl.mousestats.com +ssl.o.webmd.com +ssl.pathful.com +ssl.siteimprove.com +ssl.tmathtag.com +ssl.vizury.com +ssl.vungle.com +ssl.widgets.webengage.com +ssl.xml.adx1.com +ssl.xplosion.de +ssl001-reval.insnw.net +ssl001.insnw.net +ssl002.insnw.net +ssl003.insnw.net +ssl004.insnw.net +ssl2.pathful.com +ssl2anyone2.com +ssl2anyone3.com +ssl2anyone5.com +ssl3.adhost.com +ssl4anyone2.com +ssl4anyone3.com +ssl4anyone4.com +ssl4anyone5.com +sslads.vizury.com +sslgo.info +sslproxy-prod.adobedtm.com +ssltest.adviserplus.com +ssltest.branch.io +ssltest.media.net +ssltest.office.imprev.net +ssltest2.branch.io +ssltest2.media.net +ssltracking.esearchvision.com +sslvpn.rubiconproject.com +sslvpn.us +sslwidget.criteo.com +ssmklfrn.bid +sso-dev.staging.us-east-1.kops.kargo.com +sso.auth.mparticle.com +sso.canada.com +ssp.ad.xiaomi.com +ssp.adplus.co.id +ssp.adriver.ru +ssp.analyticson.com +ssp.anyclip-media.com +ssp.api.tappx.com +ssp.dev.tappx.com +ssp.face2trade.com +ssp.int.api.tappx.com +ssp.lkqd.net +ssp.omnitagjs.com +ssp.streamrail.net +ssp.thirdpresence.com +ssp.videostat.com +sspawdzktopodgglada.blogspot.com +sspcash.adxcore.com +ssphwy.rtb.adx1.com +ssq.tr.blismedia.com +ssr.franklyinc.com +sss.www.freecontent.date +sstatic1.histats.com +sstats.adobe.com +sstats.kroger.com +sstroy44.ru +ssuhghnjxbp.bid +ssum-sec.casalemedia.com +ssum.casalemedia.com +st-1.1fichier.com +st-a.props.id +st-flip-flipflop.pingdom.net +st-insight.props.id +st-n.ads1-adnow.com +st-n.ads2-adnow.com +st-www-4.pingdom.net +st.a-link.co.kr +st.acstnst.com +st.ad.adnow.com +st.ad.smaclick.com +st.adnow.com +st.blogads.com +st.directadvert.ru +st.dynamicyield.com +st.extole.io +st.extremereach.com +st.fanatics.com +st.getsitecontrol.com +st.hit.gemius.pl +st.kjli.fi +st.magnify.net +st.marketgid.com +st.n.ads1-adnow.com +st.n.ads2-adnow.com +st.pay-click.ru +st.pba.xl.pt +st.pc.adonweb.ru +st.sageanalyst.net +st.smartredirect.de +st.stripcdn.com +st.targetix.net +st.top100.ru +st.valueclick.com +st.videojam.tv +st.vq.ku6.cn +st.wetrack.it +st1.hit.gemius.pl +st1.ifbyphone.com +st2.dynamicyield.com +st3.dynamicyield.com +st3.qualtrics.com +sta.midasplayer.com +stable.app.optimizely.com +stabx.net +staceyscloset.com +stack-sonar.com +stack7.collect.igodigital.com +stack9.collect.igodigital.com +stackoverflow.dluat.com +stackoverflow.hex1.ru +stackoverflow.xyz +stackpoints.com +stacksee.lastestapk.com +stackthatbucks.com +stacyhubert.com +stadiumcrossing.com +staffingsolutions.net +staffpicks.outbrain.com +stag-admin.adyoulike.com +stag.kargo.com +stag.mdotlabs.com +stage-five.heyzap.com +stage-four.heyzap.com +stage-one.heyzap.com +stage-sbma.urbaninsight.com +stage-secure.leadback.advertising.com +stage-three.heyzap.com +stage-two.heyzap.com +stage.adx1.com +stage.ap-southeast-2.kops.kargo.com +stage.app.jivox.com +stage.beta.api.adx1.com +stage.branch.io +stage.config.dco.advertising.com +stage.convertro.com +stage.driftt.com +stage.guce.adaptv.advertising.com +stage.guce.adtech.de +stage.guce.adtechjp.com +stage.guce.adtechus.com +stage.guce.advertising.com +stage.guce.convertro.com +stage.guce.tacoda.at.atwola.com +stage.hitbox.com +stage.mobileapptracking.com +stage.oriel.mgr.consensu.org +stage.static.yieldmo.com +stage.tracker.springserve.com +stage.traffiliate.com +stage.tune.com +stage.tvpage.com +stage.us-east-1.kops.kargo.com +stage.us-west-1.kops.kargo.com +stage0.autopilothq.com +stage1.afghancuisine.com.au +stage1.autopilothq.com +stage101.hitbox.com +stage102.hitbox.com +stage103.hitbox.com +stage104.hitbox.com +stage105.hitbox.com +stage2.autopilothq.com +stage3.autopilothq.com +stageconnexity.snowflakeproxy.connexity.net +stager.53.localytics.com +stager2.53.localytics.com +staging-analytics.adotmob.com +staging-api.keen.io +staging-appengage-video.fyber.com +staging-aso.fiksu.com +staging-banner-server.fyber.com +staging-banner.fyber.com +staging-bidding-agent.fyber.com +staging-bs-creatives.fyber.com +staging-console-cdn.adnxs.com +staging-discuss.newrelic.com +staging-dmp.adotmob.com +staging-dps.adotmob.com +staging-dsp.adotmob.com +staging-engine.fyber.com +staging-gq1-x.flurry.com +staging-h-api.online-metrix.net +staging-images.newrelic.com +staging-interstitial-broker.fyber.com +staging-mediation.fyber.com +staging-mobile-collector.newrelic.com +staging-ofw-client-cdn.fyber.com +staging-ps.ispot.tv +staging-rocnation.lisnr.com +staging-service.newrelic.com +staging-sidekiq-status.appboy.com +staging-site.mediavine.com +staging-tlx.3lift.com +staging-tracker.fyber.com +staging-vault.adotmob.com +staging-video-broker.fyber.com +staging-video.fyber.com +staging-x.flurry.com +staging.5rocks.io +staging.accessiblemetrics.com +staging.adotmob.com +staging.adswizz.com +staging.adwyze.com +staging.adx1.com +staging.airfind.com +staging.amplitude.com +staging.analytics.ispot.tv +staging.api.curalate.com +staging.app-analytics.snapchat.com +staging.banners.advidi.com +staging.bid.snapads.com +staging.c.msas.media.net +staging.c.vindicosuite.com +staging.clickconvertsell.com +staging.criteo.com +staging.d.msas.media.net +staging.demandbase.com +staging.eam.pubocean.com +staging.fastly-insights.com +staging.forecast.snapads.com +staging.front.banners.advidi.com +staging.fullstory.com +staging.imprev.net +staging.juicemobile.com +staging.kargo.com +staging.keen.io +staging.lisnr.com +staging.mater.iubenda.com +staging.msrv.saastest.appdynamics.com +staging.newrelic.com +staging.om.api.ispot.tv +staging.outcome.snapads.com +staging.p.msas.media.net +staging.paperg.com +staging.picreel.com +staging.pixel.printsites.net +staging.pluto.mgr.consensu.org +staging.prebid.org +staging.presage.io +staging.privacy-center.org +staging.rubiconproject.com +staging.saastest.appdynamics.com +staging.sam.snapads.com +staging.sh.msas.media.net +staging.snip.answers.com +staging.tt.omtrdc.net +staging.unityads.unity3d.com +staging.us-east-1.kops.kargo.com +staging.us-west-1.kops.kargo.com +staging.vindicosuite.com +staging.webxmr.com +staging.wootric.com +staging.x.vindicosuite.com +staging.yodelmobile.com +staging1.dynamicyield.com +staging1.lisnr.com +staging2.dynamicyield.com +staging2.mater.iubenda.com +staging3.dynamicyield.com +staging4.dynamicyield.com +staging5.dev.tapjoy.com +staging5.dynamicyield.com +stags.bluekai.com +stags.peer39.net +stain.tv +stainless-steel-producers.com +stair.registrydomainservices.com +stairliftsarea.com +stairliftstrue.com +staket-pvc.se +stakingscrew.com +stakingslope.com +stal-rulon.ru +stamp1-azure-ext.newrelic.com +stamp2-azure-ext.newrelic.com +stampen.adtlgc.com +stampen.linkpulse.com +stamplive.com +stampscom.112.2o7.net +stampscom.tt.omtrdc.net +stan1.adultmoviezone.com +standardsandpraiserepurpose.com +standingnest.com +standmill.com +standrewsgolfclub.com +stansporn.com +stanthonyscatholicchurch.org +stanzapub.advertserve.com +stapt.com +star-advertising.com +star-gay.net +star-modelgroup.com +star-movies.com +star.pulseonclick.com +star61.de +starcasm.us.intellitxt.com +starchat.oewabox.at +stardevine.com +stardk.tradedoubler.com +starffa.com +starkey.theappgrader.com +starlix.ql.st +starpulse.us.intellitxt.com +starsnude.biz +starsnues.biz +start.badults.se +start.branch.io +start.driftt.com +start.freeze.com +start.myplaycity.com +start.outster.com +start.qip.ru +start.sextracker.com +start.stage.driftt.com +start.xxxcounter.com +startlmes.com +startnow.com +startonmonday.com +startpornwebmasters.com +startpunt.nu.site-id.nl +startufa.ru +startup.inmobi.com +startupbiz.ro +startuptuesday.com +starvirgin.com +starz.122.2o7.net +stash.office.yext.com +stast2.gq.com +stat-c.maxthon.com +stat-counter.tass-online.ru +stat-tracker.net +stat.4u.pl +stat.56.com +stat.adlabs.ru +stat.alibaba.com +stat.aport.ru +stat.axelspringer.hu +stat.blogads.com +stat.cliche.se +stat.clickfrog.ru +stat.cncenter.cz +stat.dealtime.com +stat.delo.ua +stat.detelefoongids.nl +stat.discogs.com +stat.dyna.ultraweb.hu +stat.ebuzzing.com +stat.ekologia.pl +stat.fengniao.com +stat.flashtalking.com +stat.ganbox.com +stat.gw.youmi.net +stat.it168.com +stat.komoona.com +stat.maalaimalar.com +stat.miraben.pw +stat.mystat.hu +stat.netinfocompany.bg +stat.netmonitor.fi +stat.onestat.com +stat.p24.hu +stat.pchome.net +stat.pl +stat.ringier.cz +stat.rolledwil.biz +stat.stars.ru +stat.synergy-e.com +stat.tudou.com +stat.upforitnetworks.com +stat.webmedia.pl +stat.www.fi +stat.yellowtracker.com +stat.youku.com +stat.zenon.net +stat0.888.ku6.com +stat001.mylivepage.com +stat002.mylivepage.com +stat003.mylivepage.com +stat004.mylivepage.com +stat005.mylivepage.com +stat006.mylivepage.com +stat007.mylivepage.com +stat008.mylivepage.com +stat009.mylivepage.com +stat010.mylivepage.com +stat0808.info +stat1.888.ku6.com +stat1.vipstat.com +stat1.z-stat.com +stat2.888.ku6.com +stat2.corp.56.com +stat24.com +stat24.meta.ua +stat3.888.ku6.com +stat3.cybermonitor.com +statcounter.com +statdb.pressflex.com +statham.adsttc.com +stathat.com +stati.bid +stati.in +static-02.flu.cc +static-acceptance.sharethrough.com +static-bp.kameleoon.com +static-cnt.bid +static-ex.epom.com +static-net.nut.cc +static-shareaholic.s3.amazonaws.com +static-ssl.exoclick.com +static-staging.sharethrough.com +static-tagr.gd1.mookie1.com +static-test.outbrain.com +static-trackers.adtarget.me +static-uk.addynamo.net +static-uk.plista.com +static-upload.appdynamics.com +static.2mdn.net +static.4chan-ads.org +static.99widgets.com +static.a-ads.com +static.acceptance.sharethrough.com +static.ad.libimseti.cz +static.adbutter.net +static.adclick.lt +static.adclick.lv +static.addtoany.com +static.addynamo.net +static.adfarm1.adition.com +static.adfclick1.com +static.adk2.com +static.adman.gr +static.admaximize.com +static.ads-twitter.com +static.ads.crakmedia.com +static.adsafeprotected.com +static.adsnative.com +static.adsonar.com +static.adtaily.com +static.adtaily.pl +static.advidi.com +static.adwo.com +static.adx1.com +static.adzerk.net +static.adziff.com +static.aff-landing-tmp.foxtab.com +static.affiliation-france.com +static.allinviews.com +static.amp.services +static.amplitude.com +static.ampxchange.com +static.ard.xxxblackbook.com +static.atgsvcs.com +static.audienceinsights.net +static.audiensis.com +static.awempire.com +static.beeviewd.com +static.bestcontentonline.com +static.bronto.com +static.brsrvr.com +static.canalstat.com +static.carbonads.com +static.cdn.adblade.com +static.cdn.gtsmobi.com +static.chartbeat.com +static.clickonometrics.pl +static.clickpapa.com +static.clicktorrent.info +static.clicktripz.com +static.clmbtech.com +static.contentabc.com +static.cpalead.com +static.crakbanner.com +static.creatives.livejasmin.com +static.criteo.com +static.criteo.net +static.dable.io +static.dable.io.edgekey.net +static.dev.vilynx.com +static.display.khingtracking.com +static.doubleclick.net +static.dynad.net +static.dynamicyield.com +static.elixmedia.com +static.estebull.com +static.etracker.com +static.eu.criteo.net +static.everyone.net +static.exaccess.ru +static.exoclick.com +static.exosrv.com +static.firehunt.com +static.fleshlight.com +static.fmpub.net +static.freebitco.in +static.freenet.de +static.freeskreen.com +static.getclicky.com +static.gfx.streamate.com +static.gfx.streamen.com +static.groupy.co.nz +static.h-bid.com +static.hatid.com +static.hitfarm.com +static.hk.rs +static.hotjar.com +static.httpool.com.mk +static.ifa.camads.net +static.ifa.empflixlive.com +static.ifa.slutloadlive.com +static.ifa.yobtcams.com +static.installfarm.com +static.intercomcdn.com +static.inviziads.com +static.itrack.it +static.jp.as.criteo.net +static.justhookup.com +static.kameleoon.com +static.kibboko.com +static.ku6.com +static.l3.cdn.adbucks.com +static.l3.cdn.adsucks.com +static.lakana.com +static.linkz.net +static.loboclick.com +static.lstat.youku.com +static.luminate.com +static.mackeeper.com +static.mediav.com +static.meteorsolutions.com +static.nectarads.com +static.nrelate.com +static.ny.us.criteo.net +static.onlinevenditatio.space +static.openads.motorrad-net.at +static.oroll.com +static.parkingpanel.com +static.parsely.com +static.plista.com +static.plugrush.com +static.proximic.com +static.pubdirecte.com +static.pulse.inmobi.com +static.pulse360.com +static.pxlad.io +static.rbl.ms +static.realmediadigital.com +static.reasedoper.pw +static.regiojobs.be +static.retirementcommunitiesfyi.com +static.rtb.adx1.com +static.scanscout.com +static.scroll.com +static.shareasale.com +static.sharethrough.com +static.shoofle.tv +static.site24x7rum.com +static.skimlinks.com +static.smni.com +static.sparechange.io +static.springmetrics.com +static.staging.sharethrough.com +static.styria-digital.com +static.sv.us.criteo.net +static.tags.yield-atx.com +static.test.vilynx.com +static.theappgrader.com +static.trackedweb.net +static.tracking202.com +static.trackuity.com +static.traffic.ru +static.trafficjunky.net +static.trafficstars.com +static.truconversion.com +static.uk.addynamo.com +static.unister-adservices.com +static.unocdn.com +static.vertamedia.com +static.vidazoo.com +static.vilynx.com +static.virgul.com +static.vpptechnologies.com +static.way2traffic.com +static.williamhill.com +static.wooboo.com.cn +static.woopra.com +static.xtify.com +static.yieldmo.com +static.youappi.com +static.youmi.net +static.zanox.com +static.zemanta.com +static1.freebitco.in +static1.influads.com +static2.freebitco.in +static2.mopub.com +static2.yieldmo.com +static3.freebitco.in +static4.emoticonize.com +static4.freebitco.in +static5.freebitco.in +static6.freebitco.in +static7.freebitco.in +static8.freebitco.in +staticads.btopenworld.com +staticb.mydirtyhobby.com +staticd.cdn.adblade.com +staticd.cdn.industrybrains.com +statics-asia.creativecdn.com +statics-europe.creativecdn.com +statics-usa.creativecdn.com +staticsfs.host +staticw2.yotpo.com +statik.topica.com +statique.secureguards.eu +statistic.date +statistici.ro +statistics.dynamicsitestats.com +statistics.elsevier.nl +statistics.reedbusiness.nl +statistics.theonion.com +statistik-gallup.dk +statistik-gallup.net +statistik.bundestag.de +statistik.polizei-beratung.de +statistiq.com +statm.the-adult-company.com +statrafongon.biz +stats-collector.org +stats-d1396.epom.com +stats-newyork1.bloxcms.com +stats-public.grammarly.io +stats-reporting-server-prod.snapads.com +stats-reporting-server-shadow.snapads.com +stats-reporting-server-staging.snapads.com +stats-tm.everesttech.net +stats.24.com +stats.24ways.org +stats.absol.co.za +stats.adbrite.com +stats.addsearch.com +stats.adotube.com +stats.adspaces.ero-advertising.com +stats.adultswim.com +stats.agent.co.il +stats.agentinteractive.com +stats.airfarewatchdog.com +stats.allliquid.com +stats.appsflyer.com +stats.askmen.com +stats.askmoses.com +stats.asp24.pl +stats.backcountry.com +stats.bannersnack.com +stats.bbc.co.uk +stats.becu.org +stats.berkman.harvard.edu +stats.bidgear.com +stats.big-boards.com +stats.blogger.com +stats.blogoscoop.net +stats.bluebillywig.com +stats.bonzaii.no +stats.bookingbuddy.com +stats.break.com +stats.brides.com +stats.buycostumes.com +stats.buysellads.com +stats.buzzparadise.com +stats.cafepress.com +stats.canalblog.com +stats.cartoonnetwork.com +stats.click-internet.fr +stats.clickability.com +stats.clicktracks.com +stats.cloudwp.io +stats.complex.com +stats.concierge.com +stats.count.ly +stats.cryptotab.net +stats.cts-bv.nl +stats.dailyrecord.co.uk +stats.darikweb.com +stats.darkbluesea.com +stats.data2.ero-advertising.com +stats.datahjaelp.net +stats.defense.gov +stats.dice.com +stats.directexpose.com +stats.directnic.com +stats.dmx.districtm.io +stats.dnparking.com +stats.drugstore.com +stats.dziennik.pl +stats.e-go.gr +stats.economist.com +stats.epicurious.com +stats.ero-advertising.com +stats.esomniture.com +stats.examiner.com +stats.f-secure.com +stats.fairmont.com +stats.fastcompany.com +stats.fd.nl +stats.foxcounter.com +stats.free-rein.net +stats.freeonlinegames.com +stats.ft.com +stats.g.doubleclick.net +stats.gamestop.com +stats.gc-apple.com.akadns.net +stats.gc.apple.com +stats.gc.fe.apple-dns.net +stats.globesports.com +stats.groupninetyfour.com +stats.grubstreet.com +stats.hitbox.com +stats.homestead.com +stats.hosting24.com +stats.hyperinzerce.cz +stats.idsoft.com +stats.ign.com +stats.ilsemedia.nl +stats.immense.net +stats.independent.co.uk +stats.indexstats.com +stats.indextools.com +stats.infogenservice.com +stats.infomedia.net +stats.inist.fr +stats.investors.com +stats.ipinyou.com +stats.ircfast.com +stats.itweb.co.za +stats.iwebtrack.com +stats.jippii.com +stats.jpush.cn +stats.jtvnw.net +stats.kaltura.com +stats.klsoft.com +stats.l.doubleclick.net +stats.ladotstats.nl +stats.libresse.no +stats.lightningcast.net +stats.livingsocial.com +stats.macworld.com +stats.magnify.net +stats.mako.co.il +stats.manticoretechnology.com +stats.media.onet.pl +stats.merriam-webster.com +stats.metacount.com +stats.mezzobit.com +stats.millanusa.com +stats.minexmr.com +stats.mirrorfootball.co.uk +stats.mvilivestats.com +stats.netsolads.com +stats.nowpublic.com +stats.nymag.com +stats.oix.com +stats.olark.com +stats.outster.com +stats.ozwebsites.biz +stats.pagefair.com +stats.palebrook.wbinsights.com +stats.pandora.com +stats.parstools.com +stats.partypoker.com +stats.paycounter.com +stats.pckeeper.software +stats.persgroep.be +stats.persgroep.nl +stats.pflexads.com +stats.platinumbucks.com +stats.polldaddy.com +stats.popscreen.com +stats.pusher.com +stats.reinvigorate.net +stats.resellerratings.com +stats.revenue.net +stats.sa-as.com +stats.sbstv.dk +stats.searchles.com +stats.self.com +stats.sextracker.com +stats.shopify.com +stats.snacktools.net +stats.space-es.com +stats.speedclicks.ero-advertising.com +stats.sponsorafuture.org.uk +stats.srvasnet.info +stats.ssa.gov +stats.street-jeni.us +stats.style.com +stats.styletechnology.me +stats.superstats.com +stats.telegraph.co.uk +stats.thoughtcatalog.com +stats.topofblogs.com +stats.townnews.com +stats.tubemogul.com +stats.tudou.com +stats.tunt.lv +stats.twistage.com +stats.ultimate-webservices.com +stats.unionleader.com +stats.unwired-i.net +stats.ventivmedia.com +stats.video.search.yahoo.com +stats.virtuemart.net +stats.visistat.com +stats.vodpod.com +stats.voyages-sncf.com +stats.vulture.com +stats.warenform.de +stats.watchmygf.com +stats.webleads-tracker.com +stats.widgadget.com +stats.wired.com +stats.wmadv.com +stats.wordpress.com +stats.wp.com +stats.www.ibm.com +stats.x14.eu +stats.xxxkey.com +stats.xxxrewards.com +stats.yourminis.com +stats.zmags.com +stats.zotabox.com +stats0.one.ru +stats1.clicktracks.com +stats1.corusradio.com +stats1.in +stats1.one.ru +stats1.porntrack.com +stats2.allure.com +stats2.arstechnica.com +stats2.clicktracks.com +stats2.details.com +stats2.dooyoo.com +stats2.glamour.com +stats2.golfdigest.com +stats2.gourmet.com +stats2.gq.com +stats2.hitbox.com +stats2.lightningcast.net +stats2.luckymag.com +stats2.newyorker.com +stats2.one.ru +stats2.radiocompanion.com +stats2.rte.ie +stats2.self.com +stats2.teenvogue.com +stats2.unrulymedia.com +stats2.vanityfair.com +stats2.wmagazine.com +stats3.clicktracks.com +stats3.hitbox.com +stats3.porntrack.com +stats3.unrulymedia.com +stats4.clicktracks.com +stats4all.com +stats5.lightningcast.com +stats6.lightningcast.net +statscollectorloadbalancer-695351754.us-east-1.elb.amazonaws.com +statse.webtrendslive.com +statsf-tm.everesttech.net +statsfe2.ws.microsoft.com +statsgoogle.appsflyer.com +statsie.com +statstracker.celebrity-gossip.net +statsv3.gaycash.com +statt-schamanen.de +statto.plus8.net +status.addthis.com +status.adroll.com +status.amplitude.com +status.appsee.com +status.aweber.com +status.branch.io +status.bronto.com +status.demandbase.com +status.driftt.com +status.foresee.com +status.franklyinc.com +status.fullstory.com +status.intercom.io +status.livefyre.com +status.marketo.com +status.minexmr.com +status.mixpanel.com +status.newrelic.com +status.optimizely.com +status.survicate.com +status.thunderhead.com +status.trackjs.com +status.urbanairship.com +statusbeta.parsely.com +statxpress.com +stbcast-stb.metric.gstatic.com +stbcast.metric.gstatic.com +stbcast2-stb.metric.gstatic.com +stbcast2.metric.gstatic.com +stbcast3-stb.metric.gstatic.com +stbcast3.metric.gstatic.com +stbcast4-stb.metric.gstatic.com +stbcast4.metric.gstatic.com +stbcast5-stb.metric.gstatic.com +stbcast5.metric.gstatic.com +std.o.webmd.com +std1.hit.gemius.pl +steadfastsound.com +steadfastsystem.com +steadyhealth.us.intellitxt.com +stealthedeal.com +steam-wallet-gifts.com +steam-wallet-money.com +steamco.de +steamgifts.5v.pl +steelhouse.com +steelhousemedia.com +steenbergen.web.ero-advertising.com +stellarium.fr +stellite.crypto-webminer.com +stepan007.popunder.ru +stephanie.tnctrx.com +stephens-laughlin.com +stepnation.com +stepstone.112.2o7.net +sterling.alphonso.tv +stf.terra.com.br +stg-ads.inmobi.com +stg-ads.servebom.com +stg-reports.web.analytics.yahoo.com +stg-ua.inmobi.com +stg-y.analytics.yahoo.com +stg.a.analytics.yahoo.com +stg.ads.internal.unity3d.com +stg.adx1.com +stg.api.publishers.adasiaholdings.com +stg.cyclone.aws.fwmrm.net +stg.fwmrm.net +stg.fyber.com +stg.jwpltx.com +stg.klotski.aws.fwmrm.net +stg.linear.aws.fwmrm.net +stg.oem.inmobi.com +stg.tapad.com +stg.widget.crowdignite.com +stg1.push.stg1.sumo.com +stg1.sumo.com +stg2.sumo.com +stg3.sumo.com +stg4.sumo.com +stgads.undertone.com +stgapi.ibm.xtify.com +stgconsole.ibm.xtify.com +sticker.yadro.ru +stickssheep.com +stickyadstv.com +stignita.zapto.org +stinger-ad.bidr.io +stir.semilo.com +stl.p.a1.traceworks.com +sto.midasplayer.com +stock.daydreamfuze.com +stocker.bonnint.net +stockgroup.us.intellitxt.com +stocks-analytics-events.apple.com +stocks-analytics-events.news.apple-dns.net +stoiximan.gr +stone.cryptaloot.pro +stone.cryptoloot.pro +stone.directprimal.com +stone.webmine.pro +stone2.authcaptcha.com +stone2.directprimal.com +stonecalcom.com +stop-sign.com +stop-smoking.1.p2l.info +stopemailfraud.returnpath.com +stopmeagency.free.fr +stopnop.com.pl +stopphoulplay.com +stopphoulplay.net +storage-http2.cloud.kargo.com +storage.adsolutions.nl +storage.bulletproofserving.com +storage.cloud.kargo.com +storage.outbrain.com +storage.softure.com +storage.trafic.ro +storagesc.cloud.kargo.com +store-red.zostan-zwyciezca.com +store.adx1.com +store.appdynamics.com +store.exacttarget.com +store.gumgum.com +store.intercom.io +store.taboola.com +storeconfig.mistat.intl.xiaomi.com +storesurprise.com +stories.automatad.com +stork.escortfinder.cl +storknet.us.intellitxt.com +stormyachiever.com +stormyshock.com +stormysponge.com +stoveseashore.com +stpetersburgtimes.122.2o7.net +str.hit.gemius.pl +str1kee.com +straightnest.com +straightresults.com +straightschool.com +straighttangerine.cz.cc +strangeduckfilms.com +strategy.lmobi.net +strawpoii.me +stream-direct.co +stream-online.com.pl +stream.allinviews.com +stream.beeviewd.com +stream.bestcontentonline.com +stream.installfarm.com +stream.livefyre.com +stream.nullrefexcep.com +stream.placeyourview.com +stream.shoofle.tv +stream1.livefyre.com +stream1.marketwatch.fyre.co +stream1.t402.livefyre.com +stream24.com.pl +stream4fun.com +streamamp.mgr.consensu.org +streamate.com +streamate.doublepimp.com +streamdream.ws +streamgo.pl +streaming-dev.adswizz.com +streaming.adswizz.com +streamplay.me +streamplay.to +streamrail.net +streamuj.org +streetview.siliconorchard.com +stressx.org +strikead.sizmek.com +strikeadcdn.s3.amazonaws.com +stripcdn.com +stripedburst.com +stripteas.com +strivesidewalk.com +stroer-d.openx.net +structured.blackswanstore.com +structurerod.com +struq.quantserve.com +stsoftware.biz +sttc.affiliate.hu +stts.rbc.ru +sttvisa.com +stua.hit.gemius.pl +stub.api.jivox.com +stubhub.122.2o7.net +studio-aparte.com +studio-content.com +studio-fuer-fitness.de +studio.ev1.inmobi.com +studio.glance.inmobi.com +studio.livefyre.com +studio.survata.com +studio7arts.com +studioalimo.com +studiodiconsulenzalavoro.it +studiodigital.co.uk +studiofaca.com +studivz.ivwbox.de +study-dev.snapads.com +study-shadow.snapads.com +study-staging.snapads.com +study.snapads.com +studyguide.org +stuff-about-money.com +stuntoffer.com +stupendi.net +stupendoussleet.com +stupidcelebrities.us.intellitxt.com +sturdy.tk +stx.banners.sextracker.com +stx.sextracker.com +stx0.sextracker.com +stx1.sextracker.com +stx10.sextracker.com +stx11.sextracker.com +stx12.sextracker.com +stx13.sextracker.com +stx14.sextracker.com +stx15.sextracker.com +stx2.sextracker.com +stx3.sextracker.com +stx4.sextracker.com +stx5.sextracker.com +stx6.sextracker.com +stx7.sextracker.com +stx8.sextracker.com +stx9.sextracker.com +stxbans.sextracker.com +styleblazer.us.intellitxt.com +styleguide.dynamicyield.com +styleguide.outbrain.com +stylincom.112.2o7.net +styro.ru +su.addthis.com +su.iadsdk.apple.com +subaat.com +subad-server.com +subaruofamerica.112.2o7.net +subloader.cf +submit-proxy.info +submit.backtrace.io +submit01.linode-ca1.backtrace.io +submit01.linode-de1.backtrace.io +submit01.linode-jp2.backtrace.io +submit01.linode-nj1.backtrace.io +subscribe.hearstmags.com +subtracts.userplane.com +succeedscene.com +success-playground.getambassador.com +success-seo.com +success.adroll.com +success.drift.com +success.marketo.com +success.optimizely.com +success.qualtrics.com +success.yext.com +successexample.getambassador.com +successful-marketing-now.com +successwave.com +suchaslowmac.tech +suchenindeutschland.com +suck-big-cocks.com +suckdude.com +suckingadog.nu +suckingdickporn.com +sucknuts.com +suckonthis.gold10.com +sucursales.cochadigital.com +suczki-mlode.blogspot.com +suczki.qii.pl +sudcom.org +suddenplot.com +suddensidewalk.com +sudexpert66.ru +sudokuwhiz.com +sueddeut.ivwbox.de +sufficientlife.com +sugar.paradym.com +sugarcurtain.com +suggest-keywords.com +sugiharaanri.com +sugoicounter.com +sugvant.ru +suhprdfb.bid +sukarame.net +sukebe.com +sukienka.com +sukirgenk.dvrlists.com +sulaica.com +sulkybutter.com +sultrycity.com +sumacorporativo.com.mx +summerhamster.com +summerlinhomes411.info +summerobject.com +summit.appdynamics.com +summitbusinessmedia.112.2o7.net +sumo.com +sumo.cpufan.club +sumo.cryptonoter.com +sumo.hashvault.pro +sumokoin.crypto-webminer.com +sumokoin.hashvault.pro +sumome.com +suncom.112.2o7.net +suncontent.com +sundaycashsaver.com +sunderfoods.com +sunglobal.112.2o7.net +sunhd.info +sunhe.jinr.ru +sunlux.net +sunmaker.com +sunny.oewabox.at +sunny99.cholerik.cz +sunonesearch.112.2o7.net +sunonsunday.com +suntimes-d.openx.net +suo.lp.mydas.mobi +sup.adfox.ru +super.oewabox.at +superbrewards.com +supercars.us.intellitxt.com +superclix.de +superegler.net +superfastcdn.com +superficial.crwdcntrl.net +superficialsink.com +superfiles.pl +supergroot.nl +superherohype.us.intellitxt.com +superinterstitial.com +superiorcoin.crypto-webminer.com +supermarket.zostan-zwyciezca.com +supermed.oewabox.at +supermedia24.pl +supernaturalart.com +supernature-forum.de.intellitxt.com +superpages.122.2o7.net +superpagesdexknowsprod.122.2o7.net +superprotection10.com +superserwisy.pl +supersonic.com +supersonicads-a.akamaihd.net +supersonicads.com +superstats.com +supertop.ru +supertop100.com +supload.com +supplements.1.p2l.info +support-beta.demandbase.com +support-case.marketo.com +support-crm.truconversion.com +support-ip.com +support-legacy.newrelic.com +support-p.shopcurbside.com +support-q1.shopcurbside.com +support-s.shopcurbside.com +support-staging.dynamicyield.com +support-t.shopcurbside.com +support-test.videoamp.com +support-win1230.com +support.2giga.link +support.5rocks.io +support.adswizz.com +support.apple.com-notice.info +support.appsee.com +support.appsflyer.com +support.autopilothq.com +support.beemray.com +support.bizible.com +support.branch.io +support.cb.qa-dest.imprev.net +support.celebrus.com +support.com-support-help.online +support.coremetrics.com +support.crashlytics.com +support.criteo.com +support.doubleclick.net +support.dynamicyield.com +support.east.ftp.extremereach.com +support.engagio.com +support.foresee.com +support.freshmarketer.com +support.inmobi.com +support.innovid.com +support.instartlogic.com +support.iubenda.com +support.kochava.com +support.localytics.com +support.marketing.qa-dest.imprev.net +support.mc1.qa-dest.imprev.net +support.metaps.com +support.mparticle.com +support.newrelic.com +support.optimizely.com +support.piwik.pro +support.placed.com +support.prudential.qa-dest.imprev.net +support.qa-dest.imprev.net +support.remax.qa-dest.imprev.net +support.returnpath.com +support.returnpath.net +support.rg1.qa-dest.imprev.net +support.rg2.qa-dest.imprev.net +support.rlp.qa-dest.imprev.net +support.rubiconproject.com +support.sextronix.com +support.shareaholic.com +support.sharethis.com +support.sharethrough.com +support.sizmek.com +support.sweepstakes.com +support.swrve.com +support.syndicaster.tv +support.thirdpresence.com +support.tritondigital.com +support.tune.com +support.urbanairship.com +support.vungle.com +support.west.ftp.extremereach.com +support.yext.com +support.yottaa.com +supportmx.support.tapjoy.com +supportnet.de.intellitxt.com +supportxmr.com +supremeadsonline.com +sureads.com +surebaby.us.intellitxt.com +suresafe1.adsovo.com +surfline.112.2o7.net +surfmusik-adserver.de +surfsecured.net +surplus-suppliers.com +survata.com +survey-q2.juicemobile.com +survey-staging.wootric.com +survey.112.2o7.net +survey.122.2o7.net +survey.china.alibaba.com +survey.foreseeresults.com +survey.g.doubleclick.net +survey.medallia.com +survey.nuggad.net +survey.o.webmd.com +survey.samplicio.us +survey.survicate.com +survey.wootric.com +survey1-au.imrworldwide.com +survey2.voicefive.com +surveycentral.directinsure.info +surveymonkeycom.tt.omtrdc.net +surveypass.com +surveywall-api.survata.com +survicate.com +survivingthemadness.com +survymonkey.xyz +susanholtphotography.com +suscotrk.com +sushiup.es +susi.adtech.fr +susi.adtech.us +susilyons.com +suspensioncourriel.weebly.com +sussi.cressoft.com.pk +sustainability.yext.com +sutdio.glance.inmobi.com +sutra.newzfind.com +suttonsurveyors.com.au +suzeeq.com +suzukimotor.112.2o7.net +sv.d2.omtrdc.net +sv.us.criteo.com +sv.us.criteo.net +svanaturals.com +svarbit.com +svarkagid.com +svarkon.ru +svastx.moatads.com +svbur.ru +svc.insnw.net +svc.kargo.com +svc.tapad.com +svd.112.2o7.net +svd.adtlgc.com +svd2.adtlgc.com +svenskabrudar.net +svenskalotteri.se +svensktnarinsliv.se +sverd.net +sverigesstatsministrar.se +svetlotorg.ru +svetodiodoff.ru +svetyivanrilski.com +svfronhofen.net +sview.avenuea.com +svision-online.de +svivqrhrh.ru +svn.adtech.de +svn.dev.fwmrm.net +svn.office.imprev.net +svn18.rd.campaign.adobe.com +svnuppsalaorebro.se +svpro7.oewabox.at +svr1.east.cloud.ftp.extremereach.com +svr1.west.cloud.ftp.extremereach.com +svr2.east.cloud.ftp.extremereach.com +svr2.west.cloud.ftp.extremereach.com +svtrd.com +svtution.org +sw.interpolls.com +swa.and.co.uk +swa.demdex.net +swag.districtm.net +swag.taboola.com +swagbucks.com +swallowingsemenblog.com +swan-swan-goose.com +swanksoft.com +swanson.ron.si +swappit.tapad.com +swarajinternational.in +swarez.net +swedform.com +sweeney.appboy.com +sweepstakes.rewardit.com +sweepstakesall.com +sweepstakescentralusa.com +sweet-and-sassy.com +sweet-loving.com +sweet-model.com +sweet18cherries.com +sweet55ium55.com +sweetasspornsite.com +sweetcandy.us +sweetcum.net +sweetebonybabe.com +sweethos.com +sweeties.info +sweeties.ro +sweetjenna.com +sweetjoes.com +sweetlolita.nu +sweetlonglips.net +sweetporn18.com +sweetrape.com +sweetsforfree.com +sweetsimone.com +sweetvintageporn.com +swfhostltd.com +swiatecznybon.pl +swiatokazji.eu +swiatpobran.pl +swiezaki.weebly.com +swiftmining.win +swiftrunlakes.com +swimslope.com +swingciti.com +swingerclubs.nu +swingersads.co.uk +swingerseiten.com +swingersportugal.com +swingingcommunity.com +swingingmonkey.com.au +swinginwithme.ru +swinon.site +swintuszek.pl +swiped.su +swisscom.demdex.net +swissexe.ch +swissinf.wemfbox.ch +switch.atdmt.com +switch.d-agency.net +switch.hitbox.com +switch.rtbsystem.com +switch1.hitbox.com +switch10.hitbox.com +switch11.hitbox.com +switch5.hitbox.com +switch6.hitbox.com +switch8.hitbox.com +switch9.hitbox.com +switchadhub.com +switchads.com +switchboard.mixpanel.com +switchpoint.nl +switzerland-clinics.com +swizztime.com +swm-as.com +sword-swallowing.com +sword.directprimal.com +swordfishdc.com +swordgoose.com +sworkitads.herokuapp.com +swr.ivwbox.de +swrap.tradedoubler.com +swrve.com +swserver.de +swsociety.se +swsoft.122.2o7.net +swtkes.com +sx.innovid.com +sx.nazari.org +sx.z0rz.com +sxcdn02.now.sh +sxcdn03.now.sh +sxcdn04.now.sh +sxcdn06.now.sh +sxcdn1.herokuapp.com +sxcdn3.now.sh +sxcdn4.now.sh +sxcdn5.herokuapp.com +sxcdn6.now.sh +sxp.mxptint.net +sxxyy.info +sy.eu.angsrvr.com +sybian.tv +sybianriders.com +syd-dc01.marketo.net +syd-dc02.marketo.net +syd1.qualtrics.com +sydney.kargo.com +sydney01.monero.hashvault.pro +sydneywattle.com +sygraem.com +sylicomservicios.com +sylvane.122.2o7.net +sylvialowe.com +symantec.my-place.us +symantec.tt.omtrdc.net +symantex.com +symbalo.com +symbian-freak.us.intellitxt.com +symbianone.us.intellitxt.com +symbiosting.com +symphonyintegratedhealthcare.com +sympmsnglobalen.112.2o7.net +sympmsnmusic.112.2o7.net +sympmsnsports.112.2o7.net +syn.verticalacuity.com +synacor.112.2o7.net +synad.nuffnang.com.my +synad.nuffnang.com.sg +synad2.nuffnang.com.cn +synad2.nuffnang.com.my +sync-eu.exe.bid +sync-ovh.adotmob.com +sync-test.adotmob.com +sync-tm.everesttech.net +sync-unosync-com.geodns.me +sync.1rx.io +sync.adaptv.advertising.com +sync.adkernel.com +sync.adotmob.com +sync.atomex.net +sync.audtd.com +sync.bfmio.com +sync.clickonometrics.pl +sync.clrstm.com +sync.cmedia.s3.amazonaws.com +sync.credebat.com +sync.extend.tv +sync.go.sonobi.com +sync.graphly.io +sync.jivox.com +sync.mathtag.com +sync.monarchads.com +sync.outbrain.com +sync.placelocal.com +sync.pool.datamind.ru +sync.prod.paperg.com +sync.pulseradius.com +sync.rhythmxchange.com +sync.richmetrics.com +sync.search.spotxchange.com +sync.smrtb.com +sync.staging.paperg.com +sync.tidaltv.com +sync.upravel.com +sync.yieldmo.com +sync2.adsniper.ru +syncaccess.net +synchrobox.adswizz.com +synchronyfinancaluniversity.com +synchronyfinancialunivesity.com +synchronyfinanciauniversity.com +synchronyfincial.com +synchroscript.adswizz.com +synchroscript.deliveryengine.adswizz.com +synconnector.com +syncrepo.svc.insnw.net +syncsw.pool.datamind.ru +synd.netseer.com +syndicaster.tv +syndicaster.wpengine.com +syndicated.mondominishows.com +syndication-evo.exoclick.com +syndication.cntrafficpro.com +syndication.exdynsrv.com +syndication.exoclick.com +syndication.exosrv.com +syndication.extremereach.com +syndication.jsadapi.com +syndication.site.yahoo.net +syndication.traffichaus.com +syndication.trafficreps.com +syndication.twitter.com +sys-cleaner.com +sysadmin.map24.com +sysdeco.com +sysip.net +sysolar.com +system-kernel-disk-errorx001dsxx-microsoft-windows.55errors5353.net +system-test.dev.linear.aws.fwmrm.net +system.casalemedia.com +system.picreel.com +systemscheckusa.com +systweak.com +syvertsen-da.no +sz.met.vgwort.de +szalonenagrody.com +szalonepromocje.com +szaloneupusty.pl +szamponrevita.pl +szczepienie.info +szene1.oewabox.at +szexcsata.hu +szinhaz.hu +szklokontaktowe.pl +szkolabdsm.com.pl +szm.net +szmaty.pl +szokgwalt.blogspot.com +szokinfo247.blogspot.com +szybka-pozyczka.com +szybkapozyczkateraz.pl +szybki-przeglad.blogspot.com +t-ads.adap.tv +t.254a.com +t.6sc.co +t.abnad.net +t.acxiom-online.com +t.adk2.com +t.admob.com +t.adonly.com +t.ads.pof.com +t.afftrackr.com +t.agentanalytics.com +t.ambra.com +t.analytics.blue +t.ap1.dyntrk.com +t.ap2.dyntrk.com +t.appsflyer.com +t.atpanel.com +t.bbtrack.net +t.beanstalkdata.com +t.blogreaderproject.com +t.bmmetrix.com +t.btstatic.com +t.cfjump.com +t.channeladvisor.com +t.cpmadvisors.com +t.cqq5id8n.com +t.dailymail.co.uk +t.dtscout.com +t.dynad.net +t.eloqua.com +t.en25.com +t.eu1.dyntrk.com +t.extreme-dm.com +t.flux.com +t.frtyg.com +t.goadservices.com +t.grtyb.com +t.info.rezbine.com +t.insigit.com +t.invitemedia.com +t.lga.contextweb.com +t.mdn2015x1.com +t.mdn2015x2.com +t.mdn2015x3.com +t.medialytics.com +t.mookie1.com +t.mplxtms.com +t.neodatagroup.com +t.newlimitedoffer.com +t.nrelate.com +t.omkt.co +t.otherprofit.com +t.p.mybuys.com +t.pointroll.com +t.pswec.com +t.sellpoints.com +t.senaldos.com +t.senaluno.com +t.sf14g.com +t.sharethis.com +t.signaletre.com +t.signauxdeux.com +t.silvinst.com +t.skimresources.com +t.snowball.com +t.svtrd.com +t.teads.tv +t.trackedlink.net +t.trafmag.com +t.update.3lift.com +t.update.adsrvr.org +t.update.altitude-arena.com +t.update.clrstm.com +t.update.criteo.com +t.update.ib.adnxs.com +t.update.mopub.com +t.update.morgdog.springserve.com +t.update.rubiconproject.com +t.update.spotxchange.com +t.update.tidaltv.com +t.update.wo.gumgum.com +t.update.wtag.adaptv.advertising.com +t.us1.dyntrk.com +t.wowanalytics.co.uk +t.yesware.com +t.zeroredirect.com +t.zqtk.net +t0.extreme-dm.com +t01.proximic.com +t1.adserver.com +t1.extreme-dm.com +t1.midasplayer.com +t1.softonicads.com +t1.stormiq.com +t1.trackalyzer.com +t13.intelliad.de +t1ny.in +t2.junbi-tracker.com +t2.softonicads.com +t2.trackalyzer.com +t23.intelliad.de +t2lgo.com +t3-testing.marinsm.com +t3.marinsm.com +t3.trackalyzer.com +t3chtonic.com +t4.liverail.com +t4.trackalyzer.com +t402.livefyre.com +t5.trackalyzer.com +t6.trackalyzer.com +t610.screensaver.sms13.de +t8t7frium3.s.ad6media.fr +ta.at.ic5mp.net +ta.at.user-mode-linux.net +ta.com.tw +taaaak.com +tabak-sommer.de +tabakfrehner.ch +taberecrestine.com +tabex.sopharma.bg +tabfor.com +tabix.pfa.gcp.datamind.ru +tableau.adroll.com +tableau.marketo.com +tableporn.us +tabletkinaerekcjepl.pw +tabletkinaodchudzanie.com.pl +tabmo.io +taboola-d.openx.net +taboola.com +taboola.com.cdn.cloudflare.net +tackthisclick.com +tacobell.d1.sc.omtrdc.net +tacoda.at.atwola.com +taffr.com +tag-dev.sp.advertising.com +tag-mediation.supersonic.com +tag-st.contextweb.com +tag.1rx.io +tag.admeld.com +tag.adtrendmedia.net +tag.apxlv.com +tag.aticdn.net +tag.bounceexchange.com +tag.clrstm.com +tag.contextweb.com +tag.crsspxl.com +tag.datariver.ru +tag.demandbase.com +tag.digitaltarget.ru +tag.gayadnetwork.com +tag.hockeycurve.com +tag.imonomy.com +tag.marinsm.com +tag.mtrcs.samba.tv +tag.navdmp.com +tag.perfectaudience.com +tag.piwik.pro +tag.placelocal.com +tag.prod.paperg.com +tag.regieci.com +tag.researchnow.com +tag.rkdms.com +tag.sp.advertising.com +tag.staging.paperg.com +tag.testing.piwik.pro +tag.trackverify.com +tag.userreport.com +tag.webcompteur.com +tag.yieldoptimizer.com +tag1.webabacus.com +tagan.adlightning.com +tagcommander.com +tagging.outrider.com +tagline.bidsystem.com +taglocker.target.com +tagpress.oewabox.at +tags-cdn.deployads.com +tags.api.umbel.com +tags.bannercde.com +tags.bkrtx.com +tags.bluekai.com +tags.crwdcntrl.net +tags.deployads.com +tags.expo9.exponential.com +tags.extole.com +tags.h12-media.com +tags.hypeads.org +tags.mathtag.com +tags.mdotlabs.com +tags.mediaforge.com +tags.news.com.au +tags.onscroll.com +tags.rllcll.com +tags.spider-mails.com +tags.t.tailtarget.com +tags.tagcade.com +tags.tiqcdn.com +tags.toroadvertising.com +tags.w55c.net +tags1.eclkspsa.com +tagular.com +tahit.wastech2016.in +tahoesup.com +tailsweep.com +tailsweep.se +tainiesonline.pw +tainiesonline.stream +taintedvisage.com +taiwanx.net +takaful-malaysia.com +take.cloud +take3x.com +takeadd.com +takeflyte.com +takemake.com +taken4u.com +takeprofitsystem.com +takethatad.com +taking-technology.com +tako3.com +takru.com +taksirat.com.mk +talebetube.com +talent.extremereach.com +talent.ftp.extremereach.com +talentedsteel.com +taletela.us.intellitxt.com +talk99.cn +talkaxis.com +talkcity.realtracker.com +talkingpointsmemo-d.openx.net +tally.upsideout.com +talos.adman.gr +taloussanomat.linkpulse.com +tam.outbrain.com +tamiflu-in-canada.asian-flu-vaccine.com +tamiflu-no-prescription.asian-flu-vaccine.com +tamiflu-purchase.asian-flu-vaccine.com +tamiflu-without-prescription.asian-flu-vaccine.com +tamilcm.com +tamprc.com +tangerinenet.biz +tangibleteam.com +tango-d.openx.net +tangomedia.112.2o7.net +tanieaukcje.com +taniezakupy.pl +tanio-najtaniej.com +tanner.alicerosenmanmemorial.com +tanooki.adrizer.com +taobaoafp.allyes.cn +taobaoafp.allyes.com +tap-cdn.rubiconproject.com +tap-secure.rubiconproject.com +tap.ads-twitter.com +tap.mxptint.net +tap.rubiconproject.com +tapad.com +tapair.com +tapas.net +tapestry.tapad.com +tapety.zw.pl +tapfiliate.com +tapinfluence.com +tapjoy-com-lb-vpc-332546193.us-east-1.elb.amazonaws.com +tapjoy.com +tapjoyads.com +tappx.com +tapxchange.com +tar.tradedoubler.com +tarasoft.bg +targad.de +target.cm +target.e-generator.com +target.net.finam.ru +target.shopcurbside.com +target.smi2.net +targetctracker.com +targeting-insight.snapads.com +targeting-service.adtech.de +targeting-service.adtechus.com +targeting-shadow.snapads.com +targeting.adwebster.com +targeting.snapads.com +targeting.tronc.arcpublishing.com +targeting.unrulymedia.com +targeting.washpost.nile.works +targetingnow.com +targetnet.com +targetpoint.com +tarno.tradedoubler.com +tas-ba.toboads.com +tas-bg.toboads.com +tas-cz.toboads.com +tas-hr.toboads.com +tas-ks.toboads.com +tas-mk.toboads.com +tas-rs.toboads.com +tas-si.toboads.com +tas2.toboads.si +task.mediabong.net +task.vuble.tv +tastefulsongs.com +tates.freestats.com +tats.cecash.com +tatschke.net +tatsumi-sys.jp +tattooshaha.info +tavelscape.com +tavuks.com +tawdryson.com +taxi-petr.by +taz.adspirit.de +tazm9p7tso.trade +tb.altervista.org +tbl.tradedoubler.com +tbohiphop.us.intellitxt.com +tbs.tradedoubler.com +tbstv.112.2o7.net +tbsveryfunnyads.112.2o7.net +tbtrack.zutrack.com +tc-s.convertro.com +tc.adlink.net +tc.tradetracker.net +tc.zionsbank.com +tca-rtb1.rfihub.net +tcadops.ca +tcads.net +tcgtrkr.com +tcimg.com +tcinvitationsbydawn.112.2o7.net +tck.bangbros.com +tcm.optica.ero-advertising.com +tcmagazine.uk.intellitxt.com +tcookie.usatoday.com +tcr.tynt.com +tcrwharen.homepage.t-online.de +tcss.qq.com +tcy.smartadserver.com +td.demdex.net +tdameritrade.demdex.net +tdameritrade.tt.omtrdc.net +tdc.advertorials.dk +tdkads.ads.dk +tdn.r42tag.com +tdp.mxptint.net +tds.trafflow.com +tds.tuberl.com +tdxio.com +te.about.com +te.adlandpro.com +te.advance.net +te.ap.org +te.astrology.com +te.audiencematch.net +te.belointeractive.com +te.boston.com +te.businessweek.com +te.chicagotribune.com +te.chron.com +te.cleveland.net +te.ctnow.com +te.dailycamera.com +te.dailypress.com +te.dentonrc.com +te.greenwichtime.com +te.idg.com +te.infoworld.com +te.ivillage.com +te.journalnow.com +te.kontera.com +te.latimes.com +te.mcall.com +te.mgnetwork.com +te.mysanantonio.com +te.newsday.com +te.nytdigital.com +te.orlandosentinel.com +te.scripps.com +te.scrippsnetworksprivacy.com +te.scrippsnewspapersprivacy.com +te.sfgate.com +te.signonsandiego.com +te.stamfordadvocate.com +te.sun-sentinel.com +te.sunspot.net +te.suntimes.com +te.tbo.com +te.thestar.ca +te.thestar.com +te.trb.com +te.versiontracker.com +te.wsls.com +teads.mgr.consensu.org +teads.tv +tealeaf.com +tealium.hs.llnwd.net +team4heat.net +teamdzsn.beget.tech +teameda.comcastbiz.net +teameda.net +teams-admin.optimizely.com +teams-staging-admin.optimizely.com +teams-staging.optimizely.com +teams.optimizely.com +teamtalk.uk.intellitxt.com +tearsheet.onevideo.advertising.com +teatac4bath.com +tec.sarl.tk +tecchannel.de.intellitxt.com +tech-faq.us.intellitxt.com +tech.atom.adjust.com +tech.flurry.com +tech.realmedia.co.kr +tech.tritondigital.com +tech.weeklytribune.net +tech9638514.ru +techasiamusicsvr.com +techbargins.com +techblog.gumgum.com +techclicks.net +techeblog.us.intellitxt.com +techexpert.site +techgadgets.in.intellitxt.com +techgage.us.intellitxt.com +techguy.us.intellitxt.com +techimo.us.intellitxt.com +technewsworld.us.intellitxt.com +technicads.com +technicalconsumerreports.com +technicaldigitalreporting.com +technicserv.com +technicupdate.com +technobuffalo.us.intellitxt.com +technology-revealed.com +technology.inmobi.com +technology.msnbc.us.intellitxt.com +technologyguide.us.intellitxt.com +technologyreview.us.intellitxt.com +techops.yext.com +techpowerup.us.intellitxt.com +techques.com +techradar.uk.intellitxt.com +techradarcom.skimlinks.com +techreview-images.adbureau.net +techreview.112.2o7.net +techreview.adbureau.net +techsource.247realmedia.com +techspot.us.intellitxt.com +techspotcom.skimlinks.com +techsupportforum.us.intellitxt.com +techsupportpwr.com +techtricksworld.com +techworld.nl.intellitxt.com +techzine.nl.intellitxt.com +tecnocuer.com +tecslide.com +ted.dailymail.co.uk +tedioustooth.com +teen-jeune.biz +teen-lesbians-sex.net +teen-mania.com +teen-susan-grace-lesbians.blogomer.com +teen-thumbs.org +teen-tube-porn.thumblogger.com +teen.petitecoquine.com +teen.phelix.net +teen.streamate.com +teenhardsex.net +teenheaven.nu +teenhotpix.com +teeniechicks.com +teeniepass.com +teenieporns.com +teenierotic.com +teenlinkdump.com +teennova.com +teennudegirl.com +teennudistporn.com +teenokay.com +teenolga.com +teenoncam.com +teenpartysluts.com +teenporn.pl +teenpornfun.com +teenpornmovieclips.org +teenpornplanet.com +teenporns.org +teenpornsexxx.com +teenpornsquad.com +teenpussies.net +teenreports.com +teenrevenue.com +teenroadtrip.com +teens-dreamer.com +teens-latinas.com +teens-spot.com +teens24h.com +teensacademy.com +teensbj.com +teensbywebcam.com +teensex4real.com +teensexpics.nu +teensexweb.com +teensficken.thumblogger.com +teensforcash-porn.info +teensinvideos.thumblogger.com +teensjoy.com +teensnporno.com +teensporn.name +teenspornvids.com +teenspublicdisgrace.xyz +teenssexpics.net +teensteen.com +teenstrawberry.com +teenswank.com +teenswhoswallow.com +teenthongz.com +teentpanga.com +teenvideos.nu +teenvirgin.nu +teenxxx.dk +teenyvolcano.com +teenzforfun.com +teeser.ru +teespoon.co +teethfan.com +tehomercacom.112.2o7.net +tekindustri.upnjatim.ac.id +tel.geenstijl.nl +tel3adv.112.2o7.net +telateladivulgaprod.112.2o7.net +tele.oewabox.at +tele2nl.112.2o7.net +teleaudio.pl +telecharger-openoffice.fr +telecommand.telemetry.microsoft.com +telecop.in.net +telefloracom.112.2o7.net +telefon-50-zl.is-best.net +telefonica.es.intellitxt.com +telefonica.webnavegador.com.br +telefonicauk.d3.sc.omtrdc.net +telefonicauklimited.tt.omtrdc.net +telefonino.it.intellitxt.com +telegraphcouk.skimlinks.com +telegraphmediagroup.d3.sc.omtrdc.net +telegraphmediagroupl.tt.omtrdc.net +telemetry.appex.bing.net +telemetry.firstpartyapps.oaspapps.com +telemetry.layer.com +telemetry.malwarebytes.com +telemetry.sdk.inmobi.com +telemetry.servers.getgo.com +telemetry.sonarsource.com +telenor.112.2o7.net +teletype.internal.intercom.io +telewizja-internetowa24.pl +telgids.adsolutions.nl +teliad.de +telstra.imrworldwide.com +telstra.inscname.net +telstra.insnw.net +temelio.com +temo.analyticson.com +temp-api.dc1.exacttarget.com +temp.adzerver.com +tempest.services.disqus.com +template-download.top +templates.sharethrough.com +tendersource.com +tendertest.com +tengo.popunder.ru +tengofoxfiles.com +tenjin.com +tenmagazines.us.intellitxt.com +tennis.oewabox.at +tenuate.1.p2l.info +tenzing.fmpub.net +teprom.it +teramill.com +terem.eltransbt.ro +terethat.ru +terminus.services +terra.fp.oix.net +terraform-modules-test.intercom.io +terratracker.com +terriblethumb.com +terribleturkey.com +tescostores.122.2o7.net +test--na--iq.blogspot.com +test-adserver.adtech.de +test-adserver.adtechus.com +test-d.analytics.yahoo.com +test-letsencrypt.adotmob.com +test-script.dotmetrics.net +test-tickets.fyber.com +test-vokate.qa.extole.io +test-wiki.fyber.com +test-www.taboola.com +test.ad.xiaomi.com +test.adroll.com +test.adwyze.com +test.adx1.com +test.analyticson.com +test.aws.keen.io +test.cdn-jquery.host +test.clevergirlscollective.com +test.coremetrics.com +test.criteo.com +test.cryptonoter.com +test.dev.gumgum.com +test.dev1.autopilothq.com +test.directprimal.com +test.districtm.io +test.docker.adsrvr.org +test.e.ad.xiaomi.com +test.exacttarget.com +test.fastly-insights.com +test.instartlogic.com +test.iovation.com +test.ishvara-yoga.com +test.logs.videmob.com +test.metaps.com +test.minr.pw +test.monetizer101.com +test.mparticle.com +test.msas.media.net +test.netmng.com +test.new.api.ad.xiaomi.com +test.oriel.mgr.consensu.org +test.privy.com +test.push.stg1.sumo.com +test.push.stg2.sumo.com +test.push.stg3.sumo.com +test.push.stg4.sumo.com +test.pushbank.services.adx1.com +test.rxthdr.com +test.tapjoyads.com +test.tns-cs.net +test.vilynx.com +test.wiredminds.de +test1.irganalytics.com +test1custombranding.truconversion.com +test2-adserver.adtech.de +test2-adserver.adtechus.com +test2.analyticson.com +test2.irganalytics.com +test2017.adcrowd.com +testapp.adhood.com +testats.inuvo.com +testbanners.analyticson.com +testcert.247realmedia.com +testclub.pl +testcluster.imprev.net +testd.rxthdr.com +testdata.coremetrics.com +testgoat.dev.getambassador.com +testgw.iovation.com +testiab.53.localytics.com +testinteligencji.bo.pl +testjira.corp.ev1.inmobi.com +testkb.silverpop.com +testle.fqtag.com +testle.media.net +testnet-api.xmrpool.net +testnet.jsecoin.com +testnet.webxmr.com +testo.5v.pl +testony.com +testowanietwojegoiq.blogspot.com +testpc24.profitableads.online +testpconly12.prepare2upvideosafesystem4setnow.online +testr.rxthdr.com +testr1.zemanta.com +testsite.eloqua.com +testsj01.marketo.com +testtralala.xorg.pl +testtt.allinviews.com +testuj-iq.info +testvkoauth.absum.ru +tetra.hitbox.com +tex-sync.rockyou.net +tex.ero-advertising.com +texas-hold-em.e-online-poker-4u.net +texas-holdem.shengen.ru +text-link-ads-inventory.com +text-link-ads.com +text-link-ads.ientry.com +textad.eroticmatch.com +textad.manplay.com +textad.net +textad.passionsearch.com +textad.sexsearch.com +textad.sexsearchcom.com +textad.socialsex.com +textad.traficdublu.ro +textad.xpress.com +textad.xxxcupid.com +textad.xxxmatch.com +textads.adultadworld.com +textads.biz +textads.madisonavenue.com +textads.sexmoney.com +textlinks.com +textspeier.de +textsrv.com +tf-net.tribalfusion.com +tf.nexac.com +tfag.de +tg.thirdpresence.com +tg1.premium.dc11.wix.com +tgdaily.us.intellitxt.com +tgn.122.2o7.net +tgp.adultfriendfinder.com +tgp.pornsponsors.com +tgp.simplymoney.info +tgpcounter.freethumbnailgalleries.com +tgpmanager.com +tgps.biz +tgptraffic.biz +tgpx.info +tgtvbngp.ru +th-cdn.effectivemeasure.net +th.2.cqcounter.com +thai-porno.thumblogger.com +thaix.de +thales.adsrvr.org +thanfocus.com +thathappened.us.intellitxt.com +thathislitt.ru +thatresha.com +thatsjustgay.com +thatsphucked.com +thayhiltonlongisland.112.2o7.net +thayhoteldelcoronado.112.2o7.net +thayvenetian.112.2o7.net +thcextractor.com +thcvaporizer.com +the-adblocker.website +the-best-track.com +the-binary-trader.biz +the-coolest.com +the-counter.net +the-free-pics.com +the-gadgeteer.us.intellitxt.com +the-gay-guide.com +the-kret.popunder.ru +the-naughty-office.com +the-path-gateway.com +the-porn-blog.com +the-secrets-of-mina.com +the-sexkitten.net +the-smart-stop.com +the-titanium.com +the.mtree.com +the.sextracker.com +the4playclub.com +theadex.com +theadhost.com +theads.me +theadvertiser.us.intellitxt.com +theadvocate-d.openx.net +theaffiliateprogram.com +theallamericansteakhouse.com +theallgirlarcade.com +theamateurcam.com +theappgrader.com +theappguruz.com +thearmchaircritic.org +theautoprofit.ml +thebestselectiontgp.com +thebigfourlive.com +thebighits.com +thebitcoincode.com +thebizmeet.com +theblackcafe.com +theblackmarket.net +theblemish.us.intellitxt.com +thebluenoodle.com +thebluepalace.com +thebluffs.com +thebosh.us.intellitxt.com +thebox.siliconorchard.com +thebrandgroup.net +thebrighttag.com +thebugs.ws +thebuzz.today +thecainsofficial.com +thecarconnection.us.intellitxt.com +thecat68.dk +thecelebritycafe.us.intellitxt.com +thechannelcompany.d1.sc.omtrdc.net +thechildrensschoolofmusic.com +thechive-d.openx.net +thechixxx.com +thechocolatebarjersey.co.uk +thecircuitarchive.net +thecockpit.allmanpages.com +thecoolimages.net +thecoral.com.br +thecounter.com +thecryptogenius.com +thedailynudist.com +thedailystarcom.112.2o7.net +thedailytug.com +thedatesafe.com +thedatingconference.com +thedatingsitereview.com +thedermarollercure.com +thedoctor.se +theebony.info +theeldergeek.us.intellitxt.com +theespresso.info +thefarmergame.com +thefds.net +thefetishdungeon.com +thefinalfantasy.us.intellitxt.com +theflashzone.com +thefogcity.com +theforce.us.intellitxt.com +thefrisky.us.intellitxt.com +thefutoncritic.us.intellitxt.com +thefxarchive.com +thegauntlet.us.intellitxt.com +thegaycinema.com +theglobeandmail.us.intellitxt.com +thegloss.us.intellitxt.com +thegroup.112.2o7.net +thehdroom.us.intellitxt.com +thehill-d.openx.net +thehollywoodgossip.us.intellitxt.com +thehollywoodnews.uk.intellitxt.com +thehomo.org +theinquirer.uk.intellitxt.com +theinternetworksltd-news.t.domdex.com +thelastboss.us.intellitxt.com +thelibraryofcongress.122.2o7.net +thelifeisbinary.ddns.net +thelifeisbinary.netlify.com +thelocalsearchnetwork.com +themacuser.org +themanroom.us.intellitxt.com +themaplemethod.com +themecounter.com +themexp.org +themillionaireinpjs.net +themoneyclippodcast.com +themovienation.com +themusicnetwork.co.uk +thenewsonline.es +thenewupdatee.redirectme.net +thenudelist.com +theonenetwork.us.intellitxt.com +thepaparazzis.us.intellitxt.com +thepeespot.com +thepiratebay.cr +thepiratebay.lv +thepiratebay.org +thepiratebay.uno +thepiratebay.wtf +thepiratepartybay.com +thepirateproxy.biz +thepirateproxy.xyz +thepiratetrader.com +theplumberschoice.store +thepokertimer.com +theporncage.com +thepornmag.com +thepornpassword.com +thepornpimp.com +thepornsource.com +thepornstarzone.com +thepornuwant.com +thepounder.com +theprofitsmaker.net +thepussycatclub.com +therapistla.com +therealmissdrea.com +theregister.uk.intellitxt.com +thereisnomoneyinporn.com +theribbonprintcompanyblog.com +therichkids.com +therightaccountants.co.uk +theroamingjew.com +thersprens.com +thesacredgarden.org +thescholarshome.com +thesearchagency.net +thesearchster.com +thesexe.com +theshemalesurvey.com +thesluthut.net +thesneakysquirrel.com +thespybot.com +thestar.122.2o7.net +thestardev.122.2o7.net +thestreet.us.intellitxt.com +thesunonsunday.com +thesuperdeliciousnews.com +thesuperficial.us.intellitxt.com +thesurfshield.com +thetacdn.net +thetardistimes.ovh +thetattoohut.com +thetearsofthings.net +thetechherald.uk.intellitxt.com +thetechlounge.us.intellitxt.com +thetechzone.us.intellitxt.com +thetop.be +thetranny.info +theunblock.com +theunwired.us.intellitxt.com +theuploadbusiness.com +theuseful.com +theuseful.net +thevintageapple.com +thevision.it +theweatherspace.com +theweddingstyle.net +thewhizmarketing.com +thewhizproducts.com +thewinesteward.com +thewise.com +thewomenlife.com +theworldofsex.info +thexguide.com +thexhost.com +thexporno.com +thexxxclub.com +theybf.us.intellitxt.com +theyrecomingtotakemeawayhahaproxy.info +thfox.com +thgalecom.112.2o7.net +thinkablerice.com +thinkcomputers.us.intellitxt.com +thinkdigitaladro.hit.gemius.pl +thinkdigitalro.adocean.pl +thinkgeek.112.2o7.net +thinknear-hosted.thinknearhub.com +thinknyc.eu-adcenter.net +thinktanks.co.za +thinktarget.com +thinlaptoprewards.com +thinstall.abetterinternet.com +thirdpresence.com +thirdrespect.com +thirstytwig.com +thirteenstitches.com +thirtydaychange.com +this.content.served.by.addshuffle.com +this.content.served.by.adshuffle.com +thisisart.us +thngw.doubleclick.net +thngw1.doubleclick.net +thngw2.doubleclick.net +thomascam.com +thomasvillefurniture.122.2o7.net +thome.112.2o7.net +thoroclean.com +thoughtfully-free.com +thoughtsmedia.us.intellitxt.com +thputr.pro +threadandmirror.com +threadwatch.us.intellitxt.com +three-jj.github.io +threechurch.com +thrnt.com +throattrees.com +throttled.api.test.appsee.com +thruk.svc.insnw.net +thruport.com +thumb.ero-advertising.com +thumbads.ero-advertising.com +thumbs.ero-advertising.com +thumbs.xlaces.ero-advertising.com +thumbs.zemanta.com +thumbs2.ero-advertising.com +thumser-online.de +thunder-tracker.dev.paperg.com +thunder-tracker.prod.paperg.com +thunder-tracker.staging.paperg.com +thunder.adnxs.com +thunderhead.com +ti.tradetracker.net +ti.tradetracker.nl +tia.timeinc.net +tiads.essence.com +tiads.ew.com +tiads.health.com +tiads.instyle.com +tiads.people.com +tiads.sportsillustrated.cnn.com +tiads.timeinc.net +ticker.conduit.com +ticket.agkn.com +ticket20.tripod.com +tickets.fyber.com +ticklesign.com +tidafors.xyz +tidaltv.com +tidbitscom.skimlinks.com +tidebuy.com +tie.iprom.net +tigershark.adultadworld.com +tiku.io +tilido.com +timebus2.112.2o7.net +timecom.112.2o7.net +timecom.122.2o7.net +timecommerce.net +timeessence.122.2o7.net +timeew.122.2o7.net +timefoodandwine.122.2o7.net +timefortune.112.2o7.net +timeforvitamins.com +timehealth.112.2o7.net +timehealthtips.122.2o7.net +timeinc.122.2o7.net +timelife.122.2o7.net +timeline.vicedata.com +timelywebsitehostesses.com +timeofficepirates.122.2o7.net +timeoutcommunications.122.2o7.net +timepeople.122.2o7.net +timepespanol.122.2o7.net +timepopsci.122.2o7.net +timerealsimple.112.2o7.net +timeseg.modules.jumptime.com +timespctenbest.122.2o7.net +timeteenpeople.122.2o7.net +timewarner.122.2o7.net +timmedmobile.siliconorchard.com +timothycopus.aimoo.com +tinaborg.com +tinybar.com +tinyfilehost.com +tinyfileshost.com +tip.atdmt.com +tips.oewabox.at +tipsforall.xyz +tipsurf.com +tirerack.tt.omtrdc.net +tirerackcom.112.2o7.net +tirolcom.oewabox.at +tiscali.js.ad.dotandad.com +tiscaliadv01.webtrekk.net +titan-gel-extra.com +titan-man.pro +titan.advertserve.com +titangate-d.openx.net +title.mximg.com +titon.info +tiumbs.ero-advertising.com +tivvitter.com +tizanidine.1.p2l.info +tizer.adv.vz.ru +tizers.net +tjx.112.2o7.net +tk-gregoric.si +tk.ads.mmondi.com +tk.baidu.com +tk.cloud.kargo.com +tko-dc01.marketo.net +tko-dc02.marketo.net +tkovpn.marketo.com +tkr.yieldmo.com +tkweb.baidu.com +tkx.apis.anvato.net +tl813.com +tldtgs.com +tlv-dc01.marketo.net +tlv-dc02.marketo.net +tlvmedia.com +tlx.3lift.com +tm.inmobi.com +tm.tradetracker.net +tmathtag.com +tmcnet.us.intellitxt.com +tmgr.ccmbg.com +tmp-heliosiq.adtech.de +tmp-heliosiq.adtechus.com +tmp.onlinesucces.nl +tmp3.nexac.com +tmsads.tribune.com +tmscdn.coremetrics.com +tmscdn.de.coremetrics.com +tmserver-1.com +tmslexus.112.2o7.net +tmsscion.112.2o7.net +tmstoyota.112.2o7.net +tmteam.piwik.pro +tmx-api.ams.online-metrix.net +tmx-fp.online-metrix.net +tmx.technoratimedia.com +tmz.us.intellitxt.com +tn.5.p2l.info +tn.adserve.com +tn.alphonso.tv +tnctrx.com +tnkexchange.com +tns-counter.ru +tns-gallup.dk +tntclix.co.uk +tnttv.112.2o7.net +toad.adrizer.com +toad.wix.com +toads.osdn.com +todayresearch.com +todayshow.us.intellitxt.com +todogecoin.biz +todolize.com +toecircle.com +toftofcal.com +tofu-ssl.dmcdn.net +tofurkey.urbanairship.com +token.ad +token.corp.inmobi.com +token.rubiconproject.com +tokyodrift.ga +tom.allyes.com +tomalinoalambres.com.ar +tommysbookmarks.com +tommysbookmarks.net +tomorrownewstoday.com +toms.us.intellitxt.com +tomsforumz.us.intellitxt.com +tomshardware.fr.intellitxt.com +tomshardware.se.intellitxt.com +tomshardware.us.intellitxt.com +tomsnetworking.us.intellitxt.com +tomsshoes.122.2o7.net +tongji.baidu.com +tons-to-see.com +toofab.us.intellitxt.com +toofanshadid.com +toolbar.adperium.com +toolbar.baidu.com +toolbar.freshmarketer.com +toolbar.soso.com +toolbar.wibiya.com +toolbar.wips.com +toolbarbest.biz +toolbarbucks.biz +toolbarcool.biz +toolbardollars.biz +toolbarmoney.biz +toolbarnew.biz +toolbarpartner.com +toolbarsale.biz +toolbarweb.biz +toolbarwizard.vmn.net +tools.ad-net.co.uk +tools.hitbox.com +tools.naughtyamerica.com +tools.pacinocash.com +tools.ranker.com +tools.spotxchange.com +tools.spylog.ru +tools.valassisdigital.com +tools.ztod.com +tools2.hitbox.com +toolsa.hitbox.com +toolsins.com +toomami.com +toon-families.com +toondinsey.com +toonfamilies.net +toothbrushnote.com +top-69.com +top-application-web-online.site +top-ass.com +top-casting-termine.de +top-fwz1.mail.ru +top-hentai-anime.info +top-interracial.com +top-karkas.ru +top-porn.net +top-site-list.com +top-traffic-ticket-attorney.com +top-viagra-store.com +top.addfreestats.com +top.artcomix.com +top.askei.com +top.c-stat.eu +top.dating.lt +top.easy.lv +top.er.cz +top.list.ru +top.mail.ru +top.oewabox.at +top.pcanywhere.net +top.proext.com +top1.list.ru +top100-images.rambler.ru +top100.mafia.ru +top100.rambler.ru +top123.ro +top1site.3host.com +top20free.com +top250movies.ru +top3.list.ru +top5.mail.ru +top50.co.uk +top50babes.home.ml.org +top5ent.com +top5porn.com +top6.list.ru +top90.ro +topads.ero-advertising.com +topads.rrstar.com +topadultsites.nu +topadultstores.com +topamat.com +topappspro.com +topastrologerinindia.in +topaz-games.com +topbarh.box.sk +topbestgames.com +topbrandrewards.com +topbucks.com +topconsumergifts.com +topdelice.com +topdemaroc.com +topdirectory.net +topdiscount.net +topdownloads.nl.intellitxt.com +topdownloads.ru +topeighteen.com +topescortpoland.pl +topeuro.biz +topforall.com +topgamesites.net +topgirlsescort.com +tophostbg.net +tophyipsites.com +topica.advertserve.com +topix-d.openx.net +toplady.jp +toplessrobotcom.skimlinks.com +toplist.cz +toplist.eu +toplist.pornhost.com +toplist.sk +toplist.throughput.de +toplista.mw.hu +toplistcity.com +toplistporn.com +topmarketcenter.com +topmdx.com +topmeds10.com +topmira.com +topmobile.com.au +topnail-nagelstudios.de +topnews.us.intellitxt.com +topnudes.us +toporno.net +topporn4u.com +toppornmovie.com +topprotestsigns.com +topquality.cf +topqualitylink.com +topqualityxxx.com +topratedpornstars.com +toprebates.com +topsafelist.net +topsale2.ru +topseans.pl +topseks.nl +topsexstore.com +topsexy69.com +topshape.me +topshef.ru +topshop.ro +topsir.com +topsite.lv +topsiteproxy.com +topsites.blogflux.com +topsites.com.br +topsocialite.us.intellitxt.com +topspeed.us.intellitxt.com +topstats.com +topstats.net +topsurvey-offers.com +topsy.com +toptechreviews.us.intellitxt.com +toptenreviews.us.intellitxt.com +toptwinks.com +topvidos.ru +topxgay.org +tor.monerise.com +tor.redlightcenter.com +torapi.ibm.xtify.com +torax.outwar.com +torgi.kz +torjackan.info +toro-tags.com +toroadvertisingmedia.com +torontoplumbinggroup.com +torontostar.demdex.net +tororango.com +torquenews.us.intellitxt.com +torrent-newgames.com +torrent.pw +torrents-tracker.com +torrenty-org.pl +torridiquartesolo.com +torrnada.ru +torro-trains.com +torso.net +torstarcollect.247realmedia.com +torstardigital.122.2o7.net +torture.ml +torturee.com +torturessnicole.com +toshibaamerica.com +tossm.com +tostocks.com +totalfootballperformance.com +totalkaraoke.com +totallyguns.com +totalpornblog.com +totaltabel.sslblindado.com +totaltits.com +totalyporn.com +totemcash.com +tothecenter.us.intellitxt.com +totoro.de +totoskana.de +totszentmarton.hu +totu.info +touch.media-serving.com +touchapps.siliconorchard.com +touchclarity.com +touchclarity.natwest.com +touche.adcentric.proximi-t.com +touchhotchicks.com +touchmods.fr +tour-line.net +tour.affbuzzads.com +tour.appdynamics.com +tour.brazzers.com +tour.cineble.com +tour.sweetdiscreet.com +tour.xxxblackbook.com +tour4sex.com +tourcroatia.co.uk +tourism.kavala.gr +tourismkwadukuza.co.za +tourismvictoria.com +toursmaps.com +tousavostapis.ca +toutes-les-videos.fr +toutesdesputes.com +tovaroboom.vast.ru +tovit.de +tower.adexpedia.com +tower.adwyze.com +towerecords.com +townhallmedia-d.openx.net +toxicwap.com +toy-offer.com +toy-offer.net +toy-porn.com +toyota.cyberealhosting.com +toyota.demdex.net +toyotamotorcorporation.122.2o7.net +toys.erolove.in +toysrus.tt.omtrdc.net +tozup.com +tpads.ovguide.com +tpads.sv.publicus.com +tpbproxy.nl +tpc.googlesyndication.com +tpciletsgo.112.2o7.net +tpcyunlin.org.tw +tpienquete.com +tpl1.realtracker.com +tpl2.realtracker.com +tpnads.com +tps.doubleverify.com +tps10216.doubleverify.com +tps30.doubleverify.com +tps31.doubleverify.com +tr-1.agilone.com +tr.2.cqcounter.com +tr.adinterax.com +tr.affiliate.hu +tr.alphonso.tv +tr.bigpoint.com +tr.blismedia.com +tr.buzzlogic.com +tr.contextweb.com +tr.count.ly +tr.de.adlink.net +tr.hit.gemius.pl +tr.iadsdk.apple.com +tr.lga.contextweb.com +tr.mobiadserv.com +tr.outbrain.com +tr.prospecteye.com +tr.silverpush.co +tr.spinwin.fun +tr.tu.connect.wunderloop.net +tr.webantenna.info +tr.wl.webads.nl +tr1.frosmo.com +tr1.myroitracking.com +tr1.onlinesucces.nl +tr2.onlinesucces.nl +tr3.onlinesucces.nl +traaaack.com +trace.pixel.shodan.me +trace.qq.com +tracedesire.com +tracer.perezhilton.com +tracfone.staging.airfind.com +track-apmebf.cj.akadns.net +track-west.mobileadtrading.com +track.941tracking.com +track.absoluteclickscom.com +track.acclaimnetwork.com +track.ad4mmo.com +track.adbiq.com +track.adbooth.net +track.addevent.com +track.adform.com +track.adform.net +track.adjal.com +track.adrevolver.com +track.adservingfactory.com +track.adsfast.com +track.adthrive.com +track.adtraction.com +track.adtrue.com +track.analyticsbridge.io +track.anchorfree.com +track.anideaevolves.com +track.aniview.com +track.atom-data.io +track.bannerbridge.net +track.bigbrandpromotions.com +track.blogcounter.de +track.blogmeetsbrand.com +track.brucelead.com +track.businesstrenders.com +track.businessunionorg.com +track.cbs.com +track.celtra.com +track.childrensalon.com +track.clearsender.com +track.clickbooth.com +track.clickcabintracker.com +track.clickon.co.il +track.clicksor.com +track.clicksure.com +track.collegeboard.com +track.construclique.com +track.contently.com +track.cracked.com +track.customer.io +track.dating-4-you.com +track.did-it.com +track.digitcked.com +track.digluen.com +track.digning.com +track.diguati.com +track.directleads.com +track.dmipartners.com +track.domainsponsor.com +track.dotsly.com +track.double.net +track.dtnlyss.com +track.dvdbox.com +track.e7r.com.br +track.effiliation.com +track.eg-innovations.net +track.emailsvc.net +track.enviodemails.com +track.exclusivecpa.com +track.eyeviewads.com +track.flexlinks.com +track.flexlinkspro.com +track.fling.com +track.freemmo2017.com +track.ft.com +track.futureshop.ca +track.fyber.com +track.gawker.com +track.greatofferstoyou.net +track.grmtracking.com +track.homestead.com +track.hotdrugsstore.in +track.hubspot.com +track.idtargeting.com +track.india-marketing.in +track.ionicmedia.com +track.iwfueh.us +track.jpassport.jp +track.justcloud.com +track.justdoing.biz +track.justhookup.com +track.keywordstrategy.org +track.kscentraltrack.us +track.lativio.com +track.lawoftrade.com +track.leadin.com +track.leadnationmedia.com +track.learntotradesrv.com +track.lfstmedia.com +track.linkmails.net +track.linkoffers.net +track.lmsadvlc.ru +track.mailvalue.net +track.make-a-site.net +track.marketingontarget.net +track.marketsvc.net +track.mdirector.com +track.mdrctr.com +track.mia-base.com +track.mindfieldresources.com +track.moreniche.com +track.msadcenter.afgz.com +track.msadcenter.ajfy.com +track.msadcenter.ama.com +track.msadcenter.bfy.com +track.msadcenter.bvp.com +track.msadcenter.cdn.com +track.msadcenter.ceio.com +track.msadcenter.chpn.com +track.msadcenter.cxtv.com +track.msadcenter.dgt.com +track.msadcenter.dtx.com +track.msadcenter.dxr.com +track.msadcenter.ebg.com +track.msadcenter.emee.com +track.msadcenter.eqq.com +track.msadcenter.etvz.com +track.msadcenter.fal.com +track.msadcenter.fcuk.com +track.msadcenter.fmi.com +track.msadcenter.fvpl.com +track.msadcenter.gdb.com +track.msadcenter.gmiy.com +track.msadcenter.hex.com +track.msadcenter.hih.com +track.msadcenter.hlh.com +track.msadcenter.hnsl.com +track.msadcenter.igzr.com +track.msadcenter.imc.com +track.msadcenter.iuf.com +track.msadcenter.iuh.com +track.msadcenter.izy.com +track.msadcenter.jzz.com +track.msadcenter.kfgy.com +track.msadcenter.kfz.com +track.msadcenter.khrg.com +track.msadcenter.kkal.com +track.msadcenter.kpuo.com +track.msadcenter.krt.com +track.msadcenter.llu.com +track.msadcenter.lngl.com +track.msadcenter.lrgo.com +track.msadcenter.ltp.com +track.msadcenter.lyv.com +track.msadcenter.lzwp.com +track.msadcenter.mazp.com +track.msadcenter.mjze.com +track.msadcenter.mkqa.com +track.msadcenter.moas.com +track.msadcenter.msw.com +track.msadcenter.mur.com +track.msadcenter.nge.com +track.msadcenter.nho.com +track.msadcenter.nlke.com +track.msadcenter.nyfg.com +track.msadcenter.oah.com +track.msadcenter.pcp.com +track.msadcenter.pka.com +track.msadcenter.psof.com +track.msadcenter.pszn.com +track.msadcenter.pwpn.com +track.msadcenter.qpz.com +track.msadcenter.qru.com +track.msadcenter.qsvv.com +track.msadcenter.qymv.com +track.msadcenter.rfjq.com +track.msadcenter.ruum.com +track.msadcenter.sax.com +track.msadcenter.scz.com +track.msadcenter.sfq.com +track.msadcenter.sgq.com +track.msadcenter.shy.com +track.msadcenter.szc.com +track.msadcenter.tirj.com +track.msadcenter.tnuw.com +track.msadcenter.toj.com +track.msadcenter.trg.com +track.msadcenter.tux.com +track.msadcenter.usm.com +track.msadcenter.usx.com +track.msadcenter.vava.com +track.msadcenter.vbd.com +track.msadcenter.vbug.com +track.msadcenter.vcf.com +track.msadcenter.vrhe.com +track.msadcenter.vyp.com +track.msadcenter.wdm.com +track.msadcenter.wfm.com +track.msadcenter.wmd.com +track.msadcenter.won.com +track.msadcenter.wup.com +track.msadcenter.xda.com +track.msadcenter.xpp.com +track.msadcenter.xxx.com +track.msadcenter.xzh.com +track.msadcenter.xzwy.com +track.msadcenter.yaz.com +track.msadcenter.ybi.com +track.msadcenter.ytbp.com +track.msadcenter.zepw.com +track.msadcenter.zhv.com +track.msadcenter.zlx.com +track.msadcenter.zmmr.com +track.msadcenter.zul.com +track.msadcenter.zun.com +track.msadcenter.zvjw.com +track.msadcenter.zzv.com +track.mybloglog.com +track.netshelter.net +track.nifty.com +track.oainternetservices.com +track.offermarket.net +track.omg2.com +track.omgpl.com +track.omguk.com +track.optimizely.com +track.optinstar.com +track.oxcash.com +track.pointroll.com +track.popmog.com +track.pplnk.com +track.ppmdating.com +track.prizeglobal.net +track.promosvc.com +track.promovalue.us +track.promptfile.com +track.publeadmedia.com +track.pubmatic.com +track.real2come.com +track.realitykings.com +track.recreativ.ru +track.rediff.com +track.resala1.com +track.roiservice.com +track.roularta.adhese.com +track.rtb-media.ru +track.scrillaspace.com +track.searchignite.com +track.securedvisit.com +track.send.microad.jp +track.seorate.ru +track.shop2market.com +track.sitetag.us +track.smaato.net +track.specialdailydeals4u.com +track.spots.im +track.sr.roku.com +track.statesend.co.in +track.stromfeldshippingcenters.com +track.svcoffer.com +track.tappx.com +track.tenjin.io +track.the-members-section.com +track.theprovision.net +track.theviralconcept.com +track.todayreward.net +track.tooplay.com +track.topromotion.net +track.trackffic.xyz +track.traffcdn.com +track.ultragaming.biz +track.untd.com +track.upaknee.com +track.venatusmedia.com +track.viewdeos.com +track.visitorpath.com +track.vivid.com +track.vscash.com +track.walentynkowyprezent.pl +track.webgains.com +track.webprodeals.cf +track.webtrekk.de +track.wesell.co.il +track.whitespace57.com +track.written.com +track.www.zazzle.com +track.xapads.com +track.xtrasize.nl +track.yieldsoftware.com +track.youniversalmedia.com +track.yourmedicalpurchase.ru +track.zapromotions.com +track.zipalerts.com +track.ziprecruiter.com +track.zmsndy.com +track.zulumarketing.com +track1.aniview.com +track1.breakmedia.com +track1.offers2004.com +track1.viewdeos.com +track12.offersbymail.com +track2.homestead.com +track2.mybloglog.com +track2.ultimateinternetoffers.com +track3.your-picks.com +tracka.businessleadbuilder.com +trackad.cz +trackadvertising.net +trackaffpix.com +trackalyzer.com +trackcmp.net +trackdiscovery.net +trackedlink.net +trackedweb.net +tracker-asia.adotmob.com +tracker-cnv.bidder10.mookie1.com +tracker-cnv.bidder7.mookie1.com +tracker-cnv.bidder9.mookie1.com +tracker-dev.staging.us-east-1.kops.kargo.com +tracker-pm2.spilleren.com +tracker-sp-elb-1474841806.us-east-1.elb.amazonaws.com +tracker-us-east.adotmob.com +tracker.adotmob.com +tracker.affirm.com +tracker.awr.im +tracker.azet.sk +tracker.baidu.com +tracker.bang.com +tracker.bannerflow.com +tracker.beezup.com +tracker.blueprintinteractivetest.com +tracker.bonnint.net +tracker.brainsins.com +tracker.bt.uol.com.br +tracker.cdn-analytics.host +tracker.cl1.fidelizador.com +tracker.clickopon.com +tracker.clicktrade.com +tracker.consumerpackage.net +tracker.coopt.com +tracker.databrain.com +tracker.departapp.com +tracker.dev.hearst.nl +tracker.ero-advertising.com +tracker.eton-events.com +tracker.financialcontent.com +tracker.freecharge.in +tracker.fyber.com +tracker.gtarcade.com +tracker.hitmatic.com +tracker.icerocket.com +tracker.idg.co.uk +tracker.leadenhancer.com +tracker.mailvalue.net +tracker.marinsm.com +tracker.marketsvc.net +tracker.mattel.com +tracker.meetleads.com +tracker.mozo.com.au +tracker.nbcuas.com +tracker.neon-images.com +tracker.netklix.com +tracker.offermarket.net +tracker.onapps.org +tracker.promosvc.com +tracker.promovalue.us +tracker.samplicio.us +tracker.squidanalytics.com +tracker.staging-analytics.adotmob.com +tracker.staging-dmp.adotmob.com +tracker.staging-dsp.adotmob.com +tracker.staging.adotmob.com +tracker.stats.in.th +tracker.svcoffer.com +tracker.trackerfix.com +tracker.tradedoubler.com +tracker.truehits.in.th +tracker.truehits.net +tracker.twenga.nl +tracker.u-link.me +tracker.vinsight.de +tracker.wordstream.com +tracker1.leadiya.com +trackers.1st-affiliation.fr +trackers.adtarget.me +trackersimulator.org +trackertracker.com +trackgsm.co.uk +trackgsm.de +trackgsm.pl +tracki112.com +tracking-financial-review.net +tracking-graphly-907699188.us-west-2.elb.amazonaws.com +tracking-prod-public-2025738748.us-east-1.elb.amazonaws.com +tracking-stats-tr.usa.cc +tracking-thirdparty.i2w.io +tracking.10e20.com +tracking.1betternetwork.com +tracking.247search.com +tracking.3com.com +tracking.45-fe6b6-aah.co.uk +tracking.aatkit.com +tracking.absolstats.com +tracking.adalyser.com +tracking.adctrack.com +tracking.adgoon.it +tracking.adjug.com +tracking.admarketplace.net +tracking.adultsense.com +tracking.affiliates.de +tracking.aimediagroup.com +tracking.allposters.com +tracking.ariong.us +tracking.arxibs01.com +tracking.baddoggiemediagroup.com +tracking.badgeville.com +tracking.bannerflow.com +tracking.batanga.com +tracking.batanga.net +tracking.beginads.com +tracking.campaign-tracking-service.placelocal.com +tracking.campaign-tracking-service.prod.paperg.com +tracking.campaign-tracking-service.staging.paperg.com +tracking.carprices.com +tracking.cdiscount.com +tracking.clickmeter.com +tracking.conduit.com +tracking.conversionads.com +tracking.craktraffic.com +tracking.crobo.com +tracking.crossovertech.asia +tracking.crunchiemedia.com +tracking.dc-storm.com +tracking.downloadyeah.com +tracking.downloadyee.com +tracking.drsfostersmith.com +tracking.dsmmadvantage.com +tracking.dtiserv2.com +tracking.edvisors.com +tracking.eforceworld.com +tracking.engagedigitalmedia.com +tracking.ero-advertising.com +tracking.euroads.dk +tracking.eurowebaffiliates.com +tracking.everydayhealth.com +tracking.experience.com +tracking.fanbridge.com +tracking.fathomseo.com +tracking.fccinteractive.com +tracking.feedmob.com +tracking.fitprosperity.net +tracking.foxnews.com +tracking.freebitco.in +tracking.frmllc.com +tracking.fyber.com +tracking.g2crowd.com +tracking.gajmp.com +tracking.gameforge.de +tracking.godatafeed.com +tracking.graphly.io +tracking.hittail.com +tracking.hostgator.com +tracking.hubspot.com +tracking.i2w.io +tracking.ibexnetwork.com +tracking.ilinkmd.com +tracking.imagewebdesign.fr +tracking.immobilienscout24.de +tracking.inlocomedia.com +tracking.internetstores.de +tracking.intl.miui.com +tracking.inuvo.com +tracking.iol.co.za +tracking.ipermission.net +tracking.ipermit.net +tracking.jef74.com +tracking.joker.com +tracking.justpremium.com +tracking.keywordmax.com +tracking.klickthru.com +tracking.kurier.at +tracking.lay-ota.fr +tracking.layo-ta.fr +tracking.lengow.com +tracking.lenzmx.com +tracking.lifescript.com +tracking.listhub.net +tracking.m6r.eu +tracking.mailtracker.in +tracking.marketviaemail.net +tracking.medpagetoday.com +tracking.metalyzer.com +tracking.miui.com +tracking.motleyfool.com +tracking.msadcenter.msn.com +tracking.murdoog.com +tracking.myunidays.com +tracking.nesox.com +tracking.oceantidemedia.com +tracking.oe24.at +tracking.oerug.com +tracking.oggifinogi.com +tracking.olx-st.com +tracking.olx.com +tracking.onefeed.co.uk +tracking.onespot.com +tracking.opencandy.com.s3.amazonaws.com +tracking.opienetwork.com +tracking.optimatic.com +tracking.paymentfindermail.net +tracking.pennystockpicks.net +tracking.percentmobile.com +tracking.perfectwaterpurifier.net +tracking.photoyee.com +tracking.pickyourplum.com +tracking.prm20cloud.com +tracking.propellerads.com +tracking.publicidees.com +tracking.quisma.com +tracking.rangeonlinemedia.com +tracking.retargeting.biz +tracking.revimedia.com +tracking.roispy.com +tracking.salkmarketing.com +tracking.sctv1.monarchads.com +tracking.searchmarketing.com +tracking.skyword.com +tracking.softwareprojects.com +tracking.sokrati.com +tracking.spiderbait.com +tracking.stampready.net +tracking.summitmedia.co.uk +tracking.synthasite.net +tracking.tappx.com +tracking.tidalhifi.com +tracking.tomsguide.com +tracking.tomshardware.com +tracking.trackmobistore.com +tracking.trafficjunky.net +tracking.trksrv.com +tracking.trutv.com +tracking.ukwm.co.uk +tracking.vacationsmadeeasy.com +tracking.validclick.com +tracking.veille-referencement.com +tracking.veoxa.com +tracking.vindicosuite.com +tracking.websitealive.com +tracking.weiboniu.com +tracking.whattoexpect.com +tracking.wisepops.com +tracking.yeehbuy.com +tracking1.euroads.no +tracking101.com +tracking2.channeladvisor.com +tracking2.hittail.com +trackingsoft.com +trackit.vicotech.com +trackjs.com +tracklead.net +trackmail3345.com +trackmedia101.com +trackmysales.com +tracknet.twyn.com +tracksitetraffic1.com +tracksms.pl +tracksurf.daooda.com +tracksy.com +tracktrue.clicktrue.biz +trackverify.com +trackvoluum.com +trackzapper.com +tradeadexchange.com +tradearabia.advertserve.com +tradedoubler.com +tradedoubler.sonvideopro.com +tradefx.advertserve.com +tradem.com +tradersbrokers.com +tradetracker.net +traff1.com +traffective.mgr.consensu.org +traffic-exchange.com +traffic-gate-service.info +traffic-info-service.info +traffic-offers.com +traffic-optical-service.info +traffic-service.info +traffic-statics-asia.creativecdn.com +traffic-statics-europe.creativecdn.com +traffic-statics-usa.creativecdn.com +traffic-stats.streamsolutions.co.uk +traffic-tech-service.info +traffic.acwebconnecting.com +traffic.adwitty.com +traffic.adxprts.com +traffic.adxprtz.com +traffic.buyservices.com +traffic.focuusing.com +traffic.getmyads.com +traffic.mindviz.com +traffic.outbrain.com +traffic.prod.cobaltgroup.com +traffic.pubexchange.com +traffic.revenuedirect.com +traffic.ru +traffic.shareaholic.com +traffic.spot.im +traffic.tc-clicks.com +traffic.tcmagnet.com +traffic100.com +trafficadept.com +trafficads.com +trafficbee.com +trafficbuilderpro.com +trafficedge.adk2x.com +trafficex.adlandpro.com +trafficfactory.biz +trafficg.com +trafficgateway.research-int.se +trafficgrowth.com +trafficholder.com +traffichunt.com +trafficjunky.com +trafficjunky.net +trafficleader.com +trafficmania.com +trafficmp.com +trafficneeds.directtrack.com +trafficnetworkads24.com +trafficnetzwerk.de +trafficopen.com +trafficreceiver.club +trafficrevenue.net +trafficsan.com +trafficsecrets.com +trafficspaces.net +trafficstandard.com +trafficstars.com +trafficstrategies.com +trafficswarm.com +traffictrade.info +traffictrade.life +traffictrader.net +traffictraders.com +trafficz.com +trafficz.net +traffiliate.com +traffiq.com +traffique.net +traffixer.com +traffloads.info +traffmonster.info +trafforsrv.com +traffpartners.com +traffprofit.com +trafic.ro +trafikarenan.com +trafisz.com +trafit.com +trafmag.com +trafsearchonline.com +trafstarcurlms.com +trahic.ru +trailblazers.122.2o7.net +traileraddict.us.intellitxt.com +trailerservicescom.112.2o7.net +training.demandbase.com +training7.247realmedia.com +trajan.httpool.com +traktr.news.com.au +traktrafficflow.com +traktum.com +tramadol.1.p2l.info +tramadol.3.p2l.info +tramadol.4.p2l.info +tramadol2006.3xforum.ro +tramarkt.oewabox.at +trane-ir-corp-ingersollrand.112.2o7.net +trane.112.2o7.net +tranest-schlage-link.112.2o7.net +tranquilside.com +trans.silverpop.com +transe.nl +transexuales-porno.com +transfer.extremereach.com +transformersarmadadvds.blogs-blogs.com +transgenders.us +transitionblog.com +translation.conduit.com +translation.criteo.com +transmisje24.net +transpec-analysis.com +transsexporno.com +transsexual-xxx-porn.com +transsexual.nu +transsexuelen.be +traq.li +trashhero.ch +trashysluts.com +traumasister.tk +travekocity.com +travel-and-weather.msnbc.us.intellitxt.com +travel-insurance-quotes.beesearch.info +travel-leisure-bonuspath.com +travel-leisure-premiumblvd.com +travelasity.com +travelcape.com +traveliocity.com +traveller-offer.com +traveller-offer.net +travelncs.com +travelocidy.com +travelocite.com +travelocitu.com +travelocityca.com +travelocityt.com +travelocoity.com +travelogity.com +traveloicty.com +traveloocity.com +traveloscity.com +travelovity.com +travelplanner.siliconorchard.com +traveolocity.com +travesti.ws +travidia.112.2o7.net +travidiathebrick.112.2o7.net +traviilo.com +travis.bosscasinos.com +travlers.com +travmateholidays.com +trax.gamespot.com +trax.prostrax.com +trc-cc.taboola.com +trc.taboola.com +trc.taboolasyndication.com +trckaction.com +trcko.com +trdstation.com +treasuredata.com +treasuretrack-a.akamaihd.net +treavelocity.com +treebanana.com +treeguild.com +trekblue.com +trekdata.com +trekmedia.net +trekweb.us.intellitxt.com +trem.dynamicyield.com +tremendoustime.com +trendcounter.com +trendingpatrol.com +trendingtopics.id +trendmd.com +trendmicro.tt.omtrdc.net +trendmicroeuropa01.webtrekk.net +trendmicrojp.d2.sc.omtrdc.net +trendnews.com +trends.revcontent.com +trends.stage-one.heyzap.com +trends.stage-three.heyzap.com +trends.stage-two.heyzap.com +trends.taboola.com +treventuresonline.com +trevin.it +trg.peer39.net +trgde.adocean.pl +tri-book.pl +tri-slona.org +trial.insnw.net +trialreg.com +triangle.dealsaver.com +triangleservicesltd.com +tribal.us.intellitxt.com +tribalfusion.com +tribalfusion.com.akadns.net +tribalfusion.speedera.net +tribl.io +triboo.mgr.consensu.org +triboo01.webtrekk.net +tribuneinteractive.122.2o7.net +tributary.curalate.com +trickycelery.com +trickydicky.net +tricomzone.com +trifectanet.com +trifle.ernstenco.be +trig.i.wix.com +trigemer.com +triggerinstalls.com +triggers.wfxtriggers.com +triggers1.wfxtriggers.com +trinity.platform.intuit.com +trinitymirror-d.openx.net +trinitymirror.112.2o7.net +tripan.me +triphasil.1.p2l.info +triphasil.3.p2l.info +triphasil.4.p2l.info +triplelift.rtb.adx1.com +triplequadturbo.com +tripwolf.oewabox.at +tritetongue.com +tritondigital.com +tritratrullala.gekitzelt.de +triumphrat.us.intellitxt.com +trix.net +trixmaster.online +trk-sp.sele.co +trk.ablogica.com +trk.alskeip.com +trk.atdmt.com +trk.atomex.net +trk.cetrk.com +trk.dotomi.com +trk.enecto.com +trk.etrigue.com +trk.in25app.com +trk.kissmetrics.com +trk.simply.net +trk.tidaltv.com +trk.vidible.tv +trk.yadomedia.com +trk4.com +trkdf.com +trkingace.com +trkmydomain.com +trkn.us +trkpnt.ongage.net +trkrpoint.com +trkur.com +trmit.com +trollskogenssmycken.se +tron-api.prod.branch.io +tron-branchmain.prod.branch.io +tron-test.prod.branch.io +tronto.com +troop578.org +trophyroombar.com +tropiccritics.com +tropitalia.com.br +trotamundos.com.pl +trourted.pro +trovi.com +troxcorp.com +troyporno.com +troytempest.com +trqvelocity.com +tru.am +trubywriting.com +truckstomatoes.com +truconversion.com +trucri.me +trudogolik.net +true-counter.com +true-experts.com +true-porno.com +true2file.com +trueclickads.net +truecrypt.fr +truecumsluts.com +trueeros.com +truefilen32.com +truefiles.net +truegamers.ga +truehits.gits.net.th +truehits.net +truehits1.gits.net.th +truehits2.gits.net.th +truehits3.gits.net.th +truelolita.com +truepasswords.com +truevalue.d2.sc.omtrdc.net +truliia.com +trumpetedextremes.com +trunk.guce.adaptv.advertising.com +trunk.guce.adtech.de +trunk.guce.adtechjp.com +trunk.guce.adtechus.com +trunk.guce.advertising.com +trunk.guce.convertro.com +trunk.guce.tacoda.at.atwola.com +trusearch.net +trust.extremereach.com +trust.extremereach.io +trust.pardot.com +trustaffs.com +trustarc.mgr.consensu.org +trustedhealthtips.com +trustedmaccleaner.com +trustedmacleaner.click +trustedmacleaner.work +trustgauge.com +trustsitesite.com +trustsoft.com +trusttastic.com +trutedid.com +truyennguoilon.biz +trvelocity.com +trvlnet-images.adbureau.net +trvlnet.adbureau.net +trw12.com +trx625.com +trxporn.com +try-go.districtm.net +try-rx.com +try.abtasty.com +try.appboy.com +try.clearbit.com +try.newrelic.com +try.rollbar.com +try.shopcurbside.com +try.tapad.com +tryme-scandinavianbar.se +trytoimprovesecurity.com +ts-winkle.de +ts.istrack.com +ts.richmedia.yahoo.com +ts.vindicosuite.com +ts1.hitbox.com +ts2.hitbox.com +tsan.net +tscl.com.bd +tsms-ad.tsms.com +tsmtrk.com +tspeeds.com +tsstcorpcddvdwshbbdriverfb.aircus.com +tst.returnpath.net +tste.ivillage.com +tste.mcclatchyinteractive.com +tste.startribune.com +tsv-russee-kiel.de +tsxclub.us.intellitxt.com +tsyndicate.com +tt.omtrdc.net +tt.onthe.io +tt1.shoofle.tv +tt11.adobe.com +tt3.zedo.com +ttarget.adbureau.net +ttb.tbddlw.com +ttflb.com +ttga.in +ttnet.yandex.com.tr +ttoc8ok.com +ttrraacckkrr.com +ttsq.fr +ttt.fwq101.tk +tttbbbttt.zapto.org +ttuk.offers4u.mobi +ttwitter.com +tu.connect.wunderloop.net +tub3.org +tubbing.net +tubbybucks.com +tube.exclusiotv.be +tube.thumblogger.com +tube8.com +tube8vidsbbr.dnset.com +tube8vidsbhy.dnset.com +tube8vidsbzx.dnset.com +tube8vidscjk.ddns.name +tube8vidscqs.ddns.name +tube8vidscut.ddns.name +tube8vidsdob.dnset.com +tube8vidsdst.ddns.name +tube8vidsfgd.ddns.name +tube8vidshhr.ddns.name +tube8vidshkk.ddns.name +tube8vidshrw.dnset.com +tube8vidsiet.ddns.name +tube8vidsiww.ddns.name +tube8vidsjac.dnset.com +tube8vidsjan.ddns.name +tube8vidsjhn.ddns.name +tube8vidsjtq.ddns.name +tube8vidslmf.dnset.com +tube8vidslni.dnset.com +tube8vidslqk.ddns.name +tube8vidslrz.ddns.name +tube8vidsnlq.dnset.com +tube8vidsnrt.ddns.name +tube8vidsnvd.ddns.name +tube8vidsnyp.dnset.com +tube8vidsolh.ddns.name +tube8vidsotz.dnset.com +tube8vidsowd.dnset.com +tube8vidspeq.ddns.name +tube8vidsqof.ddns.name +tube8vidsrau.dnset.com +tube8vidsrdr.dnset.com +tube8vidsrhl.ddns.name +tube8vidsrom.dnset.com +tube8vidssan.dnset.com +tube8vidssjw.ddns.name +tube8vidssyg.dnset.com +tube8vidstrh.dnset.com +tube8vidstyp.ddns.name +tube8vidsuty.dnset.com +tube8vidsvaj.dnset.com +tube8vidsvcs.ddns.name +tube8vidsvmr.ddns.name +tube8vidsvrx.ddns.name +tube8vidsvtp.dnset.com +tube8vidswsy.dnset.com +tube8vidswtb.ddns.name +tube8vidswys.ddns.name +tube8vidsxlo.ddns.name +tube8vidsxmx.dnset.com +tube8vidsxpg.ddns.name +tube8vidsxpp.dnset.com +tube8vidsxwu.ddns.name +tube8vidsycs.dnset.com +tube8vidsyip.ddns.name +tube8vidsymz.dnset.com +tube8vidsyre.dnset.com +tube8vidsyyf.dnset.com +tube8vidszmi.ddns.name +tube8vidsznj.ddns.name +tube8vidsznx.ddns.name +tube8vidszyj.ddns.name +tubegalorel.com +tubeline.biz +tubemogul.com +tubemoviez.com +tubeoffline.com +tubeporn.ca +tuberkulezanet.ru +tuberkuleznik.ru +tubetitties.com +tubgirl.me +tubgirl.org +tubo360.com +tuckows.com +tuckpointingmasonrysystems.com +tufe.info +tufsl.com +tuhostcr.com +tui.intelli-direct.com +tukejrh.angelfire.com +tula.mdverey.ru +tulatoly.com +tulip18.com +tumi.112.2o7.net +tune.com +tuneci.us-west-2.k8s.ci.ops.tune.com +tuneci.us-west-2.k8s.ops.tune.com +tunez9ja.com +tungshinggroup.com.vn +tuniaf.com +tunmedia.tns-cs.net +tuno.nuggad.net +tupper-posuda.ru +tupper-shop.ru +turbatii.com +turbine.wbinsights.com +turbo-suslik.org +turboadv.com +turbospeed.info +turdgasm.com +turelatoporno.com +turist-strani.ru +turkerotica.com +turkerotica.net +turkeyduster.com +turkeyrank.com +turkeyreport.tk +turkishporno.info +turkishsikis.net +turkpornofilmleri.com +turn.com +turn.nexac.com +turnerapac.d1.sc.omtrdc.net +turnerclassic.112.2o7.net +turnersports.112.2o7.net +turnsocial.com +turnsocial.now.sh +turobit.pw +turtlecoin.crypto-webminer.com +turtlediary.co +turtlejar.com +turvgori.ru +tusgatitas.com +tutiendaencasa.com +tutorialoutpost.us.intellitxt.com +tutorials-reviews.com +tuttoadult.com +tv-adult.com +tv-girls.dk +tv-internetowa.pl +tv-now.us.intellitxt.com +tv-rightcelebrity.us.intellitxt.com +tv-spoty.info +tv-thaionline.com +tv.sohu.com +tv.viewbix.com +tv2dk.nuggad.net +tv2no.linkpulse.com +tv4play-se.c.richmetrics.com +tvads.alphonso.tv +tvadsync.com +tvand.ru +tvaovivogratis.com +tvcenter.ca +tvclub.nl +tversvet.ru +tvfanatic.us.intellitxt.com +tvguide.112.2o7.net +tvmds.tvpassport.com +tvmtracker.com +tvn.adocean.pl +tvn.hit.gemius.pl +tvn2.adocean.pl +tvonline.hol.es +tvoystartup.ru +tvpage.com +tvseriesfinale.us.intellitxt.com +tvshowslist.com +tvshowsnow.tvmax.hop.clickbank.net +tvteasers.com +tvteleport.ru +tvzebra.popunder.ru +tw.adserver.yahoo.com +tw.fiksu.com +tw2.adserver.yahoo.com +twarea.com +twatcountry.com +twatsleuth.com +twc.demdex.net +twci.112.2o7.net +twci.coremetrics.com +twdhefy.com +tweaks.us.intellitxt.com +tweaktown.us.intellitxt.com +tweakvista.us.intellitxt.com +tweax.nl +tweetsoup.us.intellitxt.com +twentemileu.nl +twiclub.in +twincitiescarservice.com +twinderbella.com +twinflames-twinsouls.net +twinfriends.com +twinkgayboys.com +twinks.allmanpages.com +twinksandmore.com +twinkss.com +twinkstink.com +twinsparc.com +twistedgaylinks.com +twistys.biz +twitchguru.us.intellitxt.com +twitlinks.com +twittad.com +twitter.cm +twitter.login.kevanshome.org +twitter.secure.bzpharma.net +twittercounter.com +twittrading.com +twittruth.com +twizzin.theappgrader.com +twizzls.com +twlistings.com +twnads.weather.ca +two-jj.github.io +two-ply-dev.gw.localytics.com +two-ply.gw.localytics.com +twodollarshows.com +twoglassdildos.blogspot.com +twohot.net +twoj-bon.pl +twoj-macbook.pl +twoj-test-iq.blogspot.com +twoj-typ.pl +twoj-voucher.com +twoja-przegladarka.pl +twoje-filmy.pl +twoje-nagrody.com.pl +twoje-nagrody.pl +twoje-piekno.pl +twojeartykuly.com +twojebook.pl +twojszczesliwydzien.com +twskype.com +twtalk.com +twttr.com +twu.com.ua +twx.2mdn.net +twx.doubleclick.net +twxashealth.org +twyfordvillagepartnership.co.uk +twyn.com +tx.5.p2l.info +tx.micro.net.pk +tx1.yext.com +tx2.ru +tx41tclega.ru +txa-rtb1.rfihub.net +txads.buzzcity.com +txt.adv.vz.ru +txxx.com +tyi4.pl +tymon.intelsad.com +tynt.com +typeofmarijuana.com +typicalteeth.com +typo3.ero-advertising.com +tyroo.com +tz284.com +tzw.com +u-ads.adap.tv +u.admob.com +u.agentanalytics.com +u.extreme-dm.com +u.fastly-insights.com +u.heatmap.it +u.openx.net +u.optorb.com +u.outbrain.com +u.sec.fastly-insights.com +u.staging.fastly-insights.com +u.test.fastly-insights.com +u.videoamp.com +u0.extreme-dm.com +u1.extreme-dm.com +u1.puls.lv +u1817.16.spylog.com +u2.outbrain.com +u3102.47.spylog.com +u3305.71.spylog.com +u3608.20.spylog.com +u4056.56.spylog.com +u432.77.spylog.com +u4396.79.spylog.com +u4443.84.spylog.com +u4556.11.spylog.com +u5234.87.spylog.com +u5234.98.spylog.com +u5687.48.spylog.com +u574.07.spylog.com +u5t.adx1.com +u604.41.spylog.com +u6762.46.spylog.com +u6905.71.spylog.com +u7748.16.spylog.com +u810.15.spylog.com +u85foldero.com +u920.31.spylog.com +u977.40.spylog.com +ua-content.adriver.ru +ua.adocean.pl +ua.adriver.ru +ua.badongo.com +ua.cnt.gemius.pl +ua.hit.gemius.pl +ua.inmobi.com +ua.supersonicads.com +ua1.hit.stat24.com +ua2.admixer.net +ua2.hit.stat24.com +ua3.hit.stat24.com +ua4.hit.stat24.com +ua5.hit.stat24.com +uac-assets.cdn.inmobi.com +uac.advertising.com +uadx.com +ualumphuoldi.angelcities.com +uaparser.staging.us-east-1.kops.kargo.com +uarating.com +uat-net.technoratimedia.com +uat.audience.newscgp.com +uat.bladegame.midasplayer.com +uat.dev.sizmek.com +uat.newscgp.com +uat.pixel.newscgp.com +uat.pixel.printsites.net +uav.tidaltv.com +uawj.moqhixoz.cn +uberads.net +ubergizmo.us.intellitxt.com +ubike.tourstogo.us +ubisoftinternational.demdex.net +ublock.org +ubm.tt.omtrdc.net +ubmcmm.baidustatic.com +uc.csc.adserver.yahoo.com +ucc.wix.com +uchyz.cruisingsmallship.com +ucounter.ucoz.net +ucstat.baidu.com +ud.adkmob.com +udarem.com +udata.inlocomedia.com +udc.msn.com +udm.ia6.scorecardresearch.com +udm.ia7.scorecardresearch.com +udm.ia8.scorecardresearch.com +udm.ia9.scorecardresearch.com +udm.ri1.scorecardresearch.com +udm.ri2.scorecardresearch.com +udm.ri3.scorecardresearch.com +udm.ri4.scorecardresearch.com +udm.ri5.scorecardresearch.com +udm.ri6.scorecardresearch.com +udm.ri7.scorecardresearch.com +udm.ri8.scorecardresearch.com +udm.ri9.scorecardresearch.com +udm.scorecardresearch.com +udmserve.net +udqgbokvzbnqkf.ru +udziele-pozyczki-prywatnie.pl +ue1-a.thirdpresence.com +uebawtz7.me +uedata.amazon.com +uelbdc74fn.s.ad6media.fr +uf2.svrni.ca +uf2aasn.111adfueo.us +uffa.sizmek.com +ufpcdn.com +ug.rtb.adx1.com +ugdturner.com +ughmvqf.spitt.ru +ugmfvqsu.ru +ugo.eu-adcenter.net +uhf.microsoft.com +ui-idx.inmobi.com +ui.adswizz.com +ui.agkn.com +ui.cp.tune.com +ui.oix.net +ui.optimizely.com +ui.ppjol.com +ui.preprod.sddan.mgr.consensu.org +ui.sddan.mgr.consensu.org +ui.staging-api-docs.fyber.com +uid.mavencoalition.io +uid1.vindicosuite.com +uidbox.uimserv.net +uikit.extremereach.com +uim.tifbs.net +uio7.pl +uip.semasio.net +uiservices.adtech.de +uiservices.adtechus.com +ujjwaltest.qa.campaign.adobe.com +uk-ad2.adinfuse.com +uk-ads.openx.net +uk-go.adinfuse.com +uk.2.cqcounter.com +uk.activeshopper.com +uk.adlearnop.advertising.com +uk.ads.hexus.net +uk.adserver.yahoo.com +uk.at.atwola.com +uk.cqcounter.com +uk.doubleclick.net +uk.i1.yimg.com +uk.mediaplayercodecpack.com +uk.nedstat.net +uk.nedstatpro.net +uk.sitestat.com +uk.thunderhead.com +uk2.thunderhead.com +uk4.hit.stat24.com +ukbanners.com +ukonline.hc0.me +ukrbanner.net +ukrfarms.com.ua +ukrpts.net +ukryteterapie.pl +uksummerparty.exponential.com +uktc.ijento.com +ukugl.tourstogo.us +ukvpn.thunderhead.com +ukvpn2.thunderhead.com +uleadstrk.com +ulic.baidu.com +ulink.adjust.com +ullnot.download +ulnawoyyzbljc.ru +ultimateclixx.com +ultimatecounter.com +ultimatefashiongifts.com +ultra-cdn.pl +ultra2.tsinghua.edu.cn +ultrabestportal.com +ultracet.1.p2l.info +ultram.1.p2l.info +ultramercial.com +ultraministry.xyz +ultramole.xyz +ultranote.crypto-webminer.com +ultraoranges.com +ultrasponsor.com +ultratrck.com +ultrawarez.eu +um.simpli.fi +um.videmob.com +um2.eqads.com +umbs.ero-advertising.com +ums-toy.adtechjp.com +ums.adtech.de +ums.adtechjp.com +ums.adtechus.com +unalbilgisayar.com +unarmedindustry.com +unathleticmag.us.intellitxt.com +unblockfacebook.co.uk +unblocksit.es +unconf.adkmob.com +uncut.oewabox.at +undefined.it +undertone.com +undertonenetworks.com +unicast-stb.metric.gstatic.com +unicast.metric.gstatic.com +unicast2-stb.metric.gstatic.com +unicast2.metric.gstatic.com +uniclick.openv.com +unifi.corp.instartlogic.com +unimed.oewabox.at +union.56.com +union.6.cn +union.baidu.com +unionleisurewear.com +unir.facebook-ads.adtz.com +unite3tubes.com +united-airline-fare.100pantyhose.com +unitex.home.pl +unitus.synergy-e.com +unity.fyber.com +unityads.unity3d.com +universal-d.openx.net +universal.iperceptions.com +universetoday.us.intellitxt.com +university-online.petrovka.info +universityherald.us.intellitxt.com +universityonline.marketo.com +unk.vver.kiae.rr +unknown.counsellor.gov.cn +unknowntray.com +unlim-app.tk +unlimiclick.com +unlink.altitude.lv +unlockme.corp.inmobi.com +unmillondeutilidades.com +unreal.backtrace.io +unreal01.linode-ca1.backtrace.io +unreal01.linode-de1.backtrace.io +unreal01.linode-nj1.backtrace.io +unreal01.linode-sg1.backtrace.io +unrealcommander.biz +unrealcommander.com +unrealcommander.org +unrulymedia.com +unrummaged.com +unstat.baidu.com +untd.com +untidyquestion.com +unusualtitle.com +unveilmedia.mgr.consensu.org +unverf.com +unwashedsound.com +unwrittenspot.com +uoaofgqu.angelcities.com +uojamcse.angelcities.com +uoldid.ru +uole.ad.uol.com.br +uolfreeservers.112.2o7.net +uoljunocom2.112.2o7.net +uolnetzeronet2.112.2o7.net +uolphotosite.112.2o7.net +uop.umeng.com +up.dev.midasplayer.com +up.mykings.pw +up.nytimes.com +up.qa.midasplayer.com +upads.info +upc.d2.sc.omtrdc.net +updat120.clanteam.com +update-1.com +update-java.kit.net +update-skype.freehostia.com +update-your-pc.info +update.51edm.net +update.hiconversion.com +update.onescan.co.kr +update.placelocal.com +update.privdog.com +update.theplacetoupdating.pw +update.thunderhead.com +updateauto.preparevideosafesystem4unow.site +updateauto.preparevideosafesystem4unow.space +updatehere.ultimatesetnewfreeallsoftupgradesystems.pw +updates.desktop.ak-networks.com +updates.drift.com +updates.onlinesucces.nl +updates.tune.com +updatestar.com +updo.nl +upgrade.themainplacesetnowforcontentingnew.bid +upgradeget.thegreatforupdatesafemove.download +upgradenote.enterbestforupdating.bid +upgraderservices.cf +upi.112.2o7.net +upi.us.intellitxt.com +upload.1p.bugsnag.appstore.a2z.com +upload.aca.bugsnag.appstore.a2z.com +upload.adtech.de +upload.adtech.fr +upload.adtech.us +upload.appdynamics.com +upload.bugsnag.appstore.a2z.com +upload.crypto-webminer.com +upload.firetv.bugsnag.appstore.a2z.com +upload.luckyorange.net +uploader.syndicaster.tv +uploads.github.exacttarget.com +uploads.tmweb.ru +upproar.com +uppyads.com +uproar.com +uproar.fortunecity.com +uprour.com +ups.tt.omtrdc.net +upshare.org +upsoj.iptvdeals.com +upstats.yadro.ru +upswings.net +uptodatecontent.net +uqz.com +ur93pklmrzha.ingest.sentry.io +ur93pklmrzha.sentry.io +urban.adspirit.de +urbanairship.com +urbaninsight.com +urbn-live-stream-feeds.dynamicyield.com +urchin.lstat.youku.com +urchman11.zapto.org +urineheaven.com +url-cameralist.tk +url-img.link +url2image.com +urlaub-sylt.com +urlaubincarolinensiel.com +urlcash.net +urlcut.net +urlcut.ru +urldelivery.com +urlife2all.com +urll.eu +urlstats.com +uroffer.link +ursa.theappgrader.com +urshort.net +urwijnagrody.pl +us-ads.openx.net +us-cdn.effectivemeasure.net +us-choicevalue.com +us-commsrv-a.vergic.com +us-east-1-util01.yottaa.com +us-east-1.awstrack.me +us-east-1.bid.bidr.io +us-east-1.dc.ads.linkedin.com +us-east-1.prod.curalate.com +us-east-1.prod.internal.curalate.com +us-east-1.qa.curalate.com +us-east-1.qa.internal.curalate.com +us-east-1.stinger-ad.bidr.io +us-east-1.world.rw.yieldmo.com +us-east-tlx.3lift.com +us-east1.serve.elixmedia.com +us-east1.serve.enatimedia.com +us-fs10-mitm-api.swrve.com +us-fs12-mitm-api.swrve.com +us-gmtdmp.mookie1.com +us-p2.prosvs.247realmedia.com +us-sonar.sociomantic.com +us-stratum.viaxmr.com +us-topsites.com +us-tracker.inside-graph.com +us-u.openx.net +us-west-2.awstrack.me +us-west-2.bid.bidr.io +us-west-2.prod.aws.keen.io +us-west-2.stinger-ad.bidr.io +us-west-2.test.aws.keen.io +us.2.cqcounter.com +us.a1.yimg.com +us.ads.justpremium.com +us.adserver.yahoo.com +us.audience.newscgp.com +us.b1.yimg.com +us.c1.yimg.com +us.cdn.survey.medallia.com +us.cfcdist.loan +us.cfcnet.gdn +us.cfcnet.top +us.content.cmp.advertising.com +us.cqcounter.com +us.criteo.com +us.criteo.net +us.d1.yimg.com +us.e1.yimg.com +us.event.cmp.advertising.com +us.f1.yimg.com +us.g1.yimg.com +us.gmads.mookie1.com +us.h1.yimg.com +us.intellitxt.com +us.j1.yimg.com +us.k1.yimg.com +us.kopuz.com +us.l1.yimg.com +us.m1.yimg.com +us.moneroocean.stream +us.n1.yimg.com +us.np.adproxy.ndmdhs.com +us.o1.yimg.com +us.p1.yimg.com +us.pixel.newscgp.com +us.q1.yimg.com +us.qualtrics.com +us.r1.yimg.com +us.rmcontent.advertising.com +us.rmevent.advertising.com +us.s1.yimg.com +us.sitestat.com +us.t1.yimg.com +us.tags.newscgp.com +us.thunderhead.com +us.tracking.justpremium.com +us.u.fastly-insights.com +us.u.staging.fastly-insights.com +us.u.test.fastly-insights.com +us.u1.yimg.com +us.v1.yimg.com +us.vsassets.com +us.w1.yimg.com +us.x1.yimg.com +us.y.atwola.com +us.y1.yimg.com +us.z1.yimg.com +us0.adlibr.com +us1.cfcnet.gdn +us1.monerise.com +us1.siteimprove.com +us15.campaign-archive.com +us16.campaign-archive.com +us2.cfcnet.gdn +us2.monerise.com +us2.qualtrics.com +us2.siteimprove.com +us3.cpufan.club +us5.campaign-archive.com +usa.cc +usa.nedstat.net +usaa.tt.omtrdc.net +usabilitytesten.nl +usachoice.net +usadmm.dotomi.com +usads.vibrantmedia.com +usadserver.com +usage.trackjs.com +usapolice.com +usapromotravel.com +usatoday.app.ur.gcion.com +usatoday1.112.2o7.net +usatodaysports-d.openx.net +usatravel-specials.com +usatravel-specials.net +usav.sizmek.com +usbank.tt.omtrdc.net +usbankmetrics.insight.omtrdc.net +usc-ppa-dev.urbaninsight.com +usc-ppa-test.urbaninsight.com +usc.adserver.snapads.com +uscell.airfind.com +uscell.dev.airfind.com +uscell.staging.airfind.com +usd.sierra-boa.com +usdialin.sizmek.com +usdk.batmobi.net +usdm.122.2o7.net +use-foreman1.use.adsrvr.org +use-foreman2.use.adsrvr.org +use-foreman3.use.adsrvr.org +use-foreman4.use.adsrvr.org +use-foremanproxy1.use.adsrvr.org +use-tor.adsrvr.org +use-va1.adsrvr.org +use.adserver.snapads.com +use.adsrvr.org +use.backtrace.io +use.convertglobal.com +use.dynamicyield.com +usemax.de +user-sync.adhese.com +user.desmoinesregister.com +user.savings2phone.siliconorchard.com +userbest.com +usercentrics.mgr.consensu.org +userdata-maxis.krxd.net +userdocs.urbanairship.com +userguides.tritondigital.com +useriq.com +userreplay.com +userreplay.net +users.effectivebrand.com +users.ero-advertising.com +users.quantumgraph.com +users16.jabry.com +users173.lolipop.jp +usersapi.testing.piwik.pro +usersegment.wpdigital.net +ushqlyncpool.foresee.com +uslyncweb.sizmek.com +usmeet.sizmek.com +usnews-d.openx.net +usnews.122.2o7.net +usproxy.randi.adswizz.com +usr.marketgid.com +ussearch.122.2o7.net +ussfbweb.sizmek.com +ussip.sizmek.com +usswrite.com +ustat.batmobi.net +ustaw--tlo-fb.blogspot.com +usun.112.2o7.net +usunwirusa.pl +usvpn.thunderhead.com +usweb.dotomi.com +uswebapps.sizmek.com +uswebconf.sizmek.com +uswest.cpufan.club +ut-api.analytics.yahoo.com +ut.5.p2l.info +ut.addthis.com +ut.analytics.yahoo.com +ut.ciq.dmpxs.com +ut.iadsdk.apple.com +ut1.qualtrics.com +utairway.com +utarget.ru +utenti.lycos.it +utility.baidu.com +utils.media-general.com +utils.mediageneral.com +utils.mediageneral.net +utk.baidu.com +utm.cursormania.com +utm.excite.co.uk +utm.excite.it +utm.myfuncards.com +utm.myway.com +utm.popswatter.com +utm.popularscreensavers.com +utm.smileycentral.com +utm.trk.cursormania.com +utm.trk.excite.com +utm.trk.myfuncards.com +utm.trk.myway.com +utm.trk.popswatter.com +utm.trk.popularscreensavers.com +utm.trk.smileycentral.com +utm.trk.webfetti.com +utm.trk.zwinky.com +utm.webfetti.com +utm.zwinky.com +utm2.smileycentral.com +utmtrk2.smileycentral.com +utrack.hexun.com +utraffic.engine.adglare.net +uts-api.at.atwola.com +uts.advertising.com +uttermosthobbies.com +uunyadgda1.doubleclick.net +uunyadgds1.doubleclick.net +uvidu.butlerelectricsupply.com +uvimage.56.com +uvy3.pl +uwz.oewabox.at +ux.appsee.com +uzljra.ru +v-30.algovid.com +v-31.algovid.com +v-32.algovid.com +v-33.algovid.com +v-34.algovid.com +v-36.algovid.com +v-37.algovid.com +v-38.algovid.com +v-39.algovid.com +v-eu-preprod.amazon-adsystem.com +v-eu.amazon-adsystem.com +v-preprod.amazon-adsystem.com +v.admedia.com +v.admob.com +v.algovid.com +v.amazon-adsystem.com +v.bsvideos.com +v.extreme-dm.com +v.fwmrm.net +v.inigsplan.ru +v.jsrdn.com +v.landingzone.se +v.lkqd.net +v.optvdo.com +v.stg.fwmrm.net +v.velaro.com +v.vomedia.tv +v.vungle.com +v0.extreme-dm.com +v0.stat.ku6.com +v1.browser-tools.systems +v1.cnzz.com +v1.extreme-dm.com +v1.nedstatbasic.net +v1.stat.ku6.com +v1.your-notification.tools +v10.events.data.microsoft.com +v10.vortex-win.data.microsoft.com +v10.xmlsearch.miva.com +v10c.events.data.microsoft.com +v16.56.com +v2.adgoto.com +v2.ads3.ipon.lt +v2.adsbookie.com +v2.stat.ku6.com +v2.urlads.net +v2profit.com +v3.ads.mopub.com +v3.cnzz.com +v3.stat.ku6.com +v3.toolbar.soso.com +v4.chartboost.com +v4.cnzz.com +v4.metric.gstatic.com +v5.chartboost.com +v5.chinoc.net +v5.cnzz.com +v7.cnzz.com +v7.stats.load.com +v7pjo.voluumtrk.com +v8.analytics.pinsightmedia.com +v8engine.pinsightmedia.com +v8push.pinsightmedia.com +v9.cnzz.com +v90327ux.beget.tech +va-g2.gumgum.com +va.5.p2l.info +va.tawk.to +va.us.criteo.com +va.us.criteo.net +vacances-voyages.info +vacation.toppick.info +vacattionstogo.com +vaccgenocide.wordpress.com +vachevskih.ru +vacuumscleaner.com +vad.adbasket.net +vadimkravtcov.ru +vadp.de +vads.adbrite.com +vaes-eu-preprod.amazon-adsystem.com +vaes-eu.amazon-adsystem.com +vaes-fe-preprod.amazon-adsystem.com +vaes-fe.amazon-adsystem.com +vaes-na-preprod.amazon-adsystem.com +vaes-na.amazon-adsystem.com +vaes-preprod.dub.amazon-adsystem.com +vaes-preprod.iad.amazon-adsystem.com +vaes-preprod.pdx.amazon-adsystem.com +vaes.amazon-adsystem.com +vaes.dub.amazon-adsystem.com +vaes.iad.amazon-adsystem.com +vaes.iad.preprod.amazon-adsystem.com +vaes.pdx.amazon-adsystem.com +vaes.pdx.preprod.amazon-adsystem.com +vaginavision.com +vagony.ru +vaibio.com +vaime.net.popunder.ru +vains.com +vaippaandedicators.reducemycard.com +vaitu.club +valassisdigital.com +valb.atm.youku.com +valc.atm.youku.com +valf.atm.youku.com +validccseller.com +validclick.com +validdomain.xyz +valium.este.ru +valium.hut1.ru +valium.ourtablets.com +valium.polybuild.ru +valiumvalium.3xforum.ro +valkiria-tk.ru +valo.atm.youku.com +valouweeigenaren.nl +valp.atm.youku.com +valtrex.1.p2l.info +valtrex.3.p2l.info +valtrex.4.p2l.info +valtrex.7h.com +valuead.com +valueclick.com +valueclick.net +valueclickmedia.com +valuecommerce.com +valuehost.co.uk +valuesponsor.com +vamsoupowoa.com +van.ads.link4ads.com +van.redlightcenter.com +vancouversun-com.c.richmetrics.com +vanfireworks.com +vanguard.d2.sc.omtrdc.net +vanguard.demdex.net +vanguardair.com +vaniqa.1.p2l.info +vanns.112.2o7.net +vanpersie.alphonso.tv +vanssk8hi.pl +vap.lijit.com +variablefitness.com +varsityads.directtrack.com +vasanthkumar.com +vashoot.rtb.adx1.com +vast.bp3845260.btrll.com +vast.bp3846806.btrll.com +vast.bp3846885.btrll.com +vast.btrll.com +vast.deliads.com +vast.optimatic.com +vast.prebid.org +vast.sekindo.com +vast.ssp.optimatic.com +vast.streamrail.net +vast.tubemogul.com +vast.vertamedia.com +vastproxy.brand.inmobi.com +vastx.moatads.com +vault-ui.mgmt.us-east-1.kops.kargo.com +vault.adotmob.com +vault.kargo.com +vault.mediavine.com +vault9.us.intellitxt.com +vb2.allinviews.com +vb2.beeviewd.com +vb2.bestcontentonline.com +vb2.installfarm.com +vb2.shoofle.tv +vbadbg.hit.gemius.pl +vbbg.adocean.pl +vcc.ssacdn.com +vcdn.adnxs.com +vcdn.media.innity.net +vcenter.corp.appdynamics.com +vcfs6ip5h6.bid +vcipo.info +vclick.adbrite.com +vclicks.net +vcm.oewabox.at +vcomdeepdiscount.112.2o7.net +vcommerce.112.2o7.net +vconf.outbrain.com +vconfgw.outbrain.com +vcontent.e-messenger.net +vcrypt.net +vcsa.vmware.com +vcu.collserve.com +vcxz.pl +vd.escapicon.net +vdhu.com +vdtrack.com +vdula.czystykod.pl +ve.tscapeplay.com +vectrabank.112.2o7.net +vedoriska.com +veeplay.com +veeso.co +veevu.tourstogo.us +vegas-1.xmrpool.net +veille-referencement.com +veirregnant.club +veksi.barginginfrance.net +velocecdn.com +vendor.savings2phone.siliconorchard.com +vendorlist.consensu.org +vendorlist.fidzup.mgr.consensu.org +vendorweb.citibank.com +venetia.iad.appboy.com +venetian.evyy.net +ventivmedia.com +venturead.com +venus.goclick.com +venus.inmobi.com +vergic.com +vericlick.com +verifier.live +verifycaptcha.com +verisignwildcard.112.2o7.net +verisonwildcard.112.2o7.net +veritasim.d1.sc.omtrdc.net +veritastechnologiesl.tt.omtrdc.net +veritrol.com +verivox01.webtrekk.net +verizon.demdex.net +verizontelecom.tt.omtrdc.net +verizonwireless.112.2o7.net +verizonwireless.tt.omtrdc.net +vermontteddybear.112.2o7.net +vernoblisk.com +verresof.com +versionsupport.set2updatenowsafesystemset4now.info +versionsupport.thebig-centeralplacecontentgreat.date +vertadnet.com +vertical-stats.huffpost.com +verticals.marketolive.com +veruta.com +vervewireless.com +very-koi.com +vette-porno.nl +veuhub-d.openx.net +vf7.soundsecureredir.com +vfastdownload.com +vfdeprod.amobee.com +vg-no.c.richmetrics.com +vg.tns-cs.net +vg02h8z1ul.me +vh1com.112.2o7.net +vht.tradedoubler.com +vi.5.p2l.info +via.intercom.io +via.oewabox.at +viaaddictingclips.112.2o7.net +viaaddictinggames.112.2o7.net +viaarena.us.intellitxt.com +viaatom.112.2o7.net +viaatomv6.112.2o7.net +viaatomvideo.112.2o7.net +viabestweekever.112.2o7.net +viacom.oewabox.at +viacomedycentral.112.2o7.net +viacomedycentralrl.112.2o7.net +viacomedyde.112.2o7.net +viagametrailers.112.2o7.net +viagra-online.petrovka.info +viagra-pill.blogspot.com +viagra-soft-tabs.1.p2l.info +viagra-store.shengen.ru +viagra.1.p2l.info +viagra.3.p2l.info +viagra.4.p2l.info +viagra.polybuild.ru +viagraviagra.3xforum.ro +vialogoonline.112.2o7.net +vialogorollup.112.2o7.net +viamichelin.cdn11.contentabc.com +viamichelin.media.trafficjunky.net +viamtv.112.2o7.net +viamtvcom.112.2o7.net +viamtvnvideo.112.2o7.net +viamtvromania.112.2o7.net +viamtvtr.112.2o7.net +viamtvtr3s.112.2o7.net +viamtvuk.112.2o7.net +viamtvukdev.112.2o7.net +vianewnownext.112.2o7.net +vianickde.112.2o7.net +viaquiz.112.2o7.net +viarnd.112.2o7.net +viasatsatelliteservices.112.2o7.net +viashockwave.112.2o7.net +viashockwavekeyhole.112.2o7.net +viaspike.112.2o7.net +viasyndimedia.112.2o7.net +viaukplayer.112.2o7.net +viavh1com.112.2o7.net +viavh1scandalist.112.2o7.net +viavh1video.112.2o7.net +viaxmr.com +viay2m.112.2o7.net +vibe.us.intellitxt.com +vibrant.mgr.consensu.org +vibrantmedia.com +vic.allinviews.com +vic.beeviewd.com +vic.bestcontentonline.com +vic.installfarm.com +vic.placeyourview.com +vic.shoofle.tv +vice-ads-cdn.vice.com +vice-d.openx.net +vice-useast.gscontxt.net +vice-web-statics-cdn.vice.com +vicedata.com +vicinity-marketing.com +vicodin-online.petrovka.info +vicodin-store.shengen.ru +vicodin.t-amo.net +victor.connectcloud.ch +victoriaadvocate.112.2o7.net +vid-io.springserve.com +vid.atdmt.com +vid.atm.youku.com +vid.springserve.com +vidassets.terminus.services +vidazoo-bi-worker-connection.vidazoo.com +videmob.com +video-ad-stats.googlesyndication.com +video-ads.rubiconproject.com +video-adserver.ibillboard.com +video-assets.mathtag.com +video-aws-staging.fyber.com +video-aws-stg.fyber.com +video-converter.gumgum.com +video-dsa.fyber.com +video-game-rewards-central.com +video-interstitial-assets-cdn.fyber.com +video-pomp.com +video-stage.adaptv.advertising.com +video-stats.video.google.com +video-thumbs.stripcdn.com +video.adaptv.advertising.com +video.branch.io +video.buzzintersection.com +video.cloud.kargo.com +video.cynogage.com +video.districtm.net +video.dmtracker.com +video.entertaintastic.com +video.estream.nu +video.franklyinc.com +video.fyber.com +video.loudgames.com +video.mediavine.com +video.od.visiblemeasures.com +video.revcontent.com +video.sekindo.com +video.springserve.com +video.stream.vidzi.tv +video.streaming.estream.to +video.survata.com +video.theparentingvillage.com +video.unrulymedia.com +video.videos.vidto.me +video1.adprimemedia.com +video2.stream.vidzi.tv +videoadex.com +videoamp.com +videobox.com +videoclick.ru +videocodezone.us.intellitxt.com +videocop.com +videodev.franklyinc.com +videoegg.adbureau.net +videoegg.com +videoflyover.com +videogamerewardscentral.com +videogum.tags.crwdcntrl.net +videojug.uk.intellitxt.com +videomediagroep.nl +videon.com.pl +videoplayer.vice.technology +videoplayer2.xyz +videorazr.com +videorvrcip.112.2o7.net +videos-acceptance.sharethrough.com +videos-bleepingcomputers-com.tvpagecdn.com +videos-live.com +videos-matures.info +videos-porno-beurette.com +videos-porno-gratuites.biz +videos-porno.biz +videos-porno.tv +videos-pornos.biz +videos-sexe-gratuit.biz +videos-sexe.biz +videos-sexo.com +videos-staging.sharethrough.com +videos-xxx.biz +videos.acceptance.sharethrough.com +videos.aweber.com +videos.dskjkiuw.com +videos.fleshlight.com +videos.sharethrough.com +videos.staging.sharethrough.com +videos.twitter.secure-logins01.com +videos.video-loader.com +videos.vidto.me +videoshop.dk +videoslingerie.com +videoslive.net +videoslots.888.com +videosmadurasgratis.net +videosmutfreek.com +videosongplayer.com +videostat.com +videotroncom.112.2o7.net +videoway.net +vidilife.crwdcntrl.net +vidnet.pl +vidnet.us.intellitxt.com +vidora.com +vidplayer.pl +vids24.pl +vidstat.taboola.com +vidstat.taboola.com.cdn.cloudflare.net +vidstatb.taboola.com +vidutils.taboola.com +vidyo.rubiconproject.com +vidyorouterldn.rubiconproject.com +vidzsource.net +viessmann-model.de +view.adjust.com +view.admission.net +view.atdmt.com +view.avenuea.com +view.binlayer.com +view.boa.exacttarget.com +view.c3tag.com +view.dev.khingtracking.com +view.exacttarget.com +view.iballs.a1.avenuea.com +view.jamba.de +view.khingtracking.com +view.netrams.com +view.network.affiliando.com +view.paradym.com +view.s4.exacttarget.com +view.s50.exacttarget.com +view.s6.exacttarget.com +view.s7.exacttarget.com +view.s8.exacttarget.com +view4cash.de +viewbix.com +viewer.peer39.com +viewerfb.glt.pl +viewerstats.docstoc.com.s3.amazonaws.com +viewfree.info +views.m4n.nl +viewsignage.com +viewteen.com +viewtools.com +viglink.com +viglink.pgpartner.com +vigrx-original.ru +vigrxplusreview.ca +vikistars.com +viktoria-center.ru +vilingstore.net +villa.alphonso.tv +villacoloniale.com +villagarden.pl +villagevoicecollect.247realmedia.com +villakohlanta.nu +villalecchi.com +vilynx.com +vimeoo.net +vindicosuite.com +vintacom.112.2o7.net +vintadream.112.2o7.net +vioxx.1.p2l.info +vip-ads-tpx.stg.ads.aws.fwmrm.net +vip.adpiano.com +vip.adstatic.com +vip.cfcnet.top +vip.clickzs.com +vip.clickzzs.nl +vip1.tw.adserver.yahoo.com +vip2.clickzs.com +vip2.clickzzs.nl +vipcheats.us +vipcpms.com +vipdn123.blackapplehost.com +viper.popunder.ru +vipescortilan.com +vipfastmoney.com +vipfortnitecheats.com +viphack.pro +vipms.ru +vipps.com.my +vipromoffers.com +vipsexstore.com +vipsiterip.org +viptreat.com +viral-videos.xyz +viralture.com +viralvideo.112.2o7.net +viralvideos.tips +viralvids.info +virgin-x.com +virginc.com +virginiatour.112.2o7.net +virginmedia.112.2o7.net +virginmobile.122.2o7.net +virginmobileusa.tt.omtrdc.net +virginphotos.info +virginshardcore.com +virt.boa.exacttarget.com +virt.s4.exacttarget.com +virtua-girl.info +virtuabr.com.br +virtuagirl.com +virtuaguy.net +virtual-babes.com +virtual-office.in +virtual.thewhig.com +virtualbartendertrack.beer.com +virtualgamenet.com +virtualnaya.com +virtueelsex.nl +virtuelleerotik.de +virus-notice.com +vis.optimizely.com +vis.sexlist.com +vis5.sexlist.com +visa-china.ru +visa-pasport.ru +visiblemeasures.com +vision-galaxy.com +vision-voyeur.com +vision.d1.sc.omtrdc.net +vision.taboola.com +vision2020.pl +visionwell.com.cn +visistat.com +visit.theglobeandmail.com +visit.webhosting.yahoo.com +visit24.info +visitbox.de +visitcambridge.org +visitinggirlfriends.com +visitors.lexus-europe.com +visitpath.com +vistabet-affiliate.host.bannerflow.com +vistapoint.net +vistas.popunder.ru +vistatech.us +vistawebs-top-shop-soft.site +vistawebs-web-techie-app.win +visual-pagerank.fr +visualization.maxpoint.com +visualrevenue.com +visualscience.external.bbc.co.uk +visualwebsiteoptimizer.com +viswatejaschool.in +vita.com.hr +vitacost.122.2o7.net +vitalads.net +vitalfirstaidtraining.com +vitalfootball.uk.intellitxt.com +vitalitymax.1.p2l.info +vitalityxray.com +vitals.tracking.mdxdata.com +vitaly.agricolacolhue.cl +vitamasaz.pl +vitanail.ru +vitaplan.rs +viteonlusarezzo.it +vitha.csheaven.com +vitrigroup.pl +vivabank.pl +vivad.advertising.com +vivad.at.atwola.com +vivafranco.com +vivaki.demdex.net +vivaweb.org +viven.host.sk +viverolunaverde.com.ar +vivi8.com +vividtv.net +vizag.kharkov.ua +vizitkarte.ws +vizury.com +vjcyehtqm9.me +vk-engineering.ru +vk-mus.ru +vk.18sexporn.ru +vk.wix.com +vk2ca.com +vkak.ru +vkcdnservice.appspot.com +vkcdnservice.com +vkgaleria.com +vkont.bos.ru +vkontahte.ru +vkontaktemusic.ru +vkontarkte.com +vksaver-all.ru +vktr073.net +vl8c4g7tmo.me +vladhistory.com +vladimir.xrus.org +vladimir.zrus.org +vladoblog.info +vlagalishe.info +vlibs.advertising.com +vlibs.eu-central-1.dev.adtech.de +vlibs.eu-central-1.prod.adtech.de +vlog.leadformix.com +vlogic.ak-networks.com +vltai.com +vm3.parabol.object.bg +vmay.com +vmcsatellite.com +vmix.adbureau.net +vml1.s3.amazonaws.com +vmmpxl.com +vmn.net +vmnmvzsmn.over-blog.com +vmwh.com +vn.grab-credit4u.com +vnedu.kovo.vn +vnmcc.com.vn +vnoz.org +vntanktransport.com +vntsm.com +vnu.eu-adcenter.net +vnumedia01.webtrekk.net +vnumedia02.webtrekk.net +vnumedia03.webtrekk.net +vnumedia04.webtrekk.net +vnunet.uk.intellitxt.com +vocal-mess.com +vocational-training.us +vocento.d3.sc.omtrdc.net +vod.com.ua +vod.topbucks.com +vod24.pl +vodafonegroup.122.2o7.net +vodafoneindia.tt.omtrdc.net +vodafoneit.solution.weborama.fr +vodafonenz.122.2o7.net +vodafoneuk.tt.omtrdc.net +vodaodessa.com +vodhd.pl +voditeltrezviy.ru +voewasdc.org +vogelservices.122.2o7.net +vogon.srv.media.net +voicefive.com +voicevegetable.com +vokate.lo.extole.io +vokate.qa.extole.io +voken.eyereturn.com +vokr-gtavc.ic.cz +volkswagen.122.2o7.net +voluumtracker.com +voluumtracker1.com +voluumtrk.com +voluumtrk2.com +voluumtrk3.com +volvo.celebrus.com +vom.sitescout.com +vomit.facilitandosonhos.com.br +vomitgirl.org +voodoofiles.us.intellitxt.com +voordeel.ad.nl +vorlon-qa.snackly.co +vortex-win.data.microsoft.com +vortex.mgr.consensu.org +vote.sparklit.com +voumxy.ru +vox-static.liverail.com +vox.urbanairship.com +voxel.read.admin.mpx.mopub.com +voxel.read.mongostats.mopub.com +voxel.write.admin.mpx.mopub.com +voxel.write.mongostats.mopub.com +voxhq.urbanairship.com +voyager1.telesat.com.co +vp.thirdpresence.com +vp.tscapeplay.com +vpaid.springserve.com +vpc-prod-adsdk-lb-0-564898962.us-east-1.elb.amazonaws.com +vpc.altitude-arena.com +vpmc.122.2o7.net +vpn-dc.rubiconproject.com +vpn-eng.rubiconproject.com +vpn-indy.exacttarget.com +vpn-iquest.exacttarget.com +vpn-it.rubiconproject.com +vpn-london.exacttarget.com +vpn-sydney.exacttarget.com +vpn-test.rubiconproject.com +vpn.airpr.com +vpn.aws.branch.io +vpn.brf.corp.mparticle.com +vpn.curalate.com +vpn.demandbase.com +vpn.dev.curalate.com +vpn.exacttarget.com +vpn.la.exponential.com +vpn.mediavine.com +vpn.monetize-me.com +vpn.nyc.corp.mparticle.com +vpn.office.imprev.net +vpn.pdx.corp.mparticle.com +vpn.rubiconproject.com +vpn.scl.exponential.com +vpn01.infra.prod.do-ams2.rxthdr.com +vpn1.bos1.yottaa.net +vpn2.branch.io +vpn2.corp.mparticle.com +vpnaffiliates.com +vpon.com +vpw-web-jenkins-001.ispot.tv +vpzccwpyilvoyg.ru +vq91811.com +vq918450.com +vra.outbrain.com +vrl.m.conviva.com +vroll.net +vrp.outbrain.com +vrs.cz +vs.admedo.com +vs.asianave.com +vs.blackplanet.com +vs.dmtracker.com +vs.forbes.com +vs.tucows.com +vsaq.intercom.io +vsassets.com +vseobuch.ru +vshs.com +vsii.spinbox.net +vsii.spindox.net +vslider.admedia.com +vsmw.be +vstats.digitaltrends.com +vt-1.nrelate.com +vt.5.p2l.info +vt.admedo.com +vtc.pw +vte.nexteramedia.com +vtsgaqnfvzcyu.ru +vtunnel.me +vtxxx.i3log.com +vtyo-rtb1.rfihub.net +vu.adschoom.com +vu.veoxa.com +vuble.tv +vucms.com +vuelosbaratosabelgica.com +vuhgj.adx1.com +vulcan.branch.io +vulfixxn.beget.tech +vungle-cdn.vungle.com +vungle.akadns.net +vungle.com +vural-electronic.com +vuryua.ru +vut.com.ru +vuuwd.com +vuvvi.com +vvps.ws +vw.netmng.com +vwpowhxrpdlmtq.bid +vwr1.hitbox.com +vwr2.hitbox.com +vwr3.hitbox.com +vwu.co +vx6.biz +vxelkrhl.info +vxiframe.biz +vxv.phre.net +vyc.co +vycaqah.newsit.es +vydoxtrial.com +vykup-avto-krasnodar.ru +vykupavto-krasnodar.ru +vyrus.redirectme.net +vzarabotke.ru +vzglyadriv.kg +vzhjnorkudcxbiy.com +vzlom-na-zakaz.com +vzzexalcirfgrf.ru +w-e-t.de +w-journal.ru +w-tres.info +w.admedia.com +w.admob.com +w.ads2.eqads.com +w.adx1.com +w.ahalogy.com +w.bigames.online +w.cnzz.com +w.crypto-webminer.com +w.e0mn.com +w.estat.com +w.extreme-dm.com +w.freecontent.com +w.ic.tynt.com +w.inmobi.com +w.intercom.io +w.l.qq.com +w.oix.net +w.p.mybuys.com +w.prize44.com +w.usabilla.com +w.visualdna.com +w.yieldmo.com +w.zeroredirect.com +w0.drag0n.org +w0.extreme-dm.com +w00tpublishers.wootmedia.net +w03.webmine.cz +w1-apple.com +w1.am15.net +w1.extreme-dm.com +w1.hitbox.com +w1.iyi.net +w1.luckyorange.com +w1.tcr112.tynt.com +w1.webcompteur.com +w10.am15.net +w10.centralmediaserver.com +w10.hitbox.com +w100.am15.net +w100.hitbox.com +w101.am15.net +w101.hitbox.com +w102.am15.net +w102.hitbox.com +w103.am15.net +w103.hitbox.com +w104.am15.net +w104.hitbox.com +w105.am15.net +w105.hitbox.com +w106.am15.net +w106.hitbox.com +w107.am15.net +w107.hitbox.com +w108.am15.net +w108.hitbox.com +w109.am15.net +w109.hitbox.com +w11.am15.net +w11.centralmediaserver.com +w11.hitbox.com +w110.am15.net +w110.hitbox.com +w111.am15.net +w111.hitbox.com +w112.am15.net +w112.hitbox.com +w113.am15.net +w113.hitbox.com +w114.am15.net +w114.hitbox.com +w115.am15.net +w115.hitbox.com +w116.am15.net +w116.hitbox.com +w117.am15.net +w117.hitbox.com +w118.am15.net +w118.hitbox.com +w119.am15.net +w119.hitbox.com +w12.am15.net +w12.hitbox.com +w120.hitbox.com +w121.hitbox.com +w122.hitbox.com +w123.hitbox.com +w124.hitbox.com +w126.hitbox.com +w128.hitbox.com +w129.hitbox.com +w13.am15.net +w13.coinhive.com +w13.hitbox.com +w130.hitbox.com +w131.hitbox.com +w132.hitbox.com +w133.hitbox.com +w135.hitbox.com +w136.hitbox.com +w137.hitbox.com +w138.hitbox.com +w139.hitbox.com +w14.am15.net +w14.hitbox.com +w140.hitbox.com +w141.hitbox.com +w144.hitbox.com +w147.hitbox.com +w15.am15.net +w15.hitbox.com +w153.hitbox.com +w154.hitbox.com +w155.hitbox.com +w157.hitbox.com +w159.hitbox.com +w16.am15.net +w16.hitbox.com +w161.hitbox.com +w162.hitbox.com +w167.hitbox.com +w168.hitbox.com +w17.am15.net +w17.hitbox.com +w170.hitbox.com +w175.hitbox.com +w177.hitbox.com +w179.hitbox.com +w18.am15.net +w18.hitbox.com +w19.am15.net +w19.hitbox.com +w2.am15.net +w2.extreme-dm.com +w2.hitbox.com +w2.marinsm.com +w2.yotpo.com +w20.am15.net +w20.hitbox.com +w21.am15.net +w21.hitbox.com +w22.am15.net +w22.hitbox.com +w23.am15.net +w23.hitbox.com +w24.am15.net +w24.hitbox.com +w25.am15.net +w25.hitbox.com +w26.am15.net +w26.hitbox.com +w27.am15.net +w27.hitbox.com +w28.am15.net +w28.hitbox.com +w29.am15.net +w29.hitbox.com +w2mobile.com +w3.am15.net +w3.cdn.anvato.net +w3.extreme-dm.com +w3.hitbox.com +w30.am15.net +w30.hitbox.com +w31.am15.net +w31.hitbox.com +w32.am15.net +w32.hitbox.com +w33.am15.net +w33.hitbox.com +w34.am15.net +w34.hitbox.com +w35.am15.net +w35.hitbox.com +w36.am15.net +w36.hitbox.com +w36.info +w37.am15.net +w38.am15.net +w39.am15.net +w3bdsm.info +w3data.co +w3facility.org +w3javascript.com +w4.am15.net +w4.extreme-dm.com +w4.hitbox.com +w40.am15.net +w41.am15.net +w42.am15.net +w43.am15.net +w44.am15.net +w45.am15.net +w46.am15.net +w47.am15.net +w48.am15.net +w49.am15.net +w4988.nb.host127-0-0-1.com +w5.am15.net +w5.extreme-dm.com +w5.hitbox.com +w50.am15.net +w51.am15.net +w52.am15.net +w53.am15.net +w54.am15.net +w55.am15.net +w55c.net +w56.am15.net +w57.am15.net +w58.am15.net +w59.am15.net +w6.am15.net +w6.extreme-dm.com +w6.hitbox.com +w60.am15.net +w61.am15.net +w612.nb.host127-0-0-1.com +w62.am15.net +w63.am15.net +w64.am15.net +w65.am15.net +w65.pl +w66.am15.net +w67.am15.net +w68.am15.net +w69.am15.net +w7.am15.net +w7.extreme-dm.com +w7.hitbox.com +w70.am15.net +w71.am15.net +w72.am15.net +w73.am15.net +w74.am15.net +w75.am15.net +w76.am15.net +w77.am15.net +w78.am15.net +w79.am15.net +w8.am15.net +w8.extreme-dm.com +w8.hitbox.com +w80.am15.net +w81.am15.net +w82.am15.net +w83.am15.net +w832297.open.ge.tt +w84.am15.net +w85.am15.net +w86.am15.net +w87.am15.net +w88.am15.net +w89.am15.net +w9.am15.net +w9.extreme-dm.com +w9.hitbox.com +w90.am15.net +w91.am15.net +w92.am15.net +w93.am15.net +w94.am15.net +w95.am15.net +w96.am15.net +w97.am15.net +w98.am15.net +w99.am15.net +wa.5.p2l.info +wa.and.co.uk +wa.eonline.com +wa.essent.nl +waalgreenslistens.com +waardex.rtb.adx1.com +wac.2ddcc.alphacdn.net +wackyweberprox.info +wackywebersprox.info +wad.adbasket.net +wadaab.se +wafmedia3.com +wahicbefa31.soup.io +wahoha.com +wahyufian.zoomshare.com +waimr.net +wait3sec.org +waiter.count.ly +waitfast.com +waki.tv +waldenfarms.com +walentynkowyprezent.pl +walgrns.112.2o7.net +walkingproject.org +walkme.com +walkthedinosaur.com +walla.yad2.co.il +walleoffhotel.com +wallet.brominer.com +wallpapers91.com +walmart.112.2o7.net +walmartcom.112.2o7.net +walp.atm.youku.com +walternse.com +wam-ads.sitescout.com +wangluoruanjian.com +wangmeng.baidu.com +wannawatch.com +wantmobi.bid +wap.casee.cn +wap.mobiltek.pl +waplock.com +wapsite.me +wapster.malutki.pl +wapster.pl +warco.pl +warcry.us.intellitxt.com +warda.oewabox.at +wareseeker.com +warezaccess.com +warezkeeper.com +warioland.com +warlog.info +warlog.ru +warnerbros-d.openx.net +warnerbros.112.2o7.net +warnerbrothersrecords.112.2o7.net +warning-message.com +warp.crystalad.com +warp2search.us.intellitxt.com +warszawski-serwis-laptopow.warszawa.pl +waryfog.com +washingtontimes.us.intellitxt.com +wasm.stream +wasm24.ru +watch-movies.ru +watch24.com +watchdogs-2.ru +watchinf.com +watchingthat.com +watchitallnow.com +watchmygf.net +watchoutdude.com +watchsmut.com +watchthewalkingdead.com +watchusgetoff.xyz +water-bed.8p.org.uk +water2000.com +waterfrontmedia.112.2o7.net +wateristian.com +watershed.bm23.com +wateryvan.com +watson.telemetry.microsoft.com +wau.tynt.com +waudeesestew.com +wavefoundationbd.org +waveresume.com +wavesecure.com +wavewave.com +way2match.nl +waycash.net +wayfinder.nl +wayong.info +waysbetter.cn +wb.interpolls.com +wba.wbinsights.com +wba.wirtschaftsblatt.at +wbads.vo.llnwd.net +wbextecd.112.2o7.net +wbinsights.com +wbmwss.beetv.net +wbnews.112.2o7.net +wbprocurement.112.2o7.net +wbrostheatricalother.112.2o7.net +wc-tracking.lavasoft.com +wc0x83ghk.homepage.t-online.de +wc3-soft.sbhmn-miner.com +wcastrprod.122.2o7.net +wckp.sbhmn-miner.com +wd-edge.sharethis.com +wd.adcolony.com +wdads.sx.atl.publicus.com +wdata.ero-advertising.com +wdcs.trendmicro.com +wdm29.com +wdmwebs.us +we-are-gamers.com +wearewolves-records.com +weather.msas.media.net +weatherbugbrowserbar.mywebsearch.com +weathet.com +web-analytics.engagio.com +web-betting.ru +web-ccfr.tsinghua.edu.cn +web-ci.urbanairship.com +web-clients.mynativeads.com +web-counter.5u.com +web-feed.net +web-hosting.hitslog.net +web-master.sbhmn-miner.com +web-olymp.ru +web-online.pl +web-proxy.biz +web-sdk.urbanairship.com +web-search.la +web-sensations.com +web-sex.org +web-staging.mediavine.com +web-stat.com +web-t.9gag.com +web.acumenpi.com +web.adblade.com +web.adknowledge.com +web.analytics.yahoo.com +web.cellfun.mobi +web.checkm8.com +web.clod.pw +web.consoliads.com +web.cvut.cz +web.dle-news.pw +web.easyresearch.se +web.flashx.co +web.franklyinc.com +web.hb.ad.cpe.dotomi.com +web.industrybrains.com +web.info.com +web.informer.com +web.livefyre.com +web.localytics.com +web.miamihouseparty.net +web.minr.pw +web.nyc.ads.juno.co +web.rocks.io +web.softonic-analytics.net +web.stati.bid +web.survey-poll.com +web.unltd.info +web.vindicosuite.com +web.vortex.data.microsoft.com +web.yuppipuppy.com +web1.affiliatelounge.com +web1.realtracker.com +web1b.netreflector.com +web2.alphonso.tv +web2.checkm8.com +web2.deja.com +web2.easyresearch.se +web2.realtracker.com +web3-reklam.rtb.adx1.com +web3.easyresearch.se +web3.realtracker.com +web3.rtb.adx1.com +web4.realtracker.com +web63.jumptap.com +web64.jumptap.com +web65.jumptap.com +webads.bizservers.com +webads.co.nz +webads.nl +webads.tradeholding.com +webadvance.club +webalan.ru +webalize.net +webanalytics.globalthoughtz.com +webanalyticsnossl.websense.com +webangel.ru +webapps-security-measure.com +webappsverified.com +webassembly.stream +webbee.co.kr +webbizwild.com +webboys.net +webbug.seatreport.com +webcam-girls.me +webcam-sex-chat.nl +webcam-sexy.org +webcam-whores.com +webcamdevochka.com +webcamgirls.es +webcamsex-live.de +webcamsex.nl +webcamslist.com +webcamsluts.info +webcamsluts.net +webcamss.eu +webcamstart.nl +webcamtv.net +webcash.nl +webcashmaker.com +webcast.rubiconproject.com +webchunker.streaming.adswizz.com +webclients.net +webcom-software.ws +webcompteur.com +webconf.america.exacttarget.com +webconf.exponential.com +webconf.foresee.com +webconf.thunderhead.com +webconnect.net +webcounter.be +webcounter.com +webcounter.cz +webcounter.goweb.de +webcounter.together.net +webdata.vidz.com +webdev.thunderhead.com +webdev.viewbix.com +webdisk.accessiblemetrics.com +webdisk.advertisingbox.com +webdisk.airvertiseme.com +webdisk.analyse.advertisingbox.com +webdisk.analyticson.com +webdisk.beacon.terratracker.com +webdisk.buypixelads.com +webdisk.chartboost.com +webdisk.clickconvertsell.com +webdisk.eazybiz.ng +webdisk.email.advertisingbox.com +webdisk.esttrk.com +webdisk.ezwebsitetraffic.com +webdisk.franklyinc.com +webdisk.intelsad.com +webdisk.marketing365.mk +webdisk.marketingmachine.co.za +webdisk.monerominer.rocks +webdisk.panadvert.com +webdisk.siliconorchard.com +webdisk.starkey.theappgrader.com +webdisk.terratracker.com +webdisk.topprotestsigns.com +webdisk.ttflb.com +webdisk.viewsignage.com +webdisk.yodelmobilecouk.yodelmobile.com +webdisk.yodelmobilelondon.yodelmobile.com +webdisk.yodelmobilemobi.yodelmobile.com +webdocs.tritondigital.com +webedia.mgr.consensu.org +webeffective.keynote.com +webfree.checkline.cc +webgains.com +webgazeta.pl +webgems.popunder.ru +webgirlpink.com +webgozar.com +webgroundadbg.hit.gemius.pl +webgroundbg.adocean.pl +webhit.aftenposten.no +webhit.afterposten.no +webhits.de +webhooks.franklyinc.com +webhooks.ngm.franklyinc.com +webhooks.smaato.net +webhooks2.franklyinc.com +webhooks3.franklyinc.com +webhosting-ads.home.pl +webhosting.hut1.ru +webhostingstar.us +webinar.airpr.com +webinar.intercom.io +webinars.intercom.io +webinars.urbanairship.com +webinfotech.net +webiq005.webiqonline.com +webix.me +webjam.com +webkurchatov.ru +weblink.settrade.com +weblo.com +webload101.hitbox.com +weblog.blogads.com +weblogger.visilabs.com +weblover.info +webmail.accessiblemetrics.com +webmail.advertisingbox.com +webmail.adviserplus.com +webmail.adx1.com +webmail.airvertiseme.com +webmail.analyse.advertisingbox.com +webmail.analyticson.com +webmail.beacon.terratracker.com +webmail.buypixelads.com +webmail.chartboost.com +webmail.clickconvertsell.com +webmail.coinpot.co +webmail.corp.returnpath.com +webmail.corp.returnpath.net +webmail.eazybiz.ng +webmail.eloqua.com +webmail.email.advertisingbox.com +webmail.esttrk.com +webmail.exacttarget.com +webmail.exponential.com +webmail.ezwebsitetraffic.com +webmail.foresee.com +webmail.franklyinc.com +webmail.intelsad.com +webmail.lijit.com +webmail.marketing365.mk +webmail.marketingmachine.co.za +webmail.marketo.com +webmail.monerominer.rocks +webmail.panadvert.com +webmail.ranhill.com +webmail.returnpath.com +webmail.returnpath.net +webmail.siemense.com +webmail.siliconorchard.com +webmail.silverpop.com +webmail.starkey.theappgrader.com +webmail.terratracker.com +webmail.tmathtag.com +webmail.topprotestsigns.com +webmail.ttflb.com +webmail.undertone.com +webmail.viewsignage.com +webmail.xml.adx1.com +webmail.yodelmobilecouk.yodelmobile.com +webmail.yodelmobilelondon.yodelmobile.com +webmail.yodelmobilemobi.yodelmobile.com +webmailserveurmailings01.000webhostapp.com +webmailserveurmailings08.000webhostapp.com +webmailvoice.000webhostapp.com +webmaster-partnerprogramme24.de +webmaster.privatamateure.com +webmaster.r00t.la +webmaster.topbucks.com +webmaster.utherverse.com +webmaster.worldsex.com +webmasterhome.cn +webmasterjr.com.br +webmasterkai.sitetracker.com +webmasterplan.com +webmasterplan.de +webmasters.h2porn.com +webmasters.nastydollars.com +webmasters.sextracker.com +webmasters.tubealliance.com +webmasters.videarn.com +webmdcom.tt.omtrdc.net +webmdglobal.122.2o7.net +webmetrodev.122.2o7.net +webmine.cz +webmine.pro +webminepool.com +webminepool.tk +webminer.minergate.com +webminer.pro +webminerpool.com +webmining.co +webmisstress.com +webmonitor.fyxm.net +webnavegador.com +webnavegador.com.br +webnetra.entelnet.bo +webnode.me +webnudist.net +weboffer.net +webofficesignature.myfreesites.net +weborama.fr +webordermanager.com +weborg.hut1.ru +weboval.info +weboxmedia.by +webpaypal.com +webpdp.gator.com +webpoll.sparklit.com +webpower.com +webpowerball.com +webprog.oewabox.at +webreseau.com +webroot.112.2o7.net +webroot.tt.omtrdc.net +webs.com +websalesusa.com +webscouter.net +webseoanalytics.com +webserv.mos.ru +webservice-aaa.exacttarget.com +webservice-aprimo.exacttarget.com +webservice-csg.exacttarget.com +webservice-sha2.boa.exacttarget.com +webservice-test.exacttarget.com +webservice.aprimo.test.exacttarget.com +webservice.boa.exacttarget.com +webservice.exacttarget.com +webservice.keepalive.aprimo.test.exacttarget.com +webservice.keepalive.exacttarget.com +webservice.poc.exacttarget.com +webservice.qa.exacttarget.com +webservice.s1.qa2.exacttarget.com +webservice.s2.qa2.exacttarget.com +webservice.s4.exacttarget.com +webservice.ta.exacttarget.com +webservice.test.exacttarget.com +webservices-rewardpath.com +webservices.sub2tech.com +websexmovies.com +webshoppermac.com +webshot.dynamicyield.com +webshotcdn-eu.dynamicyield.com +webshotcdn.dynamicyield.com +website-beta.adotmob.com +website.backtrace.io +websiteaccountant.de +websitebuilder.xyz +websitebuildersinfo.in +websitehome.co.uk +websiteunblocker.us +websitevaluebot.com +webskratch.com +websnettechieapp.win +websocket.minexmr.stream +websponsors.com +webstat.channel4.com +webstat.com +webstat.net +webstats.adspaces.ero-advertising.com +webstats.eco.de +webstats.motigo.com +webstats.oanda.com +webstats.plus.net +webstats.thaindian.com +webstats.thesoul-publishing.com +webstats.volvo.com +webstats.web.rcn.net +webstats1.com +webstats4u.com +websurvey.spa-mr.com +websystem24.nuggad.net +webtask.auth.mparticle.com +webtherapy.ru +webtracker.apicasystem.com +webtrackerplus.com +webtracky.com +webtraffic.se +webtraxx.de +webtrekk.mediaset.net +webtrekk.net +webtrends.besite.be +webtrends.randallpub.com +webtrends.telegraph.co.uk +webtrends.telenet.be +webtrends.thisis.co.uk +webtrends.townhall.com +webtrends1.britishgas.co.uk +webtrendsinc.https.internapcdn.net +webtrendslive.com +webuilt.com +webunblocker.info +webunblockproxy.info +weburok.com +webuser.uk.intellitxt.com +webuysupplystore.mooo.com +webview.unityads.unity3d.com +webviper.dyn.ml.org +webwereld.nl.intellitxt.com +webwidgetz.duckdns.org +webwire-services.fi +webwise.bt.com +webwise.com +webwise.net +webwise.org +webworxxx.com +webxhard.com +webxmr.com +wechatdownload10.com +weconfirmyou.com +wedding-salon.net +weddingdresses.xyz +weebvid.moe +weegels.com +weekendsex.dk +weekes.biz.tc +weevah2.top +weeze.it +wegetfucked.com +wegetpaid.net +wegotmedia.co +weibchen.org +weibsbilder.ch +weight-loss.1.p2l.info +weight-loss.3.p2l.info +weight-loss.4.p2l.info +weight-loss.hut1.ru +weightlossforall.us.intellitxt.com +weighttraining.co.kr +welcome.analyticson.com +welcome.faptitans.com +welcome.pussysaga.com +welington.info +wellbutrin.1.p2l.info +wellbutrin.3.p2l.info +wellbutrin.4.p2l.info +wellmadefrog.com +wellnessmonitor.bravehost.com +wellsfarg0-onllne.net +wellstar-company.com +weltonline01.webtrekk.net +wemine.pro +wenda.io +wenner.collect.igodigital.com +weon.pl +weownthetraffic.com +wera.popunder.ru +werbung.diepresse.com +werbung.meteoxpress.com +wes.df.telemetry.microsoft.com +west-s2s.1rx.io +west.05tz2e9.com +west.aod.extremereach.com +west.aspera.extremereach.com +west.aspera.extremereach.com.extremereach.com +west.cloud.ftp.extremereach.com +west.faspex.aspera.extremereach.com +west.faspex.aspera.extremereach.com.extremereach.com +west.ftp.dev.extremereach.com +west.ftp.extremereach.com +west.prtg.extremereach.com +west.sftp.extremereach.com +west.thecarseatcompany.com +west.webftp.dev.extremereach.com +west.webftp.extremereach.com +westbriton.uk.intellitxt.com +westermarkanjou.se +westerntaneyfire.com +westernunion.tt.omtrdc.net +westernunionglobal.112.2o7.net +westfield-p.shopcurbside.com +westfield-s.shopcurbside.com +westfield.shopcurbside.com +westfieldsports.nsw.edu.au +westjet.112.2o7.net +westum.se +westvilletowingservices.co.za +westwickfarrow.122.2o7.net +wet-pantie.com +wet-t.de +wetblog.lindachan.net +wetbox.net +wetbustybabes.com +wetcasino.com +wetforsex.com +wetgames.ru +wetjane.x10.mx +wetmessy.com +wetpaint-d.openx.net +wetpuss.nu +wetrack.it +wettastrono.de +wetter.wemfbox.ch +wetyt.tourstogo.us +wewillrocknow.com +wf.adserve.video +wf.basebanner.com +wf.taboola.com +wfoto.front.ru +wfpscripts.webspectator.com +wfussb.oewabox.at +wg-gesucht.de.intellitxt.com +wgc1.acecounter.com +wh.motorpresse-statistik.de +whabi.csheaven.com +whaleads.com +whatcounts_saas.s3.amazonaws.com +whathyx.com +whatishotnow.net +whatseek.com +whatthetech.us.intellitxt.com +whave.iptvdeals.com +whchsvlxch.site +when-pigs-fly.juicemobile.com +whentheyopened.com +whenu.com +whenupgrade.yourmainsourceforcontentprepared.win +whenvideoup.thebigandfreesystemupdate.website +whenvideoup.thebigandfreesystemupdating.date +whereismommy.gq +whipcrack.org +whirlwealth.com +whiskyqueue.com +whispa.com +whisperingcrib.com +white-slut.com +white.sexer.com +white.soju.openx.net +whitecastle.122.2o7.net +whitehorsetechnologies.net +whiteningbrites.com +whiteproduct.com +whiteworldtech.com +whm.siliconorchard.com +whoads.net +whoateallthepies.uk.intellitxt.com +whoisonline.net +whoisvisiting.com +wholesaleadultstore.com +wholesalecheapjerseysfree.com +wholesalejerseychinashop.com +wholesalejerseys-cheapest.com +wholesaletraffic.info +whore-nightclubs.biz +whos.amung.us +whosread.com +whysoserius.club +wi-fitechnology.uk.intellitxt.com +wi.5.p2l.info +widdit.com +wideo-pryszcz.blogspot.com +widespace.com +widestep.com +widget-dev.databoxer.mgr.consensu.org +widget-eforsa.pl +widget-staging.databoxer.mgr.consensu.org +widget.achetezfacile.com +widget.be.eu.criteo.com +widget.criteo.com +widget.crowdignite.com +widget.databoxer.mgr.consensu.org +widget.dynamic.advertising.com +widget.eu.criteo.com +widget.fr.eu.criteo.com +widget.intercom.io +widget.jp.as.criteo.com +widget.nativly.com +widget.nl.eu.criteo.com +widget.ny.us.criteo.com +widget.perfectmarket.com +widget.plugrush.com +widget.privy.com +widget.quantcast.com +widget.realo.be +widget.supercounters.com +widget.sv.us.criteo.com +widget3.linkwithin.com +widget5.linkwithin.com +widget6.linkwithin.com +widgetbucks.com +widgets.amung.us +widgets.getsitecontrol.com +widgets.kiosked.com +widgets.outbrain.com +widgets.tcimg.com +widgets.viewsignage.com +wielkanagroda.com +wielkaniespodzianka.pl +wienerz.oewabox.at +wiengvat.oewabox.at +wiesci24.pl +wifi.internal.adroll.com +wifiprotector.com +wigetmedia.com +wijzeman.sbhmn-miner.com +wiki.adspaces.ero-advertising.com +wiki.advidi.com +wiki.airpr.com +wiki.appboy.com +wiki.clearbit.com +wiki.ero-advertising.com +wiki.fiksu.com +wiki.fyber.com +wiki.internal.intercom.io +wiki.pinion.gg +wiki.rtb-demand.fyber.com +wiki.rtb-supply.fyber.com +wiki.sizmek.com +wiki.unrulymedia.com +wiki.vuble.tv +wiki.yottaa.com +wikia-ads.wikia.com +wikidevs.com +wikiforosh.ir +wilbur.prod.paperg.com +wildcard.adroll.com.edgekey.net +wildcard.hk.cn.criteo.com +wildcard.marketo.com.edgekey.net +wildcard.measuread.com.edgekey.net +wildcard.moatads.com.edgekey.net +wildcard.yottaa.net +wildianing.ru +wildtunnel.eu +wildworld.site +wileydumcom.112.2o7.net +wileypublishing.112.2o7.net +wilkzwallstreet.blogspot.com +willa-marina.pl +willacrit.com +willbi.com +willdrey.com +willhab.oewabox.at +williamhill.es +williamhill.tt.omtrdc.net +willysy.com +wilworld.monlineserviceplc.com +win-spy.com +winadiscount.com +winaproduct.com +winblackjack.net +wincert.us.intellitxt.com +wincleaner.com +wind.mobi +windestimator.com +windoscashback.com +window.nixnet.cz +window1.com +windowman.co.kr +windows-tech-help.com +windows7news.uk.intellitxt.com +windowsbbs.us.intellitxt.com +windowserror7.tech +windowsitpro.us.intellitxt.com +windowssearch-exp.com +windowzlive.com +windshop.com +windspotter.net +winecom.112.2o7.net +wineeniphone6.com-gen.online +wineenthusiastcom.112.2o7.net +wineitudes.wordpress.com +wineration.com +winerd.com +winexch1dca.foresee.com +winfuture.de.intellitxt.com +wingenieria.com +wingsoffury2.com +wingsofrefuge.net +winlock.usa.cc +winmatrix.us.intellitxt.com +winmpmain.112.2o7.net +winnerclub.net +winprizesapp.com +winrar-rarlab.tk +winrar-soft.ru +winscholarship.com +winsetupcostotome.easthamvacations.info +winstudio.co.uk +winsupportit.club +winterclassichockeyjerseys.com +winterrowd.us.intellitxt.com +wintricksbanner.googlepages.com +winx-play.ru +winziptv.com +wiptube.info +wirecomic.com +wiredpussy.cc +wiregirl.us.intellitxt.com +wireless.ign.us.intellitxt.com +wirelessforumsorg.skimlinks.com +wirtualna-polska.site +wirtuozseksu.pl +wirtvlg.oewabox.at +wisconsincriminallaw.com +wisconsinexotics.com +wise-music.com +wisepops.com +wishesblog.com +wissende.122.2o7.net +witch-counter.de +witherrom55.eklablog.fr +withleather.us.intellitxt.com +withrows.com +withstandingheartwarming.com +witkom.sbhmn-miner.com +witthethim.com +wittyoffers.club +wivesneedsex.com +wiwicafe.de +wixed.wix.com +wixpix.de +wixx.caliptopis.cl +wizjatv-kody.pl +wkkjfcgjofbix.ru +wkmg.co.kr +wkqmeskbz.bid +wks.ero-advertising.com +wl.aniview.com +wl.sk +wladimirpayen.com +wlaptoplogic.122.2o7.net +wld.aniview.com +wlgoodfellows.com +wlmarketing.com +wlplay.aniview.com +wlplayer.aniview.com +wlvast.aniview.com +wm-goldenclick.ru +wm.baidu.com +wm.banners.sextracker.com +wm.maxysearch.info +wm.mtree.com +wm.wiredminds.de +wm.yololike.space +wm5fixsite.us.intellitxt.com +wma-x.com +wmadv.com +wmapp.wiredminds.de +wmedia.adk2x.com +wmedia.rotator.hadj7.adjuggler.net +wmemsnhgldd.ru +wmforum.org +wmfsettlement.com +wmg.112.2o7.net +wmgmulti.112.2o7.net +wmgv.com +wmmax.com +wms-cn.amazon-adsystem.com +wms-eu.amazon-adsystem.com +wms-fe.amazon-adsystem.com +wms-in.amazon-adsystem.com +wms-na.amazon-adsystem.com +wms-tools.com +wmserver.net +wmtech.website +wmwmwwfmkvucbln.ru +wniosek-24h.pl +wniosek-online.co.pl +wnmyerzbjhu.ru +wnoz.de +wnt-40.seeweb.it +wo15.coinhive.com +woche.oewabox.at +woha.nu +wohnheim-weinstadel.de +wohnmobile.gebraucht.sms13.de +wohnnet.oewabox.at +womama.ru +woman-orgasm.ru +woman-tampon.ru +womanear.com +womanrare.com +womanshealthmag.com +womendoingwomen.com +womensforum.us.intellitxt.com +womenshealth.de.intellitxt.com +womenslabour.org +womo.corrmedic.ru +womsy.bobbutcher.net +wonchangvacuum.com.my +wonderlandads.com +wondoads.de +woobi-eu.casalemedia.com +woodpecker.uc.cn +woody.intercom.io +woopra.com +wooptrk.com +woork.sbhmn-miner.com +wootric-demo.wootric.com +wootric.com +wopper.bioblitzgaming.ca +wordc.ga +worden.samenresultaat.nl +wordplaywhiz.com +wordpresscom.skimlinks.com +wordseach.com +work-offer.com +workday.exponential.com +workdaylab.exponential.com +worker.minero.cc +worker.salon.com +worker0.minero.cc +worker1.minero.cc +worker10.minero.cc +worker2.minero.cc +worker3.minero.cc +worker4.minero.cc +worker5.minero.cc +worker6.minero.cc +worker7.minero.cc +worker8.minero.cc +worker9.minero.cc +workflows.dashboard.sandbox53.localytics.com +workflows.sandbox53.localytics.com +workle.website +workload1.k8s.tst.returnpath.net +workopolis.122.2o7.net +workshops.taboola.com +world-of-money.eu +world-trade-center.hawaiicity.com +world.popadscdn.net +worldclassautoroc.com +worldfurniture.co.uk +worldgymperu.com +worldhistory.biz +worldinfoclub.com +worldinternetauthority.com +worldis.me +worldlovers.ru +worldmusicfests.com +worldnetdaily.us.intellitxt.com +worldnowboston.112.2o7.net +worldofcharmaine.com +worldoffiles.ru +worldoftankscheats.com +worldpixel.de +worldproxy.info +worldsed.com +worldsex.ru +worldssafest.com +worldstarhiphop-d.openx.net +worldtravelguide.uk.intellitxt.com +worldtrendingvideos.info +worldwide-cash.net +worldwidelogisticsgh.com +worldwideporno.com +wormgush.com +worriednumber.com +worry-free-savings.com +worrybutter.com +worthlessporn.com +wosik-dach.service-for-web.de +wow.ero-advertising.com +wow.games.info.com +wowanalytics.co.uk +wowas31.ucoz.ru +woweb.com.ua +wowinterface.us.intellitxt.com +wowweb.net +woxy.co +wp-club.net +wp-content.infamylists.com +wp-monero-miner.de +wp-stat.s3.amazonasw.com +wp-stats.com +wp.hit.gemius.pl +wp1.cor-natty.com +wp20171103.truconversion.com +wp9.ru +wpad.corp +wpad.example +wpad.home +wpad.lan +wpad.local +wpad.mail +wpad.test +wpadx.com +wpcdn1.herokuapp.com +wpisz-to.pl +wpizde.ru +wpk.edu.hk +wpm.mgr.consensu.org +wpm.neustar.biz +wpni.112.2o7.net +wpni.tt.omtrdc.net +wpnipostcomjobs.112.2o7.net +wpnrtnmrewunrtok.xyz +wppluginspro.com +wprp.zemanta.com +wpt.insnw.net +wpt.speedcurve.com +wpt1.speedcurve.com +wptx.insnw.net +wpxn.com +wqepoqpwo.bid +wqgkainysj.ru +wqh999.com +wrap.tradedoubler.com +wrapper.askmen.com +wrapper.fileplanet.com +wrapper.giga.de +wrek.nl +wrestling-edge.us.intellitxt.com +wrigley.122.2o7.net +writingassociates.com +wroclawski.com.pl +wrona.it +wronpeci.com +wrxgandsfcz.ru +wryfinger.com +ws-164-87.clok.creative.com +ws-api.adtech.de +ws-api.adtechus.com +ws-ca-01.rocks.io +ws-cn.amazon-adsystem.com +ws-de-01.rocks.io +ws-de-02.rocks.io +ws-de-03.rocks.io +ws-de-04.rocks.io +ws-de-05.rocks.io +ws-ea.amazon-adsystem.com +ws-eu.amazon-adsystem.com +ws-fe.amazon-adsystem.com +ws-fr-01.rocks.io +ws-fr-02.rocks.io +ws-fr-03.rocks.io +ws-in.amazon-adsystem.com +ws-na.amazon-adsystem.com +ws-na.assoc-amazon.com +ws-skreemr.origin.inverse.com +ws-thehartford.exacttarget.com +ws.addthis.com +ws.adtech.de +ws.ampower.me +ws.api.drift.com +ws.bhzejltg.info +ws.exacttarget.com +ws.freebitco.in +ws.l33tsite.info +ws.ppe.exacttarget.com +ws.preview.exacttarget.com +ws.pzoifaum.info +ws.qa.exacttarget.com +ws.s1.qa2.exacttarget.com +ws.s2.qa2.exacttarget.com +ws.s4.exacttarget.com +ws.sharethis.com +ws.tapjoyads.com +ws.test.exacttarget.com +ws.tidafors.xyz +ws.us-ec.adtechus.com +ws.webcaster.pro +ws.xjb.ac.cn +ws.xmrm.pw +ws.xmrpool.net +ws.yellowpages.ca +ws000.coinhive.com +ws001.authedmine.com +ws001.coin-hive.com +ws001.coinerra.com +ws001.coinhive.com +ws001.hemnes.win +ws001.ws.tidafors.xyz +ws001.www.datasecu.download +ws001.www.jqwww.download +ws002-proxy-ajcryptominer.ajplugins.com +ws002.authedmine.com +ws002.coin-hive.com +ws002.coinhive.com +ws002.hemnes.win +ws002.ws.tidafors.xyz +ws002.www.datasecu.download +ws002.www.jqwww.download +ws003-proxy-ajcryptominer.ajplugins.com +ws003.authedmine.com +ws003.coin-hive.com +ws003.coinhive.com +ws003.hemnes.win +ws003.ws.tidafors.xyz +ws003.www.datasecu.download +ws003.www.jqwww.download +ws004-proxy-ajcryptominer.ajplugins.com +ws004.authedmine.com +ws004.coin-hive.com +ws004.coinhive.com +ws004.hemnes.win +ws004.ws.tidafors.xyz +ws004.www.datasecu.download +ws004.www.jqwww.download +ws005-proxy-ajcryptominer.ajplugins.com +ws005.authedmine.com +ws005.coin-hive.com +ws005.coinhive.com +ws005.hemnes.win +ws005.ws.tidafors.xyz +ws005.www.datasecu.download +ws005.www.jqwww.download +ws006-proxy-ajcryptominer.ajplugins.com +ws006.authedmine.com +ws006.coin-hive.com +ws006.coinhive.com +ws006.hemnes.win +ws006.ws.tidafors.xyz +ws006.www.datasecu.download +ws006.www.jqwww.download +ws007-proxy-ajcryptominer.ajplugins.com +ws007.authedmine.com +ws007.coin-hive.com +ws007.coinhive.com +ws007.hemnes.win +ws007.ws.tidafors.xyz +ws007.www.datasecu.download +ws007.www.jqwww.download +ws008.authedmine.com +ws008.coin-hive.com +ws008.coinhive.com +ws008.hemnes.win +ws008.ws.tidafors.xyz +ws008.www.datasecu.download +ws008.www.jqwww.download +ws009.authedmine.com +ws009.coin-hive.com +ws009.coinhive.com +ws009.hemnes.win +ws009.ws.tidafors.xyz +ws009.www.datasecu.download +ws009.www.jqwww.download +ws01.coinlab.biz +ws01.coinnebula.com +ws01.crypto-loot.com +ws01.do.nu +ws01.ppoi.org +ws010.authedmine.com +ws010.coin-hive.com +ws010.coinhive.com +ws010.hemnes.win +ws010.ws.tidafors.xyz +ws010.www.datasecu.download +ws010.www.jqwww.download +ws011.authedmine.com +ws011.coin-hive.com +ws011.coinhive.com +ws011.hemnes.win +ws011.ws.tidafors.xyz +ws011.www.datasecu.download +ws011.www.jqwww.download +ws012.authedmine.com +ws012.coin-hive.com +ws012.coinhive.com +ws012.hemnes.win +ws012.ws.tidafors.xyz +ws012.www.datasecu.download +ws012.www.jqwww.download +ws013-proxy-ajcryptominer.ajplugins.com +ws013.authedmine.com +ws013.coin-hive.com +ws013.coinhive.com +ws013.hemnes.win +ws013.ws.tidafors.xyz +ws013.www.datasecu.download +ws013.www.jqwww.download +ws014-proxy-ajcryptominer.ajplugins.com +ws014.authedmine.com +ws014.coin-hive.com +ws014.coinhive.com +ws014.hemnes.win +ws014.ws.tidafors.xyz +ws014.www.datasecu.download +ws014.www.jqwww.download +ws015.authedmine.com +ws015.coin-hive.com +ws015.coinhive.com +ws015.hemnes.win +ws015.ws.tidafors.xyz +ws015.www.datasecu.download +ws015.www.jqwww.download +ws016.authedmine.com +ws016.coin-hive.com +ws016.coinhive.com +ws016.hemnes.win +ws016.ws.tidafors.xyz +ws016.www.datasecu.download +ws016.www.jqwww.download +ws017-proxy-ajcryptominer.ajplugins.com +ws017.authedmine.com +ws017.coin-hive.com +ws017.coinhive.com +ws017.hemnes.win +ws017.ws.tidafors.xyz +ws017.www.datasecu.download +ws017.www.jqwww.download +ws018-proxy-ajcryptominer.ajplugins.com +ws018.authedmine.com +ws018.coin-hive.com +ws018.coinhive.com +ws018.hemnes.win +ws018.ws.tidafors.xyz +ws018.www.datasecu.download +ws018.www.jqwww.download +ws019.authedmine.com +ws019.coin-hive.com +ws019.coinhive.com +ws019.hemnes.win +ws019.ws.tidafors.xyz +ws019.www.datasecu.download +ws019.www.jqwww.download +ws01cn.streamplay.to +ws02.1q2w3.me +ws02.1q2w3.website +ws02.coinnebula.com +ws02.crypto-loot.com +ws02.do.nu +ws02.ppoi.org +ws020-proxy-ajcryptominer.ajplugins.com +ws020.authedmine.com +ws020.coin-hive.com +ws020.coinhive.com +ws020.hemnes.win +ws020.ws.tidafors.xyz +ws020.www.datasecu.download +ws020.www.jqwww.download +ws021.authedmine.com +ws021.coin-hive.com +ws021.coinhive.com +ws021.hemnes.win +ws021.ws.tidafors.xyz +ws021.www.datasecu.download +ws021.www.jqwww.download +ws022-proxy-ajcryptominer.ajplugins.com +ws022.authedmine.com +ws022.coin-hive.com +ws022.coinhive.com +ws022.hemnes.win +ws022.ws.tidafors.xyz +ws022.www.datasecu.download +ws022.www.jqwww.download +ws023-proxy-ajcryptominer.ajplugins.com +ws023.authedmine.com +ws023.coin-hive.com +ws023.coinhive.com +ws023.hemnes.win +ws023.ws.tidafors.xyz +ws023.www.datasecu.download +ws023.www.jqwww.download +ws024-proxy-ajcryptominer.ajplugins.com +ws024.authedmine.com +ws024.coin-hive.com +ws024.coinhive.com +ws024.hemnes.win +ws024.ws.tidafors.xyz +ws024.www.datasecu.download +ws024.www.jqwww.download +ws025-proxy-ajcryptominer.ajplugins.com +ws025.authedmine.com +ws025.coin-hive.com +ws025.coinhive.com +ws025.hemnes.win +ws025.ws.tidafors.xyz +ws025.www.datasecu.download +ws025.www.jqwww.download +ws026-proxy-ajcryptominer.ajplugins.com +ws026.authedmine.com +ws026.coin-hive.com +ws026.coinhive.com +ws026.hemnes.win +ws026.ws.tidafors.xyz +ws026.www.datasecu.download +ws026.www.jqwww.download +ws027-proxy-ajcryptominer.ajplugins.com +ws027.authedmine.com +ws027.coin-hive.com +ws027.coinhive.com +ws027.hemnes.win +ws027.ws.tidafors.xyz +ws027.www.datasecu.download +ws027.www.jqwww.download +ws028-proxy-ajcryptominer.ajplugins.com +ws028.authedmine.com +ws028.coin-hive.com +ws028.coinhive.com +ws028.hemnes.win +ws028.ws.tidafors.xyz +ws028.www.datasecu.download +ws028.www.jqwww.download +ws029-proxy-ajcryptominer.ajplugins.com +ws029.authedmine.com +ws029.coin-hive.com +ws029.coinhive.com +ws029.hemnes.win +ws029.ws.tidafors.xyz +ws02cn.streamplay.to +ws03.1q2w3.me +ws03.1q2w3.website +ws03.coinnebula.com +ws03.crypto-loot.com +ws03.do.nu +ws03.home.sapo.pt +ws030.authedmine.com +ws030.coin-hive.com +ws030.coinhive.com +ws030.hemnes.win +ws030.ws.tidafors.xyz +ws031-proxy-ajcryptominer.ajplugins.com +ws031.authedmine.com +ws031.coin-hive.com +ws031.coinhive.com +ws031.hemnes.win +ws031.ws.tidafors.xyz +ws032-proxy-ajcryptominer.ajplugins.com +ws032.authedmine.com +ws032.coin-hive.com +ws032.coinhive.com +ws032.hemnes.win +ws032.ws.tidafors.xyz +ws035.coinhive.com +ws03cn.streamplay.to +ws04.crypto-loot.com +ws04.do.nu +ws04.home.sapo.pt +ws05.crypto-loot.com +ws05.crypto.csgocpu.com +ws05.home.sapo.pt +ws06.crypto-loot.com +ws06.crypto.csgocpu.com +ws06.home.sapo.pt +ws07.crypto-loot.com +ws07.crypto.csgocpu.com +ws08.crypto-loot.com +ws08.crypto.csgocpu.com +ws09.coinhive.com +ws09.crypto-loot.com +ws09.crypto.csgocpu.com +ws1.1beb2a44.space +ws1.300ca0d0.space +ws1.320ca3f6.space +ws1.330ca589.space +ws1.340ca71c.space +ws1.360caa42.space +ws1.370cabd5.space +ws1.3c0cb3b4.space +ws1.3d0cb547.space +ws1.bmcm.ml +ws1.bmcm.pw +ws1.bmnr.pw +ws1.bmst.pw +ws1.coin-have.com +ws1.g-content.bid +ws1.minr.pw +ws1.stati.bid +ws1.static-cnt.bid +ws1.statistic.date +ws1.tapjoyads.com +ws10.coin-have.com +ws10.crypto-loot.com +ws11.crypto-loot.com +ws12.crypto-loot.com +ws12.tapjoyads.com +ws13.crypto-loot.com +ws14.crypto-loot.com +ws15.crypto-loot.com +ws16.crypto-loot.com +ws17.crypto-loot.com +ws18.crypto-loot.com +ws19.crypto-loot.com +ws2.1beb2a44.space +ws2.300ca0d0.space +ws2.310ca263.space +ws2.320ca3f6.space +ws2.330ca589.space +ws2.340ca71c.space +ws2.360caa42.space +ws2.370cabd5.space +ws2.3c0cb3b4.space +ws2.3d0cb547.space +ws2.adtech.de +ws2.bmcm.ml +ws2.bmcm.pw +ws2.bmnr.pw +ws2.bmst.pw +ws2.coin-have.com +ws2.g-content.bid +ws2.minr.pw +ws2.stati.bid +ws2.statistic.date +ws2.tapjoyads.com +ws2.us-ec.adtechus.com +ws20.crypto-loot.com +ws21.crypto-loot.com +ws22.crypto-loot.com +ws23.crypto-loot.com +ws23.crypto.csgocpu.com +ws24.crypto-loot.com +ws24.crypto.csgocpu.com +ws25.crypto-loot.com +ws25.crypto.csgocpu.com +ws26.crypto-loot.com +ws27.crypto-loot.com +ws29.crypto-loot.com +ws3.1beb2a44.space +ws3.300ca0d0.space +ws3.310ca263.space +ws3.320ca3f6.space +ws3.330ca589.space +ws3.340ca71c.space +ws3.360caa42.space +ws3.370cabd5.space +ws3.3c0cb3b4.space +ws3.3d0cb547.space +ws3.bmnr.pw +ws3.coin-have.com +ws3.g-content.bid +ws3.minr.pw +ws3.statistic.date +ws3.tapjoyads.com +ws30.crypto-loot.com +ws31.crypto-loot.com +ws32.crypto-loot.com +ws33.crypto-loot.com +ws33.tapjoyads.com +ws34.crypto-loot.com +ws35.crypto-loot.com +ws36.crypto-loot.com +ws37.crypto-loot.com +ws38.crypto-loot.com +ws39.crypto-loot.com +ws4.1beb2a44.space +ws4.300ca0d0.space +ws4.310ca263.space +ws4.320ca3f6.space +ws4.330ca589.space +ws4.340ca71c.space +ws4.360caa42.space +ws4.370cabd5.space +ws4.3c0cb3b4.space +ws4.3d0cb547.space +ws4.bmnr.pw +ws4.coin-have.com +ws4.tapjoyads.com +ws40.crypto-loot.com +ws41.crypto-loot.com +ws42.crypto-loot.com +ws42.crypto.csgocpu.com +ws43.crypto-loot.com +ws44.crypto-loot.com +ws45.crypto-loot.com +ws46.crypto-loot.com +ws47.crypto-loot.com +ws48.crypto-loot.com +ws48.crypto.csgocpu.com +ws49.crypto-loot.com +ws49.crypto.csgocpu.com +ws5.1beb2a44.space +ws5.300ca0d0.space +ws5.310ca263.space +ws5.320ca3f6.space +ws5.330ca589.space +ws5.340ca71c.space +ws5.360caa42.space +ws5.370cabd5.space +ws5.3c0cb3b4.space +ws5.3d0cb547.space +ws5.bmnr.pw +ws5.coin-have.com +ws50.crypto-loot.com +ws50.crypto.csgocpu.com +ws6.1beb2a44.space +ws6.310ca263.space +ws6.320ca3f6.space +ws6.330ca589.space +ws6.360caa42.space +ws6.370cabd5.space +ws6.3c0cb3b4.space +ws6.3d0cb547.space +ws6.coin-have.com +ws7.1beb2a44.space +ws7.300ca0d0.space +ws7.310ca263.space +ws7.320ca3f6.space +ws7.330ca589.space +ws7.340ca71c.space +ws7.360caa42.space +ws7.370cabd5.space +ws7.3c0cb3b4.space +ws7.coin-have.com +ws8.1beb2a44.space +ws8.300ca0d0.space +ws8.310ca263.space +ws8.320ca3f6.space +ws8.330ca589.space +ws8.340ca71c.space +ws8.360caa42.space +ws8.370cabd5.space +ws8.3c0cb3b4.space +ws8.3d0cb547.space +ws8.coin-have.com +ws9.1beb2a44.space +ws9.300ca0d0.space +ws9.310ca263.space +ws9.320ca3f6.space +ws9.330ca589.space +ws9.340ca71c.space +ws9.360caa42.space +ws9.3c0cb3b4.space +ws9.3d0cb547.space +ws9.coin-have.com +wsback-get-config.presage.io +wsc1.webspectator.com +wsdk-files.webengage.com +wsgames.ru +wsnew.freebitco.in +wsp.adskeeper.co.uk +wsp.marketgid.com +wsp.mgid.com +wss-1.monerise.com +wss-2.monerise.com +wss-gw-1.hitbox.com +wss-gw-3.hitbox.com +wss.hbpl.co.uk +wss.nablabee.com +wss.rand.com.ru +wss.stati.bid +wstroika.ru +wsw.ero-advertising.com +wt-eu02.net +wt.o.nytimes.com +wt.sexsearch.com +wt.sexsearchcom.com +wt10.haote.com +wta.ero-advertising.com +wtaar.com +wtlive.com +wtm.monitoringservice.co +wtmr.adx1.com +wtmtrack.com +wtnj.worldnow.com +wtp101.com +wtrs.101com.com +wtsdc.worldnow.com +wtsindia.in +wttavern.com +wtvertnet.com +wty46.com +wu.adonweb.ru +wubb.net +wuhuyuhua.com +wunderground.com.ssl.d1.sc.omtrdc.net +wunsch-porno.de +wuvac.agwebdigital.com +wv-law.com +wv.5.p2l.info +wv.inner-active.mobi +wvwr1.hitbox.com +ww-eu.steelhousemedia.com +ww.adx1.com +ww1.hitbox.com +ww1.tongji123.com +ww1003.smartadserver.com +ww1097.smartadserver.com +ww1270.smartadserver.com +ww129.smartadserver.com +ww13.smartadserver.com +ww135.smartadserver.com +ww14.smartadserver.com +ww147.smartadserver.com +ww150.smartadserver.com +ww1510.smartadserver.com +ww2.ero-advertising.com +ww2.flashx.co +ww2.hitbox.com +ww2.tongji123.com +ww2026.smartadserver.com +ww206.smartadserver.com +ww234.smartadserver.com +ww2468.smartadserver.com +ww251.smartadserver.com +ww264.smartadserver.com +ww3.hitbox.com +ww3.tongji123.com +ww302.smartadserver.com +ww362.smartadserver.com +ww370.smartadserver.com +ww38.smartadserver.com +ww381.smartadserver.com +ww392.smartadserver.com +ww4.tongji123.com +ww400.smartadserver.com +ww55.smartadserver.com +ww57.smartadserver.com +ww62.hsn.com +ww62.smartadserver.com +ww651.smartadserver.com +ww690.smartadserver.com +ww691.smartadserver.com +ww797.smartadserver.com +ww8.adminer.com +ww84.smartadserver.com +ww881.smartadserver.com +ww9.ntellicast.com +ww965.smartadserver.com +wwa.ero-advertising.com +wwa.hitbox.com +wwaol.com +wwatchcomusa.112.2o7.net +wwb.hitbox.com +wwbanners2.ero-advertising.com +wwbtads.com +wwc.hitbox.com +wwd.hitbox.com +wweconsumer.112.2o7.net +wwecorp2.112.2o7.net +wwfsable.com +wws.ero-advertising.com +wwtdd.tags.crwdcntrl.net +wwtdd.us.intellitxt.com +wwv.onetad.com +www-4.pingdom.net +www-banner.chat.ru +www-dev.yottaa.com +www-google-analytics.l.google.com +www-google.nl +www-le.instartlogic.com +www-marketing.yottaa.com +www-old.nastydollars.com +www-origin.appdynamics.com +www-stage.agkn.com +www-stage.demandbase.com +www-staging-origin.dynamicyield.com +www-staging.dynamicyield.com +www-staging.instartlogic.com +www-staging.wootric.com +www-tb7c.pr0gramm.com +www-test.metaps.com +www.00fun.com +www.0stats.com +www.0uk.net +www.1-1ads.com +www.1.tl813.com +www.1001movies.com +www.101malls.com +www.105vibe.com +www.1173.xml.adx1.com +www.11hour.com +www.11zz.com +www.123banners.com +www.123count.com +www.123counter.superstats.com +www.123go.com +www.123specialgifts.com +www.123stat.com +www.1800banners.com +www.18access.com +www.1adult.com +www.1c.adx1.com +www.1freecounter.com +www.1girl1pitcher.org +www.1guy1cock.com +www.1man1jar.org +www.1man2needles.com +www.1priest1nun.com +www.1priest1nun.net +www.1q2w3.fun +www.1q2w3.me +www.1q2w3.top +www.1q2w3.website +www.1quickclickrx.com +www.1tracksource.online +www.2-art-coliseum.com +www.2.livejasmin.com +www.2001-007.com +www.2015rewardopportunities.com +www.247realmedia.com +www.2607.cn +www.2giga.download +www.2giga.link +www.2girls1cup-free.com +www.2girls1cup.cc +www.2girls1cup.nl +www.2girls1cup.ws +www.2girls1finger.org +www.2guys1stump.org +www.302br.net +www.31d.net +www.321cba.com +www.33across.com +www.33z6hhbo5tjmx6hdb1cn.adx1.com +www.360ads.com +www.39dvd-999.com +www.3animalsex.com +www.3bsoftware.com +www.3difx.com +www.3dstats.com +www.3guys1hammer.ws +www.3peaks.co.jp +www.3qqq.net +www.3tsdaq8viz.us +www.3turtles.com +www.4.tl813.com +www.404errorpage.com +www.4girlsfingerpaint.org +www.5000-cotydzien.com +www.50bots.nullrefexcep.com +www.5g.adx1.com +www.5rnl.adx1.com +www.5rocks.io +www.5thavenue.com +www.64uq73u7ug.webcam +www.7218.pl +www.72933.pl +www.7500.com +www.777tool.com +www.77tracking.com +www.79.adx1.com +www.7bpeople.com +www.7cnbcnews.com +www.7metasearch.com +www.7minuteworkout.com +www.7search.com +www.8000plus.si +www.805m.com +www.81yvz.adx1.com +www.888.com +www.888casino.com +www.888poker.com +www.8fga7.adx1.com +www.961.com +www.999ways.blogspot.co.uk +www.99stats.com +www.9a5l5.adx1.com +www.9malls.co.uk +www.a.ero-advertising.com +www.a.jsrdn.com +www.a.proxy4.nullrefexcep.com +www.a.proxy5.nullrefexcep.com +www.a.thirdpresence.com +www.a.websponsors.com +www.a1a.pl +www.a1fax.com +www.a2uu36g43l.download +www.aa1test.pixel.marketing +www.ab4hr.com +www.aba.ae +www.abcjmp.com +www.abetterinternet.com +www.ablen01.tk +www.ablen02.tk +www.ablen03.tk +www.ablen04.tk +www.ablen05.tk +www.ablen06.tk +www.ablen07.tk +www.ablen08.tk +www.ablen09.tk +www.ablen10.tk +www.ablen11.tk +www.ablen12.tk +www.abm-certification.demandbase.com +www.abp.mxptint.net +www.abrogatesdv.info +www.academy.appboy.com +www.academy.dynamicyield.com +www.acbp0020171456.page.tl +www.acceleration.mparticle.com +www.access.adx1.com +www.access.eloqua.com +www.accessiblemetrics.com +www.accessrequest.taboola.com +www.accidentadvicehelpline.co.uk +www.accounts.appboy.com +www.acezsoftware.com +www.acmexxx.com +www.acquisizionevideo.com +www.actiagroup.com +www.action.ientry.net +www.actiondesk.com +www.activeindexer.com +www.ad-groups.com +www.ad-miner.com +www.ad-net.co.uk +www.ad-skills.nl +www.ad-souk.com +www.ad-up.com +www.ad-words.ru +www.ad-z.de +www.ad.adbull.com +www.ad.admitad.com +www.ad.mediabong.net +www.ad.netseer.com +www.ad.tgdaily.com +www.ad.tomshardware.com +www.ad.twitchguru.com +www.ad4mat.at +www.ad4mat.ch +www.ad4mat.de +www.ad6media.fr +www.adadvisor.net +www.adalyser.com +www.adamsfilms.com +www.adapi.sizmek.com +www.adapi.uat.sizmek.com +www.adasiaholdings.com +www.adbanner.gr +www.adbiq.com +www.adblockanalytics.com +www.adbonus.com +www.adbooth.com +www.adbrite.com +www.adbtc.top +www.adbuka.com +www.adbull.com +www.adc3-assets-enc-cdn.adcolony.com +www.adc3-assets.adcolony.com +www.adcanadian.com +www.adcarousel.pl +www.adcash.com +www.adcell.de +www.adchimp.com +www.adclick.lv +www.adclickservice.com +www.adclickthru.net +www.adcode.ws +www.adcolony.com +www.adcomplete.com +www.adcrowd.com +www.adcycle.com +www.addesk.advertising.com +www.addfreecounter.com +www.addfreestats.com +www.additcinggames.com +www.addshoppers.com +www.addthis.com +www.addthiscdn.com +www.addtoany.com +www.addwish.com +www.adelixir.com +www.ademails.com +www.adengage.com +www.adexchange.analyticson.com +www.adexchangecloud.com +www.adfactor.nl +www.adfirmative.com +www.adforati.com +www.adforgames.com +www.adfreetv.ch +www.adfunkyserver.com +www.adfusion.com +www.adgitize.com +www.adgroups.net +www.adgtracker.com +www.adhexa.com +www.adhood.com +www.adimages.beeb.com +www.adimpact.com +www.adinterax.com +www.adipics.com +www.adireland.com +www.adjmps.com +www.adjug.com +www.adlandpro.com +www.adlantis.jp +www.adless.io +www.adlightning.com +www.adloader.com +www.adlock.in +www.adlogix.com +www.adlzyei.com +www.adm.dynamicyield.com +www.adm.intel-intg.dynamicyield.com +www.adm.intel-stage.dynamicyield.com +www.admarket.cz +www.admarketplace.net +www.admedo.com +www.admex.com +www.admez.com +www.admin-stg.revcontent.com +www.admin.adyoulike.com +www.admin.analyticson.com +www.admin.bitcoin.siliconorchard.com +www.admin.campaign.piwik.pro +www.admin.corp.mparticle.com +www.admin.iesnare.co.uk +www.admin.iesnare.com +www.admin.revcontent.com +www.admin.streetview.siliconorchard.com +www.adminder.com +www.adminer.com +www.admiral.mgr.consensu.org +www.admixxer.com +www.admnew.dynamicyield.com +www.adnet.biz +www.adnet.com +www.adnet.de +www.adnetwork.adasiaholdings.com +www.adnetworkperformance.com +www.adnigma.com +www.adnxs.com +www.adobee.com +www.adobetag.com +www.adobur.com +www.adocean.pl +www.adoptim.com +www.adorigin.com +www.adotube.com +www.adpeepshosted.com +www.adpepper.dk +www.adperium.com +www.adplusplus.fr +www.adpoddb1.dfw2.lijit.com +www.adpowerzone.com +www.adprotect.net +www.adquest3d.com +www.adranking.de +www.adready.com +www.adreadytractions.com +www.adregistry.com +www.adrelevantis.com +www.adreporting.com +www.adrizer.com +www.adrotate.net +www.adrotator.com +www.adroz.com +www.ads-twitter.com +www.ads.dynamicyield.com +www.ads.epom.com +www.ads.ero-advertising.com +www.ads.inmobi.com +www.ads.joetec.net +www.ads.panadvert.com +www.ads.revenue.net +www.ads.viewsignage.com +www.ads.wsrs.net +www.ads1-adnow.com +www.ads180.com +www.ads234.com +www.ads2live.com +www.ads2srv.com +www.ads345.com +www.adscampaign.com +www.adscampaign.net +www.adscience.nl +www.adsdk.siliconorchard.com +www.adsedo.com +www.adsensecustomsearchads.com +www.adsentnetwork.com +www.adserve.video +www.adserver-espnet.sportszone.net +www.adserver.advertisingbox.com +www.adserver.co.il +www.adserver.com +www.adserver.com.my +www.adserver.com.pl +www.adserver.directworksmedia.com +www.adserver.ezwebsitetraffic.com +www.adserver.game-focus.net +www.adserver.gtcmovies.com +www.adserver.home.pl +www.adserver.janes.net +www.adserver.janes.org +www.adserver.jolt.co.uk +www.adserver.ministryofads.com +www.adserver.net +www.adserver.openx.co.za +www.adserver.radiomediagroup.org +www.adserver.rankedbyreview.com +www.adserver.sprintdisk.com +www.adserver.ugo.nl +www.adserver.viewsignage.com +www.adservtech.com +www.adsflame.com +www.adshot.de +www.adshufffle.com +www.adsinimages.com +www.adskeeper.co.uk +www.adsoftware.com +www.adspace.be +www.adspaces.ero-advertising.com +www.adspeed.com +www.adspics.com +www.adspoll.com +www.adsrvr.org +www.adstogo.com +www.adstreams.org +www.adsupply.com +www.adsupplyads.com +www.adsurve.com +www.adszooks.com +www.adtactics.com +www.adtaily.com +www.adtaily.pl +www.adtechus.com +www.adtegrity.com +www.adtekmedia.com +www.adthrive.com +www.adtiger.de +www.adtilt.com +www.adtlgc.com +www.adtracker.inmobi.com +www.adtrade.net +www.adtrade.ro +www.adtrader.com +www.adtraff.ru +www.adtrix.com +www.adult-top-list.com +www.adult-tracker.de +www.adultadbroker.com +www.adultblogtoplist.com +www.adultcash.com +www.adultcommercial.net +www.adultdatelink.com +www.adultdatingtraffic.com +www.adultfriendfinder.com +www.adultlinkexchange.com +www.adultlinksco.com +www.adv.api.admedia.com +www.advaliant.com +www.advancedcleaner.com +www.advancedmaccleaner.com +www.advancedmactools.com +www.advancedsoftwaresupport.com +www.advancesrl.eu +www.advanpromo.com +www.advconversion.com +www.adventertainment.it +www.adversal.com +www.adversal.mgr.consensu.org +www.adversalservers.com +www.adverterenbijrtl.nl +www.adverterenbijsbs.nl +www.adverterenzeeland.nl +www.advertise.com +www.advertisersegment.inmobi.com +www.advertising-department.com +www.advertising.com +www.advertising365.com +www.advertisingbox.com +www.advertlets.com +www.advertpro.com +www.adverts.dcthomson.co.uk +www.advertserve.com +www.advertyz.com +www.advidi.com +www.adview.cn +www.adviews.de +www.adviserplus.com +www.adwarespy.com +www.adwidecenter.com +www.adwise.bg +www.adwords.google.lloymlincs.com +www.adwords.panadvert.com +www.adworkmedia.com +www.adworld.com.tr +www.adworldmedia.com +www.adwyze.com +www.adx1.com +www.adxcel-ec2.com +www.adxpansion.com +www.adxtrem.com +www.adylalahb.ru +www.adzerk.net +www.aektschen.de +www.aeon.crypto-webminer.com +www.aep.emea.mxptint.net +www.aep.mxptint.net +www.aeqs.com +www.aeronautica.gob.pa +www.aeros01.tk +www.aeros02.tk +www.aeros03.tk +www.aeros04.tk +www.aeros05.tk +www.aeros06.tk +www.aeros07.tk +www.aeros08.tk +www.aerreravasi.com +www.afantispy.com +www.afcyhf.com +www.afdjljiyagf.ru +www.affbuzzads.com +www.affiliate-fr.com +www.affiliateclick.com +www.affiliatefuel.com +www.affiliatefuture.co.uk +www.affiliatesuccess.net +www.affiliatetracking.com +www.affiliatetracking.net +www.affiliation-france.com +www.affordablewebsitetraffic.com +www.afform.co.uk +www.affpartners.com +www.afftrack.com +www.afminer.com +www.afp.tidaltv.com +www.afterdownload.com +www.agentanalytics.com +www.agkn.com +www.aidl-dev1001.data.corp.inmobi.com +www.aim4media.com +www.aimes.com +www.airadmins.com +www.airbornehydrography.com +www.airfind.com +www.airfrance.life +www.airpr.com +www.airsonett.se +www.airvertiseme.com +www.ait7ee.win +www.ajalis.com +www.ajcryptominer.com +www.akademija.marketing365.mk +www.akamaisecure.qualtrics.com +www.akirkpatrick.com +www.akoneplatit.sk +www.alaksaair.com +www.alaskaaair.com +www.albiondrugs.com +www.aldaniti.net +www.alenty.com +www.alexxe.com +www.alfapro.pl +www.algocashmaster.com +www.algocashmaster.net +www.all-internet-security.com +www.alladultdirectories.com +www.alladultdirectory.net +www.allfet.info +www.allfontshere.press +www.allhqpics.com +www.alliance4media.com +www.allinviews.com +www.allosponsor.com +www.almondnetworks.com +www.alpha-assets.adcolony.com +www.alphamedical02.fr +www.alphateam.com +www.alphonso.tv +www.alrpost69.com +www.altavista.ovh +www.alteryx.marketo.com +www.altpool.pro +www.am-display.hb.adx1.com +www.am-native.hb.adx1.com +www.am-pops.xml.adx1.com +www.am1-h-api.online-metrix.net +www.amaporn.com +www.amazing-offers.co.il +www.amazing-opportunities.info +www.amazingcounters.com +www.american-prize-center.com +www.amhixwqagiz.ru +www.amp.mxptint.net +www.amplify.amplitude.com +www.amway.com +www.amway.pl +www.amybites.com +www.ana.analyticson.com +www.anaco.jp +www.analyse.advertisingbox.com +www.analyticdns.org +www.analytics.blue +www.analytics.glance.inmobi.com +www.analytics.ihgip.net +www.analytics.xcal.tv +www.analyticson.com +www.anastasiasaffiliate.com +www.anatol.com +www.andlache.com +www.andr.net +www.andrew.nullrefexcep.com +www.andyhoppe.com +www.angelinajoliepics.com +www.angelsinuniform.com +www.angolotesti.it +www.animal-drawings.com +www.animal36.com +www.animalrank.com +www.animaltoplist.com +www.anime.reactor.cc +www.anmira.info +www.annuaire-autosurf.com +www.anrdoezrs.net +www.answers.chartboost.com +www.answers.livefyre.com +www.ant.com +www.antaraimedia.com +www.antarasystems.com +www.anticarredodolomiti.com +www.anticlown.com +www.aoredi.com +www.ap.cdn.survey.medallia.com +www.apdrive.win +www.api-gateway.uat.dev.sizmek.com +www.api.ad.intl.xiaomi.com +www.api.adx1.com +www.api.adyoulike.com +www.api.alphonso.tv +www.api.amplitude.com +www.api.analyticson.com +www.api.appboy.com +www.api.appsee.com +www.api.browsermine.com +www.api.clrstm.com +www.api.coin-hive.com +www.api.coinhive.com +www.api.convertkit.com +www.api.curalate.com +www.api.dynamicyield.com +www.api.flyertown.ca +www.api.glance.inmobi.com +www.api.inmobi.com +www.api.intel.dynamicyield.com +www.api.intellimize.co +www.api.lisnr.com +www.api.mixpanel.com +www.api.sonobi.com +www.api.static.xtify.com +www.api.thirdpresence.com +www.api.traffiliate.com +www.api.xtify.com +www.apidemo.eazybiz.ng +www.apmebf.com +www.app.convertkit.com +www.app.eazybiz.ng +www.app.graphly.io +www.app.intellimize.co +www.app.lisnr.com +www.app.mparticle.com +www.app.onlinesucces.nl +www.app.pathful.com +www.app.visualwebsiteoptimizer.com +www.appafile.com +www.apparel-offer.com +www.apparelncs.com +www.appboy.com +www.appcaptcha.com +www.appdemo.eazybiz.ng +www.appdynamics.com +www.appfindr.org +www.apphostcapital.com +www.apple.com-clean-macbook.live +www.apple.com-notice.info +www.apple.com-speed-macbook.live +www.applelounge.com +www.appleprotection.org +www.applicationinsights.microsoft.com +www.applicationsdeliveryupdate.com +www.applicationwiki.com +www.appliedsemantics.com +www.appnexus.com +www.apponic.com +www.apps.adtz.com +www.apps.panadvert.com +www.appsee.com +www.appsflyer.com +www.aproxtrack2.com +www.aptrafficnetwork.com +www.apx-plugin.sizmek.com +www.arbeitssuche-web.de +www.arcadebanners.com +www.arcadefree.com +www.archigate.it +www.areadiprova.eu +www.areasnap.com +www.arenda-yeisk.ru +www.areyouabot.net +www.areyouahuman.co +www.argondenims.siliconorchard.com +www.ariboo.com +www.arizona-miner.tk +www.arkinsoftware.in +www.arklighting.co +www.arkonziv.com +www.array.datamark.net +www.arrivalist.com +www.art-music-rewardpath.com +www.art-offer.com +www.art-offer.net +www.art-photo-music-premiumblvd.com +www.art-photo-music-rewardempire.com +www.art-photo-music-savingblvd.com +www.artcomix.com +www.articlefuns.cn +www.articleidea.cn +www.as-chwilowka.pl +www.ascend.ai +www.ascentive.com +www.aservices.party +www.asianread.com +www.asiansforu.com +www.aspesa.info +www.asridge.siliconorchard.com +www.assasin.siliconorchard.com +www.assculturaleincontri.it +www.assets.pcrl.co +www.assetscdn.stream +www.assoc-amazon.com +www.astalavista.us +www.asvoxod.ru +www.atdmt.com +www.atinna.com +www.atl-dc01.marketo.net +www.atl-dc02.marketo.net +www.atlantis-asia.com +www.atlasdmt.com +www.atmovs.com +www.atomictime.net +www.atousoft.com +www.atp.mxptint.net +www.atpanel.com +www.auctiondirectory.org +www.auctionshare.net +www.audia6.com +www.audiencesuite.sizmek.com +www.audioconverter.info +www.audioknigi.club +www.aureate.com +www.auroramine.com +www.aussiemoneymethod.com +www.auth.crypto-webminer.com +www.auth.k8s-prod.fiksu.com +www.auth.k8s-test.fiksu.com +www.authcaptcha.com +www.authedmine.com +www.authedwebmine.cz +www.authentication-dev.demandbase.com +www.authentication.demandbase.com +www.authorisation.analyticson.com +www.auto-overview.com +www.auto-px.dynamicyield.com +www.autohipnose.com +www.autologica.ga +www.automatad.com +www.automoneygenerator.com +www.automotive-offer.com +www.automotive-rewardpath.com +www.autonations.com +www.autosurfpro.com +www.av-clean.com +www.avangate.appsee.com +www.avantlink.com +www.avast-downloads.com +www.avcounter10.com +www.avenuea.com +www.avero.xyz +www.averoconnector.com +www.avis.cm +www.avnads.com +www.avon.com +www.avon.pl +www.avrakougioumtzi.gr +www.avsads.com +www.avskype.com +www.awesome.bizible.com +www.awesomevipoffers.com +www.awin.com +www.awltovhc.com +www.axiatraders.com +www.axill.com +www.axoncoho.tk +www.ayehcleaners.com +www.aymcsx.ru +www.azmsoft.com +www.b.mmnetwork.mobi +www.b.proxy4.nullrefexcep.com +www.b3d.com +www.bablace.com +www.backend.freecontent.win +www.backoffice.evobinary.com +www.backsim.ru +www.backstage.taboola.com +www.backtrace.io +www.badassjv.com +www.bagslap.com +www.baiduccdn.org +www.baiduccdn1.com +www.baiducdn.org +www.balkansteelie.com +www.ballsack.org +www.balook.com +www.bananacashback.com +www.bananarepubic.com +www.bangbuddy.com +www.bankingservices.xyz +www.bankofamerica.com.ok.am +www.bannanarepublic.com +www.banner-exchange.nl +www.banner-link.com.br +www.banner-rotation.com +www.banner.content-ad.net +www.banner.cz +www.banner4all.dk +www.bannerads.de +www.bannerbackup.com +www.bannerconnect.net +www.bannerexchange.co.nz +www.bannergratis.it +www.bannermanagement.nl +www.bannerpromotion.it +www.banners.analyticson.com +www.banners.ero-advertising.com +www.banners.mediaparade.net +www.banners.paramountzone.com +www.banners2.ero-advertising.com +www.bannersgomlm.com +www.bannersurvey.biz +www.bannersxchange.com +www.banstex.com +www.bar.ry2002.02-ry014.snpr.hotmx.hair.zaam.net +www.barclaysghana.org +www.barelinks.com +www.bargainbeautybuys.com +www.barilliance.net +www.bbelements.com +www.bcservice.it +www.bde3d.com +www.bdsmtours.com +www.be-funk.com +www.be4life.ru +www.beacon.airvertiseme.com +www.beacon.terratracker.com +www.beacon.vicinity-marketing.com +www.beauty-tea.com +www.beead.co.uk +www.beeftransmission.com +www.beespace.com.ua +www.beeviewd.com +www.befirstcdn.com +www.beginads.com +www.belstat.be +www.belstat.com +www.belstat.nl +www.bender.appboy.com +www.berateveng.ru +www.besstbuy.com +www.best-games4you.top +www.best-iphone6s.com +www.best-top.ro +www.bestappinstalls.com +www.bestcontentonline.com +www.bestfactorydelivery.com +www.besthitsnow.com +www.besti.ga +www.bestmobiworld.com +www.bestrxpills.com +www.bestsearch.com +www.bestsecurepractice.com +www.bestshockers.com +www.bestshopperrewards.com +www.bestwm.info +www.bet365.com +www.beta.addesk.advertising.com +www.beta.adx1.com +www.beta.api.adx1.com +www.betcounter.com +www.bettertextads.com +www.bewaslac.com +www.beyondwhois.com +www.bgbaner.com +www.bhclicks.com +www.bi.demandbase.com +www.biberukalap.com +www.bidclix.com +www.bidclix.net +www.bidgear.com +www.bidswitch.rdb.adx1.com +www.bidtraffic.com +www.bidvertiser.com +www.bigbadted.com +www.bigbangempire.com +www.bigbrandpromotions.com +www.bigbrandrewards.com +www.biggestgiftrewards.com +www.bighop.com +www.bigmart.com.np +www.bigpenisguide.com +www.bigsharkmedia.com +www.bigsister-puff.cxa.de +www.bigsister.cxa.de +www.bilbob.com +www.bilder-upload.eu +www.billboards.marketing365.mk +www.billing.taboola.com +www.binadroid.com +www.binarysystem4u.com +www.bit-coin-trader.com +www.bitcoadz.io +www.bitcoin-pay.eu +www.bitcoin.siliconorchard.com +www.bitcoiner.win +www.bitlocker.net +www.bitmedia.io +www.bitraffic.com +www.bitsfarmclean.com +www.bitspresentdownload.com +www.biz-offer.com +www.bizible.com +www.bizneed.com +www.bizographics.com +www.bizoninvest.com +www.bizopprewards.com +www.bj04.com +www.bjorksta.men +www.bkp.emea.mxptint.net +www.bkp.mxptint.net +www.bkrtx.com +www.blasphemysfhs.info +www.blatant8jh.info +www.blazingtrader.biz +www.blenz-me.net +www.blismedia.com +www.blockchained.party +www.blog-hits.com +www.blog.adwyze.com +www.blog.adx1.com +www.blog.appboy.com +www.blog.appsee.com +www.blog.count.ly +www.blog.fullstory.com +www.blog.fyber.com +www.blog.intelsad.com +www.blog.keen.io +www.blog.marketing365.mk +www.blog.privy.com +www.blog.vicedata.com +www.blog.viewbix.com +www.blog.vilynx.com +www.blogads.com +www.blogads.de +www.blogcatalog.com +www.blogcounter.de +www.blogrankers.com +www.blogtoplist.com +www.blogtopsites.com +www.bluediamondoffers.com +www.blueimagen.com +www.bluemountain1.com +www.bluemountain2.com +www.bluestreak.com +www.bluewaffle.biz +www.bmcm.pw +www.bmmetrix.com +www.bmnadutub.ru +www.bmnr.pw +www.bmpx.pw +www.bmst.pw +www.bnc.lt +www.bnhtml.com +www.bnmq.com +www.bnnr.nl +www.boattraider.com +www.bodog.eu +www.bogata-przyszlosc.com +www.bonzi.com +www.bookclub-offer.com +www.books-media-edu-premiumblvd.com +www.books-media-edu-rewardempire.com +www.books-media-rewardpath.com +www.boonsolutions.com +www.bootea-uk.pinterest.adtz.com +www.bostonsubwayoffer.com +www.bostonwall.com +www.bottleguy.com +www.bovadapromotions.lv +www.bowithow.com +www.bowlgirl.com +www.box.bg +www.bracalemusic.com +www.brainfox.com +www.bramka-sms-za-darmo.pl +www.brandedleadgeneration.com +www.brandguidelines.outbrain.com +www.brandrewardcentral.com +www.brandsurveypanel.com +www.bravospots.com +www.brevardmusic.com +www.brf-corpca1.corp.mparticle.com +www.bride1.com +www.brightfunnel.com +www.brightonclick.com +www.broadcastpc.tv +www.broadspring.com +www.brokertraffic.com +www.brominer.com +www.browser-statistik.de +www.browseraccelerator.com +www.browsermine.com +www.browsersolution.win +www.brp.mxptint.net +www.bt.emsecure.net +www.btb.adx1.com +www.btds.artplay.info +www.budsinc.com +www.bugsbanner.it +www.build.ares.inmobi.com +www.build.dynamicyield.com +www.build.tools.inmobi.com +www.build1500.scm.ev1.inmobi.com +www.buildtraffic.com +www.buildtrafficx.com +www.bulgariabg.com +www.bulkclicks.com +www.bulletads.com +www.bumerang.cc +www.bundlerepositorycontent.com +www.burstnet.com +www.bus-offer.com +www.buscamundo.com +www.business-rewardpath.com +www.business.lbn.ru +www.butcalve.com +www.buttcandy.com +www.butterfly-media.co.uk +www.buwobarun.cn +www.buy404s.com +www.buycheapadvertising.com +www.buyhitscheap.com +www.buyingedge.com +www.buypixelads.com +www.buyskype.ru +www.buzzadexchange.com +www.buzzadnetwork.com +www.buzzclick.com +www.buzzclicks.com +www.buzzdeck.com +www.buzzonclick.com +www.bvfsc.info +www.bw.bidder.inmobi.com +www.bypasser.net +www.bytecoin.crypto-webminer.com +www.c.bksn.se +www.c.jsrdn.com +www.c.thecounter.de +www.c1.thecounter.de +www.c2.thecounter.de +www.c4d-cdn.adcolony.com +www.c4dl.com +www.c7e935.netlify.com +www.ca.cdn.survey.medallia.com +www.cabeles.com +www.cablyshaw.com +www.cadaver.org +www.cadillacescalade.com +www.cafecoquin.com +www.californiastateparks.com +www.calq.io +www.calworthingtonford.com +www.cam4.fr +www.cambodiaoutsourcing.com +www.cambonanza.com +www.campaigns.curalate.com +www.camsoda.com +www.camsoda1.com +www.canada.pinterest.adtz.com +www.canadianshawid.com +www.canalstat.com +www.candidography.com +www.canuck-method.com +www.canuckmethods.com +www.capability.viewsignage.com +www.capath.com +www.capodannoinversilia.com +www.captify.mgr.consensu.org +www.car-truck-boat-bonuspath.com +www.car-truck-boat-premiumblvd.com +www.caramail.com +www.carbonads.net +www.careers-rewardpath.com +www.careers.outbrain.com +www.carpet.pulse.inmobi.com +www.carrel.services +www.cart.adx1.com +www.cartoonpornguide.com +www.casalemedia.com +www.casamama.nl +www.cash4downloads.com +www.cash4members.com +www.cashback.co.uk +www.cashbackworld.com +www.cashbackwow.co.uk +www.cashcapitalsystem.com +www.cashcount.com +www.cashengines.com +www.cashlayer.com +www.cashthat.com +www.casino770.com +www.casinotropez.com +www.catalinkcashback.com +www.catalog.adx1.com +www.catalogo.intelsad.com +www.catgallery.com +www.caue971.org +www.cbeckads.com +www.cbproads.com +www.cbtopsites.com +www.ccbill.com +www.ccbilleu.com +www.ccde.events.marketo.com +www.ccinext.count.ly +www.ccp14.ac.uk +www.cd.freecontent.win +www.cdiabetes.com +www.cdn-analytics.pl +www.cdn-jquery.host +www.cdn-preview.dynamicyield.com +www.cdn.adasiaholdings.com +www.cdn.adserve.video +www.cdn.adx1.com +www.cdn.airfind.com +www.cdn.bizible.com +www.cdn.bronto.com +www.cdn.dynamicyield.com +www.cdn.nablabee.com +www.cdn.springserve.com +www.cdn.ywxi.net +www.cdnfile.xyz +www.cdns.ws +www.cdx.ssacdn.com +www.cecash.com +www.cedino.pl +www.ceisystems.it +www.celebrus.com +www.celeritascdn.com +www.cell-phone-giveaways.com +www.cellphoneincentives.com +www.cellularbeton.it +www.centerfind.com +www.centertrk.com +www.centralsignnew.com +www.centralwestwater.com.au +www.centrum-kredytowe.net +www.centrumfilmowe.bc43.pl +www.cerquasas.it +www.cert1.franklyinc.com +www.cert2.franklyinc.com +www.cert3.franklyinc.com +www.certificates.freecontent.win +www.certified-toolbar.com +www.certs.corp.mparticle.com +www.ceskarepublika.net +www.cf.ssacdn.com +www.cfcd.duckdns.org +www.cfcdist.gdn +www.cfceu.duckdns.org +www.cfcs1.duckdns.org +www.cgi-view-item-co-uk.xf.cz +www.ch.browsermine.com +www.chacomedia.com +www.chainblock.science +www.chainsawoffer.com +www.chartbeat.com +www.chartboost.com +www.chaseonline.com +www.chat.trackalyzer.com +www.cheap-laptops-notebook-computers.info +www.cheap-online-stamp.cast.cc +www.cheapstickets.com +www.cheaptickests.com +www.cheapticketes.com +www.cheapticketsinc.com +www.cheapticketts.com +www.cheapticktes.com +www.checkstat.nl +www.cheekybanners.com +www.chelick.net +www.chiaperottipaolo.it +www.chilecapacita.cl +www.chilyregistrycleaner.com +www.china.sizmek.com +www.chlcotrk.com +www.chmproxy.bid +www.choicedealz.com +www.choicesurveypanel.com +www.chokertraffic.com +www.christianbusinessadvertising.com +www.chrumedia.com +www.chuckfaganco.com +www.chuckledeliveryhosting.com +www.chucklefunhead.com +www.chws.browsermine.com +www.ci-mpsnare.iesnare.co.uk +www.ci-mpsnare.iesnare.com +www.ci.adx1.com +www.ci.appboy.com +www.ci.thirdpresence.com +www.cichodaje.pl +www.cifor.com +www.cig-arrete.com +www.cimetrix.inmobi.com +www.ciqugasox.cn +www.cityads.ru +www.cj.conversant.mgr.consensu.org +www.claimfreerewards.com +www.claitors.com +www.clarity.idsp.inmobi.com +www.clarity.inmobi.com +www.clashmediausa.com +www.classifieds1000.com +www.cle.kr +www.clean-cracks.com +www.clean-search.com +www.clean-space.com +www.cleanallspyware.com +www.cleanersoft.com +www.cleanmypc.com +www.cleanpcnow.com +www.cleanproxy.com +www.cleansearch.net +www.cleansite.us +www.cleansofts.com +www.cleanuninstall.com +www.cleanup-your-computer.com +www.clear-request.com +www.clearalgorithm.com +www.clearshieldredirect.com +www.clevernt.com +www.clgserv.pro +www.click-find-save.com +www.click-see-save.com +www.click.alibaba.com +www.click.elixmedia.com +www.click10.com +www.click4click.com +www.clickaction.net +www.clickadu.com +www.clickbank.com +www.clickbank.net +www.clickboothlnk.com +www.clickcash.com +www.clickclick.com +www.clickconvertsell.com +www.clickdensity.com +www.clickedyclick.com +www.clickhouse.com +www.clickmanage.com +www.clickmeter.com +www.clickopon.com +www.clickpapa.com +www.clicksagent.com +www.clicksgear.com +www.clicksor.com +www.clicksotrk.com +www.clickspring.net +www.clicktale.com +www.clicktale.net +www.clickterra.net +www.clickthruserver.com +www.clickthrutraffic.com +www.clicktilluwin.com +www.clicktorrent.info +www.clicktracks.com +www.clicktripz.com +www.clicktshirtprinting.co.uk +www.clickvalidator.net +www.clickxchange.com +www.clickzs.com +www.client.dotomi.com +www.clientmanagement.lijit.com +www.clients.datamark.net +www.clients.pixel.marketing +www.cliggi.download +www.cliop.com +www.clixgalore.com +www.clixtrac.com +www.clkfeed.com +www.clkoffers.com +www.clksite.com +www.clod.pw +www.closeoutproductsreview.com +www.cloud.count.ly +www.cloud.piwik.pro +www.cloudcdn.gdn +www.cloudcoins.co +www.cloudflane.com +www.cloudmedia.gdn +www.cloudmediacdn.com +www.cloudtracked.com +www.clownsong.com +www.clustrmaps.com +www.clxcaf.com +www.cm.netseer.com +www.cm1359.com +www.cme.adx1.com +www.cmi.netseer.com +www.cnbnews.com +www.cncn.ssacdn.com +www.cndhit.xyz +www.cnn.cm +www.cnnnew.com +www.cnstats.com +www.co2stats.com +www.codeads.com +www.codez-knacken.de +www.cody.services +www.cogivea.com +www.coihive.com +www.coin-ad.com +www.coin-have.com +www.coin-hive-proxy-ybydcnjgkl.now.sh +www.coin-hive-stratum-bqywuwxwij.now.sh +www.coin-hive-stratum-cilswgfvet.now.sh +www.coin-hive-stratum-fcwcduvpjs.now.sh +www.coin-hive-stratum-yvvbqoavck.now.sh +www.coin-hive.com +www.coin-service.com +www.coinad.com +www.coinblind.com +www.coiner.site +www.coinerra.com +www.coingive.com +www.coinhive-manager.com +www.coinhive-proxy.party +www.coinhive.com +www.coinhive.info +www.coinhive.net +www.coinhive.org +www.coinhiver.com +www.coinhives.com +www.coinhove.com +www.coinhub.win +www.coinimp.com +www.coinimp.net +www.coinive.com +www.coinjive.com +www.coinlab.biz +www.coinnebula.com +www.coinpot.co +www.coinrail.io +www.coinverti.com +www.coinwebmining.com +www.coinworker.com +www.coinzilla.io +www.coldwellbanker.net +www.collect.mentad.com +www.collectiable.com +www.colnhive.com +www.colorcredit.pl +www.coloritpak.by +www.columbahouse.com +www.com-notice.info +www.comclick.com +www.come-see-it-all.com +www.commerce-offer.com +www.commerce-rewardpath.com +www.commercialclientsgroup.ru +www.commission-junction.com +www.commissionempire.com +www.community.appboy.com +www.compass.eloqua.com +www.compufixshop.com +www.computer-offer.com +www.computer-offer.net +www.computers-electronics-rewardpath.com +www.computersncs.com +www.computerxchange.com +www.conds.ru +www.conduit-banners.com +www.conduit.com +www.config-ltvp.inmobi.com +www.config.inmobi.com +www.config2.mparticle.com +www.conhive.com +www.connect.onlinesucces.nl +www.connectionlead.com +www.connexity.net +www.consent.cookiebot.com +www.console.xtify.com +www.consoliad.consoliads.com +www.consoliads.com +www.consumedmedia.com +www.consumer-org.com +www.consumeralternatives.org +www.consumergiftcenter.com +www.consumerincentivenetwork.com +www.contact.vicedata.com +www.contaxe.com +www.content-js.tapjoy.com +www.content.adroll.com +www.content.taboola.com +www.contentlockingnetworks.com +www.contextlinks.netseer.com +www.contextpanel.com +www.contextuads.com +www.contextualclicks.com +www.contextweb.com +www.control.springserve.com +www.conversantmedia.com +www.conversionruler.com +www.convertro.com +www.cookiescript.info +www.cookingtiprewards.com +www.cool-downloads.com +www.cool-downloads.net +www.cool-premiums-now.com +www.cool-premiums.com +www.coolconcepts.nl +www.coolfreehost.com +www.coolpremiumsnow.com +www.coolsavings.com +www.coolwebstats.com +www.copyright-reform.info +www.coreglead.co.uk +www.cornomase.win +www.cortesidesign.com +www.cosiloon.com +www.cosmeticscentre.uk.com +www.count.ly +www.count24.de +www.counter-gratis.com +www.counter.bloke.com +www.counter.cz +www.counter.sexhound.nl +www.counter.superstats.com +www.counter1.sextracker.be +www.counter10.sextracker.be +www.counter11.sextracker.be +www.counter12.sextracker.be +www.counter13.sextracker.be +www.counter14.sextracker.be +www.counter15.sextracker.be +www.counter16.sextracker.be +www.counter2.sextracker.be +www.counter3.sextracker.be +www.counter4.sextracker.be +www.counter4all.com +www.counter4all.de +www.counter5.sextracker.be +www.counter6.sextracker.be +www.counter7.sextracker.be +www.counter8.sextracker.be +www.counter9.sextracker.be +www.countercentral.com +www.counterguide.com +www.counters4u.com +www.counti.de +www.countit.ch +www.countmypage.com +www.countok.de +www.coupon.bitcoin.siliconorchard.com +www.cozycoreclub.de +www.cp.tune.com +www.cpabank.com +www.cpaempire.com +www.cpalead.com +www.cpalist.com +www.cpays.com +www.cpm.marketo.net +www.cpm10.com +www.cpm20.com +www.cpmadvisors.com +www.cpmaffiliation.com +www.cpmfun.com +www.cpmterra.com +www.cpu2cash.link +www.cpufan.club +www.cpx24.com +www.cqcounter.com +www.crackandplay.com +www.crackserver.com +www.crakmedia.com +www.crash-metrics.sdk.inmobi.com +www.crazypopups.com +www.crazyprotocol.com +www.crazywinnings.com +www.creativeads.ro +www.crediblegfj.info +www.credit-dreams.com +www.creditauthpagev3.info +www.credy.pl +www.crispads.com +www.criteo.com +www.criteo.net +www.crm-metrix.fr +www.crm-preview.dynamicyield.com +www.crm.adxtrem.com +www.crmapi.idsp.inmobi.com +www.crowd.rubiconproject.com +www.crowdgravity.com +www.crowdignite.com +www.cryptaloot.pro +www.crypto-loot.com +www.crypto-pool.fr +www.crypto-webminer.com +www.crypto.csgocpu.com +www.cryptobara.com +www.cryptocoinabout.com +www.cryptocoinsad.com +www.cryptoloot.pro +www.cryptonoter.com +www.cryptosearch.site +www.cryptotab.net +www.cryptown.netlify.com +www.cs.rubiconproject.com +www.csgobigbets.com +www.csgohollow.com +www.csgoleap.com +www.csgowealth.com +www.cshacks.partycat.us +www.ctbdev.net +www.ctlrnwbv.ru +www.ctr0181.pixel.printsites.net +www.ctrck.com +www.ctroneum.crypto-webminer.com +www.cube.yext.com +www.curalate.com +www.currentupdateconcepts.com +www.curryheinz.de +www.custom.crypto-webminer.com +www.custombi.sizmek.com +www.customer-folder.dynamicyield.com +www.customer.instartlogic.com +www.customersupporthelp.com +www.cw.nu +www.cxcc.ssacdn.com +www.cxlaxexprswy01.smo.connexity.net +www.cxlaxexprswy02.smo.connexity.net +www.cxp.mxptint.net +www.cyber-incentives.com +www.cybereps.com +www.cybermecca.com +www.cyberscat.com +www.cyberzine.com +www.cybilling.com +www.cydoor.com +www.czilladx.com +www.d.liadm.com +www.d03x2011.com +www.d4h.adx1.com +www.da-ads.com +www.dad.adx1.com +www.dadparty.com +www.daily-saver.com +www.dance-alarm.de +www.daniel.yodelmobile.com +www.darking03.tk +www.darking04.tk +www.darking05.tk +www.darking06.tk +www.darking07.tk +www.darking08.tk +www.darking09.tk +www.darley.co.uk +www.darmowe-wrozby.com +www.darmowe-zakupy.com +www.darulsaka.com +www.dashboard.adrizer.com +www.dashboard.appboy.com +www.dashboard.appsee.com +www.daspar.net +www.data-ero-advertising.com +www.data.ad-score.com +www.data.pathful.com +www.data.vicedata.com +www.dataexchange.inmobi.com +www.dataforce.net +www.datamark.net +www.datanotary.com +www.datasecu.download +www.dataservices.download +www.datatech.es +www.dating-banners.com +www.datingadvertising.com +www.dcm5.com +www.dcrt.netseer.com +www.dctracking.com +www.dddcc.com +www.de-mi-nis-ner.info +www.de-mi-nis-ner2.info +www.de-ner-mi-nis4.info +www.de-nis-ner-mi-5.info +www.de.adcolony.com +www.decografix.com +www.deepc.cc +www.deepmetrix.com +www.defaultinternet.com +www.defenderxtactical.com +www.deflorationvirgins.com +www.del-marine.com +www.delivery.analyticson.com +www.delta.terratracker.com +www.deltahost.de +www.delton.com +www.demandbase.com +www.demandbase.demandbase.com +www.demo.getsitecontrol.com +www.demo.pardot.com +www.demo.vicedata.com +www.demo1.use.dynamicyield.com +www.demos.viewsignage.com +www.den-ax01.marketo.net +www.den-dc01.marketo.net +www.den-dc02.marketo.net +www.den.cdn.survey.medallia.com +www.dentairemalin.com +www.depravedwhores.com +www.dero.crypto-webminer.com +www.deshmedia.com +www.desifever.com +www.design.advidi.com +www.designbloxlive.com +www.destinationurl.com +www.detroithardcore.com +www.dev.2open.facebook-ads.adtz.com +www.dev.3dids.facebook-ads.adtz.com +www.dev.abs-cbn.facebook-ads.adtz.com +www.dev.accentsystems.facebook-ads.adtz.com +www.dev.accenture-br.facebook-ads.adtz.com +www.dev.ad-pure.facebook-ads.adtz.com +www.dev.adam-demo.facebook-ads.adtz.com +www.dev.adconion-us.facebook-ads.adtz.com +www.dev.adx1.com +www.dev.appboy.com +www.dev.clickconvertsell.com +www.dev.gohenry.pinterest.adtz.com +www.dev.khingtracking.com +www.dev.pinterest.adtz.com +www.dev.ratingtoplist.com +www.dev.rubiconproject.com +www.dev.trail.facebook-ads.adtz.com +www.dev.trial-italia.facebook-ads.adtz.com +www.dev.trial.facebook-ads.adtz.com +www.dev.visualwebsiteoptimizer.com +www.dev1.assasin.siliconorchard.com +www.dev2.bitcoin.siliconorchard.com +www.devappgrant.space +www.developer.fyber.com +www.devis-abri-de-piscine.fr +www.dex.k8s-prod.fiksu.com +www.dex.k8s-test.fiksu.com +www.dexim.space +www.dezuiderwaard.nl +www.dfp.franklyinc.com +www.dgmaustralia.com +www.dia-traffic.com +www.dianomioffers.co.uk +www.dicarlotrack.com +www.didata.bw +www.didnkinrab.com +www.didtheyreadit.com +www.dietoftoday.ca.pn +www.dietsecret.ru +www.diffusionpub.com +www.digger.cryptobara.com +www.digiaquascr.com +www.digimedia.com +www.digitalremedy.com +www.dimarsbg.com +www.dinastycoin.crypto-webminer.com +www.dipli.unipa.it +www.diptanuinfo.co.cc +www.direct-stats.com +www.direct.adx1.com +www.direct.maxpoint.com +www.directadvert.ru +www.directgrowthhormone.com +www.directnetadvertising.net +www.directory.office.yext.com +www.directpowerrewards.com +www.directprimal.com +www.directtrack.com +www.directxex.com +www.dirtyje.ws +www.dirtyrhino.com +www.disable-uac.com +www.discount-savings-more.com +www.discovery.maxpoint.com +www.displaybrowser.com +www.distribuidoraderetentores.com.br +www.distrilamadrid.com.ar +www.diveschool.engagio.com +www.divisioncore.com +www.divx.it +www.djler.de +www.djsrp.com +www.djugoogs.com +www.dkfslkqd.netikh.cdn.streamrail.net +www.dl-plugin.com +www.dl-server.com +www.dl.inmobi.com +www.dllfilestab.com +www.dmdamedia.hu +www.dnps.com +www.dns.lc.wix.com +www.dntx.com +www.do.whoisvisiting.com +www.dobre-programy.pl +www.docker.jfrog-poc.nj1.yext.com +www.docker.jfrog-poc.office.yext.com +www.docker.jfrog-poc.tx1.yext.com +www.docs.adx1.com +www.docs.api.adx1.com +www.doctor-alex.com +www.documentation.appboy.com +www.dodostats.com +www.dofinansowania-jezykowe.pl +www.doladowywacztel.pl +www.dolanadserver.com +www.dollarrentcar.com +www.domainfwd.com +www.domainfwding.com +www.donate.crypto-webminer.com +www.donneuropa.it +www.donotwatch.org +www.dontwatch.us +www.doodream.com +www.dope.ops.inmobi.com +www.dotomi.com +www.dotzup.com +www.doubleclick.com +www.doubleclick.net +www.doubleclickbygoogle.com +www.dougmlee.com +www.dowdenphotography.com +www.down1oads.com +www.download.w65.pl +www.download3x.xcc24.pl +www.downloaddirect.com +www.downloads-mobile.com +www.downloads-whatsapp.com +www.downloads.adx1.com +www.downloadwarez.org +www.dp-medien.eu +www.dp.bidswitch.net +www.dpbolvw.net +www.dragonawaken.com +www.drawbrid.ge +www.dreamville.lisnr.com +www.drift.com +www.driftt.com +www.drivotracker.com +www.dropped.adx1.com +www.dropped.xml.adx1.com +www.drowle.com +www.drteachme.com +www.drunkenstepfather.com +www.dsnextgen.com +www.dsp-preprod.inmobi.com +www.dsp.analyticson.com +www.dsp.franklyinc.com +www.dsp.inmobi.com +www.dsp.smaato.net +www.dt1blog.com +www.dub-dc01.marketo.net +www.dub-dc02.marketo.net +www.dubvpn.marketo.com +www.duplicatefilecleaner.com +www.dutchsales.org +www.dwclick.com +www.dwin1.com +www.dxmhkisurxxxhm.ru +www.dynamic.adcrowd.com +www.dynamictoolbar.com +www.dynamicyield.com +www.dyode.dynamicyield.com +www.dzizsih.ru +www.dzzrenjanin.rs +www.e-bannerx.com +www.e-traffic.com +www.e.thirdpresence.com +www.earncoins.club +www.earnify.com +www.earnmygift.com +www.earnpointsandgifts.com +www.easy-dating.org +www.easy2date.net +www.easyadservice.com +www.easycounter.com +www.easyhash.io +www.eazybiz.ng +www.eb.3lift.com +www.eb.trbas.com +www.ebannertraffic.com +www.ebayadvertising.com +www.ebaybanner.com +www.ebm.e.redbox.com +www.eboundservices.com +www.ebtmarketing.com +www.ec2amaz-v34sjct.marketo.com +www.eclean.or.kr +www.eclkspsa.com +www.econda-monitor.de +www.ecpmrocks.com +www.edge.quantserve.com +www.edirectory.co.uk +www.edle-stuecke.de +www.edmedsnow.com +www.edomz.com +www.edu-offer.com +www.education-rewardpath.com +www.eelsoup.net +www.eeme7j.win +www.effectivebrand.com +www.effectivemeasure.net +www.efficienttraffic.com +www.eflbruwqt.ru +www.eftps.com +www.eglobalcentral.pl +www.egoldenglove.com +www.ehg-rr.hitbox.com +www.eivamos.com +www.elc.tomsk.ru +www.electroneum.crypto-webminer.com +www.electronicpromotion.com +www.electronics-bonuspath.com +www.electronics-offer.net +www.electronics-rewardpath.com +www.electronicspresent.com +www.elisaart.it +www.eliteconcepts.com +www.elixmedia.com +www.ellads.com +www.eloqua.com +www.eltrafiko.com +www.em.dynamicyield.com +www.email-login-support.com +www.email.advertisingbox.com +www.email.urbaninsight.com +www.emailadvantagegroup.com +www.emaildeals.biz +www.emailproductreview.com +www.emarketmakers.com +www.emjcd.com +www.employee.siliconorchard.com +www.emrlogistics.com +www.en-studiotraining.inmobi.com +www.enatimedia.com +www.enchantier.com +www.encoding.ovh +www.end.scorecardresearch.com +www.eng.tapjoy.com +www.engagio.com +www.engineering.chartboost.com +www.engineering.innovid.com +www.engineering.outbrain.com +www.engineering.tapad.com +www.enhance.com +www.enigmasoftware.com +www.enoratraffic.com +www.entercasino.com +www.enterprise-box.count.ly +www.entertainment-rewardpath.com +www.entertainment-specials.com +www.ep.ifc.inmobi.com +www.epicgameads.com +www.epm.marketo.net +www.epmads.com +www.epom.com +www.ermaseuc.ru +www.ero-adverising.com.ero-advertising.com +www.ero-advertising.com +www.erodynamics.nl +www.eroyear.ru +www.errornuker.com +www.ertya.com +www.escapicon.net +www.eshopads2.com +www.estat.com +www.estats4all.com +www.esttrk.com +www.et-code.ru +www.et-integration.dynamicyield.com +www.etacontent.com +www.etahub.com +www.eth-pocket.com +www.eth-pocket.de +www.eth-pocket.eu +www.ethereum-pocket.de +www.ethereum-pocket.eu +www.ethtrader.de +www.etlrsq.ru +www.etn.spacepools.org +www.etracker.de +www.etraffic.com +www.etzbnfuigipwvs.ru +www.eu.cdn.survey.medallia.com +www.eucsoft.com +www.euroconcept.ro +www.europaheizung.de +www.europcareer.com +www.europerank.com +www.euros4click.de +www.evaairline.com +www.evengparme.com +www.eventlog.adx1.com +www.events.advidi.com +www.events.amplitude.com +www.events.gumgum.com +www.events.marketo.com +www.everestjs.net +www.everifymatch.com +www.everydaygays.com +www.evidencenuker.com +www.ewr.vpn.sizmek.com +www.exactadvertising.com +www.exacttarget.com +www.exasharetab.com +www.exbays.com +www.exchange-it.com +www.exchange.analyticson.com +www.exchange.bg +www.exchange.panadvert.com +www.exchangead.com +www.exclusive-games.website +www.exclusivegiftcards.com +www.exe-file.de +www.exit-ad.de +www.exitforcash.com +www.exitmoney.com +www.exoclick.com +www.exp.mxptint.net +www.experclick.com +www.express.maxpoint.com +www.expressomatogrosso.com.br +www.ext.dynamicyield.com +www.extend.tv +www.extranet.dotomi.com +www.extreme-dm.com +www.extremereach.com +www.exttrem.de +www.eyeblaster-bs.com +www.eyes.by +www.eyewonder.com +www.ezwebsitetraffic.com +www.f1tbit.com +www.fabioalbini.com +www.fabrics-store.com +www.fabryka-nagrod.com +www.face2trade.com +www.facebook.cm +www.facebook.realtorarcf.com +www.facebook.sizmek.com +www.facebookcrawl.co.cc +www.facebookloginsignin.com +www.facebookunblocking.com +www.faces.fiksu.com +www.facturacion.facebook-ads.adtz.com +www.faggotry.com +www.fajnefanty.com +www.falkag.de +www.family-offer.com +www.family-partners.fr +www.fasadobygg.com +www.fashionhunter.net +www.fast-adv.it +www.fastcash-ad.biz +www.fastcounter.linkexchange.nl +www.fastdownload10.com +www.fastnclick.com +www.fastusersonline.com +www.fatcatrewards.com +www.fatisin.ru +www.favicon.com +www.fbapp1.theappgrader.com +www.fblaster.com +www.fdc.tapjoy.com +www.fdtpyqqsnzxvt.ru +www.feaecebook.com +www.federicksofhollywood.com +www.feedjit.com +www.feedstermedia.com +www.feiyang163.com +www.fellent.eu +www.festival.lisnr.com +www.fetisch-pornos.cxa.de +www.feyads.com +www.fhserve.com +www.ficken-ficken-ficken.cxa.de +www.ficken-xxx.cxa.de +www.fictioncinema.com +www.fiduciariobajio.com.mx +www.fif49.info +www.fiksu.com +www.filedeposit.eu +www.filefortune.com +www.fileoasis.net +www.files-download.xcc24.pl +www.files.sharethrough.com +www.fili.cc +www.fili.tv +www.finance-offer.com +www.finance.vicedata.com +www.financeforum.ru +www.financial-advice-books.com +www.finanzmarkt2004.de +www.findalgorithm.com +www.finder.cox.net +www.fineclicks.com +www.fiocchidiriso.com +www.firebanner.com +www.firewall.juicemobile.com +www.fischereszter.hu +www.fishclix.com +www.fitnesshealthreporter.com +www.fixcleaner.com +www.fk.adx1.com +www.flagcounter.com +www.flare-analytics.com +www.flashadtools.com +www.flashcasino.com +www.flashx.co +www.flexibleadmin.com +www.flnqmin.org +www.flowers-offer.com +www.flowtec.com.br +www.flu23.com +www.flurry.com +www.flyertown.ca +www.flyingcroc.com +www.fmcurling.org +www.fncash.com +www.focalex.com +www.focustraining.intelsad.com +www.folloyu.com +www.food-drink-bonuspath.com +www.food-drink-rewardpath.com +www.food-offer.com +www.foodmixeroffer.com +www.forboringbusinesses.com +www.foreclousure.com +www.foreclousures.com +www.forex-instruments.info +www.forexyestrader.pl +www.formacionprofesional.webuda.com +www.formalyzer.com +www.formessengers.com +www.fortrader.ru +www.forum.ithealth.ru +www.fosamobi.com +www.fotoidea.com +www.foxcounter.com +www.foxx.to +www.fpcclicks.com +www.fpcpopunder.com +www.fpctraffic.com +www.fpctraffic2.com +www.fqtag.com +www.frameptp.com +www.franklyinc.com +www.free-choices.com +www.free-counters.net +www.free-gift-cards-now.com +www.free-gifts-comp.com +www.free-hardcoresex.org +www.free-laptop-reward.com +www.free-toplisten.at +www.free4faucet.com +www.freeadguru.com +www.freebiegb.co.uk +www.freebiesms.co.uk +www.freebitco.in +www.freebitmoney.com +www.freecamdollars.com +www.freecameraonus.com +www.freecameraprovider.com +www.freecamerasource.com +www.freecamerauk.co.uk +www.freecamsecrets.com +www.freecamsexposed.com +www.freecontent.bid +www.freecontent.com +www.freecontent.date +www.freecontent.download +www.freecontent.faith +www.freecontent.info +www.freecontent.loan +www.freecontent.net +www.freecontent.party +www.freecontent.racing +www.freecontent.review +www.freecontent.science +www.freecontent.stream +www.freecontent.trade +www.freecontent.win +www.freecoolgift.com +www.freecounter.it +www.freedailydownload.com +www.freedesignerhandbagreviews.com +www.freedinnersource.com +www.freedownloadzone.com +www.freedvddept.com +www.freeelectronicscenter.com +www.freeelectronicsdepot.com +www.freeelectronicsonus.com +www.freeelectronicssource.com +www.freeentertainmentsource.com +www.freeezinebucks.com +www.freefoodprovider.com +www.freefoodsource.com +www.freeforums.org +www.freefuelcard.com +www.freefuelcoupon.com +www.freegasonus.com +www.freegasprovider.com +www.freegiftcardsource.com +www.freegiftreward.com +www.freehitwebcounters.com +www.freeipodnanouk.co.uk +www.freeipoduk.co.uk +www.freeipoduk.com +www.freeitunestvshow.siliconorchard.com +www.freelaptopgift.com +www.freelaptopnation.com +www.freelaptopreward.com +www.freelaptopwebsites.com +www.freemaintenancesysforpcandmac.top +www.freemao.com +www.freenation.com +www.freenew.net +www.freeoffers-toys.com +www.freepayasyougotopupuk.co.uk +www.freeplasmanation.com +www.freepornsubmits.com +www.freerestaurantprovider.com +www.freerestaurantsource.com +www.freeserials.ws +www.freeshoppingprovider.com +www.freeshoppingsource.com +www.freespinwinner.win +www.freestat.ws +www.freestats.com +www.freestats.tv +www.freestats.ws +www.freeusersonline.com +www.freevideo.biz.nf +www.freewebsites.com +www.freewebtown.com +www.freo-stats.nl +www.frequencyscheduler.com +www.fresh-finance.pl +www.fresh-js.bitbucket.io +www.freshmarketer.com +www.freshrefresher.com +www.freshrefreshnerer186.info +www.freshrefreshnerer186rb.info +www.friend-card.com +www.friend-cards.com +www.friend-cards.net +www.friend-greeting.com +www.friend-greetings.com +www.friend-greetings.net +www.friendgreetings.com +www.friendgreetings.net +www.friendlyduck.com +www.frog.wix.com +www.froling.bee.pl +www.frontpagecash.com +www.frosinonewesternshow.it +www.frtya.com +www.frtyb.com +www.fruitice.realnetwrk.com +www.fruitlauncher.com +www.fs.corp.mparticle.com +www.fs.tidaltv.com +www.fs2.corp.mparticle.com +www.fsm-europe.eu +www.ftjcfx.com +www.ftp.adx1.com +www.ftp.freecontent.net +www.ftzivuesohvebj.ru +www.fuck.org +www.fuckbookdating.com +www.full-edition.info +www.fullstory.com +www.fulltraffic.net +www.fun.lbn.ru +www.fun2cell.net +www.funklicks.com +www.funnelchair.com +www.funtopliste.de +www.furnitureulimited.com +www.fusestats.com +www.fusionbanners.com +www.futeboltv.com +www.fwcs01.casalemedia.com +www.fxcounters.com +www.fxlayer.net +www.fxnow.ru +www.fxstra.com +www.fyber.com +www.fyxm.net +www.g.ezoic.net +www.g.scorecardresearch.com +www.gacatl.com +www.gaja79.com +www.galaxybetting.com +www.galileounaluna.com +www.gallery.vicedata.com +www.gallerytrafficservice.com +www.gamblerush.com +www.game-advertising-online.com +www.game-clicks.com +www.gameangel.com +www.gameatlas.com +www.gameconsolerewards.com +www.gameplaylabs.com +www.gamepor.com +www.games-toys-bonuspath.com +www.games-toys-free.com +www.games-toys-rewardpath.com +www.games.siliconorchard.com +www.games4u.ws +www.gamesfly.com +www.gamesharck.com +www.gamevance.com +www.garudaairlines.com +www.garybonnell.jp +www.gasthofpost-ebs.de +www.gateway.dynamicyield.com +www.gateway.ifc.inmobi.com +www.gator.com +www.gatoradvertisinginformationnetwork.com +www.gayxperience.com +www.gbcash.com +www.gcdn.ssacdn.com +www.gcmadvertising.com +www.gemius.mgr.consensu.org +www.gemius.pl +www.gen2server.com +www.genforumgenealogy.com +www.geniustrainer.net +www.gennaroespositomilano.it +www.geolocation.performgroup.com +www.geoplugin.net +www.geoworldonline.com +www.ger.cdn.survey.medallia.com +www.get-avast.com +www.get-quadcleaner.com +www.get.amplitude.com +www.get.appsee.com +www.get.appsflyer.com +www.get.qualtrics.com +www.getacool100.com +www.getacool500.com +www.getacoollaptop.com +www.getacooltv.com +www.getagiftonline.com +www.getambassador.com +www.getcryptotab.com +www.getfilemacgetdmg.com +www.getfilesmact.com +www.getiton.com +www.getlink.pw +www.getloan.com +www.getmyads24.com +www.getmyfreebabystuff.com +www.getmyfreegear.com +www.getmyfreegiftcard.com +www.getmyfreelaptop.com +www.getmyfreelaptophere.com +www.getmyfreeplasma.com +www.getmylaptopfree.com +www.getmyplasmatv.com +www.getrockerbox.com +www.getsearchlist.com +www.getsitecontrol.com +www.getsmart.com +www.getspecialgifts.com +www.getstatistics.se +www.getyourfreecomputer.com +www.getyourfreetv.com +www.gewinnspiele-slotmachine.de +www.gezinti.com +www.ghostboard.io +www.ghostbook.siliconorchard.com +www.giftcardchallenge.com +www.giftcardsurveys.us.com +www.giftfunnew.com +www.giftrewardzone.com +www.gifts-flowers-rewardpath.com +www.gilvision.com +www.gimmethatreward.com +www.git.corp.mparticle.com +www.git.lisnr.com +www.gitgrub.pro +www.glancecdn.net +www.glasslytics.com +www.gliamicidellunicef.it +www.globalcharge.com +www.globalintergold.com +www.globalsight.adx1.com +www.globe7.com +www.glxgroup.com +www.gmads.net +www.gmcjjh.org +www.gnomihalkidikis.gr +www.gnrdomimplementation.com +www.gns-consola.com +www.go-free-gifts.com +www.go.ezoic.net +www.go.mparticle.com +www.go.paradym.com +www.go.sonobi.com +www.go.taboola.com +www.go2jump.org +www.go777site.com +www.goat.cx +www.goatse.bz +www.goatse.ca +www.goatse.cx +www.goatse.ru +www.goatsegirl.org +www.gobba.myeffect.net +www.gobuyersupport.rubiconproject.com +www.gofreegifts.com +www.goggl.com +www.goggle.com +www.gohenry.pinterest.adtz.com +www.gojiberry500.pl +www.gold-city.it +www.goldadvert.cz +www.goody-garage.com +www.googkle.com +www.google-analytics.com +www.google-docs.info +www.google-docs.org +www.googleadservices.com +www.googletagmanager.com +www.googletagservices.com +www.googlew.com +www.googlewordpad.info +www.googlre.com +www.googlwe.com +www.googmel.win +www.goolegames.com +www.goolges.com +www.gopeds.com +www.gopogle.com +www.gopopup.com +www.gotime.backtrace.io +www.goxmrminer.com +www.gozatar.com +www.gpu4001.ds.ams1.inmobi.com +www.gpu4001.ds.ev1.inmobi.com +www.grabbit-rabbit.com +www.grabfile.co +www.grabflashsign.win +www.graft.crypto-webminer.com +www.graftpool.ovh +www.grandonmedia.com +www.graphly.io +www.gratis-counter-gratis.de +www.gratis-toplist.de +www.gratisweb.com +www.graylog.ops.ams1.inmobi.com +www.graylog.ops.dfw1.inmobi.com +www.graylog.ops.dfw2.inmobi.com +www.graylog.ops.pek1.inmobi.com +www.greasypalm.com +www.greenindex.dynamic-dns.net +www.grid.bidswitch.net +www.gridcash.net +www.gridiogrid.com +www.grmtech.net +www.grouphappy.com +www.groupm.com +www.grp.dynamicyield.com +www.grumman.pl +www.gryjava.gsm.pl +www.grz67.com +www.gtradersoft.com +www.guaranty.com.cn +www.guesstheview.com +www.guestwifi.marketo.net +www.gumgum.com +www.guptamedianetwork.com +www.gvc.vn +www.gwmtracker.com +www.gxplugin.com +www.h-api-ms.online-metrix.net +www.h-api-test.online-metrix.net +www.h-api.online-metrix.net +www.h-bid.com +www.h-sdk.online-metrix.net +www.h21.ru +www.hackathon.dynamicyield.com +www.hai2u.com +www.hakerzy.net +www.hallaert.online +www.handyarchive.com +www.haoyunlaid.com +www.happydiscountspecials.com +www.hardware4freaks.de +www.harmonyhollow.net +www.hashforcash.us +www.hashing.win +www.hashto.cash +www.hashvault.pro +www.hatcalter.com +www.hausnet.ru +www.hb.adx1.com +www.hb.kumma.com +www.hbeuwgqt.ru +www.health-beauty-rewardpath.com +www.health-beauty-savingblvd.com +www.healthbeautyncs.com +www.healthclicks.co.uk +www.healthyaltprods.com +www.heaptickets.com +www.heartrevitalized.com +www.heatmap.it +www.heavenbet.com +www.hebdotop.com +www.hegrinhar.com +www.heimlich-gefilmt.cxa.de +www.helix.inmobi.com +www.helixuat.inmobi.com +www.helltraffic.com +www.help.fullstory.com +www.help.onlinesucces.nl +www.helpme.rubiconproject.com +www.helpmedownload.com +www.hemnes.win +www.hentaidatabase.com +www.herbalsmokeshops.com +www.heroku.jsrdn.com +www.hertzsales.com +www.heusmarketing.nl +www.hey.lt +www.hgtzz.com +www.hibids10.com +www.hide.ovh +www.hidebux.com +www.hidemyass.com +www.hightrafficads.com +www.hiperstat.com +www.histats.com +www.historykill.com +www.hit-counter-download.com +www.hit-counts.com +www.hit-now.com +www.hit.gemius.pl +www.hitbox.com +www.hitboxwireless.com +www.hitcpm.com +www.hitekshop.vn +www.hitmaster.de +www.hitpro.us +www.hitslink.com +www.hitstats.co.uk +www.hittracker.org +www.hjaoopoa.top +www.hjnbvg.ru +www.hlpidkr.ru +www.hlserve.com +www.hnskorea.co.kr +www.hobwelt.com +www.hodlers.party +www.hodling.faith +www.hoerbird.net +www.holiday-gift-offers.com +www.holidayproductpromo.com +www.holidayshoppingrewards.com +www.holika.com +www.home-garden-premiumblvd.com +www.home-garden-rewardempire.com +www.home-garden-rewardpath.com +www.home.tapjoy.com +www.home4bizstart.ru +www.homedepoy.com +www.homeelectronicproducts.com +www.homeoffun.com +www.homeslice.appboy.com +www.homewares.org +www.homrdepot.com +www.honcode.ch +www.hookedmediagroup.com +www.hooli.adrizer.com +www.hooqy.com +www.horrorscopeme.ml +www.hospedar.xpg.com.br +www.host-it.co.uk +www.hostadserver.com +www.hostedbanners.com +www.hostedfiles.net +www.hostingcloud.accountant +www.hostingcloud.bid +www.hostingcloud.date +www.hostingcloud.download +www.hostingcloud.faith +www.hostingcloud.loan +www.hostingcloud.party +www.hostingcloud.racing +www.hostingcloud.review +www.hostingcloud.science +www.hostingcloud.stream +www.hostingcloud.trade +www.hostingcloud.win +www.hostmyportfolio.com +www.hot-bot.com +www.hot-daily-deal.com +www.hot-product-hangout.com +www.hot2015rewards.com +www.hotchatdate.com +www.hotdogsandads.com +www.hoteing.intelsad.com +www.hotelroom.co +www.hotgiftzone.com +www.hotkeys.com +www.hotlog.ru +www.hotranks.com +www.hotspotshield.com +www.howtocleanacomputervirus.com +www.howtotroll.org +www.hrfziiddxa.ru +www.htmate2.com +www.httpp.gdn +www.huaxintrip.com +www.huberts-kochseite.de +www.hubtraffic.com +www.hudson.adx1.com +www.hugedomains.com +www.humanclick.com +www.huren-verzeichnis.is4all.de +www.hustlercash.hit.bg +www.hw-ad.de +www.hxtrack.com +www.hypercounter.com +www.hypertracker.com +www.hyvf65qiht.us +www.i-games.biz +www.i.jsrdn.com +www.i.lsimg.net +www.i.matheranalytics.com +www.iadsdk.apple.com +www.iam.inmobi.com +www.ibis.cz +www.iboard.com +www.ibps.com +www.ibv.doubleclick.rtb.adx1.com +www.iccee.com +www.icecars.com +www.icentric.net +www.icityfind.com +www.icoocash.com +www.icracks.net +www.icybrand.eu +www.idealcasino.net +www.identity.mparticle.com +www.idirect.com +www.ieginc.com +www.iesnare.co.uk +www.iesnare.com +www.ifastnet.com +www.ifc-ep.inmobi.com +www.ifc-iip.w.inmobi.com +www.ifc.auth.inmobi.com +www.ifc3.inmobi.com +www.ifileyou.com +www.iframes.us +www.igame4free.com +www.igdxzzeglrlqm.ru +www.igrid.org +www.ihaberadserver.com +www.ihdvilappuxpgiv.ru +www.iicdn.com +www.ijacko.net +www.ikea.122.2o7.net +www.il-vpn.taboola.com +www.ilovecheating.com +www.ilovemobi.com +www.ilsip.sizmek.com +www.imads.ero-advertising.com +www.imap.adx1.com +www.imces.inmobi.com +www.imcounting.com +www.imhvlhaelvvbrq.ru +www.imiclk.com +www.immobaustein.de +www.impresionesweb.com +www.impressionaffiliate.com +www.impressionaffiliate.mobi +www.impressionlead.com +www.impressionperformance.biz +www.imprev.com +www.imrworldwide.com +www.imrworldwide.com.au +www.imysurvey.com +www.in.analytics.glance.inmobi.com +www.in.api.glance.inmobi.com +www.incentaclick.com +www.incentive-scene.com +www.incentivegateway.com +www.incentivenetworks2.com +www.incentiverewardcenter.com +www.incestdot.com +www.incestgold.com +www.inckamedia.com +www.indesignstudioinfo.com +www.indexerflash.com +www.indiads.com +www.indiaonclick.com +www.ineedhits.com +www.inevo.co.il +www.infamylists.com +www.infinite-ads.com +www.infinityads.com +www.info.amplitude.com +www.info.com +www.info.engagio.com +www.info.sizmek.com +www.infolinia-kontakt-telefon.pl +www.infopaypal.com +www.infor.marketolive.com +www.informacja-dnia.com +www.infosec.corp.inmobi.com +www.infotelsrl.com +www.infra.by +www.ingorob.com +www.ininmacerad.pro +www.inlocomedia.com +www.inmobi.com +www.innatek.com +www.innovid.com +www.inpagevideo.nl +www.ins-offer.com +www.inside.getambassador.com +www.insiderp.rubiconproject.com +www.insightexpress.com +www.insights.algolia.io +www.insights.evidon.com +www.insights.marketingmachine.co.za +www.insights.maxpoint.com +www.inskinad.com +www.installfarm.com +www.instartlogic.com +www.instorm.com +www.insurance-rewardpath.com +www.integration.sharethrough.com +www.intel-dev-api.dynamicyield.com +www.intel-mock-api.dynamicyield.com +www.intel-mock.dynamicyield.com +www.intela.com +www.intelli-direct.com +www.intelli-tracker.com +www.intelligence.maxpoint.com +www.intellimize.co +www.intellisuggest.com +www.intellitxt.com +www.intelsad.com +www.intensecoin.crypto-webminer.com +www.interactivebrands.com +www.intercom.io +www.interest.maxpoint.com +www.interestingz.pw +www.interia-ek.ru +www.internal-clarity.idsp.inmobi.com +www.internal.revcontent.com +www.international-free-bank.com +www.internethistorycleaner.ws +www.internetsecurity.com +www.intersite.adrizer.com +www.interstats.nl +www.interstitialzone.com +www.intnet-offer.com +www.intranet.adtech.de +www.intucoin.crypto-webminer.com +www.investors.yext.com +www.invitefashion.com +www.inwemo.com +www.iovation.co.uk +www.iovation.com +www.ipbc.crypto-webminer.com +www.ipcounter.de +www.iperbanner.com +www.iphonegames3g.com +www.ipstat.com +www.ipv6.freebitco.in +www.iranwebads.com +www.irganalytics.com +www.irrrymucwxjl.ru +www.is1.clixgalore.com +www.isettatech.com +www.isfilebest.com +www.islamic-banners.com +www.islamipedia.org +www.isoftibest.com +www.ist-track.com +www.istats.nl +www.isuzi.com +www.italy.scorecardresearch.com +www.itcn.ssacdn.com +www.itcompany.com +www.ithd.exacttarget.com +www.itrackerpro.com +www.itsfree123.com +www.itsmyturn.nablabee.com +www.itsupport.outbrain.com +www.itunesdownloadstore.com +www.iubenda.com +www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com +www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwff.com +www.ivuovhsn.ru +www.ivwbox.de +www.iwantmy-freelaptop.com +www.iwantmyfree-laptop.com +www.iwantmyfreecash.com +www.iwantmyfreelaptop.com +www.iwantmygiftcard.com +www.iwanttodeliver.com +www.iws.ro +www.iwstats.com +www.ixvenhgwukn.ru +www.iybasketball.info +www.iyfnzgb.com +www.izalingi.com +www.jagi.buypixelads.com +www.jak-szybko-zarobic.com +www.janeaustenjoy.com +www.japan.inmobi.com +www.japanesevehicles.us +www.japanmadchen.com +www.japscat.org +www.japtron.es +www.japveny.ru +www.javascriptobfuscator.com +www.jcmarcadolib.com +www.jcwhiney.com +www.jcwhintey.com +www.jcwhitey.com +www.jdfabrication.com +www.jdoqocy.com +www.jebetting.com +www.jejuskypension.com +www.jellycounter.com +www.jersey-offer.com +www.jetlore.com +www.jetpackdigital.com +www.jetseeker.com +www.jhfdmiwcgnty.ru +www.jhondi33.duckdns.org +www.jivox.com +www.jiztini.com +www.jizzads.com +www.jl29jd25sm24mc29.com +www.jmp2click.com +www.jmpads.com +www.jobs.marketing365.mk +www.jobs.thirdpresence.com +www.johnfrieda.lisnr.com +www.joincreditexpert.co.uk +www.joinfree.ro +www.joinourwebsite.com +www.jolic2.com +www.joomlalivechat.com +www.josip-stadler.org +www.jouwstats.nl +www.jp.marketolive.com +www.jpush.io +www.jqassets.download +www.jqcdn.download +www.jqcdn01.herokuapp.com +www.jqcdn03.herokuapp.com +www.jqcdn2.herokuapp.com +www.jqr-cdn.download +www.jqrcdn.download +www.jque.net +www.jquerrycdn.download +www.jquery-cdn.download +www.jqwww.download +www.jqxrrygqnagn.ru +www.js-cdn.dynatrace.com +www.js.ad-score.com +www.js.coinhive.com +www.jsccnn.com +www.jscdndel.com +www.jscount.com +www.jsecoin.com +www.jshosting.bid +www.jshosting.date +www.jshosting.download +www.jshosting.faith +www.jshosting.loan +www.jshosting.party +www.jshosting.racing +www.jshosting.review +www.jshosting.science +www.jshosting.stream +www.jshosting.trade +www.jshosting.win +www.jsing.net +www.jsonip.com +www.jss.adroll.com +www.jssdks.mparticle.com +www.jsv.adserve.video +www.juedische-kammerphilharmonie.de +www.juiceadv.com +www.juicemobile.com +www.juicyads.com +www.junecleeland.com +www.jurty.ml +www.jurtym.cf +www.justhookup.com +www.juststatic.info +www.jwduahujge.ru +www.jwwhsqz.ru +www.jxliu.com +www.jzigsobgsmxdmr.bid +www.k.adx1.com +www.k5market.com +www.k5zoom.com +www.kaaza-legal.de +www.kajahdfssa.net +www.kalantzis.net +www.kalipasindra.online +www.kampanyatakip.net +www.kampyle.com +www.kaplanindex.com +www.karbowanec.crypto-webminer.com +www.kargo.com +www.kaspersky-shop.ch +www.katia-paliotti.com +www.kazaa.com +www.kbdiu5z8ah.us +www.kcta.or.kr +www.kdmkauchahynhrs.ru +www.kedtise.com +www.keen.io +www.keepass.fr +www.kennethjustice.com +www.ketchapp.org +www.keybinary.com +www.keyofhealth.com +www.keywordblocks.com +www.keywordmax.com +www.khingtracking.com +www.kickassratios.com +www.kids-in-sandbox.com +www.kidsangel.com +www.kidsinsandbox.info +www.kikesantander.com +www.killingtonchukka.pl +www.kinohabr.net +www.kinomarathon.ru +www.kipasdenim.com +www.kippbeak.cf +www.kisshentai.net +www.kitaramarketplace.com +www.kitaramedia.com +www.kitaratrk.com +www.kitchentablegang.org +www.kiwifarms.net +www.kixer.com +www.kjbbc.net +www.klamm-counter.de +www.klikasz-i-masz.com +www.klikbonus.com +www.klikdirect.com +www.klikijuz.com +www.kliksaya.com +www.klixmedia.com +www.km69.de +www.kmdl101.com +www.kmindex.ru +www.knacads.com +www.knowledge.vergic.com +www.koch-backrezepte.de +www.kochava.com +www.komodia.com +www.konimkan.com +www.konkursynagrody.pl +www.kontera.com +www.konversation.com +www.korea.inmobi.com +www.kowasaki.com +www.kpremium.com +www.kproxy.net +www.kqzyfj.com +www.krb.devphp.org.ua +www.kreaffiliation.com +www.kreativci.marketing365.mk +www.kredytybezbik.eu +www.ksimdw.ru +www.kuhdi.com +www.kumma-hb.hb.adx1.com +www.kunay.nullrefexcep.com +www.kvr-systems.de +www.kwbtgame.com +www.kwistal.nl +www.kxrcjhogag.ru +www.l.heatmap.it +www.lab.braze.com +www.labs.criteo.com +www.labs.tabmo.io +www.ladyclicks.ru +www.lan.datasecu.download +www.landing.analyticson.com +www.landingtest.mixpanel.com +www.lanonna.co.uk +www.lansrv050.com +www.lapiden.com +www.laptopreportcard.com +www.laptoprewards.com +www.laptoprewardsgroup.com +www.laptoprewardszone.com +www.larivieracasino.com +www.laserveradedomaina.com +www.lasthr.info +www.laugh-mail.com +www.laugh-mail.net +www.lcbcad.co.uk +www.lccl.org.uk +www.ldap01.adroll.com +www.ldaps.taboola.com +www.lduhtrp.net +www.le1er.net +www.leadback.netseer.com +www.leadgenetwork.com +www.leadgreed.com +www.leadingedgecash.com +www.leadpub.com +www.leads.demandbase.com +www.leadtrackgo.com +www.learn.bizible.com +www.learn.marketo.com +www.learn.mixpanel.com +www.learning-offer.com +www.learning.braze.com +www.lecap-services.fr +www.ledhenone.com +www.ledinund.com +www.lefos.net +www.legal-rewardpath.com +www.legendofdragoon.com +www.leisure-offer.com +www.lejournaldescarrieres.com +www.lemonparty.biz +www.lemonparty.org +www.lens.data.inmobi.com +www.lens.secondry.data.dfw1.inmobi.com +www.lesben-pornos.cxa.de +www.letssearch.com +www.lib.bmst.pw +www.lib.coin-hive.com +www.lib.xmrm.pw +www.libecki.net +www.librenms.svc.insnw.net +www.liders.biz +www.lifeeverest.com +www.lifeforminc.com +www.lifelabs.vn +www.lifestreet.com +www.light.browsermine.com +www.lightminer.co +www.liitt.us +www.lijit.com +www.likeminer.nablabee.com +www.likeportal.com +www.likespike.com +www.likethis.mbosoft.com +www.likethislist.biz +www.linconpark.com +www.link.dynamicyield.com +www.link.krxd.net +www.linkads.de +www.linkbucks.com +www.linkbuddies.com +www.linkconnector.com +www.linkcounter.com +www.linkfame.com +www.linkhut.com +www.linkpulse.com +www.linkredirect.biz +www.linkreferral.com +www.links-and-traffic.com +www.links-private-krankenversicherung.de +www.linksalpha.com +www.linkshare.com +www.linksourcetrack.com +www.linktarget.com +www.linkwithin.com +www.linkworth.com +www.lintelligence.de +www.liqwid.mgr.consensu.org +www.liqwid.net +www.lisnr.com +www.litec-fr.com +www.litra.com.mk +www.little-help.com +www.littledevildoubt.com +www.liu1n.adx1.com +www.live.4480.org +www.live.viewsignage.com +www.liveadclicks.com +www.liveadexchanger.com +www.livecount.fr +www.livefyre.com +www.livejasmin.com +www.livestat.com +www.livestatsnet.services +www.livewebstats.dk +www.livewell.net +www.lldiettracker.com +www.llnw.ssacdn.com +www.lmeeulcfttqv.ru +www.lmodr.biz +www.lnktime.com +www.loading-delivery2.com +www.loboclick.com +www.localh0st.info +www.localytics.com +www.locations.yext.com +www.log.adx1.com +www.log.getadblock.com +www.log.intellimize.co +www.loggerx.com +www.logging.to +www.login.adx1.com +www.login.auth.mparticle.com +www.login.dotomi.com +www.login.k8s-test.fiksu.com +www.login.rubiconproject.com +www.logs.palebrook.wbinsights.com +www.lolhello.com +www.lolshock.com +www.loltrain.com +www.lomalindasda.org +www.lonelycheatingwives.com +www.lonelywifehookup.com +www.longtraffic.com +www.looker.corp.mparticle.com +www.looker.dev.corp.mparticle.com +www.lookvision.info +www.lootsie.com +www.losital.ru +www.lostartofbeingadame.com +www.lottoforever.com +www.lottoga.com +www.lovecouple.ru +www.lovendo.it +www.lovetrust.ru +www.lowes-pianos-and-organs.com +www.lp.outbrain.com +www.lpage.piwik.pro +www.lpcloudsvr302.com +www.lpmxp2014.com +www.lpmxp2015.com +www.lpmxp2016.com +www.lpmxp2017.com +www.lpmxp2018.com +www.lpmxp2019.com +www.lpmxp2020.com +www.lpmxp2021.com +www.lpmxp2022.com +www.lpmxp2023.com +www.lpmxp2024.com +www.lpmxp2025.com +www.lpmxp2026.com +www.lpmxp2027.com +www.lprshcsmijfovp.com +www.lpweb.altervista.org +www.lrp.mxptint.net +www.lt202.tritondigital.com +www.ltstyov.ru +www.luce.polimi.it +www.luchtenbergdecor.com.br +www.lucky-day-uk.com +www.luckyday.world +www.lucyfeed.com +www.lufhansa.com +www.lufthansaairlines.com +www.lufthanza.com +www.lycosgamesville.com +www.lync.adx1.com +www.lync10.adx1.com +www.lyncdiscover.adx1.com +www.lyncdiscover.undertone.com +www.lyncext.adx1.com +www.lyoness.com +www.lyzgs.com +www.lzjl.com +www.m-99.co.uk +www.m-barati.de +www.m-freeway.com +www.m.adx1.com +www.m.preapps.com +www.m1crosoft.com +www.m2trk.com +www.m4f.adx1.com +www.maatch.com +www.maaxmarket.com +www.mac.com-w.net +www.macaheadapps.com +www.macfillerck.com +www.macombdisplayads.com +www.maconbraves.com +www.magellen.com +www.magento.marketolive.com +www.mahindrainsurance.com +www.mail.adswizz.com +www.mail.datamark.net +www.mail.demandbase.com +www.mail.maxpoint.com +www.mail.ny.contextweb.com +www.mail.tritondigital.com +www.mailforfreedom.com +www.mainadv.com +www.mainteck-fr.com +www.makohela.tk +www.malkm.com +www.manage.sharethrough.com +www.mangayhentai.com +www.mansmith.net +www.map.vicedata.com +www.mapqueat.com +www.mapquestt.com +www.marcopolo.uk.net +www.marinoderosas.com +www.mariuspetrescu.gq +www.markbruinink.nl +www.market-buster.com +www.marketbill.com +www.marketing-rewardpath.com +www.marketing.dynamicyield.com +www.marketing.vicedata.com +www.marketing365.mk +www.marketingmachine.co.za +www.marketo.com +www.marketolive.com +www.marketplace.analyticson.com +www.marketscore.com +www.marss.eu +www.marygoroud.ga +www.masari.crypto-webminer.com +www.masterspace.biz +www.mastertracks.be +www.mataharirama.xyz +www.mathenea.com +www.mavericks.marketo.com +www.max-mara.pinterest.adtz.com +www.maxbounty.com +www.maxonclick.com +www.maxpoint.com +www.maxregistrycleaner.com +www.maxregistrycleaner.net +www.maxxxhits.com +www.maybankard.com.my +www.mb01.com +www.mb102.com +www.mb57.com +www.mcsqd.com +www.measuread.com +www.meatspin.biz +www.meatspin.com +www.mebablo.com +www.media-motor.com +www.media.analyticson.com +www.media.netseer.com +www.media2.travelzoo.com +www.mediabarterexchange.com +www.mediabong.net +www.mediadirectx.com +www.mediahighway.net +www.mediaparade.net +www.mediaplanner.inmobi.com +www.mediaplanner.uat.inmobi.com +www.mediareps.com +www.medias.analyticson.com +www.mediatraffic.com +www.mediavine.com +www.medical-offer.com +www.medical-research-books.com +www.medical-rewardpath.com +www.medleyads.com +www.medtecchina.com +www.meetic-partners.com +www.megabanners.cf +www.megacounter.de +www.megagiftcity.com +www.meganiusy.com +www.megastats.com +www.mellowads.com +www.menshealthweb.co +www.merchantapp.com +www.mercuras.com +www.merlin.co.il +www.merryholidays.org +www.messagetag.com +www.metacount.com +www.metaps.com +www.metareward.com +www.metavertising.com +www.methodcasino2015.com +www.methode-binaire.com +www.metrics.brightcove.com +www.metrics.clickconvertsell.com +www.metrics.daveandbusters.com +www.metrics.fidelity.com +www.metrics.kampyle.com +www.metrics.marketing365.mk +www.metrics.panadvert.com +www.metrics.rent.com +www.metricsimage.com +www.mfio.cf +www.mftracking.com +www.mgid.com +www.mi-de-ner-nis3.info +www.microsoft-update.name +www.microsoft2010.com +www.micuentoes.intelsad.com +www.mightymagoo.com +www.mijnbladopdemat.nl +www.mikras.nl +www.milardi.it +www.milesdebanners.com +www.milkfountain.com +www.mine2-party.nablabee.com +www.minecrunch.co +www.minekitten.io +www.minemytraffic.com +www.miner.nablabee.com +www.miner.shareasale.com +www.minerclaim.net +www.minercry.pt +www.minero-proxy-01.now.sh +www.minero-proxy-02.now.sh +www.minero-proxy-03.now.sh +www.minero.cc +www.minero.pw +www.minexmr.com +www.minexmr.stream +www.mining.coin-hive.com +www.ministryofads.com +www.minr.browsermine.com +www.minr.nullrefexcep.com +www.minr.pw +www.miscws002.coinhive.com +www.miscws005.coinhive.com +www.miscws009.coinhive.com +www.miscws013.coinhive.com +www.miscws016.coinhive.com +www.miscws018.coinhive.com +www.miscws027.coinhive.com +www.miscws029.coinhive.com +www.mixedtraffic.com +www.mixpanel.com +www.mk.marketing365.mk +www.mkt.adx1.com +www.mktg-offer.com +www.mkto-panda123.music.blog +www.mktrack.com +www.mlc.maxpoint.com +www.mlc.mxptint.net +www.mlclick.com +www.mlib.browsermine.com +www.mlinktracker.com +www.mlntracker.com +www.mlstat.com +www.mm26.com +www.mmaaxx.com +www.mmc.center +www.mmgads.com +www.mmnetwork.mobi +www.mmpool.org +www.mmstat.com +www.mmtracking.com +www.mnbasd77.com +www.mnetads.com +www.mobilejmp.com +www.mobjmp.com +www.mochibot.com +www.modi4moda.com +www.mojezakupy.net +www.monad.network +www.mondoperaio.net +www.moneone.ga +www.monerise.com +www.monero-miner.com +www.monero-miner.net +www.monero.crypto-pool.fr +www.monero.crypto-webminer.com +www.monerominer.rocks +www.moneroocean.stream +www.monetate.net +www.monetizer101.com +www.money-maker-default.info +www.money4exit.de +www.moneywin24.com +www.mongoosemetrics.com +www.monitoringservice.co +www.monkeyball.osa.pl +www.monkeyminer.net +www.monsonis.net +www.montacarichi.it +www.moonbit.co.in +www.moonsade.com +www.mopub.com +www.morefreecamsecrets.com +www.morevisits.info +www.motivacionyrelajacion.com +www.motoren.ru +www.movie-port.ru +www.movieads.ero-advertising.com +www.moviedownloader.net +www.moviestarplanethack.info +www.mozebyctwoje.com +www.mp3downloadhq.com +www.mp3helpdesk.com +www.mp3playersource.com +www.mparticle.com +www.mpc.mxptint.net +www.mpc.nl.mxptint.net +www.mpd.mxptint.net +www.mpd.nl.mxptint.net +www.mpintelligence.maxpoint.com +www.mplayerdownloader.com +www.mpp.emea.mxptint.net +www.mpp.mxptint.net +www.mpression.net +www.mps.mxptint.net +www.mpsnare.iesnare.co.uk +www.mpsnare.iesnare.com +www.mpxxtrk.com +www.ms-mvp.org +www.msg-2.me +www.msgtag.com +www.mshelp247.weebly.com +www.msnsports.com +www.msp-hack.com +www.mspbooster.com +www.mstr.sharethrough.com +www.mtree.com +www.mudfall.com +www.mudmonster.org +www.mueller-holz-bau.com +www.multipops.com +www.munchkin.marketo.net +www.mup.amp.mcafee.com +www.mutuza.win +www.mvav.com +www.mwor.gq +www.mx1.absum.ru +www.mx2.absum.ru +www.mx3.absum.ru +www.mxcdn1.now.sh +www.mxcdn2.now.sh +www.mxl.connexity.net +www.mxptint.net +www.my-reward-channel.com +www.my-rewardsvault.com +www.my-rigs.com +www.my-stats.com +www.my.evidon.com +www.myadsl.co.za +www.myadstats.com +www.myaffiliateprogram.com +www.myairbridge.com +www.mycashback.co.uk +www.mycelloffer.com +www.mychoicerewards.com +www.mycleanerpc.com +www.mycleanpc.com +www.mycleanpc.tk +www.mycpvlife.com +www.mydati.com +www.mydreamdegree.com +www.myduolife.com +www.myexclusiverewards.com +www.myfreecams.com +www.myfreedinner.com +www.myfreegifts.co.uk +www.myfreemp3player.com +www.mygiftcardcenter.com +www.mygreatrewards.com +www.mylike.co.uk +www.mylottoadserv.com +www.mylovecards.com +www.mylovelymommy.tk +www.myluvcrush.ca +www.myoffers.co.uk +www.myoffertracking.com +www.mypagerank.net +www.myreferer.com +www.myregeneaf.com +www.myroitracking.com +www.mysearch-engine.com +www.mysearch.com +www.myseostats.com +www.myshopmarketim.com +www.mysite.eloqua.com +www.mystat.pl +www.mystats.nl +www.mytestminer.xyz +www.mytotalsearch.com +www.mytraf.info +www.mytraf.ru +www.myuitm.com +www.myusersonline.com +www.mywebsearch.com +www.myworld.com +www.mywot.com +www.mywot.net +www.n131adserv.com +www.n149adserv.com +www.na47.com +www.nablabee.com +www.nagios.dynamicyield.com +www.naiadsystems.com +www.najlepszedlaciebie.com +www.nakhit.com +www.nalook.com +www.nanoadexchange.com +www.naszasa.pl +www.nathetsof.com +www.nation.marketo.com +www.nationalissuepanel.com +www.nationalsurveypanel.com +www.nativesdks.mparticle.com +www.naturalgrowthstore.biz +www.naturesunshine.com +www.naughty-traffic.com +www.nbcsearch.com +www.nbrtrack.com +www.ncsreporting.com +www.nctracking.com +www.nddmcconmqsy.ru +www.ndparking.com +www.nearbyad.com +www.nebabrop.com +www.nedstat.co.uk +www.nedstat.com +www.nedstat.nl +www.needadvertising.com +www.needmorehits.com +www.neki.org +www.nelsongod.ca +www.neptuneads.com +www.ner-de-mi-nis-6.info +www.nerdorium.org +www.nero-us.com +www.nerohut.com +www.nestscape.com +www.net-pratique.fr +www.netagent.cz +www.netaporter-uk.pinterest.adtz.com +www.netcscape.com +www.netdirect.nl +www.netmaxx.com +www.netmng.com +www.netpalnow.com +www.netpaloffers.net +www.netpoll.nl +www.netscae.com +www.netseer.com +www.neumashop.cl +www.never.ovh +www.new.browsermine.com +www.new.panadvert.com +www.newclick.com +www.neweed.org +www.neweggstats.com +www.newpassporn.com +www.news6health.com +www.newscgp.com +www.newsletter.marketing365.mk +www.newsletters.panadvert.com +www.newsroom-help.taboola.com +www.newssourceoftoday.com +www.newsupport.dynamicyield.com +www.nexioniect.com +www.nextgenstats.com +www.nextlnk7.com +www.nextstudent.com +www.nexttime.ovh +www.neyscape.com +www.nfwebminer.com +www.ngads.com +www.niematego.tk +www.nikitinskysport.ru +www.nimiq.watch +www.nimiqpool.com +www.nimp.org +www.nine2rack.in +www.ningtoldrop.ru +www.ninjadollars.com +www.nissan.d3.sc.omtrdc.net +www.nitsche.top +www.noblock.pro +www.nobrain.dk +www.node.coin-hive.com +www.noowho.com +www.norespar.ru +www.northpoleitalia.it +www.nospartenaires.com +www.notaverde.com +www.nothing-but-value.com +www.nothingcompares.co.uk +www.notrecommended.co.uk +www.novaminers.tk +www.novastarled.com +www.novelsys.co +www.novemberrainx.com +www.nowgifttown.com +www.nowstat.com +www.npcdn1.now.sh +www.npttech.com +www.ns2.cryptotab.net +www.nsof-web.dynamicyield.com +www.nsrecord.org +www.ntdesk.de +www.ntkrnlpa.info +www.ntsearch.com +www.nu26.com +www.nubijlage.nl +www.nullrefexcep.com +www.nunu-001.now.sh +www.nutabuse.com +www.nutaku.com +www.nutten-verzeichnis.cxa.de +www.nuvon.com +www.nysubwayoffer.com +www.oainternet.com +www.obanner.net +www.obesitycheck.com +www.objectopoly.info +www.obyz.de +www.ocpersian.com +www.octopusgirl.com +www.odkrywamyzakryte.com +www.odliczamy.net +www.oei1.gq +www.oem.inmobi.com +www.offerent.com +www.offerx.co.uk +www.office.analyticson.com +www.officewebapps.foresee.com +www.officialrdr.com +www.ogondkskyahxa.ru +www.ohiomm.com +www.oiluk.net +www.oinadserve.com +www.oix.com +www.oix.net +www.ojolink.fr +www.ojrq.net +www.okexysylgzo.ru +www.oktrk.com +www.old.browsermine.com +www.oleg.adx1.com +www.omniture.com +www.on.nimp.org +www.on2url.com +www.onadstracker.com +www.onaudience.com +www.onclickpredictiv.com +www.onclicktop.com +www.one-door.com +www.onelife.eu +www.onestat.com +www.onestatfree.com +www.oneund.ru +www.online-ruletka.pl +www.online.sh.cn +www.online.tapjoy.com +www.onlineadmin.net +www.onlinebestoffers.net +www.onlinedownloads.org +www.onlineloan-personal.net +www.onlineslotmaschine.com +www.onlinesucces.nl +www.onlinewebservice3.de +www.onlyfreeoffersonline.com +www.ontheweb.com +www.onwardclick.com +www.oofun.com +www.opendownload.de +www.opendownloadmanager.com +www.opengdpr.mparticle.com +www.openinternetexchange.com +www.openkatalog.com +www.openload.de +www.openx.co.za +www.openx.net +www.opinionlab.com +www.oplaca-sie.pl +www.opt.use.dynamicyield.com +www.optiad.net +www.optimizely.com +www.optimum-hits.com +www.optout.inmobi.com +www.optout.mxptint.net +www.oralse.ca +www.oralse.cx +www.oreidofitilho.com.br +www.oreware.com +www.organiclife.com.pl +www.origin-gizmo.sizmek.com +www.originalicons.com +www.originscheduler.com +www.os-downloads.com +www.ostsee-schnack.de +www.osxserver1.oit.lijit.com +www.oszukacruletke.pl +www.otherinbox.com +www.otherossettlement.com +www.otosponsorki.pl +www.otsserver.com +www.ourfuckbook.com +www.outlinearray.com +www.outwar.com +www.over50datingservices.com +www.owa.dotomi.com +www.owa.exacttarget.com +www.oxiads.fr +www.oxp.emea.mxptint.net +www.oxp.mxptint.net +www.oxwwoeukjispema.ru +www.oz-offers.com +www.p.liadm.com +www.p.silverpush.co +www.p.tidafors.xyz +www.pagerank10.co.uk +www.painolympics.info +www.painolympics.org +www.panadvert.com +www.panazan.ro +www.panel.piwik.pro +www.pantanalvip.com.br +www.paperg.com +www.papoto.com +www.pardot.com +www.parkingcrew.net +www.parsads.com +www.parsely.com +www.partner-ads.com +www.partner.glance.inmobi.com +www.partner.googleadservices.com +www.partnerlab.braze.com +www.partners.analyticson.com +www.partners.celebrus.com +www.party-nngvitbizn.now.sh +www.party-vqgdyvoycc.now.sh +www.partycasino.com +www.pascal3.science +www.passbook.xtify.com +www.pathforpoints.com +www.pathful.com +www.patrickhickey.eu +www.pawnauctions.net +www.pay-pal.com-cgibin-canada.4mcmeta4v.cn +www.pay-per-search.com +www.paycounter.com +www.payn.me +www.paypal-exchange.com +www.paypalcz.cz +www.payperclickadvertising.org.uk +www.payperranking.com +www.paypopup.com +www.payusatax.com +www.pc-detox.com +www.pc-wallpapers.co.uk +www.pccleaner.com +www.pccleanerpro.com +www.pcejuyhjucmkiny.ru +www.pcmatic.com +www.pcmightymax.net +www.pcpitstop.com +www.pcregistrycleaner.com +www.pcsecurityshield.com +www.pdf-platinum.info +www.peachy18.com +www.peakclick.com +www.pearno.com +www.pebx.pl +www.peiceline.com +www.penix.nl +www.penwithian.co.uk +www.people-choice-sites.com +www.pepipo.com +www.perf.pardot.com +www.perfex.inmobi.com +www.performanceadexchange.com +www.performics.com +www.perimeterx.net +www.permissionresearch.com +www.persgroepadvertising.nl +www.persianstat.com +www.persianstat.ir +www.personalcare-offer.com +www.personalcashbailout.com +www.pertosj.ru +www.perupuntocom.com +www.petametrics.com +www.petpleasers.ca +www.petrafashion.com +www.petrenko.biz +www.petsmovies.com +www.pfaltzgraf.com +www.pfhsystem.com +www.pflexads.com +www.pgalvaoteles.pt +www.pgathailand.com +www.phoenixads.co.in +www.phone.sf.adroll.com +www.phonejapan.com +www.phorm.com +www.phormlabs.com +www.photo-ads.co.uk +www.php4you.biz +www.pi.adx1.com +www.pick-savings.com +www.picreel.com +www.pics.avs.io +www.picture-uploads.com +www.pieiron.co.uk +www.pieniadze-pieniadze.com +www.pills-home.com +www.pillsmoney.com +www.ping.getadblock.com +www.pinion.gg +www.pinterest.adtz.com +www.piwik.pro +www.pix.silverpush.co +www.pixazza.com +www.pixel.adcrowd.com +www.pixel.adpredictive.com +www.pixel.adrizer.com +www.pixel.adxtrem.com +www.pixel.affcamp.co.in +www.pixel.analyticson.com +www.pixel.aspirei.com +www.pixel.audienceinsights.net +www.pixel.audiensis.com +www.pixel.buypixelads.com +www.pixel.criteo.net +www.pixel.eazybiz.ng +www.pixel.intelsad.com +www.pixel.interactivesales.ru +www.pixel.leadnationmedia.com +www.pixel.marketing +www.pixel.moatads.com +www.pixel.netseer.com +www.pixel.pool.datamind.ru +www.pixel.surpasshosting.com +www.pixel.traffiliate.com +www.pixel.vicedata.com +www.pixel.wmadv.com +www.pixelpmm.info +www.pixeltrack66.com +www.placed.com +www.placelocal.com +www.placeyourview.com +www.plaimedia.com +www.plarium.com +www.plasmatv4free.com +www.plasmatvreward.com +www.platform.blismedia.com +www.platform.ifc.inmobi.com +www.platinumbucks.com +www.play.intellecthosting.net +www.player.innovid.com +www.player.mediabong.net +www.playerassist.com +www.playgril.com +www.playlott.com +www.playsataion.com +www.playstatation.com +www.playu.de +www.plds4001.grid.dfw1.inmobi.com +www.plexcoin.info +www.plexodds.com +www.plumsoftware.co.uk +www.pluto.mgr.consensu.org +www.pmp.mxptint.net +www.pocketgolf.host +www.poesiadelsud.it +www.pointclicktrack.com +www.pointroll.com +www.pokemonporno.com +www.poker-new.com +www.poker-unique.com +www.poker.cm +www.poker4spain.com +www.pokeradar.io +www.politicalopinionsurvey.com +www.pollmonkey.com +www.polnolunie.com +www.polskasupermarkecie.website +www.pool.bmnr.pw +www.pool.coinimp.com +www.pool.cryptonoter.com +www.pool.datamind.ru +www.pool2.coinimp.com +www.pop-under.xml.adx1.com +www.popads.ero-advertising.com +www.popadvert.com +www.popcornvod.com +www.poponclick.com +www.poppers-rush.ru +www.popunder.com +www.popunder.ru +www.popunderonly.com +www.popup.taboola.com +www.popupad.net +www.popupdomination.com +www.popupmoney.com +www.popuptraf.ru +www.popuptraffic.com +www.popuptrafic.com +www.porno-lesben.cxa.de +www.pornobanner.com +www.pornoboliviano.com +www.pornoinfantil.com +www.pornsponsors.com +www.port.bg +www.portafolio.intelsad.com +www.portal.lisnr.com +www.portal2.jsrdn.com +www.portaldimensional.com +www.portalrodzinny.pl +www.postads24.com +www.postlog.supersonic.com +www.postmasterbannernet.com +www.postmasterdirect.com +www.postnewsads.com +www.postrelease.com +www.powerlinks.com +www.powertradeprofit.com +www.poxudeli.ru +www.pozyczkanatelefon24.pl +www.ppc.clickconvertsell.com +www.ppctracking.net +www.ppd.clrstm.com +www.ppoi.org +www.pr-free.de +www.praceline.com +www.praxisww.com +www.prclick.inmobi.com +www.prdirectory.biz +www.preapps.com +www.prebid.org +www.precisioncounter.com +www.predictad.com +www.predictivadnetwork.com +www.predictivesearch.com +www.prefs.zemanta.com +www.premieropinion.com +www.premium-reward-club.com +www.premiumholidayoffers.com +www.premiumpedia.com +www.premiumproductsonline.com +www.premiumsmail.net +www.presentation.analyticson.com +www.presidency.site +www.pressurespot.com +www.prevalue.pl +www.prevent-asian-flu.com +www.prg-dev.kargo.com +www.prg.kargo.com +www.pricefbcf.gq +www.priiceline.com +www.primosearch.com +www.printmail.biz +www.priority.innovid.com +www.privacy-center.org +www.privatamateure.com +www.privdog.com +www.privy.com +www.prizes.co.uk +www.pro-partners.nl +www.pro.clanweb.cz +www.pro.webstat.pl +www.proascolcolombia.com +www.probabilidades.net +www.probusinesshub.com +www.product.sizmek.com +www.productopinionpanel.com +www.productresearchpanel.com +www.producttestpanel.com +www.professionalblackbook.com +www.professionalcash.com +www.profill-smd.com +www.profitsitesbiz.com +www.profitzone.com +www.proflashdata.com +www.program3.com +www.proj2018.xyz +www.projectwonderful.com +www.prolapseman.com +www.promo.amplitude.com +www.promo.com.au +www.promobenef.com +www.promotion-campaigns.com +www.propan.ru +www.proventus.com.pl +www.proxy-ddsjfhkmnk.now.sh +www.proxy-khlizawelj.now.sh +www.proxy.dynamicyield.com +www.proxy.nullrefexcep.com +www.proxy2.nullrefexcep.com +www.proxy3.nullrefexcep.com +www.proxy5.nullrefexcep.com +www.proxy7.nullrefexcep.com +www.proxy8.nullrefexcep.com +www.proxy9.nullrefexcep.com +www.prriceline.com +www.ps7894.com +www.psclicks.com +www.pscore-beta.pixel.printsites.net +www.pso-imbot.inmobi.com +www.pso.inmobi.com +www.pstats.com +www.ptraliplahndo.ru +www.pubdirecte.com +www.publisher.videmob.com +www.pubocean.com +www.pulse-uat.inmobi.com +www.pulse.inmobi.com +www.pulsepoint-platform.rtb.adx1.com +www.pulsix.com +www.pumpkin.co.uk +www.pumpsrus.com +www.punchsub.net +www.punishtube.com +www.pureadexchange.com +www.puroclean.com +www.purplehorses.net +www.purredheanb.online +www.pushspring.com +www.pussysaga.com +www.puush.in +www.pwc.tidaltv.com +www.px.dynamicyield.com +www.px24.com +www.pxi.pub +www.pythonpays.com +www.qa-dest.imprev.net +www.qa.api.curalate.com +www.qa.cdn.survey.medallia.com +www.qa.test.appsee.com +www.qa2-h-api.online-metrix.net +www.qaperf2-h-api.online-metrix.net +www.qaperf2-h.online-metrix.net +www.qbop.com +www.qitrck.com +www.qksrv.net +www.qksz.net +www.qlzwfzfatjth.ru +www.qpmsybxqvlje.ru +www.qssa.co.uk +www.qsstats.com +www.quad-cleaner.com +www.qualityindustrialcoatings.com +www.quantserve.com +www.quareclk.com +www.quickbitsdownloads.com +www.quickbrowsersearch.com +www.quickcash-system.com +www.quickcreditscore.co.uk +www.quinnwealth.com +www.quotes.gb.net +www.qwapi.com +www.qwertycoin.crypto-webminer.com +www.qzip.cjb.net +www.r2prod.com +www.racingandclassic.com +www.radiate.com +www.ralphreed.com +www.rampidads.com +www.ranchapptag.com +www.randki-sex.com +www.random-logic.com +www.randppro-cuts.com +www.ranking-charts.de +www.ranking-counter.de +www.ranking-hits.de +www.ranking-links.de +www.ranking.com +www.rankmaschine.de +www.rankyou.com +www.rapidcounter.com +www.rapidvideo.com +www.ratemodels.net +www.ratingtoplist.com +www.rauchentzug.de +www.ravel-rewardpath.com +www.rbkshort.info +www.rbp.emea.mxptint.net +www.rbp.mxptint.net +www.rc-studio.inmobi.com +www.rcom-staging.dynamicyield.com +www.rcom.dynamicyield.com +www.rd-direct.com +www.readnotify.com +www.realincestvideos.com +www.realinnovation.com +www.realist.gen.tr +www.realnetwrk.com +www.realtextads.com +www.realtracker.com +www.reaper.pulse.inmobi.com +www.reasedoper.pw +www.rebeccacella.com +www.rebuildxxsdrfght.yodelmobile.com +www.recreation-leisure-rewardpath.com +www.recruiting.shareasale.com +www.red.dmpxs.com +www.redactiepartners.nl +www.redemptionengine.com +www.redhotchilli.co.uk +www.redirectingat.com +www.redirectme.net +www.redroomnetwork.com +www.redsheriff.com +www.reducelnk.com +www.reduxmediia.com +www.reelcentric.com +www.refer.ru +www.referral.supersonic.com +www.refresh-js.bitbucket.io +www.refreshnerer27.info +www.refreshnerer27rb.info +www.refunevent.com +www.regdefense.com +www.regflow.com +www.registrarads.com +www.registry-clean-up.net +www.registry-cleaner.net +www.registry-error-cleaner.com +www.registrycleaner-reviews.net +www.registrycleanerforvista.com +www.registrycleanerpro.net +www.registrycleanersreviewed.com +www.registrycleanertechnology.com +www.registrycleanertop.com +www.registrydefender.com +www.registryfix.com +www.registrysweeper.com +www.reklam3.net +www.reklamzadserver.com +www.relevantknowledge.com +www.relmaxtop.com +www.remote.yodelmobile.com +www.remotepartition.com +www.remotrk.com +www.removearrest.com +www.rempko.sk +www.rencohep.com +www.renhertfo.com +www.rentfromart.com +www.reports.datamark.net +www.reports.inmobi.com +www.reports.vizury.com +www.res-x.com +www.researchnow.co.uk +www.resolvingserver.com +www.resources.inmobi.com +www.rest.dynamicyield.com +www.restaurant.viewsignage.com +www.restore-pc.com +www.retadint.com +www.returnpath.com +www.returnpath.net +www.revcontent.com +www.review.yext.com +www.revisitors.com +www.rewardblvd.com +www.rewardhotspot.com +www.rewardsflow.com +www.rewardsnow.co.uk +www.rewardszoneusa.com +www.rhydel.site +www.ribcagebags.com +www.riccardochinnici.it +www.richaudience.mgr.consensu.org +www.rickparty.com +www.rickrolling.com +www.rightmedia.com +www.rightmedia.net +www.rightstats.com +www.rineventrec.com +www.ringtonematcher.com +www.ringtonepartner.com +www.rintindown.com +www.rintinwa.com +www.riskymail4free.com +www.ristoromontebasso.it +www.rkdms.com +www.rlec-use.dynamicyield.com +www.rm.inmobi.com +www.rmawm7mw.top +www.roboinside.me +www.robtopol.in +www.rocks.io +www.rocnation.lisnr.com +www.roi.airpr.com +www.roispy.com +www.roktb.adx1.com +www.rokus-tgy.hu +www.rollbar.com +www.roltek.com.tr +www.romanticmaui.net +www.romepartners.com +www.ron.si +www.roosterfirework.com +www.root--servers.org +www.root.adx1.com +www.rooversadvocatuur.nl +www.rotator.buzzclicks.com +www.roulettebotplus.com +www.rovdyrdebatt.org +www.rovion.com +www.rowanmclean.com +www.rowherthat.ru +www.rscounter10.com +www.rsptrack.com +www.rst-velbert.de +www.rtab.adx1.com +www.rtb-lb1.impresionesweb.com +www.rtb.adx1.com +www.rtb.districtm.io +www.rtbdash.impresionesweb.com +www.rtbdsp.inmobi.com +www.rtcode.com +www.rubiconproject.com +www.rubiconproject.us +www.rubiks.ca +www.rubyfortune.com +www.ruclicks.com +www.rundeck.dynamicyield.com +www.rusdosug.nu +www.rushpay.pl +www.russian-sex.com +www.rwpads.net +www.s-et-rc-w.inmobi.com +www.s-et.w.inmobi.com +www.s.jsrdn.com +www.s.jwpltx.com +www.s.ml-attr.com +www.s12.urbaninsight.com +www.s14.urbaninsight.com +www.s1a.dynamicyield.com +www.s2d6.com +www.s2s.mparticle.com +www.s3.crypto-webminer.com +www.s7ven.com +www.sa44.net +www.sacredphoenix.com +www.sade-ecrivain.com +www.saemark.is +www.safelinkconverter.com +www.safelinking.net +www.safenetdir.com +www.safesoftware182.com +www.sagent.io +www.salamaleyum.com +www.salentoeasy.it +www.sales-live-events1.use.dynamicyield.com +www.salesonline.ie +www.salldo.de +www.samaclub.com +www.sample.adthrive.com +www.samplicio.us +www.samsclub33.pochta.ru +www.sankyo.gr.jp +www.sanoma-adverteren.nl +www.sanseracingteam.com +www.sasdiskcleaner.com +www.sasenergia.pt +www.save-plan.com +www.savings-specials.com +www.savings-time.com +www.savings2phone.siliconorchard.com +www.sayfabulunamadi.com +www.sayherbal.com +www.sbhmn-miner.com +www.sbo.it +www.sc.pages06.net +www.scaleway.ovh +www.scambiobanner.tv +www.scanmyphones.com +www.scanspyware.net +www.scantanzania.com +www.schedmemory.com +www.schuh-zentgraf.de +www.schwarz-weisses.de +www.schwule-boys-nackt.cxa.de +www.scoremygift.com +www.scotiaonline.scotiabank.salferreras.com +www.screen-mates.com +www.scrollbelow.com +www.sdfsf.freecontent.date +www.sdk-orion.appboy.com +www.sdkm.inmobi.com +www.sdlpgift.com +www.sea-dc01.marketo.net +www.sea-dc02.marketo.net +www.sea1.cdn.survey.medallia.com +www.seal-technicsag.ch +www.search.advertisingbox.com +www.search2007.info +www.searchacross.com +www.searchadv.com +www.searchapps.me +www.searchdiscovered.com +www.searchforit.com +www.searchfwding.com +www.searchignited.com +www.searchinquire.com +www.searchmachine.com +www.searchmagna.com +www.searchmagnified.com +www.searchnet.com +www.searchnigeria.net +www.searchnut.com +www.searchremagnified.com +www.searchresultsguide.com +www.searchtoexplore.com +www.searchv.com +www.searchwe.com +www.seasonalsamplerspecials.com +www.seb.scorecardresearch.com +www.sebcotrk.com +www.secondome.com +www.secretbehindporn.com +www.secretosx.com +www.secumine.net +www.secure-processingcenter.com +www.secure.audienceinsights.net +www.secure.audiensis.com +www.secure.impresionesweb.com +www.secure.lijit.com +www.secure.thirdpresence.com +www.secure.xml.adx1.com +www.secure0.adswizz.com +www.securecontactinfo.com +www.securemail.rubiconproject.com +www.securemypc.co.uk +www.securepaths.com +www.securerunner.com +www.securesignupoffers.org +www.security-check-551.com +www.securityscan.us +www.sedoparking.com +www.sedotracker.com +www.sedotracker.de +www.seductiveamateurs.com +www.seehits.com +www.seekbang.com +www.seekinstantly.com +www.seekways.com +www.sekel.ch +www.sekindo.com +www.selfpwn.org +www.selfservice.sizmek.com +www.selfsurveys.com +www.sellmeyourtraffic.com +www.sendfwd.com +www.sendori.com +www.sentrol.cl +www.seo-portal.ro +www.seoholding.com +www.seonetwizard.com +www.serials.ws +www.serie-vostfr.com +www.serv1.vizury.com +www.serv1swork.com +www.serv2ssl.vizury.com +www.servedby.advertising.com +www.server.extend.tv +www.serveradobe.co.cc +www.servertasarimbu.com +www.service.crypto-webminer.com +www.service4refresh.info +www.services.iad.appboy.com +www.services.syndicaster.tv +www.ses.adx1.com +www.set.tidaltv.com +www.sevenstars7.com +www.sexadvertentiesite.nl +www.sexcount.de +www.sexfind.com +www.sexinyourcity.com +www.sexmoney.com +www.sexpartnerx.com +www.sexsponsors.com +www.sextracker.com +www.sextronix.com +www.sexyads.net +www.sexytiger.ru +www.sf-3.st.adtekmedia.com +www.sfdc.clearbit.com +www.shafou.com +www.shakira2.lisnr.com +www.share-server.com +www.shareaholic.com +www.shareasale.com +www.shareaza.com +www.sharing-is-caring.info +www.shaw.analytics.xcal.tv +www.shc-rebates.com +www.shdfsdf.info +www.shinilchurch.net +www.shinystat.com +www.shinystat.it +www.shockcounter.com +www.shoofle.tv +www.shop.adx1.com +www.shop.analyticson.com +www.shopathome.com +www.shopcurbside.com +www.shopify-app.heatmap.it +www.shopperpromotions.com +www.shopping-artikel.de +www.shopping-offer.com +www.shoppingjobshere.com +www.shoppingminds.net +www.shoppingsiterewards.com +www.shops-malls-rewardpath.com +www.shoptosaveenergy.com +www.shore-view.com +www.showcaserealestate.net +www.shrink-service.it +www.sickrage.ca +www.sidekiq-status.appboy.com +www.sidekiq-status2.appboy.com +www.sieltre.it +www.signup.backtrace.io +www.signup.taboola.com +www.siliconorchard.com +www.siliconorchard.siliconorchard.com +www.siliconorchardau.siliconorchard.com +www.silimbompom.com +www.silveragesoftware.com +www.silvercash.com +www.silverpop.com +www.simpleco.in +www.simplecounter.net +www.simpli.fi +www.simplyhelper.com +www.sinera.org +www.singlesadnetwork.com +www.singular-cy.com +www.siom.ac.cn +www.sionicmedia.com +www.sip.foresee.com +www.sipext.exacttarget.com +www.sirius-expedition.com +www.site-id.nl +www.sitecounter.be +www.sitepalace.com +www.sitestat.com +www.sitestats.com +www.sitestatslive.com +www.sitetagger.co.uk +www.sitetracker.com +www.siteverification.site +www.sixsigmatraffic.com +www.sizzle-savings.com +www.sj-dc02.marketo.net +www.sj88.com +www.skassets.com +www.skattabrain.com +www.skype.maxpoint.com +www.skypeclass.com +www.skypefr.com +www.skyperec.com +www.slawop.net +www.slimak-pozyczki.pl +www.slivki.com.ua +www.slorent.com +www.slutloadlive.com +www.sm3na.com +www.smallbusiness.maxpoint.com +www.smart-m-system.com +www.smart-scripts.com +www.smartadserver.com +www.smartgiveaway.com +www.smartlinks.dianomi.com +www.smartlog.ru +www.smartredirect.de +www.smartscan.ro +www.smarttargetting.com +www.smetrics.aetn.com +www.smetrics.cnn.com +www.smichovbike.cz +www.smithwick.net +www.smokersopinionpoll.com +www.smrtb.com +www.smsmovies.net +www.smspop.com +www.smvpn.marketo.com +www.snahome.com +www.snapchat.adtz.com +www.sneakyboy.com +www.sochr.com +www.sociallypublish.com +www.societe.mgr.consensu.org +www.softcha.com +www.softmania.pl +www.software-phile.com +www.soma.smaato.net +www.sompuserve.com +www.sondheim.appboy.com +www.sonic.rubiconproject.com +www.sonnoli.com +www.sonobi.com +www.soongu.info +www.soperson.com +www.sophos-secure.247realmedia.com +www.sourcegraph.uc1.yext.com +www.sourmath.com +www.souvre.pl +www.sp.escapicon.net +www.sp1.convertro.com +www.spam.maxpoint.com +www.spamnuker.com +www.sparechange.io +www.specialgiftrewards.com +www.specialonlinegifts.com +www.specials-rewardpath.com +www.specialstat.com +www.specificclick.com +www.specificmedia.com +www.specificpop.com +www.specilized.com +www.specjalniedlaciebie.com +www.speedboink.com +www.speedclicks.ero-advertising.com +www.speedcount.de +www.speedcounter.net +www.speedcounts.com +www.speedrep.com +www.speedtestbeta.com +www.speedyclick.com +www.spiderbait.com +www.spinbox.com +www.spinbox.net +www.spklds.com +www.splem.net +www.spolecznosci.mgr.consensu.org +www.sponsorads.de +www.sponsoradulto.com +www.spookylinks.com +www.sports-bonuspath.com +www.sports-fitness-rewardpath.com +www.sports-offer.com +www.sports-offer.net +www.sports-premiumblvd.com +www.sportsinteraction.com +www.spotify.pinterest.adtz.com +www.spotsniper.ru +www.spotxchange.com +www.spreadyourtentacles.com +www.springserve.com +www.spris.com +www.sprymetrics.com +www.sptlkiyjsglayc.ru +www.spunkycash.com +www.spyarsenal.com +www.spylog.com +www.spylog.ru +www.spywarebegone.com +www.spywareit.com +www.spywarenuker.com +www.spywarespy.com +www.sq2trk2.com +www.srcu.pw +www.srv.dynamicyield.com +www.srv2trking.com +www.ss-01.com +www.ssacdn.com +www.ssapi.dynamicyield.com +www.ssd.speedcurve.com +www.ssl.adx1.com +www.ssl.pathful.com +www.ssl.vizury.com +www.ssl2.pathful.com +www.sslads.vizury.com +www.sso.auth.mparticle.com +www.ssp.analyticson.com +www.sss.freecontent.date +www.sstats.kroger.com +www.st.dynamicyield.com +www.st2.dynamicyield.com +www.st3.dynamicyield.com +www.stack-sonar.com +www.stag-admin.adyoulike.com +www.stage-one.heyzap.com +www.stage-sbma.urbaninsight.com +www.stage-three.heyzap.com +www.stage-two.heyzap.com +www.stage.convertro.com +www.stage.tracker.springserve.com +www.stage.traffiliate.com +www.staging-h-api.online-metrix.net +www.staging-rocnation.lisnr.com +www.staging-sidekiq-status.appboy.com +www.staging.analytics.ispot.tv +www.staging.clickconvertsell.com +www.staging.lisnr.com +www.staging.mater.iubenda.com +www.staging.om.api.ispot.tv +www.staging.rubiconproject.com +www.staging.x.vindicosuite.com +www.staging.yodelmobile.com +www.staging1.dynamicyield.com +www.staging2.dynamicyield.com +www.staging3.dynamicyield.com +www.staging4.dynamicyield.com +www.staging5.dynamicyield.com +www.stamplive.com +www.star-advertising.com +www.starkey.theappgrader.com +www.start-page.org +www.startnewtab.com +www.startup.inmobi.com +www.stash.office.yext.com +www.stat.pl +www.stat0808.info +www.stat24.com +www.statcount.com +www.statcounter.com +www.stati.bid +www.static-02.flu.cc +www.static-net.nut.cc +www.static.addtoany.com +www.static.audienceinsights.net +www.static.audiensis.com +www.static.dev.vilynx.com +www.static.dynamicyield.com +www.static.elixmedia.com +www.static.reasedoper.pw +www.stats.cryptotab.net +www.stats.in.th +www.stats.infogenservice.com +www.stats.net +www.stats.wmadv.com +www.stats4free.de +www.statsector.hu +www.statsession.com +www.statsforever.com +www.stattrax.com +www.status.franklyinc.com +www.steamtraffic.com +www.stellite.crypto-webminer.com +www.stephens-laughlin.com +www.stg-ads.inmobi.com +www.stg-ua.inmobi.com +www.stg.oem.inmobi.com +www.stickylogic.com +www.stiffnetwork.com +www.stirparts.ru +www.stop-sign.com +www.stopkomornikowi.pl +www.stopphoulplay.com +www.store.adx1.com +www.store.gumgum.com +www.str1kee.com +www.strawpoii.me +www.stream.nullrefexcep.com +www.streamate.com +www.streamatelive.com +www.streamdream.ws +www.streamen.com +www.streaming.xcc24.pl +www.streamplay.me +www.streetview.siliconorchard.com +www.striemline.de +www.stripteas.com +www.stsoftware.biz +www.sttvisa.com +www.studio.glance.inmobi.com +www.studiochiarelli.eu +www.studiolegaleabbruzzese.com +www.subsitesadserver.co.uk +www.success.yext.com +www.suckdude.com +www.sudokuwhiz.com +www.sugar.paradym.com +www.sugarsync.com +www.summerhamster.com +www.sumokoin.crypto-webminer.com +www.sunidaytravel.co.uk +www.sunonsunday.com +www.super8service.de +www.superbanner.org +www.superbrewards.com +www.superclix.de +www.superinterstitial.com +www.superiorcoin.crypto-webminer.com +www.supersonic.com +www.supersonicads.com +www.support-beta.demandbase.com +www.support-case.marketo.com +www.support-staging.dynamicyield.com +www.support.5rocks.io +www.support.adswizz.com +www.support.apple.com-notice.info +www.support.appsee.com +www.support.beemray.com +www.support.dynamicyield.com +www.support.inmobi.com +www.support.instartlogic.com +www.support.mparticle.com +www.support.rubiconproject.com +www.support.sharethis.com +www.support.sharethrough.com +www.support.sizmek.com +www.support.tritondigital.com +www.supportmx.support.tapjoy.com +www.supportxmr.com +www.supportxmr.com.cdn.cloudflare.net +www.supremeadsonline.com +www.supremehits.net +www.surfaccuracy.com +www.surplus-suppliers.com +www.survata.com +www.surveynetworks.com +www.surveysite.com +www.suscotrk.com +www.sutdio.glance.inmobi.com +www.svarkon.ru +www.svivqrhrh.ru +www.swag.districtm.net +www.swanksoft.com +www.sweeney.appboy.com +www.sweetsforfree.com +www.swingingcommunity.com +www.sxcdn02.now.sh +www.sxcdn03.now.sh +www.sxcdn04.now.sh +www.sxcdn06.now.sh +www.sxcdn1.herokuapp.com +www.sxcdn3.now.sh +www.sxcdn4.now.sh +www.sxcdn5.herokuapp.com +www.sxcdn6.now.sh +www.sxp.mxptint.net +www.syd-dc01.marketo.net +www.syd-dc02.marketo.net +www.sylicomservicios.com +www.symantex.com +www.symbiosting.com +www.sync.pool.datamind.ru +www.syncaccess.net +www.synconnector.com +www.syncsw.pool.datamind.ru +www.synd.netseer.com +www.syndicaster.tv +www.synovite-scripts.com +www.system-live-media.cz +www.system4.nl +www.szalonenagrody.com +www.szalonepromocje.com +www.szczesliwydzien.com +www.t-analytics.com +www.t-gas.co.uk +www.t-sb.net +www.t.sf14g.com +www.t5.ro +www.ta.com.tw +www.taba.site +www.tableau.marketo.com +www.taboola.com +www.taffr.com +www.tag.clrstm.com +www.tag4arm.com +www.talentbroker.net +www.talk99.cn +www.tamprc.com +www.tangabilder.to +www.tanger.com.br +www.tao123.com +www.tap-secure.rubiconproject.com +www.tap.mxptint.net +www.tapad.com +www.tapair.com +www.tapjoy.com +www.tappx.com +www.target.cm +www.targeted-banners.com +www.targetingnow.com +www.tattooshaha.info +www.tavelscape.com +www.tazm9p7tso.trade +www.tcimg.com +www.td583.com +www.tdms.saglik.gov.tr +www.tdp.mxptint.net +www.te81.net +www.techbargins.com +www.techconfigformat.com +www.technix.it +www.technology.inmobi.com +www.techops.yext.com +www.techtricksworld.com +www.telemetry.sdk.inmobi.com +www.telescopethesky.com +www.temo.analyticson.com +www.template-download.top +www.terethat.ru +www.terraclicks.com +www.terrapops.com +www.terratracker.com +www.test.analyticson.com +www.test.cryptonoter.com +www.test.tapjoyads.com +www.test.vilynx.com +www.test2.analyticson.com +www.testbanners.analyticson.com +www.testjira.corp.ev1.inmobi.com +www.testns.instartlogic.com +www.testracking.com +www.text-link-ads.com +www.textads.biz +www.textadvertising.com +www.textbanners.net +www.textlink.cz +www.textlinkads.com +www.textsrv.com +www.tgpmanager.com +www.tgtvbngp.ru +www.thathislitt.ru +www.thatrendsystem.com +www.thatresha.com +www.thatsjustgay.com +www.thatsphucked.com +www.thdws.com +www.the-best-movies.xcc24.pl +www.the-binary-options-guide.com +www.the-binary-theorem.com +www.the-counter.net +www.the-discount-store.com +www.the-path-gateway.com +www.the-smart-stop.com +www.theads.me +www.theaffiliateprogram.com +www.theappgrader.com +www.theappguruz.com +www.thebighits.com +www.thebigoutdoors.co.uk +www.thebox.siliconorchard.com +www.thebugs.ws +www.thecounter.com +www.thedatesafe.com +www.thedatingconference.com +www.theexgirlfriends.com +www.thehomo.org +www.thelifeisbinary.netlify.com +www.themacuser.org +www.themillionaireinpjs.net +www.thepiratebay.cr +www.thepiratebay.org +www.thepiratebay.wtf +www.thepornsurvey.com +www.thepounder.com +www.theprofitsmaker.net +www.theroamingjew.com +www.thesearchagency.net +www.thesearchster.com +www.thesexcinema.com +www.thesocialsexnetwork.com +www.thesparkmachine.com +www.thesurfshield.com +www.thetop.be +www.thetop10.com +www.thetraderinpajamas.com +www.theuseful.com +www.theuseful.net +www.thewaycloud.com +www.theweatherspace.com +www.thewhizmarketing.com +www.thewhizproducts.com +www.thewise.com +www.thickcash.com +www.thinktarget.com +www.thinlaptoprewards.com +www.thirdpresence.com +www.thoroclean.com +www.thoughtfully-free.com +www.thruport.com +www.thumb.ero-advertising.com +www.thumser-online.de +www.thunderhead.com +www.tidafors.xyz +www.tiergestuetzt.de +www.timeline.vicedata.com +www.timmedmobile.siliconorchard.com +www.tinaborg.com +www.tinbuadserv.com +www.tinka.ru +www.tkdami.net +www.tko-dc01.marketo.net +www.tko-dc02.marketo.net +www.tkovpn.marketo.com +www.tkqlhce.com +www.tldtgs.com +www.tlv-dc01.marketo.net +www.tlv-dc02.marketo.net +www.tm.inmobi.com +www.tmathtag.com +www.tns-counter.ru +www.todogecoin.biz +www.toftofcal.com +www.token.corp.inmobi.com +www.tokyodrift.ga +www.tons-to-see.com +www.toochattoo.com +www.toolbarcounter.com +www.tools.valassisdigital.com +www.toon-families.com +www.toonfamilies.net +www.top-rank.pl +www.top1.ro +www.top100.lt +www.top100.ro +www.top20free.com +www.top25.ro +www.top90.ro +www.topblogging.com +www.topblogs.com.ph +www.topbrandrewards.com +www.topconsumergifts.com +www.topdemaroc.com +www.toplist.cz +www.toplist.sk +www.toplistim.com +www.topmeds10.com +www.topprotestsigns.com +www.topqualitylink.com +www.topsiteguide.com +www.topsites24.de +www.topsites24.net +www.topsiteuri.ro +www.toptracker.ru +www.torgi.kz +www.toroadvertisingmedia.com +www.torrenty-org.pl +www.tossm.com +www.tostadomedia.com +www.totaladperformance.com +www.totemcash.com +www.totszentmarton.hu +www.touchapps.siliconorchard.com +www.touchclarity.com +www.toy-offer.com +www.toy-offer.net +www.tpt.edu.in +www.tqlkg.com +www.tr.silverpush.co +www.tr1.onlinesucces.nl +www.tr100.net +www.tr553.com +www.tracc.it +www.tracemyip.org +www.track.leadnationmedia.com +www.track2cash.com +www.trackadvertising.net +www.trackalyzer.com +www.trackbacksecure.com +www.tracker.meetleads.com +www.tracking.graphly.io +www.trackingclick.net +www.trackingstatalytics.com +www.tracklead.net +www.tradeadexchange.com +www.tradedoubler.com +www.tradedoubler.com.ar +www.tradem.com +www.tradersbrokers.com +www.tradingtactics.win +www.traffic.tc-clicks.com +www.traffic4u.com +www.trafficads.com +www.trafficbeamer.com +www.trafficbeamer.nl +www.trafficcenter.de +www.trafficflame.com +www.trafficg.com +www.traffichaus.com +www.trafficmagnet.net +www.trafficnetworkads24.com +www.trafficpace.com +www.trafficresults.com +www.trafficrevenue.net +www.traffictrader.net +www.traffictraders.com +www.trafficzap.com +www.trafic.ro +www.traficmax.fr +www.trafix.ro +www.trafsearchonline.com +www.training.demandbase.com +www.traktrafficflow.com +www.traktum.com +www.traq.li +www.traumasister.tk +www.travel-leisure-bonuspath.com +www.travel-leisure-premiumblvd.com +www.traveladvertising.com +www.traveller-offer.com +www.traveller-offer.net +www.travelncs.com +www.travelocitu.com +www.travelocityca.com +www.travelocityt.com +www.travelocoity.com +www.travelogity.com +www.traveloicty.com +www.traveloocity.com +www.traveloscity.com +www.travelovity.com +www.travelplanner.siliconorchard.com +www.traveolocity.com +www.travlers.com +www.treavelocity.com +www.treeloot.com +www.trem.dynamicyield.com +www.trendcounter.com +www.trendnews.com +www.trendsonline.biz +www.trendsonline.me +www.trendsonline.mobi +www.trial.backtrace.io +www.trial.facebook-ads.adtz.com +www.tribalfusion.com +www.tribl.io +www.triboo.mgr.consensu.org +www.trig.i.wix.com +www.tritondigital.com +www.trk.tidaltv.com +www.trk4.com +www.trkfl.com +www.trkingace.com +www.trkr1.com +www.trndsys.mobi +www.trourted.pro +www.trqvelocity.com +www.tru.am +www.trucktirehotline.com +www.truconversion.com +www.true-counter.com +www.trustarc.mgr.consensu.org +www.trustgauge.com +www.trustsoft.com +www.trvelocity.com +www.try.appboy.com +www.try.backtrace.io +www.try.rollbar.com +www.try.shopcurbside.com +www.try.tapad.com +www.tsgonline.com +www.ttflb.com +www.ttnet.yandex.com.tr +www.tubehits.com +www.tubetitties.com +www.tubgirl.me +www.tubgirl.org +www.tuckows.com +www.turdgasm.com +www.turkeyrank.com +www.turn.com +www.turnsocial.com +www.turnsocial.now.sh +www.turtlecoin.crypto-webminer.com +www.tutop.com +www.tuttosessogratis.org +www.tvnews.or.kr +www.tvpage.com +www.tvpassport.com +www.tvshowslist.com +www.two-of-us.at +www.twoj-typ.pl +www.twoj-voucher.com +www.twojszczesliwydzien.com +www.twskype.com +www.twttr.com +www.tylko-dla-ciebie.com +www.tymon.intelsad.com +www.tynt.com +www.tzw.com +www.u.heatmap.it +www.u1trkqf.com +www.ua.inmobi.com +www.uat.dev.sizmek.com +www.ucc.wix.com +www.udqgbokvzbnqkf.ru +www.uffa.sizmek.com +www.ugdturner.com +www.ui-idx.inmobi.com +www.ui.cp.tune.com +www.uk.pinterest.adtz.com +www.ukbanners.com +www.ukrpts.net +www.uleadstrk.com +www.ullnot.download +www.ulnawoyyzbljc.ru +www.ultimatecounter.com +www.ultimatefashiongifts.com +www.ultimatetopsites.com +www.ultranote.crypto-webminer.com +www.unblockfacebook.co.uk +www.unblocksit.es +www.undertonenetworks.com +www.unicaitaly.it +www.unicast.com +www.unionleisurewear.com +www.uniqebrokeroffers.com +www.uniqueinternettexasholdempoker.com +www.universal-traffic.com +www.unlimiclick.com +www.unlockme.corp.inmobi.com +www.unrealcommander.biz +www.unrealcommander.com +www.unrealcommander.org +www.unveilmedia.mgr.consensu.org +www.uoldid.ru +www.update-java.kit.net +www.update-your-pc.info +www.updatesoftwaresend.com +www.updatestar.com +www.updo.nl +www.upgradeexplorer.com +www.upi6.pillsstore-c.com +www.upload.crypto-webminer.com +www.uproar.com +www.uprour.com +www.uptodatecontent.net +www.uqz.com +www.urbanairship.com +www.urbaninsight.com +www.urbn-live-stream-feeds.dynamicyield.com +www.urdoot.win +www.uriyuri.com +www.urlcash.net +www.urldelivery.com +www.us-choicevalue.com +www.us-east1.serve.elixmedia.com +www.us-topsites.com +www.us.cdn.survey.medallia.com +www.us.pinterest.adtz.com +www.usadserver.com +www.usaenterprise.com +www.usatravel-specials.com +www.usatravel-specials.net +www.usemax.de +www.usenetjunction.com +www.user.savings2phone.siliconorchard.com +www.userbest.com +www.usercentrics.mgr.consensu.org +www.userguides.tritondigital.com +www.usersonlinecounter.com +www.ushqlyncpool.foresee.com +www.utarget.co.uk +www.v-links.net +www.v.jsrdn.com +www.v61.com +www.v90327ux.beget.tech +www.validatedsite.com +www.validview.com +www.valueclick.com +www.valuehost.co.uk +www.vanguardair.com +www.vantis-holding.com +www.vasanthkumar.com +www.vastproxy.brand.inmobi.com +www.vaultsappsbyte.com +www.vb1rc5l52n.us +www.vcdn.media.innity.net +www.vcrypt.net +www.vd.escapicon.net +www.vdhu.com +www.vdtrack.com +www.velmedia.net +www.venatusmedia.com +www.vendor.savings2phone.siliconorchard.com +www.venturead.com +www.venus.inmobi.com +www.vergic.com +www.verifier.live +www.verifycaptcha.com +www.veritrol.com +www.verresof.com +www.vertourmer.com +www.verypositiveus.com +www.via22.net +www.via99.org +www.viagra-home.com +www.viaxmr.com +www.vibrantmedia.com +www.vicedata.com +www.video-game-rewards-central.com +www.video.revcontent.com +www.videoamp.com +www.videodownloadconverter.com +www.videogamerewardscentral.com +www.videohube.eu +www.videolove.clanteam.com +www.videomediagroep.nl +www.videoplayer2.xyz +www.videosongplayer.com +www.videostan.ru +www.vidora.com +www.vidyo.rubiconproject.com +www.vidyorouterldn.rubiconproject.com +www.view4cash.de +www.viewsignage.com +www.villalecchi.com +www.vilynx.com +www.vinyljazzrecords.com +www.vipcpms.com +www.vippotexa.ru +www.vipromoffers.com +www.virtualsurfer.com +www.virtumundo.com +www.vision.taboola.com +www.visitor-track.com +www.visitortracklog.com +www.visits.lt +www.viskon.pl +www.visualization.maxpoint.com +www.visualwebsiteoptimizer.com +www.vivaimontina.com +www.vivo7.com +www.vizury.com +www.vjsoft.net +www.vk2ca.com +www.vkcdnservice.com +www.vmay.com +www.vmcsatellite.com +www.vntanktransport.com +www.voicefive.com +www.vokr-gtavc.ic.cz +www.volleyball-doppeldorf.de +www.vomitgirl.org +www.voucher-for-you.online +www.voumxy.ru +www.vp.thirdpresence.com +www.vpn.la.exponential.com +www.vpn.nyc.corp.mparticle.com +www.vpn.pdx.corp.mparticle.com +www.vpn.rubiconproject.com +www.vpn.scl.exponential.com +www.vpn2.corp.mparticle.com +www.vpnaffiliates.com +www.vpzccwpyilvoyg.ru +www.vq918450.com +www.vstats.net +www.vthought.com +www.vtoyshop.com +www.vuble.tv +www.vulcannonibird.de +www.vungle.com +www.vuryua.ru +www.vvvic.com +www.vydoxtrial.com +www.vzzexalcirfgrf.ru +www.w.crypto-webminer.com +www.w.nolimit-video.com +www.w13.coinhive.com +www.w3counter.com +www.walkthedinosaur.com +www.wallet.brominer.com +www.wannawatch.com +www.wantsfly.com +www.warco.pl +www.warezaccess.com +www.warezkeeper.com +www.wasm.stream +www.wasm24.ru +www.watch24.com +www.wavesecure.com +www.wbinsights.com +www.wdm29.com +www.wdmwebs.us +www.weathet.com +www.web-chart.de +www.web-feed.net +www.web-stat.com +www.web.consoliads.com +www.web3000.co.uk +www.webabrufe.de +www.webalize.net +www.webanalyser.net +www.webassembly.stream +www.webcashvideos.com +www.webcast.rubiconproject.com +www.webclients.net +www.webcompteur.com +www.webconnect.net +www.webcounter.com +www.webdocs.tritondigital.com +www.webgozar.ir +www.webhits.de +www.webhostingcounter.com +www.webinar.airpr.com +www.webmail.corp.returnpath.net +www.webmail.foresee.com +www.webmail.lijit.com +www.webmail.returnpath.com +www.webmine.cz +www.webmine.pro +www.webminepool.com +www.webminepool.tk +www.webminer.pro +www.webminerpool.com +www.webmining.co +www.webmoblink.com +www.webpartition.com +www.webpaypal.com +www.webservices-rewardpath.com +www.webservis.gen.tr +www.webshot.dynamicyield.com +www.webshotcdn-eu.dynamicyield.com +www.webshotcdn.dynamicyield.com +www.website-hit-counters.com +www.websitealive3.com +www.websitehome.co.uk +www.websitepromoten.be +www.webspectator.com +www.websponsors.com +www.webstat.com +www.webstat.se +www.webstats4u.com +www.webtistic.com +www.webtrackerplus.com +www.webtraxs.com +www.webtrekk.net +www.webtrends.net +www.webwidgetz.duckdns.org +www.webwise.com +www.webwise.net +www.webwise.org +www.webxmr.com +www.wegetpaid.net +www.weitclick.de +www.welcome.analyticson.com +www.wellsfarg0-onllne.net +www.wemine.pro +www.weownthetraffic.com +www.westerntaneyfire.com +www.westreclameadvies.nl +www.wewillrocknow.com +www.wf.adserve.video +www.whalecashads.com +www.whathyx.com +www.whatuwhatuwhatuwant.com +www.whereismommy.gq +www.whereugetxxx.com +www.whipcrack.org +www.whitesmoke.com +www.whitesmoke.us +www.whitesports.co.kr +www.whizstats.com +www.whoisvisiting.com +www.whysoserius.club +www.widebanner.com +www.widespace.com +www.widestep.com +www.widgetbucks.com +www.widgets.viewsignage.com +www.wigetmedia.com +www.wigglewoo.com +www.wiki.appboy.com +www.wiki.fiksu.com +www.wiki.internal.intercom.io +www.wilddreams.info +www.wildianing.ru +www.wildsap.com +www.willacrit.com +www.willcommen.de +www.williamhill.es +www.willysy.com +www.win-spy.com +www.winadiscount.com +www.winaproduct.com +www.wincleaner.com +www.windaily.com +www.winnerschoiceservices.com +www.winscholarship.com +www.witnatura.pl +www.witthethim.com +www.wkkjfcgjofbix.ru +www.wkmg.co.kr +www.wmemsnhgldd.ru +www.wmmax.com +www.wmserver.net +www.wmwmwwfmkvucbln.ru +www.wnmyerzbjhu.ru +www.wo15.coinhive.com +www.wootric.com +www.wordc.ga +www.wordplaywhiz.com +www.wordseach.com +www.work-offer.com +www.workday.exponential.com +www.workdaylab.exponential.com +www.worker.salon.com +www.worldata.com +www.wormgush.com +www.worry-free-savings.com +www.wowjs.1www.cn +www.wpcdn1.herokuapp.com +www.wppluginspro.com +www.wqgkainysj.ru +www.wraplo.pl +www.wrestlingexposed.com +www.writingassociates.com +www.wronpeci.com +www.wrxgandsfcz.ru +www.ws.freebitco.in +www.ws.tapjoyads.com +www.ws.tidafors.xyz +www.ws.xmrm.pw +www.ws000.coinhive.com +www.ws001.ws.tidafors.xyz +www.ws001.www.datasecu.download +www.ws001.www.jqwww.download +www.ws002.ws.tidafors.xyz +www.ws002.www.datasecu.download +www.ws002.www.jqwww.download +www.ws003.ws.tidafors.xyz +www.ws003.www.datasecu.download +www.ws003.www.jqwww.download +www.ws004.ws.tidafors.xyz +www.ws004.www.datasecu.download +www.ws004.www.jqwww.download +www.ws005.ws.tidafors.xyz +www.ws005.www.datasecu.download +www.ws005.www.jqwww.download +www.ws006.ws.tidafors.xyz +www.ws006.www.datasecu.download +www.ws006.www.jqwww.download +www.ws007.ws.tidafors.xyz +www.ws007.www.datasecu.download +www.ws007.www.jqwww.download +www.ws008.ws.tidafors.xyz +www.ws008.www.datasecu.download +www.ws008.www.jqwww.download +www.ws009.ws.tidafors.xyz +www.ws009.www.datasecu.download +www.ws009.www.jqwww.download +www.ws010.ws.tidafors.xyz +www.ws010.www.datasecu.download +www.ws010.www.jqwww.download +www.ws011.ws.tidafors.xyz +www.ws011.www.datasecu.download +www.ws011.www.jqwww.download +www.ws012.ws.tidafors.xyz +www.ws012.www.datasecu.download +www.ws012.www.jqwww.download +www.ws013.ws.tidafors.xyz +www.ws013.www.datasecu.download +www.ws013.www.jqwww.download +www.ws014.ws.tidafors.xyz +www.ws014.www.datasecu.download +www.ws014.www.jqwww.download +www.ws015.ws.tidafors.xyz +www.ws015.www.datasecu.download +www.ws015.www.jqwww.download +www.ws016.ws.tidafors.xyz +www.ws016.www.datasecu.download +www.ws016.www.jqwww.download +www.ws017.ws.tidafors.xyz +www.ws017.www.datasecu.download +www.ws017.www.jqwww.download +www.ws018.ws.tidafors.xyz +www.ws018.www.datasecu.download +www.ws018.www.jqwww.download +www.ws019.ws.tidafors.xyz +www.ws019.www.datasecu.download +www.ws019.www.jqwww.download +www.ws020.ws.tidafors.xyz +www.ws020.www.datasecu.download +www.ws020.www.jqwww.download +www.ws021.ws.tidafors.xyz +www.ws021.www.datasecu.download +www.ws021.www.jqwww.download +www.ws022.ws.tidafors.xyz +www.ws022.www.datasecu.download +www.ws022.www.jqwww.download +www.ws023.ws.tidafors.xyz +www.ws023.www.datasecu.download +www.ws023.www.jqwww.download +www.ws024.ws.tidafors.xyz +www.ws024.www.datasecu.download +www.ws024.www.jqwww.download +www.ws025.ws.tidafors.xyz +www.ws025.www.datasecu.download +www.ws025.www.jqwww.download +www.ws026.ws.tidafors.xyz +www.ws026.www.datasecu.download +www.ws026.www.jqwww.download +www.ws027.ws.tidafors.xyz +www.ws027.www.datasecu.download +www.ws027.www.jqwww.download +www.ws028.ws.tidafors.xyz +www.ws028.www.datasecu.download +www.ws028.www.jqwww.download +www.ws029.ws.tidafors.xyz +www.ws030.ws.tidafors.xyz +www.ws031.ws.tidafors.xyz +www.ws032.ws.tidafors.xyz +www.ws035.coinhive.com +www.ws05.crypto.csgocpu.com +www.ws06.crypto.csgocpu.com +www.ws07.crypto.csgocpu.com +www.ws08.crypto.csgocpu.com +www.ws09.coinhive.com +www.ws09.crypto.csgocpu.com +www.ws1.bmcm.pw +www.ws1.bmnr.pw +www.ws1.bmst.pw +www.ws2.bmcm.pw +www.ws2.bmnr.pw +www.ws2.bmst.pw +www.ws23.crypto.csgocpu.com +www.ws24.crypto.csgocpu.com +www.ws25.crypto.csgocpu.com +www.ws3.bmnr.pw +www.ws4.bmnr.pw +www.ws42.crypto.csgocpu.com +www.ws48.crypto.csgocpu.com +www.ws49.crypto.csgocpu.com +www.ws5.bmnr.pw +www.ws50.crypto.csgocpu.com +www.wsnew.freebitco.in +www.wss.nablabee.com +www.wtp101.com +www.wty46.com +www.wundercounter.com +www.ww8.adminer.com +www.wwaol.com +www.wwfsable.com +www.www-google.nl +www.www-staging-origin.dynamicyield.com +www.www-staging.dynamicyield.com +www.www.cpm20.com +www.www1.2giga.link +www.www1.mmnetwork.mobi +www.www4search.net +www.wwwadultcheck.com +www.wwwal.com +www.wwwalaskaair.com +www.wwwaolmail.com +www.wwwbackstreetboys.com +www.wwwbluelight.com +www.wwwbluemountian.com +www.wwwbudget.com +www.wwwcallwave.com +www.wwwcdnow.com +www.wwwcheaptickets.com +www.wwwcnnnews.com +www.wwwdollar.com +www.wwwgameshark.com +www.wwwgoogles.com +www.wwwnwa.com +www.wwwoldnavy.com +www.wwwplaysite.com +www.wwwrealator.com +www.wwwservicemerchandise.com +www.wwwtarget.com +www.wwwuproar.com +www.wwwwal-mart.com +www.wykreslanka.com.pl +www.wyroki.eu +www.wysistat.com +www.wytypowany-zwyciezca.com +www.wytypowany-zwyciezca.pl +www.wzrkt.com +www.x-diesel.biz +www.x-diesel.com +www.x-diesel.info +www.x-diesel.org +www.x-park.net +www.x-pronet.com +www.x.bidswitch.net +www.x.browsermine.com +www.xaxis.com +www.xbn.ru +www.xchangetrak.com +www.xclicks.net +www.xcr-286.com +www.xed.pl +www.xg4ken.com +www.xiruz.kit.net +www.xiti.com +www.xl-rank.com +www.xl-trk.com +www.xmg.cool +www.xml.adx1.com +www.xmr.cool +www.xmr.crypto-pool.fr +www.xmrm.browsermine.com +www.xmrm.pw +www.xmrpool.net +www.xn--turkishirlines-1p8g.com +www.xpass.xtify.com +www.xpays.com +www.xray.corp.inmobi.com +www.xruletka.pl +www.xsedu.zj.cn +www.xssrmimmnq.ru +www.xstat.pl +www.xtrafic.ro +www.xvideosharing.site +www.xvideoslive.com +www.xvika.net +www.xvika.org +www.xxxbannerswap.com +www.xxxcounter.com +www.xxxnations.com +www.xxxnightly.com +www.xxxtoolbar.com +www.xxxwebtraffic.com +www.xy.nullrefexcep.com +www.xy7track.com +www.xyfex.com +www.xyztraffic.com +www.y8.com +www.ybjfsqcevow.ru +www.yceml.net +www.yext-pixel.com +www.yext.com +www.yhp.mxptint.net +www.yibaruxet.cn +www.yidsense.com +www.yieldmanager.net +www.yieldmo.com +www.yieldpartners.com +www.yieldtraffic.com +www.ymxpb.com +www.yoaabgvkm.ru +www.yoda.internal.media.net +www.yodelmobile.com +www.yodelmobilecouk.yodelmobile.com +www.yodelmobilelondon.yodelmobile.com +www.yodelmobilemobi.yodelmobile.com +www.yottaa.com +www.yottaa.net +www.youaresogay.com +www.youcanoptout.com +www.youcanoptout.net +www.youcanoptout.org +www.youf1le.com +www.youfck.com +www.youfileisoft.com +www.youfiletor.com +www.youho.com +www.youporn.sexy +www.your-gift-zone.com +www.yourdedicatedhost.com +www.yourdvdplayer.com +www.yourfreegascard.com +www.yourfuckbook.com +www.yourgascards.com +www.yourgiftrewards.com +www.yourgiftzone.com +www.yourhandytips.com +www.yourhitstats.com +www.yourhotgiftzone.com +www.youripad4free.com +www.yourlustmedia.com +www.yourrewardzone.com +www.yoursmartrewards.com +www.yourstats.net +www.youtuhe.com +www.ypmadserver.com +www.ypmate.com +www.yrals.com +www.ytdownloader.com +www.yvmads.com +www.ywvcomputerprocess.info +www.zaap.siliconorchard.com +www.zabavazaodrasle.com +www.zanox-affiliate.de +www.zapto.org +www.zapunited.com +www.zarobek4u.com +www.zarobicpieniadze.com +www.zarobicprzezinternet.com +www.zarrmarketing.co.uk +www.zatzy.com +www.zavzlen.ru +www.zbest.in +www.zbippirad.info +www.zctei.com +www.zebrapozyczki.pl +www.zedo.com +www.zekiatagur.com +www.zemanta.com +www.zemgo.com +www.zendesk.sizmek.com +www.zentastic.com +www.zergnet.com +www.zeroredirect2.com +www.zevents.com +www.zfn5wua2d1.online +www.zipitfast.com +www.zivbxion.ru +www.ziykrgc.ru +www.zlothonline.info +www.zlx.com.br +www.zny.coiner.site +www.zoodrawings.com +www.zoogdiseny.com +www.zoogdisny.com +www.zoominnovate.online +www.zoomovies.org +www.zoompegs.com +www.zoophil.com +www.zoosexart.com +www.zootoplist.com +www.zootravel.com +www.zulip.dynamicyield.com +www.zuverink.net +www.zytpirwai.net +www.zyxyfy.com +www.zzqhsrg.ru +www.zzz.adx1.com +www02.secure.eloqua.com +www1.2giga.link +www1.ad.tomshardware.com +www1.addfreestats.com +www1.adireland.com +www1.bannerspace.com +www1.belboon.de +www1.bmo.com.hotfrio.com.br +www1.clicktorrent.info +www1.counter.bloke.com +www1.firesavez5.com +www1.firesavez6.com +www1.iwon.com +www1.mmnetwork.mobi +www1.mpnrs.com +www1.multipops.com +www1.nuseek.com +www1.pip-pip-pop.com +www1.pollg.com +www1.popinads.com +www1.realsoft34.com +www1.safenyplanet.in +www1.sedoparking.com +www1.sexinyourcity.com +www1.tapjoy.com +www1.tec-tec-boom.com +www1.tynt.com +www1.vip.sc9.admob.com +www1.xmediaserve.com +www1.zapadserver1.com +www10.ad.tomshardware.com +www10.glam.com +www10.indiads.com +www10.paypopup.com +www101.coolsavings.com +www11.ad.tomshardware.com +www12.ad.tomshardware.com +www12.glam.com +www123.glam.com +www13.ad.tomshardware.com +www13.glam.com +www14.ad.tomshardware.com +www14.smartadserver.com +www15.ad.tomshardware.com +www17-orig.glam.com +www17.glam.com +www18.glam.com +www18.officedepot.com +www180.myway.com +www2.2giga.link +www2.acint.net +www2.activebestakamaiflash.icu +www2.ad.tomshardware.com +www2.addfreestats.com +www2.adfreetv.ch +www2.adhost.com +www2.adireland.com +www2.adserverpub.com +www2.anybestconcreteflash.icu +www2.autopartswarehouse.com +www2.autopilothq.com +www2.bannerspace.com +www2.branch.io +www2.clustrmaps.com +www2.counter.bloke.com +www2.cqcounter.com +www2.doslectionflash.icu +www2.doubleclick.com +www2.fasterupconcreteflash.icu +www2.game-advertising-online.com +www2.gettypegoldflash.club +www2.glam.com +www2.gorillavid.in +www2.hitslink.com +www2.instartlogic.com +www2.kampanyatakip.net +www2.kampyle.com +www2.kiehls.com +www2.leadingedgecash.com +www2.mousestats.com +www2.multipops.com +www2.mystats.nl +www2.nuseek.com +www2.pagecount.com +www2.pardot.com +www2.pubdirecte.com +www2.savedealoriginalaflash.icu +www2.sellhealth.com +www2.setdealoriginalaflash.icu +www2.setoriginalgreataflash.icu +www2.settypesoftaflash.icu +www2.smallconcretetypeflash.world +www2.smallregularbestflash.club +www2.smalltypeconcreteflash.rocks +www2.smartadserver.com +www2.stats4free.de +www2.survey-poll.com +www2.topgoldhowflash.icu +www2.upgradebestonlineflash.icu +www2.vilynx.com +www2.yidsense.com +www2.yoursseparatebestaflash.icu +www2.zapadserver1.com +www21.counsellor.gov.cn +www210.paypopup.com +www211.paypopup.com +www212.paypopup.com +www213.paypopup.com +www24.glam.com +www24a.glam.com +www25.bathandbodyworks.com +www25.glam.com +www25.victoriassecret.com +www25a.glam.com +www3.2giga.link +www3.ad.tomshardware.com +www3.addfreestats.com +www3.addthis.com +www3.adireland.com +www3.bannerspace.com +www3.bloomingdales.com +www3.click-fr.com +www3.clustrmaps.com +www3.counter.bloke.com +www3.ddns.ms +www3.doubleclick.com +www3.doubleclick.net +www3.game-advertising-online.com +www3.haberturk.com +www3.ihaberadserver.com +www3.kampanyatakip.net +www3.macys.com +www3.mopub.com +www3.nationalgeographic.com +www3.netseer.com +www3.nuseek.com +www3.oyunstar.com +www3.smartadserver.com +www3.webhostingtalk.com +www3.y-83m4wjpzlx6.usa.cc +www3.zapadserver.com +www30.glam.com +www30a1-orig.glam.com +www30a1.glam.com +www30a2-orig.glam.com +www30a3-orig.glam.com +www30a3.glam.com +www30a4.glam.com +www30a5.glam.com +www30a6.glam.com +www30a7.glam.com +www30l2.glam.com +www30t1-orig.glam.com +www35f.glam.com +www35jm.glam.com +www35t.glam.com +www4.2giga.link +www4.ad.tomshardware.com +www4.addfreestats.com +www4.at.debianbase.de +www4.bannerspace.com +www4.clustrmaps.com +www4.counter.bloke.com +www4.epac.to +www4.glam.com +www4.gy7k.net +www4.kampanyatakip.net +www4.smartadserver.com +www49.playercdn.net +www4search.net +www5.2giga.link +www5.3-a.net +www5.ad.tomshardware.com +www5.addfreestats.com +www5.afsanalytics.com +www5.bannerspace.com +www5.counter.bloke.com +www5.kampanyatakip.net +www5.mackolik1.com +www5.smartadserver.com +www5.zoosi.club +www6.2giga.link +www6.ad.tomshardware.com +www6.addfreestats.com +www6.bannerspace.com +www6.click-fr.com +www6.counter.bloke.com +www6.effectivemeasure.net +www6.ezua.com +www6.kampanyatakip.net +www6.ns1.name +www6.smartadserver.com +www60.valueclick.com +www69.bestdeals.at +www69.byinter.net +www69.dynu.com +www69.findhere.org +www69.fw.nu +www69.ugly.as +www7.2giga.link +www7.ad.tomshardware.com +www7.addfreestats.com +www7.bannerspace.com +www7.counter.bloke.com +www7.kampanyatakip.net +www7.ygto.com +www74.valueclick.com +www8-ssl.effectivemeasure.net +www8.ad.tomshardware.com +www8.addfreestats.com +www8.afsanalytics.com +www8.bannerspace.com +www8.counter.bloke.com +www8.effectivemeasure.net +www8.glam.com +www8.ns01.us +www8.smartadserver.com +www81.valueclick.com +www9.ad.tomshardware.com +www9.addfreestats.com +www9.collectiblestoday.com +www9.compblue.com +www9.counter.bloke.com +www9.effectivemeasure.net +www9.paypopup.com +www9.servequake.com +www9.smartadserver.com +www9.trickip.org +www91.intel.com +www99.bounceme.net +www99.fdns.net +www99.zapto.org +wwwadultcheck.com +wwwal.com +wwwalaskaair.com +wwwallegro.pl +wwwaolmail.com +wwwbackstreetboys.com +wwwbaid.com +wwwbajajauto.com +wwwbigfoot.com +wwwbluelight.com +wwwbluemountian.com +wwwbluemoutain.com +wwwbowcreek.com +wwwbudget.com +wwwcallwave.com +wwwcareerpath.com +wwwcdnow.com +wwwcheaptickets.com +wwwchipchickcom.skimlinks.com +wwwcnnnews.com +wwwcopperchief.com +wwwcultofmaccom.skimlinks.com +wwwdatabreach-settlement.com +wwwdescargas.com +wwwdev01.backtrace.io +wwwdisnepchannel.com +wwwdiynet.com +wwwdocumentscom.000webhostapp.com +wwwdollar.com +wwwfacebook.com +wwwfacultyrewards.com +wwwfirstib.com +wwwflyadeal.com +wwwflyjoon.com +wwwgamepro.com +wwwgameshark.com +wwwgmacmortgage.com +wwwgoldstandardrewards.com +wwwgoogles.com +wwwlotto24.de +wwwm.bzbk.pl +wwwmakro.nl +wwwmancow.com +wwwmyshopriteexperience.com +wwwnwa.com +wwwpacebus.com +wwwpennys.com +wwwplaysite.com +wwwpowerwarranties.com +wwwpromoter.com +wwwq.net +wwwrbs.com +wwwrealator.com +wwwservicemerchandise.com +wwwtarget.com +wwwtwa.com +wwwuproar.com +wwww.8cr.purredheanb.online +wwww.a-ads.com +wwww.adleads.com +wwww.coinhits.com +wwww.token.ad +wwwwal-mart.com +wy.5.p2l.info +wybieraj-wygrywaj.pl +wybierz-nagrode.pl +wyciskanie-pryszcza.blogspot.com +wyciskaniepryszcza0.blogspot.com +wydawca.lead.network +wygrajnike.blogspot.com +wygrajpsc.eu +wygrana-wpisz-dane.eu +wygrania.com +wygrywa.pl +wykop.hit.gemius.pl +wypad3k0.blogspot.com +wytypowana-osoba-wygrywajaca.pl +wytypowany-zwyciezca.com +wytypowany-zwyciezca.pl +wzrkt.com +x-box.t35.com +x-cinema.com +x-comics.com +x-daily.com +x-diesel.biz +x-diesel.com +x-diesel.info +x-diesel.org +x-hydrocodone.info +x-park.net +x-phentermine.info +x-pronet.com +x-road.co.kr +x-traceur.com +x-x-x-x.biz +x.admob.com +x.azjmp.com +x.bidswitch.net +x.browsermine.com +x.cb.kount.com +x.clickcertain.com +x.cnt.my +x.co +x.fidelity-media.com +x.heyzap.com +x.iasrv.com +x.imwx.com +x.interia.pl +x.mochiads.com +x.onaudience.com +x.rkdms.com +x.zeroredirect.com +x17online.us.intellitxt.com +x2.xclicks.net +x25.2mydns.com +x25.plorp.com +x3.extreme-dm.com +x3.xclicks.net +x4.lov3.net +x4.xclicks.net +x5.xclicks.net +x6.xclicks.net +x6.yakiuchi.com +x65zz.popularprizes.8981275.com +x6x.a.la +x86adserve006.adtech.de +x888x.myserver.org +x8x.dyndns.dk +x8x.trickip.net +xads.zedo.com +xamateurpornlic.www1.biz +xanax-online.dot.de +xanax-online.run.to +xanax-online.sms2.us +xanax-store.shengen.ru +xanax.ourtablets.com +xanax.t-amo.net +xanaxxanax.3xforum.ro +xapi.juicyads.com +xapi.xfinity.com +xapi.xfinity.com.edgekey.net +xarios.adviserplus.com +xaxis-emea.mookie1.com +xaxis-it.mookie1.com +xaxis.com +xbasfbno.info +xblasterads1.com +xbox.ign.us.intellitxt.com +xbox1emulator.org +xbox360.ign.us.intellitxt.com +xbox360emulator.com +xbs.mtree.com +xbs.pao.mtree.com +xbs.sea.mtree.com +xch.smrtgs.com +xchange.ro +xchangetrak.com +xcisky.tk +xclassix.com +xclicks.net +xclusive.ly +xcnn.com +xcombear.ru +xcr-286.com +xdn.cpufan.club +xed.pl +xenical.1.p2l.info +xenical.3.p2l.info +xenical.4.p2l.info +xertive.com +xfinitydigital.demdex.net +xfotosx01.fromru.su +xg4ken.com +xgames-04.com +xgefmxd.ru +xgmc6lu8fs.me +xhealth.112.2o7.net +xhealthmobiletools.112.2o7.net +xhealthmobiltools.112.2o7.net +xhr.acrabakasaka.com +xicaxique.com.br +xindalawyer.com +xit.sexlist.com +xiti.com +xkomp.net +xkygmtrrjalx.com +xl-trk.com +xlivehost.com +xlonhcld.xlontech.net +xmarkscom.skimlinks.com +xmg.cool +xml.ad-maven.com +xml.adfclick1.com +xml.admanage.com +xml.adservme.com +xml.adsparkmedia.net +xml.adtech.de +xml.adtech.fr +xml.adtech.us +xml.adventurefeeds.com +xml.adx1.com +xml.adxfactory.com +xml.bravenet.com +xml.click9.com +xml.explorads.com +xml.mediashakers.com +xml.mining.best +xml.mxsads.com +xml.nbcsearch.com +xml.onwardclick.com +xml.plaimedia.com +xml.plusfind.net +xml.quiveradnet.com +xml.revenuehits.com +xml.seekandsee.com +xml.yepmedia.com +xml2.nbcsearch.com +xmlgrab.com +xmlheads.com +xmlpitstop.us.intellitxt.com +xmpp.exacttarget.com +xmr.101010.pl +xmr.coinlab.biz +xmr.cool +xmr.cpufan.club +xmr.crypto-pool.fr +xmr.cryptonoter.com +xmr.e-libra.ru +xmr.mining.best +xmr.omine.org +xmr1.crypto-pool.fr +xmr10.crypto-pool.fr +xmr3.crypto-pool.fr +xmr5.crypto-pool.fr +xmr6.crypto-pool.fr +xmr7.crypto-pool.fr +xmr8.crypto-pool.fr +xmrm.browsermine.com +xmrm.pw +xmrminingproxy.com +xmrpool.net +xn-----8kcatubaocd1bneepefojs1h2e.xn--p1ai +xn----8sbarihbihxpxqgaf0g1e.xn--80adxhks +xn--80aanaardaperhcem4a6i.com +xn--80ab4aa2g.xn--p1ai +xn--80abgj3a5acid6ghs.top +xn--80abwt.com +xn--80adaggc5bdhlfamsfdij4p7b.xn--p1ai +xn--80aeahghtf8ac5i.xn--p1ai +xn--80aebbcbcdemfkhba4byaehoejh8dza3v.xn--p1ai +xn--80ahdheogk5l.xn--p1ai +xn--80ahvj9e.xn--p1ai +xn--80aikhbrhr.net +xn--80ajbshivpvn2i.xn--p1ai +xn--80ak6aa92e.com +xn--80amrfdv0h.com +xn--80aodinpgi.xn--p1ai +xn--adspace-kvg.ero-advertising.com +xn--lt-68s.com +xn--oogle-wmc.com +xoomer.alice.it +xorgwebs.webs.com +xotsa.frenchgerlemanelectric.com +xovq5nemr.com +xp1.zedo.com +xp2.zedo.com +xpantivirus.com +xpass.xtify.com +xpcs.ads.yahoo.com +xpl.theadex.com +xplusone.com +xponlinescanner.com +xponsor.com +xpop.co +xpornstarsckc.ddns.name +xporontube.tripod.com +xpostmail.com +xq1.net +xr.h4ck.la +xray.corp.inmobi.com +xs.mookie1.com +xsecurity.fblaster.com +xssrmimmnq.ru +xstatic.nk-net.pl +xsztfrlkphqy.com +xtainment.net +xteens.pl +xtendmedia.com +xtest.thunderhead.com +xtify.com +xtrafic.ro +xtrak.me +xtrasizeoriginal.com.br +xtremetop100.com +xvideosharing.site +xvika.net +xvika.org +xvrxyzba253.hotmail.ru +xwbe.wcdn.co.il +xwell.ru +xxx-r.com +xxx-video.org +xxx-xxx-sex.nu +xxx-xxx-xxx.nu +xxx-xxx.info +xxx-zoo.com +xxx.cqcounter.com +xxx.epidem.ru +xxx.katastro.fi +xxx.video.es +xxx18.ucoz.com +xxxcartoon.nu +xxxcartoonsex.com +xxxcellar.com +xxxcounter.com +xxxcraft.com +xxxcrazy.nu +xxxcredit.com +xxxdex.com +xxxelf.com +xxxeyecandy.com +xxxfactors.com +xxxfeast.com +xxxfiles.dk +xxxfiles.se +xxxfilmpjes.net +xxxfreepix.com +xxxfreepornreview.com +xxxfuck.info +xxxfuckfilms.com +xxxfucking.nu +xxxgayporn.gayatlas.com +xxxgirlsgalore.com +xxxgratis.org +xxxguitars.com +xxxhackers.nu +xxxlesbian.nu +xxxlesbianpics.nu +xxxlivevision.com +xxxloving.com +xxxmangacomics.com +xxxmaster.org +xxxmegalink.com +xxxmemberships.com +xxxmgp.com +xxxmom.info +xxxmovie.se +xxxmovieaddict.com +xxxmyself.com +xxxnakedpics.nu +xxxnatelefon.ru +xxxnudepics.nu +xxxnylon.com +xxxp0rn.com +xxxpasses.nu +xxxpassword.nu +xxxpasswords.nu +xxxperfect.com +xxxperv.com +xxxphat.com +xxxphiles.com +xxxpics.de +xxxpics4you.com +xxxpicshere.com +xxxpictures.nu +xxxplatinumclub.com +xxxpool.de +xxxpornfinder.com +xxxpornking.nu +xxxpornopics.nu +xxxpornos.nu +xxxpornpics.nu +xxxpowed.info +xxxproam.com +xxxpussypics.nu +xxxrage.com +xxxrampage.com +xxxratedporn.nu +xxxratedporno.nu +xxxratedxxxrated.com +xxxrayvision.com +xxxreactor.com +xxxretreat.com +xxxreviews.info +xxxrocket.com +xxxrus.org +xxxsection.com +xxxsexclass.com +xxxsexnude.com +xxxsexpussy.com +xxxsexstop.com +xxxsexteen.com +xxxsiren.com +xxxsmsjes.nl +xxxstories.nu +xxxstory.net +xxxtraders.com +xxxvideos.nu +xxxvoyeurs.com +xxxwebgames.com +xxxworld.info +xxxxoooo.360maca.com +xxxxxxx.hopto.org +xxxz.info +xxyyzz.youcanoptout.com +xy.nullrefexcep.com +xyknfufvlk.bid +xymlhxg.com +xyxudubax.angelcities.com +xyz.freelogs.com +xyz.freeweblogger.com +xyzvids.com +xz618.com +xzegarsmiercix.prv.pl +y.admob.com +y.analytics.yahoo.com +y.cdn.adblade.com +y.extreme-dm.com +y.flurry.com +y.ibsys.com +y.zeroredirect.com +y0.extreme-dm.com +y1.extreme-dm.com +y2k.hitbox.com +y3.analytics.yahoo.com +y3.ifengimg.com +y4681.6128786.com +yab-adimages.s3.amazonaws.com +yabuka.com +yad1.yad2.co.il +yadro.ru +yads.zedo.com +yahoo.effectivemeasure.net +yahoo.ivwbox.de +yahoo.nuggad.net +yamaha.122.2o7.net +yampapi-prod.flurry.com +yampapi-staging.flurry.com +yampui-staging.flurry.com +yandexadexchange.net +yang.hitbox.com +yardbarker.tags.crwdcntrl.net +yashin.alphonso.tv +yasmin.1.p2l.info +yasmin.3.p2l.info +yasmin.4.p2l.info +yatrk.xyz +ybex.com +ybinst0.ec.yimg.com +ybinst1.ec.yimg.com +ybinst2.ec.yimg.com +ybinst3.ec.yimg.com +ybinst4.ec.yimg.com +ybinst5.ec.yimg.com +ybinst6.ec.yimg.com +ybinst7.ec.yimg.com +ybinst8.ec.yimg.com +ybinst9.ec.yimg.com +ybjfsqcevow.ru +ychan.drivershq.hop.clickbank.net +ycv.clearshieldredirect.com +yeag.thunderhead.com +yeeeah.us.intellitxt.com +yellcom.122.2o7.net +yellow.demo.dmp.piwik.pro +yellow.fonbet.dmp.piwik.pro +yellow.soju.openx.net +yellspain.112.2o7.net +yepdigital.adk2x.com +yesads.com +yesadvertising.com +yesfm.tritondigital.com +yeskyafp.allyes.com +yeti-api.automatad.com +yeti.automatad.com +yext-pixel.com +yext.com +yhit.press +yhp.mxptint.net +yie4zooseif.info +yield.audience.digitalmedia.bg +yieldads.com +yieldbuild.com +yieldlab.net +yieldmanagement.adbooth.net +yieldmanager.adbooth.com +yieldmanager.com +yieldmanager.net +yieldmo.com +yieldoptimizer.com +yieldtraffic.com +yigitakcali.com +yildun.iad-03.braze.com +ying.hitbox.com +yitkomfj.angelcities.com +yj.adnxs.com +yjp.adnxs.com +yk.handlerhackz.tk +yldbt.com +ylgingq.angelcities.com +yllix.com +ylpzt.juzojossai.net +ym.adnxs.com +ym.analytics.yahoo.com +ym.bannerconnect.net +ymail-activate1.bugs3.com +ymetrica1.com +ymxpb.com +yoaabgvkm.ru +yoda.cybereps.com +yoda.internal.media.net +yodelmobile.com +yodelmobilecouk.yodelmobile.com +yodelmobilelondon.yodelmobile.com +yodelmobilemobi.yodelmobile.com +yodleeinc.tt.omtrdc.net +yoggrt.com +yolo.sp.backtrace.io +yolo2.sp.backtrace.io +yolo3.sp.backtrace.io +yolo4.sp.backtrace.io +yololike.space +yoredi.com +yotafiles.com +yotefiles.com +yottaa.com +yottaa.net +yotube.com +you-have-0ne-messsagehe0.top +you.tubetitties.com +youaresogay.com +youcanoptin.com +youcanoptin.net +youcanoptin.org +youcanoptout.com +youcanoptout.net +youcanoptout.org +youfck.com +yougube.com +youporn.sexy +your-bearings.com +your-fanpagee1.regis-dev9.tk +your-free-iphone.com +your-gift-zone.com +your-movies.pl +your.dailytopdealz.com +yourdailytrailer.yournewtab.com +yourdesires.ru +yourdvdplayer.com +yourebook.pl +yourfiles.pl +yourfreegascard.com +yourgascards.com +yourgiftrewards.com +yourgiftzone.com +yourhandytips.com +yourhotgiftzone.com +youripad4free.com +yourloganalytics.com +yourofferpro.com +yourothersite.com +yourpage.blazenet.net +yourpagesupdale.cf +yourpayment.online +yourperlebleue.com +yourporn.cc +yourporn.com +yourporngay.com +yourrewardzone.com +yoursearch.me +yoursecuritysystem.com +yourseniorapartments.com +yoursexymind.com +yoursite.com +yourslip.de +yoursmartrewards.com +yourstats.net +yourtango.us.intellitxt.com +yourtemplatefinder.com +yourwifeonline.com +youth-in-asia.com +youthreaders.com +youtibe.com +youtoner.it +youtube-proxy.info +youtube.112.2o7.net +youtuhe.com +youwarez.biz +yovbkyylqlmkg.bid +yoyo-zdjecia.bo.pl +ypcpw.com +ypfghpqnkgbxu.bid +yplassembly.in +ypn-js.overture.com +ypu.edu.tw +yqaywudifu.date +yqmnyyfe.bid +yrals.com +yrdrtzmsmt.com +yrfjqlpvrc.bid +yrkdsp.112.2o7.net +yrkeve.112.2o7.net +yrwap.cn +ysdacdbitdy.bid +ysexxayb.bid +ysiu.freenation.com +yt-adblocker.com +yt.5.p2l.info +yt.moatads.com +ytaahg.vo.llnwd.net +ytdownloader.com +ytest.thunderhead.com +ytf8i5ce.top +ytiqdpws.bid +ytmmpddn.bid +ytmnd.com +ytqm.org +yts.moatads.com +yuarra.pluto.ro +yubikk.info +yudexjr.com +yugk.net +yukoyuko.112.2o7.net +yumekin.com +yumenetworks.com +yummymobile.pl +yun-static.soperson.com +yun56.co +yuniomy88.000webhostapp.com +yunque.pluto.ro +yupdduk.co.kr +yuppipuppy.com +yur-p.ru +yurgorod.ru +yuyyio.com +yvdeuwn.angelcities.com +ywxi.net +yx-in-f108.1e100.net +yxp4k.adx1.com +z-eu.amazon-adsystem.com +z-fe.amazon-adsystem.com +z-in.amazon-adsystem.com +z-master.ru +z-na.amazon-adsystem.com +z.abnad.net +z.adbiq.com +z.admob.com +z.analytics.yahoo.com +z.blogads.com +z.ceotrk.com +z.dynad.net +z.extreme-dm.com +z.moatads.com +z.optmnstr.com +z.optmstr.com +z.rkdms.com +z.zeroredirect.com +z0.extreme-dm.com +z1.adserver.com +z1.extreme-dm.com +z1.zedo.com +z2.mookie1.com +z2.zedo.com +z2jakqoshx.com +z32538.nb.host127-0-0-1.com +z5x.net +z7752.com +za-cdn.effectivemeasure.net +za-music.mymobiplanet.com +za-rejestruj.pl +za-ssl.effectivemeasure.net +za.zeroredirect1.com +za1.sierra-fox.com +za10groszy.pl +za2.zeroredirect8.com +zaap.siliconorchard.com +zabavazaodrasle.com +zads.zedo.com +zafiti01.webtrekk-us.net +zag.112.2o7.net +zag.122.2o7.net +zalukaj-online.pl +zalukajfilmy.pl +zambini.ru +zambrana.com +zamiana-koloru.blogspot.com +zamora.axiatraders.com +zampolit1990.popunder.ru +zanaflex.1.p2l.info +zango.112.2o7.net +zangocash.com +zanox-affiliate.de +zanox.com +zantracker.com +zaobao.com.sg +zap2.mookie1.com +zapadserver1.com +zapcdn.space +zapme.net +zapreal.com +zapto.org +zara.voucher.giftcards-promotion.com +zarabiaj-dzis.pl +zarabiajwsieci.5v.pl +zarabiajwsieci.eu +zarabianiefb.club +zarabotat-na-sajte.ru +zarejestruj-sie.pl +zarenica.net +zarepta.com +zarget.com +zarobekok.pl +zarozinski.info +zarrmarketing.co.uk +zartsex.de +zasil-konto.tk +zasilkonto.cba.pl +zastenchivosti.net +zastrzyk-gotowki.waw.pl +zataz.fr.intellitxt.com +zatznotfunny.us.intellitxt.com +zavariushoponline.com +zavzlen.ru +zazagames.org +zb.zeroredirect1.com +zb1.zeroredirect1.com +zbest.in +zbierajnagrody.bo.pl +zbiornik.com +zbwp6ghm.com +zc.zeroredirect1.com +zc1.delta-boa.com +zc1.zeroredirect11.com +zcontentlocker7gpa8a.xyz +zd.zeroredirect1.com +zd.zeroredirect2.com +zd1.zeroredirect1.com +zd1.zeroredirect6.com +zdads.e-media.com +zdaj-to.pl +zdau-builder.122.2o7.net +zdbb.net +zdbb.netshelter.net +zdesformula.ru +zdesoboi.com +zdf.ivwbox.de +zdnet.be.intellitxt.com +zdravets.org +ze.zeroredirect1.com +ze.zeroredirect2.com +ze1.zeroredirect1.com +zealotnetworks-d.openx.net +zealousfield.com +zebradudka.com +zebramart.ru +zebutal.1.p2l.info +zed21.net +zedo.com +zee.cws.conviva.com +zeed2you.com +zeevex-online.com +zeg-distribution.com +zeit.met.vgwort.de +zeit01.webtrekk.net +zeiterasearch.extremereach.com +zeitonl.ivwbox.de +zejotyke.boxhost.me +zejrzyj-zdjecia.bo.pl +zekiatagur.com +zeldalagrange.com +zeldalily.us.intellitxt.com +zeleznobeton.ru +zemanta.com +zemgo.com +zencudo.co.uk +zendesk-staging.optimizely.com +zendesk.sizmek.com +zenigameblinger.org +zenkreka.com +zenpraktijk.nl +zensolar.com.au +zentastic.com +zentral.aws.branch.io +zenzuell.se +zenzuu.com +zeppelin.palebrook.wbinsights.com +zeppelin.playdemic.wbinsights.com +zeppelin.wbinsights.com +zero.airpr.com +zero.curalate.com +zero1.it +zerocash.msk.ru +zeromskiego-77.naszebanki.pl +zeroredirect.com +zeroredirect1.com +zeroredirect10.com +zeroredirect11.com +zeroredirect12.com +zeroredirect2.com +zeroredirect3.com +zeroredirect4.com +zeroredirect5.com +zeroredirect6.com +zeroredirect7.com +zeroredirect8.com +zeroredirect9.com +zeros.airpr.com +zerosex.info +zesiumshop.de +zestardshop.com +zettapetta.com +zeus.ad.intl.xiaomi.com +zeus.ad.xiaomi.com +zeus.developershed.com +zeusclicks.com +zevents.com +zf.zeroredirect1.com +zf1.quebec-bin.com +zf1.zeroredirect11.com +zfhg.digitaldesire.com +zfm.oewabox.at +zfotos.fromru.su +zgarniij_vouchher.skroc.pl +zgarnij.net +zgarnijnike.blogspot.com +zgarnijplik.pl +zgdfz6h7po.me +zgsysz.com +zh1.zeroredirect11.com +zhalehziba.com +zhirok.com +zibup.csheaven.com +zico.alphonso.tv +ziffdavis-d.openx.net +ziffdavisdesktoplinux.112.2o7.net +ziffdavisenterprise.112.2o7.net +ziffdavisenterpriseglobal.112.2o7.net +ziffdaviseweek.112.2o7.net +ziffdavisfilefront.112.2o7.net +ziffdavisglobal.112.2o7.net +ziffdavispennyarcade.112.2o7.net +zip.er.cz +zipitfast.com +zipzoomfly.122.2o7.net +zivbxion.ru +ziykrgc.ru +zj.zeroredirect1.com +zj1.zeroredirect1.com +zjemch.ru +zjjlf.croukwexdbyerr.net +zk.zeroredirect1.com +zkic.com +zkjovpdgxivg.ga +zkvdsdsftimj.bid +zl1.bravo-deg.com +zlate.de +zlatnajesen.com +zlektorem.pl +zlothonline.info +zlp6s.pw +zlx.com.br +zm1.zeroredirect5.com +zm232.com +zmedia.com +zmien-kolor.pl +zmien-motyw.blogspot.com +zmienienie-koloru.blogspot.com +zmienkolorfejsazafree.blogspot.com +zmienkolory.blogspot.com +zminer.zaloapp.com +zmoda.hostreo.com +zmotoryzowani24.pl +zn6dmaopednyvtshf-ups.siteintercept.qualtrics.com +zn_77ycxjaq1e0122v-cbs.siteintercept.qualtrics.com +znagburbioucamt8f-babycenter.siteintercept.qualtrics.com +znajdz-numer.pl +znakomstva-piter78.ru +znakomstvaonlain.ru +znaniyapolza.ru +znapapp.ae +znaptag-us.s3.amazonaws.com +znaturaloriginal.com +zndaowjdnf.stream +znsonssdb.bid +zny.coiner.site +zob-top-xlinks.com +zobacz24.pl +zobaczktopodgladaa.blogspot.com +zoccolemature.com +zocor.about-tabs.com +zoeksex.nu +zog.link +zoguo.com +zojirushi-products.ru +zoloft.1.p2l.info +zoloft.3.p2l.info +zoloft.4.p2l.info +zoloft.about-tabs.com +zolotoy-lis.ru +zona-aqua.ru +zonaamateur.com +zonawm.biz.popunder.ru +zonazorritas.com +zone3x.net +zoo-x.net +zoodrawings.com +zoofilia-total.com +zoofilia.cc +zoofiliagratis.biz +zoofiliasex.com +zoogdiesney.com +zoogdinsney.com +zoogdisany.com +zoogdiseny.com +zoogdisiny.com +zoogdisny.com +zooggames.com +zoominfo.com +zoomlensphotos.com +zoomovies.org +zoompegs.com +zoophil.com +zoosex-top.com +zoosexart.com +zootoplist.com +zootravel.com +zophim.me +zor.livefyre.com +zor.qa-ext.livefyre.com +zor.t402.livefyre.com +zorkiy.net +zorras.cc +zostan-zwyciezca.com +zous.szm.sk +zovermedical.com.sa +zqal.xyz +zqtk.net +zr0.net +zr1.zeroredirect11.com +zrdom.com.ua +zrh.bewilderinglyalbumin.com +zrrat.31772.club +zs1.zeroredirect1.com +zs11.cnzz.com +zs16.cnzz.com +zsc.scmspain.com +zsisk.com +zssdi.it +zt.tim-taxi.com +ztag-trackedevents-enterprise-1441845540.us-west-2.elb.amazonaws.com +ztest.thunderhead.com +ztrack.net +ztrf.net +zu1.november-lax.com +zug.us.intellitxt.com +zukiewicz.com +zulip.dynamicyield.com +zumodi.com +zurich-girls.ch +zuverink.net +zuzzer5.com +zvero.org +zverokruh-shop.cz +zvetki.ru +zviframe.biz +zwariowane.pl +zww.ero-advertising.com +zx6.ru +zxc1-ustokyyneikyfasnm.stackpathdns.com +zyban-store.shengen.ru +zyban.1.p2l.info +zyban.about-tabs.com +zybezradio.com +zymerget.bid +zymerget.date +zymerget.faith +zymerget.party +zymerget.stream +zymerget.win +zyprexa.about-tabs.com +zyrdu.cruisingsmallship.com +zyrtec.1.p2l.info +zyrtec.3.p2l.info +zyrtec.4.p2l.info +zyski-z-innowacji.pl +zytpirwai.net +zz.cqcounter.com +zzbroya.com.ua +zzhomes.com +zzqhsrg.ru +zzqrt.com +zzsyw.com +zzz.adx1.com +zzz.clickbank.net +zzzrtrcm2.com diff --git a/tests/unit/browser/test_adblock.py b/tests/unit/browser/test_adblock.py index 906ac5aba..e5d267c2c 100644 --- a/tests/unit/browser/test_adblock.py +++ b/tests/unit/browser/test_adblock.py @@ -22,13 +22,16 @@ import os import os.path import zipfile import logging +import shutil import pytest from PyQt5.QtCore import QUrl from qutebrowser.browser import adblock -from qutebrowser.utils import urlmatch +from qutebrowser.utils import urlmatch, standarddir +from tests.helpers import utils + pytestmark = pytest.mark.usefixtures('qapp', 'config_tmpdir') @@ -471,3 +474,15 @@ def test_add_directory(config_stub, basedir, download_stub, host_blocker = adblock.HostBlocker() host_blocker.adblock_update() assert len(host_blocker._blocked_hosts) == len(blocklist_hosts2) * 2 + + +def test_adblock_benchmark(config_stub, data_tmpdir, basedir, benchmark): + blocked_hosts = os.path.join(utils.abs_datapath(), 'blocked-hosts') + shutil.copy(blocked_hosts, str(data_tmpdir)) + + url = QUrl('https://www.example.org/') + blocker = adblock.HostBlocker() + blocker.read_hosts() + assert blocker._blocked_hosts + + benchmark(lambda: blocker.is_blocked(url)) From b3493efc80ee03894e0610d84a02d6ab07f8f4ae Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 5 Nov 2018 11:19:39 +0100 Subject: [PATCH 083/492] Remove unused import --- tests/unit/browser/test_adblock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/browser/test_adblock.py b/tests/unit/browser/test_adblock.py index e5d267c2c..e18c990cc 100644 --- a/tests/unit/browser/test_adblock.py +++ b/tests/unit/browser/test_adblock.py @@ -29,7 +29,7 @@ import pytest from PyQt5.QtCore import QUrl from qutebrowser.browser import adblock -from qutebrowser.utils import urlmatch, standarddir +from qutebrowser.utils import urlmatch from tests.helpers import utils From 6931f17f137b45073068e945ae041a4c0ab8f0d2 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 5 Nov 2018 14:52:18 +0100 Subject: [PATCH 084/492] Add debug logging for netrc --- qutebrowser/browser/webengine/webenginetab.py | 6 ++++++ qutebrowser/browser/webkit/network/networkmanager.py | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 944c4ce6d..eba9174b1 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1246,15 +1246,21 @@ class WebEngineTab(browsertab.AbstractTab): @pyqtSlot(QUrl, 'QAuthenticator*') def _on_authentication_required(self, url, authenticator): + log.network.debug("Authentication requested for {}, netrc_used {}" + .format(url.toDisplayString(), self.data.netrc_used)) + netrc_success = False if not self.data.netrc_used: self.data.netrc_used = True netrc_success = shared.netrc_authentication(url, authenticator) + if not netrc_success: + log.network.debug("Asking for credentials") abort_on = [self.shutting_down, self.load_started] answer = shared.authentication_required(url, authenticator, abort_on) if not netrc_success and answer is None: + log.network.debug("Aborting auth") try: # pylint: disable=no-member, useless-suppression sip.assign(authenticator, QAuthenticator()) diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py index df65b314d..8d2523456 100644 --- a/qutebrowser/browser/webkit/network/networkmanager.py +++ b/qutebrowser/browser/webkit/network/networkmanager.py @@ -275,14 +275,19 @@ class NetworkManager(QNetworkAccessManager): @pyqtSlot('QNetworkReply*', 'QAuthenticator*') def on_authentication_required(self, reply, authenticator): """Called when a website needs authentication.""" + url = reply.url() + log.network.debug("Authentication requested for {}, netrc_used {}" + .format(url.toDisplayString(), self.netrc_used)) + netrc_success = False if not self.netrc_used: self.netrc_used = True - netrc_success = shared.netrc_authentication(reply.url(), - authenticator) + netrc_success = shared.netrc_authentication(url, authenticator) + if not netrc_success: + log.network.debug("Asking for credentials") abort_on = self._get_abort_signals(reply) - shared.authentication_required(reply.url(), authenticator, + shared.authentication_required(url, authenticator, abort_on=abort_on) @pyqtSlot('QNetworkProxy', 'QAuthenticator*') From c09c34f46519011432564c068031d51fa01d783d Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 5 Nov 2018 18:58:52 +0100 Subject: [PATCH 085/492] Update _chromium_version comment for Qt 5.12 --- qutebrowser/utils/version.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index 165a6d4ad..7a99a4b65 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -335,7 +335,8 @@ def _chromium_version(): 5.11.2: Security fixes up to 68.0.3440.75 (2018-07-24) Qt 5.12: Chromium 69 - current 5.12 branch: 69.0.3497.70 (2018-09-11) + 69.0.3497.128 (~2018-09-17) + 5.12.0: Security fixes up to 70.0.3538.67 (2018-10-16) Also see https://www.chromium.org/developers/calendar and https://chromereleases.googleblog.com/ From 04fad935a07bf063090eaa8e40a4850cf2b2f11f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Nov 2018 18:59:12 +0100 Subject: [PATCH 086/492] Update urllib3 from 1.24 to 1.24.1 --- misc/requirements/requirements-codecov.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-codecov.txt b/misc/requirements/requirements-codecov.txt index 32875fa96..8d9439234 100644 --- a/misc/requirements/requirements-codecov.txt +++ b/misc/requirements/requirements-codecov.txt @@ -6,4 +6,4 @@ codecov==2.0.15 coverage==4.5.1 idna==2.7 requests==2.20.0 -urllib3==1.24 +urllib3==1.24.1 From 0070be00afa267f9bc49282755264a6cc06349a2 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Nov 2018 18:59:14 +0100 Subject: [PATCH 087/492] Update urllib3 from 1.24 to 1.24.1 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 819975943..47cdf4fc0 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -19,5 +19,5 @@ python-dateutil==2.7.5 requests==2.20.0 six==1.11.0 uritemplate==3.0.0 -urllib3==1.24 +urllib3==1.24.1 wrapt==1.10.11 From 31018e8717622a8a37f726bc2bd2d6bdcdb2829c Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Nov 2018 18:59:15 +0100 Subject: [PATCH 088/492] Update pyparsing from 2.2.2 to 2.3.0 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index f95e8f620..a3068c5f9 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -2,7 +2,7 @@ appdirs==1.4.3 packaging==18.0 -pyparsing==2.2.2 +pyparsing==2.3.0 setuptools==40.5.0 six==1.11.0 wheel==0.32.2 From 5b6233701dee7238aec127bfa78dd8acbde05c62 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Nov 2018 18:59:17 +0100 Subject: [PATCH 089/492] Update future from 0.17.0 to 0.17.1 --- misc/requirements/requirements-pyinstaller.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pyinstaller.txt b/misc/requirements/requirements-pyinstaller.txt index f75eeb3a5..4c7b57353 100644 --- a/misc/requirements/requirements-pyinstaller.txt +++ b/misc/requirements/requirements-pyinstaller.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py altgraph==0.16.1 -future==0.17.0 +future==0.17.1 macholib==1.11 pefile==2018.8.8 -e git+https://github.com/pyinstaller/pyinstaller.git@develop#egg=PyInstaller From 1e78f02dafa3e59a5f298e6afc59316262f0e219 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Nov 2018 18:59:18 +0100 Subject: [PATCH 090/492] Update jwcrypto from 0.5.0 to 0.6.0 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 47cdf4fc0..c37680408 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -9,7 +9,7 @@ cryptography==2.3.1 github3.py==1.2.0 idna==2.7 isort==4.3.4 -jwcrypto==0.5.0 +jwcrypto==0.6.0 lazy-object-proxy==1.3.1 mccabe==0.6.1 pycparser==2.19 From f8143dcf54b17f61ff8d29cd4c3f6965972bf446 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Nov 2018 18:59:20 +0100 Subject: [PATCH 091/492] Update hypothesis from 3.81.0 to 3.82.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index eb52e2cc7..a31695fb8 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -13,7 +13,7 @@ fields==5.0.0 Flask==1.0.2 glob2==0.6 hunter==2.0.2 -hypothesis==3.81.0 +hypothesis==3.82.1 itsdangerous==1.1.0 # Jinja2==2.10 Mako==1.0.7 From df134fd67f80ddd2cf750cba03013159f1a1b329 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Nov 2018 18:59:21 +0100 Subject: [PATCH 092/492] Update pytest from 3.9.3 to 3.10.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index a31695fb8..58ed5ec78 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -24,7 +24,7 @@ parse-type==0.4.2 pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 -pytest==3.9.3 +pytest==3.10.0 pytest-bdd==3.0.0 pytest-benchmark==3.1.1 pytest-cov==2.6.0 From 62be152c1a612ec4be9b9de7e11c8ab4eb29556e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Nov 2018 18:59:23 +0100 Subject: [PATCH 093/492] Update virtualenv from 16.0.0 to 16.1.0 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index a3c980b5e..9cda12622 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -5,4 +5,4 @@ py==1.7.0 six==1.11.0 toml==0.10.0 tox==3.5.3 -virtualenv==16.0.0 +virtualenv==16.1.0 From 32084de61780a45365dc30d1758cfffe334bf8b4 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Nov 2018 18:59:25 +0100 Subject: [PATCH 094/492] Update markupsafe from 1.0 to 1.1.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3edd4314a..022a6214f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ attrs==18.2.0 colorama==0.4.0 cssutils==1.0.2 Jinja2==2.10 -MarkupSafe==1.0 +MarkupSafe==1.1.0 Pygments==2.2.0 pyPEG2==2.15.2 PyYAML==3.13 From 2e562a926b659f084014876b7b11a8aa27884489 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Tue, 6 Nov 2018 08:05:17 -0500 Subject: [PATCH 095/492] Don't complete url and title from same search word. Resolves #4411: > When opening a webpage, the suggested results will include those whose > URL ends with the beginning of the string you've typed and whose title > begins with the rest of the string. By joining the url and title with a space, we ensure that the last word of the url and the first word of the title are treated as separate words. --- qutebrowser/completion/models/histcategory.py | 2 +- tests/unit/completion/test_histcategory.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/qutebrowser/completion/models/histcategory.py b/qutebrowser/completion/models/histcategory.py index 7c9fc920d..b6d5f0465 100644 --- a/qutebrowser/completion/models/histcategory.py +++ b/qutebrowser/completion/models/histcategory.py @@ -76,7 +76,7 @@ class HistoryCategory(QSqlQueryModel): # given the search term "a b", the WHERE clause would be: # ((url || title) LIKE '%a%') AND ((url || title) LIKE '%b%') where_clause = ' AND '.join( - "(url || title) LIKE :{} escape '\\'".format(i) + "(url || ' ' || title) LIKE :{} escape '\\'".format(i) for i in range(len(words))) # replace ' in timestamp-format to avoid breaking the query diff --git a/tests/unit/completion/test_histcategory.py b/tests/unit/completion/test_histcategory.py index b36125a4a..02a6cfd1e 100644 --- a/tests/unit/completion/test_histcategory.py +++ b/tests/unit/completion/test_histcategory.py @@ -82,6 +82,14 @@ def hist(init_sql, config_stub): ("ample itle", [('example.com', 'title'), ('example.com', 'nope')], [('example.com', 'title')]), + + # https://github.com/qutebrowser/qutebrowser/issues/4411 + ("mlfreq", + [('https://qutebrowser.org/FAQ.html', 'Frequently Asked Questions')], + []), + ("ml freq", + [('https://qutebrowser.org/FAQ.html', 'Frequently Asked Questions')], + [('https://qutebrowser.org/FAQ.html', 'Frequently Asked Questions')]), ]) def test_set_pattern(pattern, before, after, model_validator, hist): """Validate the filtering and sorting results of set_pattern.""" From 3fd097066ac018c3463ca82af42ae9407e0ad88b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 8 Nov 2018 12:42:59 +0100 Subject: [PATCH 096/492] Disallow spaces in search engine names --- qutebrowser/config/configdata.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index e0bad5ba9..ff43cc156 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1817,7 +1817,9 @@ url.searchengines: type: name: Dict required_keys: ['DEFAULT'] - keytype: String + keytype: + name: String + forbidden: ' ' valtype: SearchEngineUrl desc: >- Search engines which can be used via the address bar. From bd887ce988b0974153c56b76aa8790e9aa54dc17 Mon Sep 17 00:00:00 2001 From: Vicente Reyes Date: Sun, 11 Nov 2018 18:09:13 -0300 Subject: [PATCH 097/492] allow password_fill to work without final newline --- misc/userscripts/password_fill | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/userscripts/password_fill b/misc/userscripts/password_fill index a61a42c68..2e4f01b66 100755 --- a/misc/userscripts/password_fill +++ b/misc/userscripts/password_fill @@ -269,7 +269,7 @@ pass_backend() { break fi fi - done < <($GPG "${GPG_OPTS[@]}" -d "$path" ) + done < <($GPG "${GPG_OPTS[@]}" -d "$path" | awk 1 ) } } # ======================================================= From 0cc0d41b8167bb4834d398037d1cbc93d2d5e1dd Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Nov 2018 19:01:13 +0100 Subject: [PATCH 098/492] Update coverage from 4.5.1 to 4.5.2 --- misc/requirements/requirements-codecov.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-codecov.txt b/misc/requirements/requirements-codecov.txt index 8d9439234..621e81676 100644 --- a/misc/requirements/requirements-codecov.txt +++ b/misc/requirements/requirements-codecov.txt @@ -3,7 +3,7 @@ certifi==2018.10.15 chardet==3.0.4 codecov==2.0.15 -coverage==4.5.1 +coverage==4.5.2 idna==2.7 requests==2.20.0 urllib3==1.24.1 From 98b59efb0cc186a989ff2383a0471ad352bb2433 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Nov 2018 19:01:15 +0100 Subject: [PATCH 099/492] Update coverage from 4.5.1 to 4.5.2 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 58ed5ec78..d68fdb602 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -7,7 +7,7 @@ beautifulsoup4==4.6.3 cheroot==6.5.2 click==7.0 # colorama==0.3.9 -coverage==4.5.1 +coverage==4.5.2 EasyProcess==0.2.3 fields==5.0.0 Flask==1.0.2 From bb65b6ae2b77a0f1acc483040c9982d33a09164f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Nov 2018 19:01:16 +0100 Subject: [PATCH 100/492] Update requests from 2.20.0 to 2.20.1 --- misc/requirements/requirements-codecov.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-codecov.txt b/misc/requirements/requirements-codecov.txt index 621e81676..2ab6e78f0 100644 --- a/misc/requirements/requirements-codecov.txt +++ b/misc/requirements/requirements-codecov.txt @@ -5,5 +5,5 @@ chardet==3.0.4 codecov==2.0.15 coverage==4.5.2 idna==2.7 -requests==2.20.0 +requests==2.20.1 urllib3==1.24.1 From 4d8745660cfe3a7f0953afaec6c6a7cd793f9a9e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Nov 2018 19:01:18 +0100 Subject: [PATCH 101/492] Update requests from 2.20.0 to 2.20.1 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index c37680408..0ac9465be 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -16,7 +16,7 @@ pycparser==2.19 pylint==2.1.1 python-dateutil==2.7.5 ./scripts/dev/pylint_checkers -requests==2.20.0 +requests==2.20.1 six==1.11.0 uritemplate==3.0.0 urllib3==1.24.1 From c9fd9005787a464c92da3505bb84673f139c1118 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Nov 2018 19:01:19 +0100 Subject: [PATCH 102/492] Update cryptography from 2.3.1 to 2.4.1 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 0ac9465be..30b038ef8 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -5,7 +5,7 @@ astroid==2.0.4 certifi==2018.10.15 cffi==1.11.5 chardet==3.0.4 -cryptography==2.3.1 +cryptography==2.4.1 github3.py==1.2.0 idna==2.7 isort==4.3.4 From da091fb4b64f14e73dfa39c4b899ab2c1a7fa3d9 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Nov 2018 19:01:21 +0100 Subject: [PATCH 103/492] Update pytest from 3.10.0 to 3.10.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index d68fdb602..4cc08602f 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -24,7 +24,7 @@ parse-type==0.4.2 pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 -pytest==3.10.0 +pytest==3.10.1 pytest-bdd==3.0.0 pytest-benchmark==3.1.1 pytest-cov==2.6.0 From 4ec55d35975a0a8f5109b143178722828e2ad18d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Nov 2018 19:01:22 +0100 Subject: [PATCH 104/492] Update pytest-rerunfailures from 4.2 to 5.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 4cc08602f..c17f0d6b1 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -33,7 +33,7 @@ pytest-instafail==0.4.0 pytest-mock==1.10.0 pytest-qt==3.2.1 pytest-repeat==0.7.0 -pytest-rerunfailures==4.2 +pytest-rerunfailures==5.0 pytest-travis-fold==1.3.0 pytest-xvfb==1.1.0 PyVirtualDisplay==0.2.1 From 3e1bfc3e28e7a48021a3b528a235f06c8eb8ced6 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Mon, 12 Nov 2018 18:35:11 -0800 Subject: [PATCH 105/492] Fix 'in' vs 'equal' error --- qutebrowser/browser/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index d0627de92..ceafbc011 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -653,7 +653,7 @@ class CommandDispatcher: handler(browsertab=widget, win_id=self._win_id, baseurl=url, tab=tab, background=bg, window=window) elif where in ['up', 'increment', 'decrement']: - if where is 'up': + if where == 'up': url = url.adjusted(QUrl.RemoveFragment | QUrl.RemoveQuery) new_url = handlers[where](url, count) self._open(new_url, tab, bg, window, related=True) From 16bad3184b21ed35f785af959be8588812d059e1 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Mon, 12 Nov 2018 18:38:26 -0800 Subject: [PATCH 106/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 93cffe40c..22c5fd333 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -65,6 +65,7 @@ Fixed `content.cookies.accept = no-3rdparty` from working properly on some pages like GMail. However, the default for `content.cookies.accept` is still `all` to be in line with what other browsers do. +- `:navigate` not incrementing in anchors or queries or anchors. v1.5.2 ------ From bf10f483e14bd47a9ebd4dacded0d608d4304642 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Tue, 13 Nov 2018 20:44:57 -0500 Subject: [PATCH 107/492] Fix sql comment to match updated code. --- qutebrowser/completion/models/histcategory.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/completion/models/histcategory.py b/qutebrowser/completion/models/histcategory.py index b6d5f0465..83eafef50 100644 --- a/qutebrowser/completion/models/histcategory.py +++ b/qutebrowser/completion/models/histcategory.py @@ -74,7 +74,8 @@ class HistoryCategory(QSqlQueryModel): # build a where clause to match all of the words in any order # given the search term "a b", the WHERE clause would be: - # ((url || title) LIKE '%a%') AND ((url || title) LIKE '%b%') + # ((url || ' ' || title) LIKE '%a%') AND + # ((url || ' ' || title) LIKE '%b%') where_clause = ' AND '.join( "(url || ' ' || title) LIKE :{} escape '\\'".format(i) for i in range(len(words))) From ed84aa8c7b705bf2d3ac715748c644f1642ce585 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 14 Nov 2018 11:43:58 +0100 Subject: [PATCH 108/492] stylesheet.js: Check if document.documentElement exists Fixes #4244 --- qutebrowser/javascript/stylesheet.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/qutebrowser/javascript/stylesheet.js b/qutebrowser/javascript/stylesheet.js index b1cdeb26e..3dfefe700 100644 --- a/qutebrowser/javascript/stylesheet.js +++ b/qutebrowser/javascript/stylesheet.js @@ -40,6 +40,10 @@ window._qutebrowser.stylesheet = (function() { // then move the stylesheet to the end. Partially inspired by Stylus: // https://github.com/openstyles/stylus/blob/1.1.4.2/content/apply.js#L235-L355 function watch_root() { + if (!document.documentElement) { + return; + } + if (root_elem !== document.documentElement) { root_elem = document.documentElement; root_observer.disconnect(); @@ -53,7 +57,7 @@ window._qutebrowser.stylesheet = (function() { function create_style() { let ns = xhtml_ns; - if (document.documentElement.namespaceURI === svg_ns) { + if (document.documentElement && document.documentElement.namespaceURI === svg_ns) { ns = svg_ns; } style_elem = document.createElementNS(ns, "style"); From fa8462555668ff4d0ae25becc8a81f0c7357c967 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 14 Nov 2018 19:56:55 +0100 Subject: [PATCH 109/492] travis: Remove "sudo: false" See https://blog.travis-ci.com/2018-10-04-combining-linux-infrastructures --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bb11e0c3c..e7804cf4d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,3 @@ -sudo: false dist: trusty language: python group: edge From 02e350779b9708b3c0609125934c35932317b0eb Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 14 Nov 2018 19:59:19 +0100 Subject: [PATCH 110/492] travis: Upgrade to Xenial See https://blog.travis-ci.com/2018-11-08-xenial-release --- .travis.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index e7804cf4d..5b918a393 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -dist: trusty +dist: xenial language: python group: edge python: 3.6 @@ -26,11 +26,8 @@ matrix: - xfonts-base - os: linux env: TESTENV=py36-pyqt511-cov - # https://github.com/travis-ci/travis-ci/issues/9069 - os: linux python: 3.7 - sudo: required - dist: xenial env: TESTENV=py37-pyqt511 - os: osx env: TESTENV=py37 OSX=sierra From 6f60f10b8e5513cc97b4b91c6b5a01458752760a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 14 Nov 2018 20:03:05 +0100 Subject: [PATCH 111/492] travis: Add Windows --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5b918a393..99fdc3128 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,6 +33,9 @@ matrix: env: TESTENV=py37 OSX=sierra osx_image: xcode9.2 language: generic + - os: windows + python: 3.7 + env: TESTENV=py37-pyqt511 # https://github.com/qutebrowser/qutebrowser/issues/2013 # - os: osx # env: TESTENV=py35 OSX=yosemite From e1cb00bed332b29157adf97eb0d68c4d907ec0c7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 14 Nov 2018 20:03:15 +0100 Subject: [PATCH 112/492] Recompile requirements --- misc/requirements/requirements-tests.txt | 8 ++++---- misc/requirements/requirements-tox.txt | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index c17f0d6b1..27390c85a 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -5,8 +5,8 @@ attrs==18.2.0 backports.functools-lru-cache==1.5 beautifulsoup4==4.6.3 cheroot==6.5.2 -click==7.0 -# colorama==0.3.9 +Click==7.0 +# colorama==0.4.0 coverage==4.5.2 EasyProcess==0.2.3 fields==5.0.0 @@ -17,14 +17,14 @@ hypothesis==3.82.1 itsdangerous==1.1.0 # Jinja2==2.10 Mako==1.0.7 -# MarkupSafe==1.0 +# MarkupSafe==1.1.0 more-itertools==4.3.0 parse==1.9.0 parse-type==0.4.2 pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 -pytest==3.10.1 +pytest==4.0.0 pytest-bdd==3.0.0 pytest-benchmark==3.1.1 pytest-cov==2.6.0 diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index 9cda12622..097859b6e 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -1,5 +1,6 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py +filelock==3.0.10 pluggy==0.8.0 py==1.7.0 six==1.11.0 From 19cb3598ccf6f831132bf60ccb086c91b9f5107b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 15 Nov 2018 09:47:27 +0100 Subject: [PATCH 113/492] Revert "travis: Add Windows" This reverts commit 6f60f10b8e5513cc97b4b91c6b5a01458752760a. Was supposed to be in a branch. --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 99fdc3128..5b918a393 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,9 +33,6 @@ matrix: env: TESTENV=py37 OSX=sierra osx_image: xcode9.2 language: generic - - os: windows - python: 3.7 - env: TESTENV=py37-pyqt511 # https://github.com/qutebrowser/qutebrowser/issues/2013 # - os: osx # env: TESTENV=py35 OSX=yosemite From 7ee68c43dfca6adce094c9e90e8a8a780dd5d618 Mon Sep 17 00:00:00 2001 From: Raphael Das Gupta Date: Fri, 16 Nov 2018 00:39:54 +0100 Subject: [PATCH 114/492] Fix grammar: This kind of question requires "does" in English --- doc/faq.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/faq.asciidoc b/doc/faq.asciidoc index c4176a438..3d3d4f7bc 100644 --- a/doc/faq.asciidoc +++ b/doc/faq.asciidoc @@ -215,7 +215,7 @@ What's the difference between insert and passthrough mode?:: be useful to rebind escape to something else in passthrough mode only, to be able to send an escape keypress to the website. -Why takes it longer to open an URL in qutebrowser than in chromium?:: +Why does it take longer to open an URL in qutebrowser than in chromium?:: When opening an URL in an existing instance the normal qutebrowser Python script is started and a few PyQt libraries need to be loaded until it is detected that there is an instance running From bca47ff8797a35ef02bd43a6353c804045d26fd6 Mon Sep 17 00:00:00 2001 From: Raphael Das Gupta Date: Fri, 16 Nov 2018 00:42:17 +0100 Subject: [PATCH 115/492] Fix grammar: add required comma --- doc/faq.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/faq.asciidoc b/doc/faq.asciidoc index 3d3d4f7bc..cffdce7f5 100644 --- a/doc/faq.asciidoc +++ b/doc/faq.asciidoc @@ -216,7 +216,7 @@ What's the difference between insert and passthrough mode?:: able to send an escape keypress to the website. Why does it take longer to open an URL in qutebrowser than in chromium?:: - When opening an URL in an existing instance the normal qutebrowser + When opening an URL in an existing instance, the normal qutebrowser Python script is started and a few PyQt libraries need to be loaded until it is detected that there is an instance running where the URL is then passed to. This takes some time. From 409e0d33cdd53899685b88edfc8a9b81b0edb2e6 Mon Sep 17 00:00:00 2001 From: Raphael Das Gupta Date: Fri, 16 Nov 2018 00:43:18 +0100 Subject: [PATCH 116/492] fix grammar: "to which" instead of "to where" --- doc/faq.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/faq.asciidoc b/doc/faq.asciidoc index cffdce7f5..a844bcfde 100644 --- a/doc/faq.asciidoc +++ b/doc/faq.asciidoc @@ -219,7 +219,7 @@ Why does it take longer to open an URL in qutebrowser than in chromium?:: When opening an URL in an existing instance, the normal qutebrowser Python script is started and a few PyQt libraries need to be loaded until it is detected that there is an instance running - where the URL is then passed to. This takes some time. + to which the URL is then passed. This takes some time. One workaround is to use this https://github.com/qutebrowser/qutebrowser/blob/master/scripts/open_url_in_instance.sh[script] and place it in your $PATH with the name "qutebrowser". This From 2152081d82bb9ea43bfd5562c6f964ff4026f193 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 16 Nov 2018 12:36:58 +0100 Subject: [PATCH 117/492] s/an URL/a URL/g --- doc/changelog.asciidoc | 4 ++-- doc/faq.asciidoc | 4 ++-- qutebrowser/app.py | 4 ++-- qutebrowser/browser/browsertab.py | 2 +- qutebrowser/browser/webengine/webenginetab.py | 2 +- qutebrowser/config/config.py | 2 +- qutebrowser/javascript/greasemonkey_wrapper.js | 2 +- scripts/dev/misc_checks.py | 3 ++- tests/unit/browser/webkit/network/test_pac.py | 2 +- tests/unit/config/test_config.py | 4 ++-- tests/unit/utils/test_urlmatch.py | 2 +- 11 files changed, 16 insertions(+), 15 deletions(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 22c5fd333..41515d287 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -1244,7 +1244,7 @@ Added - New `:debug-log-filter` command to change console log filtering on-the-fly. - New `:debug-log-level` command to change the console loglevel on-the-fly. - New `general -> yank-ignored-url-parameters` option to configure which URL - parameters (like `utm_source` etc.) to strip off when yanking an URL. + parameters (like `utm_source` etc.) to strip off when yanking a URL. - Support for the https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API[HTML5 page visibility API] - New `readability` userscript which shows a readable version of a page (using @@ -1355,7 +1355,7 @@ Changed - `:hint` has a new `--add-history` argument to add the URL to the history for yank/spawn targets. - `:set` now cycles through values if more than one argument is given. -- `:open` now opens `default-page` without an URL even without `-t`/`-b`/`-w` given. +- `:open` now opens `default-page` without a URL even without `-t`/`-b`/`-w` given. Deprecated ~~~~~~~~~~ diff --git a/doc/faq.asciidoc b/doc/faq.asciidoc index a844bcfde..6687917c7 100644 --- a/doc/faq.asciidoc +++ b/doc/faq.asciidoc @@ -215,8 +215,8 @@ What's the difference between insert and passthrough mode?:: be useful to rebind escape to something else in passthrough mode only, to be able to send an escape keypress to the website. -Why does it take longer to open an URL in qutebrowser than in chromium?:: - When opening an URL in an existing instance, the normal qutebrowser +Why does it take longer to open a URL in qutebrowser than in chromium?:: + When opening a URL in an existing instance, the normal qutebrowser Python script is started and a few PyQt libraries need to be loaded until it is detected that there is an instance running to which the URL is then passed. This takes some time. diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 1cfcc8496..7d1b61131 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -303,10 +303,10 @@ def process_pos_args(args, via_ipc=False, cwd=None, target_arg=None): def open_url(url, target=None, no_raise=False, via_ipc=True): - """Open an URL in new window/tab. + """Open a URL in new window/tab. Args: - url: An URL to open. + url: A URL to open. target: same as new_instance_open_target (used as a default). no_raise: suppress target window raising. via_ipc: Whether the arguments were transmitted over IPC. diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index bb0b31626..b2be458ce 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -845,7 +845,7 @@ class AbstractTab(QWidget): @pyqtSlot(QUrl) def _on_predicted_navigation(self, url): - """Adjust the title if we are going to visit an URL soon.""" + """Adjust the title if we are going to visit a URL soon.""" qtutils.ensure_valid(url) url_string = url.toDisplayString() log.webview.debug("Predicted navigation: {}".format(url_string)) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index eba9174b1..0f1d368e9 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1390,7 +1390,7 @@ class WebEngineTab(browsertab.AbstractTab): @pyqtSlot(QUrl) def _on_predicted_navigation(self, url): - """If we know we're going to visit an URL soon, change the settings. + """If we know we're going to visit a URL soon, change the settings. This is a WORKAROUND for https://bugreports.qt.io/browse/QTBUG-66656 """ diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index facfcc553..1f2e45741 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -357,7 +357,7 @@ class Config(QObject): """Get an object which can be mutated, e.g. in a config.py. If a pattern is given, return the value for that pattern. - Note that it's impossible to get a mutable object for an URL as we + Note that it's impossible to get a mutable object for a URL as we wouldn't know what pattern to apply. """ self.get_opt(name) # To make sure it exists diff --git a/qutebrowser/javascript/greasemonkey_wrapper.js b/qutebrowser/javascript/greasemonkey_wrapper.js index 457118696..f8c36151a 100644 --- a/qutebrowser/javascript/greasemonkey_wrapper.js +++ b/qutebrowser/javascript/greasemonkey_wrapper.js @@ -60,7 +60,7 @@ details.method = details.method ? details.method.toUpperCase() : "GET"; if (!details.url) { - throw new Error("GM_xmlhttpRequest requires an URL."); + throw new Error("GM_xmlhttpRequest requires a URL."); } // build XMLHttpRequest object diff --git a/scripts/dev/misc_checks.py b/scripts/dev/misc_checks.py index 299246448..27ff0105b 100644 --- a/scripts/dev/misc_checks.py +++ b/scripts/dev/misc_checks.py @@ -89,7 +89,8 @@ def check_spelling(): '[Ww]ether', '[Pp]rogramatically', '[Ss]plitted', '[Ee]xitted', '[Mm]ininum', '[Rr]esett?ed', '[Rr]ecieved', '[Rr]egularily', '[Uu]nderlaying', '[Ii]nexistant', '[Ee]lipsis', 'commiting', - 'existant', '[Rr]esetted', '[Ss]imilarily', '[Ii]nformations'} + 'existant', '[Rr]esetted', '[Ss]imilarily', '[Ii]nformations', + '[Aa]n [Uu][Rr][Ll]'} # Words which look better when splitted, but might need some fine tuning. words |= {'[Ww]ebelements', '[Mm]ouseevent', '[Kk]eysequence', diff --git a/tests/unit/browser/webkit/network/test_pac.py b/tests/unit/browser/webkit/network/test_pac.py index ff0346411..8c03c6cee 100644 --- a/tests/unit/browser/webkit/network/test_pac.py +++ b/tests/unit/browser/webkit/network/test_pac.py @@ -183,7 +183,7 @@ def test_fail_return(): ]) @pytest.mark.parametrize('from_file', [True, False]) def test_secret_url(url, has_secret, from_file): - """Make sure secret parts in an URL are stripped correctly. + """Make sure secret parts in a URL are stripped correctly. The following parts are considered secret: - If the PAC info is loaded from a local file, nothing. diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index 672faf04a..946770bf1 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -473,7 +473,7 @@ class TestConfig: assert conf.get('colors.completion.category.fg') == QColor('white') def test_get_for_url(self, conf): - """Test conf.get() with an URL/pattern.""" + """Test conf.get() with a URL/pattern.""" pattern = urlmatch.UrlPattern('*://example.com/') name = 'content.javascript.enabled' conf.set_obj(name, False, pattern=pattern) @@ -484,7 +484,7 @@ class TestConfig: (False, configutils.UNSET) ]) def test_get_for_url_fallback(self, conf, fallback, expected): - """Test conf.get() with an URL and fallback.""" + """Test conf.get() with a URL and fallback.""" value = conf.get('content.javascript.enabled', url=QUrl('https://example.com/'), fallback=fallback) diff --git a/tests/unit/utils/test_urlmatch.py b/tests/unit/utils/test_urlmatch.py index e569c51b8..1dd57a5e9 100644 --- a/tests/unit/utils/test_urlmatch.py +++ b/tests/unit/utils/test_urlmatch.py @@ -142,7 +142,7 @@ def test_parse_path(pattern, path): ("data:monkey", 'data', None, 'monkey'), # existing scheme ]) def test_lightweight_patterns(pattern, scheme, host, path): - """Make sure we can leave off parts of an URL. + """Make sure we can leave off parts of a URL. This is a deviation from Chromium to make patterns more user-friendly. """ From a641dde9de657c8c58344fb8052eddb764c58f52 Mon Sep 17 00:00:00 2001 From: Winny Date: Sun, 18 Nov 2018 01:50:03 -0600 Subject: [PATCH 118/492] Change phrases to sound more definite/concrete --- doc/help/configuring.asciidoc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/help/configuring.asciidoc b/doc/help/configuring.asciidoc index 57e5528c0..280a9921a 100644 --- a/doc/help/configuring.asciidoc +++ b/doc/help/configuring.asciidoc @@ -19,10 +19,10 @@ hand, you can simply use those - see <> for details. For more advanced configuration, you can write a `config.py` file - see -<>. As soon as a `config.py` +<>. When `config.py` exists, the `autoconfig.yml` file **is not read anymore** by default. You need -to <> if you want settings done via -`:set`/`:bind` to still persist. +to <> if you want settings changed via +`:set`/`:bind` to persist between restarts. [[autoconfig]] Configuring qutebrowser via the user interface @@ -229,18 +229,18 @@ Loading `autoconfig.yml` ~~~~~~~~~~~~~~~~~~~~~~~~ All customization done via the UI (`:set`, `:bind` and `:unbind`) is -stored in the `autoconfig.yml` file, which is not loaded automatically as soon -as a `config.py` exists. If you want those settings to be loaded, you'll need to -explicitly load the `autoconfig.yml` file in your `config.py` by doing: +stored in file `autoconfig.yml`. When file `config.py` exists, `autoconfig.yml` +is not loaded automatically. To load `autoconfig.yml` automatically, add the +following snippet to `config.py`: -.config.py: [source,python] ---- config.load_autoconfig() ---- -If you do so at the top of your file, your `config.py` settings will take -precedence as they overwrite the settings done in `autoconfig.yml`. +You can configure which file overrides the other by the location of the above code snippet. +Place the snippet at the top to allow `config.py` override `autoconfig.yml` settings. +Place the snippet at the bottom to for the opposite effect. Importing other modules ~~~~~~~~~~~~~~~~~~~~~~~ From de166f71dcd9f2b4b3c72d4203eb755f548419b4 Mon Sep 17 00:00:00 2001 From: Winny Date: Sun, 18 Nov 2018 01:53:45 -0600 Subject: [PATCH 119/492] Fixup --- doc/help/configuring.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/help/configuring.asciidoc b/doc/help/configuring.asciidoc index 280a9921a..9e6f2a3c7 100644 --- a/doc/help/configuring.asciidoc +++ b/doc/help/configuring.asciidoc @@ -239,8 +239,8 @@ config.load_autoconfig() ---- You can configure which file overrides the other by the location of the above code snippet. -Place the snippet at the top to allow `config.py` override `autoconfig.yml` settings. -Place the snippet at the bottom to for the opposite effect. +Place the snippet at the top to allow `config.py` to override `autoconfig.yml`. +Place the snippet at the bottom for the opposite effect. Importing other modules ~~~~~~~~~~~~~~~~~~~~~~~ From a2ba0b4c7661969ae1184fdcda12cda21340c6b1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 08:38:54 +0100 Subject: [PATCH 120/492] Thanks to the HSR! --- .github/img/hsr.png | Bin 0 -> 12922 bytes README.asciidoc | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 .github/img/hsr.png diff --git a/.github/img/hsr.png b/.github/img/hsr.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1312f6d3539983e63ef42e46f3db4386fc46be GIT binary patch literal 12922 zcmaKzWl$Vl*ro>w5Ind9cXti$Ft`K{?i$=RKya7AU4uJ=6WpEP?(WXcyZdA7tJ>PG z?yl3*Q>VM0WA}YMGvUgL(kO@ohyVZpMOH>a6##(x3Ms21Kts-->t9I#fG>Am>RK+U zM((7JP7dZ)wq~R*o{nauW*%1N0D#AG5y&dxD_@M%#|@S zb2AXc)IR_B2zsQ`ZlUXBc=BE=@KA}yTZ!EWr+pdh=P|#^Ng(Km+H3y0Hks|;MLZM3 z^?q0J(XlJ+|5C7P_FC@oXftf{w4U%m>-qNd9J|hBG9qvh&C5|m}y*G_qr%piHjHgLFC#nJ&0%i$4cPeW5dtj ze@P$<5dVp-(LG-=)3QZ!QAJhLGr?%nX**PgzWa)AtQ`%J&QVf9Nw(WF{vdOu+YOUu zUuE-}-(X{o#!Jeb!^Vfy{7kd;HT@n>Q;x=twT&=w{8z;}8>#+6O0(yT)PPW&YVFf9 ztg8{v@m!2zu@KVv$ofRhD8!UR35RFxZ|lfE`0E}G7MU8J>+P>M)R{ew-lIp}I_y8x z8|`8juPe|EFB1qjW(NhSvp&de#*21#eoPu;Z~iKRnP$Tb*7O)Gvm&o*v>Lv@0V9X}GtWp4{8}FikG6 zYuc>HDw*yam}lcM9j;1i7cBfE%r_-sdi^cH{)P7EN?FLSIy7@mda@kZ20ODji$WI! z>kScB1$QAS&A9OMGmgp z;t;BaXT|i#ls=NxrbnH_i9EAy(WP(A**i}EHcRZ11nwGk)Un|(Gt?bX?Z}Wvr`wY} z$!s`1>ex*EG6N~&9H-haEgqhX*?qSs|JT7Y&*aQySzI$}=EFQ|px4kL_vvPc*SRj; zV-ORwNLKfJgtCB@iEFngYRWtp_05uE-^-lXS0l^wA<@pF>!A=NOSre9E>@3k<@=fX z$R znfL%{lU$X9?XAywzAJSdNbCX%t{xe_lYJU zwV>*c?-XD7Qyo5`99%qmqMTLYRGs3z9497nWU;qQu$^jGexE}`=G_0unjr6)NKd!Yh5^1|T5-N%>?k@I)(%8VDw-hfJ3@!TA8!Qp z_$4=49sy>gvs=Y+RSM=rptF`o89;V=Y*swa^Rsy+t_^@dN`_L3h?ty-!^S%I1UNl{ zPWp-ZyJ(~B?0enzBw$2Uul_<(AmC|_;FfiXZcWO9qK<)+W~zH%`wJ^Ua@c6C=Qk68 z4#|`sl*nqKn=D>i^nPYq1DP2H>j+7w;Wtvk)q_68K>@2JGPI?y!f>BqGAcjMRudr# zHp~s^D9bv09gqmdrspON8Q#?|L@jLDl5ung2f)_PSqj!EeFB(ix%HECO*`jm68Rig zjRe=-H3me3k3hU?Uo4HZiwIZ5?pUzy8fXDrlGPd2$N3Rf#d{*Wypxmx-n^fSRS-!5 z5*4~*iH9jbT74F1GqnhpO}D@OI$6YPz|YdkCbkxAGJ)n6L-i({`~;s}t$UK58b|&mwMv6$XDYA+^ioG4G#Q^7h?4S z#Aq13Ed34l_$})Kxy8-aT-qOV*UT*N%_NGyu$<)yJhiTnoMJX)7AQ;W0q0`gzpKg( zIEyq)b%NfDd=rFOYui>k4bkVKTyy=XDjWqXPf@( zQ4}{)_sA{LYgh$C{7KP2e?CYW9T+}aMHKzWMY;OpnkmsPxNsBMA=RDXJ5?G+=Q+$z zi6r1gUVR!rUjBuSmf4y`OGtmcsB$a2wduVuevzP4R`^Vg0~ z>=u`K30Z9;IsXJ~1U0wsF1xC;>}=X>)8V1SAlj`@Xyg<+$nlt$g0&p;`naCz=#xok zw;TbHHUYA;(PmmXpHMoMg&Q*{V3zZiJuWWdubOuo>gQ2LM{(Wq}m61RJPARtwSC z`X`7Vd3AZ_h5d>6`xLOI`AB-nYTGiHwOr=!WdQh;p#SeDR%pUHx;MYd5{nw*zjMRgR-Y~M9hpiFbdp{zx z8^IX?;p2--#x5odG;~p6=8?&F?XGrN>cKs+$U(PWRseXqtaxGv{%d_CG(~Y4?8A}Sv;_#alE!R`ISc8b|gOVze zym6jxOnWqgpebcAYPw67=WjgRC43dUEdrj7$LKlS0VM=L5?tW+sVrk_YgWArdW+fZ zDIBhx5^+md@ciIR94;?5lq5Jso10NpnZ=a}MwygV2E|Ad5aC^?>w5f&viI>oyNZ78 z4FP4=kiXr)c{7VAs)Qb~aS$N@Y7S3O7Un6BEL0SaRASsvlsXB|@O~?wc-PbeR*jW<`M&D{SsD*}c3xfG+aMt*W} zkC8LLI<0#;*SrvlP+>kX=L^;pW-3xY(P;wBb=%j)nJ*(o`4LKDO4!1fJrbt3Xhk~N z1>mvrNRehbJf&Y>oKOnIg~`DB#{)7<(|%B4=`!tN=D%-(&H;PMW{y@C0iq_#51jd? zO|>|KpYj(O%tR6+u#*spFc7?X8@}NaeJ8udwfCH&pcQEs4n;^kIUqCj-||AR_gKkK z4YXiaHHsJF?$5^=sd7|4ggbl~cHcI~f}0mrfZ})0C)LAt#DtrOdc&-U(3uM4VChEK zj7A@>s)ldM`qLX=YR3jtoMjqt71H~ zA`_T~WIFED6aOG#s|!t_I~_HJU+5(K&2Nu=x)XrxQfgb;V?GzvP)*y-be4c8k`lOu zM5}?n)Uj6oqxl4vr65R{2H7lWgvpx-Um=*!- z-`YJ3T%#tj3$#(c6cr*Eo1eGA1NwZVf{5Fbb}DZD2>Lnb|)r|d6QyP*VMB01D0qj+S$;8Ll0s0MCWV2ETD+MnGh)})}Z4r&1ox^x7+ zViF5BB%dljfxgMcZgi{bILAtkGEa@UyDRnQFb3Adp8RJTl$g!GaF?J@ee;tcox0))WMTj8f7Dfz zuznU)LpgC13|uMtLmUPJM7oT<%*+u)@ml&gR4Z>mD{x1Lk-?MtB6{%YM8wX?C~$rB zrKNlx-V{9T{U}Y*AvbzHhON(eXD>NX%dUBg z9aa}`P`-|X`s3Zt7Bn}+Mq9|dWcMwj*M5jrcyXLq;tB>${*!q}2?4hvoFLrN_oqhz zcEa(uA2)qBzu7xk6@5!iWU$TWiUfD$YvhIP_DT%$9zEDyk?qBLmeGf#RFiiHlej2= zmzCXRZXRY==X%pvX2VeweV6{cFPJb#&K%~k_~3BcU{VKXk7_8%pv!3783RA$6~Yt*B$3p34h-qAf|&pcekZ(Y&H3Pu->fE0GnC(=F`(O^R*Fp~yPs`lXSFDY)Is2a^SamcaUg7V%8+psgqkVOF|r zCf^SdPwL77Ep!OPkx88C{9& zk)z|hWv-*~TUsr?`aL$b$B!0&`!X^7k)SFYoEsPpom5sYJ~O)FcB-89x2#&%}wkaQ!04!jz&*Iwh1@T(*>@AJZHESQFBr8 z%RNIh0?jlBXPiY1%s)fwm_O@s+a3j_X&4sRWA`gsM8jxM3VcKmKPr>&f0Yn&`wvMu z%4jN{Fg^ET8GS>tV{ie(am8m6_tO;B~%8W3+$o|ytmBNs{ConmS`3dPeI`+z%HXZ$O9w%K8Dbx`a zx+*D|nZG~dA2x~Z+>58qt|z}opQW)00S@qsk9)SK+de+5q{^iMYM@B>!HtI=ao8vn zfcM)2JUaRZv3e3SU5ZR0gs33`paaCr=@n_v(Xq*EQyI6fJoK2uM)$aRcp@e2>XP$m zBS?Q=FH+$Ei&Rh3B*e7oiCW2&~I1R+g6m00II6ICc7Dxi>AO zT3eFUzr^ZLSHfcDzrw1`^(Hm)H?QIsB1@2;3dt)gE9)3BA|**CBd?!)n3$M~s!w7I zq{-3F`jUjMtoX;5w3x*?G6cuwzd#`XNIfQcFWk|=cAdsG4p7NowLx_vAW{QWnuXL+7GBLkxT4Ewcph!T(OP6dp3u2l2%vAUGRm)dJ zXJ_Yn3GyRPZQ|HPLRF)zzL(DLKXF%mmGDUXJuUv~@Yx$mQ-yfyy9;G~Td^2^$f4R0 zMiv=bl_VtRE-Nb&T?;9E=FFuX8uu;IgVcc(@bki2`U|XRkMy5qVp5ue`HA0+k4iMS zXk97=^YimS(AaL+gEjq#i;GK}8J8lHc1-_(gf=@~p7Xxg|E>!?TtY!XK`5tMLK`(~ zc66ByMaqk8YvAsrrIhQ-O5Z+9H@LWRrOR7a@Aaw*P7(@QnbY)~e5}US#-^gYT)_YS zw1|U-wR$Gr-~m3&N1Qq_@7XWw(W}xKQBt}!Xng#1a#q)`J?FRy2JEyYAEt|q0^$QM zEKy*Db2l~Vv*|3n!v@Gx>*}!g@<=J)BBR5KqW@Z4otvA3b;V6MPRxTeSHo4Y9`52z zpxRz{!{6nV#`s_eO&@sZ5XN=lNx`#VgDIzIa~-qT0E)cfm*Y^Ly{Ra8wY#v@#n* zB0)c=FH^4M0E&nR4V3}{BQeZc_3SSQ14v~KZ$BdnQ@OwRdP+H7&bLI~&10uk;t^tE z6JqXhT3)Vt-uU`RTUuMY*|-%8DgNtlh6j+IJ*n+y_`IHO&u=ACD}_cN$riO&i}9)6 z&1jO1f@0%KY%t@cIAU7ynyHLUzU$CurzO7ohz|(we_z>K5}paK1Xlk`TziSihsE@iG2!MAWUU(VffqI zd#yg!I!6<$loK`K@s5Z4a(hVcjRaEs2 z*og>u^vRwn?5!2@5kIh!J1s6gNoBd+Wk`WEMb3xJ#uq;aM5Jm1C0;^TEcaB0jfSg* zte1$+?_>Y~EEMDw{-AA;#>@QZ@WSr2{!E_?05pYE6APG@hKGMvU#-UfRh^+eGRb|s zS5r<1zgf}({~0zYtK+SBT$lL=INC*irNT>7_4>ZjSXgqfaW*PiL0(}H4)%228(lan zGYPg4Cqd3LPKMIe)zwUPzQPmxY&J>AkHDwxz;{z5)q%&pPnH240qdunDDL6TP9%vm z@sq+&Q3RRt>=*hZhNUt4bF+Dw*erZO_;b|{OKr(vIQ8Q{pGIp;zT25SkK!u-BrEgU zsmP_(R3=ZRJ>WYv!kyzP7#SIn0|NIjA|oRezdoUS$Z{0lwac0ez-?AWbhvz>XLeD) z4OJgOtAIq#N$nSUp)>;#c=Lz-LkQSN(&1Mpv_C&HZ(wFdxHlk$E~HUEqWJHs0x>!t`qSF8^QTQLnB#iI!~EaM`u|_ zN2deiHZ`7B4xWe@-6IDGD0yBA>_MITckBE6o@FkEI6M~K#|`gJ)jVxDtOdw=I9{x8 z7XkC0#Z>8F*g=1ai>ZY8mH1pVHSTV`y&_Cy&6?!(t z=H}F8$kb8)WiwD;P_epW;9MJzY{%NOx;wDd?7#$UbHDXl%FBu#A?#@*~ z!4@m|`0#MXk`oCy%51&?ESfnkFK4FI{I0$^==J=ZWA^^-uck!#2Oa^z@h9lOl$55F zl;Q|P6Ofc5gz@5 z2X1Q{X5!qvdBQ(Ba&>Klh3=Ujk5+6308Guz)6&{gL0MULhK2!ys*~fxbc~FY=y9S| zRX8{)Ev3)T&ws{{QNti}3;)=xnt=fcATBBCaElGkz#o*5aJtR@TPzO%pdT6iXWNum z&+()EPs3cL$(o;>Q(XoayxKc19jkg7x4gf9>-YBT+DRrW8~%9J9mwqE<&~9jwJn(* z5<+#~m_E!%$HXKF$S%t_T;xe_G_E}{zVF>GjR67qjXR&sH4EF8x2 zf4R5&VP7RfIWs?hcYRG>QGV^wp33s$F$OPi1}O%Yp?%i=NvSd zQ=`LrOjG1DIE5G(X2(|bl$5&a>M(#GC--M)rt9FyYGt3-!|8QFVMz1S&&N%AlT=*} zCk|r5NO5!4FfuYBNQjC1deatRBZ+ykJLkIDh8x!ZYnh;;=`!erbTeP7clLMZ*=GmO zENZ2L|sioX+;Hgcs~Gu8deVhpL&e3qx!9+>h~(lC>anrG5yXwIx;db((7CmH~e%^ zsk;PIUR`a_YReWcGI!pO#mZa!44agk{NCWalJk&Qt63K|xG5a-?zi>&w8!ur8UX2H z%Nh*iP4*9WMAI;sd2b)}7D~Yu69ngbRNi&@`Nsd+|23bNXzA$C(}wv>L=teA|Dg(= zcFpeoDH<9YinvmZ4g=q+n9cqPAVP}n6()!;vzp(K2(db)>niMO$(Kco4 z`-h60({p44CXJFw+xh@d>VQC+R!duz4nS)*Hc{&?_Gy1KgL7+hT31k;u%cXy~UBx?e4iuG$9382-`BwIONR1!Ga+zFROJoAEun44O4C}Ov{>D#!zJJV zuYQapt^WR!PE(*+8q9EdKtPKP&k8)BzUqB9+RDR64H494cYLW)c6JW;2)yA;3)>Pc z?fbLcpD_70Z=1IPgpeo6-i3hpGc*}S9QPlw9M0blU-|0c(9X?)4dPv=^$o`-klEM! zEwE5EpnygZ&B?Vt290%N}|)`w-Hj3zyhV zV>9vf@rjit{^oL-D(L+H1$e$a>NDr@l|QOleZ-8t+CAZW?3foN{cXB^Bu9mToot`O z;zf3@v$#(J9cR;gJ_PcIg;t@TrIDdDhQ5Bc!{~f_sj2aFzgYKt-jx+G+@x9a!3qF} z$L@}Gk*&YGHZ~$lo>5km(UiOg6D=;xMd9t!rv^$DjHhF|JxpX(d0$_+eZ<{fZcT5X zRqMUkp`EX!vVHKjFQkW>Q@t-`W>-1kB1n#CsLW2iQVs2&o_=-T$~@I6D^XGlK4AXK z**!4utRU+5Jen#vPlR7uR`v-l2J8*?g(1dG6)hU#gq z-6D0kzrs+fC#AaMg$4cn=1(vkWm=6YiY_et5tVA?5E<$1Ln!1GD2hovU=V}p+8AuE zi9jGscDxj?YA%cGsXkn8vruWl4$Lo5^qHX!&Z#eHduiANIwG)vQj)uN zO}?L|n_5_qpmQ3nq$oJ|?VlVTo0^+SND@c$kwj+A&&<5v4b>Lih&TIo4Gs^Ng=~nC zC!U_3f>S^l85Hp{kmuk|h`a=V9%4LY_wNp06PZ<#5i+a8dDfXQcvTHB1BjSVH8_sQ<(PdU|@m4xQE zKb6r@mRh15_#i-l5H@mIX~{wsa-k(6(=U%;E~5BCj72He1k&E{d&?H^%Zz`o^Z$U_ z7)uYykjJQ%*bpIksk5+MEolYy8M0#WZxpJQg(OD@2lshP$rkNL`ROs^+F(RW_1ULK zL_|Q8wVj>Zvhd{W%!~wid_f`wNIpfbXg}rqJrTw(EIC5Y+!*poLxN&ShK|<1rDfwq zS_9WX7*!1oB7PSwh$tyeF<-2x2hWfe3BM0)jK0nYYS^pnY0j&Oiun9vgQ%nbA(8&a z1ts=h&9Ib|l;vd|+j25k%6Wf$zgNHJ;N&uxKGVOKWVNZxBMLA(H&4O(naui08#jy7 zBUmpPB-}I%44A;N@p0E0_W$;#rlp4)VjsSpc?QjzF;rws>5BU!&-^BCX$CcT225#& zSx;y2`ucjuEglEG2mEcX!%Zlq2dE|XL`aub%!(SA$fxDEACpl+!!2v*D7#ACnHb3I zAq<5t>-5@_>us#K{35RUhQv$a&yl0;dUf4+I8*@fB4$d0zUgh2PsfKt!aCpV{E{Cz z-!!Jdo;SE-AU05+)y5#3=|t~q!bk~zD{Vw}ba)TP#qx{I4_Pyzdiv@@3?&Jb+u_mG z%Taa38)eINXHA#cj(=e_i5U;;ygn z`}-fxSARZS9>#snp`o1Dgh{WhEz%JFISB0p2#_G>Bl0z#*`=EmGw<}sGyEn_9?v`G z+#&%XBtlv(Rh5-z!cKE5+xb;Cf6W~+5MV1heg8$HEMW*n@kKM@0024H7G`F5Rkut{ zdR;9oOYXmNQk&7ZNiyfB;xe*~%;uZLseKYYth(>i5#t^&p%RD3CPrLbZ))oOg~tVW zc$z-|xb(@#kY{uX3VV5ak1Cp0RaB?u&m`@dhDH~3c0#2L?Oa*gSU>u_KRL4zv!Cn| z7g07hH009O)ERpWGjesf-h`&7KL@|K$4K=XW?>}Dtu^)GRK zvxVrV|Av9R{lq4jxD0(EJlgro(+e&Z&aVlBxr~lhQbVP?r@WHt>WT{8xE!9|4J9|P zySrZ%fjdC}05>-`ARs6RT6^?NZw!Pv80*ZNdC0-`NB}+^OC6+$)#vrMzfG&1wSe7u z8XrGWgbeG632Kt_63C?ZixdGGJyn$1W4pm>_Ciq61{=XVMBbuSODjJEEUmNb9FXt7 z)&_~xVnWYvL3bTS91An^%_b7q)3Q#SmKJ1!-Q#kF=@_A(uiZW3TE-e?W~=`WTk2`p zP{|Okn+paJ^SsVZX1&Ooyd_A)kzi!#s`f%txknfCBlJuhZ1bJ+Qe16xI zJj<2cHI>o|v!J~^U2X*n!pH8Xs{glhRAgJ=W=6-@T3SA0Xeeb0P+iATh~=Tbgoj*M zTUl9^Rxi$3Z&W9X<-sbT@cDBOtSsUJ@y~ahw|bx0L@^s08ce~;kF+0=G9i9PL9`L~ z`6=r`668!eO#;mK7=VDu1EO!Q6$g$i+8cc{4vWHavMP#?F~1wr9#(tgdLrB*DoKsw z2G`1Jsnqt6^x!wj7ACYb8b1Hnzo)ltp#Mkw)qxTpKcA8C+1c67WY+Edee#Xp(EBn@ zC&A6Ww^xhE*@sxb7wbJTbOd#E^%~bd7~vAMSk{)7oA7mflH~CcBIVE_;_sjEx) zqgtIF8v(Yw+?4V9OK1vCXL>q+il|WsdYn2sx}*FjsQ>)o|2h3v`2S!0KknWM{|X9P z)S8mlhIpXQu+UV6^K)~Y+;u{Y2pQw&vWlo-5I^@(y-Eeaqo(ZMbP!f5VB2#5jr>X; z8;Q%Z3H6-9q$|qBDd2yux7i}Xc&w$SHXGm9Ww%j_IofTSvfAcZ-&Cvv1bW{t)mBy6 zJIx>>A+ZeV_s018NO`oKliv+v5=3*aj-Dh& zu;L+yO{ZRjF%3h+Fv0$edFLS%u^JY<2rdl>Pv2OJGc*P&VJuj(})Nh@uiUP(S zGOst8$Xsqcd07`YZ(G*sGODU0Qy?o75{}qt#}_nb4DJCSbZ2`RZJnqTNEuo5ldIUu zV@Z{7Z|5fiaW7u>(AR?2mzEkn4g^o}Z9n2E%!;l&1zcUDr}&%!h;tt#EC$jlx0eoK zza_S>lNp9huV?2cm3P&R@wXqyaC$csV?T3@7tE+zx_mLt`G!L6#<0*jw zwCJ5jpL~AuY%Mn5pDk7xOdsEJtfJ9l@Oblzt2k*m;s5~d?(U>xUw`Op?D04i=Hv(i zNO@>z-krV%k)HJS(P3o`3=A-&?#PYGg`qw48WVn3{|=D>s+zhyp2zAuJnn$***SFz ziUPld1wa5HPZb0sxN`m>a#+Wr)&mdhIYGk&hkAOAWYg1mzA)Zh^|vrAjejN(?rb?! zus%+lE*NZQU;uk;3FJ%~G?>boN$!mke&+k94e1Iw&4z&yh)2Dx^%v_Mgu*|!r}Fv= zRjuTlRJZ%WC^6`KOke>bFGuJjz&1EG#)#SjzeuR5+2kIy%Z& zL|nZmwqu~CrY6Wt^o4N2BtL~o+l8E6l@`m~!h%V^9UZvZWHy`C^^qV$`Sj!|3RUpr z)2U96V$e)Yca(}N zES@9mPn|6HZfPO&>S~+o&1}E*;*|AHRws| zWSKqkWC~cZgE(tQBIf&dH8mtaZc$}cYDR|R*)rJOOy2x6fRy5GuRR19^>Ryw5q^Ap ztW~B`FbH9?y5GRMn#^1I18{H&!=~`?gVGNl&;U+OP61h20xmD)K#`hecf9j6UG>}I zrlu5a)$MP+v5?q60mM5&mDSZsdCCHCXq8pv&;aC{YsD6~s;P*QTR!&81^kDR5Vt|wojYiefxdh-gZ%C=XTCj3{gTBgoChZQK3 zBv%Lk*buI?ECJ^=G$0Hcl4IiM=ZCyD#4||bM}R<2|5*R=NCguwo9w`>$q$Ck! zrBYCo!$N?KRZS4GL<`KVuAba;sva1$TdqSvD)}_tH3=szO*1ysGd$Df?>|-tVM2X7 zN}m)^n3N6D<2^sBf3`*2Usu=ArMV#xKgtB^V4kakoqg&$tH zL;@8ZNCFzLIY}s~!W4m8^@kGU^M8ppH{#Mmw-#6#Q}%`Tvu|#K{`W3F4*v`t&Z?F* zIKw!KjU^wJaWpIPR-T;ttEDRj#s{7?s*unU-@yP!})lc!n8H_GP3x)v){wCZOq zZpJ^`G0BC*c-~?+2=#KikI@<%9~p^|mPMP!v-9e2F1qF(_0ZCh>SSy}cNW zv9Y!$N2oJ-cqoe{QTmGOcswT?<-JT){ewR%rtAd*a%0fG219RdZpu(6q7n1^P>>mI zx74QY7}t`g>zw^Lw6LobBZmS&mOV%iKkp0(wfH;SOytyn3(JZmxe6fykaIb^1OEQ} z$x2nZ8zPp5rOy7gf$cWVrl#ifI!&h^15`XcTP-FGdX0mBfW2JBHkW#X7KMa5)6VS7 z=H0I!yCG&eQIb${K+2;|QrvXcD+3#fo@bDopqqYW9E nr4Hx8^Q> Date: Thu, 22 Nov 2018 08:30:28 +0100 Subject: [PATCH 121/492] mypy: Add to tox --- misc/requirements/requirements-mypy.txt | 5 +++++ misc/requirements/requirements-mypy.txt-raw | 1 + tox.ini | 10 ++++++++++ 3 files changed, 16 insertions(+) create mode 100644 misc/requirements/requirements-mypy.txt create mode 100644 misc/requirements/requirements-mypy.txt-raw diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt new file mode 100644 index 000000000..3a6548040 --- /dev/null +++ b/misc/requirements/requirements-mypy.txt @@ -0,0 +1,5 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +mypy==0.641 +mypy-extensions==0.4.1 +typed-ast==1.1.0 diff --git a/misc/requirements/requirements-mypy.txt-raw b/misc/requirements/requirements-mypy.txt-raw new file mode 100644 index 000000000..f0aa93ac8 --- /dev/null +++ b/misc/requirements/requirements-mypy.txt-raw @@ -0,0 +1 @@ +mypy diff --git a/tox.ini b/tox.ini index 8e9a54f11..4b80e8dde 100644 --- a/tox.ini +++ b/tox.ini @@ -188,3 +188,13 @@ deps = whitelist_externals = eslint changedir = {toxinidir}/qutebrowser/javascript commands = eslint --color --report-unused-disable-directives . + +[testenv:mypy] +basepython = {env:PYTHON:python3} +passenv = +deps = + -r{toxinidir}/requirements.txt + -r{toxinidir}/misc/requirements/requirements-mypy.txt +commands = + #{envpython} -m mypy --ignore-missing-imports --allow-untyped-decorators --allow-subclassing-any --strict src + {envpython} -m mypy qutebrowser From 0999945af446131604f4dd9c76f5b93dcc867573 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 13:48:34 +0100 Subject: [PATCH 122/492] mypy: Run with --ignore-missing-imports --- tox.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tox.ini b/tox.ini index 4b80e8dde..9deaa64b0 100644 --- a/tox.ini +++ b/tox.ini @@ -196,5 +196,4 @@ deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-mypy.txt commands = - #{envpython} -m mypy --ignore-missing-imports --allow-untyped-decorators --allow-subclassing-any --strict src - {envpython} -m mypy qutebrowser + {envpython} -m mypy --ignore-missing-imports qutebrowser From 4d1b3df5e0156f90d0d7c80380347b5d38ce73c5 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 13:51:43 +0100 Subject: [PATCH 123/492] mypy: Fix logging.VDEBUG issues --- qutebrowser/utils/log.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/qutebrowser/utils/log.py b/qutebrowser/utils/log.py index 381e9ca5d..a1c4f74b7 100644 --- a/qutebrowser/utils/log.py +++ b/qutebrowser/utils/log.py @@ -76,12 +76,13 @@ LOG_COLORS = { # We first monkey-patch logging to support our VDEBUG level before getting the # loggers. Based on http://stackoverflow.com/a/13638084 +# mypy doesn't know about this, so we need to ignore it. VDEBUG_LEVEL = 9 logging.addLevelName(VDEBUG_LEVEL, 'VDEBUG') -logging.VDEBUG = VDEBUG_LEVEL +logging.VDEBUG = VDEBUG_LEVEL # type: ignore LOG_LEVELS = { - 'VDEBUG': logging.VDEBUG, + 'VDEBUG': logging.VDEBUG, # type: ignore 'DEBUG': logging.DEBUG, 'INFO': logging.INFO, 'WARNING': logging.WARNING, @@ -89,17 +90,6 @@ LOG_LEVELS = { 'CRITICAL': logging.CRITICAL, } -LOGGER_NAMES = [ - 'statusbar', 'completion', 'init', 'url', - 'destroy', 'modes', 'webview', 'misc', - 'mouse', 'procs', 'hints', 'keyboard', - 'commands', 'signals', 'downloads', - 'js', 'qt', 'rfc6266', 'ipc', 'shlexer', - 'save', 'message', 'config', 'sessions', - 'webelem', 'prompt', 'network', 'sql', - 'greasemonkey' -] - def vdebug(self, msg, *args, **kwargs): """Log with a VDEBUG level. @@ -114,7 +104,7 @@ def vdebug(self, msg, *args, **kwargs): # pylint: enable=protected-access -logging.Logger.vdebug = vdebug +logging.Logger.vdebug = vdebug # type: ignore # The different loggers used. @@ -148,6 +138,17 @@ network = logging.getLogger('network') sql = logging.getLogger('sql') greasemonkey = logging.getLogger('greasemonkey') +LOGGER_NAMES = [ + 'statusbar', 'completion', 'init', 'url', + 'destroy', 'modes', 'webview', 'misc', + 'mouse', 'procs', 'hints', 'keyboard', + 'commands', 'signals', 'downloads', + 'js', 'qt', 'rfc6266', 'ipc', 'shlexer', + 'save', 'message', 'config', 'sessions', + 'webelem', 'prompt', 'network', 'sql', + 'greasemonkey' +] + ram_handler = None console_handler = None From 97d0cff93b452de34f5d415ac9c7ccf9d812a01e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 13:54:17 +0100 Subject: [PATCH 124/492] mypy: Ignore ImportError handling See https://github.com/python/mypy/issues/1153 --- qutebrowser/browser/qutescheme.py | 2 +- qutebrowser/misc/checkpyver.py | 8 ++++---- qutebrowser/misc/earlyinit.py | 2 +- qutebrowser/qt.py | 2 +- qutebrowser/utils/qtutils.py | 2 +- qutebrowser/utils/version.py | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 0fa9366a6..b78404de9 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -37,7 +37,7 @@ try: import secrets except ImportError: # New in Python 3.6 - secrets = None + secrets = None # type: ignore from PyQt5.QtCore import QUrlQuery, QUrl, qVersion diff --git a/qutebrowser/misc/checkpyver.py b/qutebrowser/misc/checkpyver.py index 50330ef88..cf8e13810 100644 --- a/qutebrowser/misc/checkpyver.py +++ b/qutebrowser/misc/checkpyver.py @@ -30,12 +30,12 @@ try: except ImportError: # pragma: no cover try: # Python2 - from Tkinter import Tk - import tkMessageBox as messagebox + from Tkinter import Tk # type: ignore + import tkMessageBox as messagebox # type: ignore except ImportError: # Some Python without Tk - Tk = None - messagebox = None + Tk = None # type: ignore + messagebox = None # type: ignore # First we check the version of Python. This code should run fine with python2 diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index b29e1508f..38dffa691 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -38,7 +38,7 @@ import datetime try: import tkinter except ImportError: - tkinter = None + tkinter = None # type: ignore # NOTE: No qutebrowser or PyQt import should be done here, as some early # initialization needs to take place before that! diff --git a/qutebrowser/qt.py b/qutebrowser/qt.py index 2878bbe98..d9f1dc58d 100644 --- a/qutebrowser/qt.py +++ b/qutebrowser/qt.py @@ -25,4 +25,4 @@ try: from PyQt5 import sip except ImportError: - import sip + import sip # type: ignore diff --git a/qutebrowser/utils/qtutils.py b/qutebrowser/utils/qtutils.py index c634eb95f..a7c30919f 100644 --- a/qutebrowser/utils/qtutils.py +++ b/qutebrowser/utils/qtutils.py @@ -39,7 +39,7 @@ from PyQt5.QtCore import (qVersion, QEventLoop, QDataStream, QByteArray, try: from PyQt5.QtWebKit import qWebKitVersion except ImportError: # pragma: no cover - qWebKitVersion = None + qWebKitVersion = None # type: ignore MAXVALS = { diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index 7a99a4b65..a52e31ed8 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -42,12 +42,12 @@ from PyQt5.QtWidgets import QApplication try: from PyQt5.QtWebKit import qWebKitVersion except ImportError: # pragma: no cover - qWebKitVersion = None + qWebKitVersion = None # type: ignore try: from PyQt5.QtWebEngineWidgets import QWebEngineProfile except ImportError: # pragma: no cover - QWebEngineProfile = None + QWebEngineProfile = None # type: ignore import qutebrowser from qutebrowser.utils import log, utils, standarddir, usertypes, message From 563e1e829484ef68bc80b7fe3edf890fc9b7f2a7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 13:56:30 +0100 Subject: [PATCH 125/492] mypy: Ignore yaml.CSafe{Loader,Dumper} See https://github.com/python/typeshed/blob/master/third_party/2and3/yaml/__init__.pyi#L9 --- qutebrowser/utils/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py index 6119675ba..18dce2b05 100644 --- a/qutebrowser/utils/utils.py +++ b/qutebrowser/utils/utils.py @@ -41,7 +41,8 @@ from PyQt5.QtWidgets import QApplication import pkg_resources import yaml try: - from yaml import CSafeLoader as YamlLoader, CSafeDumper as YamlDumper + from yaml import (CSafeLoader as YamlLoader, # type: ignore + CSafeDumper as YamlDumper) YAML_C_EXT = True except ImportError: # pragma: no cover from yaml import SafeLoader as YamlLoader, SafeDumper as YamlDumper From a1e83f07735c293a59643ef9acd8bbf1a67253f1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 14:07:41 +0100 Subject: [PATCH 126/492] mypy: Use class-based API for enum.IntEnum See https://github.com/python/mypy/issues/4865 --- qutebrowser/browser/downloads.py | 6 +++++- qutebrowser/mainwindow/tabwidget.py | 7 +++++-- qutebrowser/misc/backendproblem.py | 12 ++++++++---- qutebrowser/misc/crashdialog.py | 8 ++++++-- qutebrowser/utils/usertypes.py | 15 +++++++++++---- 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index 92d846bd8..9c2a88a87 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -40,7 +40,11 @@ from qutebrowser.utils import (usertypes, standarddir, utils, message, log, from qutebrowser.qt import sip -ModelRole = enum.IntEnum('ModelRole', ['item'], start=Qt.UserRole) +class ModelRole(enum.IntEnum): + + """Custom download model roles.""" + + item = Qt.UserRole # Remember the last used directory diff --git a/qutebrowser/mainwindow/tabwidget.py b/qutebrowser/mainwindow/tabwidget.py index f2605e7d3..f9c2ac0e6 100644 --- a/qutebrowser/mainwindow/tabwidget.py +++ b/qutebrowser/mainwindow/tabwidget.py @@ -37,8 +37,11 @@ from qutebrowser.misc import objects from qutebrowser.browser import browsertab -PixelMetrics = enum.IntEnum('PixelMetrics', ['icon_padding'], - start=QStyle.PM_CustomBase) +class PixelMetrics(enum.IntEnum): + + """Custom PixelMetrics attributes.""" + + icon_padding = QStyle.PM_CustomBase class TabWidget(QTabWidget): diff --git a/qutebrowser/misc/backendproblem.py b/qutebrowser/misc/backendproblem.py index d5f7c9680..8e57a0223 100644 --- a/qutebrowser/misc/backendproblem.py +++ b/qutebrowser/misc/backendproblem.py @@ -38,10 +38,14 @@ from qutebrowser.utils import usertypes, objreg, version, qtutils, log, utils from qutebrowser.misc import objects, msgbox -_Result = enum.IntEnum( - '_Result', - ['quit', 'restart', 'restart_webkit', 'restart_webengine'], - start=QDialog.Accepted + 1) +class _Result(enum.IntEnum): + + """The result code returned by the backend problem dialog.""" + + quit = QDialog.Accepted + 1 + restart = QDialog.Accepted + 2 + restart_webkit = QDialog.Accepted + 3 + restart_webengine = QDialog.Accepted + 4 @attr.s diff --git a/qutebrowser/misc/crashdialog.py b/qutebrowser/misc/crashdialog.py index 27dec3345..a846cc59a 100644 --- a/qutebrowser/misc/crashdialog.py +++ b/qutebrowser/misc/crashdialog.py @@ -42,8 +42,12 @@ from qutebrowser.misc import (miscwidgets, autoupdate, msgbox, httpclient, from qutebrowser.config import config, configfiles -Result = enum.IntEnum('Result', ['restore', 'no_restore'], - start=QDialog.Accepted + 1) +class Result(enum.IntEnum): + + """The result code returned by the crash dialog.""" + + restore = QDialog.Accepted + 1 + no_restore = QDialog.Accepted + 2 def parse_fatal_stacktrace(text): diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index 039d805f9..82a95c3fd 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -221,10 +221,17 @@ KeyMode = enum.Enum('KeyMode', ['normal', 'hint', 'command', 'yesno', 'prompt', 'jump_mark', 'record_macro', 'run_macro']) -# Exit statuses for errors. Needs to be an int for sys.exit. -Exit = enum.IntEnum('Exit', ['ok', 'reserved', 'exception', 'err_ipc', - 'err_init', 'err_config', 'err_key_config'], - start=0) +class Exit(enum.IntEnum): + + """Exit statuses for errors. Needs to be an int for sys.exit.""" + + ok = 0 + reserved = 1 + exception = 2 + err_ipc = 3 + err_init = 4 + err_config = 5 + err_key_config = 6 # Load status of a tab From b37dbc45723bee27a5ba0d5e7cfea1c64e0cc1f2 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 14:19:31 +0100 Subject: [PATCH 127/492] mypy: Add missing annotations --- qutebrowser/browser/commands.py | 2 +- qutebrowser/browser/webkit/network/networkmanager.py | 4 +++- qutebrowser/commands/cmdutils.py | 9 +++------ qutebrowser/config/configcache.py | 4 +++- qutebrowser/config/configtypes.py | 5 +++-- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index ceafbc011..e94e55c3d 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -645,7 +645,7 @@ class CommandDispatcher: inc_or_dec='decrement'), 'increment': functools.partial(navigate.incdec, inc_or_dec='increment'), - } + } # type: typing.Dict[str, typing.Callable] try: if where in ['prev', 'next']: diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py index 8d2523456..31e9e815f 100644 --- a/qutebrowser/browser/webkit/network/networkmanager.py +++ b/qutebrowser/browser/webkit/network/networkmanager.py @@ -21,6 +21,7 @@ import collections import html +import typing import attr from PyQt5.QtCore import (pyqtSlot, pyqtSignal, QCoreApplication, QUrl, @@ -28,6 +29,7 @@ from PyQt5.QtCore import (pyqtSlot, pyqtSignal, QCoreApplication, QUrl, from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply, QSslSocket from qutebrowser.config import config +from qutebrowser.mainwindow import prompt from qutebrowser.utils import (message, log, usertypes, utils, objreg, urlutils, debug) from qutebrowser.browser import shared @@ -37,7 +39,7 @@ from qutebrowser.browser.webkit.network import (webkitqutescheme, networkreply, HOSTBLOCK_ERROR_STRING = '%HOSTBLOCK%' -_proxy_auth_cache = {} +_proxy_auth_cache = {} # type: typing.Dict[ProxyId, prompt.AuthInfo] @attr.s(frozen=True) diff --git a/qutebrowser/commands/cmdutils.py b/qutebrowser/commands/cmdutils.py index f9ce91b8f..768cc430e 100644 --- a/qutebrowser/commands/cmdutils.py +++ b/qutebrowser/commands/cmdutils.py @@ -17,18 +17,15 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -"""Contains various command utils and a global command dict. - -Module attributes: - cmd_dict: A mapping from command-strings to command objects. -""" +"""Contains various command utils and a global command dict.""" import inspect +import typing from qutebrowser.utils import qtutils, log from qutebrowser.commands import command, cmdexc -cmd_dict = {} +cmd_dict = {} # type: typing.Dict[str, command.Command] def check_overflow(arg, ctype): diff --git a/qutebrowser/config/configcache.py b/qutebrowser/config/configcache.py index dfead6664..cdba6456a 100644 --- a/qutebrowser/config/configcache.py +++ b/qutebrowser/config/configcache.py @@ -20,6 +20,8 @@ """Implementation of a basic config cache.""" +import typing + from qutebrowser.config import config @@ -36,7 +38,7 @@ class ConfigCache: """ def __init__(self) -> None: - self._cache = {} + self._cache = {} # type: typing.Dict[str, typing.Any] config.instance.changed.connect(self._on_config_changed) def _on_config_changed(self, attr: str) -> None: diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index 5503ea4f3..0314805c0 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -52,6 +52,7 @@ import datetime import functools import operator import json +import typing import attr import yaml @@ -304,7 +305,7 @@ class MappingType(BaseType): MAPPING: The mapping to use. """ - MAPPING = {} + MAPPING = {} # type: typing.Dict[str, typing.Any] def __init__(self, none_ok=False, valid_values=None): super().__init__(none_ok) @@ -576,7 +577,7 @@ class FlagList(List): the valid values of the setting. """ - combinable_values = None + combinable_values = None # type: typing.Optional[typing.Iterable] _show_valtype = False From 052c3f92ada0ad3a09aa46dd1fcc335baa2eb496 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 14:34:57 +0100 Subject: [PATCH 128/492] mypy: Fix issues with config default values --- qutebrowser/config/config.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 1f2e45741..41309d352 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -22,6 +22,7 @@ import copy import contextlib import functools +import typing from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject @@ -30,11 +31,15 @@ from qutebrowser.utils import utils, log, jinja from qutebrowser.misc import objects from qutebrowser.keyinput import keyutils +MYPY = False +if MYPY: + from qutebrowser.config import configcache + # An easy way to access the config from other code via config.val.foo -val = None -instance = None -key_instance = None -cache = None +val = typing.cast('ConfigContainer', None) +instance = typing.cast('Config', None) +key_instance = typing.cast('KeyConfig', None) +cache = typing.cast('configcache.ConfigCache', None) # Keeping track of all change filters to validate them later. change_filters = [] From c2c3f68828556063c6f1570cfb213ce25728a482 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 14:37:15 +0100 Subject: [PATCH 129/492] mypy: Move tabbed_browser --- qutebrowser/commands/runners.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/qutebrowser/commands/runners.py b/qutebrowser/commands/runners.py index c3f5d87a1..f1c7641e7 100644 --- a/qutebrowser/commands/runners.py +++ b/qutebrowser/commands/runners.py @@ -58,6 +58,9 @@ def _current_url(tabbed_browser): def replace_variables(win_id, arglist): """Utility function to replace variables like {url} in a list of args.""" + tabbed_browser = objreg.get('tabbed-browser', scope='window', + window=win_id) + variables = { 'url': lambda: _current_url(tabbed_browser).toString( QUrl.FullyEncoded | QUrl.RemovePassword), @@ -67,13 +70,13 @@ def replace_variables(win_id, arglist): 'clipboard': utils.get_clipboard, 'primary': lambda: utils.get_clipboard(selection=True), } + for key in list(variables): modified_key = '{' + key + '}' variables[modified_key] = lambda x=modified_key: x + values = {} args = [] - tabbed_browser = objreg.get('tabbed-browser', scope='window', - window=win_id) def repl_cb(matchobj): """Return replacement for given match.""" From b63ed090d8e1c21d9bd57aa8a6d875d48e23ae97 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 14:43:23 +0100 Subject: [PATCH 130/492] mypy: Fix log handler access --- qutebrowser/misc/utilcmds.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py index d108a56ac..b8d8be447 100644 --- a/qutebrowser/misc/utilcmds.py +++ b/qutebrowser/misc/utilcmds.py @@ -312,6 +312,7 @@ def log_capacity(capacity: int): if capacity < 0: raise cmdexc.CommandError("Can't set a negative log capacity!") else: + assert log.ram_handler is not None log.ram_handler.change_log_capacity(capacity) @@ -326,6 +327,7 @@ def debug_log_level(level: str): level: The log level to set. """ log.change_console_formatter(log.LOG_LEVELS[level.upper()]) + assert log.console_handler is not None log.console_handler.setLevel(log.LOG_LEVELS[level.upper()]) From 08bd47bc16a27c46891b773efcaaec0a0e34d1cb Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 14:46:22 +0100 Subject: [PATCH 131/492] mypy: Fix type for :scroll --- qutebrowser/browser/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index e94e55c3d..0bb3d076b 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -681,7 +681,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - def scroll(self, direction: typing.Union[str, int], count=1): + def scroll(self, direction: str, count=1): """Scroll the current tab in the given direction. Note you can use `:run-with-count` to have a keybinding with a bigger From 923fd893230a04e733d49513a607f71f1c24c932 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 14:48:30 +0100 Subject: [PATCH 132/492] mypy: Fix int-issues in commands.py --- qutebrowser/browser/commands.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 0bb3d076b..2af938fb5 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -75,7 +75,7 @@ class CommandDispatcher: new_window.show() return new_window.tabbed_browser - def _count(self): + def _count(self) -> int: """Convenience method to get the widget count.""" return self._tabbed_browser.widget.count() @@ -1143,6 +1143,8 @@ class CommandDispatcher: self.tab_next() return + assert isinstance(index, int) + if index < 0: index = self._count() + index + 1 @@ -1184,6 +1186,7 @@ class CommandDispatcher: if config.val.tabs.wrap: new_idx %= self._count() else: + assert isinstance(index, int) # absolute moving if count is not None: new_idx = count - 1 From 808309196711d77efd5e0e65e1eda31747a2b985 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 14:53:30 +0100 Subject: [PATCH 133/492] mypy: Fix _color_flag init --- qutebrowser/mainwindow/statusbar/bar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/mainwindow/statusbar/bar.py b/qutebrowser/mainwindow/statusbar/bar.py index c3ef53b1b..3edb8128a 100644 --- a/qutebrowser/mainwindow/statusbar/bar.py +++ b/qutebrowser/mainwindow/statusbar/bar.py @@ -145,7 +145,7 @@ class StatusBar(QWidget): resized = pyqtSignal('QRect') moved = pyqtSignal('QPoint') _severity = None - _color_flags = [] + _color_flags = None STYLESHEET = _generate_stylesheet() From 8b1fd83366eeae0a11146bf50291a66362063a3c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 14:54:36 +0100 Subject: [PATCH 134/492] mypy: Fix AbstractSettings default values --- qutebrowser/config/websettings.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/qutebrowser/config/websettings.py b/qutebrowser/config/websettings.py index fb80c543b..659f793f8 100644 --- a/qutebrowser/config/websettings.py +++ b/qutebrowser/config/websettings.py @@ -19,6 +19,8 @@ """Bridge from QWeb(Engine)Settings to our own settings.""" +import typing + from PyQt5.QtGui import QFont from qutebrowser.config import config, configutils @@ -44,10 +46,10 @@ class AbstractSettings: """Abstract base class for settings set via QWeb(Engine)Settings.""" - _ATTRIBUTES = None - _FONT_SIZES = None - _FONT_FAMILIES = None - _FONT_TO_QFONT = None + _ATTRIBUTES = {} # type: typing.Dict[str, AttributeInfo] + _FONT_SIZES = {} # type: typing.Dict[str, typing.Any] + _FONT_FAMILIES = {} # type: typing.Dict[str, typing.Any] + _FONT_TO_QFONT = {} # type: typing.Dict[typing.Any, QFont.StyleHint] def __init__(self, settings): self._settings = settings From 12b26512fc511518d3b37d37eb78b406991e08d2 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 22 Nov 2018 15:02:41 +0100 Subject: [PATCH 135/492] mypy: Fix :session-save We use a sentinel value for the argument so we can check whether the default was used. To express that in the type system, it needs a separate class. --- qutebrowser/misc/sessions.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index 78adeb983..9d3736cdb 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -23,6 +23,7 @@ import os import os.path import itertools import urllib +import typing from PyQt5.QtCore import QUrl, QObject, QPoint, QTimer from PyQt5.QtWidgets import QApplication @@ -37,7 +38,12 @@ from qutebrowser.mainwindow import mainwindow from qutebrowser.qt import sip -default = object() # Sentinel value +class Sentinel: + + pass + + +default = Sentinel() def init(parent=None): @@ -109,7 +115,7 @@ class SessionManager(QObject): def __init__(self, base_path, parent=None): super().__init__(parent) - self._current = None + self._current = None # type: typing.Optional[str] self._base_path = base_path self._last_window_session = None self.did_load = False @@ -504,8 +510,9 @@ class SessionManager(QObject): @cmdutils.argument('name', completion=miscmodels.session) @cmdutils.argument('win_id', win_id=True) @cmdutils.argument('with_private', flag='p') - def session_save(self, name: str = default, current=False, quiet=False, - force=False, only_active_window=False, with_private=False, + def session_save(self, name: typing.Union[str, Sentinel] = default, + current=False, quiet=False, force=False, + only_active_window=False, with_private=False, win_id=None): """Save a session. @@ -518,7 +525,9 @@ class SessionManager(QObject): only_active_window: Saves only tabs of the currently active window. with_private: Include private windows. """ - if name is not default and name.startswith('_') and not force: + if (not isinstance(name, Sentinel) and + name.startswith('_') and + not force): raise cmdexc.CommandError("{} is an internal session, use --force " "to save anyways.".format(name)) if current: From 3cc2af909b75b2271a51ce916756a8ef6933d466 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 23 Nov 2018 19:40:12 +0100 Subject: [PATCH 136/492] mypy: Add PyQt5 stubs --- misc/requirements/requirements-mypy.txt | 3 +++ misc/requirements/requirements-mypy.txt-raw | 1 + tox.ini | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt index 3a6548040..3071410a5 100644 --- a/misc/requirements/requirements-mypy.txt +++ b/misc/requirements/requirements-mypy.txt @@ -2,4 +2,7 @@ mypy==0.641 mypy-extensions==0.4.1 +PyQt5==5.11.3 +PyQt5-sip==4.19.13 +PyQt5-stubs==5.11.3.0 typed-ast==1.1.0 diff --git a/misc/requirements/requirements-mypy.txt-raw b/misc/requirements/requirements-mypy.txt-raw index f0aa93ac8..e400122f6 100644 --- a/misc/requirements/requirements-mypy.txt-raw +++ b/misc/requirements/requirements-mypy.txt-raw @@ -1 +1,2 @@ mypy +PyQt5-stubs diff --git a/tox.ini b/tox.ini index 9deaa64b0..cffee3f0e 100644 --- a/tox.ini +++ b/tox.ini @@ -196,4 +196,4 @@ deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-mypy.txt commands = - {envpython} -m mypy --ignore-missing-imports qutebrowser + {envpython} -m mypy qutebrowser From bd731593cebe12b4bf2879b1d7fbc099916f2d83 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 24 Nov 2018 20:12:43 +0100 Subject: [PATCH 137/492] mypy: Add {posargs} in tox.ini --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index cffee3f0e..5d956c0ec 100644 --- a/tox.ini +++ b/tox.ini @@ -196,4 +196,4 @@ deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-mypy.txt commands = - {envpython} -m mypy qutebrowser + {envpython} -m mypy qutebrowser {posargs} From 01b2c40272ab79906ee3a0f0dfb405933da36847 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 24 Nov 2018 20:12:59 +0100 Subject: [PATCH 138/492] Add requirements-optional.txt --- misc/requirements/requirements-optional.txt | 7 +++++++ misc/requirements/requirements-optional.txt-raw | 3 +++ tox.ini | 2 ++ 3 files changed, 12 insertions(+) create mode 100644 misc/requirements/requirements-optional.txt create mode 100644 misc/requirements/requirements-optional.txt-raw diff --git a/misc/requirements/requirements-optional.txt b/misc/requirements/requirements-optional.txt new file mode 100644 index 000000000..6e1e8b8ff --- /dev/null +++ b/misc/requirements/requirements-optional.txt @@ -0,0 +1,7 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +colorama==0.4.0 +cssutils==1.0.2 +hunter==2.1.0 +Pympler==0.6 +six==1.11.0 diff --git a/misc/requirements/requirements-optional.txt-raw b/misc/requirements/requirements-optional.txt-raw new file mode 100644 index 000000000..a0be23733 --- /dev/null +++ b/misc/requirements/requirements-optional.txt-raw @@ -0,0 +1,3 @@ +hunter +cssutils +pympler diff --git a/tox.ini b/tox.ini index 5d956c0ec..8a4232aaa 100644 --- a/tox.ini +++ b/tox.ini @@ -194,6 +194,8 @@ basepython = {env:PYTHON:python3} passenv = deps = -r{toxinidir}/requirements.txt + -r{toxinidir}/misc/requirements/requirements-optional.txt + -r{toxinidir}/misc/requirements/requirements-pyqt.txt -r{toxinidir}/misc/requirements/requirements-mypy.txt commands = {envpython} -m mypy qutebrowser {posargs} From ee1f7a51877c70d163b8d355d9dac76a328f3d55 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 17:49:25 +0100 Subject: [PATCH 139/492] mypy: Use own copy of PyQt5-stubs The one by upstream need various fixes which aren't merged yet. --- misc/requirements/requirements-mypy.txt | 2 +- misc/requirements/requirements-mypy.txt-raw | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt index 3071410a5..f2951fdf5 100644 --- a/misc/requirements/requirements-mypy.txt +++ b/misc/requirements/requirements-mypy.txt @@ -4,5 +4,5 @@ mypy==0.641 mypy-extensions==0.4.1 PyQt5==5.11.3 PyQt5-sip==4.19.13 -PyQt5-stubs==5.11.3.0 +-e git+https://github.com/qutebrowser/PyQt5-stubs.git@wip#egg=PyQt5_stubs typed-ast==1.1.0 diff --git a/misc/requirements/requirements-mypy.txt-raw b/misc/requirements/requirements-mypy.txt-raw index e400122f6..636ad43a4 100644 --- a/misc/requirements/requirements-mypy.txt-raw +++ b/misc/requirements/requirements-mypy.txt-raw @@ -1,2 +1,5 @@ mypy -PyQt5-stubs +-e git+https://github.com/qutebrowser/PyQt5-stubs.git@wip#egg=PyQt5-stubs + +# remove @commit-id for scm installs +#@ replace: @.*# @wip# From 7834e3c7dde19baa7b2fc6bbcb8ec3ad416a2be4 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 18:07:52 +0100 Subject: [PATCH 140/492] mypy: Add mypy.ini to ignore missing modules --- mypy.ini | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 mypy.ini diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 000000000..9d810b738 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,32 @@ +[mypy] +# We also need to support 3.5, but if we'd chose that here, we'd need to deal +# with conditional imports (like secrets.py). +python_version = 3.6 + +[mypy-faulthandler] +# https://github.com/python/typeshed/pull/2627 +ignore_missing_imports = True + +[mypy-colorama] +# https://github.com/tartley/colorama/issues/206 +ignore_missing_imports = True + +[mypy-hunter] +# https://github.com/ionelmc/python-hunter/issues/43 +ignore_missing_imports = True + +[mypy-pygments.*] +# https://bitbucket.org/birkenfeld/pygments-main/issues/1485/type-hints +ignore_missing_imports = True + +[mypy-cssutils] +# Pretty much inactive currently +ignore_missing_imports = True + +[mypy-pypeg2] +# Pretty much inactive currently +ignore_missing_imports = True + +[mypy-bdb] +# stdlib, missing in typeshed +ignore_missing_imports = True From 4b4b74679148d859cb9a148dd0016221c13a3120 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 18:22:02 +0100 Subject: [PATCH 141/492] mypy: Add type annotations for browsertab.AbstractAction --- qutebrowser/browser/browsertab.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index b2be458ce..0cd54be7e 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -136,8 +136,8 @@ class AbstractAction: action_base: The type of the actions (QWeb{Engine,}Page.WebAction) """ - action_class = None - action_base = None + action_class = None # type: type + action_base = None # type: type def __init__(self, tab): self._widget = None From fda807ce9a3375f63e4e226daeb15d4317e137fc Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 19:03:07 +0100 Subject: [PATCH 142/492] mypy: Allow trivial --strict options --- mypy.ini | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mypy.ini b/mypy.ini index 9d810b738..797ed0bca 100644 --- a/mypy.ini +++ b/mypy.ini @@ -3,6 +3,22 @@ # with conditional imports (like secrets.py). python_version = 3.6 +# --strict +warn_unused_configs = True +warn_redundant_casts = True +warn_unused_ignores = True +disallow_subclassing_any = True +# disallow_untyped_calls = True +# disallow_untyped_defs = True +# disallow_incomplete_defs = True +# check_untyped_defs = True +# disallow_untyped_decorators = True +# no_implicit_optional = True +# warn_return_any = True + +# disallow_any_generics = True + + [mypy-faulthandler] # https://github.com/python/typeshed/pull/2627 ignore_missing_imports = True @@ -30,3 +46,7 @@ ignore_missing_imports = True [mypy-bdb] # stdlib, missing in typeshed ignore_missing_imports = True + +[mypy-qutebrowser.browser.webkit.rfc6266] +# subclasses dynamic PyPEG2 classes +disallow_subclassing_any = False From a651f8b5506e1494642579a0fe8fbc37489dd84d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 26 Nov 2018 19:10:14 +0100 Subject: [PATCH 143/492] Update setuptools from 40.5.0 to 40.6.2 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index a3068c5f9..04b033939 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -3,6 +3,6 @@ appdirs==1.4.3 packaging==18.0 pyparsing==2.3.0 -setuptools==40.5.0 +setuptools==40.6.2 six==1.11.0 wheel==0.32.2 From 343f3025fcf2ac2d11a296136ed6210b00550a3d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 26 Nov 2018 19:10:16 +0100 Subject: [PATCH 144/492] Update wheel from 0.32.2 to 0.32.3 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index 04b033939..43085ddd7 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -5,4 +5,4 @@ packaging==18.0 pyparsing==2.3.0 setuptools==40.6.2 six==1.11.0 -wheel==0.32.2 +wheel==0.32.3 From 4791d581f8c101f2d9f26eb0d4cd07ea18ecdb5e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 26 Nov 2018 19:10:17 +0100 Subject: [PATCH 145/492] Update astroid from 2.0.4 to 2.1.0 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 30b038ef8..2cf83abba 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py asn1crypto==0.24.0 -astroid==2.0.4 +astroid==2.1.0 certifi==2018.10.15 cffi==1.11.5 chardet==3.0.4 From 6131cf538f063c795fe335b2654712d70fb512d4 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 26 Nov 2018 19:10:19 +0100 Subject: [PATCH 146/492] Update cryptography from 2.4.1 to 2.4.2 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 2cf83abba..d8d090ac9 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -5,7 +5,7 @@ astroid==2.1.0 certifi==2018.10.15 cffi==1.11.5 chardet==3.0.4 -cryptography==2.4.1 +cryptography==2.4.2 github3.py==1.2.0 idna==2.7 isort==4.3.4 From 4318dd500ab07981579049570471e9cd73390e78 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 26 Nov 2018 19:10:21 +0100 Subject: [PATCH 147/492] Update pylint from 2.1.1 to 2.2.0 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index d8d090ac9..44c2b19e8 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -13,7 +13,7 @@ jwcrypto==0.6.0 lazy-object-proxy==1.3.1 mccabe==0.6.1 pycparser==2.19 -pylint==2.1.1 +pylint==2.2.0 python-dateutil==2.7.5 ./scripts/dev/pylint_checkers requests==2.20.1 From fe4baa8ceab885fac174254d3b3f175dfaa442a4 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 26 Nov 2018 19:10:22 +0100 Subject: [PATCH 148/492] Update hunter from 2.0.2 to 2.1.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 27390c85a..d6bc1820e 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -12,7 +12,7 @@ EasyProcess==0.2.3 fields==5.0.0 Flask==1.0.2 glob2==0.6 -hunter==2.0.2 +hunter==2.1.0 hypothesis==3.82.1 itsdangerous==1.1.0 # Jinja2==2.10 From 866c009677b53bf6b1ec5786d89f05ab52969642 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 26 Nov 2018 19:10:24 +0100 Subject: [PATCH 149/492] Update pytest from 4.0.0 to 4.0.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index d6bc1820e..6ea860f19 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -24,7 +24,7 @@ parse-type==0.4.2 pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 -pytest==4.0.0 +pytest==4.0.1 pytest-bdd==3.0.0 pytest-benchmark==3.1.1 pytest-cov==2.6.0 From 2cd67260fc99518315edf1bb380dafb8678a1ba5 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 26 Nov 2018 19:10:26 +0100 Subject: [PATCH 150/492] Update colorama from 0.4.0 to 0.4.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 022a6214f..53da22d02 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py attrs==18.2.0 -colorama==0.4.0 +colorama==0.4.1 cssutils==1.0.2 Jinja2==2.10 MarkupSafe==1.1.0 From 9a3e0a34e7a83d7190fa43bebd49df875b323dbc Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 26 Nov 2018 19:10:27 +0100 Subject: [PATCH 151/492] Update pygments from 2.2.0 to 2.3.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 53da22d02..66dcf23ef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,6 @@ colorama==0.4.1 cssutils==1.0.2 Jinja2==2.10 MarkupSafe==1.1.0 -Pygments==2.2.0 +Pygments==2.3.0 pyPEG2==2.15.2 PyYAML==3.13 From 1f36e56e1c724b9a7a4ef4236774b8e1379a1351 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 20:12:03 +0100 Subject: [PATCH 152/492] Complete partial annotations Unfortunately we can't turn on mypy's --disallow-incomplete-defs (yet) due to https://github.com/python/mypy/issues/5954 --- mypy.ini | 1 + qutebrowser/browser/browsertab.py | 4 +-- qutebrowser/browser/commands.py | 28 +++++++++++-------- qutebrowser/browser/downloads.py | 2 +- qutebrowser/browser/webengine/webenginetab.py | 2 +- qutebrowser/browser/webengine/webview.py | 2 +- qutebrowser/browser/webkit/webkittab.py | 2 +- qutebrowser/browser/webkit/webpage.py | 2 +- qutebrowser/config/configcache.py | 2 +- qutebrowser/mainwindow/prompt.py | 3 +- qutebrowser/mainwindow/tabwidget.py | 8 +++--- qutebrowser/misc/sessions.py | 9 ++++-- qutebrowser/misc/utilcmds.py | 13 +++++---- 13 files changed, 44 insertions(+), 34 deletions(-) diff --git a/mypy.ini b/mypy.ini index 797ed0bca..91c314675 100644 --- a/mypy.ini +++ b/mypy.ini @@ -10,6 +10,7 @@ warn_unused_ignores = True disallow_subclassing_any = True # disallow_untyped_calls = True # disallow_untyped_defs = True +# https://github.com/python/mypy/issues/5954 # disallow_incomplete_defs = True # check_untyped_defs = True # disallow_untyped_decorators = True diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 0cd54be7e..02d9b70dd 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -685,7 +685,7 @@ class AbstractAudio(QObject): self._widget = None self._tab = tab - def set_muted(self, muted: bool, override: bool = False): + def set_muted(self, muted: bool, override: bool = False) -> None: """Set this tab as muted or not. Arguments: @@ -699,7 +699,7 @@ class AbstractAudio(QObject): """Whether this tab is muted.""" raise NotImplementedError - def toggle_muted(self, *, override: bool = False): + def toggle_muted(self, *, override: bool = False) -> None: self.set_muted(not self.is_muted(), override=override) def is_recently_audible(self): diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 2af938fb5..5c97aaf53 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -513,7 +513,8 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('win_id', completion=miscmodels.window) @cmdutils.argument('count', count=True) - def tab_give(self, win_id: int = None, keep=False, count=None): + def tab_give(self, win_id: int = None, keep: bool = False, + count: int = None) -> None: """Give the current tab to a new or existing window if win_id given. If no win_id is given, the tab will get detached into a new window. @@ -601,7 +602,8 @@ class CommandDispatcher: @cmdutils.argument('where', choices=['prev', 'next', 'up', 'increment', 'decrement']) @cmdutils.argument('count', count=True) - def navigate(self, where: str, tab=False, bg=False, window=False, count=1): + def navigate(self, where: str, tab: bool = False, bg: bool = False, + window: bool = False, count: int = 1) -> None: """Open typical prev/next links or navigate using the URL path. This tries to automatically click on typical _Previous Page_ or @@ -665,7 +667,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - def scroll_px(self, dx: int, dy: int, count=1): + def scroll_px(self, dx: int, dy: int, count: int = 1) -> None: """Scroll the current tab by 'count * dx/dy' pixels. Args: @@ -681,7 +683,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) - def scroll(self, direction: str, count=1): + def scroll(self, direction: str, count: int = 1) -> None: """Scroll the current tab in the given direction. Note you can use `:run-with-count` to have a keybinding with a bigger @@ -719,7 +721,8 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) @cmdutils.argument('horizontal', flag='x') - def scroll_to_perc(self, perc: float = None, horizontal=False, count=None): + def scroll_to_perc(self, perc: float = None, horizontal: bool = False, + count: int = None) -> None: """Scroll to a specific percentage of the page. The percentage can be given either as argument or as count. @@ -764,7 +767,7 @@ class CommandDispatcher: choices=('next', 'increment')) def scroll_page(self, x: float, y: float, *, top_navigate: str = None, bottom_navigate: str = None, - count=1): + count: int = 1) -> None: """Scroll the frame page-wise. Args: @@ -1120,7 +1123,7 @@ class CommandDispatcher: @cmdutils.argument('index', choices=['last']) @cmdutils.argument('count', count=True) def tab_focus(self, index: typing.Union[str, int] = None, - count=None, no_last=False): + count: int = None, no_last: bool = False) -> None: """Select the tab given as argument/[count]. If neither count nor index are given, it behaves like tab-next. @@ -1161,7 +1164,8 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('index', choices=['+', '-']) @cmdutils.argument('count', count=True) - def tab_move(self, index: typing.Union[str, int] = None, count=None): + def tab_move(self, index: typing.Union[str, int] = None, + count: int = None) -> None: """Move the current tab according to the argument and [count]. If neither is given, move it to the first position. @@ -1718,10 +1722,10 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('filter_', choices=['id']) - def click_element(self, filter_: str, value, *, + def click_element(self, filter_: str, value: str, *, target: usertypes.ClickTarget = usertypes.ClickTarget.normal, - force_event=False): + force_event: bool = False) -> None: """Click the element matching the given filter. The given filter needs to result in exactly one element, otherwise, an @@ -2070,8 +2074,8 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window', maxsplit=0, no_cmd_split=True) - def jseval(self, js_code, file=False, quiet=False, *, - world: typing.Union[usertypes.JsWorld, int] = None): + def jseval(self, js_code: str, file: bool = False, quiet: bool = False, *, + world: typing.Union[usertypes.JsWorld, int] = None) -> None: """Evaluate a JavaScript string. Args: diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index 9c2a88a87..1709c7425 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -1062,7 +1062,7 @@ class DownloadModel(QAbstractListModel): @cmdutils.register(instance='download-model', scope='window', maxsplit=0) @cmdutils.argument('count', count=True) - def download_open(self, cmdline: str = None, count=0): + def download_open(self, cmdline: str = None, count: int = 0) -> None: """Open the last/[count]th download. If no specific command is given, this will use the system's default diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 0f1d368e9..9945886fa 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -670,7 +670,7 @@ class WebEngineAudio(browsertab.AbstractAudio): self._tab.url_changed.connect(self._on_url_changed) config.instance.changed.connect(self._on_config_changed) - def set_muted(self, muted: bool, override: bool = False): + def set_muted(self, muted: bool, override: bool = False) -> None: self._overridden = override page = self._widget.page() page.setAudioMuted(muted) diff --git a/qutebrowser/browser/webengine/webview.py b/qutebrowser/browser/webengine/webview.py index b10cc5f9a..e70226f30 100644 --- a/qutebrowser/browser/webengine/webview.py +++ b/qutebrowser/browser/webengine/webview.py @@ -240,7 +240,7 @@ class WebEnginePage(QWebEnginePage): def acceptNavigationRequest(self, url: QUrl, typ: QWebEnginePage.NavigationType, - is_main_frame: bool): + is_main_frame: bool) -> bool: """Override acceptNavigationRequest to forward it to the tab API.""" type_map = { QWebEnginePage.NavigationTypeLinkClicked: diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 2edea1777..c791326ce 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -641,7 +641,7 @@ class WebKitAudio(browsertab.AbstractAudio): """Dummy handling of audio status for QtWebKit.""" - def set_muted(self, muted: bool, override: bool = False): + def set_muted(self, muted: bool, override: bool = False) -> None: raise browsertab.WebTabError('Muting is not supported on QtWebKit!') def is_muted(self): diff --git a/qutebrowser/browser/webkit/webpage.py b/qutebrowser/browser/webkit/webpage.py index ce985b466..0195ec17f 100644 --- a/qutebrowser/browser/webkit/webpage.py +++ b/qutebrowser/browser/webkit/webpage.py @@ -469,7 +469,7 @@ class BrowserPage(QWebPage): def acceptNavigationRequest(self, frame: QWebFrame, request: QNetworkRequest, - typ: QWebPage.NavigationType): + typ: QWebPage.NavigationType) -> bool: """Override acceptNavigationRequest to handle clicked links. Setting linkDelegationPolicy to DelegateAllLinks and using a slot bound diff --git a/qutebrowser/config/configcache.py b/qutebrowser/config/configcache.py index cdba6456a..a421ba85c 100644 --- a/qutebrowser/config/configcache.py +++ b/qutebrowser/config/configcache.py @@ -45,7 +45,7 @@ class ConfigCache: if attr in self._cache: self._cache[attr] = config.instance.get(attr) - def __getitem__(self, attr: str): + def __getitem__(self, attr: str) -> typing.Any: if attr not in self._cache: assert not config.instance.get_opt(attr).supports_pattern self._cache[attr] = config.instance.get(attr) diff --git a/qutebrowser/mainwindow/prompt.py b/qutebrowser/mainwindow/prompt.py index 5eb76c86e..f6a8b1224 100644 --- a/qutebrowser/mainwindow/prompt.py +++ b/qutebrowser/mainwindow/prompt.py @@ -391,7 +391,8 @@ class PromptContainer(QWidget): @cmdutils.register(instance='prompt-container', scope='window', modes=[usertypes.KeyMode.prompt], maxsplit=0) - def prompt_open_download(self, cmdline: str = None, pdfjs=False): + def prompt_open_download(self, cmdline: str = None, + pdfjs: bool = False) -> None: """Immediately open a download. If no specific command is given, this will use the system's default diff --git a/qutebrowser/mainwindow/tabwidget.py b/qutebrowser/mainwindow/tabwidget.py index f9c2ac0e6..a3ba0f1da 100644 --- a/qutebrowser/mainwindow/tabwidget.py +++ b/qutebrowser/mainwindow/tabwidget.py @@ -342,7 +342,7 @@ class TabWidget(QTabWidget): qtutils.ensure_valid(url) return url - def update_tab_favicon(self, tab: QWidget): + def update_tab_favicon(self, tab: QWidget) -> None: """Update favicon of the given tab.""" idx = self.indexOf(tab) @@ -400,7 +400,7 @@ class TabBar(QTabBar): return self.parent().currentWidget() @pyqtSlot(str) - def _on_config_changed(self, option: str): + def _on_config_changed(self, option: str) -> None: if option == 'fonts.tabs': self._set_font() elif option == 'tabs.favicons.scale': @@ -543,7 +543,7 @@ class TabBar(QTabBar): return super().mousePressEvent(e) - def minimumTabSizeHint(self, index, ellipsis: bool = True) -> QSize: + def minimumTabSizeHint(self, index: int, ellipsis: bool = True) -> QSize: """Set the minimum tab size to indicator/icon/... text. Args: @@ -623,7 +623,7 @@ class TabBar(QTabBar): return False return widget.data.pinned - def tabSizeHint(self, index: int): + def tabSizeHint(self, index: int) -> QSize: """Override tabSizeHint to customize qb's tab size. https://wiki.python.org/moin/PyQt/Customising%20tab%20bars diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index 9d3736cdb..b94566830 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -511,9 +511,12 @@ class SessionManager(QObject): @cmdutils.argument('win_id', win_id=True) @cmdutils.argument('with_private', flag='p') def session_save(self, name: typing.Union[str, Sentinel] = default, - current=False, quiet=False, force=False, - only_active_window=False, with_private=False, - win_id=None): + current: bool = False, + quiet: bool = False, + force: bool = False, + only_active_window: bool = False, + with_private: bool = False, + win_id: int = None) -> None: """Save a session. Args: diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py index b8d8be447..b893c8d6e 100644 --- a/qutebrowser/misc/utilcmds.py +++ b/qutebrowser/misc/utilcmds.py @@ -44,7 +44,7 @@ from qutebrowser.qt import sip @cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.argument('win_id', win_id=True) -def later(ms: int, command, win_id): +def later(ms: int, command: str, win_id: int) -> None: """Execute a command after some time. Args: @@ -75,7 +75,7 @@ def later(ms: int, command, win_id): @cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.argument('win_id', win_id=True) @cmdutils.argument('count', count=True) -def repeat(times: int, command, win_id, count=None): +def repeat(times: int, command: str, win_id: int, count: int = None) -> None: """Repeat a given command. Args: @@ -96,7 +96,8 @@ def repeat(times: int, command, win_id, count=None): @cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.argument('win_id', win_id=True) @cmdutils.argument('count', count=True) -def run_with_count(count_arg: int, command, win_id, count=1): +def run_with_count(count_arg: int, command: str, win_id: int, + count: int = 1) -> None: """Run a command with the given count. If run_with_count itself is run with a count, it multiplies count_arg. @@ -303,7 +304,7 @@ def repeat_command(win_id, count=None): @cmdutils.register(debug=True, name='debug-log-capacity') -def log_capacity(capacity: int): +def log_capacity(capacity: int) -> None: """Change the number of log lines to be stored in RAM. Args: @@ -320,7 +321,7 @@ def log_capacity(capacity: int): @cmdutils.argument('level', choices=sorted( (level.lower() for level in log.LOG_LEVELS), key=lambda e: log.LOG_LEVELS[e.upper()])) -def debug_log_level(level: str): +def debug_log_level(level: str) -> None: """Change the log level for console logging. Args: @@ -332,7 +333,7 @@ def debug_log_level(level: str): @cmdutils.register(debug=True) -def debug_log_filter(filters: str): +def debug_log_filter(filters: str) -> None: """Change the log filter for console logging. Args: From 6b5a92fb2d30ad76bf73b0b065da9d0384157209 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 23:24:31 +0100 Subject: [PATCH 153/492] mypy: Update config --- mypy.ini | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mypy.ini b/mypy.ini index 91c314675..e002720d3 100644 --- a/mypy.ini +++ b/mypy.ini @@ -10,16 +10,13 @@ warn_unused_ignores = True disallow_subclassing_any = True # disallow_untyped_calls = True # disallow_untyped_defs = True -# https://github.com/python/mypy/issues/5954 +## https://github.com/python/mypy/issues/5954 # disallow_incomplete_defs = True # check_untyped_defs = True # disallow_untyped_decorators = True # no_implicit_optional = True # warn_return_any = True -# disallow_any_generics = True - - [mypy-faulthandler] # https://github.com/python/typeshed/pull/2627 ignore_missing_imports = True From d2751935e0635a1d9f8ce7657ce307d1dd63267e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 23:24:41 +0100 Subject: [PATCH 154/492] Convert *args to list It being a tuple also happens to work, but is somewhat inconsistent. --- qutebrowser/browser/hints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index d8d5a0624..aa5b5f34c 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -737,7 +737,7 @@ class HintManager(QObject): self._context.baseurl = tabbed_browser.current_url() except qtutils.QtValueError: raise cmdexc.CommandError("No URL set for this page yet!") - self._context.args = args + self._context.args = list(args) self._context.group = group try: From 462e07a578c3a9e4a5e325d58d2c490db1c0d6eb Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 23:25:13 +0100 Subject: [PATCH 155/492] Use integer division to set font weight QFont::setFontWeight takes an int only - it looks like PyQt accepts a float and just truncates it. That's the behaviour we actually want here, but let's be explicit about it. --- qutebrowser/config/configtypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index 0314805c0..38d952639 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -1119,7 +1119,7 @@ class QtFont(Font): font.setWeight(weight_map[namedweight]) if weight: # based on qcssparser.cpp:setFontWeightFromValue - font.setWeight(min(int(weight) / 8, 99)) + font.setWeight(min(int(weight) // 8, 99)) if size: if size.lower().endswith('pt'): font.setPointSizeF(float(size[:-2])) From e851480a2bcee3080aad785ac4d2f7d193201cd4 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 23:30:21 +0100 Subject: [PATCH 156/492] Use empty tuple instead of None While None works (as logging.py does "if args:" consistently), it was never intended to be used like that. --- qutebrowser/utils/log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/utils/log.py b/qutebrowser/utils/log.py index a1c4f74b7..bbc025515 100644 --- a/qutebrowser/utils/log.py +++ b/qutebrowser/utils/log.py @@ -468,7 +468,7 @@ def qt_message_handler(msg_type, context, msg): stack = ''.join(traceback.format_stack()) else: stack = None - record = qt.makeRecord(name, level, context.file, context.line, msg, None, + record = qt.makeRecord(name, level, context.file, context.line, msg, (), None, func, sinfo=stack) qt.handle(record) From 06afd3604e4656ed9ccaceaf43cb6af9bbe11b7c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 23:30:55 +0100 Subject: [PATCH 157/492] Don't try to iterate over auth info This caused a crash when trying to use a proxy with authentication on QtWebKit. It was introduced in 3a5241b642da666e4517a32e0eb945254d86a6da since it was a namedtuple before and was iterable like this. --- qutebrowser/browser/webkit/network/networkmanager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py index 31e9e815f..4c44ba887 100644 --- a/qutebrowser/browser/webkit/network/networkmanager.py +++ b/qutebrowser/browser/webkit/network/networkmanager.py @@ -297,9 +297,9 @@ class NetworkManager(QNetworkAccessManager): """Called when a proxy needs authentication.""" proxy_id = ProxyId(proxy.type(), proxy.hostName(), proxy.port()) if proxy_id in _proxy_auth_cache: - user, password = _proxy_auth_cache[proxy_id] - authenticator.setUser(user) - authenticator.setPassword(password) + authinfo = _proxy_auth_cache[proxy_id] + authenticator.setUser(authinfo.user) + authenticator.setPassword(authinfo.password) else: msg = '{} says:
{}'.format( html.escape(proxy.hostName()), From f34a8ba1946901e7f484f2253789bb8f65e5217c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 26 Nov 2018 23:32:20 +0100 Subject: [PATCH 158/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 41515d287..51647bafd 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -66,6 +66,7 @@ Fixed like GMail. However, the default for `content.cookies.accept` is still `all` to be in line with what other browsers do. - `:navigate` not incrementing in anchors or queries or anchors. +- Crash when trying to use a proxy requiring authentication with QtWebKit. v1.5.2 ------ From 7934dc9a95a26e0a23337871d94576384f18ae92 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 08:37:59 +0100 Subject: [PATCH 159/492] mypy: Fix assert location --- qutebrowser/browser/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 5c97aaf53..a53cfc75e 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1190,11 +1190,11 @@ class CommandDispatcher: if config.val.tabs.wrap: new_idx %= self._count() else: - assert isinstance(index, int) # absolute moving if count is not None: new_idx = count - 1 elif index is not None: + assert isinstance(index, int) new_idx = index - 1 if index >= 0 else index + self._count() else: new_idx = 0 From ec0dc59b06da1074b70fbb724e090e9f4d8384e5 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 08:39:05 +0100 Subject: [PATCH 160/492] mypy: Disable warn_unused_configs Looks like mypy's cache causes config sections to be ignored sometimes. --- mypy.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mypy.ini b/mypy.ini index e002720d3..578a8c1fc 100644 --- a/mypy.ini +++ b/mypy.ini @@ -4,10 +4,11 @@ python_version = 3.6 # --strict -warn_unused_configs = True warn_redundant_casts = True warn_unused_ignores = True disallow_subclassing_any = True +## https://github.com/python/mypy/issues/5957 +# warn_unused_configs = True # disallow_untyped_calls = True # disallow_untyped_defs = True ## https://github.com/python/mypy/issues/5954 From 80808ee9d242768eb2f21055f3859e4284178751 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 08:54:25 +0100 Subject: [PATCH 161/492] Add docstring --- qutebrowser/misc/sessions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index b94566830..e50d803a2 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -40,6 +40,8 @@ from qutebrowser.qt import sip class Sentinel: + """Sentinel value for default argument.""" + pass From c931654a8d09385f713ab09b5348a57e53901ce4 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 08:56:51 +0100 Subject: [PATCH 162/492] Remove old exit status values Those weren't used anymore since bc8176ff21a1aab95f5ad3a34c97e1dd098a0242. Since the values were removed in v1.0.0 and never used since then, it seems fine to re-use them in the future. --- qutebrowser/utils/usertypes.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index 82a95c3fd..cd36db49a 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -230,8 +230,6 @@ class Exit(enum.IntEnum): exception = 2 err_ipc = 3 err_init = 4 - err_config = 5 - err_key_config = 6 # Load status of a tab From 984970e7655aff7c5f9c25673bd587bf279c8271 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 08:59:13 +0100 Subject: [PATCH 163/492] vulture: Ignore reserved value --- scripts/dev/run_vulture.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/dev/run_vulture.py b/scripts/dev/run_vulture.py index 0015539f9..b5c083546 100755 --- a/scripts/dev/run_vulture.py +++ b/scripts/dev/run_vulture.py @@ -84,6 +84,7 @@ def whitelist_generator(): # noqa yield 'qutebrowser.utils.log.QtWarningFilter.filter' yield 'qutebrowser.browser.pdfjs.is_available' yield 'qutebrowser.misc.guiprocess.spawn_output' + yield 'qutebrowser.utils.usertypes.ExitStatus.reserved' yield 'QEvent.posted' yield 'log_stack' # from message.py yield 'propagate' # logging.getLogger('...).propagate = False From 251531e6d08cfaf4f060c1a4336b2c370fb890b3 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 08:59:39 +0100 Subject: [PATCH 164/492] manifest: Exclude mypy.ini --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index ff96264aa..3a29ba690 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -32,6 +32,7 @@ include doc/changelog.asciidoc prune tests prune qutebrowser/3rdparty exclude pytest.ini +exclude mypy.ini exclude qutebrowser/javascript/.eslintrc.yaml exclude qutebrowser/javascript/.eslintignore exclude doc/help From 21edeca3e06548995ed117914193e1c7348deeec Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 09:52:54 +0100 Subject: [PATCH 165/492] pylint: disable=unused-import for typing Apparently marking modules as used based on type comments doesn't work with Python 3.7: https://github.com/PyCQA/pylint/issues/2345 https://github.com/python/typed_ast/issues/60 --- .travis.yml | 2 +- qutebrowser/browser/webkit/network/networkmanager.py | 4 ++-- qutebrowser/commands/cmdutils.py | 2 +- qutebrowser/config/config.py | 2 +- qutebrowser/config/configtypes.py | 2 +- qutebrowser/config/websettings.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5b918a393..3212142c7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,7 +38,7 @@ matrix: # env: TESTENV=py35 OSX=yosemite # osx_image: xcode6.4 - os: linux - env: TESTENV=pylint PYTHON=python3.6 + env: TESTENV=pylint - os: linux env: TESTENV=flake8 - os: linux diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py index 4c44ba887..0c3148ee4 100644 --- a/qutebrowser/browser/webkit/network/networkmanager.py +++ b/qutebrowser/browser/webkit/network/networkmanager.py @@ -21,7 +21,7 @@ import collections import html -import typing +import typing # pylint: disable=unused-import import attr from PyQt5.QtCore import (pyqtSlot, pyqtSignal, QCoreApplication, QUrl, @@ -29,7 +29,7 @@ from PyQt5.QtCore import (pyqtSlot, pyqtSignal, QCoreApplication, QUrl, from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply, QSslSocket from qutebrowser.config import config -from qutebrowser.mainwindow import prompt +from qutebrowser.mainwindow import prompt # pylint: disable=unused-import from qutebrowser.utils import (message, log, usertypes, utils, objreg, urlutils, debug) from qutebrowser.browser import shared diff --git a/qutebrowser/commands/cmdutils.py b/qutebrowser/commands/cmdutils.py index 768cc430e..41e875202 100644 --- a/qutebrowser/commands/cmdutils.py +++ b/qutebrowser/commands/cmdutils.py @@ -20,7 +20,7 @@ """Contains various command utils and a global command dict.""" import inspect -import typing +import typing # pylint: disable=unused-import from qutebrowser.utils import qtutils, log from qutebrowser.commands import command, cmdexc diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 41309d352..59df90ce8 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -33,7 +33,7 @@ from qutebrowser.keyinput import keyutils MYPY = False if MYPY: - from qutebrowser.config import configcache + from qutebrowser.config import configcache # pylint: disable=unused-import # An easy way to access the config from other code via config.val.foo val = typing.cast('ConfigContainer', None) diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index 38d952639..31eca988e 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -52,7 +52,7 @@ import datetime import functools import operator import json -import typing +import typing # pylint: disable=unused-import import attr import yaml diff --git a/qutebrowser/config/websettings.py b/qutebrowser/config/websettings.py index 659f793f8..e6d19db7e 100644 --- a/qutebrowser/config/websettings.py +++ b/qutebrowser/config/websettings.py @@ -19,7 +19,7 @@ """Bridge from QWeb(Engine)Settings to our own settings.""" -import typing +import typing # pylint: disable=unused-import from PyQt5.QtGui import QFont From caca60087ff5a2638513641a94a9a389a0186a6c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 13:24:48 +0100 Subject: [PATCH 166/492] Fix coverage --- qutebrowser/config/config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 59df90ce8..1d7e34345 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -33,7 +33,8 @@ from qutebrowser.keyinput import keyutils MYPY = False if MYPY: - from qutebrowser.config import configcache # pylint: disable=unused-import + # pylint: disable=unused-import + from qutebrowser.config import configcache # pragma: no cover # An easy way to access the config from other code via config.val.foo val = typing.cast('ConfigContainer', None) From fca2d9dfb4862e94c792b7b4f3973bf7eb71e364 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 16:15:08 +0100 Subject: [PATCH 167/492] mypy: Add to travis --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 3212142c7..5a8965fd4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,6 +41,8 @@ matrix: env: TESTENV=pylint - os: linux env: TESTENV=flake8 + - os: linux + env: TESTENV=mypy - os: linux env: TESTENV=docs addons: From 43c2cccc17b35f476d89f6569a9c25f64a0f82ff Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 17:39:52 +0100 Subject: [PATCH 168/492] travis: Set "os: linux" globally --- .travis.yml | 58 ++++++++++++++++++----------------------------------- 1 file changed, 20 insertions(+), 38 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5a8965fd4..62431a8e9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,32 +2,25 @@ dist: xenial language: python group: edge python: 3.6 +os: linux matrix: include: - - os: linux - env: DOCKER=archlinux + - env: DOCKER=archlinux services: docker - - os: linux - env: DOCKER=archlinux-webengine QUTE_BDD_WEBENGINE=true + - env: DOCKER=archlinux-webengine QUTE_BDD_WEBENGINE=true services: docker - - os: linux - env: TESTENV=py36-pyqt571 - - os: linux - python: 3.5 + - env: TESTENV=py36-pyqt571 + - python: 3.5 env: TESTENV=py35-pyqt571 - - os: linux - env: TESTENV=py36-pyqt59 - - os: linux - env: TESTENV=py36-pyqt510 + - env: TESTENV=py36-pyqt59 + - env: TESTENV=py36-pyqt510 addons: apt: packages: - xfonts-base - - os: linux - env: TESTENV=py36-pyqt511-cov - - os: linux - python: 3.7 + - env: TESTENV=py36-pyqt511-cov + - python: 3.7 env: TESTENV=py37-pyqt511 - os: osx env: TESTENV=py37 OSX=sierra @@ -37,40 +30,29 @@ matrix: # - os: osx # env: TESTENV=py35 OSX=yosemite # osx_image: xcode6.4 - - os: linux - env: TESTENV=pylint - - os: linux - env: TESTENV=flake8 - - os: linux - env: TESTENV=mypy - - os: linux - env: TESTENV=docs + - env: TESTENV=pylint + - env: TESTENV=flake8 + - env: TESTENV=mypy + - env: TESTENV=docs addons: apt: packages: - asciidoc - - os: linux - env: TESTENV=vulture - - os: linux - env: TESTENV=misc - - os: linux - env: TESTENV=pyroma - - os: linux - env: TESTENV=check-manifest - - os: linux - env: TESTENV=eslint + - env: TESTENV=vulture + - env: TESTENV=misc + - env: TESTENV=pyroma + - env: TESTENV=check-manifest + - env: TESTENV=eslint language: node_js python: null node_js: "lts/*" - - os: linux - language: generic + - language: generic env: TESTENV=shellcheck services: docker fast_finish: true allow_failures: # https://github.com/qutebrowser/qutebrowser/issues/4055 - - os: linux - env: TESTENV=py36-pyqt510 + - env: TESTENV=py36-pyqt510 cache: directories: From f36a98ec76c6be2a90230a9f65fba71ab684ed27 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 17:50:41 +0100 Subject: [PATCH 169/492] travis: Reallow PyQt 5.10 Looks like this works again? Maybe because of Ubuntu Xenial? Fixes #4055 --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 62431a8e9..663c4c6f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,9 +50,6 @@ matrix: env: TESTENV=shellcheck services: docker fast_finish: true - allow_failures: - # https://github.com/qutebrowser/qutebrowser/issues/4055 - - env: TESTENV=py36-pyqt510 cache: directories: From d7786c694fb30eb9da79b5842629cc271d0ed09e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 27 Nov 2018 20:35:58 +0100 Subject: [PATCH 170/492] Add type hints for qutebrowser.browser.browsertab --- mypy.ini | 3 + qutebrowser/browser/browsertab.py | 372 ++++++++++-------- qutebrowser/browser/webengine/webenginetab.py | 9 +- qutebrowser/browser/webkit/webkittab.py | 8 +- 4 files changed, 229 insertions(+), 163 deletions(-) diff --git a/mypy.ini b/mypy.ini index 578a8c1fc..94d5dff40 100644 --- a/mypy.ini +++ b/mypy.ini @@ -49,3 +49,6 @@ ignore_missing_imports = True [mypy-qutebrowser.browser.webkit.rfc6266] # subclasses dynamic PyPEG2 classes disallow_subclassing_any = False + +[mypy-qutebrowser.browser.browsertab] +disallow_untyped_defs = True diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 02d9b70dd..f3a613844 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -21,12 +21,19 @@ import enum import itertools +import typing import attr -from PyQt5.QtCore import pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt +from PyQt5.QtCore import (pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt, + QEvent, QPoint) from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QWidget, QApplication, QDialog -from PyQt5.QtPrintSupport import QPrintDialog +from PyQt5.QtPrintSupport import QPrintDialog, QPrinter +from PyQt5.QtNetwork import QNetworkAccessManager +MYPY = False +if MYPY: + # pylint: disable=unused-import + from PyQt5.QtWebEngineWidgets import QWebEngineView import pygments import pygments.lexers @@ -37,14 +44,19 @@ from qutebrowser.config import config from qutebrowser.utils import (utils, objreg, usertypes, log, qtutils, urlutils, message) from qutebrowser.misc import miscwidgets, objects -from qutebrowser.browser import mouse, hints +from qutebrowser.browser import mouse, hints, webelem from qutebrowser.qt import sip +if MYPY: + # pylint: disable=unused-import + from qutebrowser.browser.inspector import AbstractWebInspector tab_id_gen = itertools.count(0) -def create(win_id, private, parent=None): +def create(win_id: int, + private: bool, + parent: QWidget = None) -> 'AbstractTab': """Get a QtWebKit/QtWebEngine tab object. Args: @@ -65,7 +77,7 @@ def create(win_id, private, parent=None): parent=parent) -def init(): +def init() -> None: """Initialize backend-specific modules.""" if objects.backend == usertypes.Backend.QtWebEngine: from qutebrowser.browser.webengine import webenginetab @@ -112,17 +124,18 @@ class TabData: input_mode: current input mode for the tab. """ - keep_icon = attr.ib(False) - viewing_source = attr.ib(False) - inspector = attr.ib(None) - open_target = attr.ib(usertypes.ClickTarget.normal) - override_target = attr.ib(None) - pinned = attr.ib(False) - fullscreen = attr.ib(False) - netrc_used = attr.ib(False) - input_mode = attr.ib(usertypes.KeyMode.normal) + keep_icon = attr.ib(False) # type: bool + viewing_source = attr.ib(False) # type: bool + inspector = attr.ib(None) # type: typing.Optional[AbstractWebInspector] + open_target = attr.ib( + usertypes.ClickTarget.normal) # type: usertypes.ClickTarget + override_target = attr.ib(None) # type: usertypes.ClickTarget + pinned = attr.ib(False) # type: bool + fullscreen = attr.ib(False) # type: bool + netrc_used = attr.ib(False) # type: bool + input_mode = attr.ib(usertypes.KeyMode.normal) # type: usertypes.KeyMode - def should_show_icon(self): + def should_show_icon(self) -> bool: return (config.val.tabs.favicons.show == 'always' or config.val.tabs.favicons.show == 'pinned' and self.pinned) @@ -139,33 +152,35 @@ class AbstractAction: action_class = None # type: type action_base = None # type: type - def __init__(self, tab): - self._widget = None + def __init__(self, tab: 'AbstractTab') -> None: + self._widget = typing.cast('QWebEngineView', None) self._tab = tab - def exit_fullscreen(self): + def exit_fullscreen(self) -> None: """Exit the fullscreen mode.""" raise NotImplementedError - def save_page(self): + def save_page(self) -> None: """Save the current page.""" raise NotImplementedError - def run_string(self, name): + def run_string(self, name: str) -> None: """Run a webaction based on its name.""" member = getattr(self.action_class, name, None) if not isinstance(member, self.action_base): raise WebTabError("{} is not a valid web action!".format(name)) - self._widget.triggerPageAction(member) + self._widget.triggerPageAction(member) # type: ignore - def show_source(self, - pygments=False): # pylint: disable=redefined-outer-name + def show_source( + self, + pygments: bool = False # pylint: disable=redefined-outer-name + ) -> None: """Show the source of the current page in a new tab.""" raise NotImplementedError - def _show_source_pygments(self): + def _show_source_pygments(self) -> None: - def show_source_cb(source): + def show_source_cb(source: str) -> None: """Show source as soon as it's ready.""" # WORKAROUND for https://github.com/PyCQA/pylint/issues/491 # pylint: disable=no-member @@ -188,23 +203,24 @@ class AbstractPrinting: """Attribute of AbstractTab for printing the page.""" - def __init__(self, tab): + def __init__(self, tab: 'AbstractTab') -> None: self._widget = None self._tab = tab - def check_pdf_support(self): + def check_pdf_support(self) -> bool: raise NotImplementedError - def check_printer_support(self): + def check_printer_support(self) -> bool: raise NotImplementedError - def check_preview_support(self): + def check_preview_support(self) -> bool: raise NotImplementedError - def to_pdf(self, filename): + def to_pdf(self, filename: str) -> bool: raise NotImplementedError - def to_printer(self, printer, callback=None): + def to_printer(self, printer: QPrinter, + callback: typing.Callable[[bool], None] = None) -> None: """Print the tab. Args: @@ -214,17 +230,17 @@ class AbstractPrinting: """ raise NotImplementedError - def show_dialog(self): + def show_dialog(self) -> None: """Print with a QPrintDialog.""" self.check_printer_support() - def print_callback(ok): + def print_callback(ok: bool) -> None: """Called when printing finished.""" if not ok: message.error("Printing failed!") diag.deleteLater() - def do_print(): + def do_print() -> None: """Called when the dialog was closed.""" self.to_printer(diag.printer(), print_callback) @@ -257,15 +273,16 @@ class AbstractSearch(QObject): finished = pyqtSignal(bool) cleared = pyqtSignal() + _Callback = typing.Callable[[bool], None] - def __init__(self, tab, parent=None): + def __init__(self, tab: 'AbstractTab', parent: QWidget = None): super().__init__(parent) self._tab = tab self._widget = None - self.text = None + self.text = None # type: typing.Optional[str] self.search_displayed = False - def _is_case_sensitive(self, ignore_case): + def _is_case_sensitive(self, ignore_case: str) -> bool: """Check if case-sensitivity should be used. This assumes self.text is already set properly. @@ -273,6 +290,7 @@ class AbstractSearch(QObject): Arguments: ignore_case: The ignore_case value from the config. """ + assert self.text is not None mapping = { 'smart': not self.text.islower(), 'never': True, @@ -280,8 +298,10 @@ class AbstractSearch(QObject): } return mapping[ignore_case] - def search(self, text, *, ignore_case='never', reverse=False, - result_cb=None): + def search(self, text: str, *, + ignore_case: str = 'never', + reverse: bool = False, + result_cb: _Callback = None) -> None: """Find the given text on the page. Args: @@ -292,11 +312,11 @@ class AbstractSearch(QObject): """ raise NotImplementedError - def clear(self): + def clear(self) -> None: """Clear the current search.""" raise NotImplementedError - def prev_result(self, *, result_cb=None): + def prev_result(self, *, result_cb: _Callback = None) -> None: """Go to the previous result of the current search. Args: @@ -304,7 +324,7 @@ class AbstractSearch(QObject): """ raise NotImplementedError - def next_result(self, *, result_cb=None): + def next_result(self, *, result_cb: _Callback = None) -> None: """Go to the next result of the current search. Args: @@ -322,7 +342,7 @@ class AbstractZoom(QObject): _default_zoom_changed: Whether the zoom was changed from the default. """ - def __init__(self, tab, parent=None): + def __init__(self, tab: 'AbstractTab', parent: QWidget = None) -> None: super().__init__(parent) self._tab = tab self._widget = None @@ -339,21 +359,21 @@ class AbstractZoom(QObject): # cfg.changed.disconnect, self.init_neighborlist)) @pyqtSlot(str) - def _on_config_changed(self, option): + def _on_config_changed(self, option: str) -> None: if option in ['zoom.levels', 'zoom.default']: if not self._default_zoom_changed: factor = float(config.val.zoom.default) / 100 self.set_factor(factor) self._init_neighborlist() - def _init_neighborlist(self): + def _init_neighborlist(self) -> None: """Initialize self._neighborlist.""" levels = config.val.zoom.levels self._neighborlist = usertypes.NeighborList( levels, mode=usertypes.NeighborList.Modes.edge) self._neighborlist.fuzzyval = config.val.zoom.default - def offset(self, offset): + def offset(self, offset: int) -> None: """Increase/Decrease the zoom level by the given offset. Args: @@ -366,10 +386,10 @@ class AbstractZoom(QObject): self.set_factor(float(level) / 100, fuzzyval=False) return level - def _set_factor_internal(self, factor): + def _set_factor_internal(self, factor: float) -> None: raise NotImplementedError - def set_factor(self, factor, *, fuzzyval=True): + def set_factor(self, factor: float, *, fuzzyval: bool = True) -> None: """Zoom to a given zoom factor. Args: @@ -387,13 +407,13 @@ class AbstractZoom(QObject): self._zoom_factor = factor self._set_factor_internal(factor) - def factor(self): + def factor(self) -> float: return self._zoom_factor - def set_default(self): + def set_default(self) -> None: self._set_factor_internal(float(config.val.zoom.default) / 100) - def set_current(self): + def set_current(self) -> None: self._set_factor_internal(self._zoom_factor) @@ -410,7 +430,10 @@ class AbstractCaret(QObject): selection_toggled = pyqtSignal(bool) follow_selected_done = pyqtSignal() - def __init__(self, tab, mode_manager, parent=None): + def __init__(self, + tab: 'AbstractTab', + mode_manager: modeman.ModeManager, + parent: QWidget = None) -> None: super().__init__(parent) self._tab = tab self._widget = None @@ -418,74 +441,74 @@ class AbstractCaret(QObject): mode_manager.entered.connect(self._on_mode_entered) mode_manager.left.connect(self._on_mode_left) - def _on_mode_entered(self, mode): + def _on_mode_entered(self, mode: usertypes.KeyMode) -> None: raise NotImplementedError - def _on_mode_left(self, mode): + def _on_mode_left(self, mode: usertypes.KeyMode) -> None: raise NotImplementedError - def move_to_next_line(self, count=1): + def move_to_next_line(self, count: int = 1) -> None: raise NotImplementedError - def move_to_prev_line(self, count=1): + def move_to_prev_line(self, count: int = 1) -> None: raise NotImplementedError - def move_to_next_char(self, count=1): + def move_to_next_char(self, count: int = 1) -> None: raise NotImplementedError - def move_to_prev_char(self, count=1): + def move_to_prev_char(self, count: int = 1) -> None: raise NotImplementedError - def move_to_end_of_word(self, count=1): + def move_to_end_of_word(self, count: int = 1) -> None: raise NotImplementedError - def move_to_next_word(self, count=1): + def move_to_next_word(self, count: int = 1) -> None: raise NotImplementedError - def move_to_prev_word(self, count=1): + def move_to_prev_word(self, count: int = 1) -> None: raise NotImplementedError - def move_to_start_of_line(self): + def move_to_start_of_line(self) -> None: raise NotImplementedError - def move_to_end_of_line(self): + def move_to_end_of_line(self) -> None: raise NotImplementedError - def move_to_start_of_next_block(self, count=1): + def move_to_start_of_next_block(self, count: int = 1) -> None: raise NotImplementedError - def move_to_start_of_prev_block(self, count=1): + def move_to_start_of_prev_block(self, count: int = 1) -> None: raise NotImplementedError - def move_to_end_of_next_block(self, count=1): + def move_to_end_of_next_block(self, count: int = 1) -> None: raise NotImplementedError - def move_to_end_of_prev_block(self, count=1): + def move_to_end_of_prev_block(self, count: int = 1) -> None: raise NotImplementedError - def move_to_start_of_document(self): + def move_to_start_of_document(self) -> None: raise NotImplementedError - def move_to_end_of_document(self): + def move_to_end_of_document(self) -> None: raise NotImplementedError - def toggle_selection(self): + def toggle_selection(self) -> None: raise NotImplementedError - def drop_selection(self): + def drop_selection(self) -> None: raise NotImplementedError - def selection(self, callback): + def selection(self, callback: typing.Callable[[str], None]) -> None: raise NotImplementedError - def _follow_enter(self, tab): + def _follow_enter(self, tab: bool) -> None: """Follow a link by faking an enter press.""" if tab: self._tab.key_press(Qt.Key_Enter, modifier=Qt.ControlModifier) else: self._tab.key_press(Qt.Key_Enter) - def follow_selected(self, *, tab=False): + def follow_selected(self, *, tab: bool = False) -> None: raise NotImplementedError @@ -495,69 +518,69 @@ class AbstractScroller(QObject): perc_changed = pyqtSignal(int, int) - def __init__(self, tab, parent=None): + def __init__(self, tab: 'AbstractTab', parent: QWidget = None): super().__init__(parent) self._tab = tab - self._widget = None + self._widget = None # type: typing.Optional[QWebEngineView] self.perc_changed.connect(self._log_scroll_pos_change) @pyqtSlot() - def _log_scroll_pos_change(self): - log.webview.vdebug("Scroll position changed to {}".format( - self.pos_px())) + def _log_scroll_pos_change(self) -> None: + log.webview.vdebug( # type: ignore + "Scroll position changed to {}".format(self.pos_px())) - def _init_widget(self, widget): + def _init_widget(self, widget: 'QWebEngineView') -> None: self._widget = widget - def pos_px(self): + def pos_px(self) -> int: raise NotImplementedError - def pos_perc(self): + def pos_perc(self) -> int: raise NotImplementedError - def to_perc(self, x=None, y=None): + def to_perc(self, x: int = None, y: int = None) -> None: raise NotImplementedError - def to_point(self, point): + def to_point(self, point: QPoint) -> None: raise NotImplementedError - def to_anchor(self, name): + def to_anchor(self, name: str) -> None: raise NotImplementedError - def delta(self, x=0, y=0): + def delta(self, x: int = 0, y: int = 0) -> None: raise NotImplementedError - def delta_page(self, x=0, y=0): + def delta_page(self, x: float = 0, y: float = 0) -> None: raise NotImplementedError - def up(self, count=1): + def up(self, count: int = 1) -> None: raise NotImplementedError - def down(self, count=1): + def down(self, count: int = 1) -> None: raise NotImplementedError - def left(self, count=1): + def left(self, count: int = 1) -> None: raise NotImplementedError - def right(self, count=1): + def right(self, count: int = 1) -> None: raise NotImplementedError - def top(self): + def top(self) -> None: raise NotImplementedError - def bottom(self): + def bottom(self) -> None: raise NotImplementedError - def page_up(self, count=1): + def page_up(self, count: int = 1) -> None: raise NotImplementedError - def page_down(self, count=1): + def page_down(self, count: int = 1) -> None: raise NotImplementedError - def at_top(self): + def at_top(self) -> bool: raise NotImplementedError - def at_bottom(self): + def at_bottom(self) -> bool: raise NotImplementedError @@ -565,20 +588,20 @@ class AbstractHistory: """The history attribute of a AbstractTab.""" - def __init__(self, tab): + def __init__(self, tab: 'AbstractTab') -> None: self._tab = tab self._history = None - def __len__(self): - return len(self._history) - - def __iter__(self): - return iter(self._history.items()) - - def current_idx(self): + def __len__(self) -> int: raise NotImplementedError - def back(self, count=1): + def __iter__(self) -> typing.Iterable: + raise NotImplementedError + + def current_idx(self) -> int: + raise NotImplementedError + + def back(self, count: int = 1) -> None: """Go back in the tab's history.""" idx = self.current_idx() - count if idx >= 0: @@ -587,7 +610,7 @@ class AbstractHistory: self._go_to_item(self._item_at(0)) raise WebTabError("At beginning of history.") - def forward(self, count=1): + def forward(self, count: int = 1) -> None: """Go forward in the tab's history.""" idx = self.current_idx() + count if idx < len(self): @@ -596,27 +619,27 @@ class AbstractHistory: self._go_to_item(self._item_at(len(self) - 1)) raise WebTabError("At end of history.") - def can_go_back(self): + def can_go_back(self) -> bool: raise NotImplementedError - def can_go_forward(self): + def can_go_forward(self) -> bool: raise NotImplementedError - def _item_at(self, i): + def _item_at(self, i: int) -> typing.Any: raise NotImplementedError - def _go_to_item(self, item): + def _go_to_item(self, item: typing.Any) -> None: raise NotImplementedError - def serialize(self): + def serialize(self) -> bytes: """Serialize into an opaque format understood by self.deserialize.""" raise NotImplementedError - def deserialize(self, data): - """Serialize from a format produced by self.serialize.""" + def deserialize(self, data: bytes) -> None: + """Deserialize from a format produced by self.serialize.""" raise NotImplementedError - def load_items(self, items): + def load_items(self, items: typing.Sequence) -> None: """Deserialize from a list of WebHistoryItems.""" raise NotImplementedError @@ -625,11 +648,18 @@ class AbstractElements: """Finding and handling of elements on the page.""" - def __init__(self, tab): + _MultiCallback = typing.Callable[ + [typing.Sequence[webelem.AbstractWebElement]], None] + _SingleCallback = typing.Callable[ + [typing.Optional[webelem.AbstractWebElement]], None] + + def __init__(self, tab: 'AbstractTab') -> None: self._widget = None self._tab = tab - def find_css(self, selector, callback, *, only_visible=False): + def find_css(self, selector: str, + callback: _MultiCallback, *, + only_visible: bool = False) -> None: """Find all HTML elements matching a given selector async. If there's an error, the callback is called with a webelem.Error @@ -642,7 +672,7 @@ class AbstractElements: """ raise NotImplementedError - def find_id(self, elem_id, callback): + def find_id(self, elem_id: str, callback: _SingleCallback) -> None: """Find the HTML element with the given ID async. Args: @@ -651,7 +681,7 @@ class AbstractElements: """ raise NotImplementedError - def find_focused(self, callback): + def find_focused(self, callback: _SingleCallback) -> None: """Find the focused element on the page async. Args: @@ -660,7 +690,7 @@ class AbstractElements: """ raise NotImplementedError - def find_at_pos(self, pos, callback): + def find_at_pos(self, pos: QPoint, callback: _SingleCallback) -> None: """Find the element at the given position async. This is also called "hit test" elsewhere. @@ -680,9 +710,9 @@ class AbstractAudio(QObject): muted_changed = pyqtSignal(bool) recently_audible_changed = pyqtSignal(bool) - def __init__(self, tab, parent=None): + def __init__(self, tab: 'AbstractTab', parent: QWidget = None) -> None: super().__init__(parent) - self._widget = None + self._widget = None # type: typing.Optional[QWebEngineView] self._tab = tab def set_muted(self, muted: bool, override: bool = False) -> None: @@ -695,14 +725,14 @@ class AbstractAudio(QObject): """ raise NotImplementedError - def is_muted(self): + def is_muted(self) -> bool: """Whether this tab is muted.""" raise NotImplementedError def toggle_muted(self, *, override: bool = False) -> None: self.set_muted(not self.is_muted(), override=override) - def is_recently_audible(self): + def is_recently_audible(self) -> bool: """Whether this tab has had audio playing recently.""" raise NotImplementedError @@ -758,7 +788,11 @@ class AbstractTab(QWidget): renderer_process_terminated = pyqtSignal(TerminationStatus, int) predicted_navigation = pyqtSignal(QUrl) - def __init__(self, *, win_id, mode_manager, private, parent=None): + def __init__(self, *, + win_id: int, + mode_manager: modeman.ModeManager, + private: bool, + parent: QWidget = None) -> None: self.private = private self.win_id = win_id self.tab_id = next(tab_id_gen) @@ -772,7 +806,7 @@ class AbstractTab(QWidget): self.data = TabData() self._layout = miscwidgets.WrapperLayout(self) - self._widget = None + self._widget = None # type: typing.Optional[QWebEngineView] self._progress = 0 self._has_ssl_errors = False self._mode_manager = mode_manager @@ -789,7 +823,7 @@ class AbstractTab(QWidget): self.predicted_navigation.connect(self._on_predicted_navigation) - def _set_widget(self, widget): + def _set_widget(self, widget: 'QWebEngineView') -> None: # pylint: disable=protected-access self._widget = widget self._layout.wrap(self, widget) @@ -807,10 +841,10 @@ class AbstractTab(QWidget): self._install_event_filter() self.zoom.set_default() - def _install_event_filter(self): + def _install_event_filter(self) -> None: raise NotImplementedError - def _set_load_status(self, val): + def _set_load_status(self, val: usertypes.LoadStatus) -> None: """Setter for load_status.""" if not isinstance(val, usertypes.LoadStatus): raise TypeError("Type {} is no LoadStatus member!".format(val)) @@ -818,11 +852,11 @@ class AbstractTab(QWidget): self._load_status = val self.load_status_changed.emit(val.name) - def event_target(self): + def event_target(self) -> QWidget: """Return the widget events should be sent to.""" raise NotImplementedError - def send_event(self, evt): + def send_event(self, evt: QEvent) -> None: """Send the given event to the underlying widget. The event will be sent via QApplication.postEvent. @@ -844,7 +878,7 @@ class AbstractTab(QWidget): QApplication.postEvent(recipient, evt) @pyqtSlot(QUrl) - def _on_predicted_navigation(self, url): + def _on_predicted_navigation(self, url: QUrl) -> None: """Adjust the title if we are going to visit a URL soon.""" qtutils.ensure_valid(url) url_string = url.toDisplayString() @@ -852,14 +886,14 @@ class AbstractTab(QWidget): self.title_changed.emit(url_string) @pyqtSlot(QUrl) - def _on_url_changed(self, url): + def _on_url_changed(self, url: QUrl) -> None: """Update title when URL has changed and no title is available.""" if url.isValid() and not self.title(): self.title_changed.emit(url.toDisplayString()) self.url_changed.emit(url) @pyqtSlot() - def _on_load_started(self): + def _on_load_started(self) -> None: self._progress = 0 self._has_ssl_errors = False self.data.viewing_source = False @@ -867,7 +901,10 @@ class AbstractTab(QWidget): self.load_started.emit() @pyqtSlot(usertypes.NavigationRequest) - def _on_navigation_request(self, navigation): + def _on_navigation_request( + self, + navigation: usertypes.NavigationRequest + ) -> None: """Handle common acceptNavigationRequest code.""" url = utils.elide(navigation.url.toDisplayString(), 100) log.webview.debug("navigation request: url {}, type {}, is_main_frame " @@ -891,7 +928,7 @@ class AbstractTab(QWidget): navigation.url.errorString())) navigation.accepted = False - def handle_auto_insert_mode(self, ok): + def handle_auto_insert_mode(self, ok: bool) -> None: """Handle `input.insert_mode.auto_load` after loading finished.""" if not config.val.input.insert_mode.auto_load or not ok: return @@ -900,7 +937,7 @@ class AbstractTab(QWidget): if cur_mode == usertypes.KeyMode.insert: return - def _auto_insert_mode_cb(elem): + def _auto_insert_mode_cb(elem: webelem.AbstractWebElement) -> None: """Called from JS after finding the focused element.""" if elem is None: log.webview.debug("No focused element!") @@ -912,7 +949,8 @@ class AbstractTab(QWidget): self.elements.find_focused(_auto_insert_mode_cb) @pyqtSlot(bool) - def _on_load_finished(self, ok): + def _on_load_finished(self, ok: bool) -> None: + assert self._widget is not None if sip.isdeleted(self._widget): # https://github.com/qutebrowser/qutebrowser/issues/3498 return @@ -943,46 +981,50 @@ class AbstractTab(QWidget): self.zoom.set_current() @pyqtSlot() - def _on_history_trigger(self): + def _on_history_trigger(self) -> None: """Emit add_history_item when triggered by backend-specific signal.""" raise NotImplementedError @pyqtSlot(int) - def _on_load_progress(self, perc): + def _on_load_progress(self, perc: int) -> None: self._progress = perc self.load_progress.emit(perc) - def url(self, requested=False): + def url(self, requested: bool = False) -> QUrl: raise NotImplementedError - def progress(self): + def progress(self) -> int: return self._progress - def load_status(self): + def load_status(self) -> usertypes.LoadStatus: return self._load_status - def _openurl_prepare(self, url, *, predict=True): + def _openurl_prepare(self, url: QUrl, *, predict: bool = True) -> None: qtutils.ensure_valid(url) if predict: self.predicted_navigation.emit(url) - def openurl(self, url, *, predict=True): + def openurl(self, url: QUrl, *, predict: bool = True) -> None: raise NotImplementedError - def reload(self, *, force=False): + def reload(self, *, force: bool = False) -> None: raise NotImplementedError - def stop(self): + def stop(self) -> None: raise NotImplementedError - def clear_ssl_errors(self): + def clear_ssl_errors(self) -> None: raise NotImplementedError - def key_press(self, key, modifier=Qt.NoModifier): + def key_press(self, + key: Qt.Key, + modifier: Qt.KeyboardModifier = Qt.NoModifier) -> None: """Send a fake key event to this tab.""" raise NotImplementedError - def dump_async(self, callback, *, plain=False): + def dump_async(self, + callback: typing.Callable[[str], None], *, + plain: bool = False) -> None: """Dump the current page's html asynchronously. The given callback will be called with the result when dumping is @@ -990,7 +1032,12 @@ class AbstractTab(QWidget): """ raise NotImplementedError - def run_js_async(self, code, callback=None, *, world=None): + def run_js_async( + self, + code: str, + callback: typing.Callable[[typing.Any], None] = None, *, + world: typing.Union[usertypes.JsWorld, int] = None + ) -> None: """Run javascript async. The given callback will be called with the result when running JS is @@ -1004,19 +1051,19 @@ class AbstractTab(QWidget): """ raise NotImplementedError - def shutdown(self): + def shutdown(self) -> None: raise NotImplementedError - def title(self): + def title(self) -> str: raise NotImplementedError - def icon(self): + def icon(self) -> None: raise NotImplementedError - def set_html(self, html, base_url=QUrl()): + def set_html(self, html: str, base_url: QUrl = QUrl()) -> None: raise NotImplementedError - def networkaccessmanager(self): + def networkaccessmanager(self) -> typing.Optional[QNetworkAccessManager]: """Get the QNetworkAccessManager for this tab. This is only implemented for QtWebKit. @@ -1024,7 +1071,7 @@ class AbstractTab(QWidget): """ raise NotImplementedError - def user_agent(self): + def user_agent(self) -> typing.Optional[str]: """Get the user agent for this tab. This is only implemented for QtWebKit. @@ -1032,13 +1079,16 @@ class AbstractTab(QWidget): """ raise NotImplementedError - def __repr__(self): + def __repr__(self) -> str: try: - url = utils.elide(self.url().toDisplayString(QUrl.EncodeUnicode), - 100) + qurl = self.url() + url = qurl.toDisplayString(QUrl.EncodeUnicode) # type: ignore except (AttributeError, RuntimeError) as exc: url = '<{}>'.format(exc.__class__.__name__) + else: + url = utils.elide(url, 100) return utils.get_repr(self, tab_id=self.tab_id, url=url) - def is_deleted(self): + def is_deleted(self) -> bool: + assert self._widget is not None return sip.isdeleted(self._widget) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 9945886fa..47bacd60e 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -522,6 +522,12 @@ class WebEngineHistory(browsertab.AbstractHistory): """QtWebEngine implementations related to page history.""" + def __len__(self): + return len(self._history) + + def __iter__(self): + return iter(self._history.items()) + def current_idx(self): return self._history.currentItemIndex() @@ -551,7 +557,7 @@ class WebEngineHistory(browsertab.AbstractHistory): return qtutils.serialize(self._history) def deserialize(self, data): - return qtutils.deserialize(data, self._history) + qtutils.deserialize(data, self._history) def load_items(self, items): if items: @@ -672,6 +678,7 @@ class WebEngineAudio(browsertab.AbstractAudio): def set_muted(self, muted: bool, override: bool = False) -> None: self._overridden = override + assert self._widget is not None page = self._widget.page() page.setAudioMuted(muted) diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index c791326ce..51e3f385e 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -513,6 +513,12 @@ class WebKitHistory(browsertab.AbstractHistory): """QtWebKit implementations related to page history.""" + def __len__(self): + return len(self._history) + + def __iter__(self): + return iter(self._history.items()) + def current_idx(self): return self._history.currentItemIndex() @@ -533,7 +539,7 @@ class WebKitHistory(browsertab.AbstractHistory): return qtutils.serialize(self._history) def deserialize(self, data): - return qtutils.deserialize(data, self._history) + qtutils.deserialize(data, self._history) def load_items(self, items): if items: From 73be27ac13cee765bf521af4f937499db75888e6 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Thu, 22 Nov 2018 08:06:04 -0800 Subject: [PATCH 171/492] Add org-capture by alcah to userscripts README --- misc/userscripts/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misc/userscripts/README.md b/misc/userscripts/README.md index 5680267b7..ceddb6c81 100644 --- a/misc/userscripts/README.md +++ b/misc/userscripts/README.md @@ -53,9 +53,10 @@ The following userscripts can be found on their own repositories. - [qtb.us](https://github.com/Chinggis6/qtb.us): small pack of userscripts. - [pinboard.zsh](https://github.com/dmix/pinboard.zsh): Add URL to your [Pinboard][] bookmark manager. +- [qute-capture](https://github.com/alcah/qute-capture): Capture links with + Emacs's org-mode to a read-later file. [Zotero]: https://www.zotero.org/ [Pocket]: https://getpocket.com/ [Instapaper]: https://www.instapaper.com/ [Pinboard]: https://pinboard.in/ - From bc93d2257f25402275d945e7fc7e3ac0b0159dd1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 09:20:48 +0100 Subject: [PATCH 172/492] Add WM_CLASS to the FAQ --- doc/faq.asciidoc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/faq.asciidoc b/doc/faq.asciidoc index 6687917c7..113a11f09 100644 --- a/doc/faq.asciidoc +++ b/doc/faq.asciidoc @@ -260,6 +260,12 @@ Note that there are some missing features which you may run into: . Any greasemonkey API function to do with adding UI elements is not currently supported. That means context menu extentensions and background pages. +How do I change the `WM_CLASS` used by qutebrowser windows?:: + Qt only supports setting `WM_CLASS` globally, which you can do by starting + with `--qt-arg name foo`. Note that all windows are part of the same + qutebrowser instance (unless you use `--temp-basedir` or `--basedir`), so + they all will share the same `WM_CLASS`. + == Troubleshooting Unable to view flash content.:: From 52c703a5ff45f4851c8fb13569a86151d7895bcf Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 11:48:46 +0100 Subject: [PATCH 173/492] Update pylint to 2.2.2 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 44c2b19e8..8329ae0dd 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -13,7 +13,7 @@ jwcrypto==0.6.0 lazy-object-proxy==1.3.1 mccabe==0.6.1 pycparser==2.19 -pylint==2.2.0 +pylint==2.2.2 python-dateutil==2.7.5 ./scripts/dev/pylint_checkers requests==2.20.1 From 5ed3fb723d52092a1609c097c8a16e709a95911f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 11:49:10 +0100 Subject: [PATCH 174/492] Regenerate requirements-tests --- misc/requirements/requirements-tests.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 6ea860f19..7d8a4f33e 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -6,10 +6,9 @@ backports.functools-lru-cache==1.5 beautifulsoup4==4.6.3 cheroot==6.5.2 Click==7.0 -# colorama==0.4.0 +# colorama==0.4.1 coverage==4.5.2 EasyProcess==0.2.3 -fields==5.0.0 Flask==1.0.2 glob2==0.6 hunter==2.1.0 From 2453134011a8a7fc3e813d55e578b72ea07a5a42 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 11:26:40 +0100 Subject: [PATCH 175/492] Remove unnecessary pass statements --- qutebrowser/browser/downloads.py | 2 -- qutebrowser/browser/inspector.py | 2 -- qutebrowser/browser/network/pac.py | 4 --- qutebrowser/browser/qutescheme.py | 10 ------- qutebrowser/browser/urlmarks.py | 8 ------ qutebrowser/browser/webelem.py | 4 --- qutebrowser/browser/webkit/mhtml.py | 1 - .../browser/webkit/network/networkreply.py | 3 --- qutebrowser/browser/webkit/webkitelem.py | 2 -- qutebrowser/browser/webkit/webkithistory.py | 1 - qutebrowser/commands/cmdexc.py | 8 ------ qutebrowser/config/configexc.py | 2 -- qutebrowser/mainwindow/statusbar/keystring.py | 2 -- qutebrowser/misc/cmdhistory.py | 4 --- qutebrowser/misc/crashdialog.py | 2 -- qutebrowser/misc/sql.py | 4 --- qutebrowser/misc/utilcmds.py | 1 - qutebrowser/utils/objreg.py | 2 -- qutebrowser/utils/utils.py | 1 - scripts/hist_importer.py | 2 -- scripts/link_pyqt.py | 2 -- tests/end2end/fixtures/quteprocess.py | 2 -- tests/end2end/fixtures/testprocess.py | 6 ----- tests/helpers/stubs.py | 5 ---- tests/unit/commands/test_cmdutils.py | 26 +------------------ tests/unit/completion/test_completer.py | 6 ----- tests/unit/utils/test_qtutils.py | 5 ---- tests/unit/utils/test_utils.py | 9 ------- tests/unit/utils/usertypes/test_timer.py | 2 -- 29 files changed, 1 insertion(+), 127 deletions(-) diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index 92d846bd8..6d9e4b388 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -60,8 +60,6 @@ class UnsupportedAttribute: supported with QtWebengine. """ - pass - class UnsupportedOperationError(Exception): diff --git a/qutebrowser/browser/inspector.py b/qutebrowser/browser/inspector.py index 9b3fced2b..3334cea4e 100644 --- a/qutebrowser/browser/inspector.py +++ b/qutebrowser/browser/inspector.py @@ -49,8 +49,6 @@ class WebInspectorError(Exception): """Raised when the inspector could not be initialized.""" - pass - class AbstractWebInspector(QWidget): diff --git a/qutebrowser/browser/network/pac.py b/qutebrowser/browser/network/pac.py index 95ff99390..1c6075945 100644 --- a/qutebrowser/browser/network/pac.py +++ b/qutebrowser/browser/network/pac.py @@ -35,15 +35,11 @@ class ParseProxyError(Exception): """Error while parsing PAC result string.""" - pass - class EvalProxyError(Exception): """Error while evaluating PAC script.""" - pass - def _js_slot(*args): """Wrap a methods as a JavaScript function. diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 0fa9366a6..769247e88 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -61,36 +61,26 @@ class Error(Exception): """Exception for generic errors on a qute:// page.""" - pass - class NotFoundError(Error): """Raised when the given URL was not found.""" - pass - class SchemeOSError(Error): """Raised when there was an OSError inside a handler.""" - pass - class UrlInvalidError(Error): """Raised when an invalid URL was opened.""" - pass - class RequestDeniedError(Error): """Raised when the request is forbidden.""" - pass - class Redirect(Exception): diff --git a/qutebrowser/browser/urlmarks.py b/qutebrowser/browser/urlmarks.py index bb20e2166..e32dbcc46 100644 --- a/qutebrowser/browser/urlmarks.py +++ b/qutebrowser/browser/urlmarks.py @@ -43,29 +43,21 @@ class Error(Exception): """Base class for all errors in this module.""" - pass - class InvalidUrlError(Error): """Exception emitted when a URL is invalid.""" - pass - class DoesNotExistError(Error): """Exception emitted when a given URL does not exist.""" - pass - class AlreadyExistsError(Error): """Exception emitted when a given URL does already exist.""" - pass - class UrlMarkManager(QObject): diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index e39eb5850..520b7d12b 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -34,15 +34,11 @@ class Error(Exception): """Base class for WebElement errors.""" - pass - class OrphanedError(Error): """Raised when a webelement's parent has vanished.""" - pass - def css_selector(group, url): """Get a CSS selector for the given group/URL.""" diff --git a/qutebrowser/browser/webkit/mhtml.py b/qutebrowser/browser/webkit/mhtml.py index 9339df9ce..1ecebed2d 100644 --- a/qutebrowser/browser/webkit/mhtml.py +++ b/qutebrowser/browser/webkit/mhtml.py @@ -516,7 +516,6 @@ class _NoCloseBytesIO(io.BytesIO): def close(self): """Do nothing.""" - pass def actual_close(self): """Close the stream.""" diff --git a/qutebrowser/browser/webkit/network/networkreply.py b/qutebrowser/browser/webkit/network/networkreply.py index dc6bed5ed..c56fe2a9b 100644 --- a/qutebrowser/browser/webkit/network/networkreply.py +++ b/qutebrowser/browser/webkit/network/networkreply.py @@ -67,7 +67,6 @@ class FixedDataNetworkReply(QNetworkReply): @pyqtSlot() def abort(self): """Abort the operation.""" - pass def bytesAvailable(self): """Determine the bytes available for being read. @@ -123,7 +122,6 @@ class ErrorNetworkReply(QNetworkReply): def abort(self): """Do nothing since it's a fake reply.""" - pass def bytesAvailable(self): """We always have 0 bytes available.""" @@ -151,7 +149,6 @@ class RedirectNetworkReply(QNetworkReply): def abort(self): """Called when there's e.g. a redirection limit.""" - pass def readData(self, _maxlen): return bytes() diff --git a/qutebrowser/browser/webkit/webkitelem.py b/qutebrowser/browser/webkit/webkitelem.py index 01a2736dc..66d5e59b8 100644 --- a/qutebrowser/browser/webkit/webkitelem.py +++ b/qutebrowser/browser/webkit/webkitelem.py @@ -31,8 +31,6 @@ class IsNullError(webelem.Error): """Gets raised by WebKitElement if an element is null.""" - pass - class WebKitElement(webelem.AbstractWebElement): diff --git a/qutebrowser/browser/webkit/webkithistory.py b/qutebrowser/browser/webkit/webkithistory.py index 2c719acd6..65d9bbb01 100644 --- a/qutebrowser/browser/webkit/webkithistory.py +++ b/qutebrowser/browser/webkit/webkithistory.py @@ -41,7 +41,6 @@ class WebHistoryInterface(QWebHistoryInterface): def addHistoryEntry(self, url_string): """Required for a QWebHistoryInterface impl, obsoleted by add_url.""" - pass @functools.lru_cache(maxsize=32768) def historyContains(self, url_string): diff --git a/qutebrowser/commands/cmdexc.py b/qutebrowser/commands/cmdexc.py index 5d3ac2a89..dbc5da581 100644 --- a/qutebrowser/commands/cmdexc.py +++ b/qutebrowser/commands/cmdexc.py @@ -32,22 +32,16 @@ class CommandError(Error): """Raised when a command encounters an error while running.""" - pass - class NoSuchCommandError(Error): """Raised when a command wasn't found.""" - pass - class ArgumentTypeError(Error): """Raised when an argument had an invalid type.""" - pass - class PrerequisitesError(Error): @@ -56,5 +50,3 @@ class PrerequisitesError(Error): This is raised for example when we're in the wrong mode while executing the command, or we need javascript enabled but don't have done so. """ - - pass diff --git a/qutebrowser/config/configexc.py b/qutebrowser/config/configexc.py index 2a99dfa5c..051ed971a 100644 --- a/qutebrowser/config/configexc.py +++ b/qutebrowser/config/configexc.py @@ -28,8 +28,6 @@ class Error(Exception): """Base exception for config-related errors.""" - pass - class NoAutoconfigError(Error): diff --git a/qutebrowser/mainwindow/statusbar/keystring.py b/qutebrowser/mainwindow/statusbar/keystring.py index 29dd3b790..73b23a65d 100644 --- a/qutebrowser/mainwindow/statusbar/keystring.py +++ b/qutebrowser/mainwindow/statusbar/keystring.py @@ -25,5 +25,3 @@ from qutebrowser.mainwindow.statusbar import textbase class KeyString(textbase.TextBase): """Keychain string displayed in the statusbar.""" - - pass diff --git a/qutebrowser/misc/cmdhistory.py b/qutebrowser/misc/cmdhistory.py index 9fa273c1c..0a3ac9fa9 100644 --- a/qutebrowser/misc/cmdhistory.py +++ b/qutebrowser/misc/cmdhistory.py @@ -29,15 +29,11 @@ class HistoryEmptyError(Exception): """Raised when the history is empty.""" - pass - class HistoryEndReachedError(Exception): """Raised when the end of the history is reached.""" - pass - class History(QObject): diff --git a/qutebrowser/misc/crashdialog.py b/qutebrowser/misc/crashdialog.py index 27dec3345..e2b9bd05f 100644 --- a/qutebrowser/misc/crashdialog.py +++ b/qutebrowser/misc/crashdialog.py @@ -197,7 +197,6 @@ class _CrashDialog(QDialog): def _init_checkboxes(self): """Initialize the checkboxes.""" - pass def _init_buttons(self): """Initialize the buttons.""" @@ -569,7 +568,6 @@ class ReportDialog(_CrashDialog): def _init_info_text(self): """We don't want an info text as the user wanted to report.""" - pass def _get_error_type(self): return 'report' diff --git a/qutebrowser/misc/sql.py b/qutebrowser/misc/sql.py index 4c300a3da..eda778194 100644 --- a/qutebrowser/misc/sql.py +++ b/qutebrowser/misc/sql.py @@ -72,8 +72,6 @@ class SqlEnvironmentError(SqlError): disk or I/O errors), where qutebrowser isn't to blame. """ - pass - class SqlBugError(SqlError): @@ -82,8 +80,6 @@ class SqlBugError(SqlError): This is raised for errors resulting from a qutebrowser bug. """ - pass - def raise_sqlite_error(msg, error): """Raise either a SqlBugError or SqlEnvironmentError.""" diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py index d108a56ac..1245d06ba 100644 --- a/qutebrowser/misc/utilcmds.py +++ b/qutebrowser/misc/utilcmds.py @@ -370,7 +370,6 @@ def window_only(current_win_id): @cmdutils.register() def nop(): """Do nothing.""" - pass @cmdutils.register() diff --git a/qutebrowser/utils/objreg.py b/qutebrowser/utils/objreg.py index 17fc34b92..b68ca133c 100644 --- a/qutebrowser/utils/objreg.py +++ b/qutebrowser/utils/objreg.py @@ -42,8 +42,6 @@ class RegistryUnavailableError(Exception): """Exception raised when a certain registry does not exist yet.""" - pass - class NoWindow(Exception): diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py index 6119675ba..1ac7a1a8c 100644 --- a/qutebrowser/utils/utils.py +++ b/qutebrowser/utils/utils.py @@ -630,7 +630,6 @@ def open_file(filename, cmdline=None): def unused(_arg): """Function which does nothing to avoid pylint complaining.""" - pass def expand_windows_drive(path): diff --git a/scripts/hist_importer.py b/scripts/hist_importer.py index 914701a19..31936b4c1 100755 --- a/scripts/hist_importer.py +++ b/scripts/hist_importer.py @@ -33,8 +33,6 @@ class Error(Exception): """Exception for errors in this module.""" - pass - def parse(): """Parse command line arguments.""" diff --git a/scripts/link_pyqt.py b/scripts/link_pyqt.py index ae7eaa622..e16056fa8 100644 --- a/scripts/link_pyqt.py +++ b/scripts/link_pyqt.py @@ -34,8 +34,6 @@ class Error(Exception): """Exception raised when linking fails.""" - pass - def run_py(executable, *code): """Run the given python code with the given executable.""" diff --git a/tests/end2end/fixtures/quteprocess.py b/tests/end2end/fixtures/quteprocess.py index f4e5d1486..561d92a80 100644 --- a/tests/end2end/fixtures/quteprocess.py +++ b/tests/end2end/fixtures/quteprocess.py @@ -842,8 +842,6 @@ class YamlLoader(yaml.SafeLoader): """Custom YAML loader used in compare_session.""" - pass - # Translate ... to ellipsis in YAML. YamlLoader.add_constructor('!ellipsis', lambda loader, node: ...) diff --git a/tests/end2end/fixtures/testprocess.py b/tests/end2end/fixtures/testprocess.py index d0af5bebc..eab914a1a 100644 --- a/tests/end2end/fixtures/testprocess.py +++ b/tests/end2end/fixtures/testprocess.py @@ -39,15 +39,11 @@ class InvalidLine(Exception): """Raised when the process prints a line which is not parsable.""" - pass - class ProcessExited(Exception): """Raised when the child process did exit.""" - pass - class WaitForTimeout(Exception): @@ -271,7 +267,6 @@ class Process(QObject): def _after_start(self): """Do things which should be done immediately after starting.""" - pass def before_test(self): """Restart process before a test if it exited before.""" @@ -443,7 +438,6 @@ class Process(QObject): QuteProc._maybe_skip, and call _maybe_skip after every parsed message in wait_for (where it's most likely that new messages arrive). """ - pass def wait_for(self, timeout=None, *, override_waited_for=False, do_skip=False, divisor=1, after=None, **kwargs): diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 9bf5b837d..e050e1fb5 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -306,7 +306,6 @@ class FakeSignal: Currently does nothing, but could be improved to do some sanity checking on the slot. """ - pass def disconnect(self, slot=None): """Disconnect the signal from a slot. @@ -314,7 +313,6 @@ class FakeSignal: Currently does nothing, but could be improved to do some sanity checking on the slot and see if it actually got connected. """ - pass def emit(self, *args): """Emit the signal. @@ -322,7 +320,6 @@ class FakeSignal: Currently does nothing, but could be improved to do type checking based on a signature given to __init__. """ - pass @attr.s @@ -457,8 +454,6 @@ class BookmarkManagerStub(UrlMarkManagerStub): """Stub for the bookmark-manager object.""" - pass - class QuickmarkManagerStub(UrlMarkManagerStub): diff --git a/tests/unit/commands/test_cmdutils.py b/tests/unit/commands/test_cmdutils.py index fc68fa920..ef7c97164 100644 --- a/tests/unit/commands/test_cmdutils.py +++ b/tests/unit/commands/test_cmdutils.py @@ -48,7 +48,6 @@ def _get_cmd(*args, **kwargs): @cmdutils.register(*args, **kwargs) def fun(): """Blah.""" - pass return cmdutils.cmd_dict['fun'] @@ -83,7 +82,6 @@ class TestRegister: @cmdutils.register() def fun(): """Blah.""" - pass cmd = cmdutils.cmd_dict['fun'] assert cmd.handler is fun @@ -95,7 +93,6 @@ class TestRegister: @cmdutils.register() def eggs_bacon(): """Blah.""" - pass assert cmdutils.cmd_dict['eggs-bacon'].name == 'eggs-bacon' assert 'eggs_bacon' not in cmdutils.cmd_dict @@ -105,7 +102,6 @@ class TestRegister: @cmdutils.register() def Test(): # noqa: N801,N806 pylint: disable=invalid-name """Blah.""" - pass assert cmdutils.cmd_dict['test'].name == 'test' assert 'Test' not in cmdutils.cmd_dict @@ -115,7 +111,6 @@ class TestRegister: @cmdutils.register(name='foobar') def fun(): """Blah.""" - pass assert cmdutils.cmd_dict['foobar'].name == 'foobar' assert 'fun' not in cmdutils.cmd_dict @@ -126,20 +121,17 @@ class TestRegister: @cmdutils.register(name='foobar') def fun(): """Blah.""" - pass with pytest.raises(ValueError): @cmdutils.register(name='foobar') def fun2(): """Blah.""" - pass def test_instance(self): """Make sure the instance gets passed to Command.""" @cmdutils.register(instance='foobar') def fun(self): """Blah.""" - pass assert cmdutils.cmd_dict['fun']._instance == 'foobar' def test_star_args(self): @@ -147,7 +139,6 @@ class TestRegister: @cmdutils.register() def fun(*args): """Blah.""" - pass with pytest.raises(argparser.ArgumentParserError): cmdutils.cmd_dict['fun'].parser.parse_args([]) @@ -195,14 +186,12 @@ class TestRegister: @cmdutils.argument('arg1', flag='b') def fun(arg1=False, arg2=False): """Blah.""" - pass def test_win_id(self): @cmdutils.register() @cmdutils.argument('win_id', win_id=True) def fun(win_id): """Blah.""" - pass assert cmdutils.cmd_dict['fun']._get_call_args(42) == ([42], {}) def test_count(self): @@ -210,7 +199,6 @@ class TestRegister: @cmdutils.argument('count', count=True) def fun(count=0): """Blah.""" - pass assert cmdutils.cmd_dict['fun']._get_call_args(42) == ([0], {}) def test_count_without_default(self): @@ -220,7 +208,6 @@ class TestRegister: @cmdutils.argument('count', count=True) def fun(count): """Blah.""" - pass @pytest.mark.parametrize('hide', [True, False]) def test_pos_args(self, hide): @@ -228,7 +215,6 @@ class TestRegister: @cmdutils.argument('arg', hide=hide) def fun(arg): """Blah.""" - pass pos_args = cmdutils.cmd_dict['fun'].pos_args if hide: @@ -283,7 +269,6 @@ class TestRegister: @cmdutils.argument('arg', choices=['foo', 'bar']) def fun(arg): """Blah.""" - pass cmd = cmdutils.cmd_dict['fun'] cmd.namespace = cmd.parser.parse_args(['fish']) @@ -297,7 +282,6 @@ class TestRegister: @cmdutils.argument('arg', choices=['foo', 'bar']) def fun(*, arg='foo'): """Blah.""" - pass cmd = cmdutils.cmd_dict['fun'] cmd.namespace = cmd.parser.parse_args(['--arg=fish']) @@ -312,7 +296,6 @@ class TestRegister: @cmdutils.argument('opt') def fun(foo, bar, opt=False): """Blah.""" - pass cmd = cmdutils.cmd_dict['fun'] assert cmd.get_pos_arg_info(0) == command.ArgInfo(choices=('a', 'b')) @@ -324,7 +307,6 @@ class TestRegister: # https://github.com/qutebrowser/qutebrowser/issues/1872 def fun(*, target): """Blah.""" - pass with pytest.raises(TypeError, match="fun: handler has keyword only " "argument 'target' without default!"): @@ -334,7 +316,6 @@ class TestRegister: # https://github.com/qutebrowser/qutebrowser/issues/1872 def fun(*, target: int): """Blah.""" - pass with pytest.raises(TypeError, match="fun: handler has keyword only " "argument 'target' without default!"): @@ -350,14 +331,12 @@ class TestArgument: @cmdutils.argument('foo') def fun(bar): """Blah.""" - pass def test_storage(self): @cmdutils.argument('foo', flag='x') @cmdutils.argument('bar', flag='y') def fun(foo, bar): """Blah.""" - pass expected = { 'foo': command.ArgInfo(flag='x'), 'bar': command.ArgInfo(flag='y') @@ -372,7 +351,6 @@ class TestArgument: @cmdutils.register() def fun(bar): """Blah.""" - pass def test_count_and_win_id_same_arg(self): with pytest.raises(TypeError, @@ -380,7 +358,6 @@ class TestArgument: @cmdutils.argument('arg', count=True, win_id=True) def fun(arg=0): """Blah.""" - pass def test_no_docstring(self, caplog): with caplog.at_level(logging.WARNING): @@ -388,6 +365,7 @@ class TestArgument: def fun(): # no docstring pass + assert len(caplog.records) == 1 assert caplog.messages[0].endswith('test_cmdutils.py has no docstring') @@ -398,7 +376,6 @@ class TestArgument: @cmdutils.register() def fun(): # no docstring - pass class TestRun: @@ -441,7 +418,6 @@ class TestRun: backend=usertypes.Backend.QtWebEngine) def fun(self): """Blah.""" - pass monkeypatch.setattr(command.objects, 'backend', usertypes.Backend.QtWebKit) diff --git a/tests/unit/completion/test_completer.py b/tests/unit/completion/test_completer.py index dc98f0efb..8620241e4 100644 --- a/tests/unit/completion/test_completer.py +++ b/tests/unit/completion/test_completer.py @@ -105,35 +105,29 @@ def cmdutils_patch(monkeypatch, stubs, miscmodels_patch): @cmdutils.argument('value', completion=miscmodels_patch.value) def set_command(section_=None, option=None, value=None): """docstring.""" - pass @cmdutils.argument('topic', completion=miscmodels_patch.helptopic) def show_help(tab=False, bg=False, window=False, topic=None): """docstring.""" - pass @cmdutils.argument('url', completion=miscmodels_patch.url) @cmdutils.argument('count', count=True) def openurl(url=None, related=False, bg=False, tab=False, window=False, count=None): """docstring.""" - pass @cmdutils.argument('win_id', win_id=True) @cmdutils.argument('command', completion=miscmodels_patch.command) def bind(key, win_id, command=None, *, mode='normal'): """docstring.""" - pass def tab_give(): """docstring.""" - pass @cmdutils.argument('option', completion=miscmodels_patch.option) @cmdutils.argument('values', completion=miscmodels_patch.value) def config_cycle(option, *values): """For testing varargs.""" - pass cmd_utils = stubs.FakeCmdUtils({ 'set': command.Command(name='set', handler=set_command), diff --git a/tests/unit/utils/test_qtutils.py b/tests/unit/utils/test_qtutils.py index 0825d1fb3..3b625b3a5 100644 --- a/tests/unit/utils/test_qtutils.py +++ b/tests/unit/utils/test_qtutils.py @@ -336,8 +336,6 @@ class SavefileTestException(Exception): """Exception raised in TestSavefileOpen for testing.""" - pass - @pytest.mark.usefixtures('qapp') class TestSavefileOpen: @@ -541,7 +539,6 @@ if test_file is not None: def testReadinto_text(self): """Skip this test as BufferedIOBase seems to fail it.""" - pass class PyOtherFileTests(PyIODeviceTestMixin, test_file.OtherFileTests, unittest.TestCase): @@ -550,11 +547,9 @@ if test_file is not None: def testSetBufferSize(self): """Skip this test as setting buffer size is unsupported.""" - pass def testTruncateOnWindows(self): """Skip this test truncating is unsupported.""" - pass class FailingQIODevice(QIODevice): diff --git a/tests/unit/utils/test_utils.py b/tests/unit/utils/test_utils.py index e25ecfe4a..ccabfa050 100644 --- a/tests/unit/utils/test_utils.py +++ b/tests/unit/utils/test_utils.py @@ -409,8 +409,6 @@ class GotException(Exception): """Exception used for TestDisabledExcepthook.""" - pass - def excepthook(_exc, _val, _tb): pass @@ -512,8 +510,6 @@ class Obj: """Test object for test_get_repr().""" - pass - @pytest.mark.parametrize('constructor, attrs, expected', [ (False, {}, ''), @@ -534,12 +530,10 @@ class QualnameObj(): def func(self): """Test method for test_qualname.""" - pass def qualname_func(_blah): """Test function for test_qualname.""" - pass QUALNAME_OBJ = QualnameObj() @@ -578,8 +572,6 @@ class TestIsEnum: """Test class for is_enum.""" - pass - assert not utils.is_enum(Test) def test_object(self): @@ -597,7 +589,6 @@ class TestRaises: def do_nothing(self): """Helper function which does nothing.""" - pass @pytest.mark.parametrize('exception, value, expected', [ (ValueError, 'a', True), diff --git a/tests/unit/utils/usertypes/test_timer.py b/tests/unit/utils/usertypes/test_timer.py index 2ead0dc60..928e9d6a8 100644 --- a/tests/unit/utils/usertypes/test_timer.py +++ b/tests/unit/utils/usertypes/test_timer.py @@ -29,8 +29,6 @@ class Parent(QObject): """Class for test_parent().""" - pass - def test_parent(): """Make sure the parent is set correctly.""" From 2237ca2bcfa94d5521d735c66c3c4b83759ed763 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 12:54:19 +0100 Subject: [PATCH 176/492] Remove now unneeded pylint suppressions --- qutebrowser/browser/webengine/webenginedownloads.py | 3 +-- qutebrowser/misc/backendproblem.py | 1 - qutebrowser/misc/earlyinit.py | 3 +-- qutebrowser/utils/qtutils.py | 2 +- scripts/dev/build_release.py | 2 +- tests/conftest.py | 3 +-- tests/unit/misc/test_checkpyver.py | 2 +- tests/unit/utils/test_utils.py | 4 ---- 8 files changed, 6 insertions(+), 14 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginedownloads.py b/qutebrowser/browser/webengine/webenginedownloads.py index 94caa887e..6dde42070 100644 --- a/qutebrowser/browser/webengine/webenginedownloads.py +++ b/qutebrowser/browser/webengine/webenginedownloads.py @@ -117,8 +117,7 @@ class DownloadItem(downloads.AbstractDownloadItem): def _get_open_filename(self): return self._filename - def _set_fileobj(self, fileobj, *, - autoclose=True): # pylint: disable=unused-argument + def _set_fileobj(self, fileobj, *, autoclose=True): raise downloads.UnsupportedOperationError def _set_tempfile(self, fileobj): diff --git a/qutebrowser/misc/backendproblem.py b/qutebrowser/misc/backendproblem.py index d5f7c9680..53094a257 100644 --- a/qutebrowser/misc/backendproblem.py +++ b/qutebrowser/misc/backendproblem.py @@ -280,7 +280,6 @@ class BackendImports: def _try_import_backends(): """Check whether backends can be imported and return BackendImports.""" - # pylint: disable=unused-variable results = BackendImports() try: diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index b29e1508f..5e650510c 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -133,7 +133,7 @@ def init_faulthandler(fileobj=sys.__stderr__): def check_pyqt_core(): """Check if PyQt core is installed.""" try: - import PyQt5.QtCore # pylint: disable=unused-variable + import PyQt5.QtCore except ImportError as e: text = _missing_str('PyQt5') text = text.replace('', '') @@ -187,7 +187,6 @@ def check_qt_version(): def check_ssl_support(): """Check if SSL support is available.""" - # pylint: disable=unused-variable try: from PyQt5.QtNetwork import QSslSocket except ImportError: diff --git a/qutebrowser/utils/qtutils.py b/qutebrowser/utils/qtutils.py index c634eb95f..6905c2fbc 100644 --- a/qutebrowser/utils/qtutils.py +++ b/qutebrowser/utils/qtutils.py @@ -285,7 +285,7 @@ class PyQIODevice(io.BufferedIOBase): if not ok: raise QtOSError(self.dev, msg="seek failed!") - def truncate(self, size=None): # pylint: disable=unused-argument + def truncate(self, size=None): raise io.UnsupportedOperation @property diff --git a/scripts/dev/build_release.py b/scripts/dev/build_release.py index e3f039336..6749be676 100755 --- a/scripts/dev/build_release.py +++ b/scripts/dev/build_release.py @@ -370,7 +370,7 @@ def main(): if args.upload is not None: # Fail early when trying to upload without github3 installed # or without API token - import github3 # pylint: disable=unused-variable + import github3 read_github_token() if args.no_asciidoc: diff --git a/tests/conftest.py b/tests/conftest.py index f53a70054..d06dfcfa6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -206,7 +206,6 @@ def pytest_configure(config): webengine_env = os.environ.get('QUTE_BDD_WEBENGINE', '') config.webengine = bool(webengine_arg or webengine_env) # Fail early if QtWebEngine is not available - # pylint: disable=unused-variable if config.webengine: import PyQt5.QtWebEngineWidgets @@ -283,7 +282,7 @@ def apply_fake_os(monkeypatch, request): def check_yaml_c_exts(): """Make sure PyYAML C extensions are available on Travis.""" if 'TRAVIS' in os.environ: - from yaml import CLoader # pylint: disable=unused-variable + from yaml import CLoader @pytest.hookimpl(tryfirst=True, hookwrapper=True) diff --git a/tests/unit/misc/test_checkpyver.py b/tests/unit/misc/test_checkpyver.py index 17e910a5f..15fc31d18 100644 --- a/tests/unit/misc/test_checkpyver.py +++ b/tests/unit/misc/test_checkpyver.py @@ -73,7 +73,7 @@ def test_patched_errwindow(capfd, mocker, monkeypatch): monkeypatch.setattr(checkpyver.sys, 'exit', lambda status: None) try: - import tkinter # pylint: disable=unused-variable + import tkinter except ImportError: tk_mock = mocker.patch('qutebrowser.misc.checkpyver.Tk', spec=['withdraw'], new_callable=mocker.Mock) diff --git a/tests/unit/utils/test_utils.py b/tests/unit/utils/test_utils.py index ccabfa050..37bd9faaa 100644 --- a/tests/unit/utils/test_utils.py +++ b/tests/unit/utils/test_utils.py @@ -463,9 +463,7 @@ class TestPreventExceptions: def test_raising(self, caplog): """Test with a raising function.""" with caplog.at_level(logging.ERROR, 'misc'): - # pylint: disable=assignment-from-no-return ret = self.func_raising() - # pylint: enable=assignment-from-no-return assert ret == 42 expected = 'Error in test_utils.TestPreventExceptions.func_raising' assert caplog.messages == [expected] @@ -488,9 +486,7 @@ class TestPreventExceptions: def test_predicate_true(self, caplog): """Test with a True predicate.""" with caplog.at_level(logging.ERROR, 'misc'): - # pylint: disable=assignment-from-no-return ret = self.func_predicate_true() - # enable: disable=assignment-from-no-return assert ret == 42 assert len(caplog.records) == 1 From 14fe7f9b0b7683b5024366e73d388900cfbcbb05 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 12:58:48 +0100 Subject: [PATCH 177/492] pass fixup --- tests/unit/commands/test_cmdutils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/commands/test_cmdutils.py b/tests/unit/commands/test_cmdutils.py index ef7c97164..718695874 100644 --- a/tests/unit/commands/test_cmdutils.py +++ b/tests/unit/commands/test_cmdutils.py @@ -376,6 +376,7 @@ class TestArgument: @cmdutils.register() def fun(): # no docstring + pass class TestRun: From b5253ec47381ef5c86e964375d4b26e0ffd46729 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 13:01:43 +0100 Subject: [PATCH 178/492] Fix lint --- qutebrowser/app.py | 2 +- qutebrowser/misc/backendproblem.py | 1 + qutebrowser/misc/earlyinit.py | 4 ++-- scripts/dev/build_release.py | 2 +- scripts/dev/src2asciidoc.py | 2 +- tests/end2end/fixtures/webserver.py | 3 ++- tests/unit/browser/test_pdfjs.py | 4 ++-- tests/unit/browser/webkit/http/test_http_hypothesis.py | 2 +- tests/unit/misc/test_checkpyver.py | 2 +- 9 files changed, 12 insertions(+), 10 deletions(-) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 7d1b61131..161bc5297 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -193,7 +193,7 @@ def _init_icon(): icon = QIcon() fallback_icon = QIcon() for size in [16, 24, 32, 48, 64, 96, 128, 256, 512]: - filename = ':/icons/qutebrowser-{}x{}.png'.format(size, size) + filename = ':/icons/qutebrowser-{size}x{size}.png'.format(size=size) pixmap = QPixmap(filename) if pixmap.isNull(): log.init.warning("Failed to load {}".format(filename)) diff --git a/qutebrowser/misc/backendproblem.py b/qutebrowser/misc/backendproblem.py index 53094a257..2099afa88 100644 --- a/qutebrowser/misc/backendproblem.py +++ b/qutebrowser/misc/backendproblem.py @@ -280,6 +280,7 @@ class BackendImports: def _try_import_backends(): """Check whether backends can be imported and return BackendImports.""" + # pylint: disable=unused-import results = BackendImports() try: diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index 5e650510c..a7571fdaa 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -133,7 +133,7 @@ def init_faulthandler(fileobj=sys.__stderr__): def check_pyqt_core(): """Check if PyQt core is installed.""" try: - import PyQt5.QtCore + import PyQt5.QtCore # pylint: disable=unused-import except ImportError as e: text = _missing_str('PyQt5') text = text.replace('', '') @@ -188,7 +188,7 @@ def check_qt_version(): def check_ssl_support(): """Check if SSL support is available.""" try: - from PyQt5.QtNetwork import QSslSocket + from PyQt5.QtNetwork import QSslSocket # pylint: disable=unused-import except ImportError: _die("Fatal error: Your Qt is built without SSL support.") diff --git a/scripts/dev/build_release.py b/scripts/dev/build_release.py index 6749be676..8591f1c31 100755 --- a/scripts/dev/build_release.py +++ b/scripts/dev/build_release.py @@ -370,7 +370,7 @@ def main(): if args.upload is not None: # Fail early when trying to upload without github3 installed # or without API token - import github3 + import github3 # pylint: disable=unused-import read_github_token() if args.no_asciidoc: diff --git a/scripts/dev/src2asciidoc.py b/scripts/dev/src2asciidoc.py index cc00c3757..8c6f2e44d 100755 --- a/scripts/dev/src2asciidoc.py +++ b/scripts/dev/src2asciidoc.py @@ -135,7 +135,7 @@ def _get_command_quickref(cmds): out.append('|Command|Description') for name, cmd in cmds: desc = inspect.getdoc(cmd.handler).splitlines()[0] - out.append('|<<{},{}>>|{}'.format(name, name, desc)) + out.append('|<<{name},{name}>>|{desc}'.format(name=name, desc=desc)) out.append('|==============') return '\n'.join(out) diff --git a/tests/end2end/fixtures/webserver.py b/tests/end2end/fixtures/webserver.py index 254b5ffaf..d1e45409e 100644 --- a/tests/end2end/fixtures/webserver.py +++ b/tests/end2end/fixtures/webserver.py @@ -82,7 +82,8 @@ class Request(testprocess.Line): for i in range(15): path_to_statuses['/redirect/{}'.format(i)] = [HTTPStatus.FOUND] for suffix in ['', '1', '2', '3', '4', '5', '6']: - key = '/basic-auth/user{}/password{}'.format(suffix, suffix) + key = ('/basic-auth/user{suffix}/password{suffix}' + .format(suffix=suffix)) path_to_statuses[key] = [HTTPStatus.UNAUTHORIZED, HTTPStatus.OK] default_statuses = [HTTPStatus.OK, HTTPStatus.NOT_MODIFIED] diff --git a/tests/unit/browser/test_pdfjs.py b/tests/unit/browser/test_pdfjs.py index 7fa1a8f6c..dcee2b82b 100644 --- a/tests/unit/browser/test_pdfjs.py +++ b/tests/unit/browser/test_pdfjs.py @@ -82,14 +82,14 @@ def test_generate_pdfjs_script_disable_object_url(monkeypatch, if qt == 'new': monkeypatch.setattr(pdfjs.qtutils, 'version_check', lambda version, exact=False, compiled=True: - False if version == '5.7.1' else True) + version != '5.7.1') elif qt == 'old': monkeypatch.setattr(pdfjs.qtutils, 'version_check', lambda version, exact=False, compiled=True: False) elif qt == '5.7': monkeypatch.setattr(pdfjs.qtutils, 'version_check', lambda version, exact=False, compiled=True: - True if version == '5.7.1' else False) + version == '5.7.1') else: raise utils.Unreachable diff --git a/tests/unit/browser/webkit/http/test_http_hypothesis.py b/tests/unit/browser/webkit/http/test_http_hypothesis.py index ec8ee4aff..5727bf1bc 100644 --- a/tests/unit/browser/webkit/http/test_http_hypothesis.py +++ b/tests/unit/browser/webkit/http/test_http_hypothesis.py @@ -31,7 +31,7 @@ from qutebrowser.browser.webkit import http, rfc6266 'attachment; filename="{}"', 'inline; {}', 'attachment; {}="foo"', - 'attachment; filename*=iso-8859-1''{}', + "attachment; filename*=iso-8859-1''{}", 'attachment; filename*={}', ]) @hypothesis.given(strategies.text(alphabet=[chr(x) for x in range(255)])) diff --git a/tests/unit/misc/test_checkpyver.py b/tests/unit/misc/test_checkpyver.py index 15fc31d18..a02e2f8e0 100644 --- a/tests/unit/misc/test_checkpyver.py +++ b/tests/unit/misc/test_checkpyver.py @@ -73,7 +73,7 @@ def test_patched_errwindow(capfd, mocker, monkeypatch): monkeypatch.setattr(checkpyver.sys, 'exit', lambda status: None) try: - import tkinter + import tkinter # pylint: disable=unused-import except ImportError: tk_mock = mocker.patch('qutebrowser.misc.checkpyver.Tk', spec=['withdraw'], new_callable=mocker.Mock) From 8765ebef230c6b12eeff11197ebf694cc03cf895 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 16:06:25 +0100 Subject: [PATCH 179/492] mypy: Don't claim to be a QWebEngineView --- qutebrowser/browser/browsertab.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index f3a613844..15cfb4f91 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -30,10 +30,6 @@ from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QWidget, QApplication, QDialog from PyQt5.QtPrintSupport import QPrintDialog, QPrinter from PyQt5.QtNetwork import QNetworkAccessManager -MYPY = False -if MYPY: - # pylint: disable=unused-import - from PyQt5.QtWebEngineWidgets import QWebEngineView import pygments import pygments.lexers @@ -46,6 +42,7 @@ from qutebrowser.utils import (utils, objreg, usertypes, log, qtutils, from qutebrowser.misc import miscwidgets, objects from qutebrowser.browser import mouse, hints, webelem from qutebrowser.qt import sip +MYPY = False if MYPY: # pylint: disable=unused-import from qutebrowser.browser.inspector import AbstractWebInspector @@ -153,7 +150,7 @@ class AbstractAction: action_base = None # type: type def __init__(self, tab: 'AbstractTab') -> None: - self._widget = typing.cast('QWebEngineView', None) + self._widget = typing.cast(QWidget, None) self._tab = tab def exit_fullscreen(self) -> None: @@ -169,7 +166,7 @@ class AbstractAction: member = getattr(self.action_class, name, None) if not isinstance(member, self.action_base): raise WebTabError("{} is not a valid web action!".format(name)) - self._widget.triggerPageAction(member) # type: ignore + self._widget.triggerPageAction(member) def show_source( self, @@ -521,7 +518,7 @@ class AbstractScroller(QObject): def __init__(self, tab: 'AbstractTab', parent: QWidget = None): super().__init__(parent) self._tab = tab - self._widget = None # type: typing.Optional[QWebEngineView] + self._widget = None # type: typing.Optional[QWidget] self.perc_changed.connect(self._log_scroll_pos_change) @pyqtSlot() @@ -529,7 +526,7 @@ class AbstractScroller(QObject): log.webview.vdebug( # type: ignore "Scroll position changed to {}".format(self.pos_px())) - def _init_widget(self, widget: 'QWebEngineView') -> None: + def _init_widget(self, widget: QWidget) -> None: self._widget = widget def pos_px(self) -> int: @@ -712,7 +709,7 @@ class AbstractAudio(QObject): def __init__(self, tab: 'AbstractTab', parent: QWidget = None) -> None: super().__init__(parent) - self._widget = None # type: typing.Optional[QWebEngineView] + self._widget = None # type: typing.Optional[QWidget] self._tab = tab def set_muted(self, muted: bool, override: bool = False) -> None: @@ -806,7 +803,7 @@ class AbstractTab(QWidget): self.data = TabData() self._layout = miscwidgets.WrapperLayout(self) - self._widget = None # type: typing.Optional[QWebEngineView] + self._widget = None # type: typing.Optional[QWidget] self._progress = 0 self._has_ssl_errors = False self._mode_manager = mode_manager @@ -823,7 +820,7 @@ class AbstractTab(QWidget): self.predicted_navigation.connect(self._on_predicted_navigation) - def _set_widget(self, widget: 'QWebEngineView') -> None: + def _set_widget(self, widget: QWidget) -> None: # pylint: disable=protected-access self._widget = widget self._layout.wrap(self, widget) From d60dff26233d777dc8eca888ac60f02737d80d54 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 17:34:33 +0100 Subject: [PATCH 180/492] Renaem private attribute to is_private --- qutebrowser/browser/browsertab.py | 4 ++-- qutebrowser/browser/commands.py | 6 +++--- qutebrowser/browser/navigate.py | 2 +- qutebrowser/browser/shared.py | 2 +- qutebrowser/browser/webelem.py | 2 +- qutebrowser/mainwindow/statusbar/bar.py | 2 +- qutebrowser/mainwindow/tabbedbrowser.py | 11 ++++++----- qutebrowser/mainwindow/tabwidget.py | 2 +- qutebrowser/misc/sessions.py | 4 ++-- 9 files changed, 18 insertions(+), 17 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 15cfb4f91..ab186e56a 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -743,7 +743,7 @@ class AbstractTab(QWidget): Attributes: history: The AbstractHistory for the current tab. registry: The ObjectRegistry associated with this tab. - private: Whether private browsing is turned on for this tab. + is_private: Whether private browsing is turned on for this tab. _load_status: loading status of this page Accessible via load_status() method. @@ -790,7 +790,7 @@ class AbstractTab(QWidget): mode_manager: modeman.ModeManager, private: bool, parent: QWidget = None) -> None: - self.private = private + self.is_private = private self.win_id = win_id self.tab_id = next(tab_id_gen) super().__init__(parent) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index a53cfc75e..2b4165364 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -126,7 +126,7 @@ class CommandDispatcher: tabbed_browser = self._tabbed_browser cmdutils.check_exclusive((tab, background, window, private), 'tbwp') if window and private is None: - private = self._tabbed_browser.private + private = self._tabbed_browser.is_private if window or private: tabbed_browser = self._new_tabbed_browser(private) @@ -470,7 +470,7 @@ class CommandDispatcher: # tabs.tabs_are_windows being set) if window: new_tabbed_browser = self._new_tabbed_browser( - private=self._tabbed_browser.private) + private=self._tabbed_browser.is_private) else: new_tabbed_browser = self._tabbed_browser newtab = new_tabbed_browser.tabopen(background=bg) @@ -536,7 +536,7 @@ class CommandDispatcher: "only one tab") tabbed_browser = self._new_tabbed_browser( - private=self._tabbed_browser.private) + private=self._tabbed_browser.is_private) else: if win_id not in objreg.window_registry: raise cmdexc.CommandError( diff --git a/qutebrowser/browser/navigate.py b/qutebrowser/browser/navigate.py index baeb7bf5b..0f80775bd 100644 --- a/qutebrowser/browser/navigate.py +++ b/qutebrowser/browser/navigate.py @@ -140,7 +140,7 @@ def prevnext(*, browsertab, win_id, baseurl, prev=False, if window: new_window = mainwindow.MainWindow( - private=cur_tabbed_browser.private) + private=cur_tabbed_browser.is_private) new_window.show() tabbed_browser = objreg.get('tabbed-browser', scope='window', window=new_window.win_id) diff --git a/qutebrowser/browser/shared.py b/qutebrowser/browser/shared.py index eb222cbe8..0bf3301f9 100644 --- a/qutebrowser/browser/shared.py +++ b/qutebrowser/browser/shared.py @@ -262,7 +262,7 @@ def get_tab(win_id, target): elif target == usertypes.ClickTarget.window: tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) - window = mainwindow.MainWindow(private=tabbed_browser.private) + window = mainwindow.MainWindow(private=tabbed_browser.is_private) window.show() win_id = window.win_id bg_tab = False diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index 520b7d12b..a22facfbd 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -382,7 +382,7 @@ class AbstractWebElement(collections.abc.MutableMapping): background = click_target == usertypes.ClickTarget.tab_bg tabbed_browser.tabopen(url, background=background) elif click_target == usertypes.ClickTarget.window: - window = mainwindow.MainWindow(private=tabbed_browser.private) + window = mainwindow.MainWindow(private=tabbed_browser.is_private) window.show() window.tabbed_browser.tabopen(url) else: diff --git a/qutebrowser/mainwindow/statusbar/bar.py b/qutebrowser/mainwindow/statusbar/bar.py index 3edb8128a..13a368f05 100644 --- a/qutebrowser/mainwindow/statusbar/bar.py +++ b/qutebrowser/mainwindow/statusbar/bar.py @@ -367,7 +367,7 @@ class StatusBar(QWidget): self.percentage.on_tab_changed(tab) self.backforward.on_tab_changed(tab) self.maybe_hide() - assert tab.private == self._color_flags.private + assert tab.is_private == self._color_flags.private @pyqtSlot(bool) def on_caret_selection_toggled(self, selection): diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 1f3484663..15b8f2c7b 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -76,7 +76,7 @@ class TabbedBrowser(QWidget): _local_marks: Jump markers local to each page _global_marks: Jump markers used across all pages default_window_icon: The qutebrowser window icon - private: Whether private browsing is on for this window. + is_private: Whether private browsing is on for this window. Signals: cur_progress: Progress of the current tab changed (load_progress). @@ -131,7 +131,7 @@ class TabbedBrowser(QWidget): self._local_marks = {} self._global_marks = {} self.default_window_icon = self.widget.window().windowIcon() - self.private = private + self.is_private = private config.instance.changed.connect(self._on_config_changed) def __repr__(self): @@ -243,7 +243,7 @@ class TabbedBrowser(QWidget): tab.audio.recently_audible_changed.connect( functools.partial(self._on_audio_changed, tab)) tab.new_tab_requested.connect(self.tabopen) - if not self.private: + if not self.is_private: web_history = objreg.get('web-history') tab.add_history_item.connect(web_history.add_from_tab) @@ -466,14 +466,15 @@ class TabbedBrowser(QWidget): if (config.val.tabs.tabs_are_windows and self.widget.count() > 0 and not ignore_tabs_are_windows): - window = mainwindow.MainWindow(private=self.private) + window = mainwindow.MainWindow(private=self.is_private) window.show() tabbed_browser = objreg.get('tabbed-browser', scope='window', window=window.win_id) return tabbed_browser.tabopen(url=url, background=background, related=related) - tab = browsertab.create(win_id=self._win_id, private=self.private, + tab = browsertab.create(win_id=self._win_id, + private=self.is_private, parent=self.widget) self._connect_tab_signals(tab) diff --git a/qutebrowser/mainwindow/tabwidget.py b/qutebrowser/mainwindow/tabwidget.py index a3ba0f1da..ca4be6d50 100644 --- a/qutebrowser/mainwindow/tabwidget.py +++ b/qutebrowser/mainwindow/tabwidget.py @@ -177,7 +177,7 @@ class TabWidget(QTabWidget): fields['title_sep'] = ' - ' if page_title else '' fields['perc_raw'] = tab.progress() fields['backend'] = objects.backend.name - fields['private'] = ' [Private Mode] ' if tab.private else '' + fields['private'] = ' [Private Mode] ' if tab.is_private else '' try: if tab.audio.is_muted(): fields['audio'] = TabWidget.MUTE_STRING diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index e50d803a2..5f50bf5d1 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -242,7 +242,7 @@ class SessionManager(QObject): if sip.isdeleted(main_window): continue - if tabbed_browser.private and not with_private: + if tabbed_browser.is_private and not with_private: continue win_data = {} @@ -251,7 +251,7 @@ class SessionManager(QObject): win_data['active'] = True win_data['geometry'] = bytes(main_window.saveGeometry()) win_data['tabs'] = [] - if tabbed_browser.private: + if tabbed_browser.is_private: win_data['private'] = True for i, tab in enumerate(tabbed_browser.widgets()): active = i == tabbed_browser.widget.currentIndex() From 5f5f20209833dfcbbd2d09bc5ae378956863d7a8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 17:59:27 +0100 Subject: [PATCH 181/492] Move private tab API into an own object --- qutebrowser/browser/browsertab.py | 116 ++++++++++-------- qutebrowser/browser/commands.py | 4 +- qutebrowser/browser/hints.py | 2 +- qutebrowser/browser/mouse.py | 2 +- qutebrowser/browser/webengine/webenginetab.py | 44 ++++--- qutebrowser/browser/webkit/webkittab.py | 45 ++++--- qutebrowser/mainwindow/tabbedbrowser.py | 2 +- tests/helpers/stubs.py | 10 +- 8 files changed, 127 insertions(+), 98 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index ab186e56a..86cca09f1 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -734,6 +734,67 @@ class AbstractAudio(QObject): raise NotImplementedError +class AbstractTabPrivate: + + """Tab-related methods which are only needed in the core. + + Those methods are not part of the API which is exposed to extensions, and + should ideally be removed at some point in the future. + """ + + def __init__(self, mode_manager: modeman.ModeManager, + tab: 'AbstractTab') -> None: + self._widget = None # type: typing.Optional[QWidget] + self._tab = tab + self._mode_manager = mode_manager + + def event_target(self) -> QWidget: + """Return the widget events should be sent to.""" + raise NotImplementedError + + def handle_auto_insert_mode(self, ok: bool) -> None: + """Handle `input.insert_mode.auto_load` after loading finished.""" + if not config.val.input.insert_mode.auto_load or not ok: + return + + cur_mode = self._mode_manager.mode + if cur_mode == usertypes.KeyMode.insert: + return + + def _auto_insert_mode_cb(elem: webelem.AbstractWebElement) -> None: + """Called from JS after finding the focused element.""" + if elem is None: + log.webview.debug("No focused element!") + return + if elem.is_editable(): + modeman.enter(self._tab.win_id, usertypes.KeyMode.insert, + 'load finished', only_if_normal=True) + + self._tab.elements.find_focused(_auto_insert_mode_cb) + + def clear_ssl_errors(self) -> None: + raise NotImplementedError + + def networkaccessmanager(self) -> typing.Optional[QNetworkAccessManager]: + """Get the QNetworkAccessManager for this tab. + + This is only implemented for QtWebKit. + For QtWebEngine, always returns None. + """ + raise NotImplementedError + + def user_agent(self) -> typing.Optional[str]: + """Get the user agent for this tab. + + This is only implemented for QtWebKit. + For QtWebEngine, always returns None. + """ + raise NotImplementedError + + def shutdown(self) -> None: + raise NotImplementedError + + class AbstractTab(QWidget): """A wrapper over the given widget to hide its API and expose another one. @@ -785,10 +846,7 @@ class AbstractTab(QWidget): renderer_process_terminated = pyqtSignal(TerminationStatus, int) predicted_navigation = pyqtSignal(QUrl) - def __init__(self, *, - win_id: int, - mode_manager: modeman.ModeManager, - private: bool, + def __init__(self, *, win_id: int, private: bool, parent: QWidget = None) -> None: self.is_private = private self.win_id = win_id @@ -806,7 +864,6 @@ class AbstractTab(QWidget): self._widget = None # type: typing.Optional[QWidget] self._progress = 0 self._has_ssl_errors = False - self._mode_manager = mode_manager self._load_status = usertypes.LoadStatus.none self._mouse_event_filter = mouse.MouseEventFilter( self, parent=self) @@ -833,6 +890,7 @@ class AbstractTab(QWidget): self.action._widget = widget self.elements._widget = widget self.audio._widget = widget + self.private_api._widget = widget self.settings._settings = widget.settings() self._install_event_filter() @@ -849,10 +907,6 @@ class AbstractTab(QWidget): self._load_status = val self.load_status_changed.emit(val.name) - def event_target(self) -> QWidget: - """Return the widget events should be sent to.""" - raise NotImplementedError - def send_event(self, evt: QEvent) -> None: """Send the given event to the underlying widget. @@ -865,7 +919,7 @@ class AbstractTab(QWidget): raise utils.Unreachable("Can't re-use an event which was already " "posted!") - recipient = self.event_target() + recipient = self.private_api.event_target() if recipient is None: # https://github.com/qutebrowser/qutebrowser/issues/3888 log.webview.warning("Unable to find event target!") @@ -925,26 +979,6 @@ class AbstractTab(QWidget): navigation.url.errorString())) navigation.accepted = False - def handle_auto_insert_mode(self, ok: bool) -> None: - """Handle `input.insert_mode.auto_load` after loading finished.""" - if not config.val.input.insert_mode.auto_load or not ok: - return - - cur_mode = self._mode_manager.mode - if cur_mode == usertypes.KeyMode.insert: - return - - def _auto_insert_mode_cb(elem: webelem.AbstractWebElement) -> None: - """Called from JS after finding the focused element.""" - if elem is None: - log.webview.debug("No focused element!") - return - if elem.is_editable(): - modeman.enter(self.win_id, usertypes.KeyMode.insert, - 'load finished', only_if_normal=True) - - self.elements.find_focused(_auto_insert_mode_cb) - @pyqtSlot(bool) def _on_load_finished(self, ok: bool) -> None: assert self._widget is not None @@ -1010,9 +1044,6 @@ class AbstractTab(QWidget): def stop(self) -> None: raise NotImplementedError - def clear_ssl_errors(self) -> None: - raise NotImplementedError - def key_press(self, key: Qt.Key, modifier: Qt.KeyboardModifier = Qt.NoModifier) -> None: @@ -1048,9 +1079,6 @@ class AbstractTab(QWidget): """ raise NotImplementedError - def shutdown(self) -> None: - raise NotImplementedError - def title(self) -> str: raise NotImplementedError @@ -1060,22 +1088,6 @@ class AbstractTab(QWidget): def set_html(self, html: str, base_url: QUrl = QUrl()) -> None: raise NotImplementedError - def networkaccessmanager(self) -> typing.Optional[QNetworkAccessManager]: - """Get the QNetworkAccessManager for this tab. - - This is only implemented for QtWebKit. - For QtWebEngine, always returns None. - """ - raise NotImplementedError - - def user_agent(self) -> typing.Optional[str]: - """Get the user agent for this tab. - - This is only implemented for QtWebKit. - For QtWebEngine, always returns None. - """ - raise NotImplementedError - def __repr__(self) -> str: try: qurl = self.url() diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 2b4165364..1a69ef137 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1516,7 +1516,7 @@ class CommandDispatcher: else: download_manager.get_mhtml(tab, target) else: - qnam = tab.networkaccessmanager() + qnam = tab.private_api.networkaccessmanager() suggested_fn = downloads.suggested_fn_from_title( self._current_url().path(), tab.title() @@ -2165,7 +2165,7 @@ class CommandDispatcher: debug=True, backend=usertypes.Backend.QtWebKit) def debug_clear_ssl_errors(self): """Clear remembered SSL error answers.""" - self._current_widget().clear_ssl_errors() + self._current_widget().private_api.clear_ssl_errors() @cmdutils.register(instance='command-dispatcher', scope='window') def edit_url(self, url=None, bg=False, tab=False, window=False, diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index aa5b5f34c..0374c7f1f 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -304,7 +304,7 @@ class HintActions: raise HintingError("No suitable link found for this element.") prompt = False if context.rapid else None - qnam = context.tab.networkaccessmanager() + qnam = context.tab.private_api.networkaccessmanager() user_agent = context.tab.user_agent() # FIXME:qtwebengine do this with QtWebEngine downloads? diff --git a/qutebrowser/browser/mouse.py b/qutebrowser/browser/mouse.py index 7c405a57e..a73f28203 100644 --- a/qutebrowser/browser/mouse.py +++ b/qutebrowser/browser/mouse.py @@ -240,7 +240,7 @@ class MouseEventFilter(QObject): evtype = event.type() if evtype not in self._handlers: return False - if obj is not self._tab.event_target(): + if obj is not self._tab.private_api.event_target(): log.mouse.debug("Ignoring {} to {}".format( event.__class__.__name__, obj)) return False diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 47bacd60e..63f1201da 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1038,6 +1038,28 @@ class _WebEngineScripts(QObject): page_scripts.insert(new_script) +class WebEngineTabPrivate(browsertab.AbstractTabPrivate): + + """QtWebEngine-related methods which aren't part of the public API.""" + + def networkaccessmanager(self): + return None + + def user_agent(self): + return None + + def clear_ssl_errors(self): + raise browsertab.UnsupportedOperationError + + def event_target(self): + return self._widget.render_widget() + + def shutdown(self): + self._tab.shutting_down.emit() + self._tab.action.exit_fullscreen() + self._widget.shutdown() + + class WebEngineTab(browsertab.AbstractTab): """A QtWebEngine tab in the browser. @@ -1051,8 +1073,7 @@ class WebEngineTab(browsertab.AbstractTab): _load_finished_fake = pyqtSignal(bool) def __init__(self, *, win_id, mode_manager, private, parent=None): - super().__init__(win_id=win_id, mode_manager=mode_manager, - private=private, parent=parent) + super().__init__(win_id=win_id, private=private, parent=parent) widget = webview.WebEngineView(tabdata=self.data, win_id=win_id, private=private) self.history = WebEngineHistory(tab=self) @@ -1065,6 +1086,8 @@ class WebEngineTab(browsertab.AbstractTab): self.elements = WebEngineElements(tab=self) self.action = WebEngineAction(tab=self) self.audio = WebEngineAudio(tab=self, parent=self) + self.private_api = WebEngineTabPrivate(mode_manager=mode_manager, + tab=self) self._permissions = _WebEnginePermissions(tab=self, parent=self) self._scripts = _WebEngineScripts(tab=self, parent=self) # We're assigning settings in _set_widget @@ -1146,11 +1169,6 @@ class WebEngineTab(browsertab.AbstractTab): else: self._widget.page().runJavaScript(code, world_id, callback) - def shutdown(self): - self.shutting_down.emit() - self.action.exit_fullscreen() - self._widget.shutdown() - def reload(self, *, force=False): if force: action = QWebEnginePage.ReloadAndBypassCache @@ -1175,15 +1193,6 @@ class WebEngineTab(browsertab.AbstractTab): # percent encoded content is 2 megabytes minus 30 bytes. self._widget.setHtml(html, base_url) - def networkaccessmanager(self): - return None - - def user_agent(self): - return None - - def clear_ssl_errors(self): - raise browsertab.UnsupportedOperationError - def key_press(self, key, modifier=Qt.NoModifier): press_evt = QKeyEvent(QEvent.KeyPress, key, modifier, 0, 0, 0) release_evt = QKeyEvent(QEvent.KeyRelease, key, modifier, @@ -1485,6 +1494,3 @@ class WebEngineTab(browsertab.AbstractTab): self.audio._connect_signals() self._permissions.connect_signals() self._scripts.connect_signals() - - def event_target(self): - return self._widget.render_widget() diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 51e3f385e..dcac1a3cb 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -657,13 +657,33 @@ class WebKitAudio(browsertab.AbstractAudio): return False +class WebKitTabPrivate(browsertab.AbstractTabPrivate): + + """QtWebKit-related methods which aren't part of the public API.""" + + def networkaccessmanager(self): + return self._widget.page().networkAccessManager() + + def user_agent(self): + page = self._widget.page() + return page.userAgentForUrl(self._tab.url()) + + def clear_ssl_errors(self): + self.networkaccessmanager().clear_all_ssl_errors() + + def event_target(self): + return self._widget + + def shutdown(self): + self._widget.shutdown() + + class WebKitTab(browsertab.AbstractTab): """A QtWebKit tab in the browser.""" def __init__(self, *, win_id, mode_manager, private, parent=None): - super().__init__(win_id=win_id, mode_manager=mode_manager, - private=private, parent=parent) + super().__init__(win_id=win_id, private=private, parent=parent) widget = webview.WebView(win_id=win_id, tab_id=self.tab_id, private=private, tab=self) if private: @@ -678,6 +698,8 @@ class WebKitTab(browsertab.AbstractTab): self.elements = WebKitElements(tab=self) self.action = WebKitAction(tab=self) self.audio = WebKitAudio(tab=self, parent=self) + self.private_api = WebKitTabPrivate(mode_manager=mode_manager, + tab=self) # We're assigning settings in _set_widget self.settings = webkitsettings.WebKitSettings(settings=None) self._set_widget(widget) @@ -720,9 +742,6 @@ class WebKitTab(browsertab.AbstractTab): def icon(self): return self._widget.icon() - def shutdown(self): - self._widget.shutdown() - def reload(self, *, force=False): if force: action = QWebPage.ReloadAndBypassCache @@ -736,9 +755,6 @@ class WebKitTab(browsertab.AbstractTab): def title(self): return self._widget.title() - def clear_ssl_errors(self): - self.networkaccessmanager().clear_all_ssl_errors() - def key_press(self, key, modifier=Qt.NoModifier): press_evt = QKeyEvent(QEvent.KeyPress, key, modifier, 0, 0, 0) release_evt = QKeyEvent(QEvent.KeyRelease, key, modifier, @@ -755,17 +771,11 @@ class WebKitTab(browsertab.AbstractTab): def set_html(self, html, base_url=QUrl()): self._widget.setHtml(html, base_url) - def networkaccessmanager(self): - return self._widget.page().networkAccessManager() - - def user_agent(self): - page = self._widget.page() - return page.userAgentForUrl(self.url()) - @pyqtSlot() def _on_load_started(self): super()._on_load_started() - self.networkaccessmanager().netrc_used = False + nam = self._widget.page().networkAccessManager() + nam.netrc_used = False # Make sure the icon is cleared when navigating to a page without one. self.icon_changed.emit(QIcon()) @@ -847,6 +857,3 @@ class WebKitTab(browsertab.AbstractTab): frame.contentsSizeChanged.connect(self._on_contents_size_changed) frame.initialLayoutCompleted.connect(self._on_history_trigger) page.navigation_request.connect(self._on_navigation_request) - - def event_target(self): - return self._widget diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 15b8f2c7b..28f911aa9 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -753,7 +753,7 @@ class TabbedBrowser(QWidget): self.widget.update_tab_title(idx) if idx == self.widget.currentIndex(): self._update_window_title() - tab.handle_auto_insert_mode(ok) + tab.private_api.handle_auto_insert_mode(ok) @pyqtSlot() def on_scroll_pos_changed(self): diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index e050e1fb5..6475e21d8 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -241,6 +241,12 @@ class FakeWebTabAudio(browsertab.AbstractAudio): return False +class FakeWebTabPrivate: + + def shutdown(self): + pass + + class FakeWebTab(browsertab.AbstractTab): """Fake AbstractTab to use in tests.""" @@ -258,6 +264,7 @@ class FakeWebTab(browsertab.AbstractTab): can_go_forward=can_go_forward) self.scroller = FakeWebTabScroller(self, scroll_pos_perc) self.audio = FakeWebTabAudio(self) + self.private_api = FakeWebTabPrivate() wrapped = QWidget() self._layout.wrap(self, wrapped) @@ -274,9 +281,6 @@ class FakeWebTab(browsertab.AbstractTab): def load_status(self): return self._load_status - def shutdown(self): - pass - def icon(self): return QIcon() From 89650d89f1af0d1a7d783d3f3396c106bb699d11 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 18:01:04 +0100 Subject: [PATCH 182/492] Fix lint --- misc/requirements/requirements-optional.txt | 2 +- qutebrowser/browser/browsertab.py | 3 ++- qutebrowser/browser/webkit/network/networkmanager.py | 7 ++++++- qutebrowser/misc/sessions.py | 2 -- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/misc/requirements/requirements-optional.txt b/misc/requirements/requirements-optional.txt index 6e1e8b8ff..8f1e2498a 100644 --- a/misc/requirements/requirements-optional.txt +++ b/misc/requirements/requirements-optional.txt @@ -1,6 +1,6 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py -colorama==0.4.0 +colorama==0.4.1 cssutils==1.0.2 hunter==2.1.0 Pympler==0.6 diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 86cca09f1..1ced63fab 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -44,7 +44,8 @@ from qutebrowser.browser import mouse, hints, webelem from qutebrowser.qt import sip MYPY = False if MYPY: - # pylint: disable=unused-import + # pylint can't interpret type comments with Python 3.7 + # pylint: disable=unused-import,useless-suppression from qutebrowser.browser.inspector import AbstractWebInspector diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py index 0c3148ee4..2ca1ae0d9 100644 --- a/qutebrowser/browser/webkit/network/networkmanager.py +++ b/qutebrowser/browser/webkit/network/networkmanager.py @@ -29,7 +29,12 @@ from PyQt5.QtCore import (pyqtSlot, pyqtSignal, QCoreApplication, QUrl, from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply, QSslSocket from qutebrowser.config import config -from qutebrowser.mainwindow import prompt # pylint: disable=unused-import + +MYPY = False +if MYPY: + # pylint can't interpret type comments with Python 3.7 + # pylint: disable=unused-import,useless-suppression + from qutebrowser.mainwindow import prompt from qutebrowser.utils import (message, log, usertypes, utils, objreg, urlutils, debug) from qutebrowser.browser import shared diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index 5f50bf5d1..459011e0f 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -42,8 +42,6 @@ class Sentinel: """Sentinel value for default argument.""" - pass - default = Sentinel() From 1d4729c7f735b2e50da353417ac0d18a35524638 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 19:56:52 +0100 Subject: [PATCH 183/492] Fix shutdown call --- qutebrowser/mainwindow/tabbedbrowser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 28f911aa9..d00d5d797 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -356,7 +356,7 @@ class TabbedBrowser(QWidget): else: self._undo_stack[-1].append(entry) - tab.shutdown() + tab.private_api.shutdown() self.widget.removeTab(idx) if not crashed: # WORKAROUND for a segfault when we delete the crashed tab. From ee2461a6fe4956d0e9e9b5091e22767287b2f8d5 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 21:57:01 +0100 Subject: [PATCH 184/492] Fix accessing user_agent() --- qutebrowser/browser/commands.py | 2 +- qutebrowser/browser/hints.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 1a69ef137..53efcfdf2 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1495,7 +1495,7 @@ class CommandDispatcher: target = downloads.FileDownloadTarget(dest) tab = self._current_widget() - user_agent = tab.user_agent() + user_agent = tab.private_api.user_agent() if url: if mhtml_: diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 0374c7f1f..730128295 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -305,7 +305,7 @@ class HintActions: prompt = False if context.rapid else None qnam = context.tab.private_api.networkaccessmanager() - user_agent = context.tab.user_agent() + user_agent = context.tab.private_api.user_agent() # FIXME:qtwebengine do this with QtWebEngine downloads? download_manager = objreg.get('qtnetwork-download-manager') From cbf55e1ef91d164391a992b0427eda649257ed02 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 28 Nov 2018 22:19:07 +0100 Subject: [PATCH 185/492] Fix remaining private_api refactoring issues --- tests/helpers/stubs.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 6475e21d8..ed6fce36c 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -241,7 +241,7 @@ class FakeWebTabAudio(browsertab.AbstractAudio): return False -class FakeWebTabPrivate: +class FakeWebTabPrivate(browsertab.AbstractTabPrivate): def shutdown(self): pass @@ -255,7 +255,7 @@ class FakeWebTab(browsertab.AbstractTab): scroll_pos_perc=(0, 0), load_status=usertypes.LoadStatus.success, progress=0, can_go_back=None, can_go_forward=None): - super().__init__(win_id=0, mode_manager=None, private=False) + super().__init__(win_id=0, private=False) self._load_status = load_status self._title = title self._url = url @@ -264,7 +264,7 @@ class FakeWebTab(browsertab.AbstractTab): can_go_forward=can_go_forward) self.scroller = FakeWebTabScroller(self, scroll_pos_perc) self.audio = FakeWebTabAudio(self) - self.private_api = FakeWebTabPrivate() + self.private_api = FakeWebTabPrivate(tab=self, mode_manager=None) wrapped = QWidget() self._layout.wrap(self, wrapped) From a7a1cc7c137c3bcafee53332ea8a70e5ac4bed1d Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 00:49:22 -0600 Subject: [PATCH 186/492] Update doc/help/configuring.asciidoc Co-Authored-By: winny- --- doc/help/configuring.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/help/configuring.asciidoc b/doc/help/configuring.asciidoc index 9e6f2a3c7..9023d1dc3 100644 --- a/doc/help/configuring.asciidoc +++ b/doc/help/configuring.asciidoc @@ -229,7 +229,7 @@ Loading `autoconfig.yml` ~~~~~~~~~~~~~~~~~~~~~~~~ All customization done via the UI (`:set`, `:bind` and `:unbind`) is -stored in file `autoconfig.yml`. When file `config.py` exists, `autoconfig.yml` +stored in the `autoconfig.yml` file. When a `config.py` file exists, `autoconfig.yml` is not loaded automatically. To load `autoconfig.yml` automatically, add the following snippet to `config.py`: From 13532aca18534023b77975b1fcbed56f89ae39be Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 00:49:32 -0600 Subject: [PATCH 187/492] Update doc/help/configuring.asciidoc Co-Authored-By: winny- --- doc/help/configuring.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/help/configuring.asciidoc b/doc/help/configuring.asciidoc index 9023d1dc3..33711b755 100644 --- a/doc/help/configuring.asciidoc +++ b/doc/help/configuring.asciidoc @@ -19,7 +19,7 @@ hand, you can simply use those - see <> for details. For more advanced configuration, you can write a `config.py` file - see -<>. When `config.py` +<>. When a `config.py` exists, the `autoconfig.yml` file **is not read anymore** by default. You need to <> if you want settings changed via `:set`/`:bind` to persist between restarts. From 31a122e97be807fa954920eaec38f826f8a74c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Wi=C3=9Fmann?= Date: Wed, 21 Nov 2018 17:27:32 +0100 Subject: [PATCH 188/492] Encode slashes in search terms for searchengines If a search term contains a slash, this should be encoded. While this makes no differences for search engines of the form http://example.org?q={} it does for engines like these: http://example.org/search/{} For a real world example, try: https://www.doi2bib.org/bib/{} --- qutebrowser/utils/urlutils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 4dda6b3fc..6687b9834 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -116,7 +116,7 @@ def _get_search_url(txt): if engine is None: engine = 'DEFAULT' template = config.val.url.searchengines[engine] - url = qurl_from_user_input(template.format(urllib.parse.quote(term))) + url = qurl_from_user_input(template.format(urllib.parse.quote(term, safe=''))) if config.val.url.open_base_url and term in config.val.url.searchengines: url = qurl_from_user_input(config.val.url.searchengines[term]) From 65c51931c77a609a61147e7b8854ecfb523f9ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Wi=C3=9Fmann?= Date: Thu, 22 Nov 2018 12:49:03 +0100 Subject: [PATCH 189/492] Wrap url quoting into new line --- qutebrowser/utils/urlutils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 6687b9834..00cf4d01a 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -116,7 +116,8 @@ def _get_search_url(txt): if engine is None: engine = 'DEFAULT' template = config.val.url.searchengines[engine] - url = qurl_from_user_input(template.format(urllib.parse.quote(term, safe=''))) + quoted_term = urllib.parse.quote(term, safe='') + url = qurl_from_user_input(template.format(quoted_term)) if config.val.url.open_base_url and term in config.val.url.searchengines: url = qurl_from_user_input(config.val.url.searchengines[term]) From 9d069ea12b409f5a24a62d76973989c8bdf43d1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Wi=C3=9Fmann?= Date: Thu, 22 Nov 2018 13:31:39 +0100 Subject: [PATCH 190/492] Encode slashes in default search engine test --- tests/end2end/features/yankpaste.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/end2end/features/yankpaste.feature b/tests/end2end/features/yankpaste.feature index 806bbd2d2..08a62d302 100644 --- a/tests/end2end/features/yankpaste.feature +++ b/tests/end2end/features/yankpaste.feature @@ -187,10 +187,10 @@ Feature: Yanking and pasting. http://qutebrowser.org should not open And I run :open -t {clipboard} - And I wait until data/hello.txt?q=this%20url%3A%0Ahttp%3A//qutebrowser.org%0Ashould%20not%20open is loaded + And I wait until data/hello.txt?q=this%20url%3A%0Ahttp%3A%2F%2Fqutebrowser.org%0Ashould%20not%20open is loaded Then the following tabs should be open: - about:blank - - data/hello.txt?q=this%20url%3A%0Ahttp%3A//qutebrowser.org%0Ashould%20not%20open (active) + - data/hello.txt?q=this%20url%3A%0Ahttp%3A%2F%2Fqutebrowser.org%0Ashould%20not%20open (active) Scenario: Pasting multiline whose first line looks like a URI When I set url.auto_search to naive From 351b6c9b45366b609c861762e5c27623d486063e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 08:28:35 +0100 Subject: [PATCH 191/492] Add unit test for slashes in search terms --- tests/unit/utils/test_urlutils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index e77d33783..26b063456 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -97,6 +97,7 @@ def init_config(config_stub): config_stub.val.url.searchengines = { 'test': 'http://www.qutebrowser.org/?q={}', 'test-with-dash': 'http://www.example.org/?q={}', + 'path-search': 'http://www.example.org/{}', 'DEFAULT': 'http://www.example.com/?q={}', } @@ -288,6 +289,7 @@ def test_special_urls(url, special): ('blub testfoo', 'www.example.com', 'q=blub testfoo'), ('stripped ', 'www.example.com', 'q=stripped'), ('test-with-dash testfoo', 'www.example.org', 'q=testfoo'), + ('test/with/slashes', 'www.example.com', 'q=test%2Fwith%2Fslashes'), ]) def test_get_search_url(config_stub, url, host, query, open_base_url): """Test _get_search_url(). From c3477b0468451248057cbfc8afd2850ce8de22fd Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 08:29:11 +0100 Subject: [PATCH 192/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 51647bafd..e4da4de4c 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -67,6 +67,7 @@ Fixed to be in line with what other browsers do. - `:navigate` not incrementing in anchors or queries or anchors. - Crash when trying to use a proxy requiring authentication with QtWebKit. +- Slashes in search terms are now percent-escaped. v1.5.2 ------ From 4caa2e056b8f9330e9af1d487cabc8b9d92a9f71 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 11:08:24 +0100 Subject: [PATCH 193/492] Add type annotations to misc.objects --- qutebrowser/misc/objects.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/qutebrowser/misc/objects.py b/qutebrowser/misc/objects.py index d6c116eab..ec558aa37 100644 --- a/qutebrowser/misc/objects.py +++ b/qutebrowser/misc/objects.py @@ -22,14 +22,20 @@ # NOTE: We need to be careful with imports here, as this is imported from # earlyinit. +import typing + +MYPY = False +if MYPY: + # pylint: disable=unused-import,useless-suppression + from qutebrowser.utils import usertypes + class NoBackend: """Special object when there's no backend set so we notice that.""" - def __eq__(self, other): + def __eq__(self, other: typing.Any) -> bool: raise AssertionError("No backend set!") -# A usertypes.Backend member -backend = NoBackend() +backend = NoBackend() # type: typing.Union[usertypes.Backend, NoBackend] From 168bc3dc494c75ed540b2c1eb3b5306b682481bb Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 11:09:04 +0100 Subject: [PATCH 194/492] Be stricter in mypy.ini --- mypy.ini | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mypy.ini b/mypy.ini index 94d5dff40..84a6fb239 100644 --- a/mypy.ini +++ b/mypy.ini @@ -52,3 +52,8 @@ disallow_subclassing_any = False [mypy-qutebrowser.browser.browsertab] disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.misc.objects] +disallow_untyped_defs = True +disallow_incomplete_defs = True From 19628d0ae99bb738ed4dbe1dea42f6ac95f9e301 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 11:21:07 +0100 Subject: [PATCH 195/492] Move cmdutils.cmd_dict to objects.commands --- qutebrowser/browser/commands.py | 4 +- qutebrowser/commands/cmdutils.py | 9 ++--- qutebrowser/commands/runners.py | 8 ++-- qutebrowser/completion/completer.py | 7 ++-- qutebrowser/completion/models/util.py | 6 +-- qutebrowser/config/configtypes.py | 4 +- qutebrowser/misc/keyhintwidget.py | 4 +- qutebrowser/misc/objects.py | 2 + scripts/dev/run_vulture.py | 4 +- scripts/dev/src2asciidoc.py | 5 ++- tests/helpers/stubs.py | 8 ---- tests/unit/commands/test_cmdutils.py | 52 ++++++++++++------------- tests/unit/commands/test_runners.py | 5 ++- tests/unit/completion/test_completer.py | 6 +-- tests/unit/completion/test_models.py | 4 +- tests/unit/config/test_configtypes.py | 9 +++-- tests/unit/misc/test_keyhints.py | 3 +- 17 files changed, 69 insertions(+), 71 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 53efcfdf2..e9d6b8b68 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -37,7 +37,7 @@ from qutebrowser.keyinput import modeman, keyutils from qutebrowser.utils import (message, usertypes, log, qtutils, urlutils, objreg, utils, standarddir) from qutebrowser.utils.usertypes import KeyMode -from qutebrowser.misc import editor, guiprocess +from qutebrowser.misc import editor, guiprocess, objects from qutebrowser.completion.models import urlmodel, miscmodels from qutebrowser.mainwindow import mainwindow @@ -1612,7 +1612,7 @@ class CommandDispatcher: path = 'index.html' elif topic.startswith(':'): command = topic[1:] - if command not in cmdutils.cmd_dict: + if command not in objects.commands: raise cmdexc.CommandError("Invalid command {}!".format( command)) path = 'commands.html#{}'.format(command) diff --git a/qutebrowser/commands/cmdutils.py b/qutebrowser/commands/cmdutils.py index 41e875202..12ffabe3a 100644 --- a/qutebrowser/commands/cmdutils.py +++ b/qutebrowser/commands/cmdutils.py @@ -22,11 +22,10 @@ import inspect import typing # pylint: disable=unused-import +from qutebrowser.misc import objects from qutebrowser.utils import qtutils, log from qutebrowser.commands import command, cmdexc -cmd_dict = {} # type: typing.Dict[str, command.Command] - def check_overflow(arg, ctype): """Check if the given argument is in bounds for the given type. @@ -89,7 +88,7 @@ class register: # noqa: N801,N806 pylint: disable=invalid-name Gets called when a function should be decorated. Doesn't actually decorate anything, but creates a Command object and - registers it in the cmd_dict. + registers it in the global commands dict. Args: func: The function to be decorated. @@ -104,11 +103,11 @@ class register: # noqa: N801,N806 pylint: disable=invalid-name name = self._name log.commands.vdebug("Registering command {} (from {}:{})".format( name, func.__module__, func.__qualname__)) - if name in cmd_dict: + if name in objects.commands: raise ValueError("{} is already registered!".format(name)) cmd = command.Command(name=name, instance=self._instance, handler=func, **self._kwargs) - cmd_dict[name] = cmd + objects.commands[name] = cmd return func diff --git a/qutebrowser/commands/runners.py b/qutebrowser/commands/runners.py index f1c7641e7..86b0cc3a2 100644 --- a/qutebrowser/commands/runners.py +++ b/qutebrowser/commands/runners.py @@ -26,9 +26,9 @@ import attr from PyQt5.QtCore import pyqtSlot, QUrl, QObject from qutebrowser.config import config -from qutebrowser.commands import cmdexc, cmdutils +from qutebrowser.commands import cmdexc from qutebrowser.utils import message, objreg, qtutils, usertypes, utils -from qutebrowser.misc import split +from qutebrowser.misc import split, objects last_command = {} @@ -193,7 +193,7 @@ class CommandParser: cmdstr = self._completion_match(cmdstr) try: - cmd = cmdutils.cmd_dict[cmdstr] + cmd = objects.commands[cmdstr] except KeyError: if not fallback: raise cmdexc.NoSuchCommandError( @@ -220,7 +220,7 @@ class CommandParser: Return: cmdstr modified to the matching completion or unmodified """ - matches = [cmd for cmd in sorted(cmdutils.cmd_dict, key=len) + matches = [cmd for cmd in sorted(objects.commands, key=len) if cmdstr in cmd] if len(matches) == 1: cmdstr = matches[0] diff --git a/qutebrowser/completion/completer.py b/qutebrowser/completion/completer.py index 4cbdc4724..ea64225d5 100644 --- a/qutebrowser/completion/completer.py +++ b/qutebrowser/completion/completer.py @@ -23,7 +23,8 @@ import attr from PyQt5.QtCore import pyqtSlot, QObject, QTimer from qutebrowser.config import config -from qutebrowser.commands import cmdutils, runners +from qutebrowser.commands import runners +from qutebrowser.misc import objects from qutebrowser.utils import log, utils, debug from qutebrowser.completion.models import miscmodels @@ -92,7 +93,7 @@ class Completer(QObject): log.completion.debug('Starting command completion') return miscmodels.command try: - cmd = cmdutils.cmd_dict[before_cursor[0]] + cmd = objects.commands[before_cursor[0]] except KeyError: log.completion.debug("No completion for unknown command: {}" .format(before_cursor[0])) @@ -170,7 +171,7 @@ class Completer(QObject): before, center, after = self._partition() log.completion.debug("Changing {} to '{}'".format(center, text)) try: - maxsplit = cmdutils.cmd_dict[before[0]].maxsplit + maxsplit = objects.commands[before[0]].maxsplit except (KeyError, IndexError): maxsplit = None if maxsplit is None: diff --git a/qutebrowser/completion/models/util.py b/qutebrowser/completion/models/util.py index c1b8b56f9..08f99eb6c 100644 --- a/qutebrowser/completion/models/util.py +++ b/qutebrowser/completion/models/util.py @@ -20,7 +20,7 @@ """Utility functions for completion models.""" from qutebrowser.utils import objreg, usertypes -from qutebrowser.commands import cmdutils +from qutebrowser.misc import objects def get_cmd_completions(info, include_hidden, include_aliases, prefix=''): @@ -34,10 +34,10 @@ def get_cmd_completions(info, include_hidden, include_aliases, prefix=''): Return: A list of tuples of form (name, description, bindings). """ - assert cmdutils.cmd_dict + assert objects.commands cmdlist = [] cmd_to_keys = info.keyconf.get_reverse_bindings_for('normal') - for obj in set(cmdutils.cmd_dict.values()): + for obj in set(objects.commands.values()): hide_debug = obj.debug and not objreg.get('args').debug hide_mode = (usertypes.KeyMode.normal not in obj.modes and not include_hidden) diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index 31eca988e..691584801 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -60,7 +60,7 @@ from PyQt5.QtCore import QUrl, Qt from PyQt5.QtGui import QColor, QFont from PyQt5.QtWidgets import QTabWidget, QTabBar -from qutebrowser.commands import cmdutils +from qutebrowser.misc import objects from qutebrowser.config import configexc, configutils from qutebrowser.utils import standarddir, utils, qtutils, urlutils, urlmatch from qutebrowser.keyinput import keyutils @@ -881,7 +881,7 @@ class Command(BaseType): def complete(self): out = [] - for cmdname, obj in cmdutils.cmd_dict.items(): + for cmdname, obj in objects.commands.items(): out.append((cmdname, obj.desc)) return out diff --git a/qutebrowser/misc/keyhintwidget.py b/qutebrowser/misc/keyhintwidget.py index e1de9a6cc..9d3f4c594 100644 --- a/qutebrowser/misc/keyhintwidget.py +++ b/qutebrowser/misc/keyhintwidget.py @@ -33,7 +33,7 @@ from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt from qutebrowser.config import config from qutebrowser.utils import utils, usertypes -from qutebrowser.commands import cmdutils +from qutebrowser.misc import objects from qutebrowser.keyinput import keyutils @@ -101,7 +101,7 @@ class KeyHintView(QLabel): def takes_count(cmdstr): """Return true iff this command can take a count argument.""" cmdname = cmdstr.split(' ')[0] - cmd = cmdutils.cmd_dict.get(cmdname) + cmd = objects.commands.get(cmdname) return cmd and cmd.takes_count() bindings_dict = config.key_instance.get_bindings_for(modename) diff --git a/qutebrowser/misc/objects.py b/qutebrowser/misc/objects.py index ec558aa37..0bb26954c 100644 --- a/qutebrowser/misc/objects.py +++ b/qutebrowser/misc/objects.py @@ -28,6 +28,7 @@ MYPY = False if MYPY: # pylint: disable=unused-import,useless-suppression from qutebrowser.utils import usertypes + from qutebrowser.commands import command class NoBackend: @@ -39,3 +40,4 @@ class NoBackend: backend = NoBackend() # type: typing.Union[usertypes.Backend, NoBackend] +commands = {} # type: typing.Dict[str, command.Command] diff --git a/scripts/dev/run_vulture.py b/scripts/dev/run_vulture.py index b5c083546..f3217694e 100755 --- a/scripts/dev/run_vulture.py +++ b/scripts/dev/run_vulture.py @@ -30,7 +30,7 @@ import argparse import vulture import qutebrowser.app # pylint: disable=unused-import -from qutebrowser.commands import cmdutils +from qutebrowser.misc import objects from qutebrowser.utils import utils from qutebrowser.browser.webkit import rfc6266 # To run the decorators from there @@ -44,7 +44,7 @@ from qutebrowser.config import configtypes def whitelist_generator(): # noqa """Generator which yields lines to add to a vulture whitelist.""" # qutebrowser commands - for cmd in cmdutils.cmd_dict.values(): + for cmd in objects.commands.values(): yield utils.qualname(cmd.handler) # pyPEG2 classes diff --git a/scripts/dev/src2asciidoc.py b/scripts/dev/src2asciidoc.py index 8c6f2e44d..ad1397d82 100755 --- a/scripts/dev/src2asciidoc.py +++ b/scripts/dev/src2asciidoc.py @@ -35,9 +35,10 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, # We import qutebrowser.app so all @cmdutils-register decorators are run. import qutebrowser.app from qutebrowser import qutebrowser, commands -from qutebrowser.commands import cmdutils, argparser +from qutebrowser.commands import argparser from qutebrowser.config import configdata, configtypes from qutebrowser.utils import docutils, usertypes +from qutebrowser.misc import objects from scripts import asciidoc2html, utils FILE_HEADER = """ @@ -350,7 +351,7 @@ def generate_commands(filename): normal_cmds = [] other_cmds = [] debug_cmds = [] - for name, cmd in cmdutils.cmd_dict.items(): + for name, cmd in objects.commands.items(): if cmd.deprecated: continue if usertypes.KeyMode.normal not in cmd.modes: diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index ed6fce36c..4abd58baf 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -326,14 +326,6 @@ class FakeSignal: """ -@attr.s -class FakeCmdUtils: - - """Stub for cmdutils which provides a cmd_dict.""" - - cmd_dict = attr.ib() - - @attr.s(frozen=True) class FakeCommand: diff --git a/tests/unit/commands/test_cmdutils.py b/tests/unit/commands/test_cmdutils.py index 718695874..4d7877e69 100644 --- a/tests/unit/commands/test_cmdutils.py +++ b/tests/unit/commands/test_cmdutils.py @@ -29,14 +29,14 @@ import enum import pytest -from qutebrowser.commands import cmdutils, cmdexc, argparser, command +from qutebrowser.misc import objects +from qutebrowser.commands import cmdexc, argparser, command, cmdutils from qutebrowser.utils import usertypes @pytest.fixture(autouse=True) def clear_globals(monkeypatch): - """Clear the cmdutils globals between each test.""" - monkeypatch.setattr(cmdutils, 'cmd_dict', {}) + monkeypatch.setattr(objects, 'commands', {}) def _get_cmd(*args, **kwargs): @@ -48,7 +48,7 @@ def _get_cmd(*args, **kwargs): @cmdutils.register(*args, **kwargs) def fun(): """Blah.""" - return cmdutils.cmd_dict['fun'] + return objects.commands['fun'] class TestCheckOverflow: @@ -83,10 +83,10 @@ class TestRegister: def fun(): """Blah.""" - cmd = cmdutils.cmd_dict['fun'] + cmd = objects.commands['fun'] assert cmd.handler is fun assert cmd.name == 'fun' - assert len(cmdutils.cmd_dict) == 1 + assert len(objects.commands) == 1 def test_underlines(self): """Make sure the function name is normalized correctly (_ -> -).""" @@ -94,8 +94,8 @@ class TestRegister: def eggs_bacon(): """Blah.""" - assert cmdutils.cmd_dict['eggs-bacon'].name == 'eggs-bacon' - assert 'eggs_bacon' not in cmdutils.cmd_dict + assert objects.commands['eggs-bacon'].name == 'eggs-bacon' + assert 'eggs_bacon' not in objects.commands def test_lowercasing(self): """Make sure the function name is normalized correctly (uppercase).""" @@ -103,8 +103,8 @@ class TestRegister: def Test(): # noqa: N801,N806 pylint: disable=invalid-name """Blah.""" - assert cmdutils.cmd_dict['test'].name == 'test' - assert 'Test' not in cmdutils.cmd_dict + assert objects.commands['test'].name == 'test' + assert 'Test' not in objects.commands def test_explicit_name(self): """Test register with explicit name.""" @@ -112,9 +112,9 @@ class TestRegister: def fun(): """Blah.""" - assert cmdutils.cmd_dict['foobar'].name == 'foobar' - assert 'fun' not in cmdutils.cmd_dict - assert len(cmdutils.cmd_dict) == 1 + assert objects.commands['foobar'].name == 'foobar' + assert 'fun' not in objects.commands + assert len(objects.commands) == 1 def test_multiple_registrations(self): """Make sure registering the same name twice raises ValueError.""" @@ -132,7 +132,7 @@ class TestRegister: @cmdutils.register(instance='foobar') def fun(self): """Blah.""" - assert cmdutils.cmd_dict['fun']._instance == 'foobar' + assert objects.commands['fun']._instance == 'foobar' def test_star_args(self): """Check handling of *args.""" @@ -140,7 +140,7 @@ class TestRegister: def fun(*args): """Blah.""" with pytest.raises(argparser.ArgumentParserError): - cmdutils.cmd_dict['fun'].parser.parse_args([]) + objects.commands['fun'].parser.parse_args([]) def test_star_args_optional(self): """Check handling of *args withstar_args_optional.""" @@ -148,7 +148,7 @@ class TestRegister: def fun(*args): """Blah.""" assert not args - cmd = cmdutils.cmd_dict['fun'] + cmd = objects.commands['fun'] cmd.namespace = cmd.parser.parse_args([]) args, kwargs = cmd._get_call_args(win_id=0) fun(*args, **kwargs) @@ -160,7 +160,7 @@ class TestRegister: def fun(arg=False): """Blah.""" assert arg == expected - cmd = cmdutils.cmd_dict['fun'] + cmd = objects.commands['fun'] cmd.namespace = cmd.parser.parse_args(inp) assert cmd.namespace.arg == expected @@ -170,7 +170,7 @@ class TestRegister: def fun(arg=False): """Blah.""" assert arg - cmd = cmdutils.cmd_dict['fun'] + cmd = objects.commands['fun'] with pytest.raises(argparser.ArgumentParserError): cmd.parser.parse_args(['-a']) @@ -192,14 +192,14 @@ class TestRegister: @cmdutils.argument('win_id', win_id=True) def fun(win_id): """Blah.""" - assert cmdutils.cmd_dict['fun']._get_call_args(42) == ([42], {}) + assert objects.commands['fun']._get_call_args(42) == ([42], {}) def test_count(self): @cmdutils.register() @cmdutils.argument('count', count=True) def fun(count=0): """Blah.""" - assert cmdutils.cmd_dict['fun']._get_call_args(42) == ([0], {}) + assert objects.commands['fun']._get_call_args(42) == ([0], {}) def test_count_without_default(self): with pytest.raises(TypeError, match="fun: handler has count parameter " @@ -216,7 +216,7 @@ class TestRegister: def fun(arg): """Blah.""" - pos_args = cmdutils.cmd_dict['fun'].pos_args + pos_args = objects.commands['fun'].pos_args if hide: assert pos_args == [] else: @@ -251,7 +251,7 @@ class TestRegister: """Blah.""" assert arg == expected - cmd = cmdutils.cmd_dict['fun'] + cmd = objects.commands['fun'] cmd.namespace = cmd.parser.parse_args([inp]) if expected is cmdexc.ArgumentTypeError: @@ -270,7 +270,7 @@ class TestRegister: def fun(arg): """Blah.""" - cmd = cmdutils.cmd_dict['fun'] + cmd = objects.commands['fun'] cmd.namespace = cmd.parser.parse_args(['fish']) with pytest.raises(cmdexc.ArgumentTypeError): @@ -283,7 +283,7 @@ class TestRegister: def fun(*, arg='foo'): """Blah.""" - cmd = cmdutils.cmd_dict['fun'] + cmd = objects.commands['fun'] cmd.namespace = cmd.parser.parse_args(['--arg=fish']) with pytest.raises(cmdexc.ArgumentTypeError): @@ -297,7 +297,7 @@ class TestRegister: def fun(foo, bar, opt=False): """Blah.""" - cmd = cmdutils.cmd_dict['fun'] + cmd = objects.commands['fun'] assert cmd.get_pos_arg_info(0) == command.ArgInfo(choices=('a', 'b')) assert cmd.get_pos_arg_info(1) == command.ArgInfo(choices=('x', 'y')) with pytest.raises(IndexError): @@ -422,6 +422,6 @@ class TestRun: monkeypatch.setattr(command.objects, 'backend', usertypes.Backend.QtWebKit) - cmd = cmdutils.cmd_dict['fun'] + cmd = objects.commands['fun'] with pytest.raises(cmdexc.PrerequisitesError, match=r'.* backend\.'): cmd.run(win_id=0) diff --git a/tests/unit/commands/test_runners.py b/tests/unit/commands/test_runners.py index db831bd7e..cd2dea1d4 100644 --- a/tests/unit/commands/test_runners.py +++ b/tests/unit/commands/test_runners.py @@ -21,7 +21,8 @@ import pytest -from qutebrowser.commands import runners, cmdexc, cmdutils +from qutebrowser.misc import objects +from qutebrowser.commands import runners, cmdexc class TestCommandParser: @@ -74,7 +75,7 @@ class TestCompletions: @pytest.fixture(autouse=True) def cmdutils_stub(self, monkeypatch, stubs): """Patch the cmdutils module to provide fake commands.""" - monkeypatch.setattr(cmdutils, 'cmd_dict', { + monkeypatch.setattr(objects, 'commands', { 'one': stubs.FakeCommand(name='one'), 'two': stubs.FakeCommand(name='two'), 'two-foo': stubs.FakeCommand(name='two-foo'), diff --git a/tests/unit/completion/test_completer.py b/tests/unit/completion/test_completer.py index 8620241e4..59291cdd6 100644 --- a/tests/unit/completion/test_completer.py +++ b/tests/unit/completion/test_completer.py @@ -129,7 +129,7 @@ def cmdutils_patch(monkeypatch, stubs, miscmodels_patch): def config_cycle(option, *values): """For testing varargs.""" - cmd_utils = stubs.FakeCmdUtils({ + commands = { 'set': command.Command(name='set', handler=set_command), 'help': command.Command(name='help', handler=show_help), 'open': command.Command(name='open', handler=openurl, maxsplit=0), @@ -137,8 +137,8 @@ def cmdutils_patch(monkeypatch, stubs, miscmodels_patch): 'tab-give': command.Command(name='tab-give', handler=tab_give), 'config-cycle': command.Command(name='config-cycle', handler=config_cycle), - }) - monkeypatch.setattr(completer, 'cmdutils', cmd_utils) + } + monkeypatch.setattr(completer.objects, 'commands', commands) def _set_cmd_prompt(cmd, txt): diff --git a/tests/unit/completion/test_models.py b/tests/unit/completion/test_models.py index 28265689c..9e75daae8 100644 --- a/tests/unit/completion/test_models.py +++ b/tests/unit/completion/test_models.py @@ -27,11 +27,11 @@ from datetime import datetime import pytest from PyQt5.QtCore import QUrl +from qutebrowser.misc import objects from qutebrowser.completion import completer from qutebrowser.completion.models import miscmodels, urlmodel, configmodel from qutebrowser.config import configdata, configtypes from qutebrowser.utils import usertypes -from qutebrowser.commands import cmdutils def _check_completions(model, expected): @@ -66,7 +66,7 @@ def _check_completions(model, expected): @pytest.fixture() def cmdutils_stub(monkeypatch, stubs): """Patch the cmdutils module to provide fake commands.""" - return monkeypatch.setattr(cmdutils, 'cmd_dict', { + return monkeypatch.setattr(objects, 'commands', { 'quit': stubs.FakeCommand(name='quit', desc='quit qutebrowser'), 'open': stubs.FakeCommand(name='open', desc='open a url'), 'prompt-yes': stubs.FakeCommand(name='prompt-yes', deprecated=True), diff --git a/tests/unit/config/test_configtypes.py b/tests/unit/config/test_configtypes.py index b2775de2f..a9a61e952 100644 --- a/tests/unit/config/test_configtypes.py +++ b/tests/unit/config/test_configtypes.py @@ -33,6 +33,7 @@ from PyQt5.QtCore import QUrl from PyQt5.QtGui import QColor, QFont from PyQt5.QtNetwork import QNetworkProxy +from qutebrowser.misc import objects from qutebrowser.config import configtypes, configexc, configutils from qutebrowser.utils import debug, utils, qtutils, urlmatch from qutebrowser.browser.network import pac @@ -1208,11 +1209,11 @@ class TestCommand: @pytest.fixture def patch_cmdutils(self, monkeypatch, stubs): """Patch the cmdutils module to provide fake commands.""" - cmd_utils = stubs.FakeCmdUtils({ + commands = { 'cmd1': stubs.FakeCommand(desc="desc 1"), - 'cmd2': stubs.FakeCommand(desc="desc 2")}) - monkeypatch.setattr(configtypes, 'cmdutils', cmd_utils) - monkeypatch.setattr('qutebrowser.commands.runners.cmdutils', cmd_utils) + 'cmd2': stubs.FakeCommand(desc="desc 2"), + } + monkeypatch.setattr(objects, 'commands', commands) @pytest.fixture def klass(self): diff --git a/tests/unit/misc/test_keyhints.py b/tests/unit/misc/test_keyhints.py index 7c9727b65..9af30fd16 100644 --- a/tests/unit/misc/test_keyhints.py +++ b/tests/unit/misc/test_keyhints.py @@ -21,6 +21,7 @@ import pytest +from qutebrowser.misc import objects from qutebrowser.misc.keyhintwidget import KeyHintView @@ -120,7 +121,7 @@ def test_suggestions_special(keyhint, config_stub): def test_suggestions_with_count(keyhint, config_stub, monkeypatch, stubs): """Test that a count prefix filters out commands that take no count.""" - monkeypatch.setattr('qutebrowser.commands.cmdutils.cmd_dict', { + monkeypatch.setattr(objects, 'commands', { 'foo': stubs.FakeCommand(name='foo', takes_count=lambda: False), 'bar': stubs.FakeCommand(name='bar', takes_count=lambda: True), }) From 7cbba4b3f19aa2a33df73103b45c9e898ac8badb Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 13:29:33 +0100 Subject: [PATCH 196/492] Add type annotations for cmdutils --- mypy.ini | 4 ++++ qutebrowser/commands/cmdutils.py | 31 +++++++++++++++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/mypy.ini b/mypy.ini index 84a6fb239..288cc6515 100644 --- a/mypy.ini +++ b/mypy.ini @@ -57,3 +57,7 @@ disallow_incomplete_defs = True [mypy-qutebrowser.misc.objects] disallow_untyped_defs = True disallow_incomplete_defs = True + +[mypy-qutebrowser.commands.cmdutils] +disallow_untyped_defs = True +disallow_incomplete_defs = True diff --git a/qutebrowser/commands/cmdutils.py b/qutebrowser/commands/cmdutils.py index 12ffabe3a..b9874c85b 100644 --- a/qutebrowser/commands/cmdutils.py +++ b/qutebrowser/commands/cmdutils.py @@ -20,14 +20,14 @@ """Contains various command utils and a global command dict.""" import inspect -import typing # pylint: disable=unused-import +import typing from qutebrowser.misc import objects from qutebrowser.utils import qtutils, log from qutebrowser.commands import command, cmdexc -def check_overflow(arg, ctype): +def check_overflow(arg: int, ctype: str) -> None: """Check if the given argument is in bounds for the given type. Args: @@ -42,7 +42,8 @@ def check_overflow(arg, ctype): "representation.".format(ctype)) -def check_exclusive(flags, names): +def check_exclusive(flags: typing.Iterable[bool], + names: typing.Iterable[str]) -> None: """Check if only one flag is set with exclusive flags. Raise a CommandError if not. @@ -70,7 +71,10 @@ class register: # noqa: N801,N806 pylint: disable=invalid-name _kwargs: The arguments to pass to Command. """ - def __init__(self, *, instance=None, name=None, **kwargs): + def __init__(self, *, + instance: str = None, + name: str = None, + **kwargs: typing.Any) -> None: """Save decorator arguments. Gets called on parse-time with the decorator arguments. @@ -82,7 +86,7 @@ class register: # noqa: N801,N806 pylint: disable=invalid-name self._name = name self._kwargs = kwargs - def __call__(self, func): + def __call__(self, func: typing.Callable) -> typing.Callable: """Register the command before running the function. Gets called when a function should be decorated. @@ -101,8 +105,9 @@ class register: # noqa: N801,N806 pylint: disable=invalid-name else: assert isinstance(self._name, str), self._name name = self._name - log.commands.vdebug("Registering command {} (from {}:{})".format( - name, func.__module__, func.__qualname__)) + log.commands.vdebug( # type: ignore + "Registering command {} (from {}:{})" + .format(name, func.__module__, func.__qualname__)) if name in objects.commands: raise ValueError("{} is already registered!".format(name)) cmd = command.Command(name=name, instance=self._instance, @@ -123,21 +128,23 @@ class argument: # noqa: N801,N806 pylint: disable=invalid-name _kwargs: Keyword arguments, valid ArgInfo members """ - def __init__(self, argname, **kwargs): + def __init__(self, argname: str, **kwargs: typing.Any) -> None: self._argname = argname self._kwargs = kwargs - def __call__(self, func): + def __call__(self, func: typing.Callable) -> typing.Callable: funcname = func.__name__ if self._argname not in inspect.signature(func).parameters: raise ValueError("{} has no argument {}!".format(funcname, self._argname)) if not hasattr(func, 'qute_args'): - func.qute_args = {} - elif func.qute_args is None: + func.qute_args = {} # type: ignore + elif func.qute_args is None: # type: ignore raise ValueError("@cmdutils.argument got called above (after) " "@cmdutils.register for {}!".format(funcname)) - func.qute_args[self._argname] = command.ArgInfo(**self._kwargs) + arginfo = command.ArgInfo(**self._kwargs) + func.qute_args[self._argname] = arginfo # type: ignore + return func From e576847b911e334c641757ff7cc87e0fb3f70a1b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 13:29:40 +0100 Subject: [PATCH 197/492] Add partial type annotations for qtutils --- qutebrowser/utils/qtutils.py | 68 ++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/qutebrowser/utils/qtutils.py b/qutebrowser/utils/qtutils.py index d2b7f2ffc..5373e76aa 100644 --- a/qutebrowser/utils/qtutils.py +++ b/qutebrowser/utils/qtutils.py @@ -31,11 +31,12 @@ Module attributes: import io import operator import contextlib +import typing # pylint: disable=unused-import,useless-suppression import pkg_resources from PyQt5.QtCore import (qVersion, QEventLoop, QDataStream, QByteArray, QIODevice, QSaveFile, QT_VERSION_STR, - PYQT_VERSION_STR) + PYQT_VERSION_STR, QFileDevice, QObject) try: from PyQt5.QtWebKit import qWebKitVersion except ImportError: # pragma: no cover @@ -61,19 +62,22 @@ class QtOSError(OSError): qt_errno: The error attribute of the given QFileDevice, if applicable. """ - def __init__(self, dev, msg=None): + def __init__(self, dev: QFileDevice, msg: str = None) -> None: if msg is None: msg = dev.errorString() super().__init__(msg) + self.qt_errno = None # type: typing.Optional[QFileDevice.FileError] try: self.qt_errno = dev.error() except AttributeError: - self.qt_errno = None + pass -def version_check(version, exact=False, compiled=True): +def version_check(version: str, + exact: bool = False, + compiled: bool = True) -> bool: """Check if the Qt runtime version is the version supplied or newer. Args: @@ -103,14 +107,14 @@ def version_check(version, exact=False, compiled=True): MAX_WORLD_ID = 256 if version_check('5.11.2') else 11 -def is_new_qtwebkit(): +def is_new_qtwebkit() -> bool: """Check if the given version is a new QtWebKit.""" assert qWebKitVersion is not None return (pkg_resources.parse_version(qWebKitVersion()) > pkg_resources.parse_version('538.1')) -def check_overflow(arg, ctype, fatal=True): +def check_overflow(arg: int, ctype: str, fatal: bool = True) -> int: """Check if the given argument is in bounds for the given type. Args: @@ -138,13 +142,13 @@ def check_overflow(arg, ctype, fatal=True): return arg -def ensure_valid(obj): +def ensure_valid(obj: QObject) -> None: """Ensure a Qt object with an .isValid() method is valid.""" if not obj.isValid(): raise QtValueError(obj) -def check_qdatastream(stream): +def check_qdatastream(stream: QDataStream) -> None: """Check the status of a QDataStream and raise OSError if it's not ok.""" status_to_str = { QDataStream.Ok: "The data stream is operating normally.", @@ -158,7 +162,7 @@ def check_qdatastream(stream): raise OSError(status_to_str[stream.status()]) -def serialize(obj): +def serialize(obj: QObject) -> QByteArray: """Serialize an object into a QByteArray.""" data = QByteArray() stream = QDataStream(data, QIODevice.WriteOnly) @@ -166,20 +170,20 @@ def serialize(obj): return data -def deserialize(data, obj): +def deserialize(data: QByteArray, obj: QObject) -> None: """Deserialize an object from a QByteArray.""" stream = QDataStream(data, QIODevice.ReadOnly) deserialize_stream(stream, obj) -def serialize_stream(stream, obj): +def serialize_stream(stream: QDataStream, obj: QObject) -> None: """Serialize an object into a QDataStream.""" check_qdatastream(stream) stream << obj # pylint: disable=pointless-statement check_qdatastream(stream) -def deserialize_stream(stream, obj): +def deserialize_stream(stream: QDataStream, obj: QObject) -> None: """Deserialize a QDataStream into an object.""" check_qdatastream(stream) stream >> obj # pylint: disable=pointless-statement @@ -195,11 +199,14 @@ def savefile_open(filename, binary=False, encoding='utf-8'): open_ok = f.open(QIODevice.WriteOnly) if not open_ok: raise QtOSError(f) + if binary: new_f = PyQIODevice(f) else: new_f = io.TextIOWrapper(PyQIODevice(f), encoding=encoding) + yield new_f + new_f.flush() except: f.cancelWriting() @@ -219,29 +226,29 @@ class PyQIODevice(io.BufferedIOBase): dev: The underlying QIODevice. """ - def __init__(self, dev): + def __init__(self, dev: QIODevice) -> None: super().__init__() self.dev = dev - def __len__(self): + def __len__(self) -> int: return self.dev.size() - def _check_open(self): + def _check_open(self) -> None: """Check if the device is open, raise ValueError if not.""" if not self.dev.isOpen(): raise ValueError("IO operation on closed device!") - def _check_random(self): + def _check_random(self) -> None: """Check if the device supports random access, raise OSError if not.""" if not self.seekable(): raise OSError("Random access not allowed!") - def _check_readable(self): + def _check_readable(self) -> None: """Check if the device is readable, raise OSError if not.""" if not self.dev.isReadable(): raise OSError("Trying to read unreadable file!") - def _check_writable(self): + def _check_writable(self) -> None: """Check if the device is writable, raise OSError if not.""" if not self.writable(): raise OSError("Trying to write to unwritable file!") @@ -263,7 +270,7 @@ class PyQIODevice(io.BufferedIOBase): raise QtOSError(self.dev) return contextlib.closing(self) - def close(self): + def close(self) -> None: """Close the underlying device.""" self.dev.close() @@ -289,18 +296,18 @@ class PyQIODevice(io.BufferedIOBase): raise io.UnsupportedOperation @property - def closed(self): + def closed(self) -> bool: return not self.dev.isOpen() - def flush(self): + def flush(self) -> None: self._check_open() self.dev.waitForBytesWritten(-1) - def isatty(self): + def isatty(self) -> bool: self._check_open() return False - def readable(self): + def readable(self) -> bool: return self.dev.isReadable() def readline(self, size=-1): @@ -326,18 +333,18 @@ class PyQIODevice(io.BufferedIOBase): raise QtOSError(self.dev) return buf - def seekable(self): + def seekable(self) -> bool: return not self.dev.isSequential() - def tell(self): + def tell(self) -> int: self._check_open() self._check_random() return self.dev.pos() - def writable(self): + def writable(self) -> bool: return self.dev.isWritable() - def write(self, b): + def write(self, b: bytes) -> int: self._check_open() self._check_writable() num = self.dev.write(b) @@ -361,7 +368,7 @@ class QtValueError(ValueError): """Exception which gets raised by ensure_valid.""" - def __init__(self, obj): + def __init__(self, obj: QObject) -> None: try: self.reason = obj.errorString() except AttributeError: @@ -379,7 +386,7 @@ class EventLoop(QEventLoop): Raises an exception when doing exec_() multiple times. """ - def __init__(self, parent=None): + def __init__(self, parent: QObject = None) -> None: super().__init__(parent) self._executing = False @@ -388,5 +395,6 @@ class EventLoop(QEventLoop): if self._executing: raise AssertionError("Eventloop is already running!") self._executing = True - super().exec_(flags) + status = super().exec_(flags) self._executing = False + return status From f9858733c1ba7d4500ad8b20bef281341dc12f12 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 13:32:20 +0100 Subject: [PATCH 198/492] Improve docstrings --- qutebrowser/commands/cmdutils.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/qutebrowser/commands/cmdutils.py b/qutebrowser/commands/cmdutils.py index b9874c85b..a30b7e799 100644 --- a/qutebrowser/commands/cmdutils.py +++ b/qutebrowser/commands/cmdutils.py @@ -17,7 +17,7 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -"""Contains various command utils and a global command dict.""" +"""Utilities for command handlers.""" import inspect import typing @@ -31,8 +31,8 @@ def check_overflow(arg: int, ctype: str) -> None: """Check if the given argument is in bounds for the given type. Args: - arg: The argument to check - ctype: The C/Qt type to check as a string. + arg: The argument to check. + ctype: The C++/Qt type to check as a string ('int'/'int64'). """ try: qtutils.check_overflow(arg, ctype) @@ -49,8 +49,8 @@ def check_exclusive(flags: typing.Iterable[bool], Raise a CommandError if not. Args: - flags: An iterable of booleans to check. - names: An iterable of flag names for the error message. + flags: The flag values to check. + names: A list of names (corresponding to the flags argument). """ if sum(1 for e in flags if e) > 1: argstr = '/'.join('-' + e for e in names) @@ -62,9 +62,6 @@ class register: # noqa: N801,N806 pylint: disable=invalid-name """Decorator to register a new command handler. - This could also be a function, but as a class (with a "wrong" name) it's - much cleaner to implement. - Attributes: _instance: The object from the object registry to be used as "self". _name: The name (as string) or names (as list) of the command. @@ -120,9 +117,6 @@ class argument: # noqa: N801,N806 pylint: disable=invalid-name """Decorator to customize an argument for @cmdutils.register. - This could also be a function, but as a class (with a "wrong" name) it's - much cleaner to implement. - Attributes: _argname: The name of the argument to handle. _kwargs: Keyword arguments, valid ArgInfo members From b7de287e7bf053072eab47551e593d948fa8ced7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 14:09:06 +0100 Subject: [PATCH 199/492] Move CommandError to api.cmdutils --- doc/contributing.asciidoc | 4 +- qutebrowser/api/__init__.py | 26 ++++ qutebrowser/{commands => api}/cmdutils.py | 25 +++- qutebrowser/app.py | 10 +- qutebrowser/browser/adblock.py | 2 +- qutebrowser/browser/commands.py | 141 +++++++++--------- qutebrowser/browser/downloads.py | 26 ++-- qutebrowser/browser/greasemonkey.py | 2 +- qutebrowser/browser/hints.py | 25 ++-- qutebrowser/browser/history.py | 5 +- qutebrowser/browser/urlmarks.py | 4 +- qutebrowser/commands/cmdexc.py | 5 - qutebrowser/commands/runners.py | 5 +- qutebrowser/completion/completionwidget.py | 10 +- .../completion/models/completionmodel.py | 4 +- qutebrowser/config/configcommands.py | 58 +++---- qutebrowser/keyinput/macros.py | 7 +- qutebrowser/keyinput/modeman.py | 6 +- qutebrowser/mainwindow/mainwindow.py | 3 +- qutebrowser/mainwindow/prompt.py | 4 +- qutebrowser/mainwindow/statusbar/command.py | 6 +- qutebrowser/misc/crashsignal.py | 2 +- qutebrowser/misc/readline.py | 2 +- qutebrowser/misc/savemanager.py | 2 +- qutebrowser/misc/sessions.py | 40 ++--- qutebrowser/misc/utilcmds.py | 33 ++-- qutebrowser/utils/urlutils.py | 4 +- scripts/dev/check_coverage.py | 4 +- tests/unit/{commands => api}/test_cmdutils.py | 9 +- tests/unit/browser/test_history.py | 4 +- tests/unit/completion/test_completer.py | 3 +- tests/unit/completion/test_completionmodel.py | 4 +- .../unit/completion/test_completionwidget.py | 4 +- tests/unit/config/test_configcommands.py | 50 +++---- tests/unit/misc/test_utilcmds.py | 8 +- tests/unit/utils/test_urlutils.py | 4 +- 36 files changed, 302 insertions(+), 249 deletions(-) create mode 100644 qutebrowser/api/__init__.py rename qutebrowser/{commands => api}/cmdutils.py (86%) rename tests/unit/{commands => api}/test_cmdutils.py (98%) diff --git a/doc/contributing.asciidoc b/doc/contributing.asciidoc index 1a2369516..5f0e9bf9c 100644 --- a/doc/contributing.asciidoc +++ b/doc/contributing.asciidoc @@ -407,7 +407,7 @@ Creating a new command is straightforward: [source,python] ---- -import qutebrowser.commands.cmdutils +from qutebrowser.api import cmdutils ... @@ -429,7 +429,7 @@ selects which object registry (global, per-tab, etc.) to use. See the There are also other arguments to customize the way the command is registered; see the class documentation for `register` in -`qutebrowser.commands.cmdutils` for details. +`qutebrowser.api.cmdutils` for details. The types of the function arguments are inferred based on their default values, e.g., an argument `foo=True` will be converted to a flag `-f`/`--foo` in diff --git a/qutebrowser/api/__init__.py b/qutebrowser/api/__init__.py new file mode 100644 index 000000000..648887005 --- /dev/null +++ b/qutebrowser/api/__init__.py @@ -0,0 +1,26 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""API for extensions. + +This API currently isn't exposed to third-party extensions yet, but will be in +the future. Thus, care must be taken when adding new APIs here. + +Code in qutebrowser.components only uses this API. +""" diff --git a/qutebrowser/commands/cmdutils.py b/qutebrowser/api/cmdutils.py similarity index 86% rename from qutebrowser/commands/cmdutils.py rename to qutebrowser/api/cmdutils.py index a30b7e799..a90471a35 100644 --- a/qutebrowser/commands/cmdutils.py +++ b/qutebrowser/api/cmdutils.py @@ -27,6 +27,23 @@ from qutebrowser.utils import qtutils, log from qutebrowser.commands import command, cmdexc +class CommandError(cmdexc.Error): + + """Raised when a command encounters an error while running. + + If your command handler encounters an error and cannot continue, raise this + exception with an appropriate error message: + + raise cmdexc.CommandError("Message") + + The message will then be shown in the qutebrowser status bar. + + Note that you should only raise this exception while a command handler is + run. Raising it at another point causes qutebrowser to crash due to an + unhandled exception. + """ + + def check_overflow(arg: int, ctype: str) -> None: """Check if the given argument is in bounds for the given type. @@ -37,9 +54,8 @@ def check_overflow(arg: int, ctype: str) -> None: try: qtutils.check_overflow(arg, ctype) except OverflowError: - raise cmdexc.CommandError( - "Numeric argument is too large for internal {} " - "representation.".format(ctype)) + raise CommandError("Numeric argument is too large for internal {} " + "representation.".format(ctype)) def check_exclusive(flags: typing.Iterable[bool], @@ -54,8 +70,7 @@ def check_exclusive(flags: typing.Iterable[bool], """ if sum(1 for e in flags if e) > 1: argstr = '/'.join('-' + e for e in names) - raise cmdexc.CommandError("Only one of {} can be given!".format( - argstr)) + raise CommandError("Only one of {} can be given!".format(argstr)) class register: # noqa: N801,N806 pylint: disable=invalid-name diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 161bc5297..27848c4c1 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -60,7 +60,8 @@ except ImportError: import qutebrowser import qutebrowser.resources from qutebrowser.completion.models import miscmodels -from qutebrowser.commands import cmdutils, runners, cmdexc +from qutebrowser.commands import runners +from qutebrowser.api import cmdutils from qutebrowser.config import config, websettings, configfiles, configinit from qutebrowser.browser import (urlmarks, adblock, history, browsertab, qtnetworkdownloads, downloads, greasemonkey) @@ -619,10 +620,11 @@ class Quitter: ok = self.restart(session='_restart') except sessions.SessionError as e: log.destroy.exception("Failed to save session!") - raise cmdexc.CommandError("Failed to save session: {}!".format(e)) + raise cmdutils.CommandError("Failed to save session: {}!" + .format(e)) except SyntaxError as e: log.destroy.exception("Got SyntaxError") - raise cmdexc.CommandError("SyntaxError in {}:{}: {}".format( + raise cmdutils.CommandError("SyntaxError in {}:{}: {}".format( e.filename, e.lineno, e)) if ok: self.shutdown(restart=True) @@ -684,7 +686,7 @@ class Quitter: session: The name of the session to save. """ if session is not None and not save: - raise cmdexc.CommandError("Session name given without --save!") + raise cmdutils.CommandError("Session name given without --save!") if save: if session is None: session = sessions.default diff --git a/qutebrowser/browser/adblock.py b/qutebrowser/browser/adblock.py index d2a21639c..fdec79d0f 100644 --- a/qutebrowser/browser/adblock.py +++ b/qutebrowser/browser/adblock.py @@ -28,7 +28,7 @@ import zipfile from qutebrowser.browser import downloads from qutebrowser.config import config from qutebrowser.utils import objreg, standarddir, log, message -from qutebrowser.commands import cmdutils +from qutebrowser.api import cmdutils def _guess_zip_filename(zf): diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index e9d6b8b68..df6906515 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -29,7 +29,8 @@ from PyQt5.QtWidgets import QApplication, QTabBar from PyQt5.QtCore import pyqtSlot, Qt, QUrl, QEvent, QUrlQuery from PyQt5.QtPrintSupport import QPrintPreviewDialog -from qutebrowser.commands import userscripts, cmdexc, cmdutils, runners +from qutebrowser.commands import userscripts, runners +from qutebrowser.api import cmdutils from qutebrowser.config import config, configdata from qutebrowser.browser import (urlmarks, browsertab, inspector, navigate, webelem, downloads) @@ -68,8 +69,8 @@ class CommandDispatcher: """Get a tabbed-browser from a new window.""" args = QApplication.instance().arguments() if private and '--single-process' in args: - raise cmdexc.CommandError("Private windows are unavailable with " - "the single-process process model.") + raise cmdutils.CommandError("Private windows are unavailable with " + "the single-process process model.") new_window = mainwindow.MainWindow(private=private) new_window.show() @@ -97,7 +98,7 @@ class CommandDispatcher: if e.reason: msg += " ({})".format(e.reason) msg += "!" - raise cmdexc.CommandError(msg) + raise cmdutils.CommandError(msg) def _current_title(self): """Convenience method to get the current title.""" @@ -107,7 +108,7 @@ class CommandDispatcher: """Get the currently active widget from a command.""" widget = self._tabbed_browser.widget.currentWidget() if widget is None: - raise cmdexc.CommandError("No WebView available yet!") + raise cmdutils.CommandError("No WebView available yet!") return widget def _open(self, url, tab=False, background=False, window=False, @@ -166,10 +167,10 @@ class CommandDispatcher: except KeyError: if not show_error: return - raise cmdexc.CommandError("No last focused tab!") + raise cmdutils.CommandError("No last focused tab!") idx = self._tabbed_browser.widget.indexOf(tab) if idx == -1: - raise cmdexc.CommandError("Last focused tab vanished!") + raise cmdutils.CommandError("Last focused tab vanished!") self._set_current_index(idx) def _get_selection_override(self, prev, next_, opposite): @@ -197,7 +198,7 @@ class CommandDispatcher: elif conf_selection == QTabBar.SelectRightTab: return QTabBar.SelectLeftTab elif conf_selection == QTabBar.SelectPreviousTab: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "-o is not supported with 'tabs.select_on_remove' set to " "'last-used'!") else: # pragma: no cover @@ -339,7 +340,7 @@ class CommandDispatcher: try: return urlutils.fuzzy_url(url, force_search=force_search) except urlutils.InvalidUrlError as e: - # We don't use cmdexc.CommandError here as this can be + # We don't use cmdutils.CommandError here as this can be # called async from edit_url message.error(str(e)) return None @@ -444,7 +445,7 @@ class CommandDispatcher: else: tab.printing.show_dialog() except browsertab.WebTabError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) @cmdutils.register(instance='command-dispatcher', scope='window') def tab_clone(self, bg=False, window=False): @@ -464,7 +465,7 @@ class CommandDispatcher: try: history = curtab.history.serialize() except browsertab.WebTabError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) # The new tab could be in a new tabbed_browser (e.g. because of # tabs.tabs_are_windows being set) @@ -504,7 +505,8 @@ class CommandDispatcher: tabbed_browser, tab = self._resolve_buffer_index(index) if tabbed_browser is self._tabbed_browser: - raise cmdexc.CommandError("Can't take a tab from the same window") + raise cmdutils.CommandError("Can't take a tab from the same " + "window") self._open(tab.url(), tab=True) if not keep: @@ -528,18 +530,18 @@ class CommandDispatcher: win_id = count - 1 if win_id == self._win_id: - raise cmdexc.CommandError("Can't give a tab to the same window") + raise cmdutils.CommandError("Can't give a tab to the same window") if win_id is None: if self._count() < 2 and not keep: - raise cmdexc.CommandError("Cannot detach from a window with " - "only one tab") + raise cmdutils.CommandError("Cannot detach from a window with " + "only one tab") tabbed_browser = self._new_tabbed_browser( private=self._tabbed_browser.is_private) else: if win_id not in objreg.window_registry: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "There's no window with id {}!".format(win_id)) tabbed_browser = objreg.get('tabbed-browser', scope='window', @@ -555,9 +557,9 @@ class CommandDispatcher: history = self._current_widget().history # Catch common cases before e.g. cloning tab if not forward and not history.can_go_back(): - raise cmdexc.CommandError("At beginning of history.") + raise cmdutils.CommandError("At beginning of history.") elif forward and not history.can_go_forward(): - raise cmdexc.CommandError("At end of history.") + raise cmdutils.CommandError("At end of history.") if tab or bg or window: widget = self.tab_clone(bg, window) @@ -570,7 +572,7 @@ class CommandDispatcher: else: widget.history.back(count) except browsertab.WebTabError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) @@ -663,7 +665,7 @@ class CommandDispatcher: raise ValueError("Got called with invalid value {} for " "`where'.".format(where)) except navigate.Error as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) @@ -709,9 +711,9 @@ class CommandDispatcher: func = funcs[direction] except KeyError: expected_values = ', '.join(sorted(funcs)) - raise cmdexc.CommandError("Invalid value {!r} for direction - " - "expected one of: {}".format( - direction, expected_values)) + raise cmdutils.CommandError("Invalid value {!r} for direction - " + "expected one of: {}".format( + direction, expected_values)) if direction in ['top', 'bottom']: func() @@ -794,7 +796,7 @@ class CommandDispatcher: try: tab.scroller.delta_page(count * x, count * y) except OverflowError: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "Numeric argument is too large for internal int " "representation.") @@ -901,7 +903,7 @@ class CommandDispatcher: try: perc = tab.zoom.offset(count) except ValueError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) if not quiet: message.info("Zoom level: {}%".format(int(perc)), replace=True) @@ -918,7 +920,7 @@ class CommandDispatcher: try: perc = tab.zoom.offset(-count) except ValueError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) if not quiet: message.info("Zoom level: {}%".format(int(perc)), replace=True) @@ -940,8 +942,8 @@ class CommandDispatcher: try: zoom = int(zoom.rstrip('%')) except ValueError: - raise cmdexc.CommandError("zoom: Invalid int value {}" - .format(zoom)) + raise cmdutils.CommandError("zoom: Invalid int value {}" + .format(zoom)) level = count if count is not None else zoom if level is None: @@ -951,7 +953,7 @@ class CommandDispatcher: try: tab.zoom.set_factor(float(level) / 100) except ValueError: - raise cmdexc.CommandError("Can't zoom {}%!".format(level)) + raise cmdutils.CommandError("Can't zoom {}%!".format(level)) if not quiet: message.info("Zoom level: {}%".format(int(level)), replace=True) @@ -1000,7 +1002,7 @@ class CommandDispatcher: try: self._tabbed_browser.undo() except IndexError: - raise cmdexc.CommandError("Nothing to undo!") + raise cmdutils.CommandError("Nothing to undo!") @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) @@ -1061,7 +1063,7 @@ class CommandDispatcher: index = model.data(model.first_item()) index_parts = index.split('/', 1) else: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "No matching tab for: {}".format(index)) if len(index_parts) == 2: @@ -1072,18 +1074,18 @@ class CommandDispatcher: active_win = objreg.get('app').activeWindow() if active_win is None: # Not sure how you enter a command without an active window... - raise cmdexc.CommandError( + raise cmdutils.CommandError( "No window specified and couldn't find active window!") win_id = active_win.win_id if win_id not in objreg.window_registry: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "There's no window with id {}!".format(win_id)) tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) if not 0 < idx <= tabbed_browser.widget.count(): - raise cmdexc.CommandError( + raise cmdutils.CommandError( "There's no tab with index {}!".format(idx)) return (tabbed_browser, tabbed_browser.widget.widget(idx-1)) @@ -1158,7 +1160,7 @@ class CommandDispatcher: if 1 <= index <= self._count(): self._set_current_index(index - 1) else: - raise cmdexc.CommandError("There's no tab with index {}!".format( + raise cmdutils.CommandError("There's no tab with index {}!".format( index)) @cmdutils.register(instance='command-dispatcher', scope='window') @@ -1200,8 +1202,8 @@ class CommandDispatcher: new_idx = 0 if not 0 <= new_idx < self._count(): - raise cmdexc.CommandError("Can't move tab to position {}!".format( - new_idx + 1)) + raise cmdutils.CommandError("Can't move tab to position {}!" + .format(new_idx + 1)) cur_idx = self._current_index() cmdutils.check_overflow(cur_idx, 'int') @@ -1232,8 +1234,8 @@ class CommandDispatcher: try: cmd, *args = shlex.split(cmdline) except ValueError as e: - raise cmdexc.CommandError("Error while splitting command: " - "{}".format(e)) + raise cmdutils.CommandError("Error while splitting command: " + "{}".format(e)) args = runners.replace_variables(self._win_id, args) @@ -1252,7 +1254,7 @@ class CommandDispatcher: try: runner = self._run_userscript(s, cmd, args, verbose, count) runner.finished.connect(_on_proc_finished) - except cmdexc.CommandError as e: + except cmdutils.CommandError as e: message.error(str(e)) # ~ expansion is handled by the userscript module. @@ -1312,7 +1314,7 @@ class CommandDispatcher: runner = userscripts.run_async( tab, cmd, *args, win_id=self._win_id, env=env, verbose=verbose) except userscripts.Error as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) return runner @cmdutils.register(instance='command-dispatcher', scope='window') @@ -1336,7 +1338,7 @@ class CommandDispatcher: try: url = objreg.get('quickmark-manager').get(name) except urlmarks.Error as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) self._open(url, tab, bg, window) @cmdutils.register(instance='command-dispatcher', scope='window', @@ -1356,11 +1358,12 @@ class CommandDispatcher: try: name = quickmark_manager.get_by_qurl(url) except urlmarks.DoesNotExistError as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) try: quickmark_manager.delete(name) except KeyError: - raise cmdexc.CommandError("Quickmark '{}' not found!".format(name)) + raise cmdutils.CommandError("Quickmark '{}' not found!" + .format(name)) @cmdutils.register(instance='command-dispatcher', scope='window') def bookmark_add(self, url=None, title=None, toggle=False): @@ -1382,8 +1385,8 @@ class CommandDispatcher: already exists. """ if url and not title: - raise cmdexc.CommandError('Title must be provided if url has ' - 'been provided') + raise cmdutils.CommandError('Title must be provided if url has ' + 'been provided') bookmark_manager = objreg.get('bookmark-manager') if not url: url = self._current_url() @@ -1391,13 +1394,13 @@ class CommandDispatcher: try: url = urlutils.fuzzy_url(url) except urlutils.InvalidUrlError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) if not title: title = self._current_title() try: was_added = bookmark_manager.add(url, title, toggle=toggle) except urlmarks.Error as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) else: msg = "Bookmarked {}" if was_added else "Removed bookmark {}" message.info(msg.format(url.toDisplayString())) @@ -1419,7 +1422,7 @@ class CommandDispatcher: try: qurl = urlutils.fuzzy_url(url) except urlutils.InvalidUrlError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) self._open(qurl, tab, bg, window) if delete: self.bookmark_del(url) @@ -1440,7 +1443,7 @@ class CommandDispatcher: try: objreg.get('bookmark-manager').delete(url) except KeyError: - raise cmdexc.CommandError("Bookmark '{}' not found!".format(url)) + raise cmdutils.CommandError("Bookmark '{}' not found!".format(url)) @cmdutils.register(instance='command-dispatcher', scope='window') def follow_selected(self, *, tab=False): @@ -1452,7 +1455,7 @@ class CommandDispatcher: try: self._current_widget().caret.follow_selected(tab=tab) except browsertab.WebTabError as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) @cmdutils.register(instance='command-dispatcher', name='inspector', scope='window') @@ -1474,7 +1477,7 @@ class CommandDispatcher: else: tab.data.inspector.toggle(page) except inspector.WebInspectorError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) @cmdutils.register(instance='command-dispatcher', scope='window') def download(self, url=None, *, mhtml_=False, dest=None): @@ -1491,7 +1494,7 @@ class CommandDispatcher: if dest is not None: dest = downloads.transform_path(dest) if dest is None: - raise cmdexc.CommandError("Invalid target filename") + raise cmdutils.CommandError("Invalid target filename") target = downloads.FileDownloadTarget(dest) tab = self._current_widget() @@ -1499,8 +1502,8 @@ class CommandDispatcher: if url: if mhtml_: - raise cmdexc.CommandError("Can only download the current page" - " as mhtml.") + raise cmdutils.CommandError("Can only download the current " + "page as mhtml.") url = urlutils.qurl_from_user_input(url) urlutils.raise_cmdexc_if_invalid(url) download_manager.get(url, user_agent=user_agent, target=target) @@ -1512,7 +1515,7 @@ class CommandDispatcher: try: webengine_download_manager.get_mhtml(tab, target) except browsertab.UnsupportedOperationError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) else: download_manager.get_mhtml(tab, target) else: @@ -1544,12 +1547,12 @@ class CommandDispatcher: tab = self._current_widget() try: current_url = self._current_url() - except cmdexc.CommandError as e: + except cmdutils.CommandError as e: message.error(str(e)) return if current_url.scheme() == 'view-source' or tab.data.viewing_source: - raise cmdexc.CommandError("Already viewing source!") + raise cmdutils.CommandError("Already viewing source!") if edit: ed = editor.ExternalEditor(self._tabbed_browser) @@ -1613,13 +1616,13 @@ class CommandDispatcher: elif topic.startswith(':'): command = topic[1:] if command not in objects.commands: - raise cmdexc.CommandError("Invalid command {}!".format( + raise cmdutils.CommandError("Invalid command {}!".format( command)) path = 'commands.html#{}'.format(command) elif topic in configdata.DATA: path = 'settings.html#{}'.format(topic) else: - raise cmdexc.CommandError("Invalid help topic {}!".format(topic)) + raise cmdutils.CommandError("Invalid help topic {}!".format(topic)) url = QUrl('qute://help/{}'.format(path)) self._open(url, tab, bg, window) @@ -1637,7 +1640,7 @@ class CommandDispatcher: window: Open in a new window. """ if level.upper() not in log.LOG_LEVELS: - raise cmdexc.CommandError("Invalid log level {}!".format(level)) + raise cmdutils.CommandError("Invalid log level {}!".format(level)) if plain: url = QUrl('qute://plainlog?level={}'.format(level)) else: @@ -1839,7 +1842,7 @@ class CommandDispatcher: window_options = self._tabbed_browser.search_options if window_text is None: - raise cmdexc.CommandError("No search done yet.") + raise cmdutils.CommandError("No search done yet.") self.set_mark("'") @@ -1873,7 +1876,7 @@ class CommandDispatcher: window_options = self._tabbed_browser.search_options if window_text is None: - raise cmdexc.CommandError("No search done yet.") + raise cmdutils.CommandError("No search done yet.") self.set_mark("'") @@ -2070,7 +2073,7 @@ class CommandDispatcher: try: tab.action.run_string(action) except browsertab.WebTabError as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) @cmdutils.register(instance='command-dispatcher', scope='window', maxsplit=0, no_cmd_split=True) @@ -2121,13 +2124,13 @@ class CommandDispatcher: with open(path, 'r', encoding='utf-8') as f: js_code = f.read() except OSError as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) widget = self._current_widget() try: widget.run_js_async(js_code, callback=jseval_cb, world=world) except browsertab.WebTabError as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) @cmdutils.register(instance='command-dispatcher', scope='window') def fake_key(self, keystring, global_=False): @@ -2144,7 +2147,7 @@ class CommandDispatcher: try: sequence = keyutils.KeySequence.parse(keystring) except keyutils.KeyParseError as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) for keyinfo in sequence: press_event = keyinfo.to_event(QEvent.KeyPress) @@ -2153,7 +2156,7 @@ class CommandDispatcher: if global_: window = QApplication.focusWindow() if window is None: - raise cmdexc.CommandError("No focused window!") + raise cmdutils.CommandError("No focused window!") QApplication.postEvent(window, press_event) QApplication.postEvent(window, release_event) else: @@ -2266,4 +2269,4 @@ class CommandDispatcher: try: tab.audio.toggle_muted(override=True) except browsertab.WebTabError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index c640396f6..6d9fa6c4e 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -33,7 +33,7 @@ from PyQt5.QtCore import (pyqtSlot, pyqtSignal, Qt, QObject, QModelIndex, QTimer, QAbstractListModel, QUrl) from qutebrowser.browser import pdfjs -from qutebrowser.commands import cmdexc, cmdutils +from qutebrowser.api import cmdutils from qutebrowser.config import config from qutebrowser.utils import (usertypes, standarddir, utils, message, log, qtutils, objreg) @@ -1009,8 +1009,8 @@ class DownloadModel(QAbstractListModel): count: The index of the download """ if not count: - raise cmdexc.CommandError("There's no download!") - raise cmdexc.CommandError("There's no download {}!".format(count)) + raise cmdutils.CommandError("There's no download!") + raise cmdutils.CommandError("There's no download {}!".format(count)) @cmdutils.register(instance='download-model', scope='window') @cmdutils.argument('count', count=True) @@ -1034,8 +1034,8 @@ class DownloadModel(QAbstractListModel): if download.done: if not count: count = len(self) - raise cmdexc.CommandError("Download {} is already done!" - .format(count)) + raise cmdutils.CommandError("Download {} is already done!" + .format(count)) download.cancel() @cmdutils.register(instance='download-model', scope='window') @@ -1053,7 +1053,8 @@ class DownloadModel(QAbstractListModel): if not download.successful: if not count: count = len(self) - raise cmdexc.CommandError("Download {} is not done!".format(count)) + raise cmdutils.CommandError("Download {} is not done!" + .format(count)) download.delete() download.remove() log.downloads.debug("deleted download {}".format(download)) @@ -1080,7 +1081,8 @@ class DownloadModel(QAbstractListModel): if not download.successful: if not count: count = len(self) - raise cmdexc.CommandError("Download {} is not done!".format(count)) + raise cmdutils.CommandError("Download {} is not done!" + .format(count)) download.open_file(cmdline) @cmdutils.register(instance='download-model', scope='window') @@ -1097,12 +1099,12 @@ class DownloadModel(QAbstractListModel): except IndexError: self._raise_no_download(count) if download.successful or not download.done: - raise cmdexc.CommandError("Download {} did not fail!".format( - count)) + raise cmdutils.CommandError("Download {} did not fail!" + .format(count)) else: to_retry = [d for d in self if d.done and not d.successful] if not to_retry: - raise cmdexc.CommandError("No failed downloads!") + raise cmdutils.CommandError("No failed downloads!") else: download = to_retry[0] download.try_retry() @@ -1137,8 +1139,8 @@ class DownloadModel(QAbstractListModel): if not download.done: if not count: count = len(self) - raise cmdexc.CommandError("Download {} is not done!" - .format(count)) + raise cmdutils.CommandError("Download {} is not done!" + .format(count)) download.remove() def running_downloads(self): diff --git a/qutebrowser/browser/greasemonkey.py b/qutebrowser/browser/greasemonkey.py index a2ae73aab..9314f81c6 100644 --- a/qutebrowser/browser/greasemonkey.py +++ b/qutebrowser/browser/greasemonkey.py @@ -32,7 +32,7 @@ from PyQt5.QtCore import pyqtSignal, QObject, QUrl from qutebrowser.utils import (log, standarddir, jinja, objreg, utils, javascript, urlmatch, version, usertypes) -from qutebrowser.commands import cmdutils +from qutebrowser.api import cmdutils from qutebrowser.browser import downloads from qutebrowser.misc import objects diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 730128295..230437b40 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -34,7 +34,8 @@ from PyQt5.QtWidgets import QLabel from qutebrowser.config import config, configexc from qutebrowser.keyinput import modeman, modeparsers from qutebrowser.browser import webelem -from qutebrowser.commands import userscripts, cmdexc, cmdutils, runners +from qutebrowser.commands import userscripts, runners +from qutebrowser.api import cmdutils from qutebrowser.utils import usertypes, log, qtutils, message, objreg, utils @@ -563,12 +564,12 @@ class HintManager(QObject): if target in [Target.userscript, Target.spawn, Target.run, Target.fill]: if not args: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "'args' is required with target userscript/spawn/run/" "fill.") else: if args: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "'args' is only allowed with target userscript/spawn.") def _filter_matches(self, filterstr, elemstr): @@ -705,7 +706,7 @@ class HintManager(QObject): window=self._win_id) tab = tabbed_browser.widget.currentWidget() if tab is None: - raise cmdexc.CommandError("No WebView available yet!") + raise cmdutils.CommandError("No WebView available yet!") mode_manager = objreg.get('mode-manager', scope='window', window=self._win_id) @@ -722,8 +723,8 @@ class HintManager(QObject): pass else: name = target.name.replace('_', '-') - raise cmdexc.CommandError("Rapid hinting makes no sense with " - "target {}!".format(name)) + raise cmdutils.CommandError("Rapid hinting makes no sense " + "with target {}!".format(name)) self._check_args(target, *args) self._context = HintContext() @@ -736,7 +737,7 @@ class HintManager(QObject): try: self._context.baseurl = tabbed_browser.current_url() except qtutils.QtValueError: - raise cmdexc.CommandError("No URL set for this page yet!") + raise cmdutils.CommandError("No URL set for this page yet!") self._context.args = list(args) self._context.group = group @@ -744,7 +745,7 @@ class HintManager(QObject): selector = webelem.css_selector(self._context.group, self._context.baseurl) except webelem.Error as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) self._context.tab.elements.find_css(selector, self._start_cb, only_visible=True) @@ -758,7 +759,7 @@ class HintManager(QObject): try: opt.typ.to_py(mode) except configexc.ValidationError as e: - raise cmdexc.CommandError("Invalid mode: {}".format(e)) + raise cmdutils.CommandError("Invalid mode: {}".format(e)) return mode def current_mode(self): @@ -960,13 +961,13 @@ class HintManager(QObject): """ if keystring is None: if self._context.to_follow is None: - raise cmdexc.CommandError("No hint to follow") + raise cmdutils.CommandError("No hint to follow") elif select: - raise cmdexc.CommandError("Can't use --select without hint.") + raise cmdutils.CommandError("Can't use --select without hint.") else: keystring = self._context.to_follow elif keystring not in self._context.labels: - raise cmdexc.CommandError("No hint {}!".format(keystring)) + raise cmdutils.CommandError("No hint {}!".format(keystring)) if select: self.handle_partial_key(keystring) diff --git a/qutebrowser/browser/history.py b/qutebrowser/browser/history.py index f98ec51a5..757a72e41 100644 --- a/qutebrowser/browser/history.py +++ b/qutebrowser/browser/history.py @@ -27,7 +27,7 @@ from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal from PyQt5.QtWidgets import QProgressDialog, QApplication from qutebrowser.config import config -from qutebrowser.commands import cmdutils, cmdexc +from qutebrowser.api import cmdutils from qutebrowser.utils import utils, objreg, log, usertypes, message, qtutils from qutebrowser.misc import objects, sql @@ -365,7 +365,8 @@ class WebHistory(sql.SqlTable): f.write('\n'.join(lines)) message.info("Dumped history to {}".format(dest)) except OSError as e: - raise cmdexc.CommandError('Could not write history: {}'.format(e)) + raise cmdutils.CommandError('Could not write history: {}' + .format(e)) def init(parent=None): diff --git a/qutebrowser/browser/urlmarks.py b/qutebrowser/browser/urlmarks.py index e32dbcc46..4d25dde45 100644 --- a/qutebrowser/browser/urlmarks.py +++ b/qutebrowser/browser/urlmarks.py @@ -35,7 +35,7 @@ from PyQt5.QtCore import pyqtSignal, QUrl, QObject from qutebrowser.utils import (message, usertypes, qtutils, urlutils, standarddir, objreg, log) -from qutebrowser.commands import cmdutils +from qutebrowser.api import cmdutils from qutebrowser.misc import lineparser @@ -166,7 +166,7 @@ class QuickmarkManager(UrlMarkManager): url: The url to add as quickmark. name: The name for the new quickmark. """ - # We don't raise cmdexc.CommandError here as this can be called async + # We don't raise cmdutils.CommandError here as this can be called async # via prompt_save. if not name: message.error("Can't set mark with empty name!") diff --git a/qutebrowser/commands/cmdexc.py b/qutebrowser/commands/cmdexc.py index dbc5da581..f342f2436 100644 --- a/qutebrowser/commands/cmdexc.py +++ b/qutebrowser/commands/cmdexc.py @@ -28,11 +28,6 @@ class Error(Exception): """Base class for all cmdexc errors.""" -class CommandError(Error): - - """Raised when a command encounters an error while running.""" - - class NoSuchCommandError(Error): """Raised when a command wasn't found.""" diff --git a/qutebrowser/commands/runners.py b/qutebrowser/commands/runners.py index 86b0cc3a2..000689a75 100644 --- a/qutebrowser/commands/runners.py +++ b/qutebrowser/commands/runners.py @@ -25,6 +25,7 @@ import re import attr from PyQt5.QtCore import pyqtSlot, QUrl, QObject +from qutebrowser.api import cmdutils from qutebrowser.config import config from qutebrowser.commands import cmdexc from qutebrowser.utils import message, objreg, qtutils, usertypes, utils @@ -53,7 +54,7 @@ def _current_url(tabbed_browser): if e.reason: msg += " ({})".format(e.reason) msg += "!" - raise cmdexc.CommandError(msg) + raise cmdutils.CommandError(msg) def replace_variables(win_id, arglist): @@ -93,7 +94,7 @@ def replace_variables(win_id, arglist): # "{url}" from clipboard is not expanded) args.append(repl_pattern.sub(repl_cb, arg)) except utils.ClipboardError as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) return args diff --git a/qutebrowser/completion/completionwidget.py b/qutebrowser/completion/completionwidget.py index 740be75d9..0af4ecbe1 100644 --- a/qutebrowser/completion/completionwidget.py +++ b/qutebrowser/completion/completionwidget.py @@ -29,7 +29,7 @@ from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QItemSelectionModel, QSize from qutebrowser.config import config from qutebrowser.completion import completiondelegate from qutebrowser.utils import utils, usertypes, debug, log, objreg -from qutebrowser.commands import cmdexc, cmdutils +from qutebrowser.api import cmdutils class CompletionView(QTreeView): @@ -251,8 +251,8 @@ class CompletionView(QTreeView): status.command_history_prev() return else: - raise cmdexc.CommandError("Can't combine --history with " - "{}!".format(which)) + raise cmdutils.CommandError("Can't combine --history with " + "{}!".format(which)) if not self._active: return @@ -394,7 +394,7 @@ class CompletionView(QTreeView): """Delete the current completion item.""" index = self.currentIndex() if not index.isValid(): - raise cmdexc.CommandError("No item selected!") + raise cmdutils.CommandError("No item selected!") self.model().delete_cur_item(index) @cmdutils.register(instance='completion', @@ -411,6 +411,6 @@ class CompletionView(QTreeView): if not text: index = self.currentIndex() if not index.isValid(): - raise cmdexc.CommandError("No item selected!") + raise cmdutils.CommandError("No item selected!") text = self.model().data(index) utils.set_clipboard(text, selection=sel) diff --git a/qutebrowser/completion/models/completionmodel.py b/qutebrowser/completion/models/completionmodel.py index 1c77e1d31..36a465fb7 100644 --- a/qutebrowser/completion/models/completionmodel.py +++ b/qutebrowser/completion/models/completionmodel.py @@ -22,7 +22,7 @@ from PyQt5.QtCore import Qt, QModelIndex, QAbstractItemModel from qutebrowser.utils import log, qtutils -from qutebrowser.commands import cmdexc +from qutebrowser.api import cmdutils class CompletionModel(QAbstractItemModel): @@ -224,7 +224,7 @@ class CompletionModel(QAbstractItemModel): cat = self._cat_from_idx(parent) assert cat, "CompletionView sent invalid index for deletion" if not cat.delete_func: - raise cmdexc.CommandError("Cannot delete this item.") + raise cmdutils.CommandError("Cannot delete this item.") data = [cat.data(cat.index(index.row(), i)) for i in range(cat.columnCount())] diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index 8853f9ca3..8587acc3f 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -24,7 +24,7 @@ import contextlib from PyQt5.QtCore import QUrl -from qutebrowser.commands import cmdexc, cmdutils +from qutebrowser.api import cmdutils from qutebrowser.completion.models import configmodel from qutebrowser.utils import objreg, message, standarddir, urlmatch from qutebrowser.config import configtypes, configexc, configfiles, configdata @@ -46,7 +46,7 @@ class ConfigCommands: try: yield except configexc.Error as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) def _parse_pattern(self, pattern): """Parse a pattern string argument to a pattern.""" @@ -56,15 +56,15 @@ class ConfigCommands: try: return urlmatch.UrlPattern(pattern) except urlmatch.ParseError as e: - raise cmdexc.CommandError("Error while parsing {}: {}" - .format(pattern, str(e))) + raise cmdutils.CommandError("Error while parsing {}: {}" + .format(pattern, str(e))) def _parse_key(self, key): """Parse a key argument.""" try: return keyutils.KeySequence.parse(key) except keyutils.KeyParseError as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) def _print_value(self, option, pattern): """Print the value of the given option.""" @@ -105,8 +105,8 @@ class ConfigCommands: return if option.endswith('!'): - raise cmdexc.CommandError("Toggling values was moved to the " - ":config-cycle command") + raise cmdutils.CommandError("Toggling values was moved to the " + ":config-cycle command") pattern = self._parse_pattern(pattern) @@ -213,8 +213,8 @@ class ConfigCommands: values = ['true', 'false'] if len(values) < 2: - raise cmdexc.CommandError("Need at least two values for " - "non-boolean settings.") + raise cmdutils.CommandError("Need at least two values for " + "non-boolean settings.") # Use the next valid value from values, or the first if the current # value does not appear in the list @@ -263,8 +263,8 @@ class ConfigCommands: opt = self._config.get_opt(option) valid_list_types = (configtypes.List, configtypes.ListOrValue) if not isinstance(opt.typ, valid_list_types): - raise cmdexc.CommandError(":config-list-add can only be used for " - "lists") + raise cmdutils.CommandError(":config-list-add can only be used " + "for lists") with self._handle_config_error(): option_value = self._config.get_mutable_obj(option) @@ -286,16 +286,16 @@ class ConfigCommands: """ opt = self._config.get_opt(option) if not isinstance(opt.typ, configtypes.Dict): - raise cmdexc.CommandError(":config-dict-add can only be used for " - "dicts") + raise cmdutils.CommandError(":config-dict-add can only be used " + "for dicts") with self._handle_config_error(): option_value = self._config.get_mutable_obj(option) if key in option_value and not replace: - raise cmdexc.CommandError("{} already exists in {} - use " - "--replace to overwrite!" - .format(key, option)) + raise cmdutils.CommandError("{} already exists in {} - use " + "--replace to overwrite!" + .format(key, option)) option_value[key] = value self._config.update_mutables(save_yaml=not temp) @@ -313,15 +313,15 @@ class ConfigCommands: opt = self._config.get_opt(option) valid_list_types = (configtypes.List, configtypes.ListOrValue) if not isinstance(opt.typ, valid_list_types): - raise cmdexc.CommandError(":config-list-remove can only be used " - "for lists") + raise cmdutils.CommandError(":config-list-remove can only be used " + "for lists") with self._handle_config_error(): option_value = self._config.get_mutable_obj(option) if value not in option_value: - raise cmdexc.CommandError("{} is not in {}!".format(value, - option)) + raise cmdutils.CommandError("{} is not in {}!".format( + value, option)) option_value.remove(value) @@ -339,15 +339,15 @@ class ConfigCommands: """ opt = self._config.get_opt(option) if not isinstance(opt.typ, configtypes.Dict): - raise cmdexc.CommandError(":config-dict-remove can only be used " - "for dicts") + raise cmdutils.CommandError(":config-dict-remove can only be used " + "for dicts") with self._handle_config_error(): option_value = self._config.get_mutable_obj(option) if key not in option_value: - raise cmdexc.CommandError("{} is not in {}!".format(key, - option)) + raise cmdutils.CommandError("{} is not in {}!".format( + key, option)) del option_value[key] @@ -383,7 +383,7 @@ class ConfigCommands: try: configfiles.read_config_py(filename) except configexc.ConfigFileErrors as e: - raise cmdexc.CommandError(e) + raise cmdutils.CommandError(e) @cmdutils.register(instance='config-commands') def config_edit(self, no_source=False): @@ -395,7 +395,7 @@ class ConfigCommands: def on_file_updated(): """Source the new config when editing finished. - This can't use cmdexc.CommandError as it's run async. + This can't use cmdutils.CommandError as it's run async. """ try: configfiles.read_config_py(filename) @@ -426,8 +426,8 @@ class ConfigCommands: filename = os.path.expanduser(filename) if os.path.exists(filename) and not force: - raise cmdexc.CommandError("{} already exists - use --force to " - "overwrite!".format(filename)) + raise cmdutils.CommandError("{} already exists - use --force to " + "overwrite!".format(filename)) if defaults: options = [(None, opt, opt.default) @@ -447,4 +447,4 @@ class ConfigCommands: try: writer.write(filename) except OSError as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) diff --git a/qutebrowser/keyinput/macros.py b/qutebrowser/keyinput/macros.py index 97b0b103b..bd17f5664 100644 --- a/qutebrowser/keyinput/macros.py +++ b/qutebrowser/keyinput/macros.py @@ -19,7 +19,8 @@ """Keyboard macro system.""" -from qutebrowser.commands import cmdexc, cmdutils, runners +from qutebrowser.commands import runners +from qutebrowser.api import cmdutils from qutebrowser.keyinput import modeman from qutebrowser.utils import message, objreg, usertypes @@ -89,12 +90,12 @@ class MacroRecorder: """Run a recorded macro.""" if register == '@': if self._last_register is None: - raise cmdexc.CommandError("No previous macro") + raise cmdutils.CommandError("No previous macro") register = self._last_register self._last_register = register if register not in self._macros: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "No macro recorded in '{}'!".format(register)) commandrunner = runners.CommandRunner(win_id) diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py index c06f18a1c..c06700b6c 100644 --- a/qutebrowser/keyinput/modeman.py +++ b/qutebrowser/keyinput/modeman.py @@ -27,7 +27,7 @@ from PyQt5.QtWidgets import QApplication from qutebrowser.keyinput import modeparsers from qutebrowser.config import config -from qutebrowser.commands import cmdexc, cmdutils +from qutebrowser.api import cmdutils from qutebrowser.utils import usertypes, log, objreg, utils INPUT_MODES = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough] @@ -282,11 +282,11 @@ class ModeManager(QObject): try: m = usertypes.KeyMode[mode] except KeyError: - raise cmdexc.CommandError("Mode {} does not exist!".format(mode)) + raise cmdutils.CommandError("Mode {} does not exist!".format(mode)) if m in [usertypes.KeyMode.hint, usertypes.KeyMode.command, usertypes.KeyMode.yesno, usertypes.KeyMode.prompt]: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "Mode {} can't be entered manually!".format(mode)) self.enter(m, 'command') diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index 3fdad13d1..ed0a78469 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -28,7 +28,8 @@ from PyQt5.QtCore import (pyqtSlot, QRect, QPoint, QTimer, Qt, QCoreApplication, QEventLoop) from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication, QSizePolicy -from qutebrowser.commands import runners, cmdutils +from qutebrowser.commands import runners +from qutebrowser.api import cmdutils from qutebrowser.config import config, configfiles from qutebrowser.utils import (message, log, usertypes, qtutils, objreg, utils, jinja) diff --git a/qutebrowser/mainwindow/prompt.py b/qutebrowser/mainwindow/prompt.py index f6a8b1224..f666aa837 100644 --- a/qutebrowser/mainwindow/prompt.py +++ b/qutebrowser/mainwindow/prompt.py @@ -34,7 +34,7 @@ from qutebrowser.browser import downloads from qutebrowser.config import config from qutebrowser.utils import usertypes, log, utils, qtutils, objreg, message from qutebrowser.keyinput import modeman -from qutebrowser.commands import cmdutils, cmdexc +from qutebrowser.api import cmdutils from qutebrowser.qt import sip @@ -384,7 +384,7 @@ class PromptContainer(QWidget): try: done = self._prompt.accept(value) except Error as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) if done: message.global_bridge.prompt_done.emit(self._prompt.KEY_MODE) question.done() diff --git a/qutebrowser/mainwindow/statusbar/command.py b/qutebrowser/mainwindow/statusbar/command.py index c04dab03e..de42cda4e 100644 --- a/qutebrowser/mainwindow/statusbar/command.py +++ b/qutebrowser/mainwindow/statusbar/command.py @@ -25,7 +25,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QSize from PyQt5.QtWidgets import QSizePolicy from qutebrowser.keyinput import modeman, modeparsers -from qutebrowser.commands import cmdexc, cmdutils +from qutebrowser.api import cmdutils from qutebrowser.misc import cmdhistory, editor from qutebrowser.misc import miscwidgets as misc from qutebrowser.utils import usertypes, log, objreg, message, utils @@ -137,11 +137,11 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit): text += ' ' if append: if not self.text(): - raise cmdexc.CommandError("No current text!") + raise cmdutils.CommandError("No current text!") text = self.text() + text if not text or text[0] not in modeparsers.STARTCHARS: - raise cmdexc.CommandError( + raise cmdutils.CommandError( "Invalid command text '{}'.".format(text)) if run_on_count and count is not None: self.got_cmd[str, int].emit(text, count) diff --git a/qutebrowser/misc/crashsignal.py b/qutebrowser/misc/crashsignal.py index 196613d62..7890380e8 100644 --- a/qutebrowser/misc/crashsignal.py +++ b/qutebrowser/misc/crashsignal.py @@ -37,7 +37,7 @@ import attr from PyQt5.QtCore import (pyqtSlot, qInstallMessageHandler, QObject, QSocketNotifier, QTimer, QUrl) -from qutebrowser.commands import cmdutils +from qutebrowser.api import cmdutils from qutebrowser.misc import earlyinit, crashdialog, ipc from qutebrowser.utils import usertypes, standarddir, log, objreg, debug, utils diff --git a/qutebrowser/misc/readline.py b/qutebrowser/misc/readline.py index 3846b77e0..14c25cd6d 100644 --- a/qutebrowser/misc/readline.py +++ b/qutebrowser/misc/readline.py @@ -21,7 +21,7 @@ from PyQt5.QtWidgets import QApplication, QLineEdit -from qutebrowser.commands import cmdutils +from qutebrowser.api import cmdutils from qutebrowser.utils import usertypes as typ from qutebrowser.utils import utils diff --git a/qutebrowser/misc/savemanager.py b/qutebrowser/misc/savemanager.py index 0d79c97db..9985c5191 100644 --- a/qutebrowser/misc/savemanager.py +++ b/qutebrowser/misc/savemanager.py @@ -25,7 +25,7 @@ import collections from PyQt5.QtCore import pyqtSlot, QObject, QTimer from qutebrowser.config import config -from qutebrowser.commands import cmdutils +from qutebrowser.api import cmdutils from qutebrowser.utils import utils, log, message, usertypes diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index 459011e0f..4f80ad2b0 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -31,7 +31,7 @@ import yaml from qutebrowser.utils import (standarddir, objreg, qtutils, log, message, utils) -from qutebrowser.commands import cmdexc, cmdutils +from qutebrowser.api import cmdutils from qutebrowser.config import config, configfiles from qutebrowser.completion.models import miscmodels from qutebrowser.mainwindow import mainwindow @@ -480,16 +480,17 @@ class SessionManager(QObject): delete: Delete the saved session once it has loaded. """ if name.startswith('_') and not force: - raise cmdexc.CommandError("{} is an internal session, use --force " - "to load anyways.".format(name)) + raise cmdutils.CommandError("{} is an internal session, use " + "--force to load anyways." + .format(name)) old_windows = list(objreg.window_registry.values()) try: self.load(name, temp=temp) except SessionNotFoundError: - raise cmdexc.CommandError("Session {} not found!".format(name)) + raise cmdutils.CommandError("Session {} not found!".format(name)) except SessionError as e: - raise cmdexc.CommandError("Error while loading session: {}" - .format(e)) + raise cmdutils.CommandError("Error while loading session: {}" + .format(e)) else: if clear: for win in old_windows: @@ -499,9 +500,8 @@ class SessionManager(QObject): self.delete(name) except SessionError as e: log.sessions.exception("Error while deleting session!") - raise cmdexc.CommandError( - "Error while deleting session: {}" - .format(e)) + raise cmdutils.CommandError("Error while deleting " + "session: {}".format(e)) else: log.sessions.debug( "Loaded & deleted session {}.".format(name)) @@ -531,11 +531,12 @@ class SessionManager(QObject): if (not isinstance(name, Sentinel) and name.startswith('_') and not force): - raise cmdexc.CommandError("{} is an internal session, use --force " - "to save anyways.".format(name)) + raise cmdutils.CommandError("{} is an internal session, use " + "--force to save anyways." + .format(name)) if current: if self._current is None: - raise cmdexc.CommandError("No session loaded currently!") + raise cmdutils.CommandError("No session loaded currently!") name = self._current assert not name.startswith('_') try: @@ -545,8 +546,8 @@ class SessionManager(QObject): else: name = self.save(name, with_private=with_private) except SessionError as e: - raise cmdexc.CommandError("Error while saving session: {}" - .format(e)) + raise cmdutils.CommandError("Error while saving session: {}" + .format(e)) else: if quiet: log.sessions.debug("Saved session {}.".format(name)) @@ -564,15 +565,16 @@ class SessionManager(QObject): underline). """ if name.startswith('_') and not force: - raise cmdexc.CommandError("{} is an internal session, use --force " - "to delete anyways.".format(name)) + raise cmdutils.CommandError("{} is an internal session, use " + "--force to delete anyways." + .format(name)) try: self.delete(name) except SessionNotFoundError: - raise cmdexc.CommandError("Session {} not found!".format(name)) + raise cmdutils.CommandError("Session {} not found!".format(name)) except SessionError as e: log.sessions.exception("Error while deleting session!") - raise cmdexc.CommandError("Error while deleting session: {}" - .format(e)) + raise cmdutils.CommandError("Error while deleting session: {}" + .format(e)) else: log.sessions.debug("Deleted session {}.".format(name)) diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py index 003fb494c..e78b6d9b7 100644 --- a/qutebrowser/misc/utilcmds.py +++ b/qutebrowser/misc/utilcmds.py @@ -35,7 +35,8 @@ from PyQt5.QtWidgets import QApplication # pylint: disable=unused-import from qutebrowser.browser import qutescheme from qutebrowser.utils import log, objreg, usertypes, message, debug, utils -from qutebrowser.commands import cmdutils, runners, cmdexc +from qutebrowser.commands import runners +from qutebrowser.api import cmdutils from qutebrowser.config import config, configdata from qutebrowser.misc import consolewidget from qutebrowser.utils.version import pastebin_version @@ -52,7 +53,7 @@ def later(ms: int, command: str, win_id: int) -> None: command: The command to run, with optional args. """ if ms < 0: - raise cmdexc.CommandError("I can't run something in the past!") + raise cmdutils.CommandError("I can't run something in the past!") commandrunner = runners.CommandRunner(win_id) app = objreg.get('app') timer = usertypes.Timer(name='later', parent=app) @@ -61,8 +62,8 @@ def later(ms: int, command: str, win_id: int) -> None: try: timer.setInterval(ms) except OverflowError: - raise cmdexc.CommandError("Numeric argument is too large for " - "internal int representation.") + raise cmdutils.CommandError("Numeric argument is too large for " + "internal int representation.") timer.timeout.connect( functools.partial(commandrunner.run_safely, command)) timer.timeout.connect(timer.deleteLater) @@ -87,7 +88,7 @@ def repeat(times: int, command: str, win_id: int, count: int = None) -> None: times *= count if times < 0: - raise cmdexc.CommandError("A negative count doesn't make sense.") + raise cmdutils.CommandError("A negative count doesn't make sense.") commandrunner = runners.CommandRunner(win_id) for _ in range(times): commandrunner.run_safely(command) @@ -227,12 +228,12 @@ def debug_trace(expr=""): expr: What to trace, passed to hunter. """ if hunter is None: - raise cmdexc.CommandError("You need to install 'hunter' to use this " - "command!") + raise cmdutils.CommandError("You need to install 'hunter' to use this " + "command!") try: eval('hunter.trace({})'.format(expr)) except Exception as e: - raise cmdexc.CommandError("{}: {}".format(e.__class__.__name__, e)) + raise cmdutils.CommandError("{}: {}".format(e.__class__.__name__, e)) @cmdutils.register(maxsplit=0, debug=True, no_cmd_split=True) @@ -251,7 +252,7 @@ def debug_pyeval(s, file=False, quiet=False): with open(path, 'r', encoding='utf-8') as f: s = f.read() except OSError as e: - raise cmdexc.CommandError(str(e)) + raise cmdutils.CommandError(str(e)) try: exec(s) out = "No error" @@ -297,7 +298,7 @@ def repeat_command(win_id, count=None): """ mode_manager = objreg.get('mode-manager', scope='window', window=win_id) if mode_manager.mode not in runners.last_command: - raise cmdexc.CommandError("You didn't do anything yet.") + raise cmdutils.CommandError("You didn't do anything yet.") cmd = runners.last_command[mode_manager.mode] commandrunner = runners.CommandRunner(win_id) commandrunner.run(cmd[0], count if count is not None else cmd[1]) @@ -311,7 +312,7 @@ def log_capacity(capacity: int) -> None: capacity: Number of lines for the log. """ if capacity < 0: - raise cmdexc.CommandError("Can't set a negative log capacity!") + raise cmdutils.CommandError("Can't set a negative log capacity!") else: assert log.ram_handler is not None log.ram_handler.change_log_capacity(capacity) @@ -341,17 +342,17 @@ def debug_log_filter(filters: str) -> None: clear any existing filters. """ if log.console_filter is None: - raise cmdexc.CommandError("No log.console_filter. Not attached " - "to a console?") + raise cmdutils.CommandError("No log.console_filter. Not attached " + "to a console?") if filters.strip().lower() == 'none': log.console_filter.names = None return if not set(filters.split(',')).issubset(log.LOGGER_NAMES): - raise cmdexc.CommandError("filters: Invalid value {} - expected one " - "of: {}".format(filters, - ', '.join(log.LOGGER_NAMES))) + raise cmdutils.CommandError("filters: Invalid value {} - expected one " + "of: {}".format( + filters, ', '.join(log.LOGGER_NAMES))) log.console_filter.names = filters.split(',') diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index 00cf4d01a..1acd9cd4e 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -29,9 +29,9 @@ import urllib.parse from PyQt5.QtCore import QUrl, QUrlQuery from PyQt5.QtNetwork import QHostInfo, QHostAddress, QNetworkProxy +from qutebrowser.api import cmdutils from qutebrowser.config import config from qutebrowser.utils import log, qtutils, message, utils -from qutebrowser.commands import cmdexc from qutebrowser.browser.network import pac @@ -361,7 +361,7 @@ def invalid_url_error(url, action): def raise_cmdexc_if_invalid(url): """Check if the given QUrl is invalid, and if so, raise a CommandError.""" if not url.isValid(): - raise cmdexc.CommandError(get_errstring(url)) + raise cmdutils.CommandError(get_errstring(url)) def get_path_if_valid(pathstr, cwd=None, relative=False, check_exists=False): diff --git a/scripts/dev/check_coverage.py b/scripts/dev/check_coverage.py index 5c678ac96..21ebd6557 100644 --- a/scripts/dev/check_coverage.py +++ b/scripts/dev/check_coverage.py @@ -53,8 +53,8 @@ MsgType = enum.Enum('MsgType', 'insufficent_coverage, perfect_file') PERFECT_FILES = [ (None, 'commands/cmdexc.py'), - ('tests/unit/commands/test_cmdutils.py', - 'commands/cmdutils.py'), + ('tests/unit/api/test_cmdutils.py', + 'api/cmdutils.py'), ('tests/unit/commands/test_argparser.py', 'commands/argparser.py'), diff --git a/tests/unit/commands/test_cmdutils.py b/tests/unit/api/test_cmdutils.py similarity index 98% rename from tests/unit/commands/test_cmdutils.py rename to tests/unit/api/test_cmdutils.py index 4d7877e69..f2318ab46 100644 --- a/tests/unit/commands/test_cmdutils.py +++ b/tests/unit/api/test_cmdutils.py @@ -19,7 +19,7 @@ # pylint: disable=unused-variable -"""Tests for qutebrowser.commands.cmdutils.""" +"""Tests for qutebrowser.api.cmdutils.""" import sys import logging @@ -30,7 +30,8 @@ import enum import pytest from qutebrowser.misc import objects -from qutebrowser.commands import cmdexc, argparser, command, cmdutils +from qutebrowser.commands import cmdexc, argparser, command +from qutebrowser.api import cmdutils from qutebrowser.utils import usertypes @@ -59,7 +60,7 @@ class TestCheckOverflow: def test_bad(self): int32_max = 2 ** 31 - 1 - with pytest.raises(cmdexc.CommandError, match="Numeric argument is " + with pytest.raises(cmdutils.CommandError, match="Numeric argument is " "too large for internal int representation."): cmdutils.check_overflow(int32_max + 1, 'int') @@ -71,7 +72,7 @@ class TestCheckExclusive: cmdutils.check_exclusive(flags, []) def test_bad(self): - with pytest.raises(cmdexc.CommandError, + with pytest.raises(cmdutils.CommandError, match="Only one of -x/-y/-z can be given!"): cmdutils.check_exclusive([True, True], 'xyz') diff --git a/tests/unit/browser/test_history.py b/tests/unit/browser/test_history.py index 5b84eac4c..715b597b0 100644 --- a/tests/unit/browser/test_history.py +++ b/tests/unit/browser/test_history.py @@ -26,7 +26,7 @@ from PyQt5.QtCore import QUrl from qutebrowser.browser import history from qutebrowser.utils import objreg, urlutils, usertypes -from qutebrowser.commands import cmdexc +from qutebrowser.api import cmdutils from qutebrowser.misc import sql @@ -324,7 +324,7 @@ class TestDump: def test_nonexistent(self, web_history, tmpdir): histfile = tmpdir / 'nonexistent' / 'history' - with pytest.raises(cmdexc.CommandError): + with pytest.raises(cmdutils.CommandError): web_history.debug_dump_history(str(histfile)) diff --git a/tests/unit/completion/test_completer.py b/tests/unit/completion/test_completer.py index 59291cdd6..16ebb95dc 100644 --- a/tests/unit/completion/test_completer.py +++ b/tests/unit/completion/test_completer.py @@ -26,7 +26,8 @@ from PyQt5.QtCore import QObject from PyQt5.QtGui import QStandardItemModel from qutebrowser.completion import completer -from qutebrowser.commands import command, cmdutils +from qutebrowser.commands import command +from qutebrowser.api import cmdutils class FakeCompletionModel(QStandardItemModel): diff --git a/tests/unit/completion/test_completionmodel.py b/tests/unit/completion/test_completionmodel.py index e0e044ffb..24f5bdf0d 100644 --- a/tests/unit/completion/test_completionmodel.py +++ b/tests/unit/completion/test_completionmodel.py @@ -28,7 +28,7 @@ from PyQt5.QtCore import QModelIndex from qutebrowser.completion.models import completionmodel, listcategory from qutebrowser.utils import qtutils -from qutebrowser.commands import cmdexc +from qutebrowser.api import cmdutils @hypothesis.given(strategies.lists( @@ -102,7 +102,7 @@ def test_delete_cur_item_no_func(): model.rowsRemoved.connect(callback) model.add_category(cat) parent = model.index(0, 0) - with pytest.raises(cmdexc.CommandError): + with pytest.raises(cmdutils.CommandError): model.delete_cur_item(model.index(0, 0, parent)) callback.assert_not_called() diff --git a/tests/unit/completion/test_completionwidget.py b/tests/unit/completion/test_completionwidget.py index 01bd3ec03..3d66e1145 100644 --- a/tests/unit/completion/test_completionwidget.py +++ b/tests/unit/completion/test_completionwidget.py @@ -25,7 +25,7 @@ import pytest from qutebrowser.completion import completionwidget from qutebrowser.completion.models import completionmodel, listcategory -from qutebrowser.commands import cmdexc +from qutebrowser.api import cmdutils @pytest.fixture @@ -241,7 +241,7 @@ def test_completion_item_del_no_selection(completionview): cat = listcategory.ListCategory('', [('foo',)], delete_func=func) model.add_category(cat) completionview.set_model(model) - with pytest.raises(cmdexc.CommandError, match='No item selected!'): + with pytest.raises(cmdutils.CommandError, match='No item selected!'): completionview.completion_item_del() func.assert_not_called() diff --git a/tests/unit/config/test_configcommands.py b/tests/unit/config/test_configcommands.py index 47bcaaa74..001d55899 100644 --- a/tests/unit/config/test_configcommands.py +++ b/tests/unit/config/test_configcommands.py @@ -26,7 +26,7 @@ import pytest from PyQt5.QtCore import QUrl from qutebrowser.config import configcommands, configutils -from qutebrowser.commands import cmdexc +from qutebrowser.api import cmdutils from qutebrowser.utils import usertypes, urlmatch from qutebrowser.keyinput import keyutils from qutebrowser.misc import objects @@ -108,7 +108,7 @@ class TestSet: monkeypatch.setattr(objects, 'backend', usertypes.Backend.QtWebKit) option = 'content.javascript.enabled' - with pytest.raises(cmdexc.CommandError, + with pytest.raises(cmdutils.CommandError, match=('Error while parsing http://: Pattern ' 'without host')): commands.set(0, option, 'false', pattern='http://') @@ -118,7 +118,7 @@ class TestSet: Should show an error as patterns are unsupported. """ - with pytest.raises(cmdexc.CommandError, + with pytest.raises(cmdutils.CommandError, match='does not support URL patterns'): commands.set(0, 'colors.statusbar.normal.bg', '#abcdef', pattern='*://*') @@ -165,7 +165,7 @@ class TestSet: Should show an error. """ - with pytest.raises(cmdexc.CommandError, match="No option 'foo'"): + with pytest.raises(cmdutils.CommandError, match="No option 'foo'"): commands.set(0, 'foo', 'bar') def test_set_invalid_value(self, commands): @@ -173,13 +173,13 @@ class TestSet: Should show an error. """ - with pytest.raises(cmdexc.CommandError, + with pytest.raises(cmdutils.CommandError, match="Invalid value 'blah' - must be a boolean!"): commands.set(0, 'auto_save.session', 'blah') def test_set_wrong_backend(self, commands, monkeypatch): monkeypatch.setattr(objects, 'backend', usertypes.Backend.QtWebEngine) - with pytest.raises(cmdexc.CommandError, + with pytest.raises(cmdutils.CommandError, match="The hints.find_implementation setting is " "not available with the QtWebEngine backend!"): commands.set(0, 'hints.find_implementation', 'javascript') @@ -190,7 +190,7 @@ class TestSet: Should show an error. See https://github.com/qutebrowser/qutebrowser/issues/1109 """ - with pytest.raises(cmdexc.CommandError, match="No option '?'"): + with pytest.raises(cmdutils.CommandError, match="No option '?'"): commands.set(win_id=0, option='?') def test_toggle(self, commands): @@ -198,7 +198,7 @@ class TestSet: Should show an nicer error. """ - with pytest.raises(cmdexc.CommandError, + with pytest.raises(cmdutils.CommandError, match="Toggling values was moved to the " ":config-cycle command"): commands.set(win_id=0, option='javascript.enabled!') @@ -208,7 +208,7 @@ class TestSet: Should show an error. """ - with pytest.raises(cmdexc.CommandError, match="No option 'foo'"): + with pytest.raises(cmdutils.CommandError, match="No option 'foo'"): commands.set(win_id=0, option='foo?') @@ -267,7 +267,7 @@ class TestCycle: Should show an error. """ assert config_stub.val.url.auto_search == 'naive' - with pytest.raises(cmdexc.CommandError, match="Need at least " + with pytest.raises(cmdutils.CommandError, match="Need at least " "two values for non-boolean settings."): commands.config_cycle(*args) assert config_stub.val.url.auto_search == 'naive' @@ -301,14 +301,14 @@ class TestAdd: def test_list_add_non_list(self, commands): with pytest.raises( - cmdexc.CommandError, + cmdutils.CommandError, match=":config-list-add can only be used for lists"): commands.config_list_add('history_gap_interval', 'value') @pytest.mark.parametrize('value', ['', None, 42]) def test_list_add_invalid_values(self, commands, value): with pytest.raises( - cmdexc.CommandError, + cmdutils.CommandError, match="Invalid value '{}'".format(value)): commands.config_list_add('content.host_blocking.whitelist', value) @@ -337,20 +337,20 @@ class TestAdd: assert str(config_stub.get(name)[key]) == value else: with pytest.raises( - cmdexc.CommandError, + cmdutils.CommandError, match="w already exists in aliases - use --replace to " "overwrite!"): commands.config_dict_add(name, key, value, replace=False) def test_dict_add_non_dict(self, commands): with pytest.raises( - cmdexc.CommandError, + cmdutils.CommandError, match=":config-dict-add can only be used for dicts"): commands.config_dict_add('history_gap_interval', 'key', 'value') @pytest.mark.parametrize('value', ['', None, 42]) def test_dict_add_invalid_values(self, commands, value): - with pytest.raises(cmdexc.CommandError, + with pytest.raises(cmdutils.CommandError, match="Invalid value '{}'".format(value)): commands.config_dict_add('aliases', 'missingkey', value) @@ -373,14 +373,14 @@ class TestRemove: def test_list_remove_non_list(self, commands): with pytest.raises( - cmdexc.CommandError, + cmdutils.CommandError, match=":config-list-remove can only be used for lists"): commands.config_list_remove('content.javascript.enabled', 'never') def test_list_remove_no_value(self, commands): with pytest.raises( - cmdexc.CommandError, + cmdutils.CommandError, match="never is not in colors.completion.fg!"): commands.config_list_remove('colors.completion.fg', 'never') @@ -398,14 +398,14 @@ class TestRemove: def test_dict_remove_non_dict(self, commands): with pytest.raises( - cmdexc.CommandError, + cmdutils.CommandError, match=":config-dict-remove can only be used for dicts"): commands.config_dict_remove('content.javascript.enabled', 'never') def test_dict_remove_no_value(self, commands): with pytest.raises( - cmdexc.CommandError, + cmdutils.CommandError, match="never is not in aliases!"): commands.config_dict_remove('aliases', 'never') @@ -425,7 +425,7 @@ class TestUnsetAndClear: assert yaml_value(name) == ('never' if temp else configutils.UNSET) def test_unset_unknown_option(self, commands): - with pytest.raises(cmdexc.CommandError, match="No option 'tabs'"): + with pytest.raises(cmdutils.CommandError, match="No option 'tabs'"): commands.config_unset('tabs') @pytest.mark.parametrize('save', [True, False]) @@ -472,7 +472,7 @@ class TestSource: pyfile = config_tmpdir / 'config.py' pyfile.write_text('c.foo = 42', encoding='utf-8') - with pytest.raises(cmdexc.CommandError) as excinfo: + with pytest.raises(cmdutils.CommandError) as excinfo: commands.config_source() expected = ("Errors occurred while reading config.py:\n" @@ -483,7 +483,7 @@ class TestSource: pyfile = config_tmpdir / 'config.py' pyfile.write_text('1/0', encoding='utf-8') - with pytest.raises(cmdexc.CommandError) as excinfo: + with pytest.raises(cmdutils.CommandError) as excinfo: commands.config_source() expected = ("Errors occurred while reading config.py:\n" @@ -582,7 +582,7 @@ class TestWritePy: confpy = tmpdir / 'config.py' confpy.ensure() - with pytest.raises(cmdexc.CommandError) as excinfo: + with pytest.raises(cmdutils.CommandError) as excinfo: commands.config_write_py(str(confpy)) expected = " already exists - use --force to overwrite!" @@ -599,7 +599,7 @@ class TestWritePy: def test_oserror(self, commands, tmpdir): """Test writing to a directory which does not exist.""" - with pytest.raises(cmdexc.CommandError): + with pytest.raises(cmdutils.CommandError): commands.config_write_py(str(tmpdir / 'foo' / 'config.py')) @@ -709,7 +709,7 @@ class TestBind: elif command == 'unbind': func = commands.unbind - with pytest.raises(cmdexc.CommandError, match=expected): + with pytest.raises(cmdutils.CommandError, match=expected): func(*args, **kwargs) @pytest.mark.parametrize('key', ['a', 'b', '']) diff --git a/tests/unit/misc/test_utilcmds.py b/tests/unit/misc/test_utilcmds.py index cfa115412..73f97095f 100644 --- a/tests/unit/misc/test_utilcmds.py +++ b/tests/unit/misc/test_utilcmds.py @@ -28,7 +28,7 @@ import pytest from PyQt5.QtCore import QUrl from qutebrowser.misc import utilcmds -from qutebrowser.commands import cmdexc +from qutebrowser.api import cmdutils from qutebrowser.utils import utils, objreg @@ -83,14 +83,14 @@ def test_debug_trace_exception(mocker): hunter_mock = mocker.patch('qutebrowser.misc.utilcmds.hunter') hunter_mock.trace.side_effect = _mock_exception - with pytest.raises(cmdexc.CommandError, match='Exception: message'): + with pytest.raises(cmdutils.CommandError, match='Exception: message'): utilcmds.debug_trace() def test_debug_trace_no_hunter(monkeypatch): """Test that an error is shown if debug_trace is called without hunter.""" monkeypatch.setattr(utilcmds, 'hunter', None) - with pytest.raises(cmdexc.CommandError, match="You need to install " + with pytest.raises(cmdutils.CommandError, match="You need to install " "'hunter' to use this command!"): utilcmds.debug_trace() @@ -103,7 +103,7 @@ def test_repeat_command_initial(mocker, mode_manager): """ objreg_mock = mocker.patch('qutebrowser.misc.utilcmds.objreg') objreg_mock.get.return_value = mode_manager - with pytest.raises(cmdexc.CommandError, + with pytest.raises(cmdutils.CommandError, match="You didn't do anything yet."): utilcmds.repeat_command(win_id=0) diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index 26b063456..1c1efffab 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -27,7 +27,7 @@ from PyQt5.QtCore import QUrl from PyQt5.QtNetwork import QNetworkProxy import pytest -from qutebrowser.commands import cmdexc +from qutebrowser.api import cmdutils from qutebrowser.browser.network import pac from qutebrowser.utils import utils, urlutils, qtutils, usertypes from helpers import utils as testutils @@ -495,7 +495,7 @@ def test_raise_cmdexc_if_invalid(url, valid, has_err_string): expected_text = "Invalid URL - " + qurl.errorString() else: expected_text = "Invalid URL" - with pytest.raises(cmdexc.CommandError, match=expected_text): + with pytest.raises(cmdutils.CommandError, match=expected_text): urlutils.raise_cmdexc_if_invalid(qurl) From 6ccba16b728898e2a8aa2026303cc06627d58636 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:02:03 +0100 Subject: [PATCH 200/492] Fix coverage --- qutebrowser/misc/objects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/misc/objects.py b/qutebrowser/misc/objects.py index 0bb26954c..ccb5d09b3 100644 --- a/qutebrowser/misc/objects.py +++ b/qutebrowser/misc/objects.py @@ -25,7 +25,7 @@ import typing MYPY = False -if MYPY: +if MYPY: # pragma: no cover # pylint: disable=unused-import,useless-suppression from qutebrowser.utils import usertypes from qutebrowser.commands import command From c7179e35cc34a883e135aa5dc4a1b9907a1a87f4 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:02:36 +0100 Subject: [PATCH 201/492] Remove old code --- qutebrowser/browser/browsertab.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 1ced63fab..48d69b198 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -349,13 +349,6 @@ class AbstractZoom(QObject): config.instance.changed.connect(self._on_config_changed) self._zoom_factor = float(config.val.zoom.default) / 100 - # # FIXME:qtwebengine is this needed? - # # For some reason, this signal doesn't get disconnected automatically - # # when the WebView is destroyed on older PyQt versions. - # # See https://github.com/qutebrowser/qutebrowser/issues/390 - # self.destroyed.connect(functools.partial( - # cfg.changed.disconnect, self.init_neighborlist)) - @pyqtSlot(str) def _on_config_changed(self, option: str) -> None: if option in ['zoom.levels', 'zoom.default']: From 595e1527291e5fb094e7266facbfde5cc7c2dfc6 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:03:45 +0100 Subject: [PATCH 202/492] Remove AbstractAudio.toggle_muted --- qutebrowser/browser/browsertab.py | 3 --- qutebrowser/browser/commands.py | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 48d69b198..690c978ff 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -720,9 +720,6 @@ class AbstractAudio(QObject): """Whether this tab is muted.""" raise NotImplementedError - def toggle_muted(self, *, override: bool = False) -> None: - self.set_muted(not self.is_muted(), override=override) - def is_recently_audible(self) -> bool: """Whether this tab has had audio playing recently.""" raise NotImplementedError diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index df6906515..9ad5e0011 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -2267,6 +2267,6 @@ class CommandDispatcher: if tab is None: return try: - tab.audio.toggle_muted(override=True) + tab.audio.set_muted(tab.audio.is_muted(), override=True) except browsertab.WebTabError as e: raise cmdutils.CommandError(e) From c1b9318e7759bcf5a77c262f3115e7593b3e7e95 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:04:14 +0100 Subject: [PATCH 203/492] check_coverage: Add test_objects.py --- scripts/dev/check_coverage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/dev/check_coverage.py b/scripts/dev/check_coverage.py index 21ebd6557..8d0647b0d 100644 --- a/scripts/dev/check_coverage.py +++ b/scripts/dev/check_coverage.py @@ -113,7 +113,7 @@ PERFECT_FILES = [ 'misc/keyhintwidget.py'), ('tests/unit/misc/test_pastebin.py', 'misc/pastebin.py'), - (None, + ('tests/unit/misc/test_objects.py', 'misc/objects.py'), (None, From 4b7c60da9fc68de6d56123a250ef3f966c4fd348 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:07:13 +0100 Subject: [PATCH 204/492] Improve docstrings --- qutebrowser/browser/browsertab.py | 36 ++++++++++++++++--------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 690c978ff..1f2be1476 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -206,15 +206,31 @@ class AbstractPrinting: self._tab = tab def check_pdf_support(self) -> bool: + """Check whether writing to PDFs is supported. + + If it's not supported (by the current Qt version), a WebTabError is + raised. + """ raise NotImplementedError def check_printer_support(self) -> bool: + """Check whether writing to a printer is supported. + + If it's not supported (by the current Qt version), a WebTabError is + raised. + """ raise NotImplementedError def check_preview_support(self) -> bool: + """Check whether showing a print preview is supported. + + If it's not supported (by the current Qt version), a WebTabError is + raised. + """ raise NotImplementedError def to_pdf(self, filename: str) -> bool: + """Print the tab to a PDF with the given filename.""" raise NotImplementedError def to_printer(self, printer: QPrinter, @@ -668,6 +684,7 @@ class AbstractElements: Args: callback: The callback to be called when the search finished. + Called with a WebEngineElement or None. elem_id: The ID to search for. """ raise NotImplementedError @@ -717,7 +734,6 @@ class AbstractAudio(QObject): raise NotImplementedError def is_muted(self) -> bool: - """Whether this tab is muted.""" raise NotImplementedError def is_recently_audible(self) -> bool: @@ -788,21 +804,7 @@ class AbstractTabPrivate: class AbstractTab(QWidget): - """A wrapper over the given widget to hide its API and expose another one. - - We use this to unify QWebView and QWebEngineView. - - Attributes: - history: The AbstractHistory for the current tab. - registry: The ObjectRegistry associated with this tab. - is_private: Whether private browsing is turned on for this tab. - - _load_status: loading status of this page - Accessible via load_status() method. - _has_ssl_errors: Whether SSL errors happened. - Needs to be set by subclasses. - - for properties, see WebView/WebEngineView docs. + """An adapter for QWebView/QWebEngineView representing a single tab. Signals: See related Qt signals. @@ -902,7 +904,7 @@ class AbstractTab(QWidget): """Send the given event to the underlying widget. The event will be sent via QApplication.postEvent. - Note that a posted event may not be re-used in any way! + Note that a posted event must not be re-used in any way! """ # This only gives us some mild protection against re-using events, but # it's certainly better than a segfault. From f81c5b7eab3b757dfdc51caf519f829a8570289e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:09:41 +0100 Subject: [PATCH 205/492] Move common key_press implementation --- qutebrowser/browser/browsertab.py | 8 ++++++-- qutebrowser/browser/webengine/webenginetab.py | 9 +-------- qutebrowser/browser/webkit/webkittab.py | 9 +-------- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 1f2be1476..9ad233c68 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -26,7 +26,7 @@ import typing import attr from PyQt5.QtCore import (pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt, QEvent, QPoint) -from PyQt5.QtGui import QIcon +from PyQt5.QtGui import QKeyEvent, QIcon from PyQt5.QtWidgets import QWidget, QApplication, QDialog from PyQt5.QtPrintSupport import QPrintDialog, QPrinter from PyQt5.QtNetwork import QNetworkAccessManager @@ -1041,7 +1041,11 @@ class AbstractTab(QWidget): key: Qt.Key, modifier: Qt.KeyboardModifier = Qt.NoModifier) -> None: """Send a fake key event to this tab.""" - raise NotImplementedError + press_evt = QKeyEvent(QEvent.KeyPress, key, modifier, 0, 0, 0) + release_evt = QKeyEvent(QEvent.KeyRelease, key, modifier, + 0, 0, 0) + self.send_event(press_evt) + self.send_event(release_evt) def dump_async(self, callback: typing.Callable[[str], None], *, diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 63f1201da..e04a28652 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -26,7 +26,7 @@ import html as html_utils from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QEvent, QPoint, QPointF, QUrl, QTimer, QObject) -from PyQt5.QtGui import QKeyEvent, QIcon +from PyQt5.QtGui import QIcon from PyQt5.QtNetwork import QAuthenticator from PyQt5.QtWidgets import QApplication from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineScript @@ -1193,13 +1193,6 @@ class WebEngineTab(browsertab.AbstractTab): # percent encoded content is 2 megabytes minus 30 bytes. self._widget.setHtml(html, base_url) - def key_press(self, key, modifier=Qt.NoModifier): - press_evt = QKeyEvent(QEvent.KeyPress, key, modifier, 0, 0, 0) - release_evt = QKeyEvent(QEvent.KeyRelease, key, modifier, - 0, 0, 0) - self.send_event(press_evt) - self.send_event(release_evt) - def _show_error_page(self, url, error): """Show an error page in the tab.""" log.misc.debug("Showing error page for {}".format(error)) diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index dcac1a3cb..7f1b8783a 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -25,7 +25,7 @@ import xml.etree.ElementTree from PyQt5.QtCore import (pyqtSlot, Qt, QEvent, QUrl, QPoint, QTimer, QSizeF, QSize) -from PyQt5.QtGui import QKeyEvent, QIcon +from PyQt5.QtGui import QIcon from PyQt5.QtWebKitWidgets import QWebPage, QWebFrame from PyQt5.QtWebKit import QWebSettings from PyQt5.QtPrintSupport import QPrinter @@ -755,13 +755,6 @@ class WebKitTab(browsertab.AbstractTab): def title(self): return self._widget.title() - def key_press(self, key, modifier=Qt.NoModifier): - press_evt = QKeyEvent(QEvent.KeyPress, key, modifier, 0, 0, 0) - release_evt = QKeyEvent(QEvent.KeyRelease, key, modifier, - 0, 0, 0) - self.send_event(press_evt) - self.send_event(release_evt) - @pyqtSlot() def _on_history_trigger(self): url = self.url() From 609b8f1cee6ee5229aee81deced1dc8b43314ba2 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:10:47 +0100 Subject: [PATCH 206/492] Fix return values of AbstractPrinting.check_*_support --- qutebrowser/browser/browsertab.py | 6 +++--- qutebrowser/browser/webengine/webenginetab.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 9ad233c68..bed403bfb 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -205,7 +205,7 @@ class AbstractPrinting: self._widget = None self._tab = tab - def check_pdf_support(self) -> bool: + def check_pdf_support(self) -> None: """Check whether writing to PDFs is supported. If it's not supported (by the current Qt version), a WebTabError is @@ -213,7 +213,7 @@ class AbstractPrinting: """ raise NotImplementedError - def check_printer_support(self) -> bool: + def check_printer_support(self) -> None: """Check whether writing to a printer is supported. If it's not supported (by the current Qt version), a WebTabError is @@ -221,7 +221,7 @@ class AbstractPrinting: """ raise NotImplementedError - def check_preview_support(self) -> bool: + def check_preview_support(self) -> None: """Check whether showing a print preview is supported. If it's not supported (by the current Qt version), a WebTabError is diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index e04a28652..4d8db5537 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -132,7 +132,7 @@ class WebEnginePrinting(browsertab.AbstractPrinting): """QtWebEngine implementations related to printing.""" def check_pdf_support(self): - return True + pass def check_printer_support(self): if not hasattr(self._widget.page(), 'print'): From cd8e3094b9f1df9e5d932d8ba3c1fd7bb5d3ccb0 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:22:28 +0100 Subject: [PATCH 207/492] Avoid circular import --- qutebrowser/browser/browsertab.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index bed403bfb..4c26f91a9 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -40,12 +40,13 @@ from qutebrowser.config import config from qutebrowser.utils import (utils, objreg, usertypes, log, qtutils, urlutils, message) from qutebrowser.misc import miscwidgets, objects -from qutebrowser.browser import mouse, hints, webelem +from qutebrowser.browser import mouse, hints from qutebrowser.qt import sip MYPY = False if MYPY: # pylint can't interpret type comments with Python 3.7 # pylint: disable=unused-import,useless-suppression + from qutebrowser.browser import webelem from qutebrowser.browser.inspector import AbstractWebInspector @@ -656,9 +657,9 @@ class AbstractElements: """Finding and handling of elements on the page.""" _MultiCallback = typing.Callable[ - [typing.Sequence[webelem.AbstractWebElement]], None] + [typing.Sequence['webelem.AbstractWebElement']], None] _SingleCallback = typing.Callable[ - [typing.Optional[webelem.AbstractWebElement]], None] + [typing.Optional['webelem.AbstractWebElement']], None] def __init__(self, tab: 'AbstractTab') -> None: self._widget = None @@ -768,7 +769,7 @@ class AbstractTabPrivate: if cur_mode == usertypes.KeyMode.insert: return - def _auto_insert_mode_cb(elem: webelem.AbstractWebElement) -> None: + def _auto_insert_mode_cb(elem: 'webelem.AbstractWebElement') -> None: """Called from JS after finding the focused element.""" if elem is None: log.webview.debug("No focused element!") From 73e196ff65106690d235c1e69a90ec5503776b35 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:23:14 +0100 Subject: [PATCH 208/492] Make url(requested=True) a keyword-only arg --- qutebrowser/browser/browsertab.py | 2 +- qutebrowser/browser/webengine/webenginetab.py | 2 +- tests/helpers/stubs.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 4c26f91a9..ed07bd27c 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -1015,7 +1015,7 @@ class AbstractTab(QWidget): self._progress = perc self.load_progress.emit(perc) - def url(self, requested: bool = False) -> QUrl: + def url(self, *, requested: bool = False) -> QUrl: raise NotImplementedError def progress(self) -> int: diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 4d8db5537..ecbbd0ab0 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1139,7 +1139,7 @@ class WebEngineTab(browsertab.AbstractTab): self._openurl_prepare(url, predict=predict) self._widget.load(url) - def url(self, requested=False): + def url(self, *, requested=False): page = self._widget.page() if requested: return page.requestedUrl() diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 4abd58baf..0c2119132 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -268,7 +268,7 @@ class FakeWebTab(browsertab.AbstractTab): wrapped = QWidget() self._layout.wrap(self, wrapped) - def url(self, requested=False): + def url(self, *, requested=False): assert not requested return self._url From b2796d4a85920f9c7463c4f7c2ec6d1f2ce5e0c4 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:26:05 +0100 Subject: [PATCH 209/492] Rename some AbstractZoom methods --- qutebrowser/browser/browsertab.py | 10 +++++----- qutebrowser/browser/commands.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index ed07bd27c..2fb247a39 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -381,7 +381,7 @@ class AbstractZoom(QObject): levels, mode=usertypes.NeighborList.Modes.edge) self._neighborlist.fuzzyval = config.val.zoom.default - def offset(self, offset: int) -> None: + def apply_offset(self, offset: int) -> None: """Increase/Decrease the zoom level by the given offset. Args: @@ -418,10 +418,10 @@ class AbstractZoom(QObject): def factor(self) -> float: return self._zoom_factor - def set_default(self) -> None: + def apply_default(self) -> None: self._set_factor_internal(float(config.val.zoom.default) / 100) - def set_current(self) -> None: + def reapply(self) -> None: self._set_factor_internal(self._zoom_factor) @@ -888,7 +888,7 @@ class AbstractTab(QWidget): self.settings._settings = widget.settings() self._install_event_filter() - self.zoom.set_default() + self.zoom.apply_default() def _install_event_filter(self) -> None: raise NotImplementedError @@ -1003,7 +1003,7 @@ class AbstractTab(QWidget): if not self.title(): self.title_changed.emit(self.url().toDisplayString()) - self.zoom.set_current() + self.zoom.reapply() @pyqtSlot() def _on_history_trigger(self) -> None: diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 9ad5e0011..56a951a9f 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -901,7 +901,7 @@ class CommandDispatcher: """ tab = self._current_widget() try: - perc = tab.zoom.offset(count) + perc = tab.zoom.apply_offset(count) except ValueError as e: raise cmdutils.CommandError(e) if not quiet: @@ -918,7 +918,7 @@ class CommandDispatcher: """ tab = self._current_widget() try: - perc = tab.zoom.offset(-count) + perc = tab.zoom.apply_offset(-count) except ValueError as e: raise cmdutils.CommandError(e) if not quiet: From 7a3d1b021282bab24d010a7d10f62051fbffee46 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:28:11 +0100 Subject: [PATCH 210/492] AbstractHistory: Check count --- qutebrowser/browser/browsertab.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 2fb247a39..ad5f42ab2 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -606,11 +606,17 @@ class AbstractHistory: def __iter__(self) -> typing.Iterable: raise NotImplementedError + def _check_count(self, count: int) -> None: + """Check whether the count is positive.""" + if count < 0: + raise WebTabError("count needs to be positive!") + def current_idx(self) -> int: raise NotImplementedError def back(self, count: int = 1) -> None: """Go back in the tab's history.""" + self._check_count(count) idx = self.current_idx() - count if idx >= 0: self._go_to_item(self._item_at(idx)) @@ -620,6 +626,7 @@ class AbstractHistory: def forward(self, count: int = 1) -> None: """Go forward in the tab's history.""" + self._check_count(count) idx = self.current_idx() + count if idx < len(self): self._go_to_item(self._item_at(idx)) From 2cd2c60a8b02a0fb2093003bfea14e1771f28112 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:30:28 +0100 Subject: [PATCH 211/492] Rename key_press to fake_key_press --- qutebrowser/browser/browsertab.py | 10 +++++----- qutebrowser/browser/webengine/webenginetab.py | 6 +++--- qutebrowser/browser/webkit/webkittab.py | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index ad5f42ab2..3b39e52d1 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -512,9 +512,9 @@ class AbstractCaret(QObject): def _follow_enter(self, tab: bool) -> None: """Follow a link by faking an enter press.""" if tab: - self._tab.key_press(Qt.Key_Enter, modifier=Qt.ControlModifier) + self._tab.fake_key_press(Qt.Key_Enter, modifier=Qt.ControlModifier) else: - self._tab.key_press(Qt.Key_Enter) + self._tab.fake_key_press(Qt.Key_Enter) def follow_selected(self, *, tab: bool = False) -> None: raise NotImplementedError @@ -1045,9 +1045,9 @@ class AbstractTab(QWidget): def stop(self) -> None: raise NotImplementedError - def key_press(self, - key: Qt.Key, - modifier: Qt.KeyboardModifier = Qt.NoModifier) -> None: + def fake_key_press(self, + key: Qt.Key, + modifier: Qt.KeyboardModifier = Qt.NoModifier) -> None: """Send a fake key event to this tab.""" press_evt = QKeyEvent(QEvent.KeyPress, key, modifier, 0, 0, 0) release_evt = QKeyEvent(QEvent.KeyRelease, key, modifier, diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index ecbbd0ab0..453b36974 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -423,7 +423,7 @@ class WebEngineScroller(browsertab.AbstractScroller): def _repeated_key_press(self, key, count=1, modifier=Qt.NoModifier): """Send count fake key presses to this scroller's WebEngineTab.""" for _ in range(min(count, 1000)): - self._tab.key_press(key, modifier) + self._tab.fake_key_press(key, modifier) @pyqtSlot(QPointF) def _update_pos(self, pos): @@ -500,10 +500,10 @@ class WebEngineScroller(browsertab.AbstractScroller): self._repeated_key_press(Qt.Key_Right, count) def top(self): - self._tab.key_press(Qt.Key_Home) + self._tab.fake_key_press(Qt.Key_Home) def bottom(self): - self._tab.key_press(Qt.Key_End) + self._tab.fake_key_press(Qt.Key_End) def page_up(self, count=1): self._repeated_key_press(Qt.Key_PageUp, count) diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 7f1b8783a..2c7083c25 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -474,7 +474,7 @@ class WebKitScroller(browsertab.AbstractScroller): if (getter is not None and frame.scrollBarValue(direction) == getter(direction)): return - self._tab.key_press(key) + self._tab.fake_key_press(key) def up(self, count=1): self._key_press(Qt.Key_Up, count, 'scrollBarMinimum', Qt.Vertical) From a6d3a935d3595a6965985fa9d0ce5301095748bc Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:38:12 +0100 Subject: [PATCH 212/492] Use an enum for IgnoreCase --- doc/help/settings.asciidoc | 3 ++- qutebrowser/browser/browsertab.py | 12 +++++----- qutebrowser/browser/webengine/webenginetab.py | 4 ++-- qutebrowser/browser/webkit/webkittab.py | 4 ++-- qutebrowser/config/configdata.yml | 7 +----- qutebrowser/config/configtypes.py | 23 ++++++++++++++++++- qutebrowser/utils/usertypes.py | 3 +++ 7 files changed, 38 insertions(+), 18 deletions(-) diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index b7cb0349b..7da6e543e 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -2960,7 +2960,7 @@ Default: +pass:[false]+ === search.ignore_case When to find text on a page case-insensitively. -Type: <> +Type: <> Valid values: @@ -3624,6 +3624,7 @@ Lists with duplicate flags are invalid. Each item is checked against the valid v |FontFamily|A Qt font family. |FormatString|A string with placeholders. |FuzzyUrl|A URL which gets interpreted as search if needed. +|IgnoreCase|Whether to search case insensitively. |Int|Base class for an integer setting. |Key|A name of a key. |List|A list of values. diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 3b39e52d1..0625b218e 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -297,7 +297,7 @@ class AbstractSearch(QObject): self.text = None # type: typing.Optional[str] self.search_displayed = False - def _is_case_sensitive(self, ignore_case: str) -> bool: + def _is_case_sensitive(self, ignore_case: usertypes.IgnoreCase) -> bool: """Check if case-sensitivity should be used. This assumes self.text is already set properly. @@ -307,21 +307,21 @@ class AbstractSearch(QObject): """ assert self.text is not None mapping = { - 'smart': not self.text.islower(), - 'never': True, - 'always': False, + usertypes.IgnoreCase.smart: not self.text.islower(), + usertypes.IgnoreCase.never: True, + usertypes.IgnoreCase.always: False, } return mapping[ignore_case] def search(self, text: str, *, - ignore_case: str = 'never', + ignore_case: usertypes.IgnoreCase = usertypes.IgnoreCase.never, reverse: bool = False, result_cb: _Callback = None) -> None: """Find the given text on the page. Args: text: The text to search for. - ignore_case: Search case-insensitively. ('always'/'never/'smart') + ignore_case: Search case-insensitively. reverse: Reverse search direction. result_cb: Called with a bool indicating whether a match was found. """ diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 453b36974..fd380abae 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -205,8 +205,8 @@ class WebEngineSearch(browsertab.AbstractSearch): self._widget.findText(text, flags, wrapped_callback) - def search(self, text, *, ignore_case='never', reverse=False, - result_cb=None): + def search(self, text, *, ignore_case=usertypes.IgnoreCase.never, + reverse=False, result_cb=None): # Don't go to next entry on duplicate search if self.text == text and self.search_displayed: log.webview.debug("Ignoring duplicate search request" diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 2c7083c25..44dc76f9d 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -125,8 +125,8 @@ class WebKitSearch(browsertab.AbstractSearch): self._widget.findText('') self._widget.findText('', QWebPage.HighlightAllOccurrences) - def search(self, text, *, ignore_case='never', reverse=False, - result_cb=None): + def search(self, text, *, ignore_case=usertypes.IgnoreCase.never, + reverse=False, result_cb=None): # Don't go to next entry on duplicate search if self.text == text and self.search_displayed: log.webview.debug("Ignoring duplicate search request" diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index ff43cc156..bed4d9659 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -39,12 +39,7 @@ ignore_case: renamed: search.ignore_case search.ignore_case: - type: - name: String - valid_values: - - always: Search case-insensitively. - - never: Search case-sensitively. - - smart: Search case-sensitively if there are capital characters. + type: IgnoreCase default: smart desc: When to find text on a page case-insensitively. diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index 691584801..c0f3bec9f 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -62,7 +62,8 @@ from PyQt5.QtWidgets import QTabWidget, QTabBar from qutebrowser.misc import objects from qutebrowser.config import configexc, configutils -from qutebrowser.utils import standarddir, utils, qtutils, urlutils, urlmatch +from qutebrowser.utils import (standarddir, utils, qtutils, urlutils, urlmatch, + usertypes) from qutebrowser.keyinput import keyutils @@ -911,6 +912,26 @@ class ColorSystem(MappingType): } +class IgnoreCase(MappingType): + + """Whether to search case insensitively.""" + + def __init__(self, none_ok=False): + super().__init__( + none_ok, + valid_values=ValidValues( + ('always', "Search case-insensitively."), + ('never', "Search case-sensitively."), + ('smart', ("Search case-sensitively if there are capital " + "characters.")))), + + MAPPING = { + 'always': usertypes.IgnoreCase.always, + 'never': usertypes.IgnoreCase.never, + 'smart': usertypes.IgnoreCase.smart, + } + + class QtColor(BaseType): """A color value. diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index cd36db49a..5bb8d3aa9 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -253,6 +253,9 @@ JsLogLevel = enum.Enum('JsLogLevel', ['unknown', 'info', 'warning', 'error']) MessageLevel = enum.Enum('MessageLevel', ['error', 'warning', 'info']) +IgnoreCase = enum.Enum('IgnoreCase', ['smart', 'never', 'always']) + + class Question(QObject): """A question asked to the user, e.g. via the status bar. From 0104490978f6ad42617ece83b001f55fd804267a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 19:44:48 +0100 Subject: [PATCH 213/492] Use enum values for load_status_changed --- qutebrowser/browser/browsertab.py | 4 ++-- qutebrowser/mainwindow/statusbar/url.py | 11 +++++------ qutebrowser/mainwindow/tabbedbrowser.py | 2 +- tests/unit/mainwindow/statusbar/test_url.py | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 0625b218e..a53828af3 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -837,7 +837,7 @@ class AbstractTab(QWidget): load_finished = pyqtSignal(bool) icon_changed = pyqtSignal(QIcon) title_changed = pyqtSignal(str) - load_status_changed = pyqtSignal(str) + load_status_changed = pyqtSignal(usertypes.LoadStatus) new_tab_requested = pyqtSignal(QUrl) url_changed = pyqtSignal(QUrl) shutting_down = pyqtSignal() @@ -906,7 +906,7 @@ class AbstractTab(QWidget): raise TypeError("Type {} is no LoadStatus member!".format(val)) log.webview.debug("load status for {}: {}".format(repr(self), val)) self._load_status = val - self.load_status_changed.emit(val.name) + self.load_status_changed.emit(val) def send_event(self, evt: QEvent) -> None: """Send the given event to the underlying widget. diff --git a/qutebrowser/mainwindow/statusbar/url.py b/qutebrowser/mainwindow/statusbar/url.py index fda09d642..8ac258465 100644 --- a/qutebrowser/mainwindow/statusbar/url.py +++ b/qutebrowser/mainwindow/statusbar/url.py @@ -112,19 +112,18 @@ class UrlText(textbase.TextBase): self._urltype = UrlType.normal config.set_register_stylesheet(self, update=False) - @pyqtSlot(str) - def on_load_status_changed(self, status_str): + @pyqtSlot(usertypes.LoadStatus) + def on_load_status_changed(self, status): """Slot for load_status_changed. Sets URL color accordingly. Args: - status_str: The LoadStatus as string. + status: The usertypes.LoadStatus. """ - status = usertypes.LoadStatus[status_str] if status in [usertypes.LoadStatus.success, usertypes.LoadStatus.success_https, usertypes.LoadStatus.error, usertypes.LoadStatus.warn]: - self._normal_url_type = UrlType[status_str] + self._normal_url_type = UrlType[status.name] else: self._normal_url_type = UrlType.normal self._update_url() @@ -172,5 +171,5 @@ class UrlText(textbase.TextBase): self._normal_url = urlutils.safe_display_string(tab.url()) else: self._normal_url = '' - self.on_load_status_changed(tab.load_status().name) + self.on_load_status_changed(tab.load_status()) self._update_url() diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index d00d5d797..5530b0e37 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -102,7 +102,7 @@ class TabbedBrowser(QWidget): cur_url_changed = pyqtSignal(QUrl) cur_link_hovered = pyqtSignal(str) cur_scroll_perc_changed = pyqtSignal(int, int) - cur_load_status_changed = pyqtSignal(str) + cur_load_status_changed = pyqtSignal(usertypes.LoadStatus) cur_fullscreen_requested = pyqtSignal(bool) cur_caret_selection_toggled = pyqtSignal(bool) close_window = pyqtSignal() diff --git a/tests/unit/mainwindow/statusbar/test_url.py b/tests/unit/mainwindow/statusbar/test_url.py index bda51b504..801a71f0a 100644 --- a/tests/unit/mainwindow/statusbar/test_url.py +++ b/tests/unit/mainwindow/statusbar/test_url.py @@ -89,7 +89,7 @@ def test_set_url(url_widget, url_text, expected, which): def test_on_load_status_changed(url_widget, status, expected): """Test text when status is changed.""" url_widget.set_url(QUrl('www.example.com')) - url_widget.on_load_status_changed(status.name) + url_widget.on_load_status_changed(status) assert url_widget._urltype == expected @@ -139,7 +139,7 @@ def test_on_tab_changed(url_widget, fake_web_tab, load_status, qurl): ]) def test_normal_url(url_widget, qurl, load_status, expected_status): url_widget.set_url(qurl) - url_widget.on_load_status_changed(load_status.name) + url_widget.on_load_status_changed(load_status) url_widget.set_hover_url(qurl.toDisplayString()) url_widget.set_hover_url("") assert url_widget.text() == qurl.toDisplayString() From 27ee3280b2a04db3fc8b6a1b661aa69a6fb90872 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Nov 2018 20:29:43 +0100 Subject: [PATCH 214/492] Separate success/error callbacks --- qutebrowser/browser/browsertab.py | 4 +++- qutebrowser/browser/hints.py | 14 +++++--------- qutebrowser/browser/navigate.py | 10 ++-------- qutebrowser/browser/webengine/webenginetab.py | 14 ++++++++------ qutebrowser/browser/webkit/webkittab.py | 6 ++++-- 5 files changed, 22 insertions(+), 26 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index a53828af3..175c1e60d 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -667,13 +667,15 @@ class AbstractElements: [typing.Sequence['webelem.AbstractWebElement']], None] _SingleCallback = typing.Callable[ [typing.Optional['webelem.AbstractWebElement']], None] + _ErrorCallback = typing.Callable[[Exception], None] def __init__(self, tab: 'AbstractTab') -> None: self._widget = None self._tab = tab def find_css(self, selector: str, - callback: _MultiCallback, *, + callback: _MultiCallback, + error_callback: _ErrorCallback, *, only_visible: bool = False) -> None: """Find all HTML elements matching a given selector async. diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 230437b40..31fd9b6a2 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -597,13 +597,6 @@ class HintManager(QObject): log.hints.debug("In _start_cb without context!") return - if elems is None: - message.error("Unknown error while getting hint elements.") - return - elif isinstance(elems, webelem.Error): - message.error(str(elems)) - return - if not elems: message.error("No elements found.") return @@ -747,8 +740,11 @@ class HintManager(QObject): except webelem.Error as e: raise cmdutils.CommandError(str(e)) - self._context.tab.elements.find_css(selector, self._start_cb, - only_visible=True) + self._context.tab.elements.find_css( + selector, + callback=self._start_cb, + error_cb=lambda err: message.error(str(err)), + only_visible=True) def _get_hint_mode(self, mode): """Get the hinting mode to use based on a mode argument.""" diff --git a/qutebrowser/browser/navigate.py b/qutebrowser/browser/navigate.py index 0f80775bd..515b023ae 100644 --- a/qutebrowser/browser/navigate.py +++ b/qutebrowser/browser/navigate.py @@ -116,13 +116,6 @@ def prevnext(*, browsertab, win_id, baseurl, prev=False, window: True to open in a new window, False for the current one. """ def _prevnext_cb(elems): - if elems is None: - message.error("Unknown error while getting hint elements") - return - elif isinstance(elems, webelem.Error): - message.error(str(elems)) - return - elem = _find_prevnext(prev, elems) word = 'prev' if prev else 'forward' @@ -155,4 +148,5 @@ def prevnext(*, browsertab, win_id, baseurl, prev=False, except webelem.Error as e: raise Error(str(e)) - browsertab.elements.find_css(link_selector, _prevnext_cb) + browsertab.elements.find_css(link_selector, callback=_prevnext_cb, + error_cb=lambda err: message.error(str(err))) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index fd380abae..f167b6b8c 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -591,19 +591,20 @@ class WebEngineElements(browsertab.AbstractElements): """QtWebEngine implemementations related to elements on the page.""" - def _js_cb_multiple(self, callback, js_elems): + def _js_cb_multiple(self, callback, error_cb, js_elems): """Handle found elements coming from JS and call the real callback. Args: callback: The callback to call with the found elements. - Called with None if there was an error. + error_cb: The callback to call in case of an error. js_elems: The elements serialized from javascript. """ if js_elems is None: - callback(None) + error_cb(webelem.Error("Unknown error while getting " + "elements")) return elif not js_elems['success']: - callback(webelem.Error(js_elems['error'])) + error_cb(webelem.Error(js_elems['error'])) return elems = [] @@ -630,10 +631,11 @@ class WebEngineElements(browsertab.AbstractElements): elem = webengineelem.WebEngineElement(js_elem, tab=self._tab) callback(elem) - def find_css(self, selector, callback, *, only_visible=False): + def find_css(self, selector, callback, error_cb, *, + only_visible=False): js_code = javascript.assemble('webelem', 'find_css', selector, only_visible) - js_cb = functools.partial(self._js_cb_multiple, callback) + js_cb = functools.partial(self._js_cb_multiple, callback, error_cb) self._tab.run_js_async(js_code, js_cb) def find_id(self, elem_id, callback): diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 44dc76f9d..5a989e81e 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -563,7 +563,8 @@ class WebKitElements(browsertab.AbstractElements): """QtWebKit implemementations related to elements on the page.""" - def find_css(self, selector, callback, *, only_visible=False): + def find_css(self, selector, callback, error_cb, *, only_visible=False): + utils.unused(error_cb) mainframe = self._widget.page().mainFrame() if mainframe is None: raise browsertab.WebTabError("No frame focused!") @@ -592,7 +593,8 @@ class WebKitElements(browsertab.AbstractElements): # Escape non-alphanumeric characters in the selector # https://www.w3.org/TR/CSS2/syndata.html#value-def-identifier elem_id = re.sub(r'[^a-zA-Z0-9_-]', r'\\\g<0>', elem_id) - self.find_css('#' + elem_id, find_id_cb) + self.find_css('#' + elem_id, find_id_cb, + error_callback=lambda exc: None) def find_focused(self, callback): frame = self._widget.page().currentFrame() From 5bf0dffa9558b7f0da5ba763bb87c5f380ff0261 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 08:23:52 +0100 Subject: [PATCH 215/492] Move history (de)serializing to a private_api object --- qutebrowser/browser/browsertab.py | 35 ++++++++---- qutebrowser/browser/commands.py | 4 +- qutebrowser/browser/webengine/webenginetab.py | 57 +++++++++++-------- qutebrowser/browser/webkit/webkittab.py | 57 +++++++++++-------- qutebrowser/mainwindow/tabbedbrowser.py | 4 +- qutebrowser/misc/sessions.py | 2 +- 6 files changed, 92 insertions(+), 67 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 175c1e60d..311843964 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -592,6 +592,27 @@ class AbstractScroller(QObject): raise NotImplementedError +class AbstractHistoryPrivate: + + """Private API related to the history.""" + + def __init__(self, tab: 'AbstractTab'): + self._tab = tab + self._history = None + + def serialize(self) -> bytes: + """Serialize into an opaque format understood by self.deserialize.""" + raise NotImplementedError + + def deserialize(self, data: bytes) -> None: + """Deserialize from a format produced by self.serialize.""" + raise NotImplementedError + + def load_items(self, items: typing.Sequence) -> None: + """Deserialize from a list of WebHistoryItems.""" + raise NotImplementedError + + class AbstractHistory: """The history attribute of a AbstractTab.""" @@ -599,6 +620,7 @@ class AbstractHistory: def __init__(self, tab: 'AbstractTab') -> None: self._tab = tab self._history = None + self.private_api = AbstractHistoryPrivate(tab) def __len__(self) -> int: raise NotImplementedError @@ -646,18 +668,6 @@ class AbstractHistory: def _go_to_item(self, item: typing.Any) -> None: raise NotImplementedError - def serialize(self) -> bytes: - """Serialize into an opaque format understood by self.deserialize.""" - raise NotImplementedError - - def deserialize(self, data: bytes) -> None: - """Deserialize from a format produced by self.serialize.""" - raise NotImplementedError - - def load_items(self, items: typing.Sequence) -> None: - """Deserialize from a list of WebHistoryItems.""" - raise NotImplementedError - class AbstractElements: @@ -885,6 +895,7 @@ class AbstractTab(QWidget): self._widget = widget self._layout.wrap(self, widget) self.history._history = widget.history() + self.history.private_api._history = widget.history() self.scroller._init_widget(widget) self.caret._widget = widget self.zoom._widget = widget diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 56a951a9f..01542cdea 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -463,7 +463,7 @@ class CommandDispatcher: cur_title = self._tabbed_browser.widget.page_title( self._current_index()) try: - history = curtab.history.serialize() + history = curtab.history.private_api.serialize() except browsertab.WebTabError as e: raise cmdutils.CommandError(e) @@ -486,7 +486,7 @@ class CommandDispatcher: new_tabbed_browser.widget.window().setWindowIcon(curtab.icon()) newtab.data.keep_icon = True - newtab.history.deserialize(history) + newtab.history.private_api.deserialize(history) newtab.zoom.set_factor(curtab.zoom.factor()) new_tabbed_browser.widget.set_tab_pinned(newtab, curtab.data.pinned) return newtab diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index f167b6b8c..fbd168fee 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -518,31 +518,7 @@ class WebEngineScroller(browsertab.AbstractScroller): return self._at_bottom -class WebEngineHistory(browsertab.AbstractHistory): - - """QtWebEngine implementations related to page history.""" - - def __len__(self): - return len(self._history) - - def __iter__(self): - return iter(self._history.items()) - - def current_idx(self): - return self._history.currentItemIndex() - - def can_go_back(self): - return self._history.canGoBack() - - def can_go_forward(self): - return self._history.canGoForward() - - def _item_at(self, i): - return self._history.itemAt(i) - - def _go_to_item(self, item): - self._tab.predicted_navigation.emit(item.url()) - self._history.goToItem(item) +class WebEngineHistoryPrivate(browsertab.AbstractHistoryPrivate): def serialize(self): if not qtutils.version_check('5.9', compiled=False): @@ -579,6 +555,37 @@ class WebEngineHistory(browsertab.AbstractHistory): self._tab.load_finished.connect(_on_load_finished) +class WebEngineHistory(browsertab.AbstractHistory): + + """QtWebEngine implementations related to page history.""" + + def __init__(self, tab): + super().__init__(tab) + self.private_api = WebEngineHistoryPrivate(tab) + + def __len__(self): + return len(self._history) + + def __iter__(self): + return iter(self._history.items()) + + def current_idx(self): + return self._history.currentItemIndex() + + def can_go_back(self): + return self._history.canGoBack() + + def can_go_forward(self): + return self._history.canGoForward() + + def _item_at(self, i): + return self._history.itemAt(i) + + def _go_to_item(self, item): + self._tab.predicted_navigation.emit(item.url()) + self._history.goToItem(item) + + class WebEngineZoom(browsertab.AbstractZoom): """QtWebEngine implementations related to zooming.""" diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 5a989e81e..df8abe254 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -509,31 +509,7 @@ class WebKitScroller(browsertab.AbstractScroller): return self.pos_px().y() >= frame.scrollBarMaximum(Qt.Vertical) -class WebKitHistory(browsertab.AbstractHistory): - - """QtWebKit implementations related to page history.""" - - def __len__(self): - return len(self._history) - - def __iter__(self): - return iter(self._history.items()) - - def current_idx(self): - return self._history.currentItemIndex() - - def can_go_back(self): - return self._history.canGoBack() - - def can_go_forward(self): - return self._history.canGoForward() - - def _item_at(self, i): - return self._history.itemAt(i) - - def _go_to_item(self, item): - self._tab.predicted_navigation.emit(item.url()) - self._history.goToItem(item) +class WebKitHistoryPrivate(browsertab.AbstractHistoryPrivate): def serialize(self): return qtutils.serialize(self._history) @@ -559,6 +535,37 @@ class WebKitHistory(browsertab.AbstractHistory): self._tab.scroller.to_point, cur_data['scroll-pos'])) +class WebKitHistory(browsertab.AbstractHistory): + + """QtWebKit implementations related to page history.""" + + def __init__(self, tab): + super().__init__(tab) + self.private_api = WebKitHistoryPrivate(tab) + + def __len__(self): + return len(self._history) + + def __iter__(self): + return iter(self._history.items()) + + def current_idx(self): + return self._history.currentItemIndex() + + def can_go_back(self): + return self._history.canGoBack() + + def can_go_forward(self): + return self._history.canGoForward() + + def _item_at(self, i): + return self._history.itemAt(i) + + def _go_to_item(self, item): + self._tab.predicted_navigation.emit(item.url()) + self._history.goToItem(item) + + class WebKitElements(browsertab.AbstractElements): """QtWebKit implemementations related to elements on the page.""" diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 5530b0e37..07a1122d3 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -345,7 +345,7 @@ class TabbedBrowser(QWidget): urlutils.invalid_url_error(tab.url(), "saving tab") elif add_undo: try: - history_data = tab.history.serialize() + history_data = tab.history.private_api.serialize() except browsertab.WebTabError: pass # special URL else: @@ -391,7 +391,7 @@ class TabbedBrowser(QWidget): else: newtab = self.tabopen(background=False, idx=entry.index) - newtab.history.deserialize(entry.history) + newtab.history.private_api.deserialize(entry.history) self.widget.set_tab_pinned(newtab, entry.pinned) @pyqtSlot('QUrl', bool) diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index 4f80ad2b0..357d5be64 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -401,7 +401,7 @@ class SessionManager(QObject): new_tab.title_changed.emit(histentry['title']) try: - new_tab.history.load_items(entries) + new_tab.history.private_api.load_items(entries) except ValueError as e: raise SessionError(e) From f6c36ccbee9328d261799f1c09e1341444a1e618 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 08:31:03 +0100 Subject: [PATCH 216/492] Rename openurl to load_url We still call the :open command openurl, but in the tab API and in TabbedBrowser it's now called load_url. --- qutebrowser/browser/browsertab.py | 2 +- qutebrowser/browser/commands.py | 6 +++--- qutebrowser/browser/navigate.py | 2 +- qutebrowser/browser/webengine/webenginetab.py | 8 ++++---- qutebrowser/browser/webkit/webkittab.py | 8 ++++---- qutebrowser/browser/webkit/webview.py | 8 -------- qutebrowser/config/configcommands.py | 4 ++-- qutebrowser/mainwindow/tabbedbrowser.py | 14 +++++++------- qutebrowser/misc/utilcmds.py | 4 ++-- tests/helpers/stubs.py | 8 ++++---- tests/unit/browser/test_caret.py | 2 +- tests/unit/browser/test_hints.py | 4 ++-- tests/unit/commands/test_argparser.py | 2 +- tests/unit/config/test_configcommands.py | 4 ++-- tests/unit/javascript/conftest.py | 2 +- tests/unit/misc/test_utilcmds.py | 2 +- 16 files changed, 36 insertions(+), 44 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 311843964..3f71fa074 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -1049,7 +1049,7 @@ class AbstractTab(QWidget): if predict: self.predicted_navigation.emit(url) - def openurl(self, url: QUrl, *, predict: bool = True) -> None: + def load_url(self, url: QUrl, *, predict: bool = True) -> None: raise NotImplementedError def reload(self, *, force: bool = False) -> None: diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 01542cdea..63c2da3b3 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -138,7 +138,7 @@ class CommandDispatcher: tabbed_browser.tabopen(url, background=True, related=related) else: widget = self._current_widget() - widget.openurl(url) + widget.load_url(url) def _cntwidget(self, count=None): """Return a widget based on a count/idx. @@ -321,7 +321,7 @@ class CommandDispatcher: elif curtab.data.pinned: message.info("Tab is pinned!") else: - curtab.openurl(cur_url) + curtab.load_url(cur_url) def _parse_url(self, url, *, force_search=False): """Parse a URL or quickmark or search query. @@ -1247,7 +1247,7 @@ class CommandDispatcher: if output: tb = objreg.get('tabbed-browser', scope='window', window='last-focused') - tb.openurl(QUrl('qute://spawn-output'), newtab=True) + tb.load_url(QUrl('qute://spawn-output'), newtab=True) if userscript: def _selection_callback(s): diff --git a/qutebrowser/browser/navigate.py b/qutebrowser/browser/navigate.py index 515b023ae..240878ed6 100644 --- a/qutebrowser/browser/navigate.py +++ b/qutebrowser/browser/navigate.py @@ -141,7 +141,7 @@ def prevnext(*, browsertab, win_id, baseurl, prev=False, elif tab: cur_tabbed_browser.tabopen(url, background=background) else: - browsertab.openurl(url) + browsertab.load_url(url) try: link_selector = webelem.css_selector('links', baseurl) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index fbd168fee..29c26aca5 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -478,7 +478,7 @@ class WebEngineScroller(browsertab.AbstractScroller): def to_anchor(self, name): url = self._tab.url() url.setFragment(name) - self._tab.openurl(url) + self._tab.load_url(url) def delta(self, x=0, y=0): self._tab.run_js_async(javascript.assemble('window', 'scrollBy', x, y)) @@ -1134,11 +1134,11 @@ class WebEngineTab(browsertab.AbstractTab): self.zoom.set_factor(self._saved_zoom) self._saved_zoom = None - def openurl(self, url, *, predict=True): - """Open the given URL in this tab. + def load_url(self, url, *, predict=True): + """Load the given URL in this tab. Arguments: - url: The QUrl to open. + url: The QUrl to load. predict: If set to False, predicted_navigation is not emitted. """ if sip.isdeleted(self._widget): diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index df8abe254..d92c60609 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -391,7 +391,7 @@ class WebKitCaret(browsertab.AbstractCaret): if tab: self._tab.new_tab_requested.emit(url) else: - self._tab.openurl(url) + self._tab.load_url(url) def follow_selected(self, *, tab=False): try: @@ -722,9 +722,9 @@ class WebKitTab(browsertab.AbstractTab): settings = widget.settings() settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True) - def openurl(self, url, *, predict=True): + def load_url(self, url, *, predict=True): self._openurl_prepare(url, predict=predict) - self._widget.openurl(url) + self._widget.load(url) def url(self, requested=False): frame = self._widget.page().mainFrame() @@ -829,7 +829,7 @@ class WebKitTab(browsertab.AbstractTab): if (navigation.navigation_type == navigation.Type.link_clicked and target != usertypes.ClickTarget.normal): tab = shared.get_tab(self.win_id, target) - tab.openurl(navigation.url) + tab.load_url(navigation.url) self.data.open_target = usertypes.ClickTarget.normal navigation.accepted = False diff --git a/qutebrowser/browser/webkit/webview.py b/qutebrowser/browser/webkit/webview.py index 3d56366c3..8921e211c 100644 --- a/qutebrowser/browser/webkit/webview.py +++ b/qutebrowser/browser/webkit/webview.py @@ -118,14 +118,6 @@ class WebView(QWebView): self.stop() self.page().shutdown() - def openurl(self, url): - """Open a URL in the browser. - - Args: - url: The URL to load as QUrl - """ - self.load(url) - def createWindow(self, wintype): """Called by Qt when a page wants to create a new window. diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index 8587acc3f..74a381507 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -101,7 +101,7 @@ class ConfigCommands: if option is None: tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) - tabbed_browser.openurl(QUrl('qute://settings'), newtab=False) + tabbed_browser.load_url(QUrl('qute://settings'), newtab=False) return if option.endswith('!'): @@ -147,7 +147,7 @@ class ConfigCommands: if key is None: tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) - tabbed_browser.openurl(QUrl('qute://bindings'), newtab=True) + tabbed_browser.load_url(QUrl('qute://bindings'), newtab=True) return seq = self._parse_key(key) diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 07a1122d3..d33b13795 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -303,12 +303,12 @@ class TabbedBrowser(QWidget): if last_close == 'close': self.close_window.emit() elif last_close == 'blank': - self.openurl(QUrl('about:blank'), newtab=True) + self.load_url(QUrl('about:blank'), newtab=True) elif last_close == 'startpage': for url in config.val.url.start_pages: - self.openurl(url, newtab=True) + self.load_url(url, newtab=True) elif last_close == 'default-page': - self.openurl(config.val.url.default_page, newtab=True) + self.load_url(config.val.url.default_page, newtab=True) def _remove_tab(self, tab, *, add_undo=True, new_undo=True, crashed=False): """Remove a tab from the tab list and delete it properly. @@ -395,7 +395,7 @@ class TabbedBrowser(QWidget): self.widget.set_tab_pinned(newtab, entry.pinned) @pyqtSlot('QUrl', bool) - def openurl(self, url, newtab): + def load_url(self, url, newtab): """Open a URL, used as a slot. Args: @@ -406,7 +406,7 @@ class TabbedBrowser(QWidget): if newtab or self.widget.currentWidget() is None: self.tabopen(url, background=False) else: - self.widget.currentWidget().openurl(url) + self.widget.currentWidget().load_url(url) @pyqtSlot(int) def on_tab_close_requested(self, idx): @@ -483,7 +483,7 @@ class TabbedBrowser(QWidget): self.widget.insertTab(idx, tab, "") if url is not None: - tab.openurl(url) + tab.load_url(url) if background is None: background = config.val.tabs.background @@ -879,7 +879,7 @@ class TabbedBrowser(QWidget): self.cur_load_finished.disconnect(callback) tab.scroller.to_point(point) - self.openurl(url, newtab=False) + self.load_url(url, newtab=False) self.cur_load_finished.connect(callback) else: message.error("Mark {} is not set".format(key)) diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py index e78b6d9b7..761498e5f 100644 --- a/qutebrowser/misc/utilcmds.py +++ b/qutebrowser/misc/utilcmds.py @@ -271,7 +271,7 @@ def debug_pyeval(s, file=False, quiet=False): else: tabbed_browser = objreg.get('tabbed-browser', scope='window', window='last-focused') - tabbed_browser.openurl(QUrl('qute://pyeval'), newtab=True) + tabbed_browser.load_url(QUrl('qute://pyeval'), newtab=True) @cmdutils.register(debug=True) @@ -386,7 +386,7 @@ def version(win_id, paste=False): """ tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) - tabbed_browser.openurl(QUrl('qute://version'), newtab=True) + tabbed_browser.load_url(QUrl('qute://version'), newtab=True) if paste: pastebin_version() diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 0c2119132..89330ab64 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -492,7 +492,7 @@ class TabbedBrowserStub(QObject): super().__init__(parent) self.widget = TabWidgetStub() self.shutting_down = False - self.opened_url = None + self.loaded_url = None self.cur_url = None def on_tab_close_requested(self, idx): @@ -502,10 +502,10 @@ class TabbedBrowserStub(QObject): return self.widget.tabs def tabopen(self, url): - self.opened_url = url + self.loaded_url = url - def openurl(self, url, *, newtab): - self.opened_url = url + def load_url(self, url, *, newtab): + self.loaded_url = url def current_url(self): if self.current_url is None: diff --git a/tests/unit/browser/test_caret.py b/tests/unit/browser/test_caret.py index 6165546e5..b3706ffca 100644 --- a/tests/unit/browser/test_caret.py +++ b/tests/unit/browser/test_caret.py @@ -30,7 +30,7 @@ from qutebrowser.utils import usertypes, qtutils @pytest.fixture def caret(web_tab, qtbot, mode_manager): with qtbot.wait_signal(web_tab.load_finished): - web_tab.openurl(QUrl('qute://testdata/data/caret.html')) + web_tab.load_url(QUrl('qute://testdata/data/caret.html')) mode_manager.enter(usertypes.KeyMode.caret) diff --git a/tests/unit/browser/test_hints.py b/tests/unit/browser/test_hints.py index 5c2758d84..609fb3dc6 100644 --- a/tests/unit/browser/test_hints.py +++ b/tests/unit/browser/test_hints.py @@ -56,7 +56,7 @@ def test_show_benchmark(benchmark, tabbed_browser, qtbot, message_bridge, tab = tabbed_browser.widget.tabs[0] with qtbot.wait_signal(tab.load_finished): - tab.openurl(QUrl('qute://testdata/data/hints/benchmark.html')) + tab.load_url(QUrl('qute://testdata/data/hints/benchmark.html')) manager = qutebrowser.browser.hints.HintManager(0, 0) @@ -76,7 +76,7 @@ def test_match_benchmark(benchmark, tabbed_browser, qtbot, message_bridge, tab = tabbed_browser.widget.tabs[0] with qtbot.wait_signal(tab.load_finished): - tab.openurl(QUrl('qute://testdata/data/hints/benchmark.html')) + tab.load_url(QUrl('qute://testdata/data/hints/benchmark.html')) manager = qutebrowser.browser.hints.HintManager(0, 0) diff --git a/tests/unit/commands/test_argparser.py b/tests/unit/commands/test_argparser.py index 624306ded..0b6afc210 100644 --- a/tests/unit/commands/test_argparser.py +++ b/tests/unit/commands/test_argparser.py @@ -60,7 +60,7 @@ class TestArgumentParser: parser.parse_args(['--help']) expected_url = QUrl('qute://help/commands.html#foo') - assert tabbed_browser_stubs[1].opened_url == expected_url + assert tabbed_browser_stubs[1].loaded_url == expected_url @pytest.mark.parametrize('types, value, expected', [ diff --git a/tests/unit/config/test_configcommands.py b/tests/unit/config/test_configcommands.py index 001d55899..209d8db44 100644 --- a/tests/unit/config/test_configcommands.py +++ b/tests/unit/config/test_configcommands.py @@ -59,7 +59,7 @@ class TestSet: Should open qute://settings.""" commands.set(win_id=0) - assert tabbed_browser_stubs[0].opened_url == QUrl('qute://settings') + assert tabbed_browser_stubs[0].loaded_url == QUrl('qute://settings') @pytest.mark.parametrize('option', ['url.auto_search?', 'url.auto_search']) def test_get(self, config_stub, commands, message_mock, option): @@ -620,7 +620,7 @@ class TestBind: config_stub.val.bindings.default = no_bindings config_stub.val.bindings.commands = no_bindings commands.bind(win_id=0) - assert tabbed_browser_stubs[0].opened_url == QUrl('qute://bindings') + assert tabbed_browser_stubs[0].loaded_url == QUrl('qute://bindings') @pytest.mark.parametrize('command', ['nop', 'nope']) def test_bind(self, commands, config_stub, no_bindings, key_config_stub, diff --git a/tests/unit/javascript/conftest.py b/tests/unit/javascript/conftest.py index 2078513b4..486839237 100644 --- a/tests/unit/javascript/conftest.py +++ b/tests/unit/javascript/conftest.py @@ -86,7 +86,7 @@ class JSTester: """ with self.qtbot.waitSignal(self.tab.load_finished, timeout=2000) as blocker: - self.tab.openurl(url) + self.tab.load_url(url) if not force: assert blocker.args == [True] diff --git a/tests/unit/misc/test_utilcmds.py b/tests/unit/misc/test_utilcmds.py index 73f97095f..b4af06aff 100644 --- a/tests/unit/misc/test_utilcmds.py +++ b/tests/unit/misc/test_utilcmds.py @@ -155,4 +155,4 @@ def tabbed_browser(stubs, win_registry): def test_version(tabbed_browser, qapp): utilcmds.version(win_id=0) - assert tabbed_browser.opened_url == QUrl('qute://version') + assert tabbed_browser.loaded_url == QUrl('qute://version') From 6a27cd4e1571e8e2b85e2baaf43099e31b2ce85b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 08:35:56 +0100 Subject: [PATCH 217/492] fixup --- qutebrowser/browser/webengine/webenginetab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 29c26aca5..aa5b37aa8 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1366,7 +1366,7 @@ class WebEngineTab(browsertab.AbstractTab): log.config.debug( "Loading {} again because of config change".format( self._reload_url.toDisplayString())) - QTimer.singleShot(100, functools.partial(self.openurl, + QTimer.singleShot(100, functools.partial(self.load_url, self._reload_url, predict=False)) self._reload_url = None From da5527f5eff6a5a7b090f5b0aa5130b6dce294fa Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 08:37:29 +0100 Subject: [PATCH 218/492] Rename predicted_navigation --- qutebrowser/browser/browsertab.py | 20 +++++++++------- qutebrowser/browser/webengine/webenginetab.py | 24 ++++++++++--------- qutebrowser/browser/webkit/webkittab.py | 9 +++---- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 3f71fa074..ffc6c4db1 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -839,7 +839,7 @@ class AbstractTab(QWidget): process terminated. arg 0: A TerminationStatus member. arg 1: The exit code. - predicted_navigation: Emitted before we tell Qt to open a URL. + before_load_started: Emitted before we tell Qt to open a URL. """ window_close_requested = pyqtSignal() @@ -857,7 +857,7 @@ class AbstractTab(QWidget): add_history_item = pyqtSignal(QUrl, QUrl, str) # url, requested url, title fullscreen_requested = pyqtSignal(bool) renderer_process_terminated = pyqtSignal(TerminationStatus, int) - predicted_navigation = pyqtSignal(QUrl) + before_load_started = pyqtSignal(QUrl) def __init__(self, *, win_id: int, private: bool, parent: QWidget = None) -> None: @@ -888,7 +888,7 @@ class AbstractTab(QWidget): objreg.register('hintmanager', hintmanager, scope='tab', window=self.win_id, tab=self.tab_id) - self.predicted_navigation.connect(self._on_predicted_navigation) + self.before_load_started.connect(self._on_before_load_started) def _set_widget(self, widget: QWidget) -> None: # pylint: disable=protected-access @@ -943,11 +943,11 @@ class AbstractTab(QWidget): QApplication.postEvent(recipient, evt) @pyqtSlot(QUrl) - def _on_predicted_navigation(self, url: QUrl) -> None: + def _on_before_load_started(self, url: QUrl) -> None: """Adjust the title if we are going to visit a URL soon.""" qtutils.ensure_valid(url) url_string = url.toDisplayString() - log.webview.debug("Predicted navigation: {}".format(url_string)) + log.webview.debug("Going to start loading: {}".format(url_string)) self.title_changed.emit(url_string) @pyqtSlot(QUrl) @@ -1044,12 +1044,14 @@ class AbstractTab(QWidget): def load_status(self) -> usertypes.LoadStatus: return self._load_status - def _openurl_prepare(self, url: QUrl, *, predict: bool = True) -> None: + def _openurl_prepare(self, url: QUrl, *, + emit_before_load_started: bool = True) -> None: qtutils.ensure_valid(url) - if predict: - self.predicted_navigation.emit(url) + if emit_before_load_started: + self.before_load_started.emit(url) - def load_url(self, url: QUrl, *, predict: bool = True) -> None: + def load_url(self, url: QUrl, *, + emit_before_load_started: bool = True) -> None: raise NotImplementedError def reload(self, *, force: bool = False) -> None: diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index aa5b37aa8..98e3c1402 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -537,7 +537,7 @@ class WebEngineHistoryPrivate(browsertab.AbstractHistoryPrivate): def load_items(self, items): if items: - self._tab.predicted_navigation.emit(items[-1].url) + self._tab.before_load_started.emit(items[-1].url) stream, _data, cur_data = tabhistory.serialize(items) qtutils.deserialize_stream(stream, self._history) @@ -582,7 +582,7 @@ class WebEngineHistory(browsertab.AbstractHistory): return self._history.itemAt(i) def _go_to_item(self, item): - self._tab.predicted_navigation.emit(item.url()) + self._tab.before_load_started.emit(item.url()) self._history.goToItem(item) @@ -1134,18 +1134,20 @@ class WebEngineTab(browsertab.AbstractTab): self.zoom.set_factor(self._saved_zoom) self._saved_zoom = None - def load_url(self, url, *, predict=True): + def load_url(self, url, *, emit_before_load_started=True): """Load the given URL in this tab. Arguments: url: The QUrl to load. - predict: If set to False, predicted_navigation is not emitted. + emit_before_load_started: If set to False, before_load_started is + not emitted. """ if sip.isdeleted(self._widget): # https://github.com/qutebrowser/qutebrowser/issues/3896 return self._saved_zoom = self.zoom.factor() - self._openurl_prepare(url, predict=predict) + self._openurl_prepare( + url, emit_before_load_started=emit_before_load_started) self._widget.load(url) def url(self, *, requested=False): @@ -1366,9 +1368,9 @@ class WebEngineTab(browsertab.AbstractTab): log.config.debug( "Loading {} again because of config change".format( self._reload_url.toDisplayString())) - QTimer.singleShot(100, functools.partial(self.load_url, - self._reload_url, - predict=False)) + QTimer.singleShot(100, functools.partial( + self.load_url, self._reload_url, + emit_before_load_started=False)) self._reload_url = None if not qtutils.version_check('5.10', compiled=False): @@ -1407,12 +1409,12 @@ class WebEngineTab(browsertab.AbstractTab): self._show_error_page(url, str(error)) @pyqtSlot(QUrl) - def _on_predicted_navigation(self, url): + def _on_before_load_started(self, url): """If we know we're going to visit a URL soon, change the settings. This is a WORKAROUND for https://bugreports.qt.io/browse/QTBUG-66656 """ - super()._on_predicted_navigation(url) + super()._on_before_load_started(url) if not qtutils.version_check('5.11.1', compiled=False): self.settings.update_for_url(url) @@ -1490,7 +1492,7 @@ class WebEngineTab(browsertab.AbstractTab): page.loadFinished.connect(self._restore_zoom) page.loadFinished.connect(self._on_load_finished) - self.predicted_navigation.connect(self._on_predicted_navigation) + self.before_load_started.connect(self._on_before_load_started) # pylint: disable=protected-access self.audio._connect_signals() diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index d92c60609..3c853814a 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -519,7 +519,7 @@ class WebKitHistoryPrivate(browsertab.AbstractHistoryPrivate): def load_items(self, items): if items: - self._tab.predicted_navigation.emit(items[-1].url) + self._tab.before_load_started.emit(items[-1].url) stream, _data, user_data = tabhistory.serialize(items) qtutils.deserialize_stream(stream, self._history) @@ -562,7 +562,7 @@ class WebKitHistory(browsertab.AbstractHistory): return self._history.itemAt(i) def _go_to_item(self, item): - self._tab.predicted_navigation.emit(item.url()) + self._tab.before_load_started.emit(item.url()) self._history.goToItem(item) @@ -722,8 +722,9 @@ class WebKitTab(browsertab.AbstractTab): settings = widget.settings() settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True) - def load_url(self, url, *, predict=True): - self._openurl_prepare(url, predict=predict) + def load_url(self, url, *, emit_before_load_started=True): + self._openurl_prepare( + url, emit_before_load_started=emit_before_load_started) self._widget.load(url) def url(self, requested=False): From a7f7607b4d6cac5670a04373aa505f9c15767a11 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 08:38:11 +0100 Subject: [PATCH 219/492] Rename _openurl_prepare --- qutebrowser/browser/browsertab.py | 4 ++-- qutebrowser/browser/webengine/webenginetab.py | 2 +- qutebrowser/browser/webkit/webkittab.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index ffc6c4db1..5054f384f 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -1044,8 +1044,8 @@ class AbstractTab(QWidget): def load_status(self) -> usertypes.LoadStatus: return self._load_status - def _openurl_prepare(self, url: QUrl, *, - emit_before_load_started: bool = True) -> None: + def _load_url_prepare(self, url: QUrl, *, + emit_before_load_started: bool = True) -> None: qtutils.ensure_valid(url) if emit_before_load_started: self.before_load_started.emit(url) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 98e3c1402..053c6f50e 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1146,7 +1146,7 @@ class WebEngineTab(browsertab.AbstractTab): # https://github.com/qutebrowser/qutebrowser/issues/3896 return self._saved_zoom = self.zoom.factor() - self._openurl_prepare( + self._load_url_prepare( url, emit_before_load_started=emit_before_load_started) self._widget.load(url) diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 3c853814a..a934f600d 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -723,7 +723,7 @@ class WebKitTab(browsertab.AbstractTab): settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True) def load_url(self, url, *, emit_before_load_started=True): - self._openurl_prepare( + self._load_url_prepare( url, emit_before_load_started=emit_before_load_started) self._widget.load(url) From 5199681b417e07bb46e9650a2d9833141dab8232 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 08:45:45 +0100 Subject: [PATCH 220/492] Rename add_history_item --- qutebrowser/browser/browsertab.py | 5 +++-- qutebrowser/browser/webengine/webenginetab.py | 2 +- qutebrowser/browser/webkit/webkittab.py | 2 +- qutebrowser/mainwindow/tabbedbrowser.py | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 5054f384f..885d5d3f9 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -854,7 +854,8 @@ class AbstractTab(QWidget): url_changed = pyqtSignal(QUrl) shutting_down = pyqtSignal() contents_size_changed = pyqtSignal(QSizeF) - add_history_item = pyqtSignal(QUrl, QUrl, str) # url, requested url, title + # url, requested url, title + history_item_triggered = pyqtSignal(QUrl, QUrl, str) fullscreen_requested = pyqtSignal(bool) renderer_process_terminated = pyqtSignal(TerminationStatus, int) before_load_started = pyqtSignal(QUrl) @@ -1027,7 +1028,7 @@ class AbstractTab(QWidget): @pyqtSlot() def _on_history_trigger(self) -> None: - """Emit add_history_item when triggered by backend-specific signal.""" + """Emit history_item_triggered based on backend-specific signal.""" raise NotImplementedError @pyqtSlot(int) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 053c6f50e..cf1649ed6 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1240,7 +1240,7 @@ class WebEngineTab(browsertab.AbstractTab): log.misc.debug("Ignoring invalid URL being added to history") return - self.add_history_item.emit(url, requested_url, title) + self.history_item_triggered.emit(url, requested_url, title) @pyqtSlot(QUrl, 'QAuthenticator*', 'QString') def _on_proxy_authentication_required(self, url, authenticator, diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index a934f600d..d0ff650b5 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -769,7 +769,7 @@ class WebKitTab(browsertab.AbstractTab): def _on_history_trigger(self): url = self.url() requested_url = self.url(requested=True) - self.add_history_item.emit(url, requested_url, self.title()) + self.history_item_triggered.emit(url, requested_url, self.title()) def set_html(self, html, base_url=QUrl()): self._widget.setHtml(html, base_url) diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index d33b13795..9c6602224 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -245,7 +245,7 @@ class TabbedBrowser(QWidget): tab.new_tab_requested.connect(self.tabopen) if not self.is_private: web_history = objreg.get('web-history') - tab.add_history_item.connect(web_history.add_from_tab) + tab.history_item_triggered.connect(web_history.add_from_tab) def current_url(self): """Get the URL of the current tab. From e184ace8cb19effac80f196f54d4df445d9f503f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 08:55:15 +0100 Subject: [PATCH 221/492] Fix lint --- qutebrowser/browser/browsertab.py | 3 ++- qutebrowser/browser/webengine/webenginetab.py | 6 ++++-- qutebrowser/browser/webkit/webkittab.py | 10 +++++----- qutebrowser/config/configtypes.py | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 885d5d3f9..4bffbb796 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -685,7 +685,7 @@ class AbstractElements: def find_css(self, selector: str, callback: _MultiCallback, - error_callback: _ErrorCallback, *, + error_cb: _ErrorCallback, *, only_visible: bool = False) -> None: """Find all HTML elements matching a given selector async. @@ -694,6 +694,7 @@ class AbstractElements: Args: callback: The callback to be called when the search finished. + error_cb: The callback to be called when an error occurred. selector: The CSS selector to search for. only_visible: Only show elements which are visible on screen. """ diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index cf1649ed6..a74d866ea 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -24,8 +24,8 @@ import functools import re import html as html_utils -from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QEvent, QPoint, QPointF, - QUrl, QTimer, QObject) +from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QPoint, QPointF, QUrl, + QTimer, QObject) from PyQt5.QtGui import QIcon from PyQt5.QtNetwork import QAuthenticator from PyQt5.QtWidgets import QApplication @@ -520,6 +520,8 @@ class WebEngineScroller(browsertab.AbstractScroller): class WebEngineHistoryPrivate(browsertab.AbstractHistoryPrivate): + """History-related methods which are not part of the extension API.""" + def serialize(self): if not qtutils.version_check('5.9', compiled=False): # WORKAROUND for diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index d0ff650b5..c10c2aeec 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -23,8 +23,7 @@ import re import functools import xml.etree.ElementTree -from PyQt5.QtCore import (pyqtSlot, Qt, QEvent, QUrl, QPoint, QTimer, QSizeF, - QSize) +from PyQt5.QtCore import pyqtSlot, Qt, QUrl, QPoint, QTimer, QSizeF, QSize from PyQt5.QtGui import QIcon from PyQt5.QtWebKitWidgets import QWebPage, QWebFrame from PyQt5.QtWebKit import QWebSettings @@ -511,6 +510,8 @@ class WebKitScroller(browsertab.AbstractScroller): class WebKitHistoryPrivate(browsertab.AbstractHistoryPrivate): + """History-related methods which are not part of the extension API.""" + def serialize(self): return qtutils.serialize(self._history) @@ -600,8 +601,7 @@ class WebKitElements(browsertab.AbstractElements): # Escape non-alphanumeric characters in the selector # https://www.w3.org/TR/CSS2/syndata.html#value-def-identifier elem_id = re.sub(r'[^a-zA-Z0-9_-]', r'\\\g<0>', elem_id) - self.find_css('#' + elem_id, find_id_cb, - error_callback=lambda exc: None) + self.find_css('#' + elem_id, find_id_cb, error_cb=lambda exc: None) def find_focused(self, callback): frame = self._widget.page().currentFrame() @@ -727,7 +727,7 @@ class WebKitTab(browsertab.AbstractTab): url, emit_before_load_started=emit_before_load_started) self._widget.load(url) - def url(self, requested=False): + def url(self, *, requested=False): frame = self._widget.page().mainFrame() if requested: return frame.requestedUrl() diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index c0f3bec9f..d4ce33d21 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -923,7 +923,7 @@ class IgnoreCase(MappingType): ('always', "Search case-insensitively."), ('never', "Search case-sensitively."), ('smart', ("Search case-sensitively if there are capital " - "characters.")))), + "characters.")))) MAPPING = { 'always': usertypes.IgnoreCase.always, From 536a7ef1e65f0559137321467dddb7fe6bf15090 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 09:51:45 +0100 Subject: [PATCH 222/492] Move command registering to Command object --- qutebrowser/api/cmdutils.py | 8 ++------ qutebrowser/commands/command.py | 9 +++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/qutebrowser/api/cmdutils.py b/qutebrowser/api/cmdutils.py index a90471a35..f95e984ca 100644 --- a/qutebrowser/api/cmdutils.py +++ b/qutebrowser/api/cmdutils.py @@ -117,14 +117,10 @@ class register: # noqa: N801,N806 pylint: disable=invalid-name else: assert isinstance(self._name, str), self._name name = self._name - log.commands.vdebug( # type: ignore - "Registering command {} (from {}:{})" - .format(name, func.__module__, func.__qualname__)) - if name in objects.commands: - raise ValueError("{} is already registered!".format(name)) + cmd = command.Command(name=name, instance=self._instance, handler=func, **self._kwargs) - objects.commands[name] = cmd + cmd.register() return func diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 5c5ab1311..5422a9984 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -521,3 +521,12 @@ class Command: def takes_count(self): """Return true iff this command can take a count argument.""" return any(arg.count for arg in self._qute_args) + + def register(self): + """Register this command in objects.commands.""" + log.commands.vdebug( # type: ignore + "Registering command {} (from {}:{})".format( + self.name, self.handler.__module__, self.handler.__qualname__)) + if self.name in objects.commands: + raise ValueError("{} is already registered!".format(self.name)) + objects.commands[self.name] = self From 9c4ebb97d79eb62018a2b5a635f56123ad1cdb37 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 11:06:19 +0100 Subject: [PATCH 223/492] Fix refactoring issues --- qutebrowser/api/cmdutils.py | 3 +-- qutebrowser/commands/command.py | 2 +- tests/end2end/features/misc.feature | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/qutebrowser/api/cmdutils.py b/qutebrowser/api/cmdutils.py index f95e984ca..10acf9b4d 100644 --- a/qutebrowser/api/cmdutils.py +++ b/qutebrowser/api/cmdutils.py @@ -22,8 +22,7 @@ import inspect import typing -from qutebrowser.misc import objects -from qutebrowser.utils import qtutils, log +from qutebrowser.utils import qtutils from qutebrowser.commands import command, cmdexc diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 5422a9984..811bc78eb 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -524,7 +524,7 @@ class Command: def register(self): """Register this command in objects.commands.""" - log.commands.vdebug( # type: ignore + log.commands.vdebug( "Registering command {} (from {}:{})".format( self.name, self.handler.__module__, self.handler.__qualname__)) if self.name in objects.commands: diff --git a/tests/end2end/features/misc.feature b/tests/end2end/features/misc.feature index a8e81b7b5..b9677a158 100644 --- a/tests/end2end/features/misc.feature +++ b/tests/end2end/features/misc.feature @@ -197,7 +197,7 @@ Feature: Various utility commands. # We can't use "When I open" because we don't want to wait for load # finished When I run :open http://localhost:(port)/redirect-later?delay=-1 - And I wait for "emitting: cur_load_status_changed('loading') (tab *)" in the log + And I wait for "emitting: cur_load_status_changed() (tab *)" in the log And I wait 1s And I run :stop And I open redirect-later-continue in a new tab From b3fa43a97cca0d6831647f0edae59387aa1f4564 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 11:17:49 +0100 Subject: [PATCH 224/492] Fix broken test_on_tab_changed --- qutebrowser/mainwindow/statusbar/url.py | 1 + tests/unit/mainwindow/statusbar/test_url.py | 26 ++++++++++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/qutebrowser/mainwindow/statusbar/url.py b/qutebrowser/mainwindow/statusbar/url.py index 8ac258465..c6f436617 100644 --- a/qutebrowser/mainwindow/statusbar/url.py +++ b/qutebrowser/mainwindow/statusbar/url.py @@ -119,6 +119,7 @@ class UrlText(textbase.TextBase): Args: status: The usertypes.LoadStatus. """ + assert isinstance(status, usertypes.LoadStatus), status if status in [usertypes.LoadStatus.success, usertypes.LoadStatus.success_https, usertypes.LoadStatus.error, diff --git a/tests/unit/mainwindow/statusbar/test_url.py b/tests/unit/mainwindow/statusbar/test_url.py index 801a71f0a..7d06cb774 100644 --- a/tests/unit/mainwindow/statusbar/test_url.py +++ b/tests/unit/mainwindow/statusbar/test_url.py @@ -94,20 +94,28 @@ def test_on_load_status_changed(url_widget, status, expected): @pytest.mark.parametrize('load_status, qurl', [ - (url.UrlType.success, QUrl('http://abc123.com/this/awesome/url.html')), - (url.UrlType.success, QUrl('http://reddit.com/r/linux')), - (url.UrlType.success, QUrl('http://ä.com/')), - (url.UrlType.success_https, QUrl('www.google.com')), - (url.UrlType.success_https, QUrl('https://supersecret.gov/nsa/files.txt')), - (url.UrlType.warn, QUrl('www.shadysite.org/some/file/with/issues.htm')), - (url.UrlType.error, QUrl('invalid::/url')), - (url.UrlType.error, QUrl()), + (usertypes.LoadStatus.success, + QUrl('http://abc123.com/this/awesome/url.html')), + (usertypes.LoadStatus.success, + QUrl('http://reddit.com/r/linux')), + (usertypes.LoadStatus.success, + QUrl('http://ä.com/')), + (usertypes.LoadStatus.success_https, + QUrl('www.google.com')), + (usertypes.LoadStatus.success_https, + QUrl('https://supersecret.gov/nsa/files.txt')), + (usertypes.LoadStatus.warn, + QUrl('www.shadysite.org/some/file/with/issues.htm')), + (usertypes.LoadStatus.error, + QUrl('invalid::/url')), + (usertypes.LoadStatus.error, + QUrl()), ]) def test_on_tab_changed(url_widget, fake_web_tab, load_status, qurl): tab_widget = fake_web_tab(load_status=load_status, url=qurl) url_widget.on_tab_changed(tab_widget) - assert url_widget._urltype == load_status + assert url_widget._urltype.name == load_status.name if not qurl.isValid(): expected = '' else: From d549d4d5e2aff841150095b18681a75a10b36bbd Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 11:19:03 +0100 Subject: [PATCH 225/492] Fix test_configcommands --- tests/unit/config/test_configcommands.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/config/test_configcommands.py b/tests/unit/config/test_configcommands.py index 209d8db44..21c01ea5c 100644 --- a/tests/unit/config/test_configcommands.py +++ b/tests/unit/config/test_configcommands.py @@ -466,7 +466,8 @@ class TestSource: assert not config_stub.val.content.javascript.enabled ignore_case = config_stub.val.search.ignore_case - assert ignore_case == ('smart' if clear else 'always') + assert ignore_case == (usertypes.IgnoreCase.smart if clear + else usertypes.IgnoreCase.always) def test_errors(self, commands, config_tmpdir): pyfile = config_tmpdir / 'config.py' From 569bb0fa0989ae3a87d7725d2a19c9d746bf42d8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 12:45:01 +0100 Subject: [PATCH 226/492] Add cmdutils.Value instead of using count=True/win_id=True --- doc/contributing.asciidoc | 5 +- qutebrowser/api/cmdutils.py | 3 + qutebrowser/browser/commands.py | 76 ++++++++++----------- qutebrowser/browser/downloads.py | 10 +-- qutebrowser/commands/command.py | 42 ++++++------ qutebrowser/config/configcommands.py | 4 +- qutebrowser/keyinput/macros.py | 6 +- qutebrowser/mainwindow/statusbar/command.py | 2 +- qutebrowser/misc/sessions.py | 2 +- qutebrowser/misc/utilcmds.py | 20 +++--- qutebrowser/utils/usertypes.py | 8 +++ tests/unit/api/test_cmdutils.py | 40 ++++++++--- tests/unit/completion/test_completer.py | 4 +- 13 files changed, 128 insertions(+), 94 deletions(-) diff --git a/doc/contributing.asciidoc b/doc/contributing.asciidoc index 5f0e9bf9c..399633257 100644 --- a/doc/contributing.asciidoc +++ b/doc/contributing.asciidoc @@ -480,8 +480,9 @@ For `typing.Union` types, the given `choices` are only checked if other types The following arguments are supported for `@cmdutils.argument`: - `flag`: Customize the short flag (`-x`) the argument will get. -- `win_id=True`: Mark the argument as special window ID argument. -- `count=True`: Mark the argument as special count argument. +- `value`: Tell qutebrowser to fill the argument with special values: + - `value=cmdutils.Value.count`: The `count` given by the user to the command. + - `value=cmdutils.Value.win_id`: The window ID of the current window. - `completion`: A completion function (see `qutebrowser.completions.models.*`) to use when completing arguments for the given command. - `choices`: The allowed string choices for the argument. diff --git a/qutebrowser/api/cmdutils.py b/qutebrowser/api/cmdutils.py index 10acf9b4d..796c74eba 100644 --- a/qutebrowser/api/cmdutils.py +++ b/qutebrowser/api/cmdutils.py @@ -21,9 +21,12 @@ import inspect import typing +import enum from qutebrowser.utils import qtutils from qutebrowser.commands import command, cmdexc +# pylint: disable=unused-import +from qutebrowser.utils.usertypes import CommandValue as Value class CommandError(cmdexc.Error): diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 63c2da3b3..f4703850a 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -230,7 +230,7 @@ class CommandDispatcher: tabbar.setSelectionBehaviorOnRemove(old_selection_behavior) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def tab_close(self, prev=False, next_=False, opposite=False, force=False, count=None): """Close the current/[count]th tab. @@ -253,7 +253,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window', name='tab-pin') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def tab_pin(self, count=None): """Pin/Unpin the current/[count]th tab. @@ -274,7 +274,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', name='open', maxsplit=0, scope='window') @cmdutils.argument('url', completion=urlmodel.url) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def openurl(self, url=None, related=False, bg=False, tab=False, window=False, count=None, secure=False, private=False): @@ -372,7 +372,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', name='reload', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def reloadpage(self, force=False, count=None): """Reload the current/[count]th tab. @@ -385,7 +385,7 @@ class CommandDispatcher: tab.reload(force=force) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def stop(self, count=None): """Stop loading in the current/[count]th tab. @@ -423,7 +423,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', name='print', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) @cmdutils.argument('pdf', flag='f', metavar='file') def printpage(self, preview=False, count=None, *, pdf=None): """Print the current/[count]th tab. @@ -514,7 +514,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('win_id', completion=miscmodels.window) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def tab_give(self, win_id: int = None, keep: bool = False, count: int = None) -> None: """Give the current tab to a new or existing window if win_id given. @@ -575,7 +575,7 @@ class CommandDispatcher: raise cmdutils.CommandError(e) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def back(self, tab=False, bg=False, window=False, count=1): """Go back in the history of the current tab. @@ -588,7 +588,7 @@ class CommandDispatcher: self._back_forward(tab, bg, window, count, forward=False) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def forward(self, tab=False, bg=False, window=False, count=1): """Go forward in the history of the current tab. @@ -603,7 +603,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('where', choices=['prev', 'next', 'up', 'increment', 'decrement']) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def navigate(self, where: str, tab: bool = False, bg: bool = False, window: bool = False, count: int = 1) -> None: """Open typical prev/next links or navigate using the URL path. @@ -668,7 +668,7 @@ class CommandDispatcher: raise cmdutils.CommandError(e) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def scroll_px(self, dx: int, dy: int, count: int = 1) -> None: """Scroll the current tab by 'count * dx/dy' pixels. @@ -684,7 +684,7 @@ class CommandDispatcher: self._current_widget().scroller.delta(dx, dy) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def scroll(self, direction: str, count: int = 1) -> None: """Scroll the current tab in the given direction. @@ -721,7 +721,7 @@ class CommandDispatcher: func(count=count) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) @cmdutils.argument('horizontal', flag='x') def scroll_to_perc(self, perc: float = None, horizontal: bool = False, count: int = None) -> None: @@ -762,7 +762,7 @@ class CommandDispatcher: self._current_widget().scroller.to_anchor(name) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) @cmdutils.argument('top_navigate', metavar='ACTION', choices=('prev', 'decrement')) @cmdutils.argument('bottom_navigate', metavar='ACTION', @@ -891,7 +891,7 @@ class CommandDispatcher: maybe=True) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def zoom_in(self, count=1, quiet=False): """Increase the zoom level for the current tab. @@ -908,7 +908,7 @@ class CommandDispatcher: message.info("Zoom level: {}%".format(int(perc)), replace=True) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def zoom_out(self, count=1, quiet=False): """Decrease the zoom level for the current tab. @@ -925,7 +925,7 @@ class CommandDispatcher: message.info("Zoom level: {}%".format(int(perc)), replace=True) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def zoom(self, zoom=None, count=None, quiet=False): """Set the zoom level for the current tab. @@ -1005,7 +1005,7 @@ class CommandDispatcher: raise cmdutils.CommandError("Nothing to undo!") @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def tab_prev(self, count=1): """Switch to the previous tab, or switch [count] tabs back. @@ -1025,7 +1025,7 @@ class CommandDispatcher: log.webview.debug("First tab") @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def tab_next(self, count=1): """Switch to the next tab, or switch [count] tabs forward. @@ -1093,7 +1093,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window', maxsplit=0) @cmdutils.argument('index', completion=miscmodels.buffer) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def buffer(self, index=None, count=None): """Select tab by index or url/title best match. @@ -1123,7 +1123,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('index', choices=['last']) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def tab_focus(self, index: typing.Union[str, int] = None, count: int = None, no_last: bool = False) -> None: """Select the tab given as argument/[count]. @@ -1165,7 +1165,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('index', choices=['+', '-']) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def tab_move(self, index: typing.Union[str, int] = None, count: int = None) -> None: """Move the current tab according to the argument and [count]. @@ -1212,7 +1212,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window', maxsplit=0, no_replace_variables=True) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def spawn(self, cmdline, userscript=False, verbose=False, output=False, detach=False, count=None): """Spawn a command in a shell. @@ -1830,7 +1830,7 @@ class CommandDispatcher: tab.search.search(text, **options) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def search_next(self, count=1): """Continue the search to the ([count]th) next term. @@ -1864,7 +1864,7 @@ class CommandDispatcher: tab.search.next_result(result_cb=cb) @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def search_prev(self, count=1): """Continue the search to the ([count]th) previous term. @@ -1899,7 +1899,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_next_line(self, count=1): """Move the cursor or selection to the next line. @@ -1910,7 +1910,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_prev_line(self, count=1): """Move the cursor or selection to the prev line. @@ -1921,7 +1921,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_next_char(self, count=1): """Move the cursor or selection to the next char. @@ -1932,7 +1932,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_prev_char(self, count=1): """Move the cursor or selection to the previous char. @@ -1943,7 +1943,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_end_of_word(self, count=1): """Move the cursor or selection to the end of the word. @@ -1954,7 +1954,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_next_word(self, count=1): """Move the cursor or selection to the next word. @@ -1965,7 +1965,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_prev_word(self, count=1): """Move the cursor or selection to the previous word. @@ -1988,7 +1988,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_start_of_next_block(self, count=1): """Move the cursor or selection to the start of next block. @@ -1999,7 +1999,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_start_of_prev_block(self, count=1): """Move the cursor or selection to the start of previous block. @@ -2010,7 +2010,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_end_of_next_block(self, count=1): """Move the cursor or selection to the end of next block. @@ -2021,7 +2021,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_end_of_prev_block(self, count=1): """Move the cursor or selection to the end of previous block. @@ -2056,7 +2056,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window', debug=True) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def debug_webaction(self, action, count=1): """Execute a webaction. @@ -2256,7 +2256,7 @@ class CommandDispatcher: @cmdutils.register(instance='command-dispatcher', scope='window', name='tab-mute') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def tab_mute(self, count=None): """Mute/Unmute the current/[count]th tab. diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py index 6d9fa6c4e..b18e426d7 100644 --- a/qutebrowser/browser/downloads.py +++ b/qutebrowser/browser/downloads.py @@ -1013,7 +1013,7 @@ class DownloadModel(QAbstractListModel): raise cmdutils.CommandError("There's no download {}!".format(count)) @cmdutils.register(instance='download-model', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def download_cancel(self, all_=False, count=0): """Cancel the last/[count]th download. @@ -1039,7 +1039,7 @@ class DownloadModel(QAbstractListModel): download.cancel() @cmdutils.register(instance='download-model', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def download_delete(self, count=0): """Delete the last/[count]th download from disk. @@ -1060,7 +1060,7 @@ class DownloadModel(QAbstractListModel): log.downloads.debug("deleted download {}".format(download)) @cmdutils.register(instance='download-model', scope='window', maxsplit=0) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def download_open(self, cmdline: str = None, count: int = 0) -> None: """Open the last/[count]th download. @@ -1086,7 +1086,7 @@ class DownloadModel(QAbstractListModel): download.open_file(cmdline) @cmdutils.register(instance='download-model', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def download_retry(self, count=0): """Retry the first failed/[count]th download. @@ -1121,7 +1121,7 @@ class DownloadModel(QAbstractListModel): download.remove() @cmdutils.register(instance='download-model', scope='window') - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def download_remove(self, all_=False, count=0): """Remove the last/[count]th download from the list. diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 811bc78eb..a318897d5 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -37,18 +37,13 @@ class ArgInfo: """Information about an argument.""" - win_id = attr.ib(False) - count = attr.ib(False) + value = attr.ib(None) hide = attr.ib(False) metavar = attr.ib(None) flag = attr.ib(None) completion = attr.ib(None) choices = attr.ib(None) - def __attrs_post_init__(self): - if self.win_id and self.count: - raise TypeError("Argument marked as both count/win_id!") - class Command: @@ -116,7 +111,6 @@ class Command: self.parser.add_argument('-h', '--help', action=argparser.HelpAction, default=argparser.SUPPRESS, nargs=0, help=argparser.SUPPRESS) - self._check_func() self.opt_args = collections.OrderedDict() self.namespace = None self._count = None @@ -130,6 +124,7 @@ class Command: self._qute_args = getattr(self.handler, 'qute_args', {}) self.handler.qute_args = None + self._check_func() self._inspect_func() def _check_prerequisites(self, win_id): @@ -154,9 +149,14 @@ class Command: def _check_func(self): """Make sure the function parameters don't violate any rules.""" signature = inspect.signature(self.handler) - if 'self' in signature.parameters and self._instance is None: - raise TypeError("{} is a class method, but instance was not " - "given!".format(self.name[0])) + if 'self' in signature.parameters: + if self._instance is None: + raise TypeError("{} is a class method, but instance was not " + "given!".format(self.name[0])) + arg_info = self.get_arg_info(signature.parameters['self']) + if arg_info.value is not None: + raise TypeError("{}: Can't fill 'self' with value!" + .format(self.name)) elif 'self' not in signature.parameters and self._instance is not None: raise TypeError("{} is not a class method, but instance was " "given!".format(self.name[0])) @@ -186,13 +186,18 @@ class Command: True if the parameter is special, False otherwise. """ arg_info = self.get_arg_info(param) - if arg_info.count: + if arg_info.value is None: + return False + elif arg_info.value == usertypes.CommandValue.count: if param.default is inspect.Parameter.empty: raise TypeError("{}: handler has count parameter " "without default!".format(self.name)) return True - elif arg_info.win_id: + elif arg_info.value == usertypes.CommandValue.win_id: return True + else: + raise TypeError("{}: Invalid value={!r} for argument '{}'!" + .format(self.name, arg_info.value, param.name)) return False def _inspect_func(self): @@ -325,9 +330,8 @@ class Command: return param.annotation elif param.default not in [None, inspect.Parameter.empty]: return type(param.default) - elif arginfo.count or arginfo.win_id or param.kind in [ - inspect.Parameter.VAR_POSITIONAL, - inspect.Parameter.VAR_KEYWORD]: + elif arginfo.value or param.kind in [inspect.Parameter.VAR_POSITIONAL, + inspect.Parameter.VAR_KEYWORD]: return None else: return str @@ -447,15 +451,13 @@ class Command: # Special case for 'self'. self._get_self_arg(win_id, param, args) continue - elif arg_info.count: - # Special case for count parameter. + elif arg_info.value == usertypes.CommandValue.count: self._get_count_arg(param, args, kwargs) continue - # elif arg_info.win_id: - elif arg_info.win_id: - # Special case for win_id parameter. + elif arg_info.value == usertypes.CommandValue.win_id: self._get_win_id_arg(win_id, param, args, kwargs) continue + value = self._get_param_value(param) if param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD: args.append(value) diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index 74a381507..574bc06af 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -79,7 +79,7 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.option) @cmdutils.argument('value', completion=configmodel.value) - @cmdutils.argument('win_id', win_id=True) + @cmdutils.argument('win_id', value=cmdutils.Value.win_id) @cmdutils.argument('pattern', flag='u') def set(self, win_id, option=None, value=None, temp=False, print_=False, *, pattern=None): @@ -127,7 +127,7 @@ class ConfigCommands: @cmdutils.register(instance='config-commands', maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.argument('command', completion=configmodel.bind) - @cmdutils.argument('win_id', win_id=True) + @cmdutils.argument('win_id', value=cmdutils.Value.win_id) def bind(self, win_id, key=None, command=None, *, mode='normal', default=False): """Bind a key to a command. diff --git a/qutebrowser/keyinput/macros.py b/qutebrowser/keyinput/macros.py index bd17f5664..5bf1ab18b 100644 --- a/qutebrowser/keyinput/macros.py +++ b/qutebrowser/keyinput/macros.py @@ -45,7 +45,7 @@ class MacroRecorder: self._last_register = None @cmdutils.register(instance='macro-recorder', name='record-macro') - @cmdutils.argument('win_id', win_id=True) + @cmdutils.argument('win_id', value=cmdutils.Value.win_id) def record_macro_command(self, win_id, register=None): """Start or stop recording a macro. @@ -70,8 +70,8 @@ class MacroRecorder: self._recording_macro = register @cmdutils.register(instance='macro-recorder', name='run-macro') - @cmdutils.argument('win_id', win_id=True) - @cmdutils.argument('count', count=True) + @cmdutils.argument('win_id', value=cmdutils.Value.win_id) + @cmdutils.argument('count', value=cmdutils.Value.count) def run_macro_command(self, win_id, count=1, register=None): """Run a recorded macro. diff --git a/qutebrowser/mainwindow/statusbar/command.py b/qutebrowser/mainwindow/statusbar/command.py index de42cda4e..1661d2362 100644 --- a/qutebrowser/mainwindow/statusbar/command.py +++ b/qutebrowser/mainwindow/statusbar/command.py @@ -115,7 +115,7 @@ class Command(misc.MinimalLineEditMixin, misc.CommandLineEdit): @cmdutils.register(instance='status-command', name='set-cmd-text', scope='window', maxsplit=0) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def set_cmd_text_command(self, text, count=None, space=False, append=False, run_on_count=False): """Preset the statusbar to some text. diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index 357d5be64..2a557ef50 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -508,7 +508,7 @@ class SessionManager(QObject): @cmdutils.register(instance='session-manager') @cmdutils.argument('name', completion=miscmodels.session) - @cmdutils.argument('win_id', win_id=True) + @cmdutils.argument('win_id', value=cmdutils.Value.win_id) @cmdutils.argument('with_private', flag='p') def session_save(self, name: typing.Union[str, Sentinel] = default, current: bool = False, diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py index 761498e5f..287704551 100644 --- a/qutebrowser/misc/utilcmds.py +++ b/qutebrowser/misc/utilcmds.py @@ -44,7 +44,7 @@ from qutebrowser.qt import sip @cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True) -@cmdutils.argument('win_id', win_id=True) +@cmdutils.argument('win_id', value=cmdutils.Value.win_id) def later(ms: int, command: str, win_id: int) -> None: """Execute a command after some time. @@ -74,8 +74,8 @@ def later(ms: int, command: str, win_id: int) -> None: @cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True) -@cmdutils.argument('win_id', win_id=True) -@cmdutils.argument('count', count=True) +@cmdutils.argument('win_id', value=cmdutils.Value.win_id) +@cmdutils.argument('count', value=cmdutils.Value.count) def repeat(times: int, command: str, win_id: int, count: int = None) -> None: """Repeat a given command. @@ -95,8 +95,8 @@ def repeat(times: int, command: str, win_id: int, count: int = None) -> None: @cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True) -@cmdutils.argument('win_id', win_id=True) -@cmdutils.argument('count', count=True) +@cmdutils.argument('win_id', value=cmdutils.Value.win_id) +@cmdutils.argument('count', value=cmdutils.Value.count) def run_with_count(count_arg: int, command: str, win_id: int, count: int = 1) -> None: """Run a command with the given count. @@ -122,7 +122,7 @@ def message_error(text): @cmdutils.register() -@cmdutils.argument('count', count=True) +@cmdutils.argument('count', value=cmdutils.Value.count) def message_info(text, count=1): """Show an info message in the statusbar. @@ -288,8 +288,8 @@ def debug_set_fake_clipboard(s=None): @cmdutils.register() -@cmdutils.argument('win_id', win_id=True) -@cmdutils.argument('count', count=True) +@cmdutils.argument('win_id', value=cmdutils.Value.win_id) +@cmdutils.argument('count', value=cmdutils.Value.count) def repeat_command(win_id, count=None): """Repeat the last executed command. @@ -358,7 +358,7 @@ def debug_log_filter(filters: str) -> None: @cmdutils.register() -@cmdutils.argument('current_win_id', win_id=True) +@cmdutils.argument('current_win_id', value=cmdutils.Value.win_id) def window_only(current_win_id): """Close all windows except for the current one.""" for win_id, window in objreg.window_registry.items(): @@ -377,7 +377,7 @@ def nop(): @cmdutils.register() -@cmdutils.argument('win_id', win_id=True) +@cmdutils.argument('win_id', value=cmdutils.Value.win_id) def version(win_id, paste=False): """Show version information. diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index 5bb8d3aa9..d8f46ded8 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -256,6 +256,14 @@ MessageLevel = enum.Enum('MessageLevel', ['error', 'warning', 'info']) IgnoreCase = enum.Enum('IgnoreCase', ['smart', 'never', 'always']) +class CommandValue(enum.Enum): + + """Special values which are injected when running a command handler.""" + + count = 1 + win_id = 2 + + class Question(QObject): """A question asked to the user, e.g. via the status bar. diff --git a/tests/unit/api/test_cmdutils.py b/tests/unit/api/test_cmdutils.py index f2318ab46..5e1389c80 100644 --- a/tests/unit/api/test_cmdutils.py +++ b/tests/unit/api/test_cmdutils.py @@ -190,23 +190,39 @@ class TestRegister: def test_win_id(self): @cmdutils.register() - @cmdutils.argument('win_id', win_id=True) + @cmdutils.argument('win_id', value=cmdutils.Value.win_id) def fun(win_id): """Blah.""" assert objects.commands['fun']._get_call_args(42) == ([42], {}) def test_count(self): @cmdutils.register() - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def fun(count=0): """Blah.""" assert objects.commands['fun']._get_call_args(42) == ([0], {}) + def test_fill_self(self): + with pytest.raises(TypeError, match="fun: Can't fill 'self' with " + "value!"): + @cmdutils.register(instance='foobar') + @cmdutils.argument('self', value=cmdutils.Value.count) + def fun(self): + """Blah.""" + + def test_fill_invalid(self): + with pytest.raises(TypeError, match="fun: Invalid value='foo' for " + "argument 'arg'!"): + @cmdutils.register() + @cmdutils.argument('arg', value='foo') + def fun(arg): + """Blah.""" + def test_count_without_default(self): with pytest.raises(TypeError, match="fun: handler has count parameter " "without default!"): @cmdutils.register() - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def fun(count): """Blah.""" @@ -344,6 +360,17 @@ class TestArgument: } assert fun.qute_args == expected + def test_arginfo_boolean(self): + @cmdutils.argument('special1', value=cmdutils.Value.count) + @cmdutils.argument('special2', value=cmdutils.Value.win_id) + @cmdutils.argument('normal') + def fun(special1, special2, normal): + """Blah.""" + + assert fun.qute_args['special1'].value + assert fun.qute_args['special2'].value + assert not fun.qute_args['normal'].value + def test_wrong_order(self): """When @cmdutils.argument is used above (after) @register, fail.""" with pytest.raises(ValueError, match=r"@cmdutils.argument got called " @@ -353,13 +380,6 @@ class TestArgument: def fun(bar): """Blah.""" - def test_count_and_win_id_same_arg(self): - with pytest.raises(TypeError, - match="Argument marked as both count/win_id!"): - @cmdutils.argument('arg', count=True, win_id=True) - def fun(arg=0): - """Blah.""" - def test_no_docstring(self, caplog): with caplog.at_level(logging.WARNING): @cmdutils.register() diff --git a/tests/unit/completion/test_completer.py b/tests/unit/completion/test_completer.py index 16ebb95dc..224268c90 100644 --- a/tests/unit/completion/test_completer.py +++ b/tests/unit/completion/test_completer.py @@ -112,12 +112,12 @@ def cmdutils_patch(monkeypatch, stubs, miscmodels_patch): """docstring.""" @cmdutils.argument('url', completion=miscmodels_patch.url) - @cmdutils.argument('count', count=True) + @cmdutils.argument('count', value=cmdutils.Value.count) def openurl(url=None, related=False, bg=False, tab=False, window=False, count=None): """docstring.""" - @cmdutils.argument('win_id', win_id=True) + @cmdutils.argument('win_id', value=cmdutils.Value.win_id) @cmdutils.argument('command', completion=miscmodels_patch.command) def bind(key, win_id, command=None, *, mode='normal'): """docstring.""" From 8725ac6e667fe106edf446a5e61e282024ba32ac Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 12:49:57 +0100 Subject: [PATCH 227/492] Fix type of stack argument for utils.message --- qutebrowser/utils/message.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/qutebrowser/utils/message.py b/qutebrowser/utils/message.py index 9dc8d7411..035cc1c71 100644 --- a/qutebrowser/utils/message.py +++ b/qutebrowser/utils/message.py @@ -34,15 +34,10 @@ def _log_stack(typ, stack): Args: typ: The type of the message (str) - stack: The stack as an iterable of strings or a single string + stack: The stacktrace as a string. """ - try: - # traceback.format_exc() produces a list of strings, while - # traceback.format_stack() produces a single string... - stack = stack.splitlines() - except AttributeError: - pass - stack_text = '\n'.join(line.rstrip() for line in stack) + lines = stack.splitlines() + stack_text = '\n'.join(line.rstrip() for line in lines) log.message.debug("Stack for {} message:\n{}".format(typ, stack_text)) @@ -55,7 +50,7 @@ def error(message, *, stack=None, replace=False): replace: Replace existing messages with replace=True """ if stack is None: - stack = traceback.format_stack() + stack = ''.join(traceback.format_stack()) typ = 'error' else: typ = 'error (from exception)' @@ -71,7 +66,7 @@ def warning(message, *, replace=False): message: The message to show replace: Replace existing messages with replace=True """ - _log_stack('warning', traceback.format_stack()) + _log_stack('warning', ''.join(traceback.format_stack())) log.message.warning(message) global_bridge.show(usertypes.MessageLevel.warning, message, replace) From fe6f6273059f67a148e8fba405e221c1a3616821 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 12:51:26 +0100 Subject: [PATCH 228/492] Add partial type annotations for utils.message --- qutebrowser/utils/message.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/qutebrowser/utils/message.py b/qutebrowser/utils/message.py index 035cc1c71..b496273f8 100644 --- a/qutebrowser/utils/message.py +++ b/qutebrowser/utils/message.py @@ -29,19 +29,19 @@ from PyQt5.QtCore import pyqtSignal, QObject from qutebrowser.utils import usertypes, log, utils -def _log_stack(typ, stack): +def _log_stack(typ: str, stack: str) -> None: """Log the given message stacktrace. Args: - typ: The type of the message (str) - stack: The stacktrace as a string. + typ: The type of the message. + stack: An optional stacktrace. """ lines = stack.splitlines() stack_text = '\n'.join(line.rstrip() for line in lines) log.message.debug("Stack for {} message:\n{}".format(typ, stack_text)) -def error(message, *, stack=None, replace=False): +def error(message: str, *, stack: str = None, replace: bool = False) -> None: """Convenience function to display an error message in the statusbar. Args: @@ -59,7 +59,7 @@ def error(message, *, stack=None, replace=False): global_bridge.show(usertypes.MessageLevel.error, message, replace) -def warning(message, *, replace=False): +def warning(message: str, *, replace: bool = False) -> None: """Convenience function to display a warning message in the statusbar. Args: @@ -71,7 +71,7 @@ def warning(message, *, replace=False): global_bridge.show(usertypes.MessageLevel.warning, message, replace) -def info(message, *, replace=False): +def info(message: str, *, replace: bool = False) -> None: """Convenience function to display an info message in the statusbar. Args: From 566304ab4e0788c2fea03cb4300f40651a0f9429 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 12:51:54 +0100 Subject: [PATCH 229/492] Fix lint --- qutebrowser/api/cmdutils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/qutebrowser/api/cmdutils.py b/qutebrowser/api/cmdutils.py index 796c74eba..3a1814856 100644 --- a/qutebrowser/api/cmdutils.py +++ b/qutebrowser/api/cmdutils.py @@ -21,7 +21,6 @@ import inspect import typing -import enum from qutebrowser.utils import qtutils from qutebrowser.commands import command, cmdexc From 7a90340299457f53bab037bfdcb3d698facb6d55 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 12:59:21 +0100 Subject: [PATCH 230/492] Unify _get_count_arg/_get_win_id_arg --- qutebrowser/commands/command.py | 41 ++++++++++++--------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index a318897d5..cd7159878 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -358,39 +358,26 @@ class Command: tab=tab_id) args.append(obj) - def _get_count_arg(self, param, args, kwargs): - """Add the count argument to a function call. + def _add_special_arg(self, *, value, param, args, kwargs, optional=False): + """Add a special argument value to a function call. Arguments: - param: The count parameter. + value: The value to add. + param: The parameter being filled. args: The positional argument list. Gets modified directly. kwargs: The keyword argument dict. Gets modified directly. + optional: Whether the value can be optional. """ + if not optional: + assert value is not None if param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD: - if self._count is not None: - args.append(self._count) + if value is not None: + args.append(value) else: args.append(param.default) elif param.kind == inspect.Parameter.KEYWORD_ONLY: - if self._count is not None: - kwargs[param.name] = self._count - else: - raise TypeError("{}: invalid parameter type {} for argument " - "{!r}!".format(self.name, param.kind, param.name)) - - def _get_win_id_arg(self, win_id, param, args, kwargs): - """Add the win_id argument to a function call. - - Arguments: - win_id: The window ID to add. - param: The count parameter. - args: The positional argument list. Gets modified directly. - kwargs: The keyword argument dict. Gets modified directly. - """ - if param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD: - args.append(win_id) - elif param.kind == inspect.Parameter.KEYWORD_ONLY: - kwargs[param.name] = win_id + if value is not None: + kwargs[param.name] = value else: raise TypeError("{}: invalid parameter type {} for argument " "{!r}!".format(self.name, param.kind, param.name)) @@ -452,10 +439,12 @@ class Command: self._get_self_arg(win_id, param, args) continue elif arg_info.value == usertypes.CommandValue.count: - self._get_count_arg(param, args, kwargs) + self._add_special_arg(value=self._count, param=param, + args=args, kwargs=kwargs, optional=True) continue elif arg_info.value == usertypes.CommandValue.win_id: - self._get_win_id_arg(win_id, param, args, kwargs) + self._add_special_arg(value=win_id, param=param, + args=args, kwargs=kwargs) continue value = self._get_param_value(param) From 4e56d0e8b35db0cca724c6b112f2e36a54a15601 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 13:06:53 +0100 Subject: [PATCH 231/492] Refactor Command._get_self_arg --- qutebrowser/commands/command.py | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index cd7159878..74cf659f7 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -336,27 +336,18 @@ class Command: else: return str - def _get_self_arg(self, win_id, param, args): - """Get the self argument for a function call. - - Arguments: - win_id: The window id this command should be executed in. - param: The count parameter. - args: The positional argument list. Gets modified directly. - """ - assert param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD - if self._scope == 'global': + def _get_objreg(self, *, win_id, name, scope): + """Get an object from the objreg.""" + if scope == 'global': tab_id = None win_id = None - elif self._scope == 'tab': + elif scope == 'tab': tab_id = 'current' - elif self._scope == 'window': + elif scope == 'window': tab_id = None else: - raise ValueError("Invalid scope {}!".format(self._scope)) - obj = objreg.get(self._instance, scope=self._scope, window=win_id, - tab=tab_id) - args.append(obj) + raise ValueError("Invalid scope {}!".format(scope)) + return objreg.get(name, scope=scope, window=win_id, tab=tab_id) def _add_special_arg(self, *, value, param, args, kwargs, optional=False): """Add a special argument value to a function call. @@ -435,8 +426,12 @@ class Command: for i, param in enumerate(signature.parameters.values()): arg_info = self.get_arg_info(param) if i == 0 and self._instance is not None: - # Special case for 'self'. - self._get_self_arg(win_id, param, args) + assert param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD + self_value = self._get_objreg(win_id=win_id, + name=self._instance, + scope=self._scope) + self._add_special_arg(value=self_value, param=param, + args=args, kwargs=kwargs) continue elif arg_info.value == usertypes.CommandValue.count: self._add_special_arg(value=self._count, param=param, From 4ce8a6eaf6791abd2bf7b1f0a707dd8cb30ab279 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 13:07:44 +0100 Subject: [PATCH 232/492] Mark unreachable --- qutebrowser/commands/command.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 74cf659f7..51fe6cceb 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -27,7 +27,7 @@ import typing import attr from qutebrowser.commands import cmdexc, argparser -from qutebrowser.utils import log, message, docutils, objreg, usertypes +from qutebrowser.utils import log, message, docutils, objreg, usertypes, utils from qutebrowser.utils import debug as debug_utils from qutebrowser.misc import objects @@ -441,6 +441,10 @@ class Command: self._add_special_arg(value=win_id, param=param, args=args, kwargs=kwargs) continue + elif arg_info.value is None: + pass + else: + raise utils.Unreachable(arg_info) value = self._get_param_value(param) if param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD: From c0d4fe0ab541c334e742816a1c0689d3c839812a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 13:14:58 +0100 Subject: [PATCH 233/492] Make it possible to inject tab via cmdutils.Value --- doc/contributing.asciidoc | 1 + qutebrowser/commands/command.py | 7 ++++++- qutebrowser/utils/usertypes.py | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/contributing.asciidoc b/doc/contributing.asciidoc index 399633257..b11014ca1 100644 --- a/doc/contributing.asciidoc +++ b/doc/contributing.asciidoc @@ -483,6 +483,7 @@ The following arguments are supported for `@cmdutils.argument`: - `value`: Tell qutebrowser to fill the argument with special values: - `value=cmdutils.Value.count`: The `count` given by the user to the command. - `value=cmdutils.Value.win_id`: The window ID of the current window. + - `value=cmdutils.Value.tab`: The tab object which is currently focused. - `completion`: A completion function (see `qutebrowser.completions.models.*`) to use when completing arguments for the given command. - `choices`: The allowed string choices for the argument. diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 51fe6cceb..631ecc354 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -193,7 +193,7 @@ class Command: raise TypeError("{}: handler has count parameter " "without default!".format(self.name)) return True - elif arg_info.value == usertypes.CommandValue.win_id: + elif isinstance(arg_info.value, usertypes.CommandValue): return True else: raise TypeError("{}: Invalid value={!r} for argument '{}'!" @@ -441,6 +441,11 @@ class Command: self._add_special_arg(value=win_id, param=param, args=args, kwargs=kwargs) continue + elif arg_info.value == usertypes.CommandValue.tab: + tab = self._get_objreg(win_id=win_id, name='tab', scope='tab') + self._add_special_arg(value=tab, param=param, + args=args, kwargs=kwargs) + continue elif arg_info.value is None: pass else: diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index d8f46ded8..c6fddb039 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -262,6 +262,7 @@ class CommandValue(enum.Enum): count = 1 win_id = 2 + tab = 3 class Question(QObject): From ce3b1f252d2e96692f39db35152926106851e593 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 13:58:03 +0100 Subject: [PATCH 234/492] Add api.message and api.tab --- qutebrowser/api/message.py | 23 +++++++++++++++++++++++ qutebrowser/api/tab.py | 23 +++++++++++++++++++++++ qutebrowser/app.py | 1 + 3 files changed, 47 insertions(+) create mode 100644 qutebrowser/api/message.py create mode 100644 qutebrowser/api/tab.py diff --git a/qutebrowser/api/message.py b/qutebrowser/api/message.py new file mode 100644 index 000000000..fdb06354f --- /dev/null +++ b/qutebrowser/api/message.py @@ -0,0 +1,23 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Utilities to display messages above the status bar.""" + +# pylint: disable=unused-import +from qutebrowser.utils.message import error, warning, info diff --git a/qutebrowser/api/tab.py b/qutebrowser/api/tab.py new file mode 100644 index 000000000..444e49558 --- /dev/null +++ b/qutebrowser/api/tab.py @@ -0,0 +1,23 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""A single tab.""" + +# pylint: disable=unused-import +from qutebrowser.browser.browsertab import AbstractTab as Tab diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 27848c4c1..e950ff2ec 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -77,6 +77,7 @@ from qutebrowser.utils import (log, version, message, utils, urlutils, objreg, usertypes, standarddir, error, qtutils) # pylint: disable=unused-import # We import those to run the cmdutils.register decorators. +from qutebrowser.components import scrollcommands from qutebrowser.mainwindow.statusbar import command from qutebrowser.misc import utilcmds # pylint: enable=unused-import From e6c6e0dd5943d6fc40ae0ed59db94bd7ad9de216 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 13:58:36 +0100 Subject: [PATCH 235/492] Move scroll commands to components/ --- qutebrowser/browser/commands.py | 94 ----------------- qutebrowser/components/__init__.py | 20 ++++ qutebrowser/components/scrollcommands.py | 123 +++++++++++++++++++++++ 3 files changed, 143 insertions(+), 94 deletions(-) create mode 100644 qutebrowser/components/__init__.py create mode 100644 qutebrowser/components/scrollcommands.py diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index f4703850a..07f6156e6 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -667,100 +667,6 @@ class CommandDispatcher: except navigate.Error as e: raise cmdutils.CommandError(e) - @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def scroll_px(self, dx: int, dy: int, count: int = 1) -> None: - """Scroll the current tab by 'count * dx/dy' pixels. - - Args: - dx: How much to scroll in x-direction. - dy: How much to scroll in y-direction. - count: multiplier - """ - dx *= count - dy *= count - cmdutils.check_overflow(dx, 'int') - cmdutils.check_overflow(dy, 'int') - self._current_widget().scroller.delta(dx, dy) - - @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def scroll(self, direction: str, count: int = 1) -> None: - """Scroll the current tab in the given direction. - - Note you can use `:run-with-count` to have a keybinding with a bigger - scroll increment. - - Args: - direction: In which direction to scroll - (up/down/left/right/top/bottom). - count: multiplier - """ - tab = self._current_widget() - funcs = { - 'up': tab.scroller.up, - 'down': tab.scroller.down, - 'left': tab.scroller.left, - 'right': tab.scroller.right, - 'top': tab.scroller.top, - 'bottom': tab.scroller.bottom, - 'page-up': tab.scroller.page_up, - 'page-down': tab.scroller.page_down, - } - try: - func = funcs[direction] - except KeyError: - expected_values = ', '.join(sorted(funcs)) - raise cmdutils.CommandError("Invalid value {!r} for direction - " - "expected one of: {}".format( - direction, expected_values)) - - if direction in ['top', 'bottom']: - func() - else: - func(count=count) - - @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - @cmdutils.argument('horizontal', flag='x') - def scroll_to_perc(self, perc: float = None, horizontal: bool = False, - count: int = None) -> None: - """Scroll to a specific percentage of the page. - - The percentage can be given either as argument or as count. - If no percentage is given, the page is scrolled to the end. - - Args: - perc: Percentage to scroll. - horizontal: Scroll horizontally instead of vertically. - count: Percentage to scroll. - """ - # save the pre-jump position in the special ' mark - self.set_mark("'") - - if perc is None and count is None: - perc = 100 - elif count is not None: - perc = count - - if horizontal: - x = perc - y = None - else: - x = None - y = perc - - self._current_widget().scroller.to_perc(x, y) - - @cmdutils.register(instance='command-dispatcher', scope='window') - def scroll_to_anchor(self, name): - """Scroll to the given anchor in the document. - - Args: - name: The anchor to scroll to. - """ - self._current_widget().scroller.to_anchor(name) - @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', value=cmdutils.Value.count) @cmdutils.argument('top_navigate', metavar='ACTION', diff --git a/qutebrowser/components/__init__.py b/qutebrowser/components/__init__.py new file mode 100644 index 000000000..b42c87fb6 --- /dev/null +++ b/qutebrowser/components/__init__.py @@ -0,0 +1,20 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""qutebrowser "extensions" which only use the qutebrowser.API API.""" diff --git a/qutebrowser/components/scrollcommands.py b/qutebrowser/components/scrollcommands.py new file mode 100644 index 000000000..13deb9b6b --- /dev/null +++ b/qutebrowser/components/scrollcommands.py @@ -0,0 +1,123 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Scrolling-related commands.""" + +from qutebrowser.api import cmdutils, tab + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def scroll_px(tab: tab.Tab, dx: int, dy: int, count: int = 1) -> None: + """Scroll the current tab by 'count * dx/dy' pixels. + + Args: + dx: How much to scroll in x-direction. + dy: How much to scroll in y-direction. + count: multiplier + """ + dx *= count + dy *= count + cmdutils.check_overflow(dx, 'int') + cmdutils.check_overflow(dy, 'int') + tab.scroller.delta(dx, dy) + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def scroll(tab: tab.Tab, direction: str, count: int = 1) -> None: + """Scroll the current tab in the given direction. + + Note you can use `:run-with-count` to have a keybinding with a bigger + scroll increment. + + Args: + direction: In which direction to scroll + (up/down/left/right/top/bottom). + count: multiplier + """ + funcs = { + 'up': tab.scroller.up, + 'down': tab.scroller.down, + 'left': tab.scroller.left, + 'right': tab.scroller.right, + 'top': tab.scroller.top, + 'bottom': tab.scroller.bottom, + 'page-up': tab.scroller.page_up, + 'page-down': tab.scroller.page_down, + } + try: + func = funcs[direction] + except KeyError: + expected_values = ', '.join(sorted(funcs)) + raise cmdutils.CommandError("Invalid value {!r} for direction - " + "expected one of: {}".format( + direction, expected_values)) + + if direction in ['top', 'bottom']: + func() + else: + func(count=count) + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +@cmdutils.argument('horizontal', flag='x') +def scroll_to_perc(tab: tab.Tab, count: int = None, + perc: float = None, horizontal: bool = False) -> None: + """Scroll to a specific percentage of the page. + + The percentage can be given either as argument or as count. + If no percentage is given, the page is scrolled to the end. + + Args: + perc: Percentage to scroll. + horizontal: Scroll horizontally instead of vertically. + count: Percentage to scroll. + """ + # save the pre-jump position in the special ' mark + self.set_mark("'") + + if perc is None and count is None: + perc = 100 + elif count is not None: + perc = count + + if horizontal: + x = perc + y = None + else: + x = None + y = perc + + tab.scroller.to_perc(x, y) + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.tab) +def scroll_to_anchor(tab: tab.Tab, name): + """Scroll to the given anchor in the document. + + Args: + name: The anchor to scroll to. + """ + tab.scroller.to_anchor(name) From 88205a8d322f76d6f30f4f930bbc3c6cc1b72cee Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 14:17:40 +0100 Subject: [PATCH 236/492] Add AbstractScroller.before_jump_requested signal This allows us to save the ' mark without needing access to the TabbedBrowser object. This also changes the places the ' mark is saved slightly: - :navigate doesn't save it anymore as there is no reason to do so (loading the new page will render the mark useless anyways). - When clearing a search, the ' mark isn't saved. - :scroll-anchor now saves the ' mark. --- qutebrowser/browser/browsertab.py | 10 +++++++++- qutebrowser/browser/commands.py | 9 +++------ qutebrowser/browser/hints.py | 4 +--- qutebrowser/components/scrollcommands.py | 5 ++--- qutebrowser/mainwindow/tabbedbrowser.py | 4 ++-- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 4bffbb796..3bd4c55c3 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -522,9 +522,17 @@ class AbstractCaret(QObject): class AbstractScroller(QObject): - """Attribute of AbstractTab to manage scroll position.""" + """Attribute of AbstractTab to manage scroll position. + + Signals: + perc_changed: The scroll position changed. + before_jump_requested: + Emitted by other code when the user requested a jump. + Used to set the special ' mark so the user can return. + """ perc_changed = pyqtSignal(int, int) + before_jump_requested = pyqtSignal() def __init__(self, tab: 'AbstractTab', parent: QWidget = None): super().__init__(parent) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 07f6156e6..791e45a1a 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -634,9 +634,6 @@ class CommandDispatcher: count: For `increment` and `decrement`, the number to change the URL by. For `up`, the number of levels to go up in the URL. """ - # save the pre-jump position in the special ' mark - self.set_mark("'") - cmdutils.check_exclusive((tab, bg, window), 'tbw') widget = self._current_widget() url = self._current_url() @@ -1712,7 +1709,6 @@ class CommandDispatcher: text: The text to search for. reverse: Reverse search direction. """ - self.set_mark("'") tab = self._current_widget() if not text: @@ -1733,6 +1729,7 @@ class CommandDispatcher: options=options, text=text, prev=False) options['result_cb'] = cb + tab.scroller.before_jump_requested.emit() tab.search.search(text, **options) @cmdutils.register(instance='command-dispatcher', scope='window') @@ -1750,7 +1747,7 @@ class CommandDispatcher: if window_text is None: raise cmdutils.CommandError("No search done yet.") - self.set_mark("'") + tab.scroller.before_jump_requested.emit() if window_text is not None and window_text != tab.search.text: tab.search.clear() @@ -1784,7 +1781,7 @@ class CommandDispatcher: if window_text is None: raise cmdutils.CommandError("No search done yet.") - self.set_mark("'") + tab.scroller.before_jump_requested.emit() if window_text is not None and window_text != tab.search.text: tab.search.clear() diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 31fd9b6a2..bce185298 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -218,9 +218,7 @@ class HintActions: if context.target in [Target.normal, Target.current]: # Set the pre-jump mark ', so we can jump back here after following - tabbed_browser = objreg.get('tabbed-browser', scope='window', - window=self._win_id) - tabbed_browser.set_mark("'") + context.tab.scroll.before_jump_requested.emit() try: if context.target == Target.hover: diff --git a/qutebrowser/components/scrollcommands.py b/qutebrowser/components/scrollcommands.py index 13deb9b6b..10b7d7244 100644 --- a/qutebrowser/components/scrollcommands.py +++ b/qutebrowser/components/scrollcommands.py @@ -94,9 +94,6 @@ def scroll_to_perc(tab: tab.Tab, count: int = None, horizontal: Scroll horizontally instead of vertically. count: Percentage to scroll. """ - # save the pre-jump position in the special ' mark - self.set_mark("'") - if perc is None and count is None: perc = 100 elif count is not None: @@ -109,6 +106,7 @@ def scroll_to_perc(tab: tab.Tab, count: int = None, x = None y = perc + tab.scroller.before_jump_requested.emit() tab.scroller.to_perc(x, y) @@ -120,4 +118,5 @@ def scroll_to_anchor(tab: tab.Tab, name): Args: name: The anchor to scroll to. """ + tab.scroller.before_jump_requested.emit() tab.scroller.to_anchor(name) diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 9c6602224..9c14df3ae 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -222,6 +222,7 @@ class TabbedBrowser(QWidget): self._filter.create(self.cur_caret_selection_toggled, tab)) # misc tab.scroller.perc_changed.connect(self.on_scroll_pos_changed) + tab.scroller.before_jump_requested.connect(lambda: self.set_mark("'")) tab.url_changed.connect( functools.partial(self.on_url_changed, tab)) tab.title_changed.connect( @@ -891,8 +892,7 @@ class TabbedBrowser(QWidget): # save the pre-jump position in the special ' mark # this has to happen after we read the mark, otherwise jump_mark # "'" would just jump to the current position every time - self.set_mark("'") - + tab.scroller.before_jump_requested.emit() tab.scroller.to_point(point) else: message.error("Mark {} is not set".format(key)) From bc0ac62087ce0d700ee129467695e92692a6b8cc Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 14:28:29 +0100 Subject: [PATCH 237/492] Rename api.tab.Tab to api.apitypes.Tab Then we can add other related types there, and we don't clash with the common "tab" argument for a new tab. --- qutebrowser/api/{tab.py => apitypes.py} | 0 qutebrowser/components/scrollcommands.py | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) rename qutebrowser/api/{tab.py => apitypes.py} (100%) diff --git a/qutebrowser/api/tab.py b/qutebrowser/api/apitypes.py similarity index 100% rename from qutebrowser/api/tab.py rename to qutebrowser/api/apitypes.py diff --git a/qutebrowser/components/scrollcommands.py b/qutebrowser/components/scrollcommands.py index 10b7d7244..c749c5dbe 100644 --- a/qutebrowser/components/scrollcommands.py +++ b/qutebrowser/components/scrollcommands.py @@ -19,13 +19,13 @@ """Scrolling-related commands.""" -from qutebrowser.api import cmdutils, tab +from qutebrowser.api import cmdutils, apitypes @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def scroll_px(tab: tab.Tab, dx: int, dy: int, count: int = 1) -> None: +def scroll_px(tab: apitypes.Tab, dx: int, dy: int, count: int = 1) -> None: """Scroll the current tab by 'count * dx/dy' pixels. Args: @@ -43,7 +43,7 @@ def scroll_px(tab: tab.Tab, dx: int, dy: int, count: int = 1) -> None: @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def scroll(tab: tab.Tab, direction: str, count: int = 1) -> None: +def scroll(tab: apitypes.Tab, direction: str, count: int = 1) -> None: """Scroll the current tab in the given direction. Note you can use `:run-with-count` to have a keybinding with a bigger @@ -82,7 +82,7 @@ def scroll(tab: tab.Tab, direction: str, count: int = 1) -> None: @cmdutils.argument('tab', value=cmdutils.Value.tab) @cmdutils.argument('count', value=cmdutils.Value.count) @cmdutils.argument('horizontal', flag='x') -def scroll_to_perc(tab: tab.Tab, count: int = None, +def scroll_to_perc(tab: apitypes.Tab, count: int = None, perc: float = None, horizontal: bool = False) -> None: """Scroll to a specific percentage of the page. @@ -112,7 +112,7 @@ def scroll_to_perc(tab: tab.Tab, count: int = None, @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.tab) -def scroll_to_anchor(tab: tab.Tab, name): +def scroll_to_anchor(tab: apitypes.Tab, name): """Scroll to the given anchor in the document. Args: From 7a379ebec17023aa606f314a85e884d354b05ea1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 14:45:40 +0100 Subject: [PATCH 238/492] Expose KeyMode to extension API --- qutebrowser/api/cmdutils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/api/cmdutils.py b/qutebrowser/api/cmdutils.py index 3a1814856..093244727 100644 --- a/qutebrowser/api/cmdutils.py +++ b/qutebrowser/api/cmdutils.py @@ -25,7 +25,7 @@ import typing from qutebrowser.utils import qtutils from qutebrowser.commands import command, cmdexc # pylint: disable=unused-import -from qutebrowser.utils.usertypes import CommandValue as Value +from qutebrowser.utils.usertypes import KeyMode, CommandValue as Value class CommandError(cmdexc.Error): From a09b1a4e05074b0a737cbd7dea80d4b1d1582707 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 14:32:28 +0100 Subject: [PATCH 239/492] Move caret commands to components.caretcommands --- qutebrowser/api/apitypes.py | 2 +- qutebrowser/app.py | 2 +- qutebrowser/browser/commands.py | 169 ------------------- qutebrowser/components/caretcommands.py | 205 ++++++++++++++++++++++++ 4 files changed, 207 insertions(+), 171 deletions(-) create mode 100644 qutebrowser/components/caretcommands.py diff --git a/qutebrowser/api/apitypes.py b/qutebrowser/api/apitypes.py index 444e49558..8ec7be547 100644 --- a/qutebrowser/api/apitypes.py +++ b/qutebrowser/api/apitypes.py @@ -20,4 +20,4 @@ """A single tab.""" # pylint: disable=unused-import -from qutebrowser.browser.browsertab import AbstractTab as Tab +from qutebrowser.browser.browsertab import WebTabError, AbstractTab as Tab diff --git a/qutebrowser/app.py b/qutebrowser/app.py index e950ff2ec..0bb7e14cb 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -77,7 +77,7 @@ from qutebrowser.utils import (log, version, message, utils, urlutils, objreg, usertypes, standarddir, error, qtutils) # pylint: disable=unused-import # We import those to run the cmdutils.register decorators. -from qutebrowser.components import scrollcommands +from qutebrowser.components import scrollcommands, caretcommands from qutebrowser.mainwindow.statusbar import command from qutebrowser.misc import utilcmds # pylint: enable=unused-import diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 791e45a1a..f1bb8fb35 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1348,18 +1348,6 @@ class CommandDispatcher: except KeyError: raise cmdutils.CommandError("Bookmark '{}' not found!".format(url)) - @cmdutils.register(instance='command-dispatcher', scope='window') - def follow_selected(self, *, tab=False): - """Follow the selected text. - - Args: - tab: Load the selected link in a new tab. - """ - try: - self._current_widget().caret.follow_selected(tab=tab) - except browsertab.WebTabError as e: - raise cmdutils.CommandError(str(e)) - @cmdutils.register(instance='command-dispatcher', name='inspector', scope='window') def toggle_inspector(self): @@ -1800,163 +1788,6 @@ class CommandDispatcher: tab.search.prev_result() tab.search.prev_result(result_cb=cb) - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_next_line(self, count=1): - """Move the cursor or selection to the next line. - - Args: - count: How many lines to move. - """ - self._current_widget().caret.move_to_next_line(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_prev_line(self, count=1): - """Move the cursor or selection to the prev line. - - Args: - count: How many lines to move. - """ - self._current_widget().caret.move_to_prev_line(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_next_char(self, count=1): - """Move the cursor or selection to the next char. - - Args: - count: How many lines to move. - """ - self._current_widget().caret.move_to_next_char(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_prev_char(self, count=1): - """Move the cursor or selection to the previous char. - - Args: - count: How many chars to move. - """ - self._current_widget().caret.move_to_prev_char(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_end_of_word(self, count=1): - """Move the cursor or selection to the end of the word. - - Args: - count: How many words to move. - """ - self._current_widget().caret.move_to_end_of_word(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_next_word(self, count=1): - """Move the cursor or selection to the next word. - - Args: - count: How many words to move. - """ - self._current_widget().caret.move_to_next_word(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_prev_word(self, count=1): - """Move the cursor or selection to the previous word. - - Args: - count: How many words to move. - """ - self._current_widget().caret.move_to_prev_word(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - def move_to_start_of_line(self): - """Move the cursor or selection to the start of the line.""" - self._current_widget().caret.move_to_start_of_line() - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - def move_to_end_of_line(self): - """Move the cursor or selection to the end of line.""" - self._current_widget().caret.move_to_end_of_line() - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_start_of_next_block(self, count=1): - """Move the cursor or selection to the start of next block. - - Args: - count: How many blocks to move. - """ - self._current_widget().caret.move_to_start_of_next_block(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_start_of_prev_block(self, count=1): - """Move the cursor or selection to the start of previous block. - - Args: - count: How many blocks to move. - """ - self._current_widget().caret.move_to_start_of_prev_block(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_end_of_next_block(self, count=1): - """Move the cursor or selection to the end of next block. - - Args: - count: How many blocks to move. - """ - self._current_widget().caret.move_to_end_of_next_block(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def move_to_end_of_prev_block(self, count=1): - """Move the cursor or selection to the end of previous block. - - Args: - count: How many blocks to move. - """ - self._current_widget().caret.move_to_end_of_prev_block(count) - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - def move_to_start_of_document(self): - """Move the cursor or selection to the start of the document.""" - self._current_widget().caret.move_to_start_of_document() - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - def move_to_end_of_document(self): - """Move the cursor or selection to the end of the document.""" - self._current_widget().caret.move_to_end_of_document() - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - def toggle_selection(self): - """Toggle caret selection mode.""" - self._current_widget().caret.toggle_selection() - - @cmdutils.register(instance='command-dispatcher', modes=[KeyMode.caret], - scope='window') - def drop_selection(self): - """Drop selection and keep selection mode enabled.""" - self._current_widget().caret.drop_selection() - @cmdutils.register(instance='command-dispatcher', scope='window', debug=True) @cmdutils.argument('count', value=cmdutils.Value.count) diff --git a/qutebrowser/components/caretcommands.py b/qutebrowser/components/caretcommands.py new file mode 100644 index 000000000..ae0828ef5 --- /dev/null +++ b/qutebrowser/components/caretcommands.py @@ -0,0 +1,205 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Commands related to caret browsing.""" + + +from qutebrowser.api import cmdutils, apitypes + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_next_line(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the next line. + + Args: + count: How many lines to move. + """ + tab.caret.move_to_next_line(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_prev_line(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the prev line. + + Args: + count: How many lines to move. + """ + tab.caret.move_to_prev_line(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_next_char(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the next char. + + Args: + count: How many lines to move. + """ + tab.caret.move_to_next_char(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_prev_char(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the previous char. + + Args: + count: How many chars to move. + """ + tab.caret.move_to_prev_char(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_end_of_word(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the end of the word. + + Args: + count: How many words to move. + """ + tab.caret.move_to_end_of_word(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_next_word(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the next word. + + Args: + count: How many words to move. + """ + tab.caret.move_to_next_word(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_prev_word(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the previous word. + + Args: + count: How many words to move. + """ + tab.caret.move_to_prev_word(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +def move_to_start_of_line(tab: apitypes.Tab): + """Move the cursor or selection to the start of the line.""" + tab.caret.move_to_start_of_line() + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +def move_to_end_of_line(tab: apitypes.Tab): + """Move the cursor or selection to the end of line.""" + tab.caret.move_to_end_of_line() + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_start_of_next_block(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the start of next block. + + Args: + count: How many blocks to move. + """ + tab.caret.move_to_start_of_next_block(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_start_of_prev_block(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the start of previous block. + + Args: + count: How many blocks to move. + """ + tab.caret.move_to_start_of_prev_block(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_end_of_next_block(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the end of next block. + + Args: + count: How many blocks to move. + """ + tab.caret.move_to_end_of_next_block(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def move_to_end_of_prev_block(tab: apitypes.Tab, count: int = 1): + """Move the cursor or selection to the end of previous block. + + Args: + count: How many blocks to move. + """ + tab.caret.move_to_end_of_prev_block(count) + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +def move_to_start_of_document(tab: apitypes.Tab): + """Move the cursor or selection to the start of the document.""" + tab.caret.move_to_start_of_document() + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +def move_to_end_of_document(tab: apitypes.Tab): + """Move the cursor or selection to the end of the document.""" + tab.caret.move_to_end_of_document() + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +def toggle_selection(tab: apitypes.Tab): + """Toggle caret selection mode.""" + tab.caret.toggle_selection() + + +@cmdutils.register(modes=[cmdutils.KeyMode.caret]) +def drop_selection(tab: apitypes.Tab): + """Drop selection and keep selection mode enabled.""" + tab.caret.drop_selection() + + +@cmdutils.register() +@cmdutils.argument('tab_obj', value=cmdutils.Value.tab) +def follow_selected(tab_obj: apitypes.Tab, *, tab=False): + """Follow the selected text. + + Args: + tab: Load the selected link in a new tab. + """ + try: + tab_obj.caret.follow_selected(tab=tab) + except apitypes.WebTabError as e: + raise cmdutils.CommandError(str(e)) From da505c84c6dd50e1eecda8baf9bd2d2584efe9cd Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 14:44:49 +0100 Subject: [PATCH 240/492] Expose config.val to extension API --- qutebrowser/api/config.py | 26 ++++++++++++++++++++++++++ qutebrowser/config/configinit.py | 2 ++ 2 files changed, 28 insertions(+) create mode 100644 qutebrowser/api/config.py diff --git a/qutebrowser/api/config.py b/qutebrowser/api/config.py new file mode 100644 index 000000000..c1394d46a --- /dev/null +++ b/qutebrowser/api/config.py @@ -0,0 +1,26 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Access to the qutebrowser configuration.""" + +import typing + +from qutebrowser.config import config + +val = typing.cast('config.ConfigContainer', None) diff --git a/qutebrowser/config/configinit.py b/qutebrowser/config/configinit.py index 8480889af..de9651064 100644 --- a/qutebrowser/config/configinit.py +++ b/qutebrowser/config/configinit.py @@ -24,6 +24,7 @@ import sys from PyQt5.QtWidgets import QMessageBox +from qutebrowser.api import config as configapi from qutebrowser.config import (config, configdata, configfiles, configtypes, configexc, configcommands) from qutebrowser.utils import (objreg, usertypes, log, standarddir, message, @@ -44,6 +45,7 @@ def early_init(args): config.instance = config.Config(yaml_config=yaml_config) config.val = config.ConfigContainer(config.instance) + configapi.val = config.ConfigContainer(config.instance) config.key_instance = config.KeyConfig(config.instance) config.cache = configcache.ConfigCache() yaml_config.setParent(config.instance) From ba03e9394aa21c1a6da628dd987709b670668811 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 14:45:10 +0100 Subject: [PATCH 241/492] Move zoom commands to components/ --- qutebrowser/app.py | 2 +- qutebrowser/browser/commands.py | 67 ------------------- qutebrowser/components/zoomcommands.py | 92 ++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 68 deletions(-) create mode 100644 qutebrowser/components/zoomcommands.py diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 0bb7e14cb..7548c08d0 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -77,7 +77,7 @@ from qutebrowser.utils import (log, version, message, utils, urlutils, objreg, usertypes, standarddir, error, qtutils) # pylint: disable=unused-import # We import those to run the cmdutils.register decorators. -from qutebrowser.components import scrollcommands, caretcommands +from qutebrowser.components import scrollcommands, caretcommands, zoomcommands from qutebrowser.mainwindow.statusbar import command from qutebrowser.misc import utilcmds # pylint: enable=unused-import diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index f1bb8fb35..f6fecdce8 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -793,73 +793,6 @@ class CommandDispatcher: modeman.leave(self._win_id, KeyMode.caret, "yank selected", maybe=True) - @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def zoom_in(self, count=1, quiet=False): - """Increase the zoom level for the current tab. - - Args: - count: How many steps to zoom in. - quiet: Don't show a zoom level message. - """ - tab = self._current_widget() - try: - perc = tab.zoom.apply_offset(count) - except ValueError as e: - raise cmdutils.CommandError(e) - if not quiet: - message.info("Zoom level: {}%".format(int(perc)), replace=True) - - @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def zoom_out(self, count=1, quiet=False): - """Decrease the zoom level for the current tab. - - Args: - count: How many steps to zoom out. - quiet: Don't show a zoom level message. - """ - tab = self._current_widget() - try: - perc = tab.zoom.apply_offset(-count) - except ValueError as e: - raise cmdutils.CommandError(e) - if not quiet: - message.info("Zoom level: {}%".format(int(perc)), replace=True) - - @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def zoom(self, zoom=None, count=None, quiet=False): - """Set the zoom level for the current tab. - - The zoom can be given as argument or as [count]. If neither is - given, the zoom is set to the default zoom. If both are given, - use [count]. - - Args: - zoom: The zoom percentage to set. - count: The zoom percentage to set. - quiet: Don't show a zoom level message. - """ - if zoom is not None: - try: - zoom = int(zoom.rstrip('%')) - except ValueError: - raise cmdutils.CommandError("zoom: Invalid int value {}" - .format(zoom)) - - level = count if count is not None else zoom - if level is None: - level = config.val.zoom.default - tab = self._current_widget() - - try: - tab.zoom.set_factor(float(level) / 100) - except ValueError: - raise cmdutils.CommandError("Can't zoom {}%!".format(level)) - if not quiet: - message.info("Zoom level: {}%".format(int(level)), replace=True) - @cmdutils.register(instance='command-dispatcher', scope='window') def tab_only(self, prev=False, next_=False, force=False): """Close all tabs except for the current one. diff --git a/qutebrowser/components/zoomcommands.py b/qutebrowser/components/zoomcommands.py new file mode 100644 index 000000000..c525b771c --- /dev/null +++ b/qutebrowser/components/zoomcommands.py @@ -0,0 +1,92 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Zooming-related commands.""" + +from qutebrowser.api import cmdutils, apitypes, message, config + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def zoom_in(tab: apitypes.Tab, count=1, quiet=False): + """Increase the zoom level for the current tab. + + Args: + count: How many steps to zoom in. + quiet: Don't show a zoom level message. + """ + try: + perc = tab.zoom.apply_offset(count) + except ValueError as e: + raise cmdutils.CommandError(e) + if not quiet: + message.info("Zoom level: {}%".format(int(perc)), replace=True) + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def zoom_out(tab: apitypes.Tab, count=1, quiet=False): + """Decrease the zoom level for the current tab. + + Args: + count: How many steps to zoom out. + quiet: Don't show a zoom level message. + """ + try: + perc = tab.zoom.apply_offset(-count) + except ValueError as e: + raise cmdutils.CommandError(e) + if not quiet: + message.info("Zoom level: {}%".format(int(perc)), replace=True) + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def zoom(tab: apitypes.Tab, zoom=None, count=None, quiet=False): + """Set the zoom level for the current tab. + + The zoom can be given as argument or as [count]. If neither is + given, the zoom is set to the default zoom. If both are given, + use [count]. + + Args: + zoom: The zoom percentage to set. + count: The zoom percentage to set. + quiet: Don't show a zoom level message. + """ + if zoom is not None: + try: + zoom = int(zoom.rstrip('%')) + except ValueError: + raise cmdutils.CommandError("zoom: Invalid int value {}" + .format(zoom)) + + level = count if count is not None else zoom + if level is None: + level = config.val.zoom.default + + try: + tab.zoom.set_factor(float(level) / 100) + except ValueError: + raise cmdutils.CommandError("Can't zoom {}%!".format(level)) + if not quiet: + message.info("Zoom level: {}%".format(int(level)), replace=True) From 3a7206bda1501f6cb8dd8f3b813e7a8f021e3669 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 15:36:54 +0100 Subject: [PATCH 242/492] Make standarddir.Location private --- qutebrowser/utils/standarddir.py | 46 +++++++++++++++++++------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/qutebrowser/utils/standarddir.py b/qutebrowser/utils/standarddir.py index 356178404..7abb4429d 100644 --- a/qutebrowser/utils/standarddir.py +++ b/qutebrowser/utils/standarddir.py @@ -35,9 +35,17 @@ from qutebrowser.utils import log, debug, message, utils _locations = {} -Location = enum.Enum('Location', ['config', 'auto_config', - 'data', 'system_data', - 'cache', 'download', 'runtime']) +class _Location(enum.Enum): + + """A key for _locations.""" + + config = 1 + auto_config = 2 + data = 3 + system_data = 4 + cache = 5 + download = 6 + runtime = 7 APPNAME = 'qutebrowser' @@ -77,8 +85,8 @@ def _init_config(args): else: path = _writable_location(typ) _create(path) - _locations[Location.config] = path - _locations[Location.auto_config] = path + _locations[_Location.config] = path + _locations[_Location.auto_config] = path # Override the normal (non-auto) config on macOS if utils.is_mac: @@ -86,7 +94,7 @@ def _init_config(args): if not overridden: # pragma: no branch path = os.path.expanduser('~/.' + APPNAME) _create(path) - _locations[Location.config] = path + _locations[_Location.config] = path def config(auto=False): @@ -96,8 +104,8 @@ def config(auto=False): which is different on macOS. """ if auto: - return _locations[Location.auto_config] - return _locations[Location.config] + return _locations[_Location.auto_config] + return _locations[_Location.config] def _init_data(args): @@ -115,14 +123,14 @@ def _init_data(args): else: path = _writable_location(typ) _create(path) - _locations[Location.data] = path + _locations[_Location.data] = path # system_data - _locations.pop(Location.system_data, None) # Remove old state + _locations.pop(_Location.system_data, None) # Remove old state if utils.is_linux: path = '/usr/share/' + APPNAME if os.path.exists(path): - _locations[Location.system_data] = path + _locations[_Location.system_data] = path def data(system=False): @@ -133,10 +141,10 @@ def data(system=False): """ if system: try: - return _locations[Location.system_data] + return _locations[_Location.system_data] except KeyError: pass - return _locations[Location.data] + return _locations[_Location.data] def _init_cache(args): @@ -151,11 +159,11 @@ def _init_cache(args): else: path = _writable_location(typ) _create(path) - _locations[Location.cache] = path + _locations[_Location.cache] = path def cache(): - return _locations[Location.cache] + return _locations[_Location.cache] def _init_download(args): @@ -168,11 +176,11 @@ def _init_download(args): overridden, path = _from_args(typ, args) if not overridden: path = _writable_location(typ) - _locations[Location.download] = path + _locations[_Location.download] = path def download(): - return _locations[Location.download] + return _locations[_Location.download] def _init_runtime(args): @@ -205,11 +213,11 @@ def _init_runtime(args): # maximum length of 104 chars), so we don't add the username here... _create(path) - _locations[Location.runtime] = path + _locations[_Location.runtime] = path def runtime(): - return _locations[Location.runtime] + return _locations[_Location.runtime] def _writable_location(typ): From 3abc83d945794584483277e3050be1e4ab4cb16d Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 15:43:14 +0100 Subject: [PATCH 243/492] Rename CommandValue.tab to CommandValue.cur_tab --- doc/contributing.asciidoc | 2 +- qutebrowser/commands/command.py | 2 +- qutebrowser/components/caretcommands.py | 24 ++++++++++++------------ qutebrowser/components/scrollcommands.py | 8 ++++---- qutebrowser/components/zoomcommands.py | 6 +++--- qutebrowser/utils/usertypes.py | 2 +- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/doc/contributing.asciidoc b/doc/contributing.asciidoc index b11014ca1..dc52dd9a0 100644 --- a/doc/contributing.asciidoc +++ b/doc/contributing.asciidoc @@ -483,7 +483,7 @@ The following arguments are supported for `@cmdutils.argument`: - `value`: Tell qutebrowser to fill the argument with special values: - `value=cmdutils.Value.count`: The `count` given by the user to the command. - `value=cmdutils.Value.win_id`: The window ID of the current window. - - `value=cmdutils.Value.tab`: The tab object which is currently focused. + - `value=cmdutils.Value.cur_tab`: The tab object which is currently focused. - `completion`: A completion function (see `qutebrowser.completions.models.*`) to use when completing arguments for the given command. - `choices`: The allowed string choices for the argument. diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 631ecc354..a91a268bd 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -441,7 +441,7 @@ class Command: self._add_special_arg(value=win_id, param=param, args=args, kwargs=kwargs) continue - elif arg_info.value == usertypes.CommandValue.tab: + elif arg_info.value == usertypes.CommandValue.cur_tab: tab = self._get_objreg(win_id=win_id, name='tab', scope='tab') self._add_special_arg(value=tab, param=param, args=args, kwargs=kwargs) diff --git a/qutebrowser/components/caretcommands.py b/qutebrowser/components/caretcommands.py index ae0828ef5..c359c27ac 100644 --- a/qutebrowser/components/caretcommands.py +++ b/qutebrowser/components/caretcommands.py @@ -24,7 +24,7 @@ from qutebrowser.api import cmdutils, apitypes @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_next_line(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the next line. @@ -36,7 +36,7 @@ def move_to_next_line(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_prev_line(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the prev line. @@ -48,7 +48,7 @@ def move_to_prev_line(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_next_char(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the next char. @@ -60,7 +60,7 @@ def move_to_next_char(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_prev_char(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the previous char. @@ -72,7 +72,7 @@ def move_to_prev_char(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_end_of_word(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the end of the word. @@ -84,7 +84,7 @@ def move_to_end_of_word(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_next_word(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the next word. @@ -96,7 +96,7 @@ def move_to_next_word(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_prev_word(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the previous word. @@ -120,7 +120,7 @@ def move_to_end_of_line(tab: apitypes.Tab): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_start_of_next_block(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the start of next block. @@ -132,7 +132,7 @@ def move_to_start_of_next_block(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_start_of_prev_block(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the start of previous block. @@ -144,7 +144,7 @@ def move_to_start_of_prev_block(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_end_of_next_block(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the end of next block. @@ -156,7 +156,7 @@ def move_to_end_of_next_block(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def move_to_end_of_prev_block(tab: apitypes.Tab, count: int = 1): """Move the cursor or selection to the end of previous block. @@ -192,7 +192,7 @@ def drop_selection(tab: apitypes.Tab): @cmdutils.register() -@cmdutils.argument('tab_obj', value=cmdutils.Value.tab) +@cmdutils.argument('tab_obj', value=cmdutils.Value.cur_tab) def follow_selected(tab_obj: apitypes.Tab, *, tab=False): """Follow the selected text. diff --git a/qutebrowser/components/scrollcommands.py b/qutebrowser/components/scrollcommands.py index c749c5dbe..4a6d9cb99 100644 --- a/qutebrowser/components/scrollcommands.py +++ b/qutebrowser/components/scrollcommands.py @@ -23,7 +23,7 @@ from qutebrowser.api import cmdutils, apitypes @cmdutils.register() -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def scroll_px(tab: apitypes.Tab, dx: int, dy: int, count: int = 1) -> None: """Scroll the current tab by 'count * dx/dy' pixels. @@ -41,7 +41,7 @@ def scroll_px(tab: apitypes.Tab, dx: int, dy: int, count: int = 1) -> None: @cmdutils.register() -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def scroll(tab: apitypes.Tab, direction: str, count: int = 1) -> None: """Scroll the current tab in the given direction. @@ -79,7 +79,7 @@ def scroll(tab: apitypes.Tab, direction: str, count: int = 1) -> None: @cmdutils.register() -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) @cmdutils.argument('horizontal', flag='x') def scroll_to_perc(tab: apitypes.Tab, count: int = None, @@ -111,7 +111,7 @@ def scroll_to_perc(tab: apitypes.Tab, count: int = None, @cmdutils.register() -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) def scroll_to_anchor(tab: apitypes.Tab, name): """Scroll to the given anchor in the document. diff --git a/qutebrowser/components/zoomcommands.py b/qutebrowser/components/zoomcommands.py index c525b771c..16afa18e2 100644 --- a/qutebrowser/components/zoomcommands.py +++ b/qutebrowser/components/zoomcommands.py @@ -23,7 +23,7 @@ from qutebrowser.api import cmdutils, apitypes, message, config @cmdutils.register() -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def zoom_in(tab: apitypes.Tab, count=1, quiet=False): """Increase the zoom level for the current tab. @@ -41,7 +41,7 @@ def zoom_in(tab: apitypes.Tab, count=1, quiet=False): @cmdutils.register() -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def zoom_out(tab: apitypes.Tab, count=1, quiet=False): """Decrease the zoom level for the current tab. @@ -59,7 +59,7 @@ def zoom_out(tab: apitypes.Tab, count=1, quiet=False): @cmdutils.register() -@cmdutils.argument('tab', value=cmdutils.Value.tab) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) def zoom(tab: apitypes.Tab, zoom=None, count=None, quiet=False): """Set the zoom level for the current tab. diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index c6fddb039..eb19b9dd3 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -262,7 +262,7 @@ class CommandValue(enum.Enum): count = 1 win_id = 2 - tab = 3 + cur_tab = 3 class Question(QObject): From 2ef82caa107b78aa1d9d4875904a84730e4d4412 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 15:55:05 +0100 Subject: [PATCH 244/492] apitypes: Expose webelem.Error/ClickTarget/JsWorld --- qutebrowser/api/apitypes.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qutebrowser/api/apitypes.py b/qutebrowser/api/apitypes.py index 8ec7be547..2ed188724 100644 --- a/qutebrowser/api/apitypes.py +++ b/qutebrowser/api/apitypes.py @@ -21,3 +21,5 @@ # pylint: disable=unused-import from qutebrowser.browser.browsertab import WebTabError, AbstractTab as Tab +from qutebrowser.browser.webelem import Error as WebElemError +from qutebrowser.utils.usertypes import ClickTarget, JsWorld From 7788a91ed290e5be28854de0bdef87c43c769195 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 15:55:50 +0100 Subject: [PATCH 245/492] Add CommandValue.count_tab --- qutebrowser/commands/command.py | 22 ++++++++++++++++++++++ qutebrowser/utils/usertypes.py | 1 + 2 files changed, 23 insertions(+) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index a91a268bd..5e9130b0b 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -26,6 +26,7 @@ import typing import attr +from qutebrowser.api import cmdutils from qutebrowser.commands import cmdexc, argparser from qutebrowser.utils import log, message, docutils, objreg, usertypes, utils from qutebrowser.utils import debug as debug_utils @@ -373,6 +374,22 @@ class Command: raise TypeError("{}: invalid parameter type {} for argument " "{!r}!".format(self.name, param.kind, param.name)) + def _add_count_tab(self, *, win_id, param, args, kwargs): + """Add the count_tab widget argument.""" + tabbed_browser = self._get_objreg( + win_id=win_id, name='tabbed-browser', scope='window') + + if self._count is None: + tab = tabbed_browser.widget.currentWidget() + elif 1 <= self._count <= tabbed_browser.widget.count(): + cmdutils.check_overflow(self._count + 1, 'int') + tab = tabbed_browser.widget.widget(self._count - 1) + else: + tab = None + + self._add_special_arg(value=tab, param=param, args=args, + kwargs=kwargs, optional=True) + def _get_param_value(self, param): """Get the converted value for an inspect.Parameter.""" value = getattr(self.namespace, param.name) @@ -446,6 +463,11 @@ class Command: self._add_special_arg(value=tab, param=param, args=args, kwargs=kwargs) continue + elif arg_info.value == usertypes.CommandValue.count_tab: + self._add_count_tab(win_id=win_id, param=param, args=args, + kwargs=kwargs) + continue + elif arg_info.value is None: pass else: diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index eb19b9dd3..c948df48f 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -263,6 +263,7 @@ class CommandValue(enum.Enum): count = 1 win_id = 2 cur_tab = 3 + count_tab = 4 class Question(QObject): From 979be017c3475eed41be70ae663a12609818fca1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 15:56:16 +0100 Subject: [PATCH 246/492] Add components.misccommands --- qutebrowser/app.py | 3 +- qutebrowser/browser/commands.py | 215 ----------------- qutebrowser/components/misccommands.py | 312 +++++++++++++++++++++++++ qutebrowser/misc/utilcmds.py | 74 ------ 4 files changed, 314 insertions(+), 290 deletions(-) create mode 100644 qutebrowser/components/misccommands.py diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 7548c08d0..6c948e10c 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -77,7 +77,8 @@ from qutebrowser.utils import (log, version, message, utils, urlutils, objreg, usertypes, standarddir, error, qtutils) # pylint: disable=unused-import # We import those to run the cmdutils.register decorators. -from qutebrowser.components import scrollcommands, caretcommands, zoomcommands +from qutebrowser.components import (scrollcommands, caretcommands, + zoomcommands, misccommands) from qutebrowser.mainwindow.statusbar import command from qutebrowser.misc import utilcmds # pylint: enable=unused-import diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index f6fecdce8..19ae41a68 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -19,7 +19,6 @@ """Command dispatcher for TabbedBrowser.""" -import os import os.path import shlex import functools @@ -27,7 +26,6 @@ import typing from PyQt5.QtWidgets import QApplication, QTabBar from PyQt5.QtCore import pyqtSlot, Qt, QUrl, QEvent, QUrlQuery -from PyQt5.QtPrintSupport import QPrintPreviewDialog from qutebrowser.commands import userscripts, runners from qutebrowser.api import cmdutils @@ -370,83 +368,6 @@ class CommandDispatcher: if parsed is not None: yield parsed - @cmdutils.register(instance='command-dispatcher', name='reload', - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def reloadpage(self, force=False, count=None): - """Reload the current/[count]th tab. - - Args: - count: The tab index to reload, or None. - force: Bypass the page cache. - """ - tab = self._cntwidget(count) - if tab is not None: - tab.reload(force=force) - - @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - def stop(self, count=None): - """Stop loading in the current/[count]th tab. - - Args: - count: The tab index to stop, or None. - """ - tab = self._cntwidget(count) - if tab is not None: - tab.stop() - - def _print_preview(self, tab): - """Show a print preview.""" - def print_callback(ok): - if not ok: - message.error("Printing failed!") - - tab.printing.check_preview_support() - diag = QPrintPreviewDialog(tab) - diag.setAttribute(Qt.WA_DeleteOnClose) - diag.setWindowFlags(diag.windowFlags() | Qt.WindowMaximizeButtonHint | - Qt.WindowMinimizeButtonHint) - diag.paintRequested.connect(functools.partial( - tab.printing.to_printer, callback=print_callback)) - diag.exec_() - - def _print_pdf(self, tab, filename): - """Print to the given PDF file.""" - tab.printing.check_pdf_support() - filename = os.path.expanduser(filename) - directory = os.path.dirname(filename) - if directory and not os.path.exists(directory): - os.mkdir(directory) - tab.printing.to_pdf(filename) - log.misc.debug("Print to file: {}".format(filename)) - - @cmdutils.register(instance='command-dispatcher', name='print', - scope='window') - @cmdutils.argument('count', value=cmdutils.Value.count) - @cmdutils.argument('pdf', flag='f', metavar='file') - def printpage(self, preview=False, count=None, *, pdf=None): - """Print the current/[count]th tab. - - Args: - preview: Show preview instead of printing. - count: The tab index to print, or None. - pdf: The file path to write the PDF to. - """ - tab = self._cntwidget(count) - if tab is None: - return - - try: - if preview: - self._print_preview(tab) - elif pdf: - self._print_pdf(tab, pdf) - else: - tab.printing.show_dialog() - except browsertab.WebTabError as e: - raise cmdutils.CommandError(e) - @cmdutils.register(instance='command-dispatcher', scope='window') def tab_clone(self, bg=False, window=False): """Duplicate the current tab. @@ -1110,11 +1031,6 @@ class CommandDispatcher: proc.start(cmd, args) proc.finished.connect(_on_proc_finished) - @cmdutils.register(instance='command-dispatcher', scope='window') - def home(self): - """Open main startpage in current tab.""" - self.openurl(config.val.url.start_pages[0]) - def _run_userscript(self, selection, cmd, args, verbose, count): """Run a userscript given as argument. @@ -1384,30 +1300,6 @@ class CommandDispatcher: else: tab.action.show_source(pygments) - @cmdutils.register(instance='command-dispatcher', scope='window', - debug=True) - def debug_dump_page(self, dest, plain=False): - """Dump the current page's content to a file. - - Args: - dest: Where to write the file to. - plain: Write plain text instead of HTML. - """ - tab = self._current_widget() - dest = os.path.expanduser(dest) - - def callback(data): - """Write the data to disk.""" - try: - with open(dest, 'w', encoding='utf-8') as f: - f.write(data) - except OSError as e: - message.error('Could not write page: {}'.format(e)) - else: - message.info("Dumped page to {}.".format(dest)) - - tab.dump_async(callback, plain=plain) - @cmdutils.register(instance='command-dispatcher', scope='window') def history(self, tab=True, bg=False, window=False): """Show browsing history. @@ -1525,75 +1417,6 @@ class CommandDispatcher: message.error(str(e)) ed.backup() - @cmdutils.register(instance='command-dispatcher', maxsplit=0, - scope='window') - def insert_text(self, text): - """Insert text at cursor position. - - Args: - text: The text to insert. - """ - tab = self._current_widget() - - def _insert_text_cb(elem): - if elem is None: - message.error("No element focused!") - return - try: - elem.insert_text(text) - except webelem.Error as e: - message.error(str(e)) - return - - tab.elements.find_focused(_insert_text_cb) - - @cmdutils.register(instance='command-dispatcher', scope='window') - @cmdutils.argument('filter_', choices=['id']) - def click_element(self, filter_: str, value: str, *, - target: usertypes.ClickTarget = - usertypes.ClickTarget.normal, - force_event: bool = False) -> None: - """Click the element matching the given filter. - - The given filter needs to result in exactly one element, otherwise, an - error is shown. - - Args: - filter_: How to filter the elements. - id: Get an element based on its ID. - value: The value to filter for. - target: How to open the clicked element (normal/tab/tab-bg/window). - force_event: Force generating a fake click event. - """ - tab = self._current_widget() - - def single_cb(elem): - """Click a single element.""" - if elem is None: - message.error("No element found with id {}!".format(value)) - return - try: - elem.click(target, force_event=force_event) - except webelem.Error as e: - message.error(str(e)) - return - - # def multiple_cb(elems): - # """Click multiple elements (with only one expected).""" - # if not elems: - # message.error("No element found!") - # return - # elif len(elems) != 1: - # message.error("{} elements found!".format(len(elems))) - # return - # elems[0].click(target) - - handlers = { - 'id': (tab.elements.find_id, single_cb), - } - handler, callback = handlers[filter_] - handler(value, callback) - def _search_cb(self, found, *, tab, old_scroll_pos, options, text, prev): """Callback called from search/search_next/search_prev. @@ -1721,27 +1544,6 @@ class CommandDispatcher: tab.search.prev_result() tab.search.prev_result(result_cb=cb) - @cmdutils.register(instance='command-dispatcher', scope='window', - debug=True) - @cmdutils.argument('count', value=cmdutils.Value.count) - def debug_webaction(self, action, count=1): - """Execute a webaction. - - Available actions: - http://doc.qt.io/archives/qt-5.5/qwebpage.html#WebAction-enum (WebKit) - http://doc.qt.io/qt-5/qwebenginepage.html#WebAction-enum (WebEngine) - - Args: - action: The action to execute, e.g. MoveToNextChar. - count: How many times to repeat the action. - """ - tab = self._current_widget() - for _ in range(count): - try: - tab.action.run_string(action) - except browsertab.WebTabError as e: - raise cmdutils.CommandError(str(e)) - @cmdutils.register(instance='command-dispatcher', scope='window', maxsplit=0, no_cmd_split=True) def jseval(self, js_code: str, file: bool = False, quiet: bool = False, *, @@ -1920,20 +1722,3 @@ class CommandDispatcher: window = self._tabbed_browser.widget.window() window.setWindowState(window.windowState() ^ Qt.WindowFullScreen) - - @cmdutils.register(instance='command-dispatcher', scope='window', - name='tab-mute') - @cmdutils.argument('count', value=cmdutils.Value.count) - def tab_mute(self, count=None): - """Mute/Unmute the current/[count]th tab. - - Args: - count: The tab index to mute or unmute, or None - """ - tab = self._cntwidget(count) - if tab is None: - return - try: - tab.audio.set_muted(tab.audio.is_muted(), override=True) - except browsertab.WebTabError as e: - raise cmdutils.CommandError(e) diff --git a/qutebrowser/components/misccommands.py b/qutebrowser/components/misccommands.py new file mode 100644 index 000000000..4f730af3c --- /dev/null +++ b/qutebrowser/components/misccommands.py @@ -0,0 +1,312 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Various commands.""" + +import os +import signal +import functools +import typing +import logging + +try: + import hunter +except ImportError: + hunter = None + +from qutebrowser.api import cmdutils, apitypes, message, config + +from PyQt5.QtCore import Qt +from PyQt5.QtPrintSupport import QPrintPreviewDialog + + +@cmdutils.register(name='reload') +@cmdutils.argument('count', value=cmdutils.Value.count) +@cmdutils.argument('tab', value=cmdutils.Value.count_tab) +def reloadpage(tab, force=False, count=None): + """Reload the current/[count]th tab. + + Args: + count: The tab index to reload, or None. + force: Bypass the page cache. + """ + if tab is not None: + tab.reload(force=force) + + +@cmdutils.register() +@cmdutils.argument('count', value=cmdutils.Value.count) +@cmdutils.argument('tab', value=cmdutils.Value.count_tab) +def stop(tab, count=None): + """Stop loading in the current/[count]th tab. + + Args: + count: The tab index to stop, or None. + """ + if tab is not None: + tab.stop() + + +def _print_preview(tab): + """Show a print preview.""" + def print_callback(ok): + if not ok: + message.error("Printing failed!") + + tab.printing.check_preview_support() + diag = QPrintPreviewDialog(tab) + diag.setAttribute(Qt.WA_DeleteOnClose) + diag.setWindowFlags(diag.windowFlags() | Qt.WindowMaximizeButtonHint | + Qt.WindowMinimizeButtonHint) + diag.paintRequested.connect(functools.partial( + tab.printing.to_printer, callback=print_callback)) + diag.exec_() + + +def _print_pdf(tab, filename): + """Print to the given PDF file.""" + tab.printing.check_pdf_support() + filename = os.path.expanduser(filename) + directory = os.path.dirname(filename) + if directory and not os.path.exists(directory): + os.mkdir(directory) + tab.printing.to_pdf(filename) + logging.getLogger('misc').debug("Print to file: {}".format(filename)) + + +@cmdutils.register(name='print') +@cmdutils.argument('tab', value=cmdutils.Value.count_tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +@cmdutils.argument('pdf', flag='f', metavar='file') +def printpage(tab, preview=False, count=None, *, pdf=None): + """Print the current/[count]th tab. + + Args: + preview: Show preview instead of printing. + count: The tab index to print, or None. + pdf: The file path to write the PDF to. + """ + if tab is None: + return + + try: + if preview: + _print_preview(tab) + elif pdf: + _print_pdf(tab, pdf) + else: + tab.printing.show_dialog() + except apitypes.WebTabError as e: + raise cmdutils.CommandError(e) + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) +def home(tab): + """Open main startpage in current tab.""" + tab.load_url(config.val.url.start_pages[0]) + + +@cmdutils.register(debug=True) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) +def debug_dump_page(tab, dest, plain=False): + """Dump the current page's content to a file. + + Args: + dest: Where to write the file to. + plain: Write plain text instead of HTML. + """ + dest = os.path.expanduser(dest) + + def callback(data): + """Write the data to disk.""" + try: + with open(dest, 'w', encoding='utf-8') as f: + f.write(data) + except OSError as e: + message.error('Could not write page: {}'.format(e)) + else: + message.info("Dumped page to {}.".format(dest)) + + tab.dump_async(callback, plain=plain) + + +@cmdutils.register(maxsplit=0) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) +def insert_text(tab, text): + """Insert text at cursor position. + + Args: + text: The text to insert. + """ + def _insert_text_cb(elem): + if elem is None: + message.error("No element focused!") + return + try: + elem.insert_text(text) + except apitypes.WebElemError as e: + message.error(str(e)) + return + + tab.elements.find_focused(_insert_text_cb) + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) +@cmdutils.argument('filter_', choices=['id']) +def click_element(tab, filter_: str, value: str, *, + target: apitypes.ClickTarget = + apitypes.ClickTarget.normal, + force_event: bool = False) -> None: + """Click the element matching the given filter. + + The given filter needs to result in exactly one element, otherwise, an + error is shown. + + Args: + filter_: How to filter the elements. + id: Get an element based on its ID. + value: The value to filter for. + target: How to open the clicked element (normal/tab/tab-bg/window). + force_event: Force generating a fake click event. + """ + def single_cb(elem): + """Click a single element.""" + if elem is None: + message.error("No element found with id {}!".format(value)) + return + try: + elem.click(target, force_event=force_event) + except apitypes.WebElemError as e: + message.error(str(e)) + return + + handlers = { + 'id': (tab.elements.find_id, single_cb), + } + handler, callback = handlers[filter_] + handler(value, callback) + + +@cmdutils.register(debug=True) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def debug_webaction(tab, action, count=1): + """Execute a webaction. + + Available actions: + http://doc.qt.io/archives/qt-5.5/qwebpage.html#WebAction-enum (WebKit) + http://doc.qt.io/qt-5/qwebenginepage.html#WebAction-enum (WebEngine) + + Args: + action: The action to execute, e.g. MoveToNextChar. + count: How many times to repeat the action. + """ + for _ in range(count): + try: + tab.action.run_string(action) + except apitypes.WebTabError as e: + raise cmdutils.CommandError(str(e)) + + +@cmdutils.register() +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) +@cmdutils.argument('count', value=cmdutils.Value.count) +def tab_mute(tab, count=None): + """Mute/Unmute the current/[count]th tab. + + Args: + count: The tab index to mute or unmute, or None + """ + if tab is None: + return + try: + tab.audio.set_muted(tab.audio.is_muted(), override=True) + except apitypes.WebTabError as e: + raise cmdutils.CommandError(e) + + +@cmdutils.register() +def nop(): + """Do nothing.""" + + +@cmdutils.register() +def message_error(text): + """Show an error message in the statusbar. + + Args: + text: The text to show. + """ + message.error(text) + + +@cmdutils.register() +@cmdutils.argument('count', value=cmdutils.Value.count) +def message_info(text, count=1): + """Show an info message in the statusbar. + + Args: + text: The text to show. + count: How many times to show the message + """ + for _ in range(count): + message.info(text) + + +@cmdutils.register() +def message_warning(text): + """Show a warning message in the statusbar. + + Args: + text: The text to show. + """ + message.warning(text) + + +@cmdutils.register(debug=True) +@cmdutils.argument('typ', choices=['exception', 'segfault']) +def debug_crash(typ='exception'): + """Crash for debugging purposes. + + Args: + typ: either 'exception' or 'segfault'. + """ + if typ == 'segfault': + os.kill(os.getpid(), signal.SIGSEGV) + raise Exception("Segfault failed (wat.)") + else: + raise Exception("Forced crash") + + +@cmdutils.register(debug=True, maxsplit=0, no_cmd_split=True) +def debug_trace(expr=""): + """Trace executed code via hunter. + + Args: + expr: What to trace, passed to hunter. + """ + if hunter is None: + raise cmdutils.CommandError("You need to install 'hunter' to use this " + "command!") + try: + eval('hunter.trace({})'.format(expr)) + except Exception as e: + raise cmdutils.CommandError("{}: {}".format(e.__class__.__name__, e)) diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py index 287704551..7c515cb0e 100644 --- a/qutebrowser/misc/utilcmds.py +++ b/qutebrowser/misc/utilcmds.py @@ -24,11 +24,6 @@ import os import signal import traceback -try: - import hunter -except ImportError: - hunter = None - from PyQt5.QtCore import QUrl # so it's available for :debug-pyeval from PyQt5.QtWidgets import QApplication # pylint: disable=unused-import @@ -111,60 +106,12 @@ def run_with_count(count_arg: int, command: str, win_id: int, runners.CommandRunner(win_id).run(command, count_arg * count) -@cmdutils.register() -def message_error(text): - """Show an error message in the statusbar. - - Args: - text: The text to show. - """ - message.error(text) - - -@cmdutils.register() -@cmdutils.argument('count', value=cmdutils.Value.count) -def message_info(text, count=1): - """Show an info message in the statusbar. - - Args: - text: The text to show. - count: How many times to show the message - """ - for _ in range(count): - message.info(text) - - -@cmdutils.register() -def message_warning(text): - """Show a warning message in the statusbar. - - Args: - text: The text to show. - """ - message.warning(text) - - @cmdutils.register() def clear_messages(): """Clear all message notifications.""" message.global_bridge.clear_messages.emit() -@cmdutils.register(debug=True) -@cmdutils.argument('typ', choices=['exception', 'segfault']) -def debug_crash(typ='exception'): - """Crash for debugging purposes. - - Args: - typ: either 'exception' or 'segfault'. - """ - if typ == 'segfault': - os.kill(os.getpid(), signal.SIGSEGV) - raise Exception("Segfault failed (wat.)") - else: - raise Exception("Forced crash") - - @cmdutils.register(debug=True) def debug_all_objects(): """Print a list of all objects to the debug log.""" @@ -220,22 +167,6 @@ def debug_console(): con_widget.show() -@cmdutils.register(debug=True, maxsplit=0, no_cmd_split=True) -def debug_trace(expr=""): - """Trace executed code via hunter. - - Args: - expr: What to trace, passed to hunter. - """ - if hunter is None: - raise cmdutils.CommandError("You need to install 'hunter' to use this " - "command!") - try: - eval('hunter.trace({})'.format(expr)) - except Exception as e: - raise cmdutils.CommandError("{}: {}".format(e.__class__.__name__, e)) - - @cmdutils.register(maxsplit=0, debug=True, no_cmd_split=True) def debug_pyeval(s, file=False, quiet=False): """Evaluate a python string and display the results as a web page. @@ -371,11 +302,6 @@ def window_only(current_win_id): window.close() -@cmdutils.register() -def nop(): - """Do nothing.""" - - @cmdutils.register() @cmdutils.argument('win_id', value=cmdutils.Value.win_id) def version(win_id, paste=False): From bfa518896a695f0545dedb708f4e6db5667a9dd8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 16:23:34 +0100 Subject: [PATCH 247/492] Fix Command.takes_count Before, what this actually did was checking the .count argument of a string (the *keys* in self._qute_args). Therefore, it always returned True as soon as a command had any @cmdutils.argument decorator. --- qutebrowser/commands/command.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 5e9130b0b..0904abf95 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -537,7 +537,10 @@ class Command: def takes_count(self): """Return true iff this command can take a count argument.""" - return any(arg.count for arg in self._qute_args) + count_values = [usertypes.CommandValue.count, + usertypes.CommandValue.count_tab] + return any(info.value in count_values + for info in self._qute_args.values()) def register(self): """Register this command in objects.commands.""" From 40d376fbcfc0a2599342b0550b0a82d80c2ae7f4 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 16:25:12 +0100 Subject: [PATCH 248/492] Move unit tests --- tests/unit/components/test_misccommands.py | 93 ++++++++++++++++++++++ tests/unit/misc/test_utilcmds.py | 68 +--------------- 2 files changed, 94 insertions(+), 67 deletions(-) create mode 100644 tests/unit/components/test_misccommands.py diff --git a/tests/unit/components/test_misccommands.py b/tests/unit/components/test_misccommands.py new file mode 100644 index 000000000..95eb0c6e3 --- /dev/null +++ b/tests/unit/components/test_misccommands.py @@ -0,0 +1,93 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Tests for qutebrowser.components.misccommands.""" + +import signal +import contextlib +import time + +import pytest + +from qutebrowser.api import cmdutils +from qutebrowser.utils import utils +from qutebrowser.components import misccommands + + +@contextlib.contextmanager +def _trapped_segv(handler): + """Temporarily install given signal handler for SIGSEGV.""" + old_handler = signal.signal(signal.SIGSEGV, handler) + yield + signal.signal(signal.SIGSEGV, old_handler) + + +def test_debug_crash_exception(): + """Verify that debug_crash crashes as intended.""" + with pytest.raises(Exception, match="Forced crash"): + misccommands.debug_crash(typ='exception') + + +@pytest.mark.skipif(utils.is_windows, + reason="current CPython/win can't recover from SIGSEGV") +def test_debug_crash_segfault(): + """Verify that debug_crash crashes as intended.""" + caught = False + + def _handler(num, frame): + """Temporary handler for segfault.""" + nonlocal caught + caught = num == signal.SIGSEGV + + with _trapped_segv(_handler): + # since we handle the segfault, execution will continue and run into + # the "Segfault failed (wat.)" Exception + with pytest.raises(Exception, match="Segfault failed"): + misccommands.debug_crash(typ='segfault') + time.sleep(0.001) + assert caught + + +def test_debug_trace(mocker): + """Check if hunter.trace is properly called.""" + # but only if hunter is available + pytest.importorskip('hunter') + hunter_mock = mocker.patch.object(misccommands, 'hunter') + misccommands.debug_trace(1) + hunter_mock.trace.assert_called_with(1) + + +def test_debug_trace_exception(mocker): + """Check that exceptions thrown by hunter.trace are handled.""" + def _mock_exception(): + """Side effect for testing debug_trace's reraise.""" + raise Exception('message') + + hunter_mock = mocker.patch.object(misccommands, 'hunter') + hunter_mock.trace.side_effect = _mock_exception + with pytest.raises(cmdutils.CommandError, match='Exception: message'): + misccommands.debug_trace() + + +def test_debug_trace_no_hunter(monkeypatch): + """Test that an error is shown if debug_trace is called without hunter.""" + monkeypatch.setattr(misccommands, 'hunter', None) + with pytest.raises(cmdutils.CommandError, match="You need to install " + "'hunter' to use this command!"): + misccommands.debug_trace() diff --git a/tests/unit/misc/test_utilcmds.py b/tests/unit/misc/test_utilcmds.py index b4af06aff..1b71d5ddc 100644 --- a/tests/unit/misc/test_utilcmds.py +++ b/tests/unit/misc/test_utilcmds.py @@ -19,80 +19,14 @@ """Tests for qutebrowser.misc.utilcmds.""" -import contextlib import logging -import signal -import time import pytest from PyQt5.QtCore import QUrl from qutebrowser.misc import utilcmds from qutebrowser.api import cmdutils -from qutebrowser.utils import utils, objreg - - -@contextlib.contextmanager -def _trapped_segv(handler): - """Temporarily install given signal handler for SIGSEGV.""" - old_handler = signal.signal(signal.SIGSEGV, handler) - yield - signal.signal(signal.SIGSEGV, old_handler) - - -def test_debug_crash_exception(): - """Verify that debug_crash crashes as intended.""" - with pytest.raises(Exception, match="Forced crash"): - utilcmds.debug_crash(typ='exception') - - -@pytest.mark.skipif(utils.is_windows, - reason="current CPython/win can't recover from SIGSEGV") -def test_debug_crash_segfault(): - """Verify that debug_crash crashes as intended.""" - caught = False - - def _handler(num, frame): - """Temporary handler for segfault.""" - nonlocal caught - caught = num == signal.SIGSEGV - - with _trapped_segv(_handler): - # since we handle the segfault, execution will continue and run into - # the "Segfault failed (wat.)" Exception - with pytest.raises(Exception, match="Segfault failed"): - utilcmds.debug_crash(typ='segfault') - time.sleep(0.001) - assert caught - - -def test_debug_trace(mocker): - """Check if hunter.trace is properly called.""" - # but only if hunter is available - pytest.importorskip('hunter') - hunter_mock = mocker.patch('qutebrowser.misc.utilcmds.hunter') - utilcmds.debug_trace(1) - hunter_mock.trace.assert_called_with(1) - - -def test_debug_trace_exception(mocker): - """Check that exceptions thrown by hunter.trace are handled.""" - def _mock_exception(): - """Side effect for testing debug_trace's reraise.""" - raise Exception('message') - - hunter_mock = mocker.patch('qutebrowser.misc.utilcmds.hunter') - hunter_mock.trace.side_effect = _mock_exception - with pytest.raises(cmdutils.CommandError, match='Exception: message'): - utilcmds.debug_trace() - - -def test_debug_trace_no_hunter(monkeypatch): - """Test that an error is shown if debug_trace is called without hunter.""" - monkeypatch.setattr(utilcmds, 'hunter', None) - with pytest.raises(cmdutils.CommandError, match="You need to install " - "'hunter' to use this command!"): - utilcmds.debug_trace() +from qutebrowser.utils import objreg def test_repeat_command_initial(mocker, mode_manager): From 34aaca2aa0870190ccdea3192132a09ff90066cf Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 16:25:19 +0100 Subject: [PATCH 249/492] Fix lint --- qutebrowser/api/config.py | 5 ++++- qutebrowser/browser/hints.py | 2 +- qutebrowser/components/misccommands.py | 17 ++++++----------- qutebrowser/components/zoomcommands.py | 15 ++++++++------- qutebrowser/misc/utilcmds.py | 1 - 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/qutebrowser/api/config.py b/qutebrowser/api/config.py index c1394d46a..6558cf42a 100644 --- a/qutebrowser/api/config.py +++ b/qutebrowser/api/config.py @@ -21,6 +21,9 @@ import typing -from qutebrowser.config import config +MYPY = False +if MYPY: + # pylint: disable=unused-import,useless-suppression + from qutebrowser.config import config val = typing.cast('config.ConfigContainer', None) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index bce185298..43257d0a8 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -218,7 +218,7 @@ class HintActions: if context.target in [Target.normal, Target.current]: # Set the pre-jump mark ', so we can jump back here after following - context.tab.scroll.before_jump_requested.emit() + context.tab.scroller.before_jump_requested.emit() try: if context.target == Target.hover: diff --git a/qutebrowser/components/misccommands.py b/qutebrowser/components/misccommands.py index 4f730af3c..af10dc707 100644 --- a/qutebrowser/components/misccommands.py +++ b/qutebrowser/components/misccommands.py @@ -22,7 +22,6 @@ import os import signal import functools -import typing import logging try: @@ -30,16 +29,15 @@ try: except ImportError: hunter = None -from qutebrowser.api import cmdutils, apitypes, message, config - from PyQt5.QtCore import Qt from PyQt5.QtPrintSupport import QPrintPreviewDialog +from qutebrowser.api import cmdutils, apitypes, message, config + @cmdutils.register(name='reload') -@cmdutils.argument('count', value=cmdutils.Value.count) @cmdutils.argument('tab', value=cmdutils.Value.count_tab) -def reloadpage(tab, force=False, count=None): +def reloadpage(tab, force=False): """Reload the current/[count]th tab. Args: @@ -51,9 +49,8 @@ def reloadpage(tab, force=False, count=None): @cmdutils.register() -@cmdutils.argument('count', value=cmdutils.Value.count) @cmdutils.argument('tab', value=cmdutils.Value.count_tab) -def stop(tab, count=None): +def stop(tab): """Stop loading in the current/[count]th tab. Args: @@ -92,9 +89,8 @@ def _print_pdf(tab, filename): @cmdutils.register(name='print') @cmdutils.argument('tab', value=cmdutils.Value.count_tab) -@cmdutils.argument('count', value=cmdutils.Value.count) @cmdutils.argument('pdf', flag='f', metavar='file') -def printpage(tab, preview=False, count=None, *, pdf=None): +def printpage(tab, preview=False, *, pdf=None): """Print the current/[count]th tab. Args: @@ -228,8 +224,7 @@ def debug_webaction(tab, action, count=1): @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -@cmdutils.argument('count', value=cmdutils.Value.count) -def tab_mute(tab, count=None): +def tab_mute(tab): """Mute/Unmute the current/[count]th tab. Args: diff --git a/qutebrowser/components/zoomcommands.py b/qutebrowser/components/zoomcommands.py index 16afa18e2..05d2d8481 100644 --- a/qutebrowser/components/zoomcommands.py +++ b/qutebrowser/components/zoomcommands.py @@ -61,7 +61,7 @@ def zoom_out(tab: apitypes.Tab, count=1, quiet=False): @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def zoom(tab: apitypes.Tab, zoom=None, count=None, quiet=False): +def zoom(tab: apitypes.Tab, level=None, count=None, quiet=False): """Set the zoom level for the current tab. The zoom can be given as argument or as [count]. If neither is @@ -69,19 +69,20 @@ def zoom(tab: apitypes.Tab, zoom=None, count=None, quiet=False): use [count]. Args: - zoom: The zoom percentage to set. + level: The zoom percentage to set. count: The zoom percentage to set. quiet: Don't show a zoom level message. """ - if zoom is not None: + if level is not None: try: - zoom = int(zoom.rstrip('%')) + level = int(level.rstrip('%')) except ValueError: raise cmdutils.CommandError("zoom: Invalid int value {}" - .format(zoom)) + .format(level)) - level = count if count is not None else zoom - if level is None: + if count is not None: + level = count + elif level is None: level = config.val.zoom.default try: diff --git a/qutebrowser/misc/utilcmds.py b/qutebrowser/misc/utilcmds.py index 7c515cb0e..c2b2e6168 100644 --- a/qutebrowser/misc/utilcmds.py +++ b/qutebrowser/misc/utilcmds.py @@ -21,7 +21,6 @@ import functools import os -import signal import traceback from PyQt5.QtCore import QUrl From 23d0dbd998e8252e250131a0c1699f5c61ddc494 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 16:28:43 +0100 Subject: [PATCH 250/492] Fix handling of optional values in _add_special_arg That way, we can pass None as a valid value. --- qutebrowser/commands/command.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 0904abf95..67e54ccb7 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -350,7 +350,7 @@ class Command: raise ValueError("Invalid scope {}!".format(scope)) return objreg.get(name, scope=scope, window=win_id, tab=tab_id) - def _add_special_arg(self, *, value, param, args, kwargs, optional=False): + def _add_special_arg(self, *, value, param, args, kwargs): """Add a special argument value to a function call. Arguments: @@ -358,18 +358,11 @@ class Command: param: The parameter being filled. args: The positional argument list. Gets modified directly. kwargs: The keyword argument dict. Gets modified directly. - optional: Whether the value can be optional. """ - if not optional: - assert value is not None if param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD: - if value is not None: - args.append(value) - else: - args.append(param.default) + args.append(value) elif param.kind == inspect.Parameter.KEYWORD_ONLY: - if value is not None: - kwargs[param.name] = value + kwargs[param.name] = value else: raise TypeError("{}: invalid parameter type {} for argument " "{!r}!".format(self.name, param.kind, param.name)) @@ -388,7 +381,7 @@ class Command: tab = None self._add_special_arg(value=tab, param=param, args=args, - kwargs=kwargs, optional=True) + kwargs=kwargs) def _get_param_value(self, param): """Get the converted value for an inspect.Parameter.""" @@ -451,8 +444,13 @@ class Command: args=args, kwargs=kwargs) continue elif arg_info.value == usertypes.CommandValue.count: - self._add_special_arg(value=self._count, param=param, - args=args, kwargs=kwargs, optional=True) + if self._count is None: + assert param.default is not inspect.Parameter.empty + value = param.default + else: + value = self._count + self._add_special_arg(value=value, param=param, + args=args, kwargs=kwargs) continue elif arg_info.value == usertypes.CommandValue.win_id: self._add_special_arg(value=win_id, param=param, From a0dca95310e061eb594bd6e986a7a0039fe192cd Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 16:35:40 +0100 Subject: [PATCH 251/492] Move Command._handle_special_call_arg out of _get_call_args --- qutebrowser/commands/command.py | 87 ++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 67e54ccb7..2191769bb 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -420,6 +420,55 @@ class Command: return value + def _handle_special_call_arg(self, *, pos, param, win_id, args, kwargs): + """Check whether the argument is special, and if so, fill it in. + + Args: + pos: The position of the argument. + param: The argparse.Parameter. + win_id: The window ID the command is run in. + args/kwargs: The args/kwargs to fill. + + Return: + True if it was a special arg, False otherwise. + """ + arg_info = self.get_arg_info(param) + if pos == 0 and self._instance is not None: + assert param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD + self_value = self._get_objreg(win_id=win_id, name=self._instance, + scope=self._scope) + self._add_special_arg(value=self_value, param=param, + args=args, kwargs=kwargs) + return True + elif arg_info.value == usertypes.CommandValue.count: + if self._count is None: + assert param.default is not inspect.Parameter.empty + value = param.default + else: + value = self._count + self._add_special_arg(value=value, param=param, + args=args, kwargs=kwargs) + return True + elif arg_info.value == usertypes.CommandValue.win_id: + self._add_special_arg(value=win_id, param=param, + args=args, kwargs=kwargs) + return True + elif arg_info.value == usertypes.CommandValue.cur_tab: + tab = self._get_objreg(win_id=win_id, name='tab', scope='tab') + self._add_special_arg(value=tab, param=param, + args=args, kwargs=kwargs) + return True + elif arg_info.value == usertypes.CommandValue.count_tab: + self._add_count_tab(win_id=win_id, param=param, args=args, + kwargs=kwargs) + return True + elif arg_info.value is None: + pass + else: + raise utils.Unreachable(arg_info) + + return False + def _get_call_args(self, win_id): """Get arguments for a function call. @@ -434,42 +483,10 @@ class Command: signature = inspect.signature(self.handler) for i, param in enumerate(signature.parameters.values()): - arg_info = self.get_arg_info(param) - if i == 0 and self._instance is not None: - assert param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD - self_value = self._get_objreg(win_id=win_id, - name=self._instance, - scope=self._scope) - self._add_special_arg(value=self_value, param=param, - args=args, kwargs=kwargs) + if self._handle_special_call_arg(pos=i, param=param, + win_id=win_id, args=args, + kwargs=kwargs): continue - elif arg_info.value == usertypes.CommandValue.count: - if self._count is None: - assert param.default is not inspect.Parameter.empty - value = param.default - else: - value = self._count - self._add_special_arg(value=value, param=param, - args=args, kwargs=kwargs) - continue - elif arg_info.value == usertypes.CommandValue.win_id: - self._add_special_arg(value=win_id, param=param, - args=args, kwargs=kwargs) - continue - elif arg_info.value == usertypes.CommandValue.cur_tab: - tab = self._get_objreg(win_id=win_id, name='tab', scope='tab') - self._add_special_arg(value=tab, param=param, - args=args, kwargs=kwargs) - continue - elif arg_info.value == usertypes.CommandValue.count_tab: - self._add_count_tab(win_id=win_id, param=param, args=args, - kwargs=kwargs) - continue - - elif arg_info.value is None: - pass - else: - raise utils.Unreachable(arg_info) value = self._get_param_value(param) if param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD: From d484d9363e28adf11713724645f2784b254cae69 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 16:51:55 +0100 Subject: [PATCH 252/492] Fix caret cmds --- qutebrowser/components/caretcommands.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qutebrowser/components/caretcommands.py b/qutebrowser/components/caretcommands.py index c359c27ac..98791e921 100644 --- a/qutebrowser/components/caretcommands.py +++ b/qutebrowser/components/caretcommands.py @@ -168,24 +168,28 @@ def move_to_end_of_prev_block(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) def move_to_start_of_document(tab: apitypes.Tab): """Move the cursor or selection to the start of the document.""" tab.caret.move_to_start_of_document() @cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) def move_to_end_of_document(tab: apitypes.Tab): """Move the cursor or selection to the end of the document.""" tab.caret.move_to_end_of_document() @cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) def toggle_selection(tab: apitypes.Tab): """Toggle caret selection mode.""" tab.caret.toggle_selection() @cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) def drop_selection(tab: apitypes.Tab): """Drop selection and keep selection mode enabled.""" tab.caret.drop_selection() From a7a8f4470b89fc184fc22990e2c335540d44aa1e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 16:57:48 +0100 Subject: [PATCH 253/492] Make ExternalEditor slots private --- qutebrowser/misc/editor.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qutebrowser/misc/editor.py b/qutebrowser/misc/editor.py index 038331c9b..3c5b7471e 100644 --- a/qutebrowser/misc/editor.py +++ b/qutebrowser/misc/editor.py @@ -84,7 +84,7 @@ class ExternalEditor(QObject): message.error("Failed to delete tempfile... ({})".format(e)) @pyqtSlot(int, QProcess.ExitStatus) - def on_proc_closed(self, _exitcode, exitstatus): + def _on_proc_closed(self, _exitcode, exitstatus): """Write the editor text into the form field and clean up tempfile. Callback for QProcess when the editor was closed. @@ -100,7 +100,7 @@ class ExternalEditor(QObject): self._cleanup() @pyqtSlot(QProcess.ProcessError) - def on_proc_error(self, _err): + def _on_proc_error(self, _err): self._cleanup() def edit(self, text, caret_position=None): @@ -176,8 +176,8 @@ class ExternalEditor(QObject): column: the column number to pass to the editor """ self._proc = guiprocess.GUIProcess(what='editor', parent=self) - self._proc.finished.connect(self.on_proc_closed) - self._proc.error.connect(self.on_proc_error) + self._proc.finished.connect(self._on_proc_closed) + self._proc.error.connect(self._on_proc_error) editor = config.val.editor.command executable = editor[0] From 4d8c8a5d92d3d4abbbb2f03e5790c24beed03e65 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 30 Nov 2018 16:58:33 +0100 Subject: [PATCH 254/492] Fix :home with pinned tabs --- qutebrowser/components/misccommands.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qutebrowser/components/misccommands.py b/qutebrowser/components/misccommands.py index af10dc707..9ecaa999c 100644 --- a/qutebrowser/components/misccommands.py +++ b/qutebrowser/components/misccommands.py @@ -116,7 +116,10 @@ def printpage(tab, preview=False, *, pdf=None): @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) def home(tab): """Open main startpage in current tab.""" - tab.load_url(config.val.url.start_pages[0]) + if tab.data.pinned: + message.info("Tab is pinned!") + else: + tab.load_url(config.val.url.start_pages[0]) @cmdutils.register(debug=True) From 0e547414af8771d939aaf5d41ac1cdd25648c258 Mon Sep 17 00:00:00 2001 From: Pellegrino Prevete Date: Sun, 2 Dec 2018 05:32:56 +0000 Subject: [PATCH 255/492] Update translations and desktop actions Added translations for most languages and added some "standard" desktop actions. --- misc/qutebrowser.desktop | 163 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/misc/qutebrowser.desktop b/misc/qutebrowser.desktop index 5243b0c17..976803915 100644 --- a/misc/qutebrowser.desktop +++ b/misc/qutebrowser.desktop @@ -1,7 +1,45 @@ [Desktop Entry] Name=qutebrowser GenericName=Web Browser +GenericName[ar]=ﻢﺘﺼﻔﺣ ﺎﻠﺸﺒﻛﺓ +GenericName[bg]=Уеб браузър +GenericName[ca]=Navegador web +GenericName[cs]=WWW prohlížeč +GenericName[da]=Browser +GenericName[de]=Web-Browser +GenericName[el]=Περιηγητής ιστού +GenericName[en_GB]=Web Browser +GenericName[es]=Navegador web +GenericName[et]=Veebibrauser +GenericName[fi]=WWW-selain +GenericName[fr]=Navigateur Web +GenericName[gu]=વેબ બ્રાઉઝર +GenericName[he]=דפדפן אינטרנט +GenericName[hi]=वेब ब्राउज़र +GenericName[hu]=Webböngésző +GenericName[it]=Browser Web +GenericName[ja]=ウェブブラウザ +GenericName[kn]=ಜಾಲ ವೀಕ್ಷಕ +GenericName[ko]=웹 브라우저 +GenericName[lt]=Žiniatinklio naršyklė +GenericName[lv]=Tīmekļa pārlūks +GenericName[ml]=വെബ് ബ്രൌസര്<200d> +GenericName[mr]=वेब ब्राऊजर +GenericName[nb]=Nettleser +GenericName[nl]=Webbrowser +GenericName[pl]=Przeglądarka WWW +GenericName[pt]=Navegador Web +GenericName[pt_BR]=Navegador da Internet +GenericName[ro]=Navigator de Internet +GenericName[ru]=Веб-браузер +GenericName[sl]=Spletni brskalnik +GenericName[sv]=Webbläsare +GenericName[ta]=இணைய உலாவி +GenericName[th]=เว็บเบราว์เซอร์ +GenericName[tr]=Web Tarayıcı +GenericName[uk]=Навігатор Тенет瀏覽器 Comment=A keyboard-driven, vim-like browser based on PyQt5 +Comment[it]= Un browser web vim-like utilizzabile da tastiera basato su PyQt5 Icon=qutebrowser Type=Application Categories=Network;WebBrowser; @@ -10,3 +48,128 @@ Terminal=false StartupNotify=false MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/qute; Keywords=Browser + +[Desktop Action new-window] +Name=New Window +Name[am]=አዲስ መስኮት +Name[ar]=ﻥﺎﻓﺫﺓ ﺝﺪﻳﺩﺓ +Name[bg]=Нов прозорец +Name[bn]=নতুন উইন্ডো +Name[ca]=Finestra nova +Name[cs]=Nové okno +Name[da]=Nyt vindue +Name[de]=Neues Fenster +Name[el]=Νέο Παράθυρο +Name[en_GB]=New Window +Name[es]=Nueva ventana +Name[et]=Uus aken +Name[fa]=پﻦﺟﺮﻫ ﺝﺩیﺩ +Name[fi]=Uusi ikkuna +Name[fil]=New Window +Name[fr]=Nouvelle fenêtre +Name[gu]=નવી વિંડો +Name[hi]=नई विंडो +Name[hr]=Novi prozor +Name[hu]=Új ablak +Name[id]=Jendela Baru +Name[it]=Nuova finestra +Name[iw]=חלון חדש +Name[ja]=新規ウインドウ +Name[kn]=ಹೊಸ ವಿಂಡೊ +Name[ko]=새 창 +Name[lt]=Naujas langas +Name[lv]=Jauns logs +Name[ml]=പുതിയ വിന്<200d>ഡോ +Name[mr]=नवीन विंडो +Name[nl]=Nieuw venster +Name[no]=Nytt vindu +Name[pl]=Nowe okno +Name[pt]=Nova janela +Name[pt_BR]=Nova janela +Name[ro]=Fereastră nouă +Name[ru]=Новое окно +Name[sk]=Nové okno +Name[sl]=Novo okno +Name[sr]=Нови прозор +Name[sv]=Nytt fönster +Name[sw]=Dirisha Jipya +Name[ta]=புதிய சாளரம் +Name[te]=క్రొత్త విండో +Name[th]=หน้าต่างใหม่ +Name[tr]=Yeni Pencere +Name[uk]=Нове вікно +Name[vi]=Cửa sổ Mới +Exec=qutebrowser + +[Desktop Action preferences] +Name=Preferences +Name[an]=Preferencias +Name[ar]=ﺎﻠﺘﻔﻀﻳﻼﺗ +Name[as]=পছন্দসমূহ +Name[be]=Настройкі +Name[bg]=Настройки +Name[bn_IN]=পছন্দ +Name[bs]=Postavke +Name[ca]=Preferències +Name[ca@valencia]=Preferències +Name[cs]=Předvolby +Name[da]=Indstillinger +Name[de]=Einstellungen +Name[el]=Προτιμήσεις +Name[en_GB]=Preferences +Name[eo]=Agordoj +Name[es]=Preferencias +Name[et]=Eelistused +Name[eu]=Hobespenak +Name[fa]=ﺕﺮﺟیﺡﺎﺗ +Name[fi]=Asetukset +Name[fr]=Préférences +Name[fur]=Preferencis +Name[ga]=Sainroghanna +Name[gd]=Roghainnean +Name[gl]=Preferencias +Name[gu]=પસંદગીઓ +Name[he]=העדפות +Name[hi]=वरीयताएँ +Name[hr]=Osobitosti +Name[hu]=Beállítások +Name[id]=Preferensi +Name[is]=Kjörstillingar +Name[it]=Preferenze +Name[ja]=設定 +Name[kk]=Баптаулар +Name[km]=ចំណូលចិត្ត +Name[kn]=ಆದ್ಯತೆಗಳು +Name[ko]=기본 설정 +Name[lt]=Nuostatos +Name[lv]=Iestatījumi +Name[ml]=മുന്<200d>ഗണനകള്<200d> +Name[mr]=पसंती +Name[nb]=Brukervalg +Name[ne]=प्राथमिकताहरू +Name[nl]=Voorkeuren +Name[oc]=Preferéncias +Name[or]=ପସନ୍ଦ +Name[pa]=ਮੇਰੀ ਪਸੰਦ +Name[pl]=Preferencje +Name[pt]=Preferências +Name[pt_BR]=Preferências +Name[ro]=Preferințe +Name[ru]=Параметры +Name[sk]=Nastavenia +Name[sl]=Možnosti +Name[sr]=Поставке +Name[sr@latin]=Postavke +Name[sv]=Inställningar +Name[ta]=விருப்பங்கள் +Name[te]=అభీష్టాలు +Name[tg]=Хусусиятҳо +Name[th]=ปรับแต่ง +Name[tr]=Tercihler +Name[ug]=ﻡﺎﻳﻰﻠﻟﻰﻗ +Name[uk]=Параметри +Name[vi]=Tùy thích +Name[zh_CN]=首选项 +Name[zh_HK]=偏好設定 +Name[zh_TW]=偏好設定 +Exec=qutebrowser "qute://settings" From e81f070a7929e6c7a1f4ff097c7106a5d256d90e Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sun, 2 Dec 2018 22:56:44 +0700 Subject: [PATCH 256/492] Use tojson filter to convert url to Javascript string Fixes #4450. --- qutebrowser/html/error.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/html/error.html b/qutebrowser/html/error.html index b3e6f576e..e03ddad67 100644 --- a/qutebrowser/html/error.html +++ b/qutebrowser/html/error.html @@ -61,7 +61,7 @@ li { {{ super() }} function tryagain() { - location.href = "{{ url }}"; + location.href = {{ url|tojson }}; } {% endblock %} From ef5e5d84ac3d196ca9af400fcc4294e643970ec7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 08:44:10 +0100 Subject: [PATCH 257/492] Add assert for Command.pos_args --- qutebrowser/commands/command.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 2191769bb..4d0d4af92 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -298,6 +298,8 @@ class Command: name = argparser.arg_name(param.name) arg_info = self.get_arg_info(param) + assert not arg_info.value, name + if arg_info.flag is not None: shortname = arg_info.flag else: From ede13c76d9cbae4134119bc05e60ba0d0930e598 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 08:44:35 +0100 Subject: [PATCH 258/492] Fix checking for count in src2asciidoc --- qutebrowser/commands/command.py | 8 +++++--- scripts/dev/src2asciidoc.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 4d0d4af92..8d2f5ad57 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -71,6 +71,10 @@ class Command: _scope: The scope to get _instance for in the object registry. """ + # CommandValue values which need a count + COUNT_COMMAND_VALUES = [usertypes.CommandValue.count, + usertypes.CommandValue.count_tab] + def __init__(self, *, handler, name, instance=None, maxsplit=None, modes=None, not_modes=None, debug=False, deprecated=False, no_cmd_split=False, star_args_optional=False, scope='global', @@ -554,9 +558,7 @@ class Command: def takes_count(self): """Return true iff this command can take a count argument.""" - count_values = [usertypes.CommandValue.count, - usertypes.CommandValue.count_tab] - return any(info.value in count_values + return any(info.value in self.COUNT_COMMAND_VALUES for info in self._qute_args.values()) def register(self): diff --git a/scripts/dev/src2asciidoc.py b/scripts/dev/src2asciidoc.py index ad1397d82..f7b1d46cd 100755 --- a/scripts/dev/src2asciidoc.py +++ b/scripts/dev/src2asciidoc.py @@ -252,7 +252,7 @@ def _get_command_doc_count(cmd, parser): Strings which should be added to the docs. """ for param in inspect.signature(cmd.handler).parameters.values(): - if cmd.get_arg_info(param).count: + if cmd.get_arg_info(param).value in cmd.COUNT_COMMAND_VALUES: yield "" yield "==== count" try: From 285db344b34368a45380e6f00d87f7764bb008a4 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 08:44:51 +0100 Subject: [PATCH 259/492] Allow to document count_tab as "count:" argument --- scripts/dev/src2asciidoc.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/scripts/dev/src2asciidoc.py b/scripts/dev/src2asciidoc.py index f7b1d46cd..ba4e9b69c 100755 --- a/scripts/dev/src2asciidoc.py +++ b/scripts/dev/src2asciidoc.py @@ -257,9 +257,13 @@ def _get_command_doc_count(cmd, parser): yield "==== count" try: yield parser.arg_descs[param.name] - except KeyError as e: - raise KeyError("No description for count arg {!r} of command " - "{!r}!".format(param.name, cmd.name)) from e + except KeyError: + try: + yield parser.arg_descs['count'] + except KeyError as e: + raise KeyError("No description for count arg {!r} of " + "command {!r}!" + .format(param.name, cmd.name)) from e def _get_command_doc_notes(cmd): From a47ee08a84beb91f152dc483701f2526a7859ab0 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 08:45:13 +0100 Subject: [PATCH 260/492] Fix wrong/missing argument annotations --- qutebrowser/components/caretcommands.py | 2 ++ qutebrowser/components/misccommands.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/qutebrowser/components/caretcommands.py b/qutebrowser/components/caretcommands.py index 98791e921..fe04f2483 100644 --- a/qutebrowser/components/caretcommands.py +++ b/qutebrowser/components/caretcommands.py @@ -108,12 +108,14 @@ def move_to_prev_word(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) def move_to_start_of_line(tab: apitypes.Tab): """Move the cursor or selection to the start of the line.""" tab.caret.move_to_start_of_line() @cmdutils.register(modes=[cmdutils.KeyMode.caret]) +@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) def move_to_end_of_line(tab: apitypes.Tab): """Move the cursor or selection to the end of line.""" tab.caret.move_to_end_of_line() diff --git a/qutebrowser/components/misccommands.py b/qutebrowser/components/misccommands.py index 9ecaa999c..2f9e2f5e5 100644 --- a/qutebrowser/components/misccommands.py +++ b/qutebrowser/components/misccommands.py @@ -226,7 +226,7 @@ def debug_webaction(tab, action, count=1): @cmdutils.register() -@cmdutils.argument('tab', value=cmdutils.Value.cur_tab) +@cmdutils.argument('tab', value=cmdutils.Value.count_tab) def tab_mute(tab): """Mute/Unmute the current/[count]th tab. From d01672bab78114e71a47b3bdff40be4afbb96e08 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 08:45:25 +0100 Subject: [PATCH 261/492] Regenerate docs --- doc/help/commands.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index 13cf0a790..2d71a28c1 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -1484,14 +1484,14 @@ Yank something to the clipboard or primary selection. [[zoom]] === zoom -Syntax: +:zoom [*--quiet*] ['zoom']+ +Syntax: +:zoom [*--quiet*] ['level']+ Set the zoom level for the current tab. The zoom can be given as argument or as [count]. If neither is given, the zoom is set to the default zoom. If both are given, use [count]. ==== positional arguments -* +'zoom'+: The zoom percentage to set. +* +'level'+: The zoom percentage to set. ==== optional arguments * +*-q*+, +*--quiet*+: Don't show a zoom level message. From b0ae4deac8a6e1d9af03a318c86c4b9de83b7c48 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 08:49:10 +0100 Subject: [PATCH 262/492] ADjust check_coverage for api/ --- qutebrowser/api/config.py | 2 +- scripts/dev/check_coverage.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/qutebrowser/api/config.py b/qutebrowser/api/config.py index 6558cf42a..d45703242 100644 --- a/qutebrowser/api/config.py +++ b/qutebrowser/api/config.py @@ -22,7 +22,7 @@ import typing MYPY = False -if MYPY: +if MYPY: # pragma: no cover # pylint: disable=unused-import,useless-suppression from qutebrowser.config import config diff --git a/scripts/dev/check_coverage.py b/scripts/dev/check_coverage.py index 8d0647b0d..62c0b5142 100644 --- a/scripts/dev/check_coverage.py +++ b/scripts/dev/check_coverage.py @@ -53,11 +53,18 @@ MsgType = enum.Enum('MsgType', 'insufficent_coverage, perfect_file') PERFECT_FILES = [ (None, 'commands/cmdexc.py'), - ('tests/unit/api/test_cmdutils.py', - 'api/cmdutils.py'), ('tests/unit/commands/test_argparser.py', 'commands/argparser.py'), + ('tests/unit/api/test_cmdutils.py', + 'api/cmdutils.py'), + (None, + 'api/apitypes.py'), + (None, + 'api/config.py'), + (None, + 'api/message.py'), + ('tests/unit/browser/webkit/test_cache.py', 'browser/webkit/cache.py'), ('tests/unit/browser/webkit/test_cookies.py', From 208d3db475cf5e5fd50840dd80bfef0fc85e98f5 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 12:14:33 +0100 Subject: [PATCH 263/492] Add types for most of qutebrowser.config --- mypy.ini | 36 ++++++ qutebrowser/config/config.py | 184 +++++++++++++++++---------- qutebrowser/config/configcommands.py | 97 ++++++++------ qutebrowser/config/configdata.py | 59 ++++++--- qutebrowser/config/configdiff.py | 7 +- qutebrowser/config/configexc.py | 35 +++-- qutebrowser/config/configfiles.py | 114 ++++++++++------- qutebrowser/config/configinit.py | 20 +-- qutebrowser/config/configutils.py | 49 ++++--- 9 files changed, 385 insertions(+), 216 deletions(-) diff --git a/mypy.ini b/mypy.ini index 288cc6515..be5424327 100644 --- a/mypy.ini +++ b/mypy.ini @@ -61,3 +61,39 @@ disallow_incomplete_defs = True [mypy-qutebrowser.commands.cmdutils] disallow_untyped_defs = True disallow_incomplete_defs = True + +[mypy-qutebrowser.config.config] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configcache] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configcommands] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configdata] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configdiff] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configexc] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configfiles] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configinit] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configutils] +disallow_untyped_defs = True +disallow_incomplete_defs = True diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 1d7e34345..44bf3ca77 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -23,18 +23,21 @@ import copy import contextlib import functools import typing +from typing import Any -from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject +from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QUrl from qutebrowser.config import configdata, configexc, configutils -from qutebrowser.utils import utils, log, jinja +from qutebrowser.utils import utils, log, jinja, urlmatch from qutebrowser.misc import objects from qutebrowser.keyinput import keyutils MYPY = False -if MYPY: - # pylint: disable=unused-import - from qutebrowser.config import configcache # pragma: no cover +if MYPY: # pragma: no cover + # pylint: disable=unused-import,useless-suppression + from typing import Tuple, MutableMapping + from qutebrowser.config import configcache, configfiles + from qutebrowser.misc import savemanager # An easy way to access the config from other code via config.val.foo val = typing.cast('ConfigContainer', None) @@ -61,7 +64,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name _function: Whether a function rather than a method is decorated. """ - def __init__(self, option, function=False): + def __init__(self, option: str, function: bool = False) -> None: """Save decorator arguments. Gets called on parse-time with the decorator arguments. @@ -74,7 +77,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name self._function = function change_filters.append(self) - def validate(self): + def validate(self) -> None: """Make sure the configured option or prefix exists. We can't do this in __init__ as configdata isn't ready yet. @@ -83,7 +86,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name not configdata.is_valid_prefix(self._option)): raise configexc.NoOptionError(self._option) - def _check_match(self, option): + def _check_match(self, option: typing.Optional[str]) -> bool: """Check if the given option matches the filter.""" if option is None: # Called directly, not from a config change event. @@ -96,7 +99,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name else: return False - def __call__(self, func): + def __call__(self, func: typing.Callable) -> typing.Callable: """Filter calls to the decorated function. Gets called when a function should be decorated. @@ -114,20 +117,21 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name """ if self._function: @functools.wraps(func) - def wrapper(option=None): + def func_wrapper(option: str = None) -> typing.Any: """Call the underlying function.""" if self._check_match(option): return func() return None + return func_wrapper else: @functools.wraps(func) - def wrapper(wrapper_self, option=None): + def meth_wrapper(wrapper_self: typing.Any, + option: str = None) -> typing.Any: """Call the underlying function.""" if self._check_match(option): return func(wrapper_self) return None - - return wrapper + return meth_wrapper class KeyConfig: @@ -140,17 +144,22 @@ class KeyConfig: _config: The Config object to be used. """ - def __init__(self, config): + _ReverseBindings = typing.Dict[str, typing.MutableSequence[str]] + + def __init__(self, config: 'Config') -> None: self._config = config - def _validate(self, key, mode): + def _validate(self, key: keyutils.KeySequence, mode: str) -> None: """Validate the given key and mode.""" # Catch old usage of this code assert isinstance(key, keyutils.KeySequence), key if mode not in configdata.DATA['bindings.default'].default: raise configexc.KeybindingError("Invalid mode {}!".format(mode)) - def get_bindings_for(self, mode): + def get_bindings_for( + self, + mode: str + ) -> typing.Dict[keyutils.KeySequence, str]: """Get the combined bindings for the given mode.""" bindings = dict(val.bindings.default[mode]) for key, binding in val.bindings.commands[mode].items(): @@ -160,9 +169,9 @@ class KeyConfig: bindings[key] = binding return bindings - def get_reverse_bindings_for(self, mode): + def get_reverse_bindings_for(self, mode: str) -> '_ReverseBindings': """Get a dict of commands to a list of bindings for the mode.""" - cmd_to_keys = {} + cmd_to_keys = {} # type: KeyConfig._ReverseBindings bindings = self.get_bindings_for(mode) for seq, full_cmd in sorted(bindings.items()): for cmd in full_cmd.split(';;'): @@ -175,7 +184,10 @@ class KeyConfig: cmd_to_keys[cmd].insert(0, str(seq)) return cmd_to_keys - def get_command(self, key, mode, default=False): + def get_command(self, + key: keyutils.KeySequence, + mode: str, + default: bool = False) -> str: """Get the command for a given key (or None).""" self._validate(key, mode) if default: @@ -184,7 +196,11 @@ class KeyConfig: bindings = self.get_bindings_for(mode) return bindings.get(key, None) - def bind(self, key, command, *, mode, save_yaml=False): + def bind(self, + key: keyutils.KeySequence, + command: str, *, + mode: str, + save_yaml: bool = False) -> None: """Add a new binding from key to command.""" if command is not None and not command.strip(): raise configexc.KeybindingError( @@ -192,8 +208,8 @@ class KeyConfig: 'mode'.format(key, mode)) self._validate(key, mode) - log.keyboard.vdebug("Adding binding {} -> {} in mode {}.".format( - key, command, mode)) + log.keyboard.vdebug( # type: ignore + "Adding binding {} -> {} in mode {}.".format(key, command, mode)) bindings = self._config.get_mutable_obj('bindings.commands') if mode not in bindings: @@ -201,7 +217,10 @@ class KeyConfig: bindings[mode][str(key)] = command self._config.update_mutables(save_yaml=save_yaml) - def bind_default(self, key, *, mode='normal', save_yaml=False): + def bind_default(self, + key: keyutils.KeySequence, *, + mode: str = 'normal', + save_yaml: bool = False) -> None: """Restore a default keybinding.""" self._validate(key, mode) @@ -213,7 +232,10 @@ class KeyConfig: "Can't find binding '{}' in {} mode".format(key, mode)) self._config.update_mutables(save_yaml=save_yaml) - def unbind(self, key, *, mode='normal', save_yaml=False): + def unbind(self, + key: keyutils.KeySequence, *, + mode: str = 'normal', + save_yaml: bool = False) -> None: """Unbind the given key in the given mode.""" self._validate(key, mode) @@ -254,24 +276,27 @@ class Config(QObject): MUTABLE_TYPES = (dict, list) changed = pyqtSignal(str) - def __init__(self, yaml_config, parent=None): + def __init__(self, + yaml_config: 'configfiles.YamlConfig', + parent: QObject = None) -> None: super().__init__(parent) self.changed.connect(_render_stylesheet.cache_clear) - self._mutables = {} + self._mutables = {} # type: MutableMapping[str, Tuple[Any, Any]] self._yaml = yaml_config self._init_values() - def _init_values(self): + def _init_values(self) -> None: """Populate the self._values dict.""" - self._values = {} + self._values = {} # type: typing.Mapping for name, opt in configdata.DATA.items(): self._values[name] = configutils.Values(opt) - def __iter__(self): + def __iter__(self) -> typing.Iterator[configutils.Values]: """Iterate over configutils.Values items.""" yield from self._values.values() - def init_save_manager(self, save_manager): + def init_save_manager(self, + save_manager: 'savemanager.SaveManager') -> None: """Make sure the config gets saved properly. We do this outside of __init__ because the config gets created before @@ -279,7 +304,10 @@ class Config(QObject): """ self._yaml.init_save_manager(save_manager) - def _set_value(self, opt, value, pattern=None): + def _set_value(self, + opt: 'configdata.Option', + value: Any, + pattern: urlmatch.UrlPattern = None) -> None: """Set the given option to the given value.""" if not isinstance(objects.backend, objects.NoBackend): if objects.backend not in opt.backends: @@ -294,12 +322,12 @@ class Config(QObject): log.config.debug("Config option changed: {} = {}".format( opt.name, value)) - def _check_yaml(self, opt, save_yaml): + def _check_yaml(self, opt: 'configdata.Option', save_yaml: bool) -> None: """Make sure the given option may be set in autoconfig.yml.""" if save_yaml and opt.no_autoconfig: raise configexc.NoAutoconfigError(opt.name) - def read_yaml(self): + def read_yaml(self) -> None: """Read the YAML settings from self._yaml.""" self._yaml.load() for values in self._yaml: @@ -307,7 +335,7 @@ class Config(QObject): self._set_value(values.opt, scoped.value, pattern=scoped.pattern) - def get_opt(self, name): + def get_opt(self, name: str) -> 'configdata.Option': """Get a configdata.Option object for the given setting.""" try: return configdata.DATA[name] @@ -318,7 +346,10 @@ class Config(QObject): name, deleted=deleted, renamed=renamed) raise exception from None - def get(self, name, url=None, *, fallback=True): + def get(self, + name: str, + url: QUrl = None, *, + fallback: bool = True) -> Any: """Get the given setting converted for Python code. Args: @@ -328,7 +359,7 @@ class Config(QObject): obj = self.get_obj(name, url=url, fallback=fallback) return opt.typ.to_py(obj) - def _maybe_copy(self, value): + def _maybe_copy(self, value: Any) -> Any: """Copy the value if it could potentially be mutated.""" if isinstance(value, self.MUTABLE_TYPES): # For mutable objects, create a copy so we don't accidentally @@ -339,7 +370,10 @@ class Config(QObject): assert value.__hash__ is not None, value return value - def get_obj(self, name, *, url=None, fallback=True): + def get_obj(self, + name: str, *, + url: QUrl = None, + fallback: bool = True) -> Any: """Get the given setting as object (for YAML/config.py). Note that the returned values are not watched for mutation. @@ -349,7 +383,10 @@ class Config(QObject): value = self._values[name].get_for_url(url, fallback=fallback) return self._maybe_copy(value) - def get_obj_for_pattern(self, name, *, pattern): + def get_obj_for_pattern( + self, name: str, *, + pattern: typing.Optional[urlmatch.UrlPattern] + ) -> Any: """Get the given setting as object (for YAML/config.py). This gets the overridden value for a given pattern, or @@ -359,7 +396,8 @@ class Config(QObject): value = self._values[name].get_for_pattern(pattern, fallback=False) return self._maybe_copy(value) - def get_mutable_obj(self, name, *, pattern=None): + def get_mutable_obj(self, name: str, *, + pattern: urlmatch.UrlPattern = None) -> Any: """Get an object which can be mutated, e.g. in a config.py. If a pattern is given, return the value for that pattern. @@ -384,7 +422,8 @@ class Config(QObject): return copy_value - def get_str(self, name, *, pattern=None): + def get_str(self, name: str, *, + pattern: urlmatch.UrlPattern = None) -> str: """Get the given setting as string. If a pattern is given, get the setting for the given pattern or @@ -395,7 +434,10 @@ class Config(QObject): value = values.get_for_pattern(pattern) return opt.typ.to_str(value) - def set_obj(self, name, value, *, pattern=None, save_yaml=False): + def set_obj(self, name: str, + value: Any, *, + pattern: urlmatch.UrlPattern = None, + save_yaml: bool = False) -> None: """Set the given setting from a YAML/config.py object. If save_yaml=True is given, store the new value to YAML. @@ -406,7 +448,10 @@ class Config(QObject): if save_yaml: self._yaml.set_obj(name, value, pattern=pattern) - def set_str(self, name, value, *, pattern=None, save_yaml=False): + def set_str(self, name: str, + value: str, *, + pattern: urlmatch.UrlPattern = None, + save_yaml: bool = False) -> None: """Set the given setting from a string. If save_yaml=True is given, store the new value to YAML. @@ -421,7 +466,9 @@ class Config(QObject): if save_yaml: self._yaml.set_obj(name, converted, pattern=pattern) - def unset(self, name, *, save_yaml=False, pattern=None): + def unset(self, name: str, *, + save_yaml: bool = False, + pattern: urlmatch.UrlPattern = None) -> None: """Set the given setting back to its default.""" opt = self.get_opt(name) self._check_yaml(opt, save_yaml) @@ -432,7 +479,7 @@ class Config(QObject): if save_yaml: self._yaml.unset(name, pattern=pattern) - def clear(self, *, save_yaml=False): + def clear(self, *, save_yaml: bool = False) -> None: """Clear all settings in the config. If save_yaml=True is given, also remove all customization from the YAML @@ -446,7 +493,7 @@ class Config(QObject): if save_yaml: self._yaml.clear() - def update_mutables(self, *, save_yaml=False): + def update_mutables(self, *, save_yaml: bool = False) -> None: """Update mutable settings if they changed. Every time someone calls get_obj() on a mutable object, we save a @@ -461,7 +508,7 @@ class Config(QObject): self.set_obj(name, new_value, save_yaml=save_yaml) self._mutables = {} - def dump_userconfig(self): + def dump_userconfig(self) -> str: """Get the part of the config which was changed by the user. Return: @@ -490,7 +537,10 @@ class ConfigContainer: _pattern: The URL pattern to be used. """ - def __init__(self, config, configapi=None, prefix='', pattern=None): + def __init__(self, config: Config, + configapi: 'configfiles.ConfigAPI' = None, + prefix: str = '', + pattern: urlmatch.UrlPattern = None) -> None: self._config = config self._prefix = prefix self._configapi = configapi @@ -498,13 +548,13 @@ class ConfigContainer: if configapi is None and pattern is not None: raise TypeError("Can't use pattern without configapi!") - def __repr__(self): + def __repr__(self) -> str: return utils.get_repr(self, constructor=True, config=self._config, configapi=self._configapi, prefix=self._prefix, pattern=self._pattern) @contextlib.contextmanager - def _handle_error(self, action, name): + def _handle_error(self, action: str, name: str) -> typing.Iterator[None]: try: yield except configexc.Error as e: @@ -513,7 +563,7 @@ class ConfigContainer: text = "While {} '{}'".format(action, name) self._configapi.errors.append(configexc.ConfigErrorDesc(text, e)) - def __getattr__(self, attr): + def __getattr__(self, attr: str) -> Any: """Get an option or a new ConfigContainer with the added prefix. If we get an option which exists, we return the value for it. @@ -540,7 +590,7 @@ class ConfigContainer: return self._config.get_mutable_obj( name, pattern=self._pattern) - def __setattr__(self, attr, value): + def __setattr__(self, attr: str, value: Any) -> None: """Set the given option in the config.""" if attr.startswith('_'): super().__setattr__(attr, value) @@ -550,7 +600,7 @@ class ConfigContainer: with self._handle_error('setting', name): self._config.set_obj(name, value, pattern=self._pattern) - def _join(self, attr): + def _join(self, attr: str) -> str: """Get the prefix joined with the given attribute.""" if self._prefix: return '{}.{}'.format(self._prefix, attr) @@ -558,8 +608,10 @@ class ConfigContainer: return attr -def set_register_stylesheet(obj, *, stylesheet=None, update=True): - """Set the stylesheet for an object based on it's STYLESHEET attribute. +def set_register_stylesheet(obj: QObject, *, + stylesheet: str = None, + update: bool = True) -> None: + """Set the stylesheet for an object. Also, register an update when the config is changed. @@ -574,7 +626,7 @@ def set_register_stylesheet(obj, *, stylesheet=None, update=True): @functools.lru_cache() -def _render_stylesheet(stylesheet): +def _render_stylesheet(stylesheet: str) -> str: """Render the given stylesheet jinja template.""" with jinja.environment.no_autoescape(): template = jinja.environment.from_string(stylesheet) @@ -590,7 +642,9 @@ class StyleSheetObserver(QObject): _stylesheet: The stylesheet template to use. """ - def __init__(self, obj, stylesheet, update): + def __init__(self, obj: QObject, + stylesheet: typing.Optional[str], + update: bool) -> None: super().__init__() self._obj = obj self._update = update @@ -599,11 +653,11 @@ class StyleSheetObserver(QObject): if self._update: self.setParent(self._obj) if stylesheet is None: - self._stylesheet = obj.STYLESHEET + self._stylesheet = obj.STYLESHEET # type: str else: self._stylesheet = stylesheet - def _get_stylesheet(self): + def _get_stylesheet(self) -> str: """Format a stylesheet based on a template. Return: @@ -612,19 +666,15 @@ class StyleSheetObserver(QObject): return _render_stylesheet(self._stylesheet) @pyqtSlot() - def _update_stylesheet(self): + def _update_stylesheet(self) -> None: """Update the stylesheet for obj.""" self._obj.setStyleSheet(self._get_stylesheet()) - def register(self): - """Do a first update and listen for more. - - Args: - update: if False, don't listen for future updates. - """ + def register(self) -> None: + """Do a first update and listen for more.""" qss = self._get_stylesheet() - log.config.vdebug("stylesheet for {}: {}".format( - self._obj.__class__.__name__, qss)) + log.config.vdebug( # type: ignore + "stylesheet for {}: {}".format(self._obj.__class__.__name__, qss)) self._obj.setStyleSheet(qss) if self._update: instance.changed.connect(self._update_stylesheet) diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index 574bc06af..0ee77fcc9 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -19,6 +19,7 @@ """Commands related to the configuration.""" +import typing import os.path import contextlib @@ -31,24 +32,34 @@ from qutebrowser.config import configtypes, configexc, configfiles, configdata from qutebrowser.misc import editor from qutebrowser.keyinput import keyutils +MYPY = False +if MYPY: # pragma: no cover + # pylint: disable=unused-import,useless-suppression + from qutebrowser.config.config import Config, KeyConfig + class ConfigCommands: """qutebrowser commands related to the configuration.""" - def __init__(self, config, keyconfig): + def __init__(self, + config: 'Config', + keyconfig: 'KeyConfig') -> None: self._config = config self._keyconfig = keyconfig @contextlib.contextmanager - def _handle_config_error(self): + def _handle_config_error(self) -> typing.Iterator[None]: """Catch errors in set_command and raise CommandError.""" try: yield except configexc.Error as e: raise cmdutils.CommandError(str(e)) - def _parse_pattern(self, pattern): + def _parse_pattern( + self, + pattern: typing.Optional[str] + ) -> typing.Optional[urlmatch.UrlPattern]: """Parse a pattern string argument to a pattern.""" if pattern is None: return None @@ -59,14 +70,15 @@ class ConfigCommands: raise cmdutils.CommandError("Error while parsing {}: {}" .format(pattern, str(e))) - def _parse_key(self, key): + def _parse_key(self, key: str) -> keyutils.KeySequence: """Parse a key argument.""" try: return keyutils.KeySequence.parse(key) except keyutils.KeyParseError as e: raise cmdutils.CommandError(str(e)) - def _print_value(self, option, pattern): + def _print_value(self, option: str, + pattern: typing.Optional[urlmatch.UrlPattern]) -> None: """Print the value of the given option.""" with self._handle_config_error(): value = self._config.get_str(option, pattern=pattern) @@ -81,8 +93,9 @@ class ConfigCommands: @cmdutils.argument('value', completion=configmodel.value) @cmdutils.argument('win_id', value=cmdutils.Value.win_id) @cmdutils.argument('pattern', flag='u') - def set(self, win_id, option=None, value=None, temp=False, print_=False, - *, pattern=None): + def set(self, win_id: int, option: str = None, value: str = None, + temp: bool = False, print_: bool = False, + *, pattern: str = None) -> None: """Set an option. If the option name ends with '?' or no value is provided, the @@ -108,28 +121,28 @@ class ConfigCommands: raise cmdutils.CommandError("Toggling values was moved to the " ":config-cycle command") - pattern = self._parse_pattern(pattern) + parsed_pattern = self._parse_pattern(pattern) if option.endswith('?') and option != '?': - self._print_value(option[:-1], pattern=pattern) + self._print_value(option[:-1], pattern=parsed_pattern) return with self._handle_config_error(): if value is None: - self._print_value(option, pattern=pattern) + self._print_value(option, pattern=parsed_pattern) else: - self._config.set_str(option, value, pattern=pattern, + self._config.set_str(option, value, pattern=parsed_pattern, save_yaml=not temp) if print_: - self._print_value(option, pattern=pattern) + self._print_value(option, pattern=parsed_pattern) @cmdutils.register(instance='config-commands', maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.argument('command', completion=configmodel.bind) @cmdutils.argument('win_id', value=cmdutils.Value.win_id) - def bind(self, win_id, key=None, command=None, *, mode='normal', - default=False): + def bind(self, win_id: str, key: str = None, command: str = None, *, + mode: str = 'normal', default: bool = False) -> None: """Bind a key to a command. If no command is given, show the current binding for the given key. @@ -174,7 +187,7 @@ class ConfigCommands: self._keyconfig.bind(seq, command, mode=mode, save_yaml=True) @cmdutils.register(instance='config-commands') - def unbind(self, key, *, mode='normal'): + def unbind(self, key: str, *, mode: str = 'normal') -> None: """Unbind a keychain. Args: @@ -191,8 +204,9 @@ class ConfigCommands: @cmdutils.argument('option', completion=configmodel.option) @cmdutils.argument('values', completion=configmodel.value) @cmdutils.argument('pattern', flag='u') - def config_cycle(self, option, *values, pattern=None, temp=False, - print_=False): + def config_cycle(self, option: str, *values: str, + pattern: str = None, + temp: bool = False, print_: bool = False) -> None: """Cycle an option between multiple values. Args: @@ -202,15 +216,15 @@ class ConfigCommands: temp: Set value temporarily until qutebrowser is closed. print_: Print the value after setting. """ - pattern = self._parse_pattern(pattern) + parsed_pattern = self._parse_pattern(pattern) with self._handle_config_error(): opt = self._config.get_opt(option) - old_value = self._config.get_obj_for_pattern(option, - pattern=pattern) + old_value = self._config.get_obj_for_pattern( + option, pattern=parsed_pattern) if not values and isinstance(opt.typ, configtypes.Bool): - values = ['true', 'false'] + values = ('true', 'false') if len(values) < 2: raise cmdutils.CommandError("Need at least two values for " @@ -219,25 +233,25 @@ class ConfigCommands: # Use the next valid value from values, or the first if the current # value does not appear in the list with self._handle_config_error(): - values = [opt.typ.from_str(val) for val in values] + cycle_values = [opt.typ.from_str(val) for val in values] try: - idx = values.index(old_value) - idx = (idx + 1) % len(values) - value = values[idx] + idx = cycle_values.index(old_value) + idx = (idx + 1) % len(cycle_values) + value = cycle_values[idx] except ValueError: - value = values[0] + value = cycle_values[0] with self._handle_config_error(): - self._config.set_obj(option, value, pattern=pattern, + self._config.set_obj(option, value, pattern=parsed_pattern, save_yaml=not temp) if print_: - self._print_value(option, pattern=pattern) + self._print_value(option, pattern=parsed_pattern) @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.customized_option) - def config_unset(self, option, temp=False): + def config_unset(self, option: str, temp: bool = False) -> None: """Unset an option. This sets an option back to its default and removes it from @@ -252,7 +266,8 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.list_option) - def config_list_add(self, option, value, temp=False): + def config_list_add(self, option: str, value: str, + temp: bool = False) -> None: """Append a value to a config option that is a list. Args: @@ -273,7 +288,8 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.dict_option) - def config_dict_add(self, option, key, value, temp=False, replace=False): + def config_dict_add(self, option: str, key: str, value: str, + temp: bool = False, replace: bool = False) -> None: """Add a key/value pair to a dictionary option. Args: @@ -302,7 +318,8 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.list_option) - def config_list_remove(self, option, value, temp=False): + def config_list_remove(self, option: str, value: str, + temp: bool = False) -> None: """Remove a value from a list. Args: @@ -329,7 +346,8 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.dict_option) - def config_dict_remove(self, option, key, temp=False): + def config_dict_remove(self, option: str, key: str, + temp: bool = False) -> None: """Remove a key from a dict. Args: @@ -354,7 +372,7 @@ class ConfigCommands: self._config.update_mutables(save_yaml=not temp) @cmdutils.register(instance='config-commands') - def config_clear(self, save=False): + def config_clear(self, save: bool = False) -> None: """Set all settings back to their default. Args: @@ -364,7 +382,7 @@ class ConfigCommands: self._config.clear(save_yaml=save) @cmdutils.register(instance='config-commands') - def config_source(self, filename=None, clear=False): + def config_source(self, filename: str = None, clear: bool = False) -> None: """Read a config.py file. Args: @@ -386,13 +404,13 @@ class ConfigCommands: raise cmdutils.CommandError(e) @cmdutils.register(instance='config-commands') - def config_edit(self, no_source=False): + def config_edit(self, no_source: bool = False) -> None: """Open the config.py file in the editor. Args: no_source: Don't re-source the config file after editing. """ - def on_file_updated(): + def on_file_updated() -> None: """Source the new config when editing finished. This can't use cmdutils.CommandError as it's run async. @@ -410,7 +428,8 @@ class ConfigCommands: ed.edit_file(filename) @cmdutils.register(instance='config-commands') - def config_write_py(self, filename=None, force=False, defaults=False): + def config_write_py(self, filename: str = None, + force: bool = False, defaults: bool = False) -> None: """Write the current configuration to a config.py file. Args: @@ -429,13 +448,13 @@ class ConfigCommands: raise cmdutils.CommandError("{} already exists - use --force to " "overwrite!".format(filename)) + options = [] # type: typing.List if defaults: options = [(None, opt, opt.default) for _name, opt in sorted(configdata.DATA.items())] bindings = dict(configdata.DATA['bindings.default'].default) commented = True else: - options = [] for values in self._config: for scoped in values: options.append((scoped.pattern, values.opt, scoped.value)) diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index dace0772a..c93032387 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -24,14 +24,18 @@ Module attributes: DATA: A dict of Option objects after init() has been called. """ +import typing +from typing import Optional # pylint: disable=unused-import import functools import attr from qutebrowser.config import configtypes from qutebrowser.utils import usertypes, qtutils, utils -DATA = None -MIGRATIONS = None +DATA = typing.cast(typing.Mapping[str, 'Option'], None) +MIGRATIONS = typing.cast('Migrations', None) + +_BackendDict = typing.Mapping[str, typing.Union[str, bool]] @attr.s @@ -42,15 +46,15 @@ class Option: Note that this is just an option which exists, with no value associated. """ - name = attr.ib() - typ = attr.ib() - default = attr.ib() - backends = attr.ib() - raw_backends = attr.ib() - description = attr.ib() - supports_pattern = attr.ib(default=False) - restart = attr.ib(default=False) - no_autoconfig = attr.ib(default=False) + name = attr.ib() # type: str + typ = attr.ib() # type: configtypes.BaseType + default = attr.ib() # type: typing.Any + backends = attr.ib() # type: typing.Iterable[usertypes.Backend] + raw_backends = attr.ib() # type: Optional[typing.Mapping[str, bool]] + description = attr.ib() # type: str + supports_pattern = attr.ib(default=False) # type: bool + restart = attr.ib(default=False) # type: bool + no_autoconfig = attr.ib(default=False) # type: bool @attr.s @@ -63,11 +67,13 @@ class Migrations: deleted: A list of option names which have been removed. """ - renamed = attr.ib(default=attr.Factory(dict)) - deleted = attr.ib(default=attr.Factory(list)) + renamed = attr.ib( + default=attr.Factory(dict)) # type: typing.Dict[str, str] + deleted = attr.ib( + default=attr.Factory(list)) # type: typing.List[str] -def _raise_invalid_node(name, what, node): +def _raise_invalid_node(name: str, what: str, node: typing.Any) -> None: """Raise an exception for an invalid configdata YAML node. Args: @@ -79,13 +85,16 @@ def _raise_invalid_node(name, what, node): name, what, node)) -def _parse_yaml_type(name, node): +def _parse_yaml_type( + name: str, + node: typing.Union[str, typing.Mapping[str, typing.Any]], +) -> configtypes.BaseType: if isinstance(node, str): # e.g: # type: Bool # -> create the type object without any arguments type_name = node - kwargs = {} + kwargs = {} # type: typing.MutableMapping[str, typing.Any] elif isinstance(node, dict): # e.g: # type: @@ -123,7 +132,10 @@ def _parse_yaml_type(name, node): type_name, node, e)) -def _parse_yaml_backends_dict(name, node): +def _parse_yaml_backends_dict( + name: str, + node: _BackendDict, +) -> typing.Sequence[usertypes.Backend]: """Parse a dict definition for backends. Example: @@ -160,7 +172,10 @@ def _parse_yaml_backends_dict(name, node): return backends -def _parse_yaml_backends(name, node): +def _parse_yaml_backends( + name: str, + node: typing.Union[None, str, _BackendDict], +) -> typing.Sequence[usertypes.Backend]: """Parse a backend node in the yaml. It can have one of those four forms: @@ -187,7 +202,9 @@ def _parse_yaml_backends(name, node): raise utils.Unreachable -def _read_yaml(yaml_data): +def _read_yaml( + yaml_data: str, +) -> typing.Tuple[typing.Mapping[str, Option], Migrations]: """Read config data from a YAML file. Args: @@ -249,12 +266,12 @@ def _read_yaml(yaml_data): @functools.lru_cache(maxsize=256) -def is_valid_prefix(prefix): +def is_valid_prefix(prefix: str) -> bool: """Check whether the given prefix is a valid prefix for some option.""" return any(key.startswith(prefix + '.') for key in DATA) -def init(): +def init() -> None: """Initialize configdata from the YAML file.""" global DATA, MIGRATIONS DATA, MIGRATIONS = _read_yaml(utils.read_file('config/configdata.yml')) diff --git a/qutebrowser/config/configdiff.py b/qutebrowser/config/configdiff.py index 9f8b70a26..ba78f64b4 100644 --- a/qutebrowser/config/configdiff.py +++ b/qutebrowser/config/configdiff.py @@ -19,6 +19,7 @@ """Code to show a diff of the legacy config format.""" +import typing # pylint: disable=unused-import,useless-suppression import difflib import os.path @@ -727,10 +728,10 @@ scroll right """ -def get_diff(): +def get_diff() -> str: """Get a HTML diff for the old config files.""" - old_conf_lines = [] - old_key_lines = [] + old_conf_lines = [] # type: typing.MutableSequence[str] + old_key_lines = [] # type: typing.MutableSequence[str] for filename, dest in [('qutebrowser.conf', old_conf_lines), ('keys.conf', old_key_lines)]: diff --git a/qutebrowser/config/configexc.py b/qutebrowser/config/configexc.py index 051ed971a..b1dc04e09 100644 --- a/qutebrowser/config/configexc.py +++ b/qutebrowser/config/configexc.py @@ -19,9 +19,10 @@ """Exceptions related to config parsing.""" +import typing import attr -from qutebrowser.utils import jinja +from qutebrowser.utils import jinja, usertypes class Error(Exception): @@ -33,7 +34,7 @@ class NoAutoconfigError(Error): """Raised when this option can't be set in autoconfig.yml.""" - def __init__(self, name): + def __init__(self, name: str) -> None: super().__init__("The {} setting can only be set in config.py!" .format(name)) @@ -42,7 +43,11 @@ class BackendError(Error): """Raised when this setting is unavailable with the current backend.""" - def __init__(self, name, backend, raw_backends): + def __init__( + self, name: str, + backend: usertypes.Backend, + raw_backends: typing.Optional[typing.Mapping[str, bool]] + ) -> None: if raw_backends is None or not raw_backends[backend.name]: msg = ("The {} setting is not available with the {} backend!" .format(name, backend.name)) @@ -57,7 +62,7 @@ class NoPatternError(Error): """Raised when the given setting does not support URL patterns.""" - def __init__(self, name): + def __init__(self, name: str) -> None: super().__init__("The {} setting does not support URL patterns!" .format(name)) @@ -71,7 +76,7 @@ class ValidationError(Error): msg: Additional error message. """ - def __init__(self, value, msg): + def __init__(self, value: typing.Any, msg: str) -> None: super().__init__("Invalid value '{}' - {}".format(value, msg)) self.option = None @@ -85,7 +90,9 @@ class NoOptionError(Error): """Raised when an option was not found.""" - def __init__(self, option, *, deleted=False, renamed=None): + def __init__(self, option: str, *, + deleted: bool = False, + renamed: str = None) -> None: if deleted: assert renamed is None suffix = ' (this option was removed from qutebrowser)' @@ -109,18 +116,18 @@ class ConfigErrorDesc: traceback: The formatted traceback of the exception. """ - text = attr.ib() - exception = attr.ib() - traceback = attr.ib(None) + text = attr.ib() # type: str + exception = attr.ib() # type: typing.Union[str, Exception] + traceback = attr.ib(None) # type: str - def __str__(self): + def __str__(self) -> str: if self.traceback: return '{} - {}: {}'.format(self.text, self.exception.__class__.__name__, self.exception) return '{}: {}'.format(self.text, self.exception) - def with_text(self, text): + def with_text(self, text: str) -> 'ConfigErrorDesc': """Get a new ConfigErrorDesc with the given text appended.""" return self.__class__(text='{} ({})'.format(self.text, text), exception=self.exception, @@ -131,13 +138,15 @@ class ConfigFileErrors(Error): """Raised when multiple errors occurred inside the config.""" - def __init__(self, basename, errors): + def __init__(self, + basename: str, + errors: typing.Sequence[ConfigErrorDesc]) -> None: super().__init__("Errors occurred while reading {}:\n{}".format( basename, '\n'.join(' {}'.format(e) for e in errors))) self.basename = basename self.errors = errors - def to_html(self): + def to_html(self) -> str: """Get the error texts as a HTML snippet.""" template = jinja.environment.from_string(""" Errors occurred while reading {{ basename }}: diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index b4c8ea4ec..54ca91488 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -27,6 +27,7 @@ import textwrap import traceback import configparser import contextlib +import typing import yaml from PyQt5.QtCore import pyqtSignal, QObject, QSettings @@ -36,16 +37,21 @@ from qutebrowser.config import configexc, config, configdata, configutils from qutebrowser.keyinput import keyutils from qutebrowser.utils import standarddir, utils, qtutils, log, urlmatch +MYPY = False +if MYPY: + # pylint: disable=unused-import, useless-suppression + from qutebrowser.misc import savemanager + # The StateConfig instance -state = None +state = typing.cast('StateConfig', None) class StateConfig(configparser.ConfigParser): """The "state" file saving various application state.""" - def __init__(self): + def __init__(self) -> None: super().__init__() self._filename = os.path.join(standarddir.data(), 'state') self.read(self._filename, encoding='utf-8') @@ -59,7 +65,8 @@ class StateConfig(configparser.ConfigParser): for key in deleted_keys: self['general'].pop(key, None) - def init_save_manager(self, save_manager): + def init_save_manager(self, + save_manager: 'savemanager.SaveManager') -> None: """Make sure the config gets saved properly. We do this outside of __init__ because the config gets created before @@ -67,7 +74,7 @@ class StateConfig(configparser.ConfigParser): """ save_manager.add_saveable('state-config', self._save) - def _save(self): + def _save(self) -> None: """Save the state file to the configured location.""" with open(self._filename, 'w', encoding='utf-8') as f: self.write(f) @@ -84,17 +91,20 @@ class YamlConfig(QObject): VERSION = 2 changed = pyqtSignal() - def __init__(self, parent=None): + _SettingsType = typing.Dict[str, typing.Dict[str, typing.Any]] + + def __init__(self, parent: QObject = None) -> None: super().__init__(parent) self._filename = os.path.join(standarddir.config(auto=True), 'autoconfig.yml') - self._dirty = None + self._dirty = False - self._values = {} + self._values = {} # type: typing.Dict[str, configutils.Values] for name, opt in configdata.DATA.items(): self._values[name] = configutils.Values(opt) - def init_save_manager(self, save_manager): + def init_save_manager(self, + save_manager: 'savemanager.SaveManager') -> None: """Make sure the config gets saved properly. We do this outside of __init__ because the config gets created before @@ -102,21 +112,21 @@ class YamlConfig(QObject): """ save_manager.add_saveable('yaml-config', self._save, self.changed) - def __iter__(self): + def __iter__(self) -> typing.Iterator[configutils.Values]: """Iterate over configutils.Values items.""" yield from self._values.values() - def _mark_changed(self): + def _mark_changed(self) -> None: """Mark the YAML config as changed.""" self._dirty = True self.changed.emit() - def _save(self): + def _save(self) -> None: """Save the settings to the YAML file if they've changed.""" if not self._dirty: return - settings = {} + settings = {} # type: YamlConfig._SettingsType for name, values in sorted(self._values.items()): if not values: continue @@ -135,7 +145,10 @@ class YamlConfig(QObject): """.lstrip('\n'))) utils.yaml_dump(data, f) - def _pop_object(self, yaml_data, key, typ): + def _pop_object(self, + yaml_data: typing.Any, + key: str, + typ: type) -> typing.Any: """Get a global object from the given data.""" if not isinstance(yaml_data, dict): desc = configexc.ConfigErrorDesc("While loading data", @@ -158,7 +171,7 @@ class YamlConfig(QObject): return data - def load(self): + def load(self) -> None: """Load configuration from the configured YAML file.""" try: with open(self._filename, 'r', encoding='utf-8') as f: @@ -189,18 +202,19 @@ class YamlConfig(QObject): self._validate(settings) self._build_values(settings) - def _load_settings_object(self, yaml_data): + def _load_settings_object(self, yaml_data: typing.Any) -> '_SettingsType': """Load the settings from the settings: key.""" return self._pop_object(yaml_data, 'settings', dict) - def _load_legacy_settings_object(self, yaml_data): + def _load_legacy_settings_object(self, + yaml_data: typing.Any) -> '_SettingsType': data = self._pop_object(yaml_data, 'global', dict) settings = {} for name, value in data.items(): settings[name] = {'global': value} return settings - def _build_values(self, settings): + def _build_values(self, settings: typing.Mapping) -> None: """Build up self._values from the values in the given dict.""" errors = [] for name, yaml_values in settings.items(): @@ -233,7 +247,8 @@ class YamlConfig(QObject): if errors: raise configexc.ConfigFileErrors('autoconfig.yml', errors) - def _migrate_bool(self, settings, name, true_value, false_value): + def _migrate_bool(self, settings: _SettingsType, name: str, + true_value: str, false_value: str) -> None: """Migrate a boolean in the settings.""" if name in settings: for scope, val in settings[name].items(): @@ -241,7 +256,7 @@ class YamlConfig(QObject): settings[name][scope] = true_value if val else false_value self._mark_changed() - def _handle_migrations(self, settings): + def _handle_migrations(self, settings: _SettingsType) -> '_SettingsType': """Migrate older configs to the newest format.""" # Simple renamed/deleted options for name in list(settings): @@ -299,7 +314,7 @@ class YamlConfig(QObject): return settings - def _validate(self, settings): + def _validate(self, settings: _SettingsType) -> None: """Make sure all settings exist.""" unknown = [] for name in settings: @@ -312,18 +327,19 @@ class YamlConfig(QObject): for e in sorted(unknown)] raise configexc.ConfigFileErrors('autoconfig.yml', errors) - def set_obj(self, name, value, *, pattern=None): + def set_obj(self, name: str, value: typing.Any, *, + pattern: urlmatch.UrlPattern = None) -> None: """Set the given setting to the given value.""" self._values[name].add(value, pattern) self._mark_changed() - def unset(self, name, *, pattern=None): + def unset(self, name: str, *, pattern: urlmatch.UrlPattern = None) -> None: """Remove the given option name if it's configured.""" changed = self._values[name].remove(pattern) if changed: self._mark_changed() - def clear(self): + def clear(self) -> None: """Clear all values from the YAML file.""" for values in self._values.values(): values.clear() @@ -346,15 +362,15 @@ class ConfigAPI: datadir: The qutebrowser data directory, as pathlib.Path. """ - def __init__(self, conf, keyconfig): + def __init__(self, conf: config.Config, keyconfig: config.KeyConfig): self._config = conf self._keyconfig = keyconfig - self.errors = [] + self.errors = [] # type: typing.List[configexc.ConfigErrorDesc] self.configdir = pathlib.Path(standarddir.config()) self.datadir = pathlib.Path(standarddir.data()) @contextlib.contextmanager - def _handle_error(self, action, name): + def _handle_error(self, action: str, name: str) -> typing.Iterator[None]: """Catch config-related exceptions and save them in self.errors.""" try: yield @@ -372,40 +388,40 @@ class ConfigAPI: text = "While {} '{}' and parsing key".format(action, name) self.errors.append(configexc.ConfigErrorDesc(text, e)) - def finalize(self): + def finalize(self) -> None: """Do work which needs to be done after reading config.py.""" self._config.update_mutables() - def load_autoconfig(self): + def load_autoconfig(self) -> None: """Load the autoconfig.yml file which is used for :set/:bind/etc.""" with self._handle_error('reading', 'autoconfig.yml'): read_autoconfig() - def get(self, name, pattern=None): + def get(self, name: str, pattern: str = None) -> typing.Any: """Get a setting value from the config, optionally with a pattern.""" with self._handle_error('getting', name): urlpattern = urlmatch.UrlPattern(pattern) if pattern else None return self._config.get_mutable_obj(name, pattern=urlpattern) - def set(self, name, value, pattern=None): + def set(self, name: str, value: typing.Any, pattern: str = None) -> None: """Set a setting value in the config, optionally with a pattern.""" with self._handle_error('setting', name): urlpattern = urlmatch.UrlPattern(pattern) if pattern else None self._config.set_obj(name, value, pattern=urlpattern) - def bind(self, key, command, mode='normal'): + def bind(self, key: str, command: str, mode: str = 'normal') -> None: """Bind a key to a command, with an optional key mode.""" with self._handle_error('binding', key): seq = keyutils.KeySequence.parse(key) self._keyconfig.bind(seq, command, mode=mode) - def unbind(self, key, mode='normal'): + def unbind(self, key: str, mode: str = 'normal') -> None: """Unbind a key from a command, with an optional key mode.""" with self._handle_error('unbinding', key): seq = keyutils.KeySequence.parse(key) self._keyconfig.unbind(seq, mode=mode) - def source(self, filename): + def source(self, filename: str) -> None: """Read the given config file from disk.""" if not os.path.isabs(filename): filename = str(self.configdir / filename) @@ -416,7 +432,7 @@ class ConfigAPI: self.errors += e.errors @contextlib.contextmanager - def pattern(self, pattern): + def pattern(self, pattern: str) -> typing.Iterator[config.ConfigContainer]: """Get a ConfigContainer for the given pattern.""" # We need to propagate the exception so we don't need to return # something. @@ -430,17 +446,21 @@ class ConfigPyWriter: """Writer for config.py files from given settings.""" - def __init__(self, options, bindings, *, commented): + def __init__( + self, + options: typing.List, + bindings: typing.MutableMapping[str, typing.Mapping[str, str]], *, + commented: bool) -> None: self._options = options self._bindings = bindings self._commented = commented - def write(self, filename): + def write(self, filename: str) -> None: """Write the config to the given file.""" with open(filename, 'w', encoding='utf-8') as f: f.write('\n'.join(self._gen_lines())) - def _line(self, line): + def _line(self, line: str) -> str: """Get an (optionally commented) line.""" if self._commented: if line.startswith('#'): @@ -450,7 +470,7 @@ class ConfigPyWriter: else: return line - def _gen_lines(self): + def _gen_lines(self) -> typing.Iterator[str]: """Generate a config.py with the given settings/bindings. Yields individual lines. @@ -459,7 +479,7 @@ class ConfigPyWriter: yield from self._gen_options() yield from self._gen_bindings() - def _gen_header(self): + def _gen_header(self) -> typing.Iterator[str]: """Generate the initial header of the config.""" yield self._line("# Autogenerated config.py") yield self._line("# Documentation:") @@ -481,7 +501,7 @@ class ConfigPyWriter: yield self._line("# config.load_autoconfig()") yield '' - def _gen_options(self): + def _gen_options(self) -> typing.Iterator[str]: """Generate the options part of the config.""" for pattern, opt, value in self._options: if opt.name in ['bindings.commands', 'bindings.default']: @@ -509,7 +529,7 @@ class ConfigPyWriter: opt.name, value, str(pattern))) yield '' - def _gen_bindings(self): + def _gen_bindings(self) -> typing.Iterator[str]: """Generate the bindings part of the config.""" normal_bindings = self._bindings.pop('normal', {}) if normal_bindings: @@ -527,7 +547,7 @@ class ConfigPyWriter: yield '' -def read_config_py(filename, raising=False): +def read_config_py(filename: str, raising: bool = False) -> None: """Read a config.py file. Arguments; @@ -543,8 +563,8 @@ def read_config_py(filename, raising=False): basename = os.path.basename(filename) module = types.ModuleType('config') - module.config = api - module.c = container + module.config = api # type: ignore + module.c = container # type: ignore module.__file__ = filename try: @@ -589,7 +609,7 @@ def read_config_py(filename, raising=False): raise configexc.ConfigFileErrors('config.py', api.errors) -def read_autoconfig(): +def read_autoconfig() -> None: """Read the autoconfig.yml file.""" try: config.instance.read_yaml() @@ -601,7 +621,7 @@ def read_autoconfig(): @contextlib.contextmanager -def saved_sys_properties(): +def saved_sys_properties() -> typing.Iterator[None]: """Save various sys properties such as sys.path and sys.modules.""" old_path = sys.path.copy() old_modules = sys.modules.copy() @@ -614,7 +634,7 @@ def saved_sys_properties(): del sys.modules[module] -def init(): +def init() -> None: """Initialize config storage not related to the main config.""" global state state = StateConfig() diff --git a/qutebrowser/config/configinit.py b/qutebrowser/config/configinit.py index de9651064..ff0fd0e41 100644 --- a/qutebrowser/config/configinit.py +++ b/qutebrowser/config/configinit.py @@ -19,8 +19,10 @@ """Initialization of the configuration.""" +import argparse import os.path import sys +import typing from PyQt5.QtWidgets import QMessageBox @@ -30,14 +32,14 @@ from qutebrowser.config import (config, configdata, configfiles, configtypes, from qutebrowser.utils import (objreg, usertypes, log, standarddir, message, qtutils) from qutebrowser.config import configcache -from qutebrowser.misc import msgbox, objects +from qutebrowser.misc import msgbox, objects, savemanager # Error which happened during init, so we can show a message box. _init_errors = None -def early_init(args): +def early_init(args: argparse.Namespace) -> None: """Initialize the part of the config which works without a QApplication.""" configdata.init() @@ -85,7 +87,7 @@ def early_init(args): _init_envvars() -def _init_envvars(): +def _init_envvars() -> None: """Initialize environment variables which need to be set early.""" if objects.backend == usertypes.Backend.QtWebEngine: software_rendering = config.val.qt.force_software_rendering @@ -107,7 +109,7 @@ def _init_envvars(): @config.change_filter('fonts.monospace', function=True) -def _update_monospace_fonts(): +def _update_monospace_fonts() -> None: """Update all fonts if fonts.monospace was set.""" configtypes.Font.monospace_fonts = config.val.fonts.monospace for name, opt in configdata.DATA.items(): @@ -123,7 +125,7 @@ def _update_monospace_fonts(): config.instance.changed.emit(name) -def get_backend(args): +def get_backend(args: argparse.Namespace) -> usertypes.Backend: """Find out what backend to use based on available libraries.""" str_to_backend = { 'webkit': usertypes.Backend.QtWebKit, @@ -136,7 +138,7 @@ def get_backend(args): return str_to_backend[config.val.backend] -def late_init(save_manager): +def late_init(save_manager: savemanager.SaveManager) -> None: """Initialize the rest of the config after the QApplication is created.""" global _init_errors if _init_errors is not None: @@ -152,7 +154,7 @@ def late_init(save_manager): configfiles.state.init_save_manager(save_manager) -def qt_args(namespace): +def qt_args(namespace: argparse.Namespace) -> typing.List[str]: """Get the Qt QApplication arguments based on an argparse namespace. Args: @@ -178,7 +180,7 @@ def qt_args(namespace): return argv -def _qtwebengine_args(): +def _qtwebengine_args() -> typing.Iterator[str]: """Get the QtWebEngine arguments to use based on the config.""" if not qtutils.version_check('5.11', compiled=False): # WORKAROUND equivalent to @@ -224,7 +226,7 @@ def _qtwebengine_args(): 'never': '--no-referrers', 'same-domain': '--reduced-referrer-granularity', } - } + } # type: typing.Dict[str, typing.Dict[typing.Any, typing.Optional[str]]] if not qtutils.version_check('5.11'): # On Qt 5.11, we can control this via QWebEngineSettings diff --git a/qutebrowser/config/configutils.py b/qutebrowser/config/configutils.py index 96fc0f02d..9d4dc94ef 100644 --- a/qutebrowser/config/configutils.py +++ b/qutebrowser/config/configutils.py @@ -21,11 +21,19 @@ """Utilities and data structures used by various config code.""" -import attr +import typing -from qutebrowser.utils import utils +import attr +from PyQt5.QtCore import QUrl + +from qutebrowser.utils import utils, urlmatch from qutebrowser.config import configexc +MYPY = False +if MYPY: # pragma: no cover + # pylint: disable=unused-import,useless-suppression + from qutebrowser.config import configdata + class _UnsetObject: @@ -33,7 +41,7 @@ class _UnsetObject: __slots__ = () - def __repr__(self): + def __repr__(self) -> str: return '' @@ -50,8 +58,8 @@ class ScopedValue: pattern: The UrlPattern for the value, or None for global values. """ - value = attr.ib() - pattern = attr.ib() + value = attr.ib() # type: typing.Any + pattern = attr.ib() # type: typing.Optional[urlmatch.UrlPattern] class Values: @@ -73,15 +81,17 @@ class Values: opt: The Option being customized. """ - def __init__(self, opt, values=None): + def __init__(self, + opt: 'configdata.Option', + values: typing.MutableSequence = None) -> None: self.opt = opt self._values = values or [] - def __repr__(self): + def __repr__(self) -> str: return utils.get_repr(self, opt=self.opt, values=self._values, constructor=True) - def __str__(self): + def __str__(self) -> str: """Get the values as human-readable string.""" if not self: return '{}: '.format(self.opt.name) @@ -96,7 +106,7 @@ class Values: scoped.pattern, self.opt.name, str_value)) return '\n'.join(lines) - def __iter__(self): + def __iter__(self) -> typing.Iterator['ScopedValue']: """Yield ScopedValue elements. This yields in "normal" order, i.e. global and then first-set settings @@ -104,23 +114,25 @@ class Values: """ yield from self._values - def __bool__(self): + def __bool__(self) -> bool: """Check whether this value is customized.""" return bool(self._values) - def _check_pattern_support(self, arg): + def _check_pattern_support( + self, arg: typing.Optional[urlmatch.UrlPattern]) -> None: """Make sure patterns are supported if one was given.""" if arg is not None and not self.opt.supports_pattern: raise configexc.NoPatternError(self.opt.name) - def add(self, value, pattern=None): + def add(self, value: typing.Any, + pattern: urlmatch.UrlPattern = None) -> None: """Add a value with the given pattern to the list of values.""" self._check_pattern_support(pattern) self.remove(pattern) scoped = ScopedValue(value, pattern) self._values.append(scoped) - def remove(self, pattern=None): + def remove(self, pattern: urlmatch.UrlPattern = None) -> bool: """Remove the value with the given pattern. If a matching pattern was removed, True is returned. @@ -131,11 +143,11 @@ class Values: self._values = [v for v in self._values if v.pattern != pattern] return old_len != len(self._values) - def clear(self): + def clear(self) -> None: """Clear all customization for this value.""" self._values = [] - def _get_fallback(self, fallback): + def _get_fallback(self, fallback: typing.Any) -> typing.Any: """Get the fallback global/default value.""" for scoped in self._values: if scoped.pattern is None: @@ -146,7 +158,8 @@ class Values: else: return UNSET - def get_for_url(self, url=None, *, fallback=True): + def get_for_url(self, url: QUrl = None, *, + fallback: bool = True) -> typing.Any: """Get a config value, falling back when needed. This first tries to find a value matching the URL (if given). @@ -165,7 +178,9 @@ class Values: return self._get_fallback(fallback) - def get_for_pattern(self, pattern, *, fallback=True): + def get_for_pattern(self, + pattern: typing.Optional[urlmatch.UrlPattern], *, + fallback: bool = True) -> typing.Any: """Get a value only if it's been overridden for the given pattern. This is useful when showing values to the user. From 7494d238ce6248a217ab958753777ed093d9411e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 13:17:23 +0100 Subject: [PATCH 264/492] Revert "Add types for most of qutebrowser.config" It breaks 'tsh' because of the *values annotation. This reverts commit 208d3db475cf5e5fd50840dd80bfef0fc85e98f5. --- mypy.ini | 36 ------ qutebrowser/config/config.py | 184 ++++++++++----------------- qutebrowser/config/configcommands.py | 97 ++++++-------- qutebrowser/config/configdata.py | 59 +++------ qutebrowser/config/configdiff.py | 7 +- qutebrowser/config/configexc.py | 35 ++--- qutebrowser/config/configfiles.py | 114 +++++++---------- qutebrowser/config/configinit.py | 20 ++- qutebrowser/config/configutils.py | 47 +++---- 9 files changed, 215 insertions(+), 384 deletions(-) diff --git a/mypy.ini b/mypy.ini index be5424327..288cc6515 100644 --- a/mypy.ini +++ b/mypy.ini @@ -61,39 +61,3 @@ disallow_incomplete_defs = True [mypy-qutebrowser.commands.cmdutils] disallow_untyped_defs = True disallow_incomplete_defs = True - -[mypy-qutebrowser.config.config] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configcache] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configcommands] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configdata] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configdiff] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configexc] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configfiles] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configinit] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configutils] -disallow_untyped_defs = True -disallow_incomplete_defs = True diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 44bf3ca77..1d7e34345 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -23,21 +23,18 @@ import copy import contextlib import functools import typing -from typing import Any -from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QUrl +from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject from qutebrowser.config import configdata, configexc, configutils -from qutebrowser.utils import utils, log, jinja, urlmatch +from qutebrowser.utils import utils, log, jinja from qutebrowser.misc import objects from qutebrowser.keyinput import keyutils MYPY = False -if MYPY: # pragma: no cover - # pylint: disable=unused-import,useless-suppression - from typing import Tuple, MutableMapping - from qutebrowser.config import configcache, configfiles - from qutebrowser.misc import savemanager +if MYPY: + # pylint: disable=unused-import + from qutebrowser.config import configcache # pragma: no cover # An easy way to access the config from other code via config.val.foo val = typing.cast('ConfigContainer', None) @@ -64,7 +61,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name _function: Whether a function rather than a method is decorated. """ - def __init__(self, option: str, function: bool = False) -> None: + def __init__(self, option, function=False): """Save decorator arguments. Gets called on parse-time with the decorator arguments. @@ -77,7 +74,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name self._function = function change_filters.append(self) - def validate(self) -> None: + def validate(self): """Make sure the configured option or prefix exists. We can't do this in __init__ as configdata isn't ready yet. @@ -86,7 +83,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name not configdata.is_valid_prefix(self._option)): raise configexc.NoOptionError(self._option) - def _check_match(self, option: typing.Optional[str]) -> bool: + def _check_match(self, option): """Check if the given option matches the filter.""" if option is None: # Called directly, not from a config change event. @@ -99,7 +96,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name else: return False - def __call__(self, func: typing.Callable) -> typing.Callable: + def __call__(self, func): """Filter calls to the decorated function. Gets called when a function should be decorated. @@ -117,21 +114,20 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name """ if self._function: @functools.wraps(func) - def func_wrapper(option: str = None) -> typing.Any: + def wrapper(option=None): """Call the underlying function.""" if self._check_match(option): return func() return None - return func_wrapper else: @functools.wraps(func) - def meth_wrapper(wrapper_self: typing.Any, - option: str = None) -> typing.Any: + def wrapper(wrapper_self, option=None): """Call the underlying function.""" if self._check_match(option): return func(wrapper_self) return None - return meth_wrapper + + return wrapper class KeyConfig: @@ -144,22 +140,17 @@ class KeyConfig: _config: The Config object to be used. """ - _ReverseBindings = typing.Dict[str, typing.MutableSequence[str]] - - def __init__(self, config: 'Config') -> None: + def __init__(self, config): self._config = config - def _validate(self, key: keyutils.KeySequence, mode: str) -> None: + def _validate(self, key, mode): """Validate the given key and mode.""" # Catch old usage of this code assert isinstance(key, keyutils.KeySequence), key if mode not in configdata.DATA['bindings.default'].default: raise configexc.KeybindingError("Invalid mode {}!".format(mode)) - def get_bindings_for( - self, - mode: str - ) -> typing.Dict[keyutils.KeySequence, str]: + def get_bindings_for(self, mode): """Get the combined bindings for the given mode.""" bindings = dict(val.bindings.default[mode]) for key, binding in val.bindings.commands[mode].items(): @@ -169,9 +160,9 @@ class KeyConfig: bindings[key] = binding return bindings - def get_reverse_bindings_for(self, mode: str) -> '_ReverseBindings': + def get_reverse_bindings_for(self, mode): """Get a dict of commands to a list of bindings for the mode.""" - cmd_to_keys = {} # type: KeyConfig._ReverseBindings + cmd_to_keys = {} bindings = self.get_bindings_for(mode) for seq, full_cmd in sorted(bindings.items()): for cmd in full_cmd.split(';;'): @@ -184,10 +175,7 @@ class KeyConfig: cmd_to_keys[cmd].insert(0, str(seq)) return cmd_to_keys - def get_command(self, - key: keyutils.KeySequence, - mode: str, - default: bool = False) -> str: + def get_command(self, key, mode, default=False): """Get the command for a given key (or None).""" self._validate(key, mode) if default: @@ -196,11 +184,7 @@ class KeyConfig: bindings = self.get_bindings_for(mode) return bindings.get(key, None) - def bind(self, - key: keyutils.KeySequence, - command: str, *, - mode: str, - save_yaml: bool = False) -> None: + def bind(self, key, command, *, mode, save_yaml=False): """Add a new binding from key to command.""" if command is not None and not command.strip(): raise configexc.KeybindingError( @@ -208,8 +192,8 @@ class KeyConfig: 'mode'.format(key, mode)) self._validate(key, mode) - log.keyboard.vdebug( # type: ignore - "Adding binding {} -> {} in mode {}.".format(key, command, mode)) + log.keyboard.vdebug("Adding binding {} -> {} in mode {}.".format( + key, command, mode)) bindings = self._config.get_mutable_obj('bindings.commands') if mode not in bindings: @@ -217,10 +201,7 @@ class KeyConfig: bindings[mode][str(key)] = command self._config.update_mutables(save_yaml=save_yaml) - def bind_default(self, - key: keyutils.KeySequence, *, - mode: str = 'normal', - save_yaml: bool = False) -> None: + def bind_default(self, key, *, mode='normal', save_yaml=False): """Restore a default keybinding.""" self._validate(key, mode) @@ -232,10 +213,7 @@ class KeyConfig: "Can't find binding '{}' in {} mode".format(key, mode)) self._config.update_mutables(save_yaml=save_yaml) - def unbind(self, - key: keyutils.KeySequence, *, - mode: str = 'normal', - save_yaml: bool = False) -> None: + def unbind(self, key, *, mode='normal', save_yaml=False): """Unbind the given key in the given mode.""" self._validate(key, mode) @@ -276,27 +254,24 @@ class Config(QObject): MUTABLE_TYPES = (dict, list) changed = pyqtSignal(str) - def __init__(self, - yaml_config: 'configfiles.YamlConfig', - parent: QObject = None) -> None: + def __init__(self, yaml_config, parent=None): super().__init__(parent) self.changed.connect(_render_stylesheet.cache_clear) - self._mutables = {} # type: MutableMapping[str, Tuple[Any, Any]] + self._mutables = {} self._yaml = yaml_config self._init_values() - def _init_values(self) -> None: + def _init_values(self): """Populate the self._values dict.""" - self._values = {} # type: typing.Mapping + self._values = {} for name, opt in configdata.DATA.items(): self._values[name] = configutils.Values(opt) - def __iter__(self) -> typing.Iterator[configutils.Values]: + def __iter__(self): """Iterate over configutils.Values items.""" yield from self._values.values() - def init_save_manager(self, - save_manager: 'savemanager.SaveManager') -> None: + def init_save_manager(self, save_manager): """Make sure the config gets saved properly. We do this outside of __init__ because the config gets created before @@ -304,10 +279,7 @@ class Config(QObject): """ self._yaml.init_save_manager(save_manager) - def _set_value(self, - opt: 'configdata.Option', - value: Any, - pattern: urlmatch.UrlPattern = None) -> None: + def _set_value(self, opt, value, pattern=None): """Set the given option to the given value.""" if not isinstance(objects.backend, objects.NoBackend): if objects.backend not in opt.backends: @@ -322,12 +294,12 @@ class Config(QObject): log.config.debug("Config option changed: {} = {}".format( opt.name, value)) - def _check_yaml(self, opt: 'configdata.Option', save_yaml: bool) -> None: + def _check_yaml(self, opt, save_yaml): """Make sure the given option may be set in autoconfig.yml.""" if save_yaml and opt.no_autoconfig: raise configexc.NoAutoconfigError(opt.name) - def read_yaml(self) -> None: + def read_yaml(self): """Read the YAML settings from self._yaml.""" self._yaml.load() for values in self._yaml: @@ -335,7 +307,7 @@ class Config(QObject): self._set_value(values.opt, scoped.value, pattern=scoped.pattern) - def get_opt(self, name: str) -> 'configdata.Option': + def get_opt(self, name): """Get a configdata.Option object for the given setting.""" try: return configdata.DATA[name] @@ -346,10 +318,7 @@ class Config(QObject): name, deleted=deleted, renamed=renamed) raise exception from None - def get(self, - name: str, - url: QUrl = None, *, - fallback: bool = True) -> Any: + def get(self, name, url=None, *, fallback=True): """Get the given setting converted for Python code. Args: @@ -359,7 +328,7 @@ class Config(QObject): obj = self.get_obj(name, url=url, fallback=fallback) return opt.typ.to_py(obj) - def _maybe_copy(self, value: Any) -> Any: + def _maybe_copy(self, value): """Copy the value if it could potentially be mutated.""" if isinstance(value, self.MUTABLE_TYPES): # For mutable objects, create a copy so we don't accidentally @@ -370,10 +339,7 @@ class Config(QObject): assert value.__hash__ is not None, value return value - def get_obj(self, - name: str, *, - url: QUrl = None, - fallback: bool = True) -> Any: + def get_obj(self, name, *, url=None, fallback=True): """Get the given setting as object (for YAML/config.py). Note that the returned values are not watched for mutation. @@ -383,10 +349,7 @@ class Config(QObject): value = self._values[name].get_for_url(url, fallback=fallback) return self._maybe_copy(value) - def get_obj_for_pattern( - self, name: str, *, - pattern: typing.Optional[urlmatch.UrlPattern] - ) -> Any: + def get_obj_for_pattern(self, name, *, pattern): """Get the given setting as object (for YAML/config.py). This gets the overridden value for a given pattern, or @@ -396,8 +359,7 @@ class Config(QObject): value = self._values[name].get_for_pattern(pattern, fallback=False) return self._maybe_copy(value) - def get_mutable_obj(self, name: str, *, - pattern: urlmatch.UrlPattern = None) -> Any: + def get_mutable_obj(self, name, *, pattern=None): """Get an object which can be mutated, e.g. in a config.py. If a pattern is given, return the value for that pattern. @@ -422,8 +384,7 @@ class Config(QObject): return copy_value - def get_str(self, name: str, *, - pattern: urlmatch.UrlPattern = None) -> str: + def get_str(self, name, *, pattern=None): """Get the given setting as string. If a pattern is given, get the setting for the given pattern or @@ -434,10 +395,7 @@ class Config(QObject): value = values.get_for_pattern(pattern) return opt.typ.to_str(value) - def set_obj(self, name: str, - value: Any, *, - pattern: urlmatch.UrlPattern = None, - save_yaml: bool = False) -> None: + def set_obj(self, name, value, *, pattern=None, save_yaml=False): """Set the given setting from a YAML/config.py object. If save_yaml=True is given, store the new value to YAML. @@ -448,10 +406,7 @@ class Config(QObject): if save_yaml: self._yaml.set_obj(name, value, pattern=pattern) - def set_str(self, name: str, - value: str, *, - pattern: urlmatch.UrlPattern = None, - save_yaml: bool = False) -> None: + def set_str(self, name, value, *, pattern=None, save_yaml=False): """Set the given setting from a string. If save_yaml=True is given, store the new value to YAML. @@ -466,9 +421,7 @@ class Config(QObject): if save_yaml: self._yaml.set_obj(name, converted, pattern=pattern) - def unset(self, name: str, *, - save_yaml: bool = False, - pattern: urlmatch.UrlPattern = None) -> None: + def unset(self, name, *, save_yaml=False, pattern=None): """Set the given setting back to its default.""" opt = self.get_opt(name) self._check_yaml(opt, save_yaml) @@ -479,7 +432,7 @@ class Config(QObject): if save_yaml: self._yaml.unset(name, pattern=pattern) - def clear(self, *, save_yaml: bool = False) -> None: + def clear(self, *, save_yaml=False): """Clear all settings in the config. If save_yaml=True is given, also remove all customization from the YAML @@ -493,7 +446,7 @@ class Config(QObject): if save_yaml: self._yaml.clear() - def update_mutables(self, *, save_yaml: bool = False) -> None: + def update_mutables(self, *, save_yaml=False): """Update mutable settings if they changed. Every time someone calls get_obj() on a mutable object, we save a @@ -508,7 +461,7 @@ class Config(QObject): self.set_obj(name, new_value, save_yaml=save_yaml) self._mutables = {} - def dump_userconfig(self) -> str: + def dump_userconfig(self): """Get the part of the config which was changed by the user. Return: @@ -537,10 +490,7 @@ class ConfigContainer: _pattern: The URL pattern to be used. """ - def __init__(self, config: Config, - configapi: 'configfiles.ConfigAPI' = None, - prefix: str = '', - pattern: urlmatch.UrlPattern = None) -> None: + def __init__(self, config, configapi=None, prefix='', pattern=None): self._config = config self._prefix = prefix self._configapi = configapi @@ -548,13 +498,13 @@ class ConfigContainer: if configapi is None and pattern is not None: raise TypeError("Can't use pattern without configapi!") - def __repr__(self) -> str: + def __repr__(self): return utils.get_repr(self, constructor=True, config=self._config, configapi=self._configapi, prefix=self._prefix, pattern=self._pattern) @contextlib.contextmanager - def _handle_error(self, action: str, name: str) -> typing.Iterator[None]: + def _handle_error(self, action, name): try: yield except configexc.Error as e: @@ -563,7 +513,7 @@ class ConfigContainer: text = "While {} '{}'".format(action, name) self._configapi.errors.append(configexc.ConfigErrorDesc(text, e)) - def __getattr__(self, attr: str) -> Any: + def __getattr__(self, attr): """Get an option or a new ConfigContainer with the added prefix. If we get an option which exists, we return the value for it. @@ -590,7 +540,7 @@ class ConfigContainer: return self._config.get_mutable_obj( name, pattern=self._pattern) - def __setattr__(self, attr: str, value: Any) -> None: + def __setattr__(self, attr, value): """Set the given option in the config.""" if attr.startswith('_'): super().__setattr__(attr, value) @@ -600,7 +550,7 @@ class ConfigContainer: with self._handle_error('setting', name): self._config.set_obj(name, value, pattern=self._pattern) - def _join(self, attr: str) -> str: + def _join(self, attr): """Get the prefix joined with the given attribute.""" if self._prefix: return '{}.{}'.format(self._prefix, attr) @@ -608,10 +558,8 @@ class ConfigContainer: return attr -def set_register_stylesheet(obj: QObject, *, - stylesheet: str = None, - update: bool = True) -> None: - """Set the stylesheet for an object. +def set_register_stylesheet(obj, *, stylesheet=None, update=True): + """Set the stylesheet for an object based on it's STYLESHEET attribute. Also, register an update when the config is changed. @@ -626,7 +574,7 @@ def set_register_stylesheet(obj: QObject, *, @functools.lru_cache() -def _render_stylesheet(stylesheet: str) -> str: +def _render_stylesheet(stylesheet): """Render the given stylesheet jinja template.""" with jinja.environment.no_autoescape(): template = jinja.environment.from_string(stylesheet) @@ -642,9 +590,7 @@ class StyleSheetObserver(QObject): _stylesheet: The stylesheet template to use. """ - def __init__(self, obj: QObject, - stylesheet: typing.Optional[str], - update: bool) -> None: + def __init__(self, obj, stylesheet, update): super().__init__() self._obj = obj self._update = update @@ -653,11 +599,11 @@ class StyleSheetObserver(QObject): if self._update: self.setParent(self._obj) if stylesheet is None: - self._stylesheet = obj.STYLESHEET # type: str + self._stylesheet = obj.STYLESHEET else: self._stylesheet = stylesheet - def _get_stylesheet(self) -> str: + def _get_stylesheet(self): """Format a stylesheet based on a template. Return: @@ -666,15 +612,19 @@ class StyleSheetObserver(QObject): return _render_stylesheet(self._stylesheet) @pyqtSlot() - def _update_stylesheet(self) -> None: + def _update_stylesheet(self): """Update the stylesheet for obj.""" self._obj.setStyleSheet(self._get_stylesheet()) - def register(self) -> None: - """Do a first update and listen for more.""" + def register(self): + """Do a first update and listen for more. + + Args: + update: if False, don't listen for future updates. + """ qss = self._get_stylesheet() - log.config.vdebug( # type: ignore - "stylesheet for {}: {}".format(self._obj.__class__.__name__, qss)) + log.config.vdebug("stylesheet for {}: {}".format( + self._obj.__class__.__name__, qss)) self._obj.setStyleSheet(qss) if self._update: instance.changed.connect(self._update_stylesheet) diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index 0ee77fcc9..574bc06af 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -19,7 +19,6 @@ """Commands related to the configuration.""" -import typing import os.path import contextlib @@ -32,34 +31,24 @@ from qutebrowser.config import configtypes, configexc, configfiles, configdata from qutebrowser.misc import editor from qutebrowser.keyinput import keyutils -MYPY = False -if MYPY: # pragma: no cover - # pylint: disable=unused-import,useless-suppression - from qutebrowser.config.config import Config, KeyConfig - class ConfigCommands: """qutebrowser commands related to the configuration.""" - def __init__(self, - config: 'Config', - keyconfig: 'KeyConfig') -> None: + def __init__(self, config, keyconfig): self._config = config self._keyconfig = keyconfig @contextlib.contextmanager - def _handle_config_error(self) -> typing.Iterator[None]: + def _handle_config_error(self): """Catch errors in set_command and raise CommandError.""" try: yield except configexc.Error as e: raise cmdutils.CommandError(str(e)) - def _parse_pattern( - self, - pattern: typing.Optional[str] - ) -> typing.Optional[urlmatch.UrlPattern]: + def _parse_pattern(self, pattern): """Parse a pattern string argument to a pattern.""" if pattern is None: return None @@ -70,15 +59,14 @@ class ConfigCommands: raise cmdutils.CommandError("Error while parsing {}: {}" .format(pattern, str(e))) - def _parse_key(self, key: str) -> keyutils.KeySequence: + def _parse_key(self, key): """Parse a key argument.""" try: return keyutils.KeySequence.parse(key) except keyutils.KeyParseError as e: raise cmdutils.CommandError(str(e)) - def _print_value(self, option: str, - pattern: typing.Optional[urlmatch.UrlPattern]) -> None: + def _print_value(self, option, pattern): """Print the value of the given option.""" with self._handle_config_error(): value = self._config.get_str(option, pattern=pattern) @@ -93,9 +81,8 @@ class ConfigCommands: @cmdutils.argument('value', completion=configmodel.value) @cmdutils.argument('win_id', value=cmdutils.Value.win_id) @cmdutils.argument('pattern', flag='u') - def set(self, win_id: int, option: str = None, value: str = None, - temp: bool = False, print_: bool = False, - *, pattern: str = None) -> None: + def set(self, win_id, option=None, value=None, temp=False, print_=False, + *, pattern=None): """Set an option. If the option name ends with '?' or no value is provided, the @@ -121,28 +108,28 @@ class ConfigCommands: raise cmdutils.CommandError("Toggling values was moved to the " ":config-cycle command") - parsed_pattern = self._parse_pattern(pattern) + pattern = self._parse_pattern(pattern) if option.endswith('?') and option != '?': - self._print_value(option[:-1], pattern=parsed_pattern) + self._print_value(option[:-1], pattern=pattern) return with self._handle_config_error(): if value is None: - self._print_value(option, pattern=parsed_pattern) + self._print_value(option, pattern=pattern) else: - self._config.set_str(option, value, pattern=parsed_pattern, + self._config.set_str(option, value, pattern=pattern, save_yaml=not temp) if print_: - self._print_value(option, pattern=parsed_pattern) + self._print_value(option, pattern=pattern) @cmdutils.register(instance='config-commands', maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.argument('command', completion=configmodel.bind) @cmdutils.argument('win_id', value=cmdutils.Value.win_id) - def bind(self, win_id: str, key: str = None, command: str = None, *, - mode: str = 'normal', default: bool = False) -> None: + def bind(self, win_id, key=None, command=None, *, mode='normal', + default=False): """Bind a key to a command. If no command is given, show the current binding for the given key. @@ -187,7 +174,7 @@ class ConfigCommands: self._keyconfig.bind(seq, command, mode=mode, save_yaml=True) @cmdutils.register(instance='config-commands') - def unbind(self, key: str, *, mode: str = 'normal') -> None: + def unbind(self, key, *, mode='normal'): """Unbind a keychain. Args: @@ -204,9 +191,8 @@ class ConfigCommands: @cmdutils.argument('option', completion=configmodel.option) @cmdutils.argument('values', completion=configmodel.value) @cmdutils.argument('pattern', flag='u') - def config_cycle(self, option: str, *values: str, - pattern: str = None, - temp: bool = False, print_: bool = False) -> None: + def config_cycle(self, option, *values, pattern=None, temp=False, + print_=False): """Cycle an option between multiple values. Args: @@ -216,15 +202,15 @@ class ConfigCommands: temp: Set value temporarily until qutebrowser is closed. print_: Print the value after setting. """ - parsed_pattern = self._parse_pattern(pattern) + pattern = self._parse_pattern(pattern) with self._handle_config_error(): opt = self._config.get_opt(option) - old_value = self._config.get_obj_for_pattern( - option, pattern=parsed_pattern) + old_value = self._config.get_obj_for_pattern(option, + pattern=pattern) if not values and isinstance(opt.typ, configtypes.Bool): - values = ('true', 'false') + values = ['true', 'false'] if len(values) < 2: raise cmdutils.CommandError("Need at least two values for " @@ -233,25 +219,25 @@ class ConfigCommands: # Use the next valid value from values, or the first if the current # value does not appear in the list with self._handle_config_error(): - cycle_values = [opt.typ.from_str(val) for val in values] + values = [opt.typ.from_str(val) for val in values] try: - idx = cycle_values.index(old_value) - idx = (idx + 1) % len(cycle_values) - value = cycle_values[idx] + idx = values.index(old_value) + idx = (idx + 1) % len(values) + value = values[idx] except ValueError: - value = cycle_values[0] + value = values[0] with self._handle_config_error(): - self._config.set_obj(option, value, pattern=parsed_pattern, + self._config.set_obj(option, value, pattern=pattern, save_yaml=not temp) if print_: - self._print_value(option, pattern=parsed_pattern) + self._print_value(option, pattern=pattern) @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.customized_option) - def config_unset(self, option: str, temp: bool = False) -> None: + def config_unset(self, option, temp=False): """Unset an option. This sets an option back to its default and removes it from @@ -266,8 +252,7 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.list_option) - def config_list_add(self, option: str, value: str, - temp: bool = False) -> None: + def config_list_add(self, option, value, temp=False): """Append a value to a config option that is a list. Args: @@ -288,8 +273,7 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.dict_option) - def config_dict_add(self, option: str, key: str, value: str, - temp: bool = False, replace: bool = False) -> None: + def config_dict_add(self, option, key, value, temp=False, replace=False): """Add a key/value pair to a dictionary option. Args: @@ -318,8 +302,7 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.list_option) - def config_list_remove(self, option: str, value: str, - temp: bool = False) -> None: + def config_list_remove(self, option, value, temp=False): """Remove a value from a list. Args: @@ -346,8 +329,7 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.dict_option) - def config_dict_remove(self, option: str, key: str, - temp: bool = False) -> None: + def config_dict_remove(self, option, key, temp=False): """Remove a key from a dict. Args: @@ -372,7 +354,7 @@ class ConfigCommands: self._config.update_mutables(save_yaml=not temp) @cmdutils.register(instance='config-commands') - def config_clear(self, save: bool = False) -> None: + def config_clear(self, save=False): """Set all settings back to their default. Args: @@ -382,7 +364,7 @@ class ConfigCommands: self._config.clear(save_yaml=save) @cmdutils.register(instance='config-commands') - def config_source(self, filename: str = None, clear: bool = False) -> None: + def config_source(self, filename=None, clear=False): """Read a config.py file. Args: @@ -404,13 +386,13 @@ class ConfigCommands: raise cmdutils.CommandError(e) @cmdutils.register(instance='config-commands') - def config_edit(self, no_source: bool = False) -> None: + def config_edit(self, no_source=False): """Open the config.py file in the editor. Args: no_source: Don't re-source the config file after editing. """ - def on_file_updated() -> None: + def on_file_updated(): """Source the new config when editing finished. This can't use cmdutils.CommandError as it's run async. @@ -428,8 +410,7 @@ class ConfigCommands: ed.edit_file(filename) @cmdutils.register(instance='config-commands') - def config_write_py(self, filename: str = None, - force: bool = False, defaults: bool = False) -> None: + def config_write_py(self, filename=None, force=False, defaults=False): """Write the current configuration to a config.py file. Args: @@ -448,13 +429,13 @@ class ConfigCommands: raise cmdutils.CommandError("{} already exists - use --force to " "overwrite!".format(filename)) - options = [] # type: typing.List if defaults: options = [(None, opt, opt.default) for _name, opt in sorted(configdata.DATA.items())] bindings = dict(configdata.DATA['bindings.default'].default) commented = True else: + options = [] for values in self._config: for scoped in values: options.append((scoped.pattern, values.opt, scoped.value)) diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index c93032387..dace0772a 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -24,18 +24,14 @@ Module attributes: DATA: A dict of Option objects after init() has been called. """ -import typing -from typing import Optional # pylint: disable=unused-import import functools import attr from qutebrowser.config import configtypes from qutebrowser.utils import usertypes, qtutils, utils -DATA = typing.cast(typing.Mapping[str, 'Option'], None) -MIGRATIONS = typing.cast('Migrations', None) - -_BackendDict = typing.Mapping[str, typing.Union[str, bool]] +DATA = None +MIGRATIONS = None @attr.s @@ -46,15 +42,15 @@ class Option: Note that this is just an option which exists, with no value associated. """ - name = attr.ib() # type: str - typ = attr.ib() # type: configtypes.BaseType - default = attr.ib() # type: typing.Any - backends = attr.ib() # type: typing.Iterable[usertypes.Backend] - raw_backends = attr.ib() # type: Optional[typing.Mapping[str, bool]] - description = attr.ib() # type: str - supports_pattern = attr.ib(default=False) # type: bool - restart = attr.ib(default=False) # type: bool - no_autoconfig = attr.ib(default=False) # type: bool + name = attr.ib() + typ = attr.ib() + default = attr.ib() + backends = attr.ib() + raw_backends = attr.ib() + description = attr.ib() + supports_pattern = attr.ib(default=False) + restart = attr.ib(default=False) + no_autoconfig = attr.ib(default=False) @attr.s @@ -67,13 +63,11 @@ class Migrations: deleted: A list of option names which have been removed. """ - renamed = attr.ib( - default=attr.Factory(dict)) # type: typing.Dict[str, str] - deleted = attr.ib( - default=attr.Factory(list)) # type: typing.List[str] + renamed = attr.ib(default=attr.Factory(dict)) + deleted = attr.ib(default=attr.Factory(list)) -def _raise_invalid_node(name: str, what: str, node: typing.Any) -> None: +def _raise_invalid_node(name, what, node): """Raise an exception for an invalid configdata YAML node. Args: @@ -85,16 +79,13 @@ def _raise_invalid_node(name: str, what: str, node: typing.Any) -> None: name, what, node)) -def _parse_yaml_type( - name: str, - node: typing.Union[str, typing.Mapping[str, typing.Any]], -) -> configtypes.BaseType: +def _parse_yaml_type(name, node): if isinstance(node, str): # e.g: # type: Bool # -> create the type object without any arguments type_name = node - kwargs = {} # type: typing.MutableMapping[str, typing.Any] + kwargs = {} elif isinstance(node, dict): # e.g: # type: @@ -132,10 +123,7 @@ def _parse_yaml_type( type_name, node, e)) -def _parse_yaml_backends_dict( - name: str, - node: _BackendDict, -) -> typing.Sequence[usertypes.Backend]: +def _parse_yaml_backends_dict(name, node): """Parse a dict definition for backends. Example: @@ -172,10 +160,7 @@ def _parse_yaml_backends_dict( return backends -def _parse_yaml_backends( - name: str, - node: typing.Union[None, str, _BackendDict], -) -> typing.Sequence[usertypes.Backend]: +def _parse_yaml_backends(name, node): """Parse a backend node in the yaml. It can have one of those four forms: @@ -202,9 +187,7 @@ def _parse_yaml_backends( raise utils.Unreachable -def _read_yaml( - yaml_data: str, -) -> typing.Tuple[typing.Mapping[str, Option], Migrations]: +def _read_yaml(yaml_data): """Read config data from a YAML file. Args: @@ -266,12 +249,12 @@ def _read_yaml( @functools.lru_cache(maxsize=256) -def is_valid_prefix(prefix: str) -> bool: +def is_valid_prefix(prefix): """Check whether the given prefix is a valid prefix for some option.""" return any(key.startswith(prefix + '.') for key in DATA) -def init() -> None: +def init(): """Initialize configdata from the YAML file.""" global DATA, MIGRATIONS DATA, MIGRATIONS = _read_yaml(utils.read_file('config/configdata.yml')) diff --git a/qutebrowser/config/configdiff.py b/qutebrowser/config/configdiff.py index ba78f64b4..9f8b70a26 100644 --- a/qutebrowser/config/configdiff.py +++ b/qutebrowser/config/configdiff.py @@ -19,7 +19,6 @@ """Code to show a diff of the legacy config format.""" -import typing # pylint: disable=unused-import,useless-suppression import difflib import os.path @@ -728,10 +727,10 @@ scroll right """ -def get_diff() -> str: +def get_diff(): """Get a HTML diff for the old config files.""" - old_conf_lines = [] # type: typing.MutableSequence[str] - old_key_lines = [] # type: typing.MutableSequence[str] + old_conf_lines = [] + old_key_lines = [] for filename, dest in [('qutebrowser.conf', old_conf_lines), ('keys.conf', old_key_lines)]: diff --git a/qutebrowser/config/configexc.py b/qutebrowser/config/configexc.py index b1dc04e09..051ed971a 100644 --- a/qutebrowser/config/configexc.py +++ b/qutebrowser/config/configexc.py @@ -19,10 +19,9 @@ """Exceptions related to config parsing.""" -import typing import attr -from qutebrowser.utils import jinja, usertypes +from qutebrowser.utils import jinja class Error(Exception): @@ -34,7 +33,7 @@ class NoAutoconfigError(Error): """Raised when this option can't be set in autoconfig.yml.""" - def __init__(self, name: str) -> None: + def __init__(self, name): super().__init__("The {} setting can only be set in config.py!" .format(name)) @@ -43,11 +42,7 @@ class BackendError(Error): """Raised when this setting is unavailable with the current backend.""" - def __init__( - self, name: str, - backend: usertypes.Backend, - raw_backends: typing.Optional[typing.Mapping[str, bool]] - ) -> None: + def __init__(self, name, backend, raw_backends): if raw_backends is None or not raw_backends[backend.name]: msg = ("The {} setting is not available with the {} backend!" .format(name, backend.name)) @@ -62,7 +57,7 @@ class NoPatternError(Error): """Raised when the given setting does not support URL patterns.""" - def __init__(self, name: str) -> None: + def __init__(self, name): super().__init__("The {} setting does not support URL patterns!" .format(name)) @@ -76,7 +71,7 @@ class ValidationError(Error): msg: Additional error message. """ - def __init__(self, value: typing.Any, msg: str) -> None: + def __init__(self, value, msg): super().__init__("Invalid value '{}' - {}".format(value, msg)) self.option = None @@ -90,9 +85,7 @@ class NoOptionError(Error): """Raised when an option was not found.""" - def __init__(self, option: str, *, - deleted: bool = False, - renamed: str = None) -> None: + def __init__(self, option, *, deleted=False, renamed=None): if deleted: assert renamed is None suffix = ' (this option was removed from qutebrowser)' @@ -116,18 +109,18 @@ class ConfigErrorDesc: traceback: The formatted traceback of the exception. """ - text = attr.ib() # type: str - exception = attr.ib() # type: typing.Union[str, Exception] - traceback = attr.ib(None) # type: str + text = attr.ib() + exception = attr.ib() + traceback = attr.ib(None) - def __str__(self) -> str: + def __str__(self): if self.traceback: return '{} - {}: {}'.format(self.text, self.exception.__class__.__name__, self.exception) return '{}: {}'.format(self.text, self.exception) - def with_text(self, text: str) -> 'ConfigErrorDesc': + def with_text(self, text): """Get a new ConfigErrorDesc with the given text appended.""" return self.__class__(text='{} ({})'.format(self.text, text), exception=self.exception, @@ -138,15 +131,13 @@ class ConfigFileErrors(Error): """Raised when multiple errors occurred inside the config.""" - def __init__(self, - basename: str, - errors: typing.Sequence[ConfigErrorDesc]) -> None: + def __init__(self, basename, errors): super().__init__("Errors occurred while reading {}:\n{}".format( basename, '\n'.join(' {}'.format(e) for e in errors))) self.basename = basename self.errors = errors - def to_html(self) -> str: + def to_html(self): """Get the error texts as a HTML snippet.""" template = jinja.environment.from_string(""" Errors occurred while reading {{ basename }}: diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index 54ca91488..b4c8ea4ec 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -27,7 +27,6 @@ import textwrap import traceback import configparser import contextlib -import typing import yaml from PyQt5.QtCore import pyqtSignal, QObject, QSettings @@ -37,21 +36,16 @@ from qutebrowser.config import configexc, config, configdata, configutils from qutebrowser.keyinput import keyutils from qutebrowser.utils import standarddir, utils, qtutils, log, urlmatch -MYPY = False -if MYPY: - # pylint: disable=unused-import, useless-suppression - from qutebrowser.misc import savemanager - # The StateConfig instance -state = typing.cast('StateConfig', None) +state = None class StateConfig(configparser.ConfigParser): """The "state" file saving various application state.""" - def __init__(self) -> None: + def __init__(self): super().__init__() self._filename = os.path.join(standarddir.data(), 'state') self.read(self._filename, encoding='utf-8') @@ -65,8 +59,7 @@ class StateConfig(configparser.ConfigParser): for key in deleted_keys: self['general'].pop(key, None) - def init_save_manager(self, - save_manager: 'savemanager.SaveManager') -> None: + def init_save_manager(self, save_manager): """Make sure the config gets saved properly. We do this outside of __init__ because the config gets created before @@ -74,7 +67,7 @@ class StateConfig(configparser.ConfigParser): """ save_manager.add_saveable('state-config', self._save) - def _save(self) -> None: + def _save(self): """Save the state file to the configured location.""" with open(self._filename, 'w', encoding='utf-8') as f: self.write(f) @@ -91,20 +84,17 @@ class YamlConfig(QObject): VERSION = 2 changed = pyqtSignal() - _SettingsType = typing.Dict[str, typing.Dict[str, typing.Any]] - - def __init__(self, parent: QObject = None) -> None: + def __init__(self, parent=None): super().__init__(parent) self._filename = os.path.join(standarddir.config(auto=True), 'autoconfig.yml') - self._dirty = False + self._dirty = None - self._values = {} # type: typing.Dict[str, configutils.Values] + self._values = {} for name, opt in configdata.DATA.items(): self._values[name] = configutils.Values(opt) - def init_save_manager(self, - save_manager: 'savemanager.SaveManager') -> None: + def init_save_manager(self, save_manager): """Make sure the config gets saved properly. We do this outside of __init__ because the config gets created before @@ -112,21 +102,21 @@ class YamlConfig(QObject): """ save_manager.add_saveable('yaml-config', self._save, self.changed) - def __iter__(self) -> typing.Iterator[configutils.Values]: + def __iter__(self): """Iterate over configutils.Values items.""" yield from self._values.values() - def _mark_changed(self) -> None: + def _mark_changed(self): """Mark the YAML config as changed.""" self._dirty = True self.changed.emit() - def _save(self) -> None: + def _save(self): """Save the settings to the YAML file if they've changed.""" if not self._dirty: return - settings = {} # type: YamlConfig._SettingsType + settings = {} for name, values in sorted(self._values.items()): if not values: continue @@ -145,10 +135,7 @@ class YamlConfig(QObject): """.lstrip('\n'))) utils.yaml_dump(data, f) - def _pop_object(self, - yaml_data: typing.Any, - key: str, - typ: type) -> typing.Any: + def _pop_object(self, yaml_data, key, typ): """Get a global object from the given data.""" if not isinstance(yaml_data, dict): desc = configexc.ConfigErrorDesc("While loading data", @@ -171,7 +158,7 @@ class YamlConfig(QObject): return data - def load(self) -> None: + def load(self): """Load configuration from the configured YAML file.""" try: with open(self._filename, 'r', encoding='utf-8') as f: @@ -202,19 +189,18 @@ class YamlConfig(QObject): self._validate(settings) self._build_values(settings) - def _load_settings_object(self, yaml_data: typing.Any) -> '_SettingsType': + def _load_settings_object(self, yaml_data): """Load the settings from the settings: key.""" return self._pop_object(yaml_data, 'settings', dict) - def _load_legacy_settings_object(self, - yaml_data: typing.Any) -> '_SettingsType': + def _load_legacy_settings_object(self, yaml_data): data = self._pop_object(yaml_data, 'global', dict) settings = {} for name, value in data.items(): settings[name] = {'global': value} return settings - def _build_values(self, settings: typing.Mapping) -> None: + def _build_values(self, settings): """Build up self._values from the values in the given dict.""" errors = [] for name, yaml_values in settings.items(): @@ -247,8 +233,7 @@ class YamlConfig(QObject): if errors: raise configexc.ConfigFileErrors('autoconfig.yml', errors) - def _migrate_bool(self, settings: _SettingsType, name: str, - true_value: str, false_value: str) -> None: + def _migrate_bool(self, settings, name, true_value, false_value): """Migrate a boolean in the settings.""" if name in settings: for scope, val in settings[name].items(): @@ -256,7 +241,7 @@ class YamlConfig(QObject): settings[name][scope] = true_value if val else false_value self._mark_changed() - def _handle_migrations(self, settings: _SettingsType) -> '_SettingsType': + def _handle_migrations(self, settings): """Migrate older configs to the newest format.""" # Simple renamed/deleted options for name in list(settings): @@ -314,7 +299,7 @@ class YamlConfig(QObject): return settings - def _validate(self, settings: _SettingsType) -> None: + def _validate(self, settings): """Make sure all settings exist.""" unknown = [] for name in settings: @@ -327,19 +312,18 @@ class YamlConfig(QObject): for e in sorted(unknown)] raise configexc.ConfigFileErrors('autoconfig.yml', errors) - def set_obj(self, name: str, value: typing.Any, *, - pattern: urlmatch.UrlPattern = None) -> None: + def set_obj(self, name, value, *, pattern=None): """Set the given setting to the given value.""" self._values[name].add(value, pattern) self._mark_changed() - def unset(self, name: str, *, pattern: urlmatch.UrlPattern = None) -> None: + def unset(self, name, *, pattern=None): """Remove the given option name if it's configured.""" changed = self._values[name].remove(pattern) if changed: self._mark_changed() - def clear(self) -> None: + def clear(self): """Clear all values from the YAML file.""" for values in self._values.values(): values.clear() @@ -362,15 +346,15 @@ class ConfigAPI: datadir: The qutebrowser data directory, as pathlib.Path. """ - def __init__(self, conf: config.Config, keyconfig: config.KeyConfig): + def __init__(self, conf, keyconfig): self._config = conf self._keyconfig = keyconfig - self.errors = [] # type: typing.List[configexc.ConfigErrorDesc] + self.errors = [] self.configdir = pathlib.Path(standarddir.config()) self.datadir = pathlib.Path(standarddir.data()) @contextlib.contextmanager - def _handle_error(self, action: str, name: str) -> typing.Iterator[None]: + def _handle_error(self, action, name): """Catch config-related exceptions and save them in self.errors.""" try: yield @@ -388,40 +372,40 @@ class ConfigAPI: text = "While {} '{}' and parsing key".format(action, name) self.errors.append(configexc.ConfigErrorDesc(text, e)) - def finalize(self) -> None: + def finalize(self): """Do work which needs to be done after reading config.py.""" self._config.update_mutables() - def load_autoconfig(self) -> None: + def load_autoconfig(self): """Load the autoconfig.yml file which is used for :set/:bind/etc.""" with self._handle_error('reading', 'autoconfig.yml'): read_autoconfig() - def get(self, name: str, pattern: str = None) -> typing.Any: + def get(self, name, pattern=None): """Get a setting value from the config, optionally with a pattern.""" with self._handle_error('getting', name): urlpattern = urlmatch.UrlPattern(pattern) if pattern else None return self._config.get_mutable_obj(name, pattern=urlpattern) - def set(self, name: str, value: typing.Any, pattern: str = None) -> None: + def set(self, name, value, pattern=None): """Set a setting value in the config, optionally with a pattern.""" with self._handle_error('setting', name): urlpattern = urlmatch.UrlPattern(pattern) if pattern else None self._config.set_obj(name, value, pattern=urlpattern) - def bind(self, key: str, command: str, mode: str = 'normal') -> None: + def bind(self, key, command, mode='normal'): """Bind a key to a command, with an optional key mode.""" with self._handle_error('binding', key): seq = keyutils.KeySequence.parse(key) self._keyconfig.bind(seq, command, mode=mode) - def unbind(self, key: str, mode: str = 'normal') -> None: + def unbind(self, key, mode='normal'): """Unbind a key from a command, with an optional key mode.""" with self._handle_error('unbinding', key): seq = keyutils.KeySequence.parse(key) self._keyconfig.unbind(seq, mode=mode) - def source(self, filename: str) -> None: + def source(self, filename): """Read the given config file from disk.""" if not os.path.isabs(filename): filename = str(self.configdir / filename) @@ -432,7 +416,7 @@ class ConfigAPI: self.errors += e.errors @contextlib.contextmanager - def pattern(self, pattern: str) -> typing.Iterator[config.ConfigContainer]: + def pattern(self, pattern): """Get a ConfigContainer for the given pattern.""" # We need to propagate the exception so we don't need to return # something. @@ -446,21 +430,17 @@ class ConfigPyWriter: """Writer for config.py files from given settings.""" - def __init__( - self, - options: typing.List, - bindings: typing.MutableMapping[str, typing.Mapping[str, str]], *, - commented: bool) -> None: + def __init__(self, options, bindings, *, commented): self._options = options self._bindings = bindings self._commented = commented - def write(self, filename: str) -> None: + def write(self, filename): """Write the config to the given file.""" with open(filename, 'w', encoding='utf-8') as f: f.write('\n'.join(self._gen_lines())) - def _line(self, line: str) -> str: + def _line(self, line): """Get an (optionally commented) line.""" if self._commented: if line.startswith('#'): @@ -470,7 +450,7 @@ class ConfigPyWriter: else: return line - def _gen_lines(self) -> typing.Iterator[str]: + def _gen_lines(self): """Generate a config.py with the given settings/bindings. Yields individual lines. @@ -479,7 +459,7 @@ class ConfigPyWriter: yield from self._gen_options() yield from self._gen_bindings() - def _gen_header(self) -> typing.Iterator[str]: + def _gen_header(self): """Generate the initial header of the config.""" yield self._line("# Autogenerated config.py") yield self._line("# Documentation:") @@ -501,7 +481,7 @@ class ConfigPyWriter: yield self._line("# config.load_autoconfig()") yield '' - def _gen_options(self) -> typing.Iterator[str]: + def _gen_options(self): """Generate the options part of the config.""" for pattern, opt, value in self._options: if opt.name in ['bindings.commands', 'bindings.default']: @@ -529,7 +509,7 @@ class ConfigPyWriter: opt.name, value, str(pattern))) yield '' - def _gen_bindings(self) -> typing.Iterator[str]: + def _gen_bindings(self): """Generate the bindings part of the config.""" normal_bindings = self._bindings.pop('normal', {}) if normal_bindings: @@ -547,7 +527,7 @@ class ConfigPyWriter: yield '' -def read_config_py(filename: str, raising: bool = False) -> None: +def read_config_py(filename, raising=False): """Read a config.py file. Arguments; @@ -563,8 +543,8 @@ def read_config_py(filename: str, raising: bool = False) -> None: basename = os.path.basename(filename) module = types.ModuleType('config') - module.config = api # type: ignore - module.c = container # type: ignore + module.config = api + module.c = container module.__file__ = filename try: @@ -609,7 +589,7 @@ def read_config_py(filename: str, raising: bool = False) -> None: raise configexc.ConfigFileErrors('config.py', api.errors) -def read_autoconfig() -> None: +def read_autoconfig(): """Read the autoconfig.yml file.""" try: config.instance.read_yaml() @@ -621,7 +601,7 @@ def read_autoconfig() -> None: @contextlib.contextmanager -def saved_sys_properties() -> typing.Iterator[None]: +def saved_sys_properties(): """Save various sys properties such as sys.path and sys.modules.""" old_path = sys.path.copy() old_modules = sys.modules.copy() @@ -634,7 +614,7 @@ def saved_sys_properties() -> typing.Iterator[None]: del sys.modules[module] -def init() -> None: +def init(): """Initialize config storage not related to the main config.""" global state state = StateConfig() diff --git a/qutebrowser/config/configinit.py b/qutebrowser/config/configinit.py index ff0fd0e41..de9651064 100644 --- a/qutebrowser/config/configinit.py +++ b/qutebrowser/config/configinit.py @@ -19,10 +19,8 @@ """Initialization of the configuration.""" -import argparse import os.path import sys -import typing from PyQt5.QtWidgets import QMessageBox @@ -32,14 +30,14 @@ from qutebrowser.config import (config, configdata, configfiles, configtypes, from qutebrowser.utils import (objreg, usertypes, log, standarddir, message, qtutils) from qutebrowser.config import configcache -from qutebrowser.misc import msgbox, objects, savemanager +from qutebrowser.misc import msgbox, objects # Error which happened during init, so we can show a message box. _init_errors = None -def early_init(args: argparse.Namespace) -> None: +def early_init(args): """Initialize the part of the config which works without a QApplication.""" configdata.init() @@ -87,7 +85,7 @@ def early_init(args: argparse.Namespace) -> None: _init_envvars() -def _init_envvars() -> None: +def _init_envvars(): """Initialize environment variables which need to be set early.""" if objects.backend == usertypes.Backend.QtWebEngine: software_rendering = config.val.qt.force_software_rendering @@ -109,7 +107,7 @@ def _init_envvars() -> None: @config.change_filter('fonts.monospace', function=True) -def _update_monospace_fonts() -> None: +def _update_monospace_fonts(): """Update all fonts if fonts.monospace was set.""" configtypes.Font.monospace_fonts = config.val.fonts.monospace for name, opt in configdata.DATA.items(): @@ -125,7 +123,7 @@ def _update_monospace_fonts() -> None: config.instance.changed.emit(name) -def get_backend(args: argparse.Namespace) -> usertypes.Backend: +def get_backend(args): """Find out what backend to use based on available libraries.""" str_to_backend = { 'webkit': usertypes.Backend.QtWebKit, @@ -138,7 +136,7 @@ def get_backend(args: argparse.Namespace) -> usertypes.Backend: return str_to_backend[config.val.backend] -def late_init(save_manager: savemanager.SaveManager) -> None: +def late_init(save_manager): """Initialize the rest of the config after the QApplication is created.""" global _init_errors if _init_errors is not None: @@ -154,7 +152,7 @@ def late_init(save_manager: savemanager.SaveManager) -> None: configfiles.state.init_save_manager(save_manager) -def qt_args(namespace: argparse.Namespace) -> typing.List[str]: +def qt_args(namespace): """Get the Qt QApplication arguments based on an argparse namespace. Args: @@ -180,7 +178,7 @@ def qt_args(namespace: argparse.Namespace) -> typing.List[str]: return argv -def _qtwebengine_args() -> typing.Iterator[str]: +def _qtwebengine_args(): """Get the QtWebEngine arguments to use based on the config.""" if not qtutils.version_check('5.11', compiled=False): # WORKAROUND equivalent to @@ -226,7 +224,7 @@ def _qtwebengine_args() -> typing.Iterator[str]: 'never': '--no-referrers', 'same-domain': '--reduced-referrer-granularity', } - } # type: typing.Dict[str, typing.Dict[typing.Any, typing.Optional[str]]] + } if not qtutils.version_check('5.11'): # On Qt 5.11, we can control this via QWebEngineSettings diff --git a/qutebrowser/config/configutils.py b/qutebrowser/config/configutils.py index 9d4dc94ef..96fc0f02d 100644 --- a/qutebrowser/config/configutils.py +++ b/qutebrowser/config/configutils.py @@ -21,19 +21,11 @@ """Utilities and data structures used by various config code.""" -import typing - import attr -from PyQt5.QtCore import QUrl -from qutebrowser.utils import utils, urlmatch +from qutebrowser.utils import utils from qutebrowser.config import configexc -MYPY = False -if MYPY: # pragma: no cover - # pylint: disable=unused-import,useless-suppression - from qutebrowser.config import configdata - class _UnsetObject: @@ -41,7 +33,7 @@ class _UnsetObject: __slots__ = () - def __repr__(self) -> str: + def __repr__(self): return '' @@ -58,8 +50,8 @@ class ScopedValue: pattern: The UrlPattern for the value, or None for global values. """ - value = attr.ib() # type: typing.Any - pattern = attr.ib() # type: typing.Optional[urlmatch.UrlPattern] + value = attr.ib() + pattern = attr.ib() class Values: @@ -81,17 +73,15 @@ class Values: opt: The Option being customized. """ - def __init__(self, - opt: 'configdata.Option', - values: typing.MutableSequence = None) -> None: + def __init__(self, opt, values=None): self.opt = opt self._values = values or [] - def __repr__(self) -> str: + def __repr__(self): return utils.get_repr(self, opt=self.opt, values=self._values, constructor=True) - def __str__(self) -> str: + def __str__(self): """Get the values as human-readable string.""" if not self: return '{}: '.format(self.opt.name) @@ -106,7 +96,7 @@ class Values: scoped.pattern, self.opt.name, str_value)) return '\n'.join(lines) - def __iter__(self) -> typing.Iterator['ScopedValue']: + def __iter__(self): """Yield ScopedValue elements. This yields in "normal" order, i.e. global and then first-set settings @@ -114,25 +104,23 @@ class Values: """ yield from self._values - def __bool__(self) -> bool: + def __bool__(self): """Check whether this value is customized.""" return bool(self._values) - def _check_pattern_support( - self, arg: typing.Optional[urlmatch.UrlPattern]) -> None: + def _check_pattern_support(self, arg): """Make sure patterns are supported if one was given.""" if arg is not None and not self.opt.supports_pattern: raise configexc.NoPatternError(self.opt.name) - def add(self, value: typing.Any, - pattern: urlmatch.UrlPattern = None) -> None: + def add(self, value, pattern=None): """Add a value with the given pattern to the list of values.""" self._check_pattern_support(pattern) self.remove(pattern) scoped = ScopedValue(value, pattern) self._values.append(scoped) - def remove(self, pattern: urlmatch.UrlPattern = None) -> bool: + def remove(self, pattern=None): """Remove the value with the given pattern. If a matching pattern was removed, True is returned. @@ -143,11 +131,11 @@ class Values: self._values = [v for v in self._values if v.pattern != pattern] return old_len != len(self._values) - def clear(self) -> None: + def clear(self): """Clear all customization for this value.""" self._values = [] - def _get_fallback(self, fallback: typing.Any) -> typing.Any: + def _get_fallback(self, fallback): """Get the fallback global/default value.""" for scoped in self._values: if scoped.pattern is None: @@ -158,8 +146,7 @@ class Values: else: return UNSET - def get_for_url(self, url: QUrl = None, *, - fallback: bool = True) -> typing.Any: + def get_for_url(self, url=None, *, fallback=True): """Get a config value, falling back when needed. This first tries to find a value matching the URL (if given). @@ -178,9 +165,7 @@ class Values: return self._get_fallback(fallback) - def get_for_pattern(self, - pattern: typing.Optional[urlmatch.UrlPattern], *, - fallback: bool = True) -> typing.Any: + def get_for_pattern(self, pattern, *, fallback=True): """Get a value only if it's been overridden for the given pattern. This is useful when showing values to the user. From 13dac9eef5b43b0dafe757af7056cbc508a0014f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 15:36:21 +0100 Subject: [PATCH 265/492] Revert "Revert "Add types for most of qutebrowser.config"" This reverts commit 7494d238ce6248a217ab958753777ed093d9411e. --- mypy.ini | 36 ++++++ qutebrowser/config/config.py | 184 +++++++++++++++++---------- qutebrowser/config/configcommands.py | 97 ++++++++------ qutebrowser/config/configdata.py | 59 ++++++--- qutebrowser/config/configdiff.py | 7 +- qutebrowser/config/configexc.py | 35 +++-- qutebrowser/config/configfiles.py | 114 ++++++++++------- qutebrowser/config/configinit.py | 20 +-- qutebrowser/config/configutils.py | 49 ++++--- 9 files changed, 385 insertions(+), 216 deletions(-) diff --git a/mypy.ini b/mypy.ini index 288cc6515..be5424327 100644 --- a/mypy.ini +++ b/mypy.ini @@ -61,3 +61,39 @@ disallow_incomplete_defs = True [mypy-qutebrowser.commands.cmdutils] disallow_untyped_defs = True disallow_incomplete_defs = True + +[mypy-qutebrowser.config.config] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configcache] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configcommands] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configdata] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configdiff] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configexc] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configfiles] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configinit] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.config.configutils] +disallow_untyped_defs = True +disallow_incomplete_defs = True diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 1d7e34345..44bf3ca77 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -23,18 +23,21 @@ import copy import contextlib import functools import typing +from typing import Any -from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject +from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QUrl from qutebrowser.config import configdata, configexc, configutils -from qutebrowser.utils import utils, log, jinja +from qutebrowser.utils import utils, log, jinja, urlmatch from qutebrowser.misc import objects from qutebrowser.keyinput import keyutils MYPY = False -if MYPY: - # pylint: disable=unused-import - from qutebrowser.config import configcache # pragma: no cover +if MYPY: # pragma: no cover + # pylint: disable=unused-import,useless-suppression + from typing import Tuple, MutableMapping + from qutebrowser.config import configcache, configfiles + from qutebrowser.misc import savemanager # An easy way to access the config from other code via config.val.foo val = typing.cast('ConfigContainer', None) @@ -61,7 +64,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name _function: Whether a function rather than a method is decorated. """ - def __init__(self, option, function=False): + def __init__(self, option: str, function: bool = False) -> None: """Save decorator arguments. Gets called on parse-time with the decorator arguments. @@ -74,7 +77,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name self._function = function change_filters.append(self) - def validate(self): + def validate(self) -> None: """Make sure the configured option or prefix exists. We can't do this in __init__ as configdata isn't ready yet. @@ -83,7 +86,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name not configdata.is_valid_prefix(self._option)): raise configexc.NoOptionError(self._option) - def _check_match(self, option): + def _check_match(self, option: typing.Optional[str]) -> bool: """Check if the given option matches the filter.""" if option is None: # Called directly, not from a config change event. @@ -96,7 +99,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name else: return False - def __call__(self, func): + def __call__(self, func: typing.Callable) -> typing.Callable: """Filter calls to the decorated function. Gets called when a function should be decorated. @@ -114,20 +117,21 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name """ if self._function: @functools.wraps(func) - def wrapper(option=None): + def func_wrapper(option: str = None) -> typing.Any: """Call the underlying function.""" if self._check_match(option): return func() return None + return func_wrapper else: @functools.wraps(func) - def wrapper(wrapper_self, option=None): + def meth_wrapper(wrapper_self: typing.Any, + option: str = None) -> typing.Any: """Call the underlying function.""" if self._check_match(option): return func(wrapper_self) return None - - return wrapper + return meth_wrapper class KeyConfig: @@ -140,17 +144,22 @@ class KeyConfig: _config: The Config object to be used. """ - def __init__(self, config): + _ReverseBindings = typing.Dict[str, typing.MutableSequence[str]] + + def __init__(self, config: 'Config') -> None: self._config = config - def _validate(self, key, mode): + def _validate(self, key: keyutils.KeySequence, mode: str) -> None: """Validate the given key and mode.""" # Catch old usage of this code assert isinstance(key, keyutils.KeySequence), key if mode not in configdata.DATA['bindings.default'].default: raise configexc.KeybindingError("Invalid mode {}!".format(mode)) - def get_bindings_for(self, mode): + def get_bindings_for( + self, + mode: str + ) -> typing.Dict[keyutils.KeySequence, str]: """Get the combined bindings for the given mode.""" bindings = dict(val.bindings.default[mode]) for key, binding in val.bindings.commands[mode].items(): @@ -160,9 +169,9 @@ class KeyConfig: bindings[key] = binding return bindings - def get_reverse_bindings_for(self, mode): + def get_reverse_bindings_for(self, mode: str) -> '_ReverseBindings': """Get a dict of commands to a list of bindings for the mode.""" - cmd_to_keys = {} + cmd_to_keys = {} # type: KeyConfig._ReverseBindings bindings = self.get_bindings_for(mode) for seq, full_cmd in sorted(bindings.items()): for cmd in full_cmd.split(';;'): @@ -175,7 +184,10 @@ class KeyConfig: cmd_to_keys[cmd].insert(0, str(seq)) return cmd_to_keys - def get_command(self, key, mode, default=False): + def get_command(self, + key: keyutils.KeySequence, + mode: str, + default: bool = False) -> str: """Get the command for a given key (or None).""" self._validate(key, mode) if default: @@ -184,7 +196,11 @@ class KeyConfig: bindings = self.get_bindings_for(mode) return bindings.get(key, None) - def bind(self, key, command, *, mode, save_yaml=False): + def bind(self, + key: keyutils.KeySequence, + command: str, *, + mode: str, + save_yaml: bool = False) -> None: """Add a new binding from key to command.""" if command is not None and not command.strip(): raise configexc.KeybindingError( @@ -192,8 +208,8 @@ class KeyConfig: 'mode'.format(key, mode)) self._validate(key, mode) - log.keyboard.vdebug("Adding binding {} -> {} in mode {}.".format( - key, command, mode)) + log.keyboard.vdebug( # type: ignore + "Adding binding {} -> {} in mode {}.".format(key, command, mode)) bindings = self._config.get_mutable_obj('bindings.commands') if mode not in bindings: @@ -201,7 +217,10 @@ class KeyConfig: bindings[mode][str(key)] = command self._config.update_mutables(save_yaml=save_yaml) - def bind_default(self, key, *, mode='normal', save_yaml=False): + def bind_default(self, + key: keyutils.KeySequence, *, + mode: str = 'normal', + save_yaml: bool = False) -> None: """Restore a default keybinding.""" self._validate(key, mode) @@ -213,7 +232,10 @@ class KeyConfig: "Can't find binding '{}' in {} mode".format(key, mode)) self._config.update_mutables(save_yaml=save_yaml) - def unbind(self, key, *, mode='normal', save_yaml=False): + def unbind(self, + key: keyutils.KeySequence, *, + mode: str = 'normal', + save_yaml: bool = False) -> None: """Unbind the given key in the given mode.""" self._validate(key, mode) @@ -254,24 +276,27 @@ class Config(QObject): MUTABLE_TYPES = (dict, list) changed = pyqtSignal(str) - def __init__(self, yaml_config, parent=None): + def __init__(self, + yaml_config: 'configfiles.YamlConfig', + parent: QObject = None) -> None: super().__init__(parent) self.changed.connect(_render_stylesheet.cache_clear) - self._mutables = {} + self._mutables = {} # type: MutableMapping[str, Tuple[Any, Any]] self._yaml = yaml_config self._init_values() - def _init_values(self): + def _init_values(self) -> None: """Populate the self._values dict.""" - self._values = {} + self._values = {} # type: typing.Mapping for name, opt in configdata.DATA.items(): self._values[name] = configutils.Values(opt) - def __iter__(self): + def __iter__(self) -> typing.Iterator[configutils.Values]: """Iterate over configutils.Values items.""" yield from self._values.values() - def init_save_manager(self, save_manager): + def init_save_manager(self, + save_manager: 'savemanager.SaveManager') -> None: """Make sure the config gets saved properly. We do this outside of __init__ because the config gets created before @@ -279,7 +304,10 @@ class Config(QObject): """ self._yaml.init_save_manager(save_manager) - def _set_value(self, opt, value, pattern=None): + def _set_value(self, + opt: 'configdata.Option', + value: Any, + pattern: urlmatch.UrlPattern = None) -> None: """Set the given option to the given value.""" if not isinstance(objects.backend, objects.NoBackend): if objects.backend not in opt.backends: @@ -294,12 +322,12 @@ class Config(QObject): log.config.debug("Config option changed: {} = {}".format( opt.name, value)) - def _check_yaml(self, opt, save_yaml): + def _check_yaml(self, opt: 'configdata.Option', save_yaml: bool) -> None: """Make sure the given option may be set in autoconfig.yml.""" if save_yaml and opt.no_autoconfig: raise configexc.NoAutoconfigError(opt.name) - def read_yaml(self): + def read_yaml(self) -> None: """Read the YAML settings from self._yaml.""" self._yaml.load() for values in self._yaml: @@ -307,7 +335,7 @@ class Config(QObject): self._set_value(values.opt, scoped.value, pattern=scoped.pattern) - def get_opt(self, name): + def get_opt(self, name: str) -> 'configdata.Option': """Get a configdata.Option object for the given setting.""" try: return configdata.DATA[name] @@ -318,7 +346,10 @@ class Config(QObject): name, deleted=deleted, renamed=renamed) raise exception from None - def get(self, name, url=None, *, fallback=True): + def get(self, + name: str, + url: QUrl = None, *, + fallback: bool = True) -> Any: """Get the given setting converted for Python code. Args: @@ -328,7 +359,7 @@ class Config(QObject): obj = self.get_obj(name, url=url, fallback=fallback) return opt.typ.to_py(obj) - def _maybe_copy(self, value): + def _maybe_copy(self, value: Any) -> Any: """Copy the value if it could potentially be mutated.""" if isinstance(value, self.MUTABLE_TYPES): # For mutable objects, create a copy so we don't accidentally @@ -339,7 +370,10 @@ class Config(QObject): assert value.__hash__ is not None, value return value - def get_obj(self, name, *, url=None, fallback=True): + def get_obj(self, + name: str, *, + url: QUrl = None, + fallback: bool = True) -> Any: """Get the given setting as object (for YAML/config.py). Note that the returned values are not watched for mutation. @@ -349,7 +383,10 @@ class Config(QObject): value = self._values[name].get_for_url(url, fallback=fallback) return self._maybe_copy(value) - def get_obj_for_pattern(self, name, *, pattern): + def get_obj_for_pattern( + self, name: str, *, + pattern: typing.Optional[urlmatch.UrlPattern] + ) -> Any: """Get the given setting as object (for YAML/config.py). This gets the overridden value for a given pattern, or @@ -359,7 +396,8 @@ class Config(QObject): value = self._values[name].get_for_pattern(pattern, fallback=False) return self._maybe_copy(value) - def get_mutable_obj(self, name, *, pattern=None): + def get_mutable_obj(self, name: str, *, + pattern: urlmatch.UrlPattern = None) -> Any: """Get an object which can be mutated, e.g. in a config.py. If a pattern is given, return the value for that pattern. @@ -384,7 +422,8 @@ class Config(QObject): return copy_value - def get_str(self, name, *, pattern=None): + def get_str(self, name: str, *, + pattern: urlmatch.UrlPattern = None) -> str: """Get the given setting as string. If a pattern is given, get the setting for the given pattern or @@ -395,7 +434,10 @@ class Config(QObject): value = values.get_for_pattern(pattern) return opt.typ.to_str(value) - def set_obj(self, name, value, *, pattern=None, save_yaml=False): + def set_obj(self, name: str, + value: Any, *, + pattern: urlmatch.UrlPattern = None, + save_yaml: bool = False) -> None: """Set the given setting from a YAML/config.py object. If save_yaml=True is given, store the new value to YAML. @@ -406,7 +448,10 @@ class Config(QObject): if save_yaml: self._yaml.set_obj(name, value, pattern=pattern) - def set_str(self, name, value, *, pattern=None, save_yaml=False): + def set_str(self, name: str, + value: str, *, + pattern: urlmatch.UrlPattern = None, + save_yaml: bool = False) -> None: """Set the given setting from a string. If save_yaml=True is given, store the new value to YAML. @@ -421,7 +466,9 @@ class Config(QObject): if save_yaml: self._yaml.set_obj(name, converted, pattern=pattern) - def unset(self, name, *, save_yaml=False, pattern=None): + def unset(self, name: str, *, + save_yaml: bool = False, + pattern: urlmatch.UrlPattern = None) -> None: """Set the given setting back to its default.""" opt = self.get_opt(name) self._check_yaml(opt, save_yaml) @@ -432,7 +479,7 @@ class Config(QObject): if save_yaml: self._yaml.unset(name, pattern=pattern) - def clear(self, *, save_yaml=False): + def clear(self, *, save_yaml: bool = False) -> None: """Clear all settings in the config. If save_yaml=True is given, also remove all customization from the YAML @@ -446,7 +493,7 @@ class Config(QObject): if save_yaml: self._yaml.clear() - def update_mutables(self, *, save_yaml=False): + def update_mutables(self, *, save_yaml: bool = False) -> None: """Update mutable settings if they changed. Every time someone calls get_obj() on a mutable object, we save a @@ -461,7 +508,7 @@ class Config(QObject): self.set_obj(name, new_value, save_yaml=save_yaml) self._mutables = {} - def dump_userconfig(self): + def dump_userconfig(self) -> str: """Get the part of the config which was changed by the user. Return: @@ -490,7 +537,10 @@ class ConfigContainer: _pattern: The URL pattern to be used. """ - def __init__(self, config, configapi=None, prefix='', pattern=None): + def __init__(self, config: Config, + configapi: 'configfiles.ConfigAPI' = None, + prefix: str = '', + pattern: urlmatch.UrlPattern = None) -> None: self._config = config self._prefix = prefix self._configapi = configapi @@ -498,13 +548,13 @@ class ConfigContainer: if configapi is None and pattern is not None: raise TypeError("Can't use pattern without configapi!") - def __repr__(self): + def __repr__(self) -> str: return utils.get_repr(self, constructor=True, config=self._config, configapi=self._configapi, prefix=self._prefix, pattern=self._pattern) @contextlib.contextmanager - def _handle_error(self, action, name): + def _handle_error(self, action: str, name: str) -> typing.Iterator[None]: try: yield except configexc.Error as e: @@ -513,7 +563,7 @@ class ConfigContainer: text = "While {} '{}'".format(action, name) self._configapi.errors.append(configexc.ConfigErrorDesc(text, e)) - def __getattr__(self, attr): + def __getattr__(self, attr: str) -> Any: """Get an option or a new ConfigContainer with the added prefix. If we get an option which exists, we return the value for it. @@ -540,7 +590,7 @@ class ConfigContainer: return self._config.get_mutable_obj( name, pattern=self._pattern) - def __setattr__(self, attr, value): + def __setattr__(self, attr: str, value: Any) -> None: """Set the given option in the config.""" if attr.startswith('_'): super().__setattr__(attr, value) @@ -550,7 +600,7 @@ class ConfigContainer: with self._handle_error('setting', name): self._config.set_obj(name, value, pattern=self._pattern) - def _join(self, attr): + def _join(self, attr: str) -> str: """Get the prefix joined with the given attribute.""" if self._prefix: return '{}.{}'.format(self._prefix, attr) @@ -558,8 +608,10 @@ class ConfigContainer: return attr -def set_register_stylesheet(obj, *, stylesheet=None, update=True): - """Set the stylesheet for an object based on it's STYLESHEET attribute. +def set_register_stylesheet(obj: QObject, *, + stylesheet: str = None, + update: bool = True) -> None: + """Set the stylesheet for an object. Also, register an update when the config is changed. @@ -574,7 +626,7 @@ def set_register_stylesheet(obj, *, stylesheet=None, update=True): @functools.lru_cache() -def _render_stylesheet(stylesheet): +def _render_stylesheet(stylesheet: str) -> str: """Render the given stylesheet jinja template.""" with jinja.environment.no_autoescape(): template = jinja.environment.from_string(stylesheet) @@ -590,7 +642,9 @@ class StyleSheetObserver(QObject): _stylesheet: The stylesheet template to use. """ - def __init__(self, obj, stylesheet, update): + def __init__(self, obj: QObject, + stylesheet: typing.Optional[str], + update: bool) -> None: super().__init__() self._obj = obj self._update = update @@ -599,11 +653,11 @@ class StyleSheetObserver(QObject): if self._update: self.setParent(self._obj) if stylesheet is None: - self._stylesheet = obj.STYLESHEET + self._stylesheet = obj.STYLESHEET # type: str else: self._stylesheet = stylesheet - def _get_stylesheet(self): + def _get_stylesheet(self) -> str: """Format a stylesheet based on a template. Return: @@ -612,19 +666,15 @@ class StyleSheetObserver(QObject): return _render_stylesheet(self._stylesheet) @pyqtSlot() - def _update_stylesheet(self): + def _update_stylesheet(self) -> None: """Update the stylesheet for obj.""" self._obj.setStyleSheet(self._get_stylesheet()) - def register(self): - """Do a first update and listen for more. - - Args: - update: if False, don't listen for future updates. - """ + def register(self) -> None: + """Do a first update and listen for more.""" qss = self._get_stylesheet() - log.config.vdebug("stylesheet for {}: {}".format( - self._obj.__class__.__name__, qss)) + log.config.vdebug( # type: ignore + "stylesheet for {}: {}".format(self._obj.__class__.__name__, qss)) self._obj.setStyleSheet(qss) if self._update: instance.changed.connect(self._update_stylesheet) diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index 574bc06af..0ee77fcc9 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -19,6 +19,7 @@ """Commands related to the configuration.""" +import typing import os.path import contextlib @@ -31,24 +32,34 @@ from qutebrowser.config import configtypes, configexc, configfiles, configdata from qutebrowser.misc import editor from qutebrowser.keyinput import keyutils +MYPY = False +if MYPY: # pragma: no cover + # pylint: disable=unused-import,useless-suppression + from qutebrowser.config.config import Config, KeyConfig + class ConfigCommands: """qutebrowser commands related to the configuration.""" - def __init__(self, config, keyconfig): + def __init__(self, + config: 'Config', + keyconfig: 'KeyConfig') -> None: self._config = config self._keyconfig = keyconfig @contextlib.contextmanager - def _handle_config_error(self): + def _handle_config_error(self) -> typing.Iterator[None]: """Catch errors in set_command and raise CommandError.""" try: yield except configexc.Error as e: raise cmdutils.CommandError(str(e)) - def _parse_pattern(self, pattern): + def _parse_pattern( + self, + pattern: typing.Optional[str] + ) -> typing.Optional[urlmatch.UrlPattern]: """Parse a pattern string argument to a pattern.""" if pattern is None: return None @@ -59,14 +70,15 @@ class ConfigCommands: raise cmdutils.CommandError("Error while parsing {}: {}" .format(pattern, str(e))) - def _parse_key(self, key): + def _parse_key(self, key: str) -> keyutils.KeySequence: """Parse a key argument.""" try: return keyutils.KeySequence.parse(key) except keyutils.KeyParseError as e: raise cmdutils.CommandError(str(e)) - def _print_value(self, option, pattern): + def _print_value(self, option: str, + pattern: typing.Optional[urlmatch.UrlPattern]) -> None: """Print the value of the given option.""" with self._handle_config_error(): value = self._config.get_str(option, pattern=pattern) @@ -81,8 +93,9 @@ class ConfigCommands: @cmdutils.argument('value', completion=configmodel.value) @cmdutils.argument('win_id', value=cmdutils.Value.win_id) @cmdutils.argument('pattern', flag='u') - def set(self, win_id, option=None, value=None, temp=False, print_=False, - *, pattern=None): + def set(self, win_id: int, option: str = None, value: str = None, + temp: bool = False, print_: bool = False, + *, pattern: str = None) -> None: """Set an option. If the option name ends with '?' or no value is provided, the @@ -108,28 +121,28 @@ class ConfigCommands: raise cmdutils.CommandError("Toggling values was moved to the " ":config-cycle command") - pattern = self._parse_pattern(pattern) + parsed_pattern = self._parse_pattern(pattern) if option.endswith('?') and option != '?': - self._print_value(option[:-1], pattern=pattern) + self._print_value(option[:-1], pattern=parsed_pattern) return with self._handle_config_error(): if value is None: - self._print_value(option, pattern=pattern) + self._print_value(option, pattern=parsed_pattern) else: - self._config.set_str(option, value, pattern=pattern, + self._config.set_str(option, value, pattern=parsed_pattern, save_yaml=not temp) if print_: - self._print_value(option, pattern=pattern) + self._print_value(option, pattern=parsed_pattern) @cmdutils.register(instance='config-commands', maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.argument('command', completion=configmodel.bind) @cmdutils.argument('win_id', value=cmdutils.Value.win_id) - def bind(self, win_id, key=None, command=None, *, mode='normal', - default=False): + def bind(self, win_id: str, key: str = None, command: str = None, *, + mode: str = 'normal', default: bool = False) -> None: """Bind a key to a command. If no command is given, show the current binding for the given key. @@ -174,7 +187,7 @@ class ConfigCommands: self._keyconfig.bind(seq, command, mode=mode, save_yaml=True) @cmdutils.register(instance='config-commands') - def unbind(self, key, *, mode='normal'): + def unbind(self, key: str, *, mode: str = 'normal') -> None: """Unbind a keychain. Args: @@ -191,8 +204,9 @@ class ConfigCommands: @cmdutils.argument('option', completion=configmodel.option) @cmdutils.argument('values', completion=configmodel.value) @cmdutils.argument('pattern', flag='u') - def config_cycle(self, option, *values, pattern=None, temp=False, - print_=False): + def config_cycle(self, option: str, *values: str, + pattern: str = None, + temp: bool = False, print_: bool = False) -> None: """Cycle an option between multiple values. Args: @@ -202,15 +216,15 @@ class ConfigCommands: temp: Set value temporarily until qutebrowser is closed. print_: Print the value after setting. """ - pattern = self._parse_pattern(pattern) + parsed_pattern = self._parse_pattern(pattern) with self._handle_config_error(): opt = self._config.get_opt(option) - old_value = self._config.get_obj_for_pattern(option, - pattern=pattern) + old_value = self._config.get_obj_for_pattern( + option, pattern=parsed_pattern) if not values and isinstance(opt.typ, configtypes.Bool): - values = ['true', 'false'] + values = ('true', 'false') if len(values) < 2: raise cmdutils.CommandError("Need at least two values for " @@ -219,25 +233,25 @@ class ConfigCommands: # Use the next valid value from values, or the first if the current # value does not appear in the list with self._handle_config_error(): - values = [opt.typ.from_str(val) for val in values] + cycle_values = [opt.typ.from_str(val) for val in values] try: - idx = values.index(old_value) - idx = (idx + 1) % len(values) - value = values[idx] + idx = cycle_values.index(old_value) + idx = (idx + 1) % len(cycle_values) + value = cycle_values[idx] except ValueError: - value = values[0] + value = cycle_values[0] with self._handle_config_error(): - self._config.set_obj(option, value, pattern=pattern, + self._config.set_obj(option, value, pattern=parsed_pattern, save_yaml=not temp) if print_: - self._print_value(option, pattern=pattern) + self._print_value(option, pattern=parsed_pattern) @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.customized_option) - def config_unset(self, option, temp=False): + def config_unset(self, option: str, temp: bool = False) -> None: """Unset an option. This sets an option back to its default and removes it from @@ -252,7 +266,8 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.list_option) - def config_list_add(self, option, value, temp=False): + def config_list_add(self, option: str, value: str, + temp: bool = False) -> None: """Append a value to a config option that is a list. Args: @@ -273,7 +288,8 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.dict_option) - def config_dict_add(self, option, key, value, temp=False, replace=False): + def config_dict_add(self, option: str, key: str, value: str, + temp: bool = False, replace: bool = False) -> None: """Add a key/value pair to a dictionary option. Args: @@ -302,7 +318,8 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.list_option) - def config_list_remove(self, option, value, temp=False): + def config_list_remove(self, option: str, value: str, + temp: bool = False) -> None: """Remove a value from a list. Args: @@ -329,7 +346,8 @@ class ConfigCommands: @cmdutils.register(instance='config-commands') @cmdutils.argument('option', completion=configmodel.dict_option) - def config_dict_remove(self, option, key, temp=False): + def config_dict_remove(self, option: str, key: str, + temp: bool = False) -> None: """Remove a key from a dict. Args: @@ -354,7 +372,7 @@ class ConfigCommands: self._config.update_mutables(save_yaml=not temp) @cmdutils.register(instance='config-commands') - def config_clear(self, save=False): + def config_clear(self, save: bool = False) -> None: """Set all settings back to their default. Args: @@ -364,7 +382,7 @@ class ConfigCommands: self._config.clear(save_yaml=save) @cmdutils.register(instance='config-commands') - def config_source(self, filename=None, clear=False): + def config_source(self, filename: str = None, clear: bool = False) -> None: """Read a config.py file. Args: @@ -386,13 +404,13 @@ class ConfigCommands: raise cmdutils.CommandError(e) @cmdutils.register(instance='config-commands') - def config_edit(self, no_source=False): + def config_edit(self, no_source: bool = False) -> None: """Open the config.py file in the editor. Args: no_source: Don't re-source the config file after editing. """ - def on_file_updated(): + def on_file_updated() -> None: """Source the new config when editing finished. This can't use cmdutils.CommandError as it's run async. @@ -410,7 +428,8 @@ class ConfigCommands: ed.edit_file(filename) @cmdutils.register(instance='config-commands') - def config_write_py(self, filename=None, force=False, defaults=False): + def config_write_py(self, filename: str = None, + force: bool = False, defaults: bool = False) -> None: """Write the current configuration to a config.py file. Args: @@ -429,13 +448,13 @@ class ConfigCommands: raise cmdutils.CommandError("{} already exists - use --force to " "overwrite!".format(filename)) + options = [] # type: typing.List if defaults: options = [(None, opt, opt.default) for _name, opt in sorted(configdata.DATA.items())] bindings = dict(configdata.DATA['bindings.default'].default) commented = True else: - options = [] for values in self._config: for scoped in values: options.append((scoped.pattern, values.opt, scoped.value)) diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index dace0772a..c93032387 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -24,14 +24,18 @@ Module attributes: DATA: A dict of Option objects after init() has been called. """ +import typing +from typing import Optional # pylint: disable=unused-import import functools import attr from qutebrowser.config import configtypes from qutebrowser.utils import usertypes, qtutils, utils -DATA = None -MIGRATIONS = None +DATA = typing.cast(typing.Mapping[str, 'Option'], None) +MIGRATIONS = typing.cast('Migrations', None) + +_BackendDict = typing.Mapping[str, typing.Union[str, bool]] @attr.s @@ -42,15 +46,15 @@ class Option: Note that this is just an option which exists, with no value associated. """ - name = attr.ib() - typ = attr.ib() - default = attr.ib() - backends = attr.ib() - raw_backends = attr.ib() - description = attr.ib() - supports_pattern = attr.ib(default=False) - restart = attr.ib(default=False) - no_autoconfig = attr.ib(default=False) + name = attr.ib() # type: str + typ = attr.ib() # type: configtypes.BaseType + default = attr.ib() # type: typing.Any + backends = attr.ib() # type: typing.Iterable[usertypes.Backend] + raw_backends = attr.ib() # type: Optional[typing.Mapping[str, bool]] + description = attr.ib() # type: str + supports_pattern = attr.ib(default=False) # type: bool + restart = attr.ib(default=False) # type: bool + no_autoconfig = attr.ib(default=False) # type: bool @attr.s @@ -63,11 +67,13 @@ class Migrations: deleted: A list of option names which have been removed. """ - renamed = attr.ib(default=attr.Factory(dict)) - deleted = attr.ib(default=attr.Factory(list)) + renamed = attr.ib( + default=attr.Factory(dict)) # type: typing.Dict[str, str] + deleted = attr.ib( + default=attr.Factory(list)) # type: typing.List[str] -def _raise_invalid_node(name, what, node): +def _raise_invalid_node(name: str, what: str, node: typing.Any) -> None: """Raise an exception for an invalid configdata YAML node. Args: @@ -79,13 +85,16 @@ def _raise_invalid_node(name, what, node): name, what, node)) -def _parse_yaml_type(name, node): +def _parse_yaml_type( + name: str, + node: typing.Union[str, typing.Mapping[str, typing.Any]], +) -> configtypes.BaseType: if isinstance(node, str): # e.g: # type: Bool # -> create the type object without any arguments type_name = node - kwargs = {} + kwargs = {} # type: typing.MutableMapping[str, typing.Any] elif isinstance(node, dict): # e.g: # type: @@ -123,7 +132,10 @@ def _parse_yaml_type(name, node): type_name, node, e)) -def _parse_yaml_backends_dict(name, node): +def _parse_yaml_backends_dict( + name: str, + node: _BackendDict, +) -> typing.Sequence[usertypes.Backend]: """Parse a dict definition for backends. Example: @@ -160,7 +172,10 @@ def _parse_yaml_backends_dict(name, node): return backends -def _parse_yaml_backends(name, node): +def _parse_yaml_backends( + name: str, + node: typing.Union[None, str, _BackendDict], +) -> typing.Sequence[usertypes.Backend]: """Parse a backend node in the yaml. It can have one of those four forms: @@ -187,7 +202,9 @@ def _parse_yaml_backends(name, node): raise utils.Unreachable -def _read_yaml(yaml_data): +def _read_yaml( + yaml_data: str, +) -> typing.Tuple[typing.Mapping[str, Option], Migrations]: """Read config data from a YAML file. Args: @@ -249,12 +266,12 @@ def _read_yaml(yaml_data): @functools.lru_cache(maxsize=256) -def is_valid_prefix(prefix): +def is_valid_prefix(prefix: str) -> bool: """Check whether the given prefix is a valid prefix for some option.""" return any(key.startswith(prefix + '.') for key in DATA) -def init(): +def init() -> None: """Initialize configdata from the YAML file.""" global DATA, MIGRATIONS DATA, MIGRATIONS = _read_yaml(utils.read_file('config/configdata.yml')) diff --git a/qutebrowser/config/configdiff.py b/qutebrowser/config/configdiff.py index 9f8b70a26..ba78f64b4 100644 --- a/qutebrowser/config/configdiff.py +++ b/qutebrowser/config/configdiff.py @@ -19,6 +19,7 @@ """Code to show a diff of the legacy config format.""" +import typing # pylint: disable=unused-import,useless-suppression import difflib import os.path @@ -727,10 +728,10 @@ scroll right """ -def get_diff(): +def get_diff() -> str: """Get a HTML diff for the old config files.""" - old_conf_lines = [] - old_key_lines = [] + old_conf_lines = [] # type: typing.MutableSequence[str] + old_key_lines = [] # type: typing.MutableSequence[str] for filename, dest in [('qutebrowser.conf', old_conf_lines), ('keys.conf', old_key_lines)]: diff --git a/qutebrowser/config/configexc.py b/qutebrowser/config/configexc.py index 051ed971a..b1dc04e09 100644 --- a/qutebrowser/config/configexc.py +++ b/qutebrowser/config/configexc.py @@ -19,9 +19,10 @@ """Exceptions related to config parsing.""" +import typing import attr -from qutebrowser.utils import jinja +from qutebrowser.utils import jinja, usertypes class Error(Exception): @@ -33,7 +34,7 @@ class NoAutoconfigError(Error): """Raised when this option can't be set in autoconfig.yml.""" - def __init__(self, name): + def __init__(self, name: str) -> None: super().__init__("The {} setting can only be set in config.py!" .format(name)) @@ -42,7 +43,11 @@ class BackendError(Error): """Raised when this setting is unavailable with the current backend.""" - def __init__(self, name, backend, raw_backends): + def __init__( + self, name: str, + backend: usertypes.Backend, + raw_backends: typing.Optional[typing.Mapping[str, bool]] + ) -> None: if raw_backends is None or not raw_backends[backend.name]: msg = ("The {} setting is not available with the {} backend!" .format(name, backend.name)) @@ -57,7 +62,7 @@ class NoPatternError(Error): """Raised when the given setting does not support URL patterns.""" - def __init__(self, name): + def __init__(self, name: str) -> None: super().__init__("The {} setting does not support URL patterns!" .format(name)) @@ -71,7 +76,7 @@ class ValidationError(Error): msg: Additional error message. """ - def __init__(self, value, msg): + def __init__(self, value: typing.Any, msg: str) -> None: super().__init__("Invalid value '{}' - {}".format(value, msg)) self.option = None @@ -85,7 +90,9 @@ class NoOptionError(Error): """Raised when an option was not found.""" - def __init__(self, option, *, deleted=False, renamed=None): + def __init__(self, option: str, *, + deleted: bool = False, + renamed: str = None) -> None: if deleted: assert renamed is None suffix = ' (this option was removed from qutebrowser)' @@ -109,18 +116,18 @@ class ConfigErrorDesc: traceback: The formatted traceback of the exception. """ - text = attr.ib() - exception = attr.ib() - traceback = attr.ib(None) + text = attr.ib() # type: str + exception = attr.ib() # type: typing.Union[str, Exception] + traceback = attr.ib(None) # type: str - def __str__(self): + def __str__(self) -> str: if self.traceback: return '{} - {}: {}'.format(self.text, self.exception.__class__.__name__, self.exception) return '{}: {}'.format(self.text, self.exception) - def with_text(self, text): + def with_text(self, text: str) -> 'ConfigErrorDesc': """Get a new ConfigErrorDesc with the given text appended.""" return self.__class__(text='{} ({})'.format(self.text, text), exception=self.exception, @@ -131,13 +138,15 @@ class ConfigFileErrors(Error): """Raised when multiple errors occurred inside the config.""" - def __init__(self, basename, errors): + def __init__(self, + basename: str, + errors: typing.Sequence[ConfigErrorDesc]) -> None: super().__init__("Errors occurred while reading {}:\n{}".format( basename, '\n'.join(' {}'.format(e) for e in errors))) self.basename = basename self.errors = errors - def to_html(self): + def to_html(self) -> str: """Get the error texts as a HTML snippet.""" template = jinja.environment.from_string(""" Errors occurred while reading {{ basename }}: diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index b4c8ea4ec..54ca91488 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -27,6 +27,7 @@ import textwrap import traceback import configparser import contextlib +import typing import yaml from PyQt5.QtCore import pyqtSignal, QObject, QSettings @@ -36,16 +37,21 @@ from qutebrowser.config import configexc, config, configdata, configutils from qutebrowser.keyinput import keyutils from qutebrowser.utils import standarddir, utils, qtutils, log, urlmatch +MYPY = False +if MYPY: + # pylint: disable=unused-import, useless-suppression + from qutebrowser.misc import savemanager + # The StateConfig instance -state = None +state = typing.cast('StateConfig', None) class StateConfig(configparser.ConfigParser): """The "state" file saving various application state.""" - def __init__(self): + def __init__(self) -> None: super().__init__() self._filename = os.path.join(standarddir.data(), 'state') self.read(self._filename, encoding='utf-8') @@ -59,7 +65,8 @@ class StateConfig(configparser.ConfigParser): for key in deleted_keys: self['general'].pop(key, None) - def init_save_manager(self, save_manager): + def init_save_manager(self, + save_manager: 'savemanager.SaveManager') -> None: """Make sure the config gets saved properly. We do this outside of __init__ because the config gets created before @@ -67,7 +74,7 @@ class StateConfig(configparser.ConfigParser): """ save_manager.add_saveable('state-config', self._save) - def _save(self): + def _save(self) -> None: """Save the state file to the configured location.""" with open(self._filename, 'w', encoding='utf-8') as f: self.write(f) @@ -84,17 +91,20 @@ class YamlConfig(QObject): VERSION = 2 changed = pyqtSignal() - def __init__(self, parent=None): + _SettingsType = typing.Dict[str, typing.Dict[str, typing.Any]] + + def __init__(self, parent: QObject = None) -> None: super().__init__(parent) self._filename = os.path.join(standarddir.config(auto=True), 'autoconfig.yml') - self._dirty = None + self._dirty = False - self._values = {} + self._values = {} # type: typing.Dict[str, configutils.Values] for name, opt in configdata.DATA.items(): self._values[name] = configutils.Values(opt) - def init_save_manager(self, save_manager): + def init_save_manager(self, + save_manager: 'savemanager.SaveManager') -> None: """Make sure the config gets saved properly. We do this outside of __init__ because the config gets created before @@ -102,21 +112,21 @@ class YamlConfig(QObject): """ save_manager.add_saveable('yaml-config', self._save, self.changed) - def __iter__(self): + def __iter__(self) -> typing.Iterator[configutils.Values]: """Iterate over configutils.Values items.""" yield from self._values.values() - def _mark_changed(self): + def _mark_changed(self) -> None: """Mark the YAML config as changed.""" self._dirty = True self.changed.emit() - def _save(self): + def _save(self) -> None: """Save the settings to the YAML file if they've changed.""" if not self._dirty: return - settings = {} + settings = {} # type: YamlConfig._SettingsType for name, values in sorted(self._values.items()): if not values: continue @@ -135,7 +145,10 @@ class YamlConfig(QObject): """.lstrip('\n'))) utils.yaml_dump(data, f) - def _pop_object(self, yaml_data, key, typ): + def _pop_object(self, + yaml_data: typing.Any, + key: str, + typ: type) -> typing.Any: """Get a global object from the given data.""" if not isinstance(yaml_data, dict): desc = configexc.ConfigErrorDesc("While loading data", @@ -158,7 +171,7 @@ class YamlConfig(QObject): return data - def load(self): + def load(self) -> None: """Load configuration from the configured YAML file.""" try: with open(self._filename, 'r', encoding='utf-8') as f: @@ -189,18 +202,19 @@ class YamlConfig(QObject): self._validate(settings) self._build_values(settings) - def _load_settings_object(self, yaml_data): + def _load_settings_object(self, yaml_data: typing.Any) -> '_SettingsType': """Load the settings from the settings: key.""" return self._pop_object(yaml_data, 'settings', dict) - def _load_legacy_settings_object(self, yaml_data): + def _load_legacy_settings_object(self, + yaml_data: typing.Any) -> '_SettingsType': data = self._pop_object(yaml_data, 'global', dict) settings = {} for name, value in data.items(): settings[name] = {'global': value} return settings - def _build_values(self, settings): + def _build_values(self, settings: typing.Mapping) -> None: """Build up self._values from the values in the given dict.""" errors = [] for name, yaml_values in settings.items(): @@ -233,7 +247,8 @@ class YamlConfig(QObject): if errors: raise configexc.ConfigFileErrors('autoconfig.yml', errors) - def _migrate_bool(self, settings, name, true_value, false_value): + def _migrate_bool(self, settings: _SettingsType, name: str, + true_value: str, false_value: str) -> None: """Migrate a boolean in the settings.""" if name in settings: for scope, val in settings[name].items(): @@ -241,7 +256,7 @@ class YamlConfig(QObject): settings[name][scope] = true_value if val else false_value self._mark_changed() - def _handle_migrations(self, settings): + def _handle_migrations(self, settings: _SettingsType) -> '_SettingsType': """Migrate older configs to the newest format.""" # Simple renamed/deleted options for name in list(settings): @@ -299,7 +314,7 @@ class YamlConfig(QObject): return settings - def _validate(self, settings): + def _validate(self, settings: _SettingsType) -> None: """Make sure all settings exist.""" unknown = [] for name in settings: @@ -312,18 +327,19 @@ class YamlConfig(QObject): for e in sorted(unknown)] raise configexc.ConfigFileErrors('autoconfig.yml', errors) - def set_obj(self, name, value, *, pattern=None): + def set_obj(self, name: str, value: typing.Any, *, + pattern: urlmatch.UrlPattern = None) -> None: """Set the given setting to the given value.""" self._values[name].add(value, pattern) self._mark_changed() - def unset(self, name, *, pattern=None): + def unset(self, name: str, *, pattern: urlmatch.UrlPattern = None) -> None: """Remove the given option name if it's configured.""" changed = self._values[name].remove(pattern) if changed: self._mark_changed() - def clear(self): + def clear(self) -> None: """Clear all values from the YAML file.""" for values in self._values.values(): values.clear() @@ -346,15 +362,15 @@ class ConfigAPI: datadir: The qutebrowser data directory, as pathlib.Path. """ - def __init__(self, conf, keyconfig): + def __init__(self, conf: config.Config, keyconfig: config.KeyConfig): self._config = conf self._keyconfig = keyconfig - self.errors = [] + self.errors = [] # type: typing.List[configexc.ConfigErrorDesc] self.configdir = pathlib.Path(standarddir.config()) self.datadir = pathlib.Path(standarddir.data()) @contextlib.contextmanager - def _handle_error(self, action, name): + def _handle_error(self, action: str, name: str) -> typing.Iterator[None]: """Catch config-related exceptions and save them in self.errors.""" try: yield @@ -372,40 +388,40 @@ class ConfigAPI: text = "While {} '{}' and parsing key".format(action, name) self.errors.append(configexc.ConfigErrorDesc(text, e)) - def finalize(self): + def finalize(self) -> None: """Do work which needs to be done after reading config.py.""" self._config.update_mutables() - def load_autoconfig(self): + def load_autoconfig(self) -> None: """Load the autoconfig.yml file which is used for :set/:bind/etc.""" with self._handle_error('reading', 'autoconfig.yml'): read_autoconfig() - def get(self, name, pattern=None): + def get(self, name: str, pattern: str = None) -> typing.Any: """Get a setting value from the config, optionally with a pattern.""" with self._handle_error('getting', name): urlpattern = urlmatch.UrlPattern(pattern) if pattern else None return self._config.get_mutable_obj(name, pattern=urlpattern) - def set(self, name, value, pattern=None): + def set(self, name: str, value: typing.Any, pattern: str = None) -> None: """Set a setting value in the config, optionally with a pattern.""" with self._handle_error('setting', name): urlpattern = urlmatch.UrlPattern(pattern) if pattern else None self._config.set_obj(name, value, pattern=urlpattern) - def bind(self, key, command, mode='normal'): + def bind(self, key: str, command: str, mode: str = 'normal') -> None: """Bind a key to a command, with an optional key mode.""" with self._handle_error('binding', key): seq = keyutils.KeySequence.parse(key) self._keyconfig.bind(seq, command, mode=mode) - def unbind(self, key, mode='normal'): + def unbind(self, key: str, mode: str = 'normal') -> None: """Unbind a key from a command, with an optional key mode.""" with self._handle_error('unbinding', key): seq = keyutils.KeySequence.parse(key) self._keyconfig.unbind(seq, mode=mode) - def source(self, filename): + def source(self, filename: str) -> None: """Read the given config file from disk.""" if not os.path.isabs(filename): filename = str(self.configdir / filename) @@ -416,7 +432,7 @@ class ConfigAPI: self.errors += e.errors @contextlib.contextmanager - def pattern(self, pattern): + def pattern(self, pattern: str) -> typing.Iterator[config.ConfigContainer]: """Get a ConfigContainer for the given pattern.""" # We need to propagate the exception so we don't need to return # something. @@ -430,17 +446,21 @@ class ConfigPyWriter: """Writer for config.py files from given settings.""" - def __init__(self, options, bindings, *, commented): + def __init__( + self, + options: typing.List, + bindings: typing.MutableMapping[str, typing.Mapping[str, str]], *, + commented: bool) -> None: self._options = options self._bindings = bindings self._commented = commented - def write(self, filename): + def write(self, filename: str) -> None: """Write the config to the given file.""" with open(filename, 'w', encoding='utf-8') as f: f.write('\n'.join(self._gen_lines())) - def _line(self, line): + def _line(self, line: str) -> str: """Get an (optionally commented) line.""" if self._commented: if line.startswith('#'): @@ -450,7 +470,7 @@ class ConfigPyWriter: else: return line - def _gen_lines(self): + def _gen_lines(self) -> typing.Iterator[str]: """Generate a config.py with the given settings/bindings. Yields individual lines. @@ -459,7 +479,7 @@ class ConfigPyWriter: yield from self._gen_options() yield from self._gen_bindings() - def _gen_header(self): + def _gen_header(self) -> typing.Iterator[str]: """Generate the initial header of the config.""" yield self._line("# Autogenerated config.py") yield self._line("# Documentation:") @@ -481,7 +501,7 @@ class ConfigPyWriter: yield self._line("# config.load_autoconfig()") yield '' - def _gen_options(self): + def _gen_options(self) -> typing.Iterator[str]: """Generate the options part of the config.""" for pattern, opt, value in self._options: if opt.name in ['bindings.commands', 'bindings.default']: @@ -509,7 +529,7 @@ class ConfigPyWriter: opt.name, value, str(pattern))) yield '' - def _gen_bindings(self): + def _gen_bindings(self) -> typing.Iterator[str]: """Generate the bindings part of the config.""" normal_bindings = self._bindings.pop('normal', {}) if normal_bindings: @@ -527,7 +547,7 @@ class ConfigPyWriter: yield '' -def read_config_py(filename, raising=False): +def read_config_py(filename: str, raising: bool = False) -> None: """Read a config.py file. Arguments; @@ -543,8 +563,8 @@ def read_config_py(filename, raising=False): basename = os.path.basename(filename) module = types.ModuleType('config') - module.config = api - module.c = container + module.config = api # type: ignore + module.c = container # type: ignore module.__file__ = filename try: @@ -589,7 +609,7 @@ def read_config_py(filename, raising=False): raise configexc.ConfigFileErrors('config.py', api.errors) -def read_autoconfig(): +def read_autoconfig() -> None: """Read the autoconfig.yml file.""" try: config.instance.read_yaml() @@ -601,7 +621,7 @@ def read_autoconfig(): @contextlib.contextmanager -def saved_sys_properties(): +def saved_sys_properties() -> typing.Iterator[None]: """Save various sys properties such as sys.path and sys.modules.""" old_path = sys.path.copy() old_modules = sys.modules.copy() @@ -614,7 +634,7 @@ def saved_sys_properties(): del sys.modules[module] -def init(): +def init() -> None: """Initialize config storage not related to the main config.""" global state state = StateConfig() diff --git a/qutebrowser/config/configinit.py b/qutebrowser/config/configinit.py index de9651064..ff0fd0e41 100644 --- a/qutebrowser/config/configinit.py +++ b/qutebrowser/config/configinit.py @@ -19,8 +19,10 @@ """Initialization of the configuration.""" +import argparse import os.path import sys +import typing from PyQt5.QtWidgets import QMessageBox @@ -30,14 +32,14 @@ from qutebrowser.config import (config, configdata, configfiles, configtypes, from qutebrowser.utils import (objreg, usertypes, log, standarddir, message, qtutils) from qutebrowser.config import configcache -from qutebrowser.misc import msgbox, objects +from qutebrowser.misc import msgbox, objects, savemanager # Error which happened during init, so we can show a message box. _init_errors = None -def early_init(args): +def early_init(args: argparse.Namespace) -> None: """Initialize the part of the config which works without a QApplication.""" configdata.init() @@ -85,7 +87,7 @@ def early_init(args): _init_envvars() -def _init_envvars(): +def _init_envvars() -> None: """Initialize environment variables which need to be set early.""" if objects.backend == usertypes.Backend.QtWebEngine: software_rendering = config.val.qt.force_software_rendering @@ -107,7 +109,7 @@ def _init_envvars(): @config.change_filter('fonts.monospace', function=True) -def _update_monospace_fonts(): +def _update_monospace_fonts() -> None: """Update all fonts if fonts.monospace was set.""" configtypes.Font.monospace_fonts = config.val.fonts.monospace for name, opt in configdata.DATA.items(): @@ -123,7 +125,7 @@ def _update_monospace_fonts(): config.instance.changed.emit(name) -def get_backend(args): +def get_backend(args: argparse.Namespace) -> usertypes.Backend: """Find out what backend to use based on available libraries.""" str_to_backend = { 'webkit': usertypes.Backend.QtWebKit, @@ -136,7 +138,7 @@ def get_backend(args): return str_to_backend[config.val.backend] -def late_init(save_manager): +def late_init(save_manager: savemanager.SaveManager) -> None: """Initialize the rest of the config after the QApplication is created.""" global _init_errors if _init_errors is not None: @@ -152,7 +154,7 @@ def late_init(save_manager): configfiles.state.init_save_manager(save_manager) -def qt_args(namespace): +def qt_args(namespace: argparse.Namespace) -> typing.List[str]: """Get the Qt QApplication arguments based on an argparse namespace. Args: @@ -178,7 +180,7 @@ def qt_args(namespace): return argv -def _qtwebengine_args(): +def _qtwebengine_args() -> typing.Iterator[str]: """Get the QtWebEngine arguments to use based on the config.""" if not qtutils.version_check('5.11', compiled=False): # WORKAROUND equivalent to @@ -224,7 +226,7 @@ def _qtwebengine_args(): 'never': '--no-referrers', 'same-domain': '--reduced-referrer-granularity', } - } + } # type: typing.Dict[str, typing.Dict[typing.Any, typing.Optional[str]]] if not qtutils.version_check('5.11'): # On Qt 5.11, we can control this via QWebEngineSettings diff --git a/qutebrowser/config/configutils.py b/qutebrowser/config/configutils.py index 96fc0f02d..9d4dc94ef 100644 --- a/qutebrowser/config/configutils.py +++ b/qutebrowser/config/configutils.py @@ -21,11 +21,19 @@ """Utilities and data structures used by various config code.""" -import attr +import typing -from qutebrowser.utils import utils +import attr +from PyQt5.QtCore import QUrl + +from qutebrowser.utils import utils, urlmatch from qutebrowser.config import configexc +MYPY = False +if MYPY: # pragma: no cover + # pylint: disable=unused-import,useless-suppression + from qutebrowser.config import configdata + class _UnsetObject: @@ -33,7 +41,7 @@ class _UnsetObject: __slots__ = () - def __repr__(self): + def __repr__(self) -> str: return '' @@ -50,8 +58,8 @@ class ScopedValue: pattern: The UrlPattern for the value, or None for global values. """ - value = attr.ib() - pattern = attr.ib() + value = attr.ib() # type: typing.Any + pattern = attr.ib() # type: typing.Optional[urlmatch.UrlPattern] class Values: @@ -73,15 +81,17 @@ class Values: opt: The Option being customized. """ - def __init__(self, opt, values=None): + def __init__(self, + opt: 'configdata.Option', + values: typing.MutableSequence = None) -> None: self.opt = opt self._values = values or [] - def __repr__(self): + def __repr__(self) -> str: return utils.get_repr(self, opt=self.opt, values=self._values, constructor=True) - def __str__(self): + def __str__(self) -> str: """Get the values as human-readable string.""" if not self: return '{}: '.format(self.opt.name) @@ -96,7 +106,7 @@ class Values: scoped.pattern, self.opt.name, str_value)) return '\n'.join(lines) - def __iter__(self): + def __iter__(self) -> typing.Iterator['ScopedValue']: """Yield ScopedValue elements. This yields in "normal" order, i.e. global and then first-set settings @@ -104,23 +114,25 @@ class Values: """ yield from self._values - def __bool__(self): + def __bool__(self) -> bool: """Check whether this value is customized.""" return bool(self._values) - def _check_pattern_support(self, arg): + def _check_pattern_support( + self, arg: typing.Optional[urlmatch.UrlPattern]) -> None: """Make sure patterns are supported if one was given.""" if arg is not None and not self.opt.supports_pattern: raise configexc.NoPatternError(self.opt.name) - def add(self, value, pattern=None): + def add(self, value: typing.Any, + pattern: urlmatch.UrlPattern = None) -> None: """Add a value with the given pattern to the list of values.""" self._check_pattern_support(pattern) self.remove(pattern) scoped = ScopedValue(value, pattern) self._values.append(scoped) - def remove(self, pattern=None): + def remove(self, pattern: urlmatch.UrlPattern = None) -> bool: """Remove the value with the given pattern. If a matching pattern was removed, True is returned. @@ -131,11 +143,11 @@ class Values: self._values = [v for v in self._values if v.pattern != pattern] return old_len != len(self._values) - def clear(self): + def clear(self) -> None: """Clear all customization for this value.""" self._values = [] - def _get_fallback(self, fallback): + def _get_fallback(self, fallback: typing.Any) -> typing.Any: """Get the fallback global/default value.""" for scoped in self._values: if scoped.pattern is None: @@ -146,7 +158,8 @@ class Values: else: return UNSET - def get_for_url(self, url=None, *, fallback=True): + def get_for_url(self, url: QUrl = None, *, + fallback: bool = True) -> typing.Any: """Get a config value, falling back when needed. This first tries to find a value matching the URL (if given). @@ -165,7 +178,9 @@ class Values: return self._get_fallback(fallback) - def get_for_pattern(self, pattern, *, fallback=True): + def get_for_pattern(self, + pattern: typing.Optional[urlmatch.UrlPattern], *, + fallback: bool = True) -> typing.Any: """Get a value only if it's been overridden for the given pattern. This is useful when showing values to the user. From 71f9c5d2061093535f10b1ffa0619a5b1e8131ff Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 3 Dec 2018 15:48:52 +0100 Subject: [PATCH 266/492] Fix handling of annotated varargs in commands When we have something like "*values: str" in :config-cycle, we get a list of values, but the type converter assumes it's a string. We could implement proper conversion of *args, but for now, let's just make sure it's always a string. --- qutebrowser/commands/command.py | 13 +++++++++---- tests/unit/api/test_cmdutils.py | 9 +++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 8d2f5ad57..9883447a8 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -333,13 +333,18 @@ class Command: param: The inspect.Parameter to look at. """ arginfo = self.get_arg_info(param) - if param.annotation is not inspect.Parameter.empty: + if arginfo.value: + # Filled values are passed 1:1 + return None + elif param.kind in [inspect.Parameter.VAR_POSITIONAL, + inspect.Parameter.VAR_KEYWORD]: + # For *args/**kwargs we only support strings + assert param.annotation in [inspect.Parameter.empty, str], param + return None + elif param.annotation is not inspect.Parameter.empty: return param.annotation elif param.default not in [None, inspect.Parameter.empty]: return type(param.default) - elif arginfo.value or param.kind in [inspect.Parameter.VAR_POSITIONAL, - inspect.Parameter.VAR_KEYWORD]: - return None else: return str diff --git a/tests/unit/api/test_cmdutils.py b/tests/unit/api/test_cmdutils.py index 5e1389c80..9f01ea7bb 100644 --- a/tests/unit/api/test_cmdutils.py +++ b/tests/unit/api/test_cmdutils.py @@ -154,6 +154,15 @@ class TestRegister: args, kwargs = cmd._get_call_args(win_id=0) fun(*args, **kwargs) + def test_star_args_optional_annotated(self): + @cmdutils.register(star_args_optional=True) + def fun(*args: str): + """Blah.""" + + cmd = objects.commands['fun'] + cmd.namespace = cmd.parser.parse_args([]) + cmd._get_call_args(win_id=0) + @pytest.mark.parametrize('inp, expected', [ (['--arg'], True), (['-a'], True), ([], False)]) def test_flag(self, inp, expected): From 70284704c7efc4a0e787989e04fd0312f5cb717b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 3 Dec 2018 19:15:13 +0100 Subject: [PATCH 267/492] Update certifi from 2018.10.15 to 2018.11.29 --- misc/requirements/requirements-codecov.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-codecov.txt b/misc/requirements/requirements-codecov.txt index 2ab6e78f0..4ce97a976 100644 --- a/misc/requirements/requirements-codecov.txt +++ b/misc/requirements/requirements-codecov.txt @@ -1,6 +1,6 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py -certifi==2018.10.15 +certifi==2018.11.29 chardet==3.0.4 codecov==2.0.15 coverage==4.5.2 From 2a7a3de8fc40fe9adf36ecc1968b61d1b9c46caf Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 3 Dec 2018 19:15:15 +0100 Subject: [PATCH 268/492] Update certifi from 2018.10.15 to 2018.11.29 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 8329ae0dd..39e731984 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -2,7 +2,7 @@ asn1crypto==0.24.0 astroid==2.1.0 -certifi==2018.10.15 +certifi==2018.11.29 cffi==1.11.5 chardet==3.0.4 cryptography==2.4.2 From 953042d75d3b6c1ce09cdb3738405fe6ac6cb17c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 4 Dec 2018 07:28:28 +0100 Subject: [PATCH 269/492] mypy: Disable untyped decorators --- mypy.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypy.ini b/mypy.ini index be5424327..154a877bf 100644 --- a/mypy.ini +++ b/mypy.ini @@ -7,6 +7,7 @@ python_version = 3.6 warn_redundant_casts = True warn_unused_ignores = True disallow_subclassing_any = True +disallow_untyped_decorators = True ## https://github.com/python/mypy/issues/5957 # warn_unused_configs = True # disallow_untyped_calls = True @@ -14,7 +15,6 @@ disallow_subclassing_any = True ## https://github.com/python/mypy/issues/5954 # disallow_incomplete_defs = True # check_untyped_defs = True -# disallow_untyped_decorators = True # no_implicit_optional = True # warn_return_any = True From 268ad40982466e0985961318e0a6c2b4ae17423f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 4 Dec 2018 15:52:14 +0100 Subject: [PATCH 270/492] Add and enforce types for api.*/components.* --- mypy.ini | 8 +++++ qutebrowser/api/apitypes.py | 3 +- qutebrowser/components/caretcommands.py | 36 +++++++++---------- qutebrowser/components/misccommands.py | 44 +++++++++++++----------- qutebrowser/components/scrollcommands.py | 2 +- qutebrowser/components/zoomcommands.py | 23 +++++++------ 6 files changed, 65 insertions(+), 51 deletions(-) diff --git a/mypy.ini b/mypy.ini index 154a877bf..c61ca1f18 100644 --- a/mypy.ini +++ b/mypy.ini @@ -97,3 +97,11 @@ disallow_incomplete_defs = True [mypy-qutebrowser.config.configutils] disallow_untyped_defs = True disallow_incomplete_defs = True + +[mypy-qutebrowser.api.*] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.components.*] +disallow_untyped_defs = True +disallow_incomplete_defs = True diff --git a/qutebrowser/api/apitypes.py b/qutebrowser/api/apitypes.py index 2ed188724..9fec0a6cb 100644 --- a/qutebrowser/api/apitypes.py +++ b/qutebrowser/api/apitypes.py @@ -21,5 +21,6 @@ # pylint: disable=unused-import from qutebrowser.browser.browsertab import WebTabError, AbstractTab as Tab -from qutebrowser.browser.webelem import Error as WebElemError +from qutebrowser.browser.webelem import (Error as WebElemError, + AbstractWebElement as WebElement) from qutebrowser.utils.usertypes import ClickTarget, JsWorld diff --git a/qutebrowser/components/caretcommands.py b/qutebrowser/components/caretcommands.py index fe04f2483..4bab6b6c6 100644 --- a/qutebrowser/components/caretcommands.py +++ b/qutebrowser/components/caretcommands.py @@ -26,7 +26,7 @@ from qutebrowser.api import cmdutils, apitypes @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_next_line(tab: apitypes.Tab, count: int = 1): +def move_to_next_line(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the next line. Args: @@ -38,7 +38,7 @@ def move_to_next_line(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_prev_line(tab: apitypes.Tab, count: int = 1): +def move_to_prev_line(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the prev line. Args: @@ -50,7 +50,7 @@ def move_to_prev_line(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_next_char(tab: apitypes.Tab, count: int = 1): +def move_to_next_char(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the next char. Args: @@ -62,7 +62,7 @@ def move_to_next_char(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_prev_char(tab: apitypes.Tab, count: int = 1): +def move_to_prev_char(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the previous char. Args: @@ -74,7 +74,7 @@ def move_to_prev_char(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_end_of_word(tab: apitypes.Tab, count: int = 1): +def move_to_end_of_word(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the end of the word. Args: @@ -86,7 +86,7 @@ def move_to_end_of_word(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_next_word(tab: apitypes.Tab, count: int = 1): +def move_to_next_word(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the next word. Args: @@ -98,7 +98,7 @@ def move_to_next_word(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_prev_word(tab: apitypes.Tab, count: int = 1): +def move_to_prev_word(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the previous word. Args: @@ -109,14 +109,14 @@ def move_to_prev_word(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def move_to_start_of_line(tab: apitypes.Tab): +def move_to_start_of_line(tab: apitypes.Tab) -> None: """Move the cursor or selection to the start of the line.""" tab.caret.move_to_start_of_line() @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def move_to_end_of_line(tab: apitypes.Tab): +def move_to_end_of_line(tab: apitypes.Tab) -> None: """Move the cursor or selection to the end of line.""" tab.caret.move_to_end_of_line() @@ -124,7 +124,7 @@ def move_to_end_of_line(tab: apitypes.Tab): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_start_of_next_block(tab: apitypes.Tab, count: int = 1): +def move_to_start_of_next_block(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the start of next block. Args: @@ -136,7 +136,7 @@ def move_to_start_of_next_block(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_start_of_prev_block(tab: apitypes.Tab, count: int = 1): +def move_to_start_of_prev_block(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the start of previous block. Args: @@ -148,7 +148,7 @@ def move_to_start_of_prev_block(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_end_of_next_block(tab: apitypes.Tab, count: int = 1): +def move_to_end_of_next_block(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the end of next block. Args: @@ -160,7 +160,7 @@ def move_to_end_of_next_block(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def move_to_end_of_prev_block(tab: apitypes.Tab, count: int = 1): +def move_to_end_of_prev_block(tab: apitypes.Tab, count: int = 1) -> None: """Move the cursor or selection to the end of previous block. Args: @@ -171,35 +171,35 @@ def move_to_end_of_prev_block(tab: apitypes.Tab, count: int = 1): @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def move_to_start_of_document(tab: apitypes.Tab): +def move_to_start_of_document(tab: apitypes.Tab) -> None: """Move the cursor or selection to the start of the document.""" tab.caret.move_to_start_of_document() @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def move_to_end_of_document(tab: apitypes.Tab): +def move_to_end_of_document(tab: apitypes.Tab) -> None: """Move the cursor or selection to the end of the document.""" tab.caret.move_to_end_of_document() @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def toggle_selection(tab: apitypes.Tab): +def toggle_selection(tab: apitypes.Tab) -> None: """Toggle caret selection mode.""" tab.caret.toggle_selection() @cmdutils.register(modes=[cmdutils.KeyMode.caret]) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def drop_selection(tab: apitypes.Tab): +def drop_selection(tab: apitypes.Tab) -> None: """Drop selection and keep selection mode enabled.""" tab.caret.drop_selection() @cmdutils.register() @cmdutils.argument('tab_obj', value=cmdutils.Value.cur_tab) -def follow_selected(tab_obj: apitypes.Tab, *, tab=False): +def follow_selected(tab_obj: apitypes.Tab, *, tab: bool = False) -> None: """Follow the selected text. Args: diff --git a/qutebrowser/components/misccommands.py b/qutebrowser/components/misccommands.py index 2f9e2f5e5..60715c65b 100644 --- a/qutebrowser/components/misccommands.py +++ b/qutebrowser/components/misccommands.py @@ -37,7 +37,7 @@ from qutebrowser.api import cmdutils, apitypes, message, config @cmdutils.register(name='reload') @cmdutils.argument('tab', value=cmdutils.Value.count_tab) -def reloadpage(tab, force=False): +def reloadpage(tab: apitypes.Tab, force: bool = False) -> None: """Reload the current/[count]th tab. Args: @@ -50,7 +50,7 @@ def reloadpage(tab, force=False): @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.count_tab) -def stop(tab): +def stop(tab: apitypes.Tab) -> None: """Stop loading in the current/[count]th tab. Args: @@ -60,9 +60,9 @@ def stop(tab): tab.stop() -def _print_preview(tab): +def _print_preview(tab: apitypes.Tab) -> None: """Show a print preview.""" - def print_callback(ok): + def print_callback(ok: bool) -> None: if not ok: message.error("Printing failed!") @@ -76,7 +76,7 @@ def _print_preview(tab): diag.exec_() -def _print_pdf(tab, filename): +def _print_pdf(tab: apitypes.Tab, filename: str) -> None: """Print to the given PDF file.""" tab.printing.check_pdf_support() filename = os.path.expanduser(filename) @@ -90,7 +90,9 @@ def _print_pdf(tab, filename): @cmdutils.register(name='print') @cmdutils.argument('tab', value=cmdutils.Value.count_tab) @cmdutils.argument('pdf', flag='f', metavar='file') -def printpage(tab, preview=False, *, pdf=None): +def printpage(tab: apitypes.Tab, + preview: bool = False, *, + pdf: str = None) -> None: """Print the current/[count]th tab. Args: @@ -114,7 +116,7 @@ def printpage(tab, preview=False, *, pdf=None): @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def home(tab): +def home(tab: apitypes.Tab) -> None: """Open main startpage in current tab.""" if tab.data.pinned: message.info("Tab is pinned!") @@ -124,7 +126,7 @@ def home(tab): @cmdutils.register(debug=True) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def debug_dump_page(tab, dest, plain=False): +def debug_dump_page(tab: apitypes.Tab, dest: str, plain: bool = False) -> None: """Dump the current page's content to a file. Args: @@ -133,7 +135,7 @@ def debug_dump_page(tab, dest, plain=False): """ dest = os.path.expanduser(dest) - def callback(data): + def callback(data: str) -> None: """Write the data to disk.""" try: with open(dest, 'w', encoding='utf-8') as f: @@ -148,13 +150,13 @@ def debug_dump_page(tab, dest, plain=False): @cmdutils.register(maxsplit=0) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def insert_text(tab, text): +def insert_text(tab: apitypes.Tab, text: str) -> None: """Insert text at cursor position. Args: text: The text to insert. """ - def _insert_text_cb(elem): + def _insert_text_cb(elem: apitypes.WebElement) -> None: if elem is None: message.error("No element focused!") return @@ -170,7 +172,7 @@ def insert_text(tab, text): @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('filter_', choices=['id']) -def click_element(tab, filter_: str, value: str, *, +def click_element(tab: apitypes.Tab, filter_: str, value: str, *, target: apitypes.ClickTarget = apitypes.ClickTarget.normal, force_event: bool = False) -> None: @@ -186,7 +188,7 @@ def click_element(tab, filter_: str, value: str, *, target: How to open the clicked element (normal/tab/tab-bg/window). force_event: Force generating a fake click event. """ - def single_cb(elem): + def single_cb(elem: apitypes.WebElement) -> None: """Click a single element.""" if elem is None: message.error("No element found with id {}!".format(value)) @@ -207,7 +209,7 @@ def click_element(tab, filter_: str, value: str, *, @cmdutils.register(debug=True) @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def debug_webaction(tab, action, count=1): +def debug_webaction(tab: apitypes.Tab, action: str, count: int = 1) -> None: """Execute a webaction. Available actions: @@ -227,7 +229,7 @@ def debug_webaction(tab, action, count=1): @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.count_tab) -def tab_mute(tab): +def tab_mute(tab: apitypes.Tab) -> None: """Mute/Unmute the current/[count]th tab. Args: @@ -242,12 +244,12 @@ def tab_mute(tab): @cmdutils.register() -def nop(): +def nop() -> None: """Do nothing.""" @cmdutils.register() -def message_error(text): +def message_error(text: str) -> None: """Show an error message in the statusbar. Args: @@ -258,7 +260,7 @@ def message_error(text): @cmdutils.register() @cmdutils.argument('count', value=cmdutils.Value.count) -def message_info(text, count=1): +def message_info(text: str, count: int = 1) -> None: """Show an info message in the statusbar. Args: @@ -270,7 +272,7 @@ def message_info(text, count=1): @cmdutils.register() -def message_warning(text): +def message_warning(text: str) -> None: """Show a warning message in the statusbar. Args: @@ -281,7 +283,7 @@ def message_warning(text): @cmdutils.register(debug=True) @cmdutils.argument('typ', choices=['exception', 'segfault']) -def debug_crash(typ='exception'): +def debug_crash(typ: str = 'exception') -> None: """Crash for debugging purposes. Args: @@ -295,7 +297,7 @@ def debug_crash(typ='exception'): @cmdutils.register(debug=True, maxsplit=0, no_cmd_split=True) -def debug_trace(expr=""): +def debug_trace(expr: str = "") -> None: """Trace executed code via hunter. Args: diff --git a/qutebrowser/components/scrollcommands.py b/qutebrowser/components/scrollcommands.py index 4a6d9cb99..0b8943f2d 100644 --- a/qutebrowser/components/scrollcommands.py +++ b/qutebrowser/components/scrollcommands.py @@ -112,7 +112,7 @@ def scroll_to_perc(tab: apitypes.Tab, count: int = None, @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) -def scroll_to_anchor(tab: apitypes.Tab, name): +def scroll_to_anchor(tab: apitypes.Tab, name: str) -> None: """Scroll to the given anchor in the document. Args: diff --git a/qutebrowser/components/zoomcommands.py b/qutebrowser/components/zoomcommands.py index 05d2d8481..69f1df1c4 100644 --- a/qutebrowser/components/zoomcommands.py +++ b/qutebrowser/components/zoomcommands.py @@ -25,7 +25,7 @@ from qutebrowser.api import cmdutils, apitypes, message, config @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def zoom_in(tab: apitypes.Tab, count=1, quiet=False): +def zoom_in(tab: apitypes.Tab, count: int = 1, quiet: bool = False) -> None: """Increase the zoom level for the current tab. Args: @@ -43,7 +43,7 @@ def zoom_in(tab: apitypes.Tab, count=1, quiet=False): @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def zoom_out(tab: apitypes.Tab, count=1, quiet=False): +def zoom_out(tab: apitypes.Tab, count: int = 1, quiet: bool = False) -> None: """Decrease the zoom level for the current tab. Args: @@ -61,7 +61,10 @@ def zoom_out(tab: apitypes.Tab, count=1, quiet=False): @cmdutils.register() @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) @cmdutils.argument('count', value=cmdutils.Value.count) -def zoom(tab: apitypes.Tab, level=None, count=None, quiet=False): +def zoom(tab: apitypes.Tab, + level: str = None, + count: int = None, + quiet: bool = False) -> None: """Set the zoom level for the current tab. The zoom can be given as argument or as [count]. If neither is @@ -75,19 +78,19 @@ def zoom(tab: apitypes.Tab, level=None, count=None, quiet=False): """ if level is not None: try: - level = int(level.rstrip('%')) + int_level = int(level.rstrip('%')) except ValueError: raise cmdutils.CommandError("zoom: Invalid int value {}" .format(level)) if count is not None: - level = count - elif level is None: - level = config.val.zoom.default + int_level = count + elif int_level is None: + int_level = config.val.zoom.default try: - tab.zoom.set_factor(float(level) / 100) + tab.zoom.set_factor(int_level / 100) except ValueError: - raise cmdutils.CommandError("Can't zoom {}%!".format(level)) + raise cmdutils.CommandError("Can't zoom {}%!".format(int_level)) if not quiet: - message.info("Zoom level: {}%".format(int(level)), replace=True) + message.info("Zoom level: {}%".format(int_level), replace=True) From 2cb277afd71a3597190726a797d4a9585ebfad13 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 4 Dec 2018 16:29:44 +0100 Subject: [PATCH 271/492] Fix exception messages in Command The messages weren't updated in ac78039171d6742e2b55aca146a5bab33cd565a1. --- qutebrowser/commands/command.py | 6 +++--- tests/unit/api/test_cmdutils.py | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 9883447a8..46f92772f 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -157,18 +157,18 @@ class Command: if 'self' in signature.parameters: if self._instance is None: raise TypeError("{} is a class method, but instance was not " - "given!".format(self.name[0])) + "given!".format(self.name)) arg_info = self.get_arg_info(signature.parameters['self']) if arg_info.value is not None: raise TypeError("{}: Can't fill 'self' with value!" .format(self.name)) elif 'self' not in signature.parameters and self._instance is not None: raise TypeError("{} is not a class method, but instance was " - "given!".format(self.name[0])) + "given!".format(self.name)) elif any(param.kind == inspect.Parameter.VAR_KEYWORD for param in signature.parameters.values()): raise TypeError("{}: functions with varkw arguments are not " - "supported!".format(self.name[0])) + "supported!".format(self.name)) def get_arg_info(self, param): """Get an ArgInfo tuple for the given inspect.Parameter.""" diff --git a/tests/unit/api/test_cmdutils.py b/tests/unit/api/test_cmdutils.py index 9f01ea7bb..4116045ae 100644 --- a/tests/unit/api/test_cmdutils.py +++ b/tests/unit/api/test_cmdutils.py @@ -190,6 +190,27 @@ class TestRegister: args, kwargs = cmd._get_call_args(win_id=0) fun(*args, **kwargs) + def test_self_without_instance(self): + with pytest.raises(TypeError, match="fun is a class method, but " + "instance was not given!"): + @cmdutils.register() + def fun(self): + """Blah.""" + + def test_instance_without_self(self): + with pytest.raises(TypeError, match="fun is not a class method, but " + "instance was given!"): + @cmdutils.register(instance='inst') + def fun(): + """Blah.""" + + def test_var_kw(self): + with pytest.raises(TypeError, match="fun: functions with varkw " + "arguments are not supported!"): + @cmdutils.register() + def fun(**kwargs): + """Blah.""" + def test_partial_arg(self): """Test with only some arguments decorated with @cmdutils.argument.""" @cmdutils.register() From 8a107fa5b365b70600556bc9889076e629867f6e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 4 Dec 2018 17:38:50 +0100 Subject: [PATCH 272/492] Fix int_level handling in :zoom --- qutebrowser/components/zoomcommands.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/qutebrowser/components/zoomcommands.py b/qutebrowser/components/zoomcommands.py index 69f1df1c4..7a392c4a0 100644 --- a/qutebrowser/components/zoomcommands.py +++ b/qutebrowser/components/zoomcommands.py @@ -82,10 +82,9 @@ def zoom(tab: apitypes.Tab, except ValueError: raise cmdutils.CommandError("zoom: Invalid int value {}" .format(level)) - - if count is not None: + elif count is not None: int_level = count - elif int_level is None: + else: int_level = config.val.zoom.default try: From 2770a935e9d5fefcdd72ca3787ac406bed13f0e1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 5 Dec 2018 07:57:21 +0100 Subject: [PATCH 273/492] Properly fix zoom handling --- qutebrowser/components/zoomcommands.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qutebrowser/components/zoomcommands.py b/qutebrowser/components/zoomcommands.py index 7a392c4a0..51d01cfea 100644 --- a/qutebrowser/components/zoomcommands.py +++ b/qutebrowser/components/zoomcommands.py @@ -76,16 +76,16 @@ def zoom(tab: apitypes.Tab, count: The zoom percentage to set. quiet: Don't show a zoom level message. """ - if level is not None: + if count is not None: + int_level = count + elif level is not None: try: int_level = int(level.rstrip('%')) except ValueError: raise cmdutils.CommandError("zoom: Invalid int value {}" .format(level)) - elif count is not None: - int_level = count else: - int_level = config.val.zoom.default + int_level = int(config.val.zoom.default) try: tab.zoom.set_factor(int_level / 100) From c752ba472184adc539bb22584367f2028b21e8d5 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 5 Dec 2018 08:55:35 +0100 Subject: [PATCH 274/492] Fix coverage --- qutebrowser/config/configfiles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index 54ca91488..d11c0d976 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -38,7 +38,7 @@ from qutebrowser.keyinput import keyutils from qutebrowser.utils import standarddir, utils, qtutils, log, urlmatch MYPY = False -if MYPY: +if MYPY: # pragma: no cover # pylint: disable=unused-import, useless-suppression from qutebrowser.misc import savemanager From 403e63d6f27d397be0b72c7def7e2541523bff78 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 5 Dec 2018 09:05:32 +0100 Subject: [PATCH 275/492] Configure coverage.py for "if MYPY:" --- .coveragerc | 1 + qutebrowser/api/config.py | 2 +- qutebrowser/config/config.py | 2 +- qutebrowser/config/configcommands.py | 2 +- qutebrowser/config/configfiles.py | 2 +- qutebrowser/config/configutils.py | 2 +- qutebrowser/misc/objects.py | 2 +- 7 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.coveragerc b/.coveragerc index 9ba8e8a5e..69b126e12 100644 --- a/.coveragerc +++ b/.coveragerc @@ -14,6 +14,7 @@ exclude_lines = raise NotImplementedError raise utils\.Unreachable if __name__ == ["']__main__["']: + if MYPY: [xml] output=coverage.xml diff --git a/qutebrowser/api/config.py b/qutebrowser/api/config.py index d45703242..6558cf42a 100644 --- a/qutebrowser/api/config.py +++ b/qutebrowser/api/config.py @@ -22,7 +22,7 @@ import typing MYPY = False -if MYPY: # pragma: no cover +if MYPY: # pylint: disable=unused-import,useless-suppression from qutebrowser.config import config diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 44bf3ca77..80826beeb 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -33,7 +33,7 @@ from qutebrowser.misc import objects from qutebrowser.keyinput import keyutils MYPY = False -if MYPY: # pragma: no cover +if MYPY: # pylint: disable=unused-import,useless-suppression from typing import Tuple, MutableMapping from qutebrowser.config import configcache, configfiles diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index 0ee77fcc9..5d5b2db7e 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -33,7 +33,7 @@ from qutebrowser.misc import editor from qutebrowser.keyinput import keyutils MYPY = False -if MYPY: # pragma: no cover +if MYPY: # pylint: disable=unused-import,useless-suppression from qutebrowser.config.config import Config, KeyConfig diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index d11c0d976..54ca91488 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -38,7 +38,7 @@ from qutebrowser.keyinput import keyutils from qutebrowser.utils import standarddir, utils, qtutils, log, urlmatch MYPY = False -if MYPY: # pragma: no cover +if MYPY: # pylint: disable=unused-import, useless-suppression from qutebrowser.misc import savemanager diff --git a/qutebrowser/config/configutils.py b/qutebrowser/config/configutils.py index 9d4dc94ef..efdc5611e 100644 --- a/qutebrowser/config/configutils.py +++ b/qutebrowser/config/configutils.py @@ -30,7 +30,7 @@ from qutebrowser.utils import utils, urlmatch from qutebrowser.config import configexc MYPY = False -if MYPY: # pragma: no cover +if MYPY: # pylint: disable=unused-import,useless-suppression from qutebrowser.config import configdata diff --git a/qutebrowser/misc/objects.py b/qutebrowser/misc/objects.py index ccb5d09b3..0bb26954c 100644 --- a/qutebrowser/misc/objects.py +++ b/qutebrowser/misc/objects.py @@ -25,7 +25,7 @@ import typing MYPY = False -if MYPY: # pragma: no cover +if MYPY: # pylint: disable=unused-import,useless-suppression from qutebrowser.utils import usertypes from qutebrowser.commands import command From f53fd56c3d7a4f7e9eff5b84707d8dee738f6515 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 5 Dec 2018 16:48:33 +0100 Subject: [PATCH 276/492] mypy: Add annotations for qutebrowser.config.configtypes --- mypy.ini | 4 + qutebrowser/config/configexc.py | 3 +- qutebrowser/config/configtypes.py | 467 +++++++++++++++----------- qutebrowser/config/configutils.py | 4 +- tests/unit/config/test_configtypes.py | 2 +- tests/unit/config/test_configutils.py | 2 +- 6 files changed, 290 insertions(+), 192 deletions(-) diff --git a/mypy.ini b/mypy.ini index c61ca1f18..2e1d50558 100644 --- a/mypy.ini +++ b/mypy.ini @@ -98,6 +98,10 @@ disallow_incomplete_defs = True disallow_untyped_defs = True disallow_incomplete_defs = True +[mypy-qutebrowser.config.configtypes] +disallow_untyped_defs = True +disallow_incomplete_defs = True + [mypy-qutebrowser.api.*] disallow_untyped_defs = True disallow_incomplete_defs = True diff --git a/qutebrowser/config/configexc.py b/qutebrowser/config/configexc.py index b1dc04e09..80a2cedb2 100644 --- a/qutebrowser/config/configexc.py +++ b/qutebrowser/config/configexc.py @@ -76,7 +76,8 @@ class ValidationError(Error): msg: Additional error message. """ - def __init__(self, value: typing.Any, msg: str) -> None: + def __init__(self, value: typing.Any, + msg: typing.Union[str, Exception]) -> None: super().__init__("Invalid value '{}' - {}".format(value, msg)) self.option = None diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index d4ce33d21..61dba365e 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -52,13 +52,14 @@ import datetime import functools import operator import json -import typing # pylint: disable=unused-import +import typing import attr import yaml from PyQt5.QtCore import QUrl, Qt from PyQt5.QtGui import QColor, QFont from PyQt5.QtWidgets import QTabWidget, QTabBar +from PyQt5.QtNetwork import QNetworkProxy from qutebrowser.misc import objects from qutebrowser.config import configexc, configutils @@ -67,13 +68,23 @@ from qutebrowser.utils import (standarddir, utils, qtutils, urlutils, urlmatch, from qutebrowser.keyinput import keyutils -SYSTEM_PROXY = object() # Return value for Proxy type +class _SystemProxy: + + pass + + +SYSTEM_PROXY = _SystemProxy() # Return value for Proxy type # Taken from configparser BOOLEAN_STATES = {'1': True, 'yes': True, 'true': True, 'on': True, '0': False, 'no': False, 'false': False, 'off': False} +_Completions = typing.Optional[typing.Iterable[typing.Tuple[str, str]]] +_StrUnset = typing.Union[str, configutils.Unset] +_StrUnsetNone = typing.Union[None, str, configutils.Unset] + + class ValidValues: """Container for valid values for a given type. @@ -84,11 +95,15 @@ class ValidValues: generate_docs: Whether to show the values in the docs. """ - def __init__(self, *values, generate_docs=True): + def __init__(self, + *values: typing.Union[str, + typing.Dict[str, str], + typing.Tuple[str, str]], + generate_docs: bool = True) -> None: if not values: raise ValueError("ValidValues with no values makes no sense!") - self.descriptions = {} - self.values = [] + self.descriptions = {} # type: typing.Dict[str, str] + self.values = [] # type: typing.List[str] self.generate_docs = generate_docs for value in values: if isinstance(value, str): @@ -105,17 +120,18 @@ class ValidValues: self.values.append(value[0]) self.descriptions[value[0]] = value[1] - def __contains__(self, val): + def __contains__(self, val: str) -> bool: return val in self.values - def __iter__(self): + def __iter__(self) -> typing.Iterator[str]: return self.values.__iter__() - def __repr__(self): + def __repr__(self) -> str: return utils.get_repr(self, values=self.values, descriptions=self.descriptions) - def __eq__(self, other): + def __eq__(self, other: object) -> bool: + assert isinstance(other, ValidValues) return (self.values == other.values and self.descriptions == other.descriptions) @@ -132,26 +148,28 @@ class BaseType: string. ValidValues instance. """ - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: self.none_ok = none_ok - self.valid_values = None + self.valid_values = None # type: typing.Optional[ValidValues] - def get_name(self): + def get_name(self) -> str: """Get a name for the type for documentation.""" return self.__class__.__name__ - def get_valid_values(self): + def get_valid_values(self) -> typing.Optional[ValidValues]: """Get the type's valid values for documentation.""" return self.valid_values - def _basic_py_validation(self, value, pytype): + def _basic_py_validation( + self, value: typing.Any, + pytype: typing.Union[type, typing.Tuple[type, ...]]) -> None: """Do some basic validation for Python values (emptyness, type). Arguments: value: The value to check. pytype: A Python type to check the value against. """ - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return if (value is None or (pytype == list and value == []) or @@ -174,7 +192,7 @@ class BaseType: if isinstance(value, str): self._basic_str_validation(value) - def _basic_str_validation(self, value): + def _basic_str_validation(self, value: str) -> None: """Do some basic validation for string values. This checks that the value isn't empty and doesn't contain any @@ -190,7 +208,8 @@ class BaseType: raise configexc.ValidationError( value, "may not contain unprintable chars!") - def _validate_surrogate_escapes(self, full_value, value): + def _validate_surrogate_escapes(self, full_value: typing.Any, + value: typing.Any) -> None: """Make sure the given value doesn't contain surrogate escapes. This is used for values passed to json.dump, as it can't handle those. @@ -201,7 +220,7 @@ class BaseType: raise configexc.ValidationError( full_value, "may not contain surrogate escapes!") - def _validate_valid_values(self, value): + def _validate_valid_values(self, value: str) -> None: """Validate value against possible values. The default implementation checks the value against self.valid_values @@ -216,7 +235,7 @@ class BaseType: value, "valid values: {}".format(', '.join(self.valid_values))) - def from_str(self, value): + def from_str(self, value: str) -> typing.Any: """Get the setting value from a string. By default this invokes to_py() for validation and returns the @@ -235,11 +254,11 @@ class BaseType: return None return value - def from_obj(self, value): + def from_obj(self, value: typing.Any) -> typing.Any: """Get the setting value from a config.py/YAML object.""" return value - def to_py(self, value): + def to_py(self, value: typing.Any) -> typing.Any: """Get the setting value from a Python value. Args: @@ -253,7 +272,7 @@ class BaseType: """ raise NotImplementedError - def to_str(self, value): + def to_str(self, value: typing.Any) -> str: """Get a string from the setting value. The resulting string should be parseable again by from_str. @@ -263,7 +282,7 @@ class BaseType: assert isinstance(value, str), value return value - def to_doc(self, value, indent=0): + def to_doc(self, value: typing.Any, indent: int = 0) -> str: """Get a string with the given value for the documentation. This currently uses asciidoc syntax. @@ -274,7 +293,7 @@ class BaseType: return 'empty' return '+pass:[{}]+'.format(html.escape(str_value)) - def complete(self): + def complete(self) -> _Completions: """Return a list of possible values for completion. The default implementation just returns valid_values, but it might be @@ -308,13 +327,14 @@ class MappingType(BaseType): MAPPING = {} # type: typing.Dict[str, typing.Any] - def __init__(self, none_ok=False, valid_values=None): + def __init__(self, none_ok: bool = False, + valid_values: ValidValues = None) -> None: super().__init__(none_ok) self.valid_values = valid_values - def to_py(self, value): + def to_py(self, value: typing.Any) -> typing.Any: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -335,9 +355,11 @@ class String(BaseType): completions: completions to be used, or None """ - def __init__(self, *, minlen=None, maxlen=None, forbidden=None, - encoding=None, none_ok=False, completions=None, - valid_values=None): + def __init__(self, *, minlen: int = None, maxlen: int = None, + forbidden: str = None, encoding: str = None, + none_ok: bool = False, + completions: _Completions = None, + valid_values: ValidValues = None) -> None: super().__init__(none_ok) self.valid_values = valid_values @@ -354,7 +376,7 @@ class String(BaseType): self._completions = completions self.encoding = encoding - def _validate_encoding(self, value): + def _validate_encoding(self, value: str) -> None: """Check if the given value fits into the configured encoding. Raises ValidationError if not. @@ -372,9 +394,9 @@ class String(BaseType): value, self.encoding, e) raise configexc.ValidationError(value, msg) - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -395,7 +417,7 @@ class String(BaseType): return value - def complete(self): + def complete(self) -> _Completions: if self._completions is not None: return self._completions else: @@ -406,19 +428,19 @@ class UniqueCharString(String): """A string which may not contain duplicate chars.""" - def to_py(self, value): - value = super().to_py(value) - if value is configutils.UNSET: - return value - elif not value: + def to_py(self, value: _StrUnset) -> _StrUnsetNone: + py_value = super().to_py(value) + if isinstance(py_value, configutils.Unset): + return py_value + elif not py_value: return None # Check for duplicate values - if len(set(value)) != len(value): + if len(set(py_value)) != len(py_value): raise configexc.ValidationError( - value, "String contains duplicate values!") + py_value, "String contains duplicate values!") - return value + return py_value class List(BaseType): @@ -430,21 +452,23 @@ class List(BaseType): _show_valtype = True - def __init__(self, valtype, none_ok=False, length=None): + def __init__(self, valtype: BaseType, + none_ok: bool = False, + length: int = None) -> None: super().__init__(none_ok) self.valtype = valtype self.length = length - def get_name(self): + def get_name(self) -> str: name = super().get_name() if self._show_valtype: name += " of " + self.valtype.get_name() return name - def get_valid_values(self): + def get_valid_values(self) -> typing.Optional[ValidValues]: return self.valtype.get_valid_values() - def from_str(self, value): + def from_str(self, value: str) -> typing.Optional[typing.List]: self._basic_str_validation(value) if not value: return None @@ -459,14 +483,17 @@ class List(BaseType): self.to_py(yaml_val) return yaml_val - def from_obj(self, value): + def from_obj(self, value: typing.Optional[typing.List]) -> typing.List: if value is None: return [] return [self.valtype.from_obj(v) for v in value] - def to_py(self, value): + def to_py( + self, + value: typing.Union[typing.List, configutils.Unset] + ) -> typing.Union[typing.List, configutils.Unset]: self._basic_py_validation(value, list) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return [] @@ -479,13 +506,13 @@ class List(BaseType): "be set!".format(self.length)) return [self.valtype.to_py(v) for v in value] - def to_str(self, value): + def to_str(self, value: typing.List) -> str: if not value: # An empty list is treated just like None -> empty string return '' return json.dumps(value) - def to_doc(self, value, indent=0): + def to_doc(self, value: typing.List, indent: int = 0) -> str: if not value: return 'empty' @@ -513,13 +540,16 @@ class ListOrValue(BaseType): _show_valtype = True - def __init__(self, valtype, *args, none_ok=False, **kwargs): + def __init__(self, valtype: BaseType, *, + none_ok: bool = False, + **kwargs: typing.Any) -> None: super().__init__(none_ok) assert not isinstance(valtype, (List, ListOrValue)), valtype - self.listtype = List(valtype, none_ok=none_ok, *args, **kwargs) + self.listtype = List(valtype, none_ok=none_ok, **kwargs) self.valtype = valtype - def _val_and_type(self, value): + def _val_and_type(self, + value: typing.Any) -> typing.Tuple[typing.Any, BaseType]: """Get the value and type to use for to_str/to_doc/from_str.""" if isinstance(value, list): if len(value) == 1: @@ -529,25 +559,25 @@ class ListOrValue(BaseType): else: return value, self.valtype - def get_name(self): + def get_name(self) -> str: return self.listtype.get_name() + ', or ' + self.valtype.get_name() - def get_valid_values(self): + def get_valid_values(self) -> typing.Optional[ValidValues]: return self.valtype.get_valid_values() - def from_str(self, value): + def from_str(self, value: str) -> typing.Any: try: return self.listtype.from_str(value) except configexc.ValidationError: return self.valtype.from_str(value) - def from_obj(self, value): + def from_obj(self, value: typing.Any) -> typing.Any: if value is None: return [] return value - def to_py(self, value): - if value is configutils.UNSET: + def to_py(self, value: typing.Any) -> typing.Any: + if isinstance(value, configutils.Unset): return value try: @@ -555,14 +585,14 @@ class ListOrValue(BaseType): except configexc.ValidationError: return self.listtype.to_py(value) - def to_str(self, value): + def to_str(self, value: typing.Any) -> str: if value is None: return '' val, typ = self._val_and_type(value) return typ.to_str(val) - def to_doc(self, value, indent=0): + def to_doc(self, value: typing.Any, indent: int = 0) -> str: if value is None: return 'empty' @@ -578,26 +608,31 @@ class FlagList(List): the valid values of the setting. """ - combinable_values = None # type: typing.Optional[typing.Iterable] + combinable_values = None # type: typing.Optional[typing.Sequence] _show_valtype = False - def __init__(self, none_ok=False, valid_values=None, length=None): + def __init__(self, none_ok: bool = False, + valid_values: ValidValues = None, + length: int = None) -> None: super().__init__(valtype=String(), none_ok=none_ok, length=length) self.valtype.valid_values = valid_values - def _check_duplicates(self, values): + def _check_duplicates(self, values: typing.List) -> None: if len(set(values)) != len(values): raise configexc.ValidationError( values, "List contains duplicate values!") - def to_py(self, value): + def to_py( + self, + value: typing.Union[configutils.Unset, typing.List], + ) -> typing.Union[configutils.Unset, typing.List]: vals = super().to_py(value) - if vals is not configutils.UNSET: + if not isinstance(vals, configutils.Unset): self._check_duplicates(vals) return vals - def complete(self): + def complete(self) -> _Completions: valid_values = self.valtype.valid_values if valid_values is None: return None @@ -626,15 +661,15 @@ class Bool(BaseType): while `0`, `no`, `off` and `false` count as false (case-insensitive). """ - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__(none_ok) self.valid_values = ValidValues('true', 'false', generate_docs=False) - def to_py(self, value): + def to_py(self, value: typing.Optional[bool]) -> typing.Optional[bool]: self._basic_py_validation(value, bool) return value - def from_str(self, value): + def from_str(self, value: str) -> typing.Optional[bool]: self._basic_str_validation(value) if not value: return None @@ -644,7 +679,7 @@ class Bool(BaseType): except KeyError: raise configexc.ValidationError(value, "must be a boolean!") - def to_str(self, value): + def to_str(self, value: typing.Optional[bool]) -> str: mapping = { None: '', True: 'true', @@ -657,25 +692,27 @@ class BoolAsk(Bool): """Like `Bool`, but `ask` is allowed as additional value.""" - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__(none_ok) self.valid_values = ValidValues('true', 'false', 'ask') - def to_py(self, value): + def to_py(self, # type: ignore + value: typing.Union[bool, str]) -> typing.Union[bool, str, None]: # basic validation unneeded if it's == 'ask' and done by Bool if we # call super().to_py if isinstance(value, str) and value.lower() == 'ask': return 'ask' - return super().to_py(value) + return super().to_py(value) # type: ignore - def from_str(self, value): + def from_str(self, # type: ignore + value: str) -> typing.Union[bool, str, None]: # basic validation unneeded if it's == 'ask' and done by Bool if we # call super().from_str if isinstance(value, str) and value.lower() == 'ask': return 'ask' return super().from_str(value) - def to_str(self, value): + def to_str(self, value: typing.Union[bool, str, None]) -> str: mapping = { None: '', True: 'true', @@ -694,7 +731,9 @@ class _Numeric(BaseType): # pylint: disable=abstract-method maxval: Maximum value (inclusive). """ - def __init__(self, minval=None, maxval=None, none_ok=False): + def __init__(self, minval: int = None, + maxval: int = None, + none_ok: bool = False) -> None: super().__init__(none_ok) self.minval = self._parse_bound(minval) self.maxval = self._parse_bound(maxval) @@ -703,7 +742,9 @@ class _Numeric(BaseType): # pylint: disable=abstract-method raise ValueError("minval ({}) needs to be <= maxval ({})!" .format(self.minval, self.maxval)) - def _parse_bound(self, bound): + def _parse_bound( + self, bound: typing.Union[None, str, int, float] + ) -> typing.Union[None, int, float]: """Get a numeric bound from a string like 'maxint'.""" if bound == 'maxint': return qtutils.MAXVALS['int'] @@ -714,7 +755,8 @@ class _Numeric(BaseType): # pylint: disable=abstract-method assert isinstance(bound, (int, float)), bound return bound - def _validate_bounds(self, value, suffix=''): + def _validate_bounds(self, value: typing.Union[None, int, float], + suffix: str = '') -> None: """Validate self.minval and self.maxval.""" if value is None: return @@ -725,7 +767,7 @@ class _Numeric(BaseType): # pylint: disable=abstract-method raise configexc.ValidationError( value, "must be {}{} or smaller!".format(self.maxval, suffix)) - def to_str(self, value): + def to_str(self, value: typing.Union[None, int, float]) -> str: if value is None: return '' return str(value) @@ -735,7 +777,7 @@ class Int(_Numeric): """Base class for an integer setting.""" - def from_str(self, value): + def from_str(self, value: str) -> typing.Optional[int]: self._basic_str_validation(value) if not value: return None @@ -747,7 +789,7 @@ class Int(_Numeric): self.to_py(intval) return intval - def to_py(self, value): + def to_py(self, value: typing.Optional[int]) -> typing.Optional[int]: self._basic_py_validation(value, int) self._validate_bounds(value) return value @@ -757,7 +799,7 @@ class Float(_Numeric): """Base class for a float setting.""" - def from_str(self, value): + def from_str(self, value: str) -> typing.Optional[float]: self._basic_str_validation(value) if not value: return None @@ -769,7 +811,10 @@ class Float(_Numeric): self.to_py(floatval) return floatval - def to_py(self, value): + def to_py( + self, + value: typing.Union[None, int, float], + ) -> typing.Union[None, int, float]: self._basic_py_validation(value, (int, float)) self._validate_bounds(value) return value @@ -779,9 +824,12 @@ class Perc(_Numeric): """A percentage.""" - def to_py(self, value): + def to_py( + self, + value: typing.Union[None, float, int, str, configutils.Unset] + ) -> typing.Union[None, float, int, configutils.Unset]: self._basic_py_validation(value, (float, int, str)) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -796,7 +844,7 @@ class Perc(_Numeric): self._validate_bounds(value, suffix='%') return value - def to_str(self, value): + def to_str(self, value: typing.Union[None, float, int, str]) -> str: if value is None: return '' return value @@ -813,8 +861,9 @@ class PercOrInt(_Numeric): maxint: Maximum value for integer (inclusive). """ - def __init__(self, minperc=None, maxperc=None, minint=None, maxint=None, - none_ok=False): + def __init__(self, minperc: int = None, maxperc: int = None, + minint: int = None, maxint: int = None, + none_ok: bool = False) -> None: super().__init__(minval=minint, maxval=maxint, none_ok=none_ok) self.minperc = self._parse_bound(minperc) self.maxperc = self._parse_bound(maxperc) @@ -823,7 +872,7 @@ class PercOrInt(_Numeric): raise ValueError("minperc ({}) needs to be <= maxperc " "({})!".format(self.minperc, self.maxperc)) - def from_str(self, value): + def from_str(self, value: str) -> typing.Union[None, str, int]: self._basic_str_validation(value) if not value: return None @@ -840,7 +889,10 @@ class PercOrInt(_Numeric): self.to_py(intval) return intval - def to_py(self, value): + def to_py( + self, + value: typing.Union[None, str, int] + ) -> typing.Union[None, str, int]: """Expect a value like '42%' as string, or 23 as int.""" self._basic_py_validation(value, (int, str)) if value is None: @@ -880,13 +932,13 @@ class Command(BaseType): invalid commands (in bindings/aliases) fail when used. """ - def complete(self): + def complete(self) -> _Completions: out = [] for cmdname, obj in objects.commands.items(): out.append((cmdname, obj.desc)) return out - def to_py(self, value): + def to_py(self, value: str) -> str: self._basic_py_validation(value, str) return value @@ -895,7 +947,7 @@ class ColorSystem(MappingType): """The color system to use for color interpolation.""" - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__( none_ok, valid_values=ValidValues( @@ -916,7 +968,7 @@ class IgnoreCase(MappingType): """Whether to search case insensitively.""" - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__( none_ok, valid_values=ValidValues( @@ -946,7 +998,7 @@ class QtColor(BaseType): * `hsv(h, s, v)` / `hsva(h, s, v, a)` (values 0-255, hue 0-359) """ - def _parse_value(self, val): + def _parse_value(self, val: str) -> int: try: return int(val) except ValueError: @@ -962,9 +1014,10 @@ class QtColor(BaseType): except ValueError: raise configexc.ValidationError(val, "must be a valid color value") - def to_py(self, value): + def to_py(self, value: _StrUnset) -> typing.Union[configutils.Unset, + None, QColor]: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -973,15 +1026,15 @@ class QtColor(BaseType): openparen = value.index('(') kind = value[:openparen] vals = value[openparen+1:-1].split(',') - vals = [self._parse_value(v) for v in vals] - if kind == 'rgba' and len(vals) == 4: - return QColor.fromRgb(*vals) - elif kind == 'rgb' and len(vals) == 3: - return QColor.fromRgb(*vals) - elif kind == 'hsva' and len(vals) == 4: - return QColor.fromHsv(*vals) - elif kind == 'hsv' and len(vals) == 3: - return QColor.fromHsv(*vals) + int_vals = [self._parse_value(v) for v in vals] + if kind == 'rgba' and len(int_vals) == 4: + return QColor.fromRgb(*int_vals) + elif kind == 'rgb' and len(int_vals) == 3: + return QColor.fromRgb(*int_vals) + elif kind == 'hsva' and len(int_vals) == 4: + return QColor.fromHsv(*int_vals) + elif kind == 'hsv' and len(int_vals) == 3: + return QColor.fromHsv(*int_vals) else: raise configexc.ValidationError(value, "must be a valid color") @@ -1009,9 +1062,9 @@ class QssColor(BaseType): under ``Gradient'' """ - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1056,9 +1109,9 @@ class Font(BaseType): )* # 0-inf size/weight/style tags (?P.+) # mandatory font family""", re.VERBOSE) - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1077,9 +1130,9 @@ class FontFamily(Font): """A Qt font family.""" - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1103,9 +1156,10 @@ class QtFont(Font): __doc__ = Font.__doc__ # for src2asciidoc.py - def to_py(self, value): + def to_py(self, value: _StrUnset) -> typing.Union[configutils.Unset, + None, QFont]: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1176,18 +1230,19 @@ class Regex(BaseType): _regex_type: The Python type of a regex object. """ - def __init__(self, flags=0, none_ok=False): + def __init__(self, flags: str = None, + none_ok: bool = False) -> None: super().__init__(none_ok) self._regex_type = type(re.compile('')) # Parse flags from configdata.yml - if flags == 0: - self.flags = flags + if flags is None: + self.flags = 0 else: self.flags = functools.reduce( operator.or_, (getattr(re, flag.strip()) for flag in flags.split(' | '))) - def _compile_regex(self, pattern): + def _compile_regex(self, pattern: str) -> typing.Pattern[str]: """Check if the given regex is valid. This is more complicated than it could be since there's a warning on @@ -1206,6 +1261,8 @@ class Regex(BaseType): pattern, "must be a valid regex - recursion depth " "exceeded") + assert recorded_warnings is not None + for w in recorded_warnings: if (issubclass(w.category, DeprecationWarning) and str(w.message).startswith('bad escape')): @@ -1216,10 +1273,13 @@ class Regex(BaseType): return compiled - def to_py(self, value): + def to_py( + self, + value: typing.Union[str, typing.Pattern[str]] + ) -> typing.Union[configutils.Unset, None, typing.Pattern[str]]: """Get a compiled regex from either a string or a regex object.""" self._basic_py_validation(value, (str, self._regex_type)) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1228,12 +1288,14 @@ class Regex(BaseType): else: return value - def to_str(self, value): + def to_str(self, + value: typing.Union[None, str, typing.Pattern[str]]) -> str: if value is None: return '' elif isinstance(value, self._regex_type): return value.pattern else: + assert isinstance(value, str) return value @@ -1244,8 +1306,11 @@ class Dict(BaseType): When setting from a string, pass a json-like dict, e.g. `{"key", "value"}`. """ - def __init__(self, keytype, valtype, *, fixed_keys=None, - required_keys=None, none_ok=False): + def __init__(self, keytype: typing.Union[String, 'Key'], + valtype: BaseType, *, + fixed_keys: typing.Iterable = None, + required_keys: typing.Iterable = None, + none_ok: bool = False) -> None: super().__init__(none_ok) # If the keytype is not a string, we'll get problems with showing it as # json in to_str() as json converts keys to strings. @@ -1255,7 +1320,7 @@ class Dict(BaseType): self.fixed_keys = fixed_keys self.required_keys = required_keys - def _validate_keys(self, value): + def _validate_keys(self, value: typing.Dict) -> None: if (self.fixed_keys is not None and not set(value.keys()).issubset(self.fixed_keys)): raise configexc.ValidationError( @@ -1266,7 +1331,7 @@ class Dict(BaseType): raise configexc.ValidationError( value, "Required keys {}".format(self.required_keys)) - def from_str(self, value): + def from_str(self, value: str) -> typing.Optional[typing.Dict]: self._basic_str_validation(value) if not value: return None @@ -1281,14 +1346,14 @@ class Dict(BaseType): self.to_py(yaml_val) return yaml_val - def from_obj(self, value): + def from_obj(self, value: typing.Optional[typing.Dict]) -> typing.Dict: if value is None: return {} return {self.keytype.from_obj(key): self.valtype.from_obj(val) for key, val in value.items()} - def _fill_fixed_keys(self, value): + def _fill_fixed_keys(self, value: typing.Dict) -> typing.Dict: """Fill missing fixed keys with a None-value.""" if self.fixed_keys is None: return value @@ -1297,9 +1362,12 @@ class Dict(BaseType): value[key] = self.valtype.to_py(None) return value - def to_py(self, value): + def to_py( + self, + value: typing.Union[typing.Dict, configutils.Unset, None] + ) -> typing.Union[typing.Dict, configutils.Unset]: self._basic_py_validation(value, dict) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return self._fill_fixed_keys({}) @@ -1313,13 +1381,13 @@ class Dict(BaseType): for key, val in value.items()} return self._fill_fixed_keys(d) - def to_str(self, value): + def to_str(self, value: typing.Dict) -> str: if not value: # An empty Dict is treated just like None -> empty string return '' return json.dumps(value, sort_keys=True) - def to_doc(self, value, indent=0): + def to_doc(self, value: typing.Dict, indent: int = 0) -> str: if not value: return 'empty' lines = ['\n'] @@ -1337,13 +1405,13 @@ class File(BaseType): """A file on the local filesystem.""" - def __init__(self, required=True, **kwargs): + def __init__(self, required: bool = True, **kwargs: typing.Any) -> None: super().__init__(**kwargs) self.required = required - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1369,9 +1437,9 @@ class Directory(BaseType): """A directory on the local filesystem.""" - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1394,13 +1462,14 @@ class FormatString(BaseType): """A string with placeholders.""" - def __init__(self, fields, none_ok=False): + def __init__(self, fields: typing.Iterable[str], + none_ok: bool = False) -> None: super().__init__(none_ok) self.fields = fields - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1428,39 +1497,46 @@ class ShellCommand(List): _show_valtype = False - def __init__(self, placeholder=False, none_ok=False): + def __init__(self, placeholder: bool = False, + none_ok: bool = False) -> None: super().__init__(valtype=String(), none_ok=none_ok) self.placeholder = placeholder - def to_py(self, value): - value = super().to_py(value) - if value is configutils.UNSET: - return value - elif not value: + def to_py( + self, + value: typing.Union[typing.List, configutils.Unset], + ) -> typing.Union[typing.List, configutils.Unset]: + py_value = super().to_py(value) + if isinstance(py_value, configutils.Unset): + return py_value + elif not py_value: return [] if (self.placeholder and - '{}' not in ' '.join(value) and - '{file}' not in ' '.join(value)): - raise configexc.ValidationError(value, "needs to contain a " + '{}' not in ' '.join(py_value) and + '{file}' not in ' '.join(py_value)): + raise configexc.ValidationError(py_value, "needs to contain a " "{}-placeholder or a " "{file}-placeholder.") - return value + return py_value class Proxy(BaseType): """A proxy URL, or `system`/`none`.""" - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__(none_ok) self.valid_values = ValidValues( ('system', "Use the system wide proxy."), ('none', "Don't use any proxy")) - def to_py(self, value): + def to_py( + self, + value: _StrUnset + ) -> typing.Union[configutils.Unset, None, QNetworkProxy, _SystemProxy]: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1474,13 +1550,15 @@ class Proxy(BaseType): else: # If we add a special value to valid_values, we need to handle # it here! + assert self.valid_values is not None assert value not in self.valid_values, value url = QUrl(value) return urlutils.proxy_from_url(url) except (urlutils.InvalidUrlError, urlutils.InvalidProxyTypeError) as e: raise configexc.ValidationError(value, e) - def complete(self): + def complete(self) -> _Completions: + assert self.valid_values is not None out = [] for val in self.valid_values: out.append((val, self.valid_values.descriptions[val])) @@ -1496,9 +1574,9 @@ class SearchEngineUrl(BaseType): """A search engine URL.""" - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1526,9 +1604,9 @@ class FuzzyUrl(BaseType): """A URL which gets interpreted as search if needed.""" - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1544,10 +1622,10 @@ class PaddingValues: """Four padding values.""" - top = attr.ib() - bottom = attr.ib() - left = attr.ib() - right = attr.ib() + top = attr.ib() # type: int + bottom = attr.ib() # type: int + left = attr.ib() # type: int + right = attr.ib() # type: int class Padding(Dict): @@ -1556,15 +1634,18 @@ class Padding(Dict): _show_valtype = False - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__(keytype=String(), valtype=Int(minval=0, none_ok=none_ok), fixed_keys=['top', 'bottom', 'left', 'right'], none_ok=none_ok) - def to_py(self, value): + def to_py( # type: ignore + self, + value: typing.Union[configutils.Unset, typing.Dict, None], + ) -> typing.Union[configutils.Unset, PaddingValues]: d = super().to_py(value) - if d is configutils.UNSET: + if isinstance(d, configutils.Unset): return d return PaddingValues(**d) @@ -1574,9 +1655,9 @@ class Encoding(BaseType): """Setting for a python encoding.""" - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1598,7 +1679,7 @@ class Position(MappingType): 'right': QTabWidget.East, } - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__( none_ok, valid_values=ValidValues('top', 'bottom', 'left', 'right')) @@ -1614,7 +1695,7 @@ class TextAlignment(MappingType): 'center': Qt.AlignCenter, } - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__( none_ok, valid_values=ValidValues('left', 'right', 'center')) @@ -1624,7 +1705,7 @@ class VerticalPosition(String): """The position of the download bar.""" - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__(none_ok=none_ok) self.valid_values = ValidValues('top', 'bottom') @@ -1633,9 +1714,12 @@ class Url(BaseType): """A URL as a string.""" - def to_py(self, value): + def to_py( + self, + value: _StrUnset + ) -> typing.Union[configutils.Unset, None, QUrl]: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1651,9 +1735,9 @@ class SessionName(BaseType): """The name of a session.""" - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1672,7 +1756,7 @@ class SelectOnRemove(MappingType): 'last-used': QTabBar.SelectPreviousTab, } - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__( none_ok, valid_values=ValidValues( @@ -1690,7 +1774,7 @@ class ConfirmQuit(FlagList): # Values that can be combined with commas combinable_values = ('multiple-tabs', 'downloads') - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__(none_ok) self.valtype.none_ok = none_ok self.valtype.valid_values = ValidValues( @@ -1701,9 +1785,12 @@ class ConfirmQuit(FlagList): "downloads are running"), ('never', "Never show a confirmation.")) - def to_py(self, value): + def to_py( + self, + value: typing.Union[configutils.Unset, typing.List], + ) -> typing.Union[typing.List, configutils.Unset]: values = super().to_py(value) - if values is configutils.UNSET: + if isinstance(values, configutils.Unset): return values elif not values: return [] @@ -1724,7 +1811,7 @@ class NewTabPosition(String): """How new tabs are positioned.""" - def __init__(self, none_ok=False): + def __init__(self, none_ok: bool = False) -> None: super().__init__(none_ok=none_ok) self.valid_values = ValidValues( ('prev', "Before the current tab."), @@ -1740,9 +1827,9 @@ class TimestampTemplate(BaseType): See https://sqlite.org/lang_datefunc.html for reference. """ - def to_py(self, value): + def to_py(self, value: _StrUnset) -> _StrUnsetNone: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1762,13 +1849,16 @@ class Key(BaseType): """A name of a key.""" - def from_obj(self, value): + def from_obj(self, value: str) -> str: """Make sure key sequences are always normalized.""" return str(keyutils.KeySequence.parse(value)) - def to_py(self, value): + def to_py( + self, + value: _StrUnset + ) -> typing.Union[configutils.Unset, None, keyutils.KeySequence]: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None @@ -1787,9 +1877,12 @@ class UrlPattern(BaseType): syntax. """ - def to_py(self, value): + def to_py( + self, + value: _StrUnset + ) -> typing.Union[configutils.Unset, None, urlmatch.UrlPattern]: self._basic_py_validation(value, str) - if value is configutils.UNSET: + if isinstance(value, configutils.Unset): return value elif not value: return None diff --git a/qutebrowser/config/configutils.py b/qutebrowser/config/configutils.py index efdc5611e..47cac4bff 100644 --- a/qutebrowser/config/configutils.py +++ b/qutebrowser/config/configutils.py @@ -35,7 +35,7 @@ if MYPY: from qutebrowser.config import configdata -class _UnsetObject: +class Unset: """Sentinel object.""" @@ -45,7 +45,7 @@ class _UnsetObject: return '' -UNSET = _UnsetObject() +UNSET = Unset() @attr.s diff --git a/tests/unit/config/test_configtypes.py b/tests/unit/config/test_configtypes.py index a9a61e952..76bdb9199 100644 --- a/tests/unit/config/test_configtypes.py +++ b/tests/unit/config/test_configtypes.py @@ -1542,7 +1542,7 @@ class TestRegex: regex.to_py('foo') @pytest.mark.parametrize('flags, expected', [ - (0, 0), + (None, 0), ('IGNORECASE', re.IGNORECASE), ('IGNORECASE | VERBOSE', re.IGNORECASE | re.VERBOSE), ]) diff --git a/tests/unit/config/test_configutils.py b/tests/unit/config/test_configutils.py index 587a0bd68..e8a7bfb38 100644 --- a/tests/unit/config/test_configutils.py +++ b/tests/unit/config/test_configutils.py @@ -26,7 +26,7 @@ from qutebrowser.utils import urlmatch def test_unset_object_identity(): - assert configutils._UnsetObject() is not configutils._UnsetObject() + assert configutils.Unset() is not configutils.Unset() assert configutils.UNSET is configutils.UNSET From a9c1fc665fa54c28bfd6dfc51df0ce7849d382a6 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 5 Dec 2018 16:57:09 +0100 Subject: [PATCH 277/492] Fix configtypes.Perc.to_str() If we used an int/float in config.py for a Perc value (e.g. zoom.default), to_str() returned int/float instead of str, causing qWarnings and bugs. --- qutebrowser/config/configtypes.py | 5 ++++- tests/unit/config/test_configtypes.py | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/qutebrowser/config/configtypes.py b/qutebrowser/config/configtypes.py index 61dba365e..3f134f770 100644 --- a/qutebrowser/config/configtypes.py +++ b/qutebrowser/config/configtypes.py @@ -847,7 +847,10 @@ class Perc(_Numeric): def to_str(self, value: typing.Union[None, float, int, str]) -> str: if value is None: return '' - return value + elif isinstance(value, str): + return value + else: + return '{}%'.format(value) class PercOrInt(_Numeric): diff --git a/tests/unit/config/test_configtypes.py b/tests/unit/config/test_configtypes.py index 76bdb9199..ef41e5d75 100644 --- a/tests/unit/config/test_configtypes.py +++ b/tests/unit/config/test_configtypes.py @@ -1113,8 +1113,13 @@ class TestPerc: with pytest.raises(configexc.ValidationError): klass(**kwargs).to_py(val) - def test_to_str(self, klass): - assert klass().to_str('42%') == '42%' + @pytest.mark.parametrize('value, expected', [ + ('42%', '42%'), + (42, '42%'), + (42.5, '42.5%'), + ]) + def test_to_str(self, klass, value, expected): + assert klass().to_str(value) == expected class TestPercOrInt: From 7bddb7867bb88a791da356bc6c81faa95994017b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 5 Dec 2018 17:23:09 +0100 Subject: [PATCH 278/492] Add missing test for configtypes.Key --- tests/unit/config/test_configtypes.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/unit/config/test_configtypes.py b/tests/unit/config/test_configtypes.py index ef41e5d75..b0b85d997 100644 --- a/tests/unit/config/test_configtypes.py +++ b/tests/unit/config/test_configtypes.py @@ -2123,6 +2123,9 @@ class TestKey: with pytest.raises(configexc.ValidationError): klass().to_py(val) + def test_normalized(self, klass): + assert klass().from_obj('') == '' + class TestUrlPattern: From b9cb98a5ef282497fc11e70ad428e056b7886d12 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 5 Dec 2018 17:48:56 +0100 Subject: [PATCH 279/492] mypy: Add types for config.websettings --- mypy.ini | 38 +------------------------------ qutebrowser/config/websettings.py | 31 +++++++++++++------------ 2 files changed, 18 insertions(+), 51 deletions(-) diff --git a/mypy.ini b/mypy.ini index 2e1d50558..4526e4e48 100644 --- a/mypy.ini +++ b/mypy.ini @@ -62,43 +62,7 @@ disallow_incomplete_defs = True disallow_untyped_defs = True disallow_incomplete_defs = True -[mypy-qutebrowser.config.config] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configcache] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configcommands] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configdata] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configdiff] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configexc] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configfiles] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configinit] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configutils] -disallow_untyped_defs = True -disallow_incomplete_defs = True - -[mypy-qutebrowser.config.configtypes] +[mypy-qutebrowser.config.*] disallow_untyped_defs = True disallow_incomplete_defs = True diff --git a/qutebrowser/config/websettings.py b/qutebrowser/config/websettings.py index e6d19db7e..5a21af7e3 100644 --- a/qutebrowser/config/websettings.py +++ b/qutebrowser/config/websettings.py @@ -19,8 +19,10 @@ """Bridge from QWeb(Engine)Settings to our own settings.""" -import typing # pylint: disable=unused-import +import typing +import argparse +from PyQt5.QtCore import QUrl from PyQt5.QtGui import QFont from qutebrowser.config import config, configutils @@ -34,7 +36,8 @@ class AttributeInfo: """Info about a settings attribute.""" - def __init__(self, *attributes, converter=None): + def __init__(self, *attributes: typing.Any, + converter: typing.Callable = None) -> None: self.attributes = attributes if converter is None: self.converter = lambda val: val @@ -51,10 +54,10 @@ class AbstractSettings: _FONT_FAMILIES = {} # type: typing.Dict[str, typing.Any] _FONT_TO_QFONT = {} # type: typing.Dict[typing.Any, QFont.StyleHint] - def __init__(self, settings): + def __init__(self, settings: typing.Any) -> None: self._settings = settings - def set_attribute(self, name, value): + def set_attribute(self, name: str, value: typing.Any) -> bool: """Set the given QWebSettings/QWebEngineSettings attribute. If the value is configutils.UNSET, the value is reset instead. @@ -75,7 +78,7 @@ class AbstractSettings: return old_value != new_value - def test_attribute(self, name): + def test_attribute(self, name: str) -> bool: """Get the value for the given attribute. If the setting resolves to a list of attributes, only the first @@ -84,7 +87,7 @@ class AbstractSettings: info = self._ATTRIBUTES[name] return self._settings.testAttribute(info.attributes[0]) - def set_font_size(self, name, value): + def set_font_size(self, name: str, value: int) -> bool: """Set the given QWebSettings/QWebEngineSettings font size. Return: @@ -96,7 +99,7 @@ class AbstractSettings: self._settings.setFontSize(family, value) return old_value != value - def set_font_family(self, name, value): + def set_font_family(self, name: str, value: typing.Optional[str]) -> bool: """Set the given QWebSettings/QWebEngineSettings font family. With None (the default), QFont is used to get the default font for the @@ -117,7 +120,7 @@ class AbstractSettings: return value != old_value - def set_default_text_encoding(self, encoding): + def set_default_text_encoding(self, encoding: str) -> bool: """Set the default text encoding to use. Return: @@ -128,7 +131,7 @@ class AbstractSettings: self._settings.setDefaultTextEncoding(encoding) return old_value != encoding - def _update_setting(self, setting, value): + def _update_setting(self, setting: str, value: typing.Any) -> bool: """Update the given setting/value. Unknown settings are ignored. @@ -146,12 +149,12 @@ class AbstractSettings: return self.set_default_text_encoding(value) return False - def update_setting(self, setting): + def update_setting(self, setting: str) -> None: """Update the given setting.""" value = config.instance.get(setting) self._update_setting(setting, value) - def update_for_url(self, url): + def update_for_url(self, url: QUrl) -> typing.Set[str]: """Update settings customized for the given tab. Return: @@ -173,14 +176,14 @@ class AbstractSettings: return changed_settings - def init_settings(self): + def init_settings(self) -> None: """Set all supported settings correctly.""" for setting in (list(self._ATTRIBUTES) + list(self._FONT_SIZES) + list(self._FONT_FAMILIES)): self.update_setting(setting) -def init(args): +def init(args: argparse.Namespace) -> None: """Initialize all QWeb(Engine)Settings.""" if objects.backend == usertypes.Backend.QtWebEngine: from qutebrowser.browser.webengine import webenginesettings @@ -195,7 +198,7 @@ def init(args): pattern=urlmatch.UrlPattern(pattern)) -def shutdown(): +def shutdown() -> None: """Shut down QWeb(Engine)Settings.""" if objects.backend == usertypes.Backend.QtWebEngine: from qutebrowser.browser.webengine import webenginesettings From fe75ee146904c6f8c1020eb40b39734a5d8cadd2 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 5 Dec 2018 18:28:34 +0100 Subject: [PATCH 280/492] Mark "Using JS after window.open" as flaky --- tests/end2end/features/javascript.feature | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/end2end/features/javascript.feature b/tests/end2end/features/javascript.feature index 9f0d2f14b..e4b477e50 100644 --- a/tests/end2end/features/javascript.feature +++ b/tests/end2end/features/javascript.feature @@ -188,6 +188,7 @@ Feature: Javascript stuff And I open 500 without waiting Then "Showing error page for* 500" should be logged + @flaky Scenario: Using JS after window.open When I open data/hello.txt And I set content.javascript.can_open_tabs_automatically to true From d505ed9fa2c3b3bb056a400055a07765aefd57d4 Mon Sep 17 00:00:00 2001 From: Daniel Santana Date: Fri, 7 Dec 2018 12:25:47 -0200 Subject: [PATCH 281/492] Use POSIX shell instead of bash on scripts/open_url_in_instance.sh --- scripts/open_url_in_instance.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/open_url_in_instance.sh b/scripts/open_url_in_instance.sh index a6ce0ed91..ec2a5a26d 100755 --- a/scripts/open_url_in_instance.sh +++ b/scripts/open_url_in_instance.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # initial idea: Florian Bruhin (The-Compiler) # author: Thore Bödecker (foxxx0) From 296e6816ee015aebeffa0e593f640fc609fda724 Mon Sep 17 00:00:00 2001 From: Maurits van Altvorst Date: Sat, 8 Dec 2018 22:37:33 +0100 Subject: [PATCH 282/492] Remove outdated X-Do-Not-Track --- qutebrowser/browser/shared.py | 1 - 1 file changed, 1 deletion(-) diff --git a/qutebrowser/browser/shared.py b/qutebrowser/browser/shared.py index 0bf3301f9..92130be65 100644 --- a/qutebrowser/browser/shared.py +++ b/qutebrowser/browser/shared.py @@ -42,7 +42,6 @@ def custom_headers(url): if dnt_config is not None: dnt = b'1' if dnt_config else b'0' headers[b'DNT'] = dnt - headers[b'X-Do-Not-Track'] = dnt conf_headers = config.instance.get('content.headers.custom', url=url) for header, value in conf_headers.items(): From f5b5aa70ed96e52260f421ae516433241756a2de Mon Sep 17 00:00:00 2001 From: Maurits van Altvorst Date: Sun, 9 Dec 2018 11:15:29 +0100 Subject: [PATCH 283/492] Edit tests --- tests/end2end/features/misc.feature | 6 +++--- tests/unit/browser/test_shared.py | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/end2end/features/misc.feature b/tests/end2end/features/misc.feature index b9677a158..5061a948d 100644 --- a/tests/end2end/features/misc.feature +++ b/tests/end2end/features/misc.feature @@ -331,19 +331,19 @@ Feature: Various utility commands. When I set content.headers.do_not_track to true And I open headers Then the header Dnt should be set to 1 - And the header X-Do-Not-Track should be set to 1 + And the header Do-Not-Track should be set to 1 Scenario: DNT header (off) When I set content.headers.do_not_track to false And I open headers Then the header Dnt should be set to 0 - And the header X-Do-Not-Track should be set to 0 + And the header Do-Not-Track should be set to 0 Scenario: DNT header (unset) When I set content.headers.do_not_track to And I open headers Then the header Dnt should be set to - And the header X-Do-Not-Track should be set to + And the header Do-Not-Track should be set to Scenario: Accept-Language header When I set content.headers.accept_language to en,de diff --git a/tests/unit/browser/test_shared.py b/tests/unit/browser/test_shared.py index 78302d8c1..b855f33ae 100644 --- a/tests/unit/browser/test_shared.py +++ b/tests/unit/browser/test_shared.py @@ -26,18 +26,18 @@ from qutebrowser.browser import shared @pytest.mark.parametrize('dnt, accept_language, custom_headers, expected', [ # DNT - (True, None, {}, {b'DNT': b'1', b'X-Do-Not-Track': b'1'}), - (False, None, {}, {b'DNT': b'0', b'X-Do-Not-Track': b'0'}), + (True, None, {}, {b'DNT': b'1', b'Do-Not-Track': b'1'}), + (False, None, {}, {b'DNT': b'0', b'Do-Not-Track': b'0'}), (None, None, {}, {}), # Accept-Language - (False, 'de, en', {}, {b'DNT': b'0', b'X-Do-Not-Track': b'0', + (False, 'de, en', {}, {b'DNT': b'0', b'Do-Not-Track': b'0', b'Accept-Language': b'de, en'}), # Custom headers - (False, None, {'X-Qute': 'yes'}, {b'DNT': b'0', b'X-Do-Not-Track': b'0', + (False, None, {'X-Qute': 'yes'}, {b'DNT': b'0', b'Do-Not-Track': b'0', b'X-Qute': b'yes'}), # Mixed (False, 'de, en', {'X-Qute': 'yes'}, {b'DNT': b'0', - b'X-Do-Not-Track': b'0', + b'Do-Not-Track': b'0', b'Accept-Language': b'de, en', b'X-Qute': b'yes'}), ]) From c93bb0c1beca131f01f2999ca72259f4c3d185c3 Mon Sep 17 00:00:00 2001 From: Maurits van Altvorst Date: Sun, 9 Dec 2018 14:42:34 +0100 Subject: [PATCH 284/492] Remove Do-Not-Track header, use DNT header instead --- tests/end2end/features/misc.feature | 10 ++++------ tests/unit/browser/test_shared.py | 9 ++++----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/tests/end2end/features/misc.feature b/tests/end2end/features/misc.feature index 5061a948d..bc94f8862 100644 --- a/tests/end2end/features/misc.feature +++ b/tests/end2end/features/misc.feature @@ -330,20 +330,18 @@ Feature: Various utility commands. Scenario: DNT header When I set content.headers.do_not_track to true And I open headers - Then the header Dnt should be set to 1 - And the header Do-Not-Track should be set to 1 + Then the header DNT should be set to 1 + And the header DNT should be set to 1 Scenario: DNT header (off) When I set content.headers.do_not_track to false And I open headers - Then the header Dnt should be set to 0 - And the header Do-Not-Track should be set to 0 + Then the header DNT should be set to 0 Scenario: DNT header (unset) When I set content.headers.do_not_track to And I open headers - Then the header Dnt should be set to - And the header Do-Not-Track should be set to + Then the header DNT should be set to Scenario: Accept-Language header When I set content.headers.accept_language to en,de diff --git a/tests/unit/browser/test_shared.py b/tests/unit/browser/test_shared.py index b855f33ae..fe57e8e6a 100644 --- a/tests/unit/browser/test_shared.py +++ b/tests/unit/browser/test_shared.py @@ -26,18 +26,17 @@ from qutebrowser.browser import shared @pytest.mark.parametrize('dnt, accept_language, custom_headers, expected', [ # DNT - (True, None, {}, {b'DNT': b'1', b'Do-Not-Track': b'1'}), - (False, None, {}, {b'DNT': b'0', b'Do-Not-Track': b'0'}), + (True, None, {}, {b'DNT': b'1'}), + (False, None, {}, {b'DNT': b'0'}), (None, None, {}, {}), # Accept-Language - (False, 'de, en', {}, {b'DNT': b'0', b'Do-Not-Track': b'0', + (False, 'de, en', {}, {b'DNT': b'0', b'Accept-Language': b'de, en'}), # Custom headers - (False, None, {'X-Qute': 'yes'}, {b'DNT': b'0', b'Do-Not-Track': b'0', + (False, None, {'X-Qute': 'yes'}, {b'DNT': b'0', b'X-Qute': b'yes'}), # Mixed (False, 'de, en', {'X-Qute': 'yes'}, {b'DNT': b'0', - b'Do-Not-Track': b'0', b'Accept-Language': b'de, en', b'X-Qute': b'yes'}), ]) From e203f184114f98c1c9e560875cb87f5aa60f9134 Mon Sep 17 00:00:00 2001 From: Maurits van Altvorst Date: Sun, 9 Dec 2018 14:43:54 +0100 Subject: [PATCH 285/492] Remove redundant line --- tests/end2end/features/misc.feature | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/end2end/features/misc.feature b/tests/end2end/features/misc.feature index bc94f8862..83d5f4731 100644 --- a/tests/end2end/features/misc.feature +++ b/tests/end2end/features/misc.feature @@ -331,7 +331,6 @@ Feature: Various utility commands. When I set content.headers.do_not_track to true And I open headers Then the header DNT should be set to 1 - And the header DNT should be set to 1 Scenario: DNT header (off) When I set content.headers.do_not_track to false From 735e6123cde46691d2d3d42cda8d8ec4618d9760 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 12:34:59 +0100 Subject: [PATCH 286/492] Fix lint --- qutebrowser/config/configdata.py | 2 +- qutebrowser/javascript/caret.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index c93032387..61e35fd53 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -25,7 +25,7 @@ DATA: A dict of Option objects after init() has been called. """ import typing -from typing import Optional # pylint: disable=unused-import +from typing import Optional # pylint: disable=unused-import,useless-suppression import functools import attr diff --git a/qutebrowser/javascript/caret.js b/qutebrowser/javascript/caret.js index 28ab3fab0..5e6640311 100644 --- a/qutebrowser/javascript/caret.js +++ b/qutebrowser/javascript/caret.js @@ -1,5 +1,5 @@ /* eslint-disable max-len, max-statements, complexity, -default-case, valid-jsdoc */ +default-case */ // Copyright 2014 The Chromium Authors. All rights reserved. // From 411c5171a24b7c83829d6456d6a3c89b31bd6693 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 09:38:23 +0100 Subject: [PATCH 287/492] Load components dynamically --- qutebrowser/app.py | 4 ++-- qutebrowser/extensions/__init__.py | 0 qutebrowser/extensions/loader.py | 35 ++++++++++++++++++++++++++++++ qutebrowser/utils/log.py | 3 ++- scripts/dev/run_vulture.py | 3 +++ scripts/dev/src2asciidoc.py | 2 ++ 6 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 qutebrowser/extensions/__init__.py create mode 100644 qutebrowser/extensions/loader.py diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 6c948e10c..65c7395eb 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -68,6 +68,7 @@ from qutebrowser.browser import (urlmarks, adblock, history, browsertab, from qutebrowser.browser.network import proxy from qutebrowser.browser.webkit import cookies, cache from qutebrowser.browser.webkit.network import networkmanager +from qutebrowser.extensions import loader from qutebrowser.keyinput import macros from qutebrowser.mainwindow import mainwindow, prompt from qutebrowser.misc import (readline, ipc, savemanager, sessions, @@ -77,8 +78,6 @@ from qutebrowser.utils import (log, version, message, utils, urlutils, objreg, usertypes, standarddir, error, qtutils) # pylint: disable=unused-import # We import those to run the cmdutils.register decorators. -from qutebrowser.components import (scrollcommands, caretcommands, - zoomcommands, misccommands) from qutebrowser.mainwindow.statusbar import command from qutebrowser.misc import utilcmds # pylint: enable=unused-import @@ -166,6 +165,7 @@ def init(args, crash_handler): qApp.setQuitOnLastWindowClosed(False) _init_icon() + loader.load_components() try: _init_modules(args, crash_handler) except (OSError, UnicodeDecodeError, browsertab.WebTabError) as e: diff --git a/qutebrowser/extensions/__init__.py b/qutebrowser/extensions/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py new file mode 100644 index 000000000..9b5aadd25 --- /dev/null +++ b/qutebrowser/extensions/loader.py @@ -0,0 +1,35 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Loader for qutebrowser extensions.""" + +import pkgutil + +from qutebrowser import components +from qutebrowser.utils import log + + +def load_components() -> None: + """Load everything from qutebrowser.components.""" + for info in pkgutil.walk_packages(components.__path__): + if info.ispkg: + continue + log.extensions.debug("Importing {}".format(info.name)) + loader = info.module_finder.find_module(info.name) + loader.load_module(info.name) diff --git a/qutebrowser/utils/log.py b/qutebrowser/utils/log.py index bbc025515..115c53352 100644 --- a/qutebrowser/utils/log.py +++ b/qutebrowser/utils/log.py @@ -137,6 +137,7 @@ prompt = logging.getLogger('prompt') network = logging.getLogger('network') sql = logging.getLogger('sql') greasemonkey = logging.getLogger('greasemonkey') +extensions = logging.getLogger('extensions') LOGGER_NAMES = [ 'statusbar', 'completion', 'init', 'url', @@ -146,7 +147,7 @@ LOGGER_NAMES = [ 'js', 'qt', 'rfc6266', 'ipc', 'shlexer', 'save', 'message', 'config', 'sessions', 'webelem', 'prompt', 'network', 'sql', - 'greasemonkey' + 'greasemonkey', 'extensions', ] diff --git a/scripts/dev/run_vulture.py b/scripts/dev/run_vulture.py index f3217694e..7874f6a79 100755 --- a/scripts/dev/run_vulture.py +++ b/scripts/dev/run_vulture.py @@ -30,6 +30,7 @@ import argparse import vulture import qutebrowser.app # pylint: disable=unused-import +from qutebrowser.extensions import loader from qutebrowser.misc import objects from qutebrowser.utils import utils from qutebrowser.browser.webkit import rfc6266 @@ -43,6 +44,8 @@ from qutebrowser.config import configtypes def whitelist_generator(): # noqa """Generator which yields lines to add to a vulture whitelist.""" + loader.load_components() + # qutebrowser commands for cmd in objects.commands.values(): yield utils.qualname(cmd.handler) diff --git a/scripts/dev/src2asciidoc.py b/scripts/dev/src2asciidoc.py index ba4e9b69c..f0536c045 100755 --- a/scripts/dev/src2asciidoc.py +++ b/scripts/dev/src2asciidoc.py @@ -35,6 +35,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, # We import qutebrowser.app so all @cmdutils-register decorators are run. import qutebrowser.app from qutebrowser import qutebrowser, commands +from qutebrowser.extensions import loader from qutebrowser.commands import argparser from qutebrowser.config import configdata, configtypes from qutebrowser.utils import docutils, usertypes @@ -549,6 +550,7 @@ def regenerate_cheatsheet(): def main(): """Regenerate all documentation.""" utils.change_cwd() + loader.load_components() print("Generating manpage...") regenerate_manpage('doc/qutebrowser.1.asciidoc') print("Generating settings help...") From fcb39c1d7f41e4067980f8eeb4276c209c5033ce Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 10:06:07 +0100 Subject: [PATCH 288/492] Add types to extensions.loader --- mypy.ini | 4 ++++ qutebrowser/extensions/loader.py | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/mypy.ini b/mypy.ini index 4526e4e48..8fb8d89ae 100644 --- a/mypy.ini +++ b/mypy.ini @@ -73,3 +73,7 @@ disallow_incomplete_defs = True [mypy-qutebrowser.components.*] disallow_untyped_defs = True disallow_incomplete_defs = True + +[mypy-qutebrowser.extensions.*] +disallow_untyped_defs = True +disallow_incomplete_defs = True diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 9b5aadd25..9674ad707 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -19,7 +19,9 @@ """Loader for qutebrowser extensions.""" +import importlib.abc import pkgutil +import types from qutebrowser import components from qutebrowser.utils import log @@ -27,9 +29,15 @@ from qutebrowser.utils import log def load_components() -> None: """Load everything from qutebrowser.components.""" - for info in pkgutil.walk_packages(components.__path__): - if info.ispkg: + for finder, name, ispkg in pkgutil.walk_packages(components.__path__): + if ispkg: continue - log.extensions.debug("Importing {}".format(info.name)) - loader = info.module_finder.find_module(info.name) - loader.load_module(info.name) + _load_module(finder, name) + + +def _load_module(finder: importlib.abc.PathEntryFinder, + name: str) -> types.ModuleType: + log.extensions.debug("Importing {}".format(name)) + loader = finder.find_module(name) + assert loader is not None + return loader.load_module(name) From 15e9127fa08c0348aae4fdcc3080f55110a16615 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 10:26:25 +0100 Subject: [PATCH 289/492] Add components to pyinstaller hiddenimports --- misc/qutebrowser.spec | 11 ++++++++++- qutebrowser/extensions/loader.py | 27 +++++++++++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/misc/qutebrowser.spec b/misc/qutebrowser.spec index ff1b10577..b40172754 100644 --- a/misc/qutebrowser.spec +++ b/misc/qutebrowser.spec @@ -6,6 +6,8 @@ import os sys.path.insert(0, os.getcwd()) from scripts import setupcommon +from qutebrowser.extensions import loader + block_cipher = None @@ -27,6 +29,13 @@ def get_data_files(): return data_files +def get_hidden_imports(): + imports = ['PyQt5.QtOpenGL', 'PyQt5._QOpenGLFunctions_2_0'] + for info in loader.walk_components(): + imports.append('qutebrowser.components.' + info.name) + return imports + + setupcommon.write_git_file() @@ -42,7 +51,7 @@ a = Analysis(['../qutebrowser/__main__.py'], pathex=['misc'], binaries=None, datas=get_data_files(), - hiddenimports=['PyQt5.QtOpenGL', 'PyQt5._QOpenGLFunctions_2_0'], + hiddenimports=get_hidden_imports(), hookspath=[], runtime_hooks=[], excludes=['tkinter'], diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 9674ad707..d6fdc675e 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -22,22 +22,37 @@ import importlib.abc import pkgutil import types +import typing + +import attr from qutebrowser import components from qutebrowser.utils import log +@attr.s +class ComponentInfo: + + name = attr.ib() # type: str + finder = attr.ib() # type: importlib.abc.PathEntryFinder + + def load_components() -> None: """Load everything from qutebrowser.components.""" + for info in walk_components(): + _load_component(info) + + +def walk_components() -> typing.Iterator[ComponentInfo]: + """Yield ComponentInfo objects for all modules.""" for finder, name, ispkg in pkgutil.walk_packages(components.__path__): if ispkg: continue - _load_module(finder, name) + yield ComponentInfo(name=name, finder=finder) -def _load_module(finder: importlib.abc.PathEntryFinder, - name: str) -> types.ModuleType: - log.extensions.debug("Importing {}".format(name)) - loader = finder.find_module(name) +def _load_component(info: ComponentInfo) -> types.ModuleType: + log.extensions.debug("Importing {}".format(info.name)) + loader = info.finder.find_module(info.name) assert loader is not None - return loader.load_module(name) + return loader.load_module(info.name) From 6bc771151fc7f6b67fb996697cec4443d467d0e8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 11:19:37 +0100 Subject: [PATCH 290/492] Make walking components work for PyInstaller Closes https://github.com/qutebrowser/qutebrowser-extensions/issues/5 --- qutebrowser/extensions/loader.py | 33 ++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index d6fdc675e..d7f9b2533 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -23,6 +23,7 @@ import importlib.abc import pkgutil import types import typing +import sys import attr @@ -34,7 +35,6 @@ from qutebrowser.utils import log class ComponentInfo: name = attr.ib() # type: str - finder = attr.ib() # type: importlib.abc.PathEntryFinder def load_components() -> None: @@ -45,14 +45,35 @@ def load_components() -> None: def walk_components() -> typing.Iterator[ComponentInfo]: """Yield ComponentInfo objects for all modules.""" - for finder, name, ispkg in pkgutil.walk_packages(components.__path__): + if hasattr(sys, 'frozen'): + yield from _walk_pyinstaller() + else: + yield from _walk_normal() + + +def _walk_normal() -> typing.Iterator[ComponentInfo]: + """Walk extensions when not using PyInstaller.""" + for _finder, name, ispkg in pkgutil.walk_packages(components.__path__): if ispkg: continue - yield ComponentInfo(name=name, finder=finder) + fullname = components.__name__ + '.' + name + yield ComponentInfo(name=fullname) + + +def _walk_pyinstaller() -> typing.Iterator[ComponentInfo]: + """Walk extensions when using PyInstaller. + + See https://github.com/pyinstaller/pyinstaller/issues/1905 + """ + toc = set() + for importer in pkgutil.iter_importers('qutebrowser'): + if hasattr(importer, 'toc'): + toc |= importer.toc + for name in toc: + if name.startswith(components.__name__ + '.'): + yield ComponentInfo(name=name) def _load_component(info: ComponentInfo) -> types.ModuleType: log.extensions.debug("Importing {}".format(info.name)) - loader = info.finder.find_module(info.name) - assert loader is not None - return loader.load_module(info.name) + return importlib.import_module(info.name) From bb115afc1a77fba01131a7fd447cd0a4471565f6 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 11:41:37 +0100 Subject: [PATCH 291/492] Make sure we always yield full names --- misc/qutebrowser.spec | 2 +- qutebrowser/extensions/loader.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/misc/qutebrowser.spec b/misc/qutebrowser.spec index b40172754..269668751 100644 --- a/misc/qutebrowser.spec +++ b/misc/qutebrowser.spec @@ -32,7 +32,7 @@ def get_data_files(): def get_hidden_imports(): imports = ['PyQt5.QtOpenGL', 'PyQt5._QOpenGLFunctions_2_0'] for info in loader.walk_components(): - imports.append('qutebrowser.components.' + info.name) + imports.append(info.name) return imports diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index d7f9b2533..2679e89dc 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -51,13 +51,19 @@ def walk_components() -> typing.Iterator[ComponentInfo]: yield from _walk_normal() +def _walk_error(name: str): + raise ImportError("Failed to import {}".format(name)) + + def _walk_normal() -> typing.Iterator[ComponentInfo]: """Walk extensions when not using PyInstaller.""" - for _finder, name, ispkg in pkgutil.walk_packages(components.__path__): + for _finder, name, ispkg in pkgutil.walk_packages( + path=components.__path__, + prefix=components.__name__ + '.', + onerror=_walk_error): if ispkg: continue - fullname = components.__name__ + '.' + name - yield ComponentInfo(name=fullname) + yield ComponentInfo(name=name) def _walk_pyinstaller() -> typing.Iterator[ComponentInfo]: From 38c4ef3623fd271aaa6708852af577d819cd1803 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 11:51:26 +0100 Subject: [PATCH 292/492] Fix lint --- qutebrowser/extensions/loader.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 2679e89dc..b2481b969 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -32,7 +32,9 @@ from qutebrowser.utils import log @attr.s -class ComponentInfo: +class ExtensionInfo: + + """Information about a qutebrowser extension.""" name = attr.ib() # type: str @@ -43,43 +45,48 @@ def load_components() -> None: _load_component(info) -def walk_components() -> typing.Iterator[ComponentInfo]: - """Yield ComponentInfo objects for all modules.""" +def walk_components() -> typing.Iterator[ExtensionInfo]: + """Yield ExtensionInfo objects for all modules.""" if hasattr(sys, 'frozen'): yield from _walk_pyinstaller() else: yield from _walk_normal() -def _walk_error(name: str): +def _on_walk_error(name: str) -> None: raise ImportError("Failed to import {}".format(name)) -def _walk_normal() -> typing.Iterator[ComponentInfo]: +def _walk_normal() -> typing.Iterator[ExtensionInfo]: """Walk extensions when not using PyInstaller.""" for _finder, name, ispkg in pkgutil.walk_packages( - path=components.__path__, + # Only packages have a __path__ attribute, + # but we're sure this is one. + path=components.__path__, # type: ignore prefix=components.__name__ + '.', - onerror=_walk_error): + onerror=_on_walk_error): if ispkg: continue - yield ComponentInfo(name=name) + yield ExtensionInfo(name=name) -def _walk_pyinstaller() -> typing.Iterator[ComponentInfo]: +def _walk_pyinstaller() -> typing.Iterator[ExtensionInfo]: """Walk extensions when using PyInstaller. See https://github.com/pyinstaller/pyinstaller/issues/1905 + + Inspired by: + https://github.com/webcomics/dosage/blob/master/dosagelib/loader.py """ - toc = set() + toc = set() # type: typing.Set[str] for importer in pkgutil.iter_importers('qutebrowser'): if hasattr(importer, 'toc'): toc |= importer.toc for name in toc: if name.startswith(components.__name__ + '.'): - yield ComponentInfo(name=name) + yield ExtensionInfo(name=name) -def _load_component(info: ComponentInfo) -> types.ModuleType: +def _load_component(info: ExtensionInfo) -> types.ModuleType: log.extensions.debug("Importing {}".format(info.name)) return importlib.import_module(info.name) From ec5a93a80dea06fed31f8779c837800658f8bb59 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 12:15:10 +0100 Subject: [PATCH 293/492] Add tests for extensions.loader --- tests/unit/extensions/test_loader.py | 49 ++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 tests/unit/extensions/test_loader.py diff --git a/tests/unit/extensions/test_loader.py b/tests/unit/extensions/test_loader.py new file mode 100644 index 000000000..e0c1912fa --- /dev/null +++ b/tests/unit/extensions/test_loader.py @@ -0,0 +1,49 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +import pytest + +from qutebrowser.extensions import loader +from qutebrowser.misc import objects + + +def test_on_walk_error(): + with pytest.raises(ImportError, match='Failed to import foo'): + loader._on_walk_error('foo') + + +def test_walk_normal(): + names = [info.name for info in loader._walk_normal()] + assert 'qutebrowser.components.scrollcommands' in names + + +def test_walk_pyinstaller(): + # We can't test whether we get something back without being frozen by + # PyInstaller, but at least we can test that we don't crash. + list(loader._walk_pyinstaller()) + + +def test_load_component(monkeypatch): + monkeypatch.setattr(objects, 'commands', {}) + + info = loader.ExtensionInfo(name='qutebrowser.components.scrollcommands') + module = loader._load_component(info) + + assert hasattr(module, 'scroll_to_perc') + assert 'scroll-to-perc' in objects.commands From 5b354164c5c4fbf6af1d58c185c7cd0510aedcbc Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 12:30:47 +0100 Subject: [PATCH 294/492] Make it possible for extensions to define init hooks --- qutebrowser/api/apitypes.py | 1 + qutebrowser/api/hook.py | 35 +++++++++++++++++++++++++ qutebrowser/components/__init__.py | 2 +- qutebrowser/components/caretcommands.py | 2 +- qutebrowser/extensions/loader.py | 35 ++++++++++++++++++++++++- 5 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 qutebrowser/api/hook.py diff --git a/qutebrowser/api/apitypes.py b/qutebrowser/api/apitypes.py index 9fec0a6cb..8fbc1a9a7 100644 --- a/qutebrowser/api/apitypes.py +++ b/qutebrowser/api/apitypes.py @@ -24,3 +24,4 @@ from qutebrowser.browser.browsertab import WebTabError, AbstractTab as Tab from qutebrowser.browser.webelem import (Error as WebElemError, AbstractWebElement as WebElement) from qutebrowser.utils.usertypes import ClickTarget, JsWorld +from qutebrowser.extensions.loader import InitContext diff --git a/qutebrowser/api/hook.py b/qutebrowser/api/hook.py new file mode 100644 index 000000000..b468e91f5 --- /dev/null +++ b/qutebrowser/api/hook.py @@ -0,0 +1,35 @@ +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Hooks for extensions.""" + +import importlib +import types +import typing + + +from qutebrowser.extensions import loader + + +class init: # noqa: N801,N806 pylint: disable=invalid-name + + """Decorator to mark a function to run when initializing.""" + + def __call__(self, func: typing.Callable) -> typing.Callable: + module = importlib.import_module(func.__module__) + info = loader.add_module_info(module) + info.init_hook = func diff --git a/qutebrowser/components/__init__.py b/qutebrowser/components/__init__.py index b42c87fb6..1a13763bf 100644 --- a/qutebrowser/components/__init__.py +++ b/qutebrowser/components/__init__.py @@ -17,4 +17,4 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -"""qutebrowser "extensions" which only use the qutebrowser.API API.""" +"""qutebrowser "extensions" which only use the qutebrowser.api API.""" diff --git a/qutebrowser/components/caretcommands.py b/qutebrowser/components/caretcommands.py index 4bab6b6c6..b9ecfab7c 100644 --- a/qutebrowser/components/caretcommands.py +++ b/qutebrowser/components/caretcommands.py @@ -20,7 +20,7 @@ """Commands related to caret browsing.""" -from qutebrowser.api import cmdutils, apitypes +from qutebrowser.api import cmdutils, apitypes, hook @cmdutils.register(modes=[cmdutils.KeyMode.caret]) diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index b2481b969..f8cafa9e3 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -31,6 +31,23 @@ from qutebrowser import components from qutebrowser.utils import log +@attr.s +class InitContext: + + """Context an extension gets in its init hook.""" + + +@attr.s +class ModuleInfo: + + """Information attached to an extension module. + + This gets used by qutebrowser.api.hook. + """ + + init_hook = attr.ib(None) # type: typing.Optional[typing.Callable] + + @attr.s class ExtensionInfo: @@ -39,6 +56,13 @@ class ExtensionInfo: name = attr.ib() # type: str +def add_module_info(module: types.ModuleType) -> ModuleInfo: + """Add ModuleInfo to a module (if not added yet).""" + if not hasattr(module, '__qute_module_info'): + module.__qute_module_info = ModuleInfo() + return module.__qute_module_info + + def load_components() -> None: """Load everything from qutebrowser.components.""" for info in walk_components(): @@ -88,5 +112,14 @@ def _walk_pyinstaller() -> typing.Iterator[ExtensionInfo]: def _load_component(info: ExtensionInfo) -> types.ModuleType: + """Load the given extension and run its init hook (if any).""" log.extensions.debug("Importing {}".format(info.name)) - return importlib.import_module(info.name) + mod = importlib.import_module(info.name) + + info = add_module_info(mod) + if info.init_hook is not None: + log.extensions.debug("Running init hook {!r}" + .format(info.init_hook.__name__)) + info.init_hook(InitContext()) + + return mod From 380905854cca120d0755c4824fd3c0d2b6f8b6fe Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 12:32:09 +0100 Subject: [PATCH 295/492] Pass standarddir to modules --- qutebrowser/extensions/loader.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index f8cafa9e3..38456dcf1 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -28,7 +28,7 @@ import sys import attr from qutebrowser import components -from qutebrowser.utils import log +from qutebrowser.utils import log, standarddir @attr.s @@ -36,6 +36,8 @@ class InitContext: """Context an extension gets in its init hook.""" + data_dir = attr.ib() # type: str + @attr.s class ModuleInfo: @@ -120,6 +122,7 @@ def _load_component(info: ExtensionInfo) -> types.ModuleType: if info.init_hook is not None: log.extensions.debug("Running init hook {!r}" .format(info.init_hook.__name__)) - info.init_hook(InitContext()) + context = InitContext(data_dir=standarddir.data()) + info.init_hook(context) return mod From b1894f142869d6588b848cc2bf7dae8596b34b87 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 12:42:00 +0100 Subject: [PATCH 296/492] Fix lint --- qutebrowser/api/hook.py | 4 +++- qutebrowser/components/caretcommands.py | 2 +- qutebrowser/extensions/loader.py | 13 +++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/qutebrowser/api/hook.py b/qutebrowser/api/hook.py index b468e91f5..e7e0de88d 100644 --- a/qutebrowser/api/hook.py +++ b/qutebrowser/api/hook.py @@ -1,3 +1,5 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + # Copyright 2018 Florian Bruhin (The Compiler) # # This file is part of qutebrowser. @@ -18,7 +20,6 @@ """Hooks for extensions.""" import importlib -import types import typing @@ -33,3 +34,4 @@ class init: # noqa: N801,N806 pylint: disable=invalid-name module = importlib.import_module(func.__module__) info = loader.add_module_info(module) info.init_hook = func + return func diff --git a/qutebrowser/components/caretcommands.py b/qutebrowser/components/caretcommands.py index b9ecfab7c..4bab6b6c6 100644 --- a/qutebrowser/components/caretcommands.py +++ b/qutebrowser/components/caretcommands.py @@ -20,7 +20,7 @@ """Commands related to caret browsing.""" -from qutebrowser.api import cmdutils, apitypes, hook +from qutebrowser.api import cmdutils, apitypes @cmdutils.register(modes=[cmdutils.KeyMode.caret]) diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 38456dcf1..4f5e345c6 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -60,9 +60,10 @@ class ExtensionInfo: def add_module_info(module: types.ModuleType) -> ModuleInfo: """Add ModuleInfo to a module (if not added yet).""" + # pylint: disable=protected-access if not hasattr(module, '__qute_module_info'): - module.__qute_module_info = ModuleInfo() - return module.__qute_module_info + module.__qute_module_info = ModuleInfo() # type: ignore + return module.__qute_module_info # type: ignore def load_components() -> None: @@ -118,11 +119,11 @@ def _load_component(info: ExtensionInfo) -> types.ModuleType: log.extensions.debug("Importing {}".format(info.name)) mod = importlib.import_module(info.name) - info = add_module_info(mod) - if info.init_hook is not None: + mod_info = add_module_info(mod) + if mod_info.init_hook is not None: log.extensions.debug("Running init hook {!r}" - .format(info.init_hook.__name__)) + .format(mod_info.init_hook.__name__)) context = InitContext(data_dir=standarddir.data()) - info.init_hook(context) + mod_info.init_hook(context) return mod From 4ad579031160974952f66839f8b05d4018a8deb1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 14:08:32 +0100 Subject: [PATCH 297/492] Add API for temporary downloads Closes https://github.com/qutebrowser/qutebrowser-extensions/issues/9 --- qutebrowser/api/downloads.py | 56 ++++++++++++++++++++++++++++++++++ qutebrowser/browser/adblock.py | 9 ++---- 2 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 qutebrowser/api/downloads.py diff --git a/qutebrowser/api/downloads.py b/qutebrowser/api/downloads.py new file mode 100644 index 000000000..f743f5d7a --- /dev/null +++ b/qutebrowser/api/downloads.py @@ -0,0 +1,56 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + + +import io + +from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, QUrl + +from qutebrowser.browser import downloads, qtnetworkdownloads +from qutebrowser.utils import objreg + + +class TempDownload(QObject): + + """A download of some data into a file object.""" + + finished = pyqtSignal() + + def __init__(self, item: qtnetworkdownloads.DownloadItem) -> None: + self._item = item + self._item.finished.connect(self._on_download_finished) + self.successful = False + self.fileobj = item.fileobj + + @pyqtSlot() + def _on_download_finished(self) -> None: + self.successful = self._item.successful + self.finished.emit() + + +def download_temp(url: QUrl) -> TempDownload: + """Download the given URL into a file object. + + The download is not saved to disk. + """ + fobj = io.BytesIO() + fobj.name = 'temporary: ' + url.host() + target = downloads.FileObjDownloadTarget(fobj) + download_manager = objreg.get('qtnetwork-download-manager') + return download_manager.get(url, target=target, auto_remove=True) diff --git a/qutebrowser/browser/adblock.py b/qutebrowser/browser/adblock.py index fdec79d0f..917942b7f 100644 --- a/qutebrowser/browser/adblock.py +++ b/qutebrowser/browser/adblock.py @@ -25,7 +25,7 @@ import functools import posixpath import zipfile -from qutebrowser.browser import downloads +from qutebrowser.api import downloads from qutebrowser.config import config from qutebrowser.utils import objreg, standarddir, log, message from qutebrowser.api import cmdutils @@ -173,7 +173,6 @@ class HostBlocker: self._config_blocked_hosts) self._blocked_hosts = set() self._done_count = 0 - download_manager = objreg.get('qtnetwork-download-manager') for url in config.val.content.host_blocking.lists: if url.scheme() == 'file': filename = url.toLocalFile() @@ -184,11 +183,7 @@ class HostBlocker: else: self._import_local(filename) else: - fobj = io.BytesIO() - fobj.name = 'adblock: ' + url.host() - target = downloads.FileObjDownloadTarget(fobj) - download = download_manager.get(url, target=target, - auto_remove=True) + download = downloads.download_temp(url) self._in_progress.append(download) download.finished.connect( functools.partial(self._on_download_finished, download)) From 8806c0925e9cb4978fd66d8d9c132ff894a7c10b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 14:11:16 +0100 Subject: [PATCH 298/492] Expose data and config dir as pathlib.Path --- qutebrowser/extensions/loader.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 4f5e345c6..1aa37e4fe 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -24,6 +24,7 @@ import pkgutil import types import typing import sys +import pathlib import attr @@ -36,7 +37,8 @@ class InitContext: """Context an extension gets in its init hook.""" - data_dir = attr.ib() # type: str + data_dir = attr.ib() # type: pathlib.Path + config_dir = attr.ib() # type: pathlib.Path @attr.s @@ -114,6 +116,12 @@ def _walk_pyinstaller() -> typing.Iterator[ExtensionInfo]: yield ExtensionInfo(name=name) +def _get_init_context() -> InitContext: + """Get an InitContext object.""" + return InitContext(data_dir=pathlib.Path(standarddir.data()), + config_dir=pathlib.Path(standarddir.config())) + + def _load_component(info: ExtensionInfo) -> types.ModuleType: """Load the given extension and run its init hook (if any).""" log.extensions.debug("Importing {}".format(info.name)) @@ -123,7 +131,6 @@ def _load_component(info: ExtensionInfo) -> types.ModuleType: if mod_info.init_hook is not None: log.extensions.debug("Running init hook {!r}" .format(mod_info.init_hook.__name__)) - context = InitContext(data_dir=standarddir.data()) - mod_info.init_hook(context) + mod_info.init_hook(_get_init_context()) return mod From 3d6f604739f65bda407c4608ae203e0788c531f6 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 14:29:01 +0100 Subject: [PATCH 299/492] Prepare for moving adblocker to extension API --- qutebrowser/app.py | 5 ---- qutebrowser/browser/adblock.py | 39 +++++++++++++++++++------------- qutebrowser/extensions/loader.py | 6 +++-- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 65c7395eb..5bd4b3388 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -468,11 +468,6 @@ def _init_modules(args, crash_handler): log.init.debug("Initializing websettings...") websettings.init(args) - log.init.debug("Initializing adblock...") - host_blocker = adblock.HostBlocker() - host_blocker.read_hosts() - objreg.register('host-blocker', host_blocker) - log.init.debug("Initializing quickmarks...") quickmark_manager = urlmarks.QuickmarkManager(qApp) objreg.register('quickmark-manager', quickmark_manager) diff --git a/qutebrowser/browser/adblock.py b/qutebrowser/browser/adblock.py index 917942b7f..216e9cc98 100644 --- a/qutebrowser/browser/adblock.py +++ b/qutebrowser/browser/adblock.py @@ -24,11 +24,12 @@ import os.path import functools import posixpath import zipfile +import logging -from qutebrowser.api import downloads -from qutebrowser.config import config -from qutebrowser.utils import objreg, standarddir, log, message -from qutebrowser.api import cmdutils +from qutebrowser.api import cmdutils, hook, config, message, downloads + + +logger = logging.getLogger('misc') def _guess_zip_filename(zf): @@ -95,18 +96,17 @@ class HostBlocker: _config_hosts_file: The path to a blocked-hosts in ~/.config """ - def __init__(self): + def __init__(self, *, data_dir, config_dir, args): + self._args = args self._blocked_hosts = set() self._config_blocked_hosts = set() self._in_progress = [] self._done_count = 0 - data_dir = standarddir.data() - self._local_hosts_file = os.path.join(data_dir, 'blocked-hosts') + self._local_hosts_file = str(data_dir / 'blocked-hosts') self._update_files() - config_dir = standarddir.config() - self._config_hosts_file = os.path.join(config_dir, 'blocked-hosts') + self._config_hosts_file = str(config_dir / 'blocked-hosts') config.instance.changed.connect(self._update_files) @@ -141,7 +141,7 @@ class HostBlocker: for line in f: target.add(line.strip()) except (OSError, UnicodeDecodeError): - log.misc.exception("Failed to read host blocklist!") + logger.exception("Failed to read host blocklist!") return True @@ -156,9 +156,8 @@ class HostBlocker: self._blocked_hosts) if not found: - args = objreg.get('args') if (config.val.content.host_blocking.lists and - args.basedir is None and + self._args.basedir is None and config.val.content.host_blocking.enabled): message.info("Run :adblock-update to get adblock lists.") @@ -221,7 +220,7 @@ class HostBlocker: try: line = line.decode('utf-8') except UnicodeDecodeError: - log.misc.error("Failed to decode: {!r}".format(line)) + logger.error("Failed to decode: {!r}".format(line)) return False # Remove comments @@ -277,7 +276,7 @@ class HostBlocker: if not ok: error_count += 1 - log.misc.debug("{}: read {} lines".format(byte_io.name, line_count)) + logger.debug("{}: read {} lines".format(byte_io.name, line_count)) if error_count > 0: message.error("adblock: {} read errors for {}".format( error_count, byte_io.name)) @@ -299,7 +298,7 @@ class HostBlocker: except FileNotFoundError: pass except OSError as e: - log.misc.exception("Failed to delete hosts file: {}".format(e)) + logger.exception("Failed to delete hosts file: {}".format(e)) def _on_download_finished(self, download): """Check if all downloads are finished and if so, trigger reading. @@ -318,4 +317,12 @@ class HostBlocker: try: self._on_lists_downloaded() except OSError: - log.misc.exception("Failed to write host block list!") + logger.exception("Failed to write host block list!") + + +@hook.init() +def init(context): + host_blocker = HostBlocker(data_dir=context.data_dir, + config_dir=context.config_dir, + args=context.args) + host_blocker.read_hosts() diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 1aa37e4fe..303eda213 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -29,7 +29,7 @@ import pathlib import attr from qutebrowser import components -from qutebrowser.utils import log, standarddir +from qutebrowser.utils import log, standarddir, objreg @attr.s @@ -39,6 +39,7 @@ class InitContext: data_dir = attr.ib() # type: pathlib.Path config_dir = attr.ib() # type: pathlib.Path + args = attr.ib() # type: argparse.Namespace @attr.s @@ -119,7 +120,8 @@ def _walk_pyinstaller() -> typing.Iterator[ExtensionInfo]: def _get_init_context() -> InitContext: """Get an InitContext object.""" return InitContext(data_dir=pathlib.Path(standarddir.data()), - config_dir=pathlib.Path(standarddir.config())) + config_dir=pathlib.Path(standarddir.config()), + args=objreg.get('args')) def _load_component(info: ExtensionInfo) -> types.ModuleType: From 7ad7623d7338d20c339684117487a98aac589ac8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 14:39:07 +0100 Subject: [PATCH 300/492] Add request filter API for host blocking Closes https://github.com/qutebrowser/qutebrowser-extensions/issues/8 --- qutebrowser/api/requests.py | 37 +++++++++++++ qutebrowser/browser/adblock.py | 12 +++-- qutebrowser/browser/webengine/interceptor.py | 11 ++-- qutebrowser/browser/webengine/webenginetab.py | 4 +- qutebrowser/browser/webkit/mhtml.py | 6 ++- .../browser/webkit/network/networkmanager.py | 9 ++-- qutebrowser/extensions/requests.py | 53 +++++++++++++++++++ 7 files changed, 115 insertions(+), 17 deletions(-) create mode 100644 qutebrowser/api/requests.py create mode 100644 qutebrowser/extensions/requests.py diff --git a/qutebrowser/api/requests.py b/qutebrowser/api/requests.py new file mode 100644 index 000000000..990faec88 --- /dev/null +++ b/qutebrowser/api/requests.py @@ -0,0 +1,37 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""APIs related to intercepting/blocking requests.""" + +import typing + +import attr +from PyQt5.QtCore import QUrl + +from qutebrowser.extensions import requests +# pylint: disable=unused-import +from qutebrowser.extensions.requests import Request + + +def register_filter(reqfilter: requests.RequestFilterType) -> None: + """Register a request filter. + + Whenever a request happens, the filter gets called with a Request object. + """ + requests.register_filter(reqfilter) diff --git a/qutebrowser/browser/adblock.py b/qutebrowser/browser/adblock.py index 216e9cc98..e9d171f26 100644 --- a/qutebrowser/browser/adblock.py +++ b/qutebrowser/browser/adblock.py @@ -119,9 +119,15 @@ class HostBlocker: return False host = url.host() - return ((host in self._blocked_hosts or - host in self._config_blocked_hosts) and - not _is_whitelisted_url(url)) + blocked = ((host in self._blocked_hosts or + host in self._config_blocked_hosts) and + not _is_whitelisted_url(url)) + + if blocked: + logger.info("Request to {} blocked by host blocker." + .format(url.host())) + + return blocked def _read_hosts_file(self, filename, target): """Read hosts from the given filename. diff --git a/qutebrowser/browser/webengine/interceptor.py b/qutebrowser/browser/webengine/interceptor.py index 516dd0899..863234dc6 100644 --- a/qutebrowser/browser/webengine/interceptor.py +++ b/qutebrowser/browser/webengine/interceptor.py @@ -26,15 +26,15 @@ from PyQt5.QtWebEngineCore import (QWebEngineUrlRequestInterceptor, from qutebrowser.config import config from qutebrowser.browser import shared from qutebrowser.utils import utils, log, debug +from qutebrowser.extensions import requests class RequestInterceptor(QWebEngineUrlRequestInterceptor): """Handle ad blocking and custom headers.""" - def __init__(self, host_blocker, args, parent=None): + def __init__(self, args, parent=None): super().__init__(parent) - self._host_blocker = host_blocker self._args = args def install(self, profile): @@ -84,9 +84,10 @@ class RequestInterceptor(QWebEngineUrlRequestInterceptor): return # FIXME:qtwebengine only block ads for NavigationTypeOther? - if self._host_blocker.is_blocked(url, first_party): - log.webview.info("Request to {} blocked by host blocker.".format( - url.host())) + request = requests.Request(first_party_url=first_party, + request_url=url) + requests.run_filters(request) + if request.is_blocked: info.block(True) for header, value in shared.custom_headers(url=url): diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index a74d866ea..22380cb1f 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -60,10 +60,8 @@ def init(): _qute_scheme_handler.install(webenginesettings.private_profile) log.init.debug("Initializing request interceptor...") - host_blocker = objreg.get('host-blocker') args = objreg.get('args') - req_interceptor = interceptor.RequestInterceptor( - host_blocker, args=args, parent=app) + req_interceptor = interceptor.RequestInterceptor(args=args, parent=app) req_interceptor.install(webenginesettings.default_profile) req_interceptor.install(webenginesettings.private_profile) diff --git a/qutebrowser/browser/webkit/mhtml.py b/qutebrowser/browser/webkit/mhtml.py index 1ecebed2d..c390ab6b3 100644 --- a/qutebrowser/browser/webkit/mhtml.py +++ b/qutebrowser/browser/webkit/mhtml.py @@ -39,6 +39,7 @@ from PyQt5.QtCore import QUrl from qutebrowser.browser import downloads from qutebrowser.browser.webkit import webkitelem from qutebrowser.utils import log, objreg, message, usertypes, utils, urlutils +from qutebrowser.extensions import requests @attr.s @@ -354,8 +355,9 @@ class _Downloader: # qute, see the comments/discussion on # https://github.com/qutebrowser/qutebrowser/pull/962#discussion_r40256987 # and https://github.com/qutebrowser/qutebrowser/issues/1053 - host_blocker = objreg.get('host-blocker') - if host_blocker.is_blocked(url): + request = requests.Request(first_party_url=None, request_url=url) + requests.run_filters(request) + if request.is_blocked: log.downloads.debug("Skipping {}, host-blocked".format(url)) # We still need an empty file in the output, QWebView can be pretty # picky about displaying a file correctly when not all assets are diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py index 2ca1ae0d9..9562ba918 100644 --- a/qutebrowser/browser/webkit/network/networkmanager.py +++ b/qutebrowser/browser/webkit/network/networkmanager.py @@ -38,6 +38,7 @@ if MYPY: from qutebrowser.utils import (message, log, usertypes, utils, objreg, urlutils, debug) from qutebrowser.browser import shared +from qutebrowser.extensions import requests from qutebrowser.browser.webkit import certificateerror from qutebrowser.browser.webkit.network import (webkitqutescheme, networkreply, filescheme) @@ -405,10 +406,10 @@ class NetworkManager(QNetworkAccessManager): # the webpage shutdown here. current_url = QUrl() - host_blocker = objreg.get('host-blocker') - if host_blocker.is_blocked(req.url(), current_url): - log.webview.info("Request to {} blocked by host blocker.".format( - req.url().host())) + request = requests.Request(first_party_url=current_url, + request_url=req.url()) + requests.run_filters(request) + if request.is_blocked: return networkreply.ErrorNetworkReply( req, HOSTBLOCK_ERROR_STRING, QNetworkReply.ContentAccessDenied, self) diff --git a/qutebrowser/extensions/requests.py b/qutebrowser/extensions/requests.py new file mode 100644 index 000000000..8364dc76d --- /dev/null +++ b/qutebrowser/extensions/requests.py @@ -0,0 +1,53 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2018 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Infrastructure for filtering requests.""" + +import typing + +import attr + + +@attr.s +class Request: + + """A request which can be blocked.""" + + first_party_url = attr.ib() # type: QUrl + request_url = attr.ib() # type: QUrl + is_blocked = attr.ib(False) # type: bool + + def block(self): + """Block this request.""" + self.is_blocked = True + + +RequestFilterType = typing.Callable[[Request], None] + + +_request_filters = [] # type: typing.List[RequestFilterType] + + +def register_filter(reqfilter: RequestFilterType) -> None: + _request_filters.append(reqfilter) + + +def run_filters(info): + for reqfilter in _request_filters: + reqfilter(info) From 9764472fd81b29842dd2cab813f4849d0474d4ed Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 14:44:04 +0100 Subject: [PATCH 301/492] Move adblock from browser/ to components/ --- qutebrowser/app.py | 2 +- qutebrowser/{browser => components}/adblock.py | 0 scripts/hostblock_blame.py | 2 +- tests/unit/{browser => components}/test_adblock.py | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename qutebrowser/{browser => components}/adblock.py (100%) rename tests/unit/{browser => components}/test_adblock.py (99%) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 5bd4b3388..9c1ce9991 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -63,7 +63,7 @@ from qutebrowser.completion.models import miscmodels from qutebrowser.commands import runners from qutebrowser.api import cmdutils from qutebrowser.config import config, websettings, configfiles, configinit -from qutebrowser.browser import (urlmarks, adblock, history, browsertab, +from qutebrowser.browser import (urlmarks, history, browsertab, qtnetworkdownloads, downloads, greasemonkey) from qutebrowser.browser.network import proxy from qutebrowser.browser.webkit import cookies, cache diff --git a/qutebrowser/browser/adblock.py b/qutebrowser/components/adblock.py similarity index 100% rename from qutebrowser/browser/adblock.py rename to qutebrowser/components/adblock.py diff --git a/scripts/hostblock_blame.py b/scripts/hostblock_blame.py index 2f68d2961..e5508f515 100644 --- a/scripts/hostblock_blame.py +++ b/scripts/hostblock_blame.py @@ -27,7 +27,7 @@ import os.path import urllib.request sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir)) -from qutebrowser.browser import adblock +from qutebrowser.components import adblock from qutebrowser.config import configdata diff --git a/tests/unit/browser/test_adblock.py b/tests/unit/components/test_adblock.py similarity index 99% rename from tests/unit/browser/test_adblock.py rename to tests/unit/components/test_adblock.py index e18c990cc..e354705dd 100644 --- a/tests/unit/browser/test_adblock.py +++ b/tests/unit/components/test_adblock.py @@ -28,7 +28,7 @@ import pytest from PyQt5.QtCore import QUrl -from qutebrowser.browser import adblock +from qutebrowser.components import adblock from qutebrowser.utils import urlmatch from tests.helpers import utils From 42790e762342ec8f2b00f554d675dce8ff588555 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 14:45:24 +0100 Subject: [PATCH 302/492] Expose config.change_filter --- qutebrowser/api/config.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qutebrowser/api/config.py b/qutebrowser/api/config.py index 6558cf42a..ad0338dd2 100644 --- a/qutebrowser/api/config.py +++ b/qutebrowser/api/config.py @@ -25,5 +25,7 @@ MYPY = False if MYPY: # pylint: disable=unused-import,useless-suppression from qutebrowser.config import config +# pylint: disable=unused-import +from qutebrowser.config.config import change_filter val = typing.cast('config.ConfigContainer', None) From 1b1872e46430061eac70ee70cad0ea58ddbba7e7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 14:53:42 +0100 Subject: [PATCH 303/492] Expose a config_changed signal to extensions --- qutebrowser/app.py | 1 + qutebrowser/components/adblock.py | 7 +++---- qutebrowser/extensions/loader.py | 24 +++++++++++++++++++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 9c1ce9991..2b6896b76 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -165,6 +165,7 @@ def init(args, crash_handler): qApp.setQuitOnLastWindowClosed(False) _init_icon() + loader.init() loader.load_components() try: _init_modules(args, crash_handler) diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index e9d171f26..77e7a7694 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -104,12 +104,10 @@ class HostBlocker: self._done_count = 0 self._local_hosts_file = str(data_dir / 'blocked-hosts') - self._update_files() + self.update_files() self._config_hosts_file = str(config_dir / 'blocked-hosts') - config.instance.changed.connect(self._update_files) - def is_blocked(self, url, first_party_url=None): """Check if the given URL (as QUrl) is blocked.""" if first_party_url is not None and not first_party_url.isValid(): @@ -296,7 +294,7 @@ class HostBlocker: len(self._blocked_hosts), self._done_count)) @config.change_filter('content.host_blocking.lists') - def _update_files(self): + def update_files(self): """Update files when the config changed.""" if not config.val.content.host_blocking.lists: try: @@ -331,4 +329,5 @@ def init(context): host_blocker = HostBlocker(data_dir=context.data_dir, config_dir=context.config_dir, args=context.args) + context.signals.config_changed.connect(host_blocker.update_files) host_blocker.read_hosts() diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 303eda213..e7b93967b 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -28,7 +28,10 @@ import pathlib import attr +from PyQt5.QtCore import pyqtSignal, QObject + from qutebrowser import components +from qutebrowser.config import config from qutebrowser.utils import log, standarddir, objreg @@ -40,6 +43,14 @@ class InitContext: data_dir = attr.ib() # type: pathlib.Path config_dir = attr.ib() # type: pathlib.Path args = attr.ib() # type: argparse.Namespace + signals = attr.ib() # type: ExtensionSignals + + +class ExtensionSignals(QObject): + + """Signals exposed to an extension.""" + + config_changed = pyqtSignal(str) @attr.s @@ -61,6 +72,12 @@ class ExtensionInfo: name = attr.ib() # type: str +# Global extension signals, shared between all extensions. +# At some point we might want to make this per-extension, but then we'll need +# to find out what to set as its Qt parent so it's kept alive. +_extension_signals = ExtensionSignals() + + def add_module_info(module: types.ModuleType) -> ModuleInfo: """Add ModuleInfo to a module (if not added yet).""" # pylint: disable=protected-access @@ -121,7 +138,8 @@ def _get_init_context() -> InitContext: """Get an InitContext object.""" return InitContext(data_dir=pathlib.Path(standarddir.data()), config_dir=pathlib.Path(standarddir.config()), - args=objreg.get('args')) + args=objreg.get('args'), + signals=_extension_signals) def _load_component(info: ExtensionInfo) -> types.ModuleType: @@ -136,3 +154,7 @@ def _load_component(info: ExtensionInfo) -> types.ModuleType: mod_info.init_hook(_get_init_context()) return mod + + +def init() -> None: + config.instance.changed.connect(_extension_signals.config_changed) From 58d179302edcf9c4be980494494cdde55f6e02f0 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 14:55:28 +0100 Subject: [PATCH 304/492] Add api.config.get --- qutebrowser/api/config.py | 12 ++++++++---- qutebrowser/components/adblock.py | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/qutebrowser/api/config.py b/qutebrowser/api/config.py index ad0338dd2..c2831de40 100644 --- a/qutebrowser/api/config.py +++ b/qutebrowser/api/config.py @@ -21,11 +21,15 @@ import typing -MYPY = False -if MYPY: - # pylint: disable=unused-import,useless-suppression - from qutebrowser.config import config +from PyQt5.QtCore import QUrl + +from qutebrowser.config import config # pylint: disable=unused-import from qutebrowser.config.config import change_filter val = typing.cast('config.ConfigContainer', None) + + +def get(name: str, url: QUrl = None) -> typing.Any: + """Get a value from the config based on a string name.""" + return config.instance.get(name, url) diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index 77e7a7694..492acb0a8 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -112,8 +112,8 @@ class HostBlocker: """Check if the given URL (as QUrl) is blocked.""" if first_party_url is not None and not first_party_url.isValid(): first_party_url = None - if not config.instance.get('content.host_blocking.enabled', - url=first_party_url): + if not config.get('content.host_blocking.enabled', + url=first_party_url): return False host = url.host() From a146ce865b4fdfa27086596c011dd5112a18a61a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 14:59:00 +0100 Subject: [PATCH 305/492] Register host blocker as request filter --- qutebrowser/components/adblock.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index 492acb0a8..264f55cda 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -26,7 +26,8 @@ import posixpath import zipfile import logging -from qutebrowser.api import cmdutils, hook, config, message, downloads +from qutebrowser.api import (cmdutils, hook, config, message, downloads, + requests) logger = logging.getLogger('misc') @@ -108,24 +109,28 @@ class HostBlocker: self._config_hosts_file = str(config_dir / 'blocked-hosts') - def is_blocked(self, url, first_party_url=None): - """Check if the given URL (as QUrl) is blocked.""" - if first_party_url is not None and not first_party_url.isValid(): + def filter_request(self, info: requests.Request) -> None: + """Block the given request if necessary.""" + if info.first_party_url is None: first_party_url = None + elif not info.first_party_url.isValid(): + first_party_url = None + else: + first_party_url = info.first_party_url + if not config.get('content.host_blocking.enabled', url=first_party_url): return False - host = url.host() + host = info.request_url.host() blocked = ((host in self._blocked_hosts or host in self._config_blocked_hosts) and - not _is_whitelisted_url(url)) + not _is_whitelisted_url(info.request_url)) if blocked: logger.info("Request to {} blocked by host blocker." - .format(url.host())) - - return blocked + .format(info.request_url.host())) + info.block() def _read_hosts_file(self, filename, target): """Read hosts from the given filename. @@ -329,5 +334,7 @@ def init(context): host_blocker = HostBlocker(data_dir=context.data_dir, config_dir=context.config_dir, args=context.args) - context.signals.config_changed.connect(host_blocker.update_files) host_blocker.read_hosts() + + context.signals.config_changed.connect(host_blocker.update_files) + requests.register_filter(host_blocker.filter_request) From 93a36c857251bb4d1a4e80804b2c0a4d531d3888 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 15:01:52 +0100 Subject: [PATCH 306/492] Fix :adblock-update After #640 we can likely fix this up again. --- qutebrowser/components/adblock.py | 33 ++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index 264f55cda..85d8fe40b 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -31,6 +31,7 @@ from qutebrowser.api import (cmdutils, hook, config, message, downloads, logger = logging.getLogger('misc') +_host_blocker = None def _guess_zip_filename(zf): @@ -170,13 +171,8 @@ class HostBlocker: config.val.content.host_blocking.enabled): message.info("Run :adblock-update to get adblock lists.") - @cmdutils.register(instance='host-blocker') def adblock_update(self): - """Update the adblock block lists. - - This updates `~/.local/share/qutebrowser/blocked-hosts` with downloaded - host lists and re-reads `~/.config/qutebrowser/blocked-hosts`. - """ + """Update the adblock block lists.""" self._read_hosts_file(self._config_hosts_file, self._config_blocked_hosts) self._blocked_hosts = set() @@ -329,12 +325,25 @@ class HostBlocker: logger.exception("Failed to write host block list!") +@cmdutils.register() +def adblock_update(): + """Update the adblock block lists. + + This updates `~/.local/share/qutebrowser/blocked-hosts` with downloaded + host lists and re-reads `~/.config/qutebrowser/blocked-hosts`. + """ + # FIXME: As soon as we can register instances again, we should move this + # back to the class. + _host_blocker.adblock_update() + + @hook.init() def init(context): - host_blocker = HostBlocker(data_dir=context.data_dir, - config_dir=context.config_dir, - args=context.args) - host_blocker.read_hosts() + global _host_blocker + _host_blocker = HostBlocker(data_dir=context.data_dir, + config_dir=context.config_dir, + args=context.args) + _host_blocker.read_hosts() - context.signals.config_changed.connect(host_blocker.update_files) - requests.register_filter(host_blocker.filter_request) + context.signals.config_changed.connect(_host_blocker.update_files) + requests.register_filter(_host_blocker.filter_request) From 6001640a8a194c41df9b510b0c2949776adff30e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 15:24:15 +0100 Subject: [PATCH 307/492] Guard against double init hooks --- qutebrowser/api/hook.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qutebrowser/api/hook.py b/qutebrowser/api/hook.py index e7e0de88d..ddec49e5f 100644 --- a/qutebrowser/api/hook.py +++ b/qutebrowser/api/hook.py @@ -33,5 +33,7 @@ class init: # noqa: N801,N806 pylint: disable=invalid-name def __call__(self, func: typing.Callable) -> typing.Callable: module = importlib.import_module(func.__module__) info = loader.add_module_info(module) + if info.init_hook is not None: + raise ValueError("init hook is already registered!") info.init_hook = func return func From 3b53270ee379088b6feeb4d0d81f7ea9707d2b8b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 15:40:19 +0100 Subject: [PATCH 308/492] Use hook system for config_changed hook --- qutebrowser/api/config.py | 2 -- qutebrowser/api/hook.py | 21 ++++++++++++++-- qutebrowser/components/adblock.py | 8 +++--- qutebrowser/config/config.py | 6 ++--- qutebrowser/extensions/loader.py | 42 ++++++++++++++++++------------- 5 files changed, 51 insertions(+), 28 deletions(-) diff --git a/qutebrowser/api/config.py b/qutebrowser/api/config.py index c2831de40..4a5d73936 100644 --- a/qutebrowser/api/config.py +++ b/qutebrowser/api/config.py @@ -24,8 +24,6 @@ import typing from PyQt5.QtCore import QUrl from qutebrowser.config import config -# pylint: disable=unused-import -from qutebrowser.config.config import change_filter val = typing.cast('config.ConfigContainer', None) diff --git a/qutebrowser/api/hook.py b/qutebrowser/api/hook.py index ddec49e5f..a975438ea 100644 --- a/qutebrowser/api/hook.py +++ b/qutebrowser/api/hook.py @@ -26,14 +26,31 @@ import typing from qutebrowser.extensions import loader +def _add_module_info(func: typing.Callable) -> loader.ModuleInfo: + """Add module info to the given function.""" + module = importlib.import_module(func.__module__) + return loader.add_module_info(module) + + class init: # noqa: N801,N806 pylint: disable=invalid-name """Decorator to mark a function to run when initializing.""" def __call__(self, func: typing.Callable) -> typing.Callable: - module = importlib.import_module(func.__module__) - info = loader.add_module_info(module) + info = _add_module_info(func) if info.init_hook is not None: raise ValueError("init hook is already registered!") info.init_hook = func return func + + +class config_changed: + + """Decorator to get notified about changed configs.""" + + def __init__(self, option_filter=None): + self._filter = option_filter + + def __call__(self, func: typing.Callable) -> typing.Callable: + info = _add_module_info(func) + info.config_changed_hooks.append((self._filter, func)) diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index 85d8fe40b..ae71722d6 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -294,7 +294,6 @@ class HostBlocker: message.info("adblock: Read {} hosts from {} sources.".format( len(self._blocked_hosts), self._done_count)) - @config.change_filter('content.host_blocking.lists') def update_files(self): """Update files when the config changed.""" if not config.val.content.host_blocking.lists: @@ -337,6 +336,11 @@ def adblock_update(): _host_blocker.adblock_update() +@hook.config_changed('content.host_blocking.lists') +def on_config_changed(): + _host_blocker.update_files() + + @hook.init() def init(context): global _host_blocker @@ -344,6 +348,4 @@ def init(context): config_dir=context.config_dir, args=context.args) _host_blocker.read_hosts() - - context.signals.config_changed.connect(_host_blocker.update_files) requests.register_filter(_host_blocker.filter_request) diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 80826beeb..201b87fde 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -86,7 +86,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name not configdata.is_valid_prefix(self._option)): raise configexc.NoOptionError(self._option) - def _check_match(self, option: typing.Optional[str]) -> bool: + def check_match(self, option: typing.Optional[str]) -> bool: """Check if the given option matches the filter.""" if option is None: # Called directly, not from a config change event. @@ -119,7 +119,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name @functools.wraps(func) def func_wrapper(option: str = None) -> typing.Any: """Call the underlying function.""" - if self._check_match(option): + if self.check_match(option): return func() return None return func_wrapper @@ -128,7 +128,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name def meth_wrapper(wrapper_self: typing.Any, option: str = None) -> typing.Any: """Call the underlying function.""" - if self._check_match(option): + if self.check_match(option): return func(wrapper_self) return None return meth_wrapper diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index e7b93967b..bc4494bae 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -28,13 +28,17 @@ import pathlib import attr -from PyQt5.QtCore import pyqtSignal, QObject +from PyQt5.QtCore import pyqtSlot, QObject from qutebrowser import components from qutebrowser.config import config from qutebrowser.utils import log, standarddir, objreg +# ModuleInfo objects for all loaded plugins +_module_infos = [] + + @attr.s class InitContext: @@ -43,14 +47,6 @@ class InitContext: data_dir = attr.ib() # type: pathlib.Path config_dir = attr.ib() # type: pathlib.Path args = attr.ib() # type: argparse.Namespace - signals = attr.ib() # type: ExtensionSignals - - -class ExtensionSignals(QObject): - - """Signals exposed to an extension.""" - - config_changed = pyqtSignal(str) @attr.s @@ -61,7 +57,11 @@ class ModuleInfo: This gets used by qutebrowser.api.hook. """ + _ConfigChangedHooksType = typing.List[typing.Tuple[str, typing.Callable]] + init_hook = attr.ib(None) # type: typing.Optional[typing.Callable] + config_changed_hooks = attr.ib( + attr.Factory(list)) # type: _ConfigChangedHooksType @attr.s @@ -72,12 +72,6 @@ class ExtensionInfo: name = attr.ib() # type: str -# Global extension signals, shared between all extensions. -# At some point we might want to make this per-extension, but then we'll need -# to find out what to set as its Qt parent so it's kept alive. -_extension_signals = ExtensionSignals() - - def add_module_info(module: types.ModuleType) -> ModuleInfo: """Add ModuleInfo to a module (if not added yet).""" # pylint: disable=protected-access @@ -138,8 +132,7 @@ def _get_init_context() -> InitContext: """Get an InitContext object.""" return InitContext(data_dir=pathlib.Path(standarddir.data()), config_dir=pathlib.Path(standarddir.config()), - args=objreg.get('args'), - signals=_extension_signals) + args=objreg.get('args')) def _load_component(info: ExtensionInfo) -> types.ModuleType: @@ -153,8 +146,21 @@ def _load_component(info: ExtensionInfo) -> types.ModuleType: .format(mod_info.init_hook.__name__)) mod_info.init_hook(_get_init_context()) + _module_infos.append(mod_info) + return mod +@pyqtSlot(str) +def _on_config_changed(changed_name: str) -> None: + """Call config_changed hooks if the config changed.""" + for mod_info in _module_infos: + for option, hook in mod_info.config_changed_hooks: + cfilter = config.change_filter(option) + cfilter.validate() + if cfilter.check_match(changed_name): + hook() + + def init() -> None: - config.instance.changed.connect(_extension_signals.config_changed) + config.instance.changed.connect(_on_config_changed) From a96c6efc34cbb8d612ad651b858650e1f6fb2dd5 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 15:52:00 +0100 Subject: [PATCH 309/492] Add types to components.adblock --- qutebrowser/components/adblock.py | 80 ++++++++++++++----------------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index ae71722d6..aad802bd2 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -25,21 +25,22 @@ import functools import posixpath import zipfile import logging +import typing +import pathlib +import argparse + +from PyQt5.QtCore import QUrl from qutebrowser.api import (cmdutils, hook, config, message, downloads, - requests) + requests, apitypes) logger = logging.getLogger('misc') -_host_blocker = None +_host_blocker = typing.cast('HostBlocker', None) -def _guess_zip_filename(zf): - """Guess which file to use inside a zip file. - - Args: - zf: A ZipFile instance. - """ +def _guess_zip_filename(zf: zipfile.ZipFile) -> str: + """Guess which file to use inside a zip file.""" files = zf.namelist() if len(files) == 1: return files[0] @@ -50,7 +51,7 @@ def _guess_zip_filename(zf): raise FileNotFoundError("No hosts file found in zip") -def get_fileobj(byte_io): +def get_fileobj(byte_io: typing.IO[bytes]) -> typing.IO[bytes]: """Get a usable file object to read the hosts file from.""" byte_io.seek(0) # rewind downloaded file if zipfile.is_zipfile(byte_io): @@ -63,24 +64,19 @@ def get_fileobj(byte_io): return byte_io -def _is_whitelisted_url(url): - """Check if the given URL is on the adblock whitelist. - - Args: - url: The URL to check as QUrl. - """ +def _is_whitelisted_url(url: QUrl) -> bool: + """Check if the given URL is on the adblock whitelist.""" for pattern in config.val.content.host_blocking.whitelist: if pattern.matches(url): return True return False -class _FakeDownload: +class _FakeDownload(downloads.TempDownload): """A download stub to use on_download_finished with local files.""" - def __init__(self, fileobj): - self.basename = os.path.basename(fileobj.name) + def __init__(self, fileobj: typing.IO[bytes]) -> None: self.fileobj = fileobj self.successful = True @@ -98,11 +94,12 @@ class HostBlocker: _config_hosts_file: The path to a blocked-hosts in ~/.config """ - def __init__(self, *, data_dir, config_dir, args): + def __init__(self, *, data_dir: pathlib.Path, config_dir: pathlib.Path, + args: argparse.Namespace) -> None: self._args = args - self._blocked_hosts = set() - self._config_blocked_hosts = set() - self._in_progress = [] + self._blocked_hosts = set() # type: typing.Set[str] + self._config_blocked_hosts = set() # type: typing.Set[str] + self._in_progress = [] # type: typing.List[downloads.TempDownload] self._done_count = 0 self._local_hosts_file = str(data_dir / 'blocked-hosts') @@ -121,7 +118,7 @@ class HostBlocker: if not config.get('content.host_blocking.enabled', url=first_party_url): - return False + return host = info.request_url.host() blocked = ((host in self._blocked_hosts or @@ -133,7 +130,7 @@ class HostBlocker: .format(info.request_url.host())) info.block() - def _read_hosts_file(self, filename, target): + def _read_hosts_file(self, filename: str, target: typing.Set[str]) -> bool: """Read hosts from the given filename. Args: @@ -155,7 +152,7 @@ class HostBlocker: return True - def read_hosts(self): + def read_hosts(self) -> None: """Read hosts from the existing blocked-hosts file.""" self._blocked_hosts = set() @@ -171,7 +168,7 @@ class HostBlocker: config.val.content.host_blocking.enabled): message.info("Run :adblock-update to get adblock lists.") - def adblock_update(self): + def adblock_update(self) -> None: """Update the adblock block lists.""" self._read_hosts_file(self._config_hosts_file, self._config_blocked_hosts) @@ -192,7 +189,7 @@ class HostBlocker: download.finished.connect( functools.partial(self._on_download_finished, download)) - def _import_local(self, filename): + def _import_local(self, filename: str) -> None: """Adds the contents of a file to the blocklist. Args: @@ -208,24 +205,24 @@ class HostBlocker: self._in_progress.append(download) self._on_download_finished(download) - def _parse_line(self, line): + def _parse_line(self, raw_line: bytes) -> bool: """Parse a line from a host file. Args: - line: The bytes object to parse. + raw_line: The bytes object to parse. Returns: True if parsing succeeded, False otherwise. """ - if line.startswith(b'#'): + if raw_line.startswith(b'#'): # Ignoring comments early so we don't have to care about # encoding errors in them. return True try: - line = line.decode('utf-8') + line = raw_line.decode('utf-8') except UnicodeDecodeError: - logger.error("Failed to decode: {!r}".format(line)) + logger.error("Failed to decode: {!r}".format(raw_line)) return False # Remove comments @@ -256,14 +253,11 @@ class HostBlocker: return True - def _merge_file(self, byte_io): + def _merge_file(self, byte_io: io.BytesIO) -> None: """Read and merge host files. Args: byte_io: The BytesIO object of the completed download. - - Return: - A set of the merged hosts. """ error_count = 0 line_count = 0 @@ -286,7 +280,7 @@ class HostBlocker: message.error("adblock: {} read errors for {}".format( error_count, byte_io.name)) - def _on_lists_downloaded(self): + def _on_lists_downloaded(self) -> None: """Install block lists after files have been downloaded.""" with open(self._local_hosts_file, 'w', encoding='utf-8') as f: for host in sorted(self._blocked_hosts): @@ -294,7 +288,7 @@ class HostBlocker: message.info("adblock: Read {} hosts from {} sources.".format( len(self._blocked_hosts), self._done_count)) - def update_files(self): + def update_files(self) -> None: """Update files when the config changed.""" if not config.val.content.host_blocking.lists: try: @@ -304,11 +298,11 @@ class HostBlocker: except OSError as e: logger.exception("Failed to delete hosts file: {}".format(e)) - def _on_download_finished(self, download): + def _on_download_finished(self, download: downloads.TempDownload) -> None: """Check if all downloads are finished and if so, trigger reading. Arguments: - download: The finished DownloadItem. + download: The finished download. """ self._in_progress.remove(download) if download.successful: @@ -325,7 +319,7 @@ class HostBlocker: @cmdutils.register() -def adblock_update(): +def adblock_update() -> None: """Update the adblock block lists. This updates `~/.local/share/qutebrowser/blocked-hosts` with downloaded @@ -337,12 +331,12 @@ def adblock_update(): @hook.config_changed('content.host_blocking.lists') -def on_config_changed(): +def on_config_changed() -> None: _host_blocker.update_files() @hook.init() -def init(context): +def init(context: apitypes.InitContext) -> None: global _host_blocker _host_blocker = HostBlocker(data_dir=context.data_dir, config_dir=context.config_dir, From b41005d487812bc9a9eeb07bfc3b9a4da7e72b32 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 15:56:05 +0100 Subject: [PATCH 310/492] Fix mypy issues --- qutebrowser/api/hook.py | 3 ++- qutebrowser/extensions/loader.py | 17 +++++++++++++---- qutebrowser/extensions/requests.py | 9 +++++++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/qutebrowser/api/hook.py b/qutebrowser/api/hook.py index a975438ea..bd8e2a635 100644 --- a/qutebrowser/api/hook.py +++ b/qutebrowser/api/hook.py @@ -48,9 +48,10 @@ class config_changed: """Decorator to get notified about changed configs.""" - def __init__(self, option_filter=None): + def __init__(self, option_filter: str = None) -> None: self._filter = option_filter def __call__(self, func: typing.Callable) -> typing.Callable: info = _add_module_info(func) info.config_changed_hooks.append((self._filter, func)) + return func diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index bc4494bae..be7beeb11 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -34,6 +34,11 @@ from qutebrowser import components from qutebrowser.config import config from qutebrowser.utils import log, standarddir, objreg +MYPY = False +if MYPY: + # pylint: disable=unused-import,useless-suppression + import argparse + # ModuleInfo objects for all loaded plugins _module_infos = [] @@ -57,7 +62,8 @@ class ModuleInfo: This gets used by qutebrowser.api.hook. """ - _ConfigChangedHooksType = typing.List[typing.Tuple[str, typing.Callable]] + _ConfigChangedHooksType = typing.List[typing.Tuple[typing.Optional[str], + typing.Callable]] init_hook = attr.ib(None) # type: typing.Optional[typing.Callable] config_changed_hooks = attr.ib( @@ -156,10 +162,13 @@ def _on_config_changed(changed_name: str) -> None: """Call config_changed hooks if the config changed.""" for mod_info in _module_infos: for option, hook in mod_info.config_changed_hooks: - cfilter = config.change_filter(option) - cfilter.validate() - if cfilter.check_match(changed_name): + if option is None: hook() + else: + cfilter = config.change_filter(option) + cfilter.validate() + if cfilter.check_match(changed_name): + hook() def init() -> None: diff --git a/qutebrowser/extensions/requests.py b/qutebrowser/extensions/requests.py index 8364dc76d..952c830dc 100644 --- a/qutebrowser/extensions/requests.py +++ b/qutebrowser/extensions/requests.py @@ -23,6 +23,11 @@ import typing import attr +MYPY = False +if MYPY: + # pylint: disable=unused-import,useless-suppression + from PyQt5.QtCore import QUrl + @attr.s class Request: @@ -33,7 +38,7 @@ class Request: request_url = attr.ib() # type: QUrl is_blocked = attr.ib(False) # type: bool - def block(self): + def block(self) -> None: """Block this request.""" self.is_blocked = True @@ -48,6 +53,6 @@ def register_filter(reqfilter: RequestFilterType) -> None: _request_filters.append(reqfilter) -def run_filters(info): +def run_filters(info: Request) -> None: for reqfilter in _request_filters: reqfilter(info) From 4e99caafb9f9772155bbf5de18e8bad60b2127e0 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 16:00:31 +0100 Subject: [PATCH 311/492] Skip hooks for vulture/docs --- qutebrowser/extensions/loader.py | 21 ++++++++++++++++----- scripts/dev/run_vulture.py | 2 +- scripts/dev/src2asciidoc.py | 2 +- tests/unit/extensions/test_loader.py | 2 +- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index be7beeb11..338449c5b 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -65,6 +65,7 @@ class ModuleInfo: _ConfigChangedHooksType = typing.List[typing.Tuple[typing.Optional[str], typing.Callable]] + skip_hooks = attr.ib(False) # type: bool init_hook = attr.ib(None) # type: typing.Optional[typing.Callable] config_changed_hooks = attr.ib( attr.Factory(list)) # type: _ConfigChangedHooksType @@ -86,10 +87,10 @@ def add_module_info(module: types.ModuleType) -> ModuleInfo: return module.__qute_module_info # type: ignore -def load_components() -> None: +def load_components(*, skip_hooks=False) -> None: """Load everything from qutebrowser.components.""" for info in walk_components(): - _load_component(info) + _load_component(info, skip_hooks=skip_hooks) def walk_components() -> typing.Iterator[ExtensionInfo]: @@ -141,13 +142,21 @@ def _get_init_context() -> InitContext: args=objreg.get('args')) -def _load_component(info: ExtensionInfo) -> types.ModuleType: - """Load the given extension and run its init hook (if any).""" +def _load_component(info: ExtensionInfo, *, skip_hooks) -> types.ModuleType: + """Load the given extension and run its init hook (if any). + + Args: + skip_hooks: Whether to skip all hooks for this module. + This is used to only run @cmdutils.register decorators. + """ log.extensions.debug("Importing {}".format(info.name)) mod = importlib.import_module(info.name) mod_info = add_module_info(mod) - if mod_info.init_hook is not None: + if skip_hooks: + mod_info.skip_hooks = True + + if mod_info.init_hook is not None and not skip_hooks: log.extensions.debug("Running init hook {!r}" .format(mod_info.init_hook.__name__)) mod_info.init_hook(_get_init_context()) @@ -161,6 +170,8 @@ def _load_component(info: ExtensionInfo) -> types.ModuleType: def _on_config_changed(changed_name: str) -> None: """Call config_changed hooks if the config changed.""" for mod_info in _module_infos: + if mod_info.skip_hooks: + continue for option, hook in mod_info.config_changed_hooks: if option is None: hook() diff --git a/scripts/dev/run_vulture.py b/scripts/dev/run_vulture.py index 7874f6a79..51662f3c9 100755 --- a/scripts/dev/run_vulture.py +++ b/scripts/dev/run_vulture.py @@ -44,7 +44,7 @@ from qutebrowser.config import configtypes def whitelist_generator(): # noqa """Generator which yields lines to add to a vulture whitelist.""" - loader.load_components() + loader.load_components(skip_hooks=True) # qutebrowser commands for cmd in objects.commands.values(): diff --git a/scripts/dev/src2asciidoc.py b/scripts/dev/src2asciidoc.py index f0536c045..1ba272fba 100755 --- a/scripts/dev/src2asciidoc.py +++ b/scripts/dev/src2asciidoc.py @@ -550,7 +550,7 @@ def regenerate_cheatsheet(): def main(): """Regenerate all documentation.""" utils.change_cwd() - loader.load_components() + loader.load_components(skip_hooks=True) print("Generating manpage...") regenerate_manpage('doc/qutebrowser.1.asciidoc') print("Generating settings help...") diff --git a/tests/unit/extensions/test_loader.py b/tests/unit/extensions/test_loader.py index e0c1912fa..710b1ce9c 100644 --- a/tests/unit/extensions/test_loader.py +++ b/tests/unit/extensions/test_loader.py @@ -43,7 +43,7 @@ def test_load_component(monkeypatch): monkeypatch.setattr(objects, 'commands', {}) info = loader.ExtensionInfo(name='qutebrowser.components.scrollcommands') - module = loader._load_component(info) + module = loader._load_component(info, skip_hooks=True) assert hasattr(module, 'scroll_to_perc') assert 'scroll-to-perc' in objects.commands From 35a3fe029d381053c12b44b5f1d111cfabf3f047 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 16:05:17 +0100 Subject: [PATCH 312/492] Fix lint --- .flake8 | 1 + qutebrowser/api/downloads.py | 4 ++++ qutebrowser/api/hook.py | 4 +++- qutebrowser/api/requests.py | 5 ----- qutebrowser/components/adblock.py | 4 +++- qutebrowser/extensions/loader.py | 2 +- scripts/dev/run_vulture.py | 3 +++ 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.flake8 b/.flake8 index 8c03ef729..7a783a4b0 100644 --- a/.flake8 +++ b/.flake8 @@ -46,6 +46,7 @@ ignore = min-version = 3.4.0 max-complexity = 12 per-file-ignores = + /qutebrowser/api/hook.py : N801 /tests/**/*.py : D100,D101,D401 /tests/unit/browser/test_history.py : N806 /tests/helpers/fixtures.py : N806 diff --git a/qutebrowser/api/downloads.py b/qutebrowser/api/downloads.py index f743f5d7a..82c68d0bd 100644 --- a/qutebrowser/api/downloads.py +++ b/qutebrowser/api/downloads.py @@ -18,6 +18,9 @@ # along with qutebrowser. If not, see . +"""APIs related to downloading files.""" + + import io from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, QUrl @@ -33,6 +36,7 @@ class TempDownload(QObject): finished = pyqtSignal() def __init__(self, item: qtnetworkdownloads.DownloadItem) -> None: + super().__init__() self._item = item self._item.finished.connect(self._on_download_finished) self.successful = False diff --git a/qutebrowser/api/hook.py b/qutebrowser/api/hook.py index bd8e2a635..3f06121da 100644 --- a/qutebrowser/api/hook.py +++ b/qutebrowser/api/hook.py @@ -17,6 +17,8 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . +# pylint: disable=invalid-name + """Hooks for extensions.""" import importlib @@ -32,7 +34,7 @@ def _add_module_info(func: typing.Callable) -> loader.ModuleInfo: return loader.add_module_info(module) -class init: # noqa: N801,N806 pylint: disable=invalid-name +class init: """Decorator to mark a function to run when initializing.""" diff --git a/qutebrowser/api/requests.py b/qutebrowser/api/requests.py index 990faec88..5c23418b4 100644 --- a/qutebrowser/api/requests.py +++ b/qutebrowser/api/requests.py @@ -19,11 +19,6 @@ """APIs related to intercepting/blocking requests.""" -import typing - -import attr -from PyQt5.QtCore import QUrl - from qutebrowser.extensions import requests # pylint: disable=unused-import from qutebrowser.extensions.requests import Request diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index aad802bd2..706620948 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -76,7 +76,8 @@ class _FakeDownload(downloads.TempDownload): """A download stub to use on_download_finished with local files.""" - def __init__(self, fileobj: typing.IO[bytes]) -> None: + def __init__(self, # pylint: disable=super-init-not-called + fileobj: typing.IO[bytes]) -> None: self.fileobj = fileobj self.successful = True @@ -337,6 +338,7 @@ def on_config_changed() -> None: @hook.init() def init(context: apitypes.InitContext) -> None: + """Initialize the host blocker.""" global _host_blocker _host_blocker = HostBlocker(data_dir=context.data_dir, config_dir=context.config_dir, diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 338449c5b..1a9b3d858 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -28,7 +28,7 @@ import pathlib import attr -from PyQt5.QtCore import pyqtSlot, QObject +from PyQt5.QtCore import pyqtSlot from qutebrowser import components from qutebrowser.config import config diff --git a/scripts/dev/run_vulture.py b/scripts/dev/run_vulture.py index 51662f3c9..f9262c946 100755 --- a/scripts/dev/run_vulture.py +++ b/scripts/dev/run_vulture.py @@ -130,6 +130,9 @@ def whitelist_generator(): # noqa yield 'scripts.get_coredumpctl_traces.Line.gid' yield 'scripts.importer.import_moz_places.places.row_factory' + # component hooks + yield 'qutebrowser.components.adblock.on_config_changed' + def filter_func(item): """Check if a missing function should be filtered or not. From 8508928f3de8996b928ab6be99e5c083c7f0f78a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 16:07:40 +0100 Subject: [PATCH 313/492] Use bool instead of passing args --- qutebrowser/components/adblock.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index 706620948..33069ce2d 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -27,7 +27,6 @@ import zipfile import logging import typing import pathlib -import argparse from PyQt5.QtCore import QUrl @@ -93,11 +92,12 @@ class HostBlocker: _done_count: How many files have been read successfully. _local_hosts_file: The path to the blocked-hosts file. _config_hosts_file: The path to a blocked-hosts in ~/.config + _has_basedir: Whether a custom --basedir is set. """ def __init__(self, *, data_dir: pathlib.Path, config_dir: pathlib.Path, - args: argparse.Namespace) -> None: - self._args = args + has_basedir: bool = False) -> None: + self._has_basedir = has_basedir self._blocked_hosts = set() # type: typing.Set[str] self._config_blocked_hosts = set() # type: typing.Set[str] self._in_progress = [] # type: typing.List[downloads.TempDownload] @@ -165,7 +165,7 @@ class HostBlocker: if not found: if (config.val.content.host_blocking.lists and - self._args.basedir is None and + not self._has_basedir and config.val.content.host_blocking.enabled): message.info("Run :adblock-update to get adblock lists.") @@ -342,6 +342,6 @@ def init(context: apitypes.InitContext) -> None: global _host_blocker _host_blocker = HostBlocker(data_dir=context.data_dir, config_dir=context.config_dir, - args=context.args) + has_basedir=context.args.basedir is not None) _host_blocker.read_hosts() requests.register_filter(_host_blocker.filter_request) From 007250033a3f26a5f76cf5164c89de1eec0f95b7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 16:08:43 +0100 Subject: [PATCH 314/492] Remove HostBlockerStub --- tests/helpers/fixtures.py | 13 ++----------- tests/helpers/stubs.py | 11 ----------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/tests/helpers/fixtures.py b/tests/helpers/fixtures.py index fac23ae1c..b45427043 100644 --- a/tests/helpers/fixtures.py +++ b/tests/helpers/fixtures.py @@ -190,8 +190,8 @@ def testdata_scheme(qapp): @pytest.fixture def web_tab_setup(qtbot, tab_registry, session_manager_stub, - greasemonkey_manager, fake_args, host_blocker_stub, - config_stub, testdata_scheme): + greasemonkey_manager, fake_args, config_stub, + testdata_scheme): """Shared setup for webkit_tab/webengine_tab.""" # Make sure error logging via JS fails tests config_stub.val.content.javascript.log = { @@ -328,15 +328,6 @@ def key_config_stub(config_stub, monkeypatch): return keyconf -@pytest.fixture -def host_blocker_stub(stubs): - """Fixture which provides a fake host blocker object.""" - stub = stubs.HostBlockerStub() - objreg.register('host-blocker', stub) - yield stub - objreg.delete('host-blocker') - - @pytest.fixture def quickmark_manager_stub(stubs): """Fixture which provides a fake quickmark manager object.""" diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 89330ab64..38d82c004 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -459,17 +459,6 @@ class QuickmarkManagerStub(UrlMarkManagerStub): self.delete(key) -class HostBlockerStub: - - """Stub for the host-blocker object.""" - - def __init__(self): - self.blocked_hosts = set() - - def is_blocked(self, url, first_party_url=None): - return url in self.blocked_hosts - - class SessionManagerStub: """Stub for the session-manager object.""" From 7b1bcea30650578e28f9672835c34eb235605f4e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 16:25:36 +0100 Subject: [PATCH 315/492] Bring back separate is_blocked method --- qutebrowser/components/adblock.py | 26 +++--- tests/helpers/fixtures.py | 2 + tests/unit/components/test_adblock.py | 109 +++++++++++--------------- 3 files changed, 62 insertions(+), 75 deletions(-) diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index 33069ce2d..d279f1c03 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -108,25 +108,25 @@ class HostBlocker: self._config_hosts_file = str(config_dir / 'blocked-hosts') - def filter_request(self, info: requests.Request) -> None: - """Block the given request if necessary.""" - if info.first_party_url is None: + def _is_blocked(self, request_url: QUrl, + first_party_url: QUrl = None) -> None: + """Check whether the given request is blocked.""" + if first_party_url is not None and not first_party_url.isValid(): first_party_url = None - elif not info.first_party_url.isValid(): - first_party_url = None - else: - first_party_url = info.first_party_url if not config.get('content.host_blocking.enabled', url=first_party_url): - return + return False - host = info.request_url.host() - blocked = ((host in self._blocked_hosts or - host in self._config_blocked_hosts) and - not _is_whitelisted_url(info.request_url)) + host = request_url.host() + return ((host in self._blocked_hosts or + host in self._config_blocked_hosts) and + not _is_whitelisted_url(request_url)) - if blocked: + def filter_request(self, info: requests.Request) -> None: + """Block the given request if necessary.""" + if self._is_blocked(request_url=info.request_url, + first_party_url=info.first_party_url): logger.info("Request to {} blocked by host blocker." .format(info.request_url.host())) info.block() diff --git a/tests/helpers/fixtures.py b/tests/helpers/fixtures.py index b45427043..f993cbf19 100644 --- a/tests/helpers/fixtures.py +++ b/tests/helpers/fixtures.py @@ -44,6 +44,7 @@ from PyQt5.QtNetwork import QNetworkCookieJar import helpers.stubs as stubsmod from qutebrowser.config import (config, configdata, configtypes, configexc, configfiles, configcache) +from qutebrowser.api import config as configapi from qutebrowser.utils import objreg, standarddir, utils, usertypes from qutebrowser.browser import greasemonkey, history, qutescheme from qutebrowser.browser.webkit import cookies @@ -306,6 +307,7 @@ def config_stub(stubs, monkeypatch, configdata_init, yaml_config_stub): container = config.ConfigContainer(conf) monkeypatch.setattr(config, 'val', container) + monkeypatch.setattr(configapi, 'val', container) cache = configcache.ConfigCache() monkeypatch.setattr(config, 'cache', cache) diff --git a/tests/unit/components/test_adblock.py b/tests/unit/components/test_adblock.py index e354705dd..f37b57962 100644 --- a/tests/unit/components/test_adblock.py +++ b/tests/unit/components/test_adblock.py @@ -33,7 +33,7 @@ from qutebrowser.utils import urlmatch from tests.helpers import utils -pytestmark = pytest.mark.usefixtures('qapp', 'config_tmpdir') +pytestmark = pytest.mark.usefixtures('qapp') # TODO See ../utils/test_standarddirutils for OSError and caplog assertion @@ -58,18 +58,13 @@ URLS_TO_CHECK = ('http://localhost', 'http://veryverygoodhost.edu') -class BaseDirStub: - - """Mock for objreg.get('args') called in adblock.HostBlocker.read_hosts.""" - - def __init__(self): - self.basedir = None - - @pytest.fixture -def basedir(fake_args): - """Register a Fake basedir.""" - fake_args.basedir = None +def host_blocker_factory(config_tmpdir, data_tmpdir, download_stub, + config_stub): + def factory(): + return adblock.HostBlocker(config_dir=config_tmpdir, + data_dir=data_tmpdir) + return factory def create_zipfile(directory, files, zipname='test'): @@ -133,9 +128,9 @@ def assert_urls(host_blocker, blocked=BLOCKLIST_HOSTS, url = QUrl(str_url) host = url.host() if host in blocked and host not in whitelisted: - assert host_blocker.is_blocked(url) + assert host_blocker._is_blocked(url) else: - assert not host_blocker.is_blocked(url) + assert not host_blocker._is_blocked(url) def blocklist_to_url(filename): @@ -202,13 +197,13 @@ def generic_blocklists(directory): blocklist5.toString()] -def test_disabled_blocking_update(basedir, config_stub, download_stub, - data_tmpdir, tmpdir, win_registry, caplog): +def test_disabled_blocking_update(config_stub, tmpdir, caplog, + host_blocker_factory): """Ensure no URL is blocked when host blocking is disabled.""" config_stub.val.content.host_blocking.lists = generic_blocklists(tmpdir) config_stub.val.content.host_blocking.enabled = False - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker.adblock_update() while host_blocker._in_progress: current_download = host_blocker._in_progress[0] @@ -217,10 +212,10 @@ def test_disabled_blocking_update(basedir, config_stub, download_stub, current_download.finished.emit() host_blocker.read_hosts() for str_url in URLS_TO_CHECK: - assert not host_blocker.is_blocked(QUrl(str_url)) + assert not host_blocker._is_blocked(QUrl(str_url)) -def test_disabled_blocking_per_url(config_stub, data_tmpdir): +def test_disabled_blocking_per_url(config_stub, host_blocker_factory): example_com = 'https://www.example.com/' config_stub.val.content.host_blocking.lists = [] @@ -230,36 +225,34 @@ def test_disabled_blocking_per_url(config_stub, data_tmpdir): url = QUrl('blocked.example.com') - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker._blocked_hosts.add(url.host()) - assert host_blocker.is_blocked(url) - assert not host_blocker.is_blocked(url, first_party_url=QUrl(example_com)) + assert host_blocker._is_blocked(url) + assert not host_blocker._is_blocked(url, first_party_url=QUrl(example_com)) -def test_no_blocklist_update(config_stub, download_stub, - data_tmpdir, basedir, tmpdir, win_registry): +def test_no_blocklist_update(config_stub, download_stub, host_blocker_factory): """Ensure no URL is blocked when no block list exists.""" config_stub.val.content.host_blocking.lists = None config_stub.val.content.host_blocking.enabled = True - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker.adblock_update() host_blocker.read_hosts() for dl in download_stub.downloads: dl.successful = True for str_url in URLS_TO_CHECK: - assert not host_blocker.is_blocked(QUrl(str_url)) + assert not host_blocker._is_blocked(QUrl(str_url)) -def test_successful_update(config_stub, basedir, download_stub, - data_tmpdir, tmpdir, win_registry, caplog): +def test_successful_update(config_stub, tmpdir, caplog, host_blocker_factory): """Ensure hosts from host_blocking.lists are blocked after an update.""" config_stub.val.content.host_blocking.lists = generic_blocklists(tmpdir) config_stub.val.content.host_blocking.enabled = True config_stub.val.content.host_blocking.whitelist = None - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker.adblock_update() # Simulate download is finished while host_blocker._in_progress: @@ -271,11 +264,9 @@ def test_successful_update(config_stub, basedir, download_stub, assert_urls(host_blocker, whitelisted=[]) -def test_parsing_multiple_hosts_on_line(config_stub, basedir, download_stub, - data_tmpdir, tmpdir, win_registry, - caplog): +def test_parsing_multiple_hosts_on_line(host_blocker_factory): """Ensure multiple hosts on a line get parsed correctly.""" - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() bytes_host_line = ' '.join(BLOCKLIST_HOSTS).encode('utf-8') host_blocker._parse_line(bytes_host_line) assert_urls(host_blocker, whitelisted=[]) @@ -299,17 +290,15 @@ def test_parsing_multiple_hosts_on_line(config_stub, basedir, download_stub, ('127.0.1.1', 'myhostname'), ('127.0.0.53', 'myhostname'), ]) -def test_whitelisted_lines(config_stub, basedir, download_stub, data_tmpdir, - tmpdir, win_registry, caplog, ip, host): +def test_whitelisted_lines(host_blocker_factory, ip, host): """Make sure we don't block hosts we don't want to.""" - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() line = ('{} {}'.format(ip, host)).encode('ascii') host_blocker._parse_line(line) assert host not in host_blocker._blocked_hosts -def test_failed_dl_update(config_stub, basedir, download_stub, - data_tmpdir, tmpdir, win_registry, caplog): +def test_failed_dl_update(config_stub, tmpdir, caplog, host_blocker_factory): """One blocklist fails to download. Ensure hosts from this list are not blocked. @@ -323,7 +312,7 @@ def test_failed_dl_update(config_stub, basedir, download_stub, config_stub.val.content.host_blocking.enabled = True config_stub.val.content.host_blocking.whitelist = None - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker.adblock_update() while host_blocker._in_progress: current_download = host_blocker._in_progress[0] @@ -339,8 +328,8 @@ def test_failed_dl_update(config_stub, basedir, download_stub, @pytest.mark.parametrize('location', ['content', 'comment']) -def test_invalid_utf8(config_stub, download_stub, tmpdir, data_tmpdir, - caplog, location): +def test_invalid_utf8(config_stub, tmpdir, caplog, host_blocker_factory, + location): """Make sure invalid UTF-8 is handled correctly. See https://github.com/qutebrowser/qutebrowser/issues/2301 @@ -359,7 +348,7 @@ def test_invalid_utf8(config_stub, download_stub, tmpdir, data_tmpdir, config_stub.val.content.host_blocking.enabled = True config_stub.val.content.host_blocking.whitelist = None - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker.adblock_update() current_download = host_blocker._in_progress[0] @@ -379,26 +368,25 @@ def test_invalid_utf8(config_stub, download_stub, tmpdir, data_tmpdir, def test_invalid_utf8_compiled(config_stub, config_tmpdir, data_tmpdir, - monkeypatch, caplog): + monkeypatch, caplog, host_blocker_factory): """Make sure invalid UTF-8 in the compiled file is handled.""" config_stub.val.content.host_blocking.lists = [] # Make sure the HostBlocker doesn't delete blocked-hosts in __init__ - monkeypatch.setattr(adblock.HostBlocker, '_update_files', + monkeypatch.setattr(adblock.HostBlocker, 'update_files', lambda _self: None) (config_tmpdir / 'blocked-hosts').write_binary( b'https://www.example.org/\xa0') (data_tmpdir / 'blocked-hosts').ensure() - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() with caplog.at_level(logging.ERROR): host_blocker.read_hosts() assert caplog.messages[-1] == "Failed to read host blocklist!" -def test_blocking_with_whitelist(config_stub, basedir, download_stub, - data_tmpdir, tmpdir): +def test_blocking_with_whitelist(config_stub, data_tmpdir, host_blocker_factory): """Ensure hosts in content.host_blocking.whitelist are never blocked.""" # Simulate adblock_update has already been run # by creating a file named blocked-hosts, @@ -412,13 +400,12 @@ def test_blocking_with_whitelist(config_stub, basedir, download_stub, config_stub.val.content.host_blocking.enabled = True config_stub.val.content.host_blocking.whitelist = list(WHITELISTED_HOSTS) - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker.read_hosts() assert_urls(host_blocker) -def test_config_change_initial(config_stub, basedir, download_stub, - data_tmpdir, tmpdir): +def test_config_change_initial(config_stub, tmpdir, host_blocker_factory): """Test emptying host_blocking.lists with existing blocked_hosts. - A blocklist is present in host_blocking.lists and blocked_hosts is @@ -432,14 +419,13 @@ def test_config_change_initial(config_stub, basedir, download_stub, config_stub.val.content.host_blocking.enabled = True config_stub.val.content.host_blocking.whitelist = None - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker.read_hosts() for str_url in URLS_TO_CHECK: - assert not host_blocker.is_blocked(QUrl(str_url)) + assert not host_blocker._is_blocked(QUrl(str_url)) -def test_config_change(config_stub, basedir, download_stub, - data_tmpdir, tmpdir): +def test_config_change(config_stub, tmpdir, host_blocker_factory): """Ensure blocked-hosts resets if host-block-list is changed to None.""" filtered_blocked_hosts = BLOCKLIST_HOSTS[1:] # Exclude localhost blocklist = blocklist_to_url(create_blocklist( @@ -449,16 +435,15 @@ def test_config_change(config_stub, basedir, download_stub, config_stub.val.content.host_blocking.enabled = True config_stub.val.content.host_blocking.whitelist = None - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker.read_hosts() config_stub.val.content.host_blocking.lists = None host_blocker.read_hosts() for str_url in URLS_TO_CHECK: - assert not host_blocker.is_blocked(QUrl(str_url)) + assert not host_blocker._is_blocked(QUrl(str_url)) -def test_add_directory(config_stub, basedir, download_stub, - data_tmpdir, tmpdir): +def test_add_directory(config_stub, tmpdir, host_blocker_factory): """Ensure adblocker can import all files in a directory.""" blocklist_hosts2 = [] for i in BLOCKLIST_HOSTS[1:]: @@ -471,18 +456,18 @@ def test_add_directory(config_stub, basedir, download_stub, config_stub.val.content.host_blocking.lists = [tmpdir.strpath] config_stub.val.content.host_blocking.enabled = True - host_blocker = adblock.HostBlocker() + host_blocker = host_blocker_factory() host_blocker.adblock_update() assert len(host_blocker._blocked_hosts) == len(blocklist_hosts2) * 2 -def test_adblock_benchmark(config_stub, data_tmpdir, basedir, benchmark): +def test_adblock_benchmark(data_tmpdir, benchmark, host_blocker_factory): blocked_hosts = os.path.join(utils.abs_datapath(), 'blocked-hosts') shutil.copy(blocked_hosts, str(data_tmpdir)) url = QUrl('https://www.example.org/') - blocker = adblock.HostBlocker() + blocker = host_blocker_factory() blocker.read_hosts() assert blocker._blocked_hosts - benchmark(lambda: blocker.is_blocked(url)) + benchmark(lambda: blocker._is_blocked(url)) From 7f06b54f25200f8af38dec5acc2510f255912ee4 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 17:22:07 +0100 Subject: [PATCH 316/492] Add more extensions.loader tests --- qutebrowser/extensions/loader.py | 3 +- tests/unit/extensions/test_loader.py | 97 +++++++++++++++++++++++++++- 2 files changed, 97 insertions(+), 3 deletions(-) diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 1a9b3d858..d7a106344 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -142,7 +142,8 @@ def _get_init_context() -> InitContext: args=objreg.get('args')) -def _load_component(info: ExtensionInfo, *, skip_hooks) -> types.ModuleType: +def _load_component(info: ExtensionInfo, *, + skip_hooks=False) -> types.ModuleType: """Load the given extension and run its init hook (if any). Args: diff --git a/tests/unit/extensions/test_loader.py b/tests/unit/extensions/test_loader.py index 710b1ce9c..0a7edc9d3 100644 --- a/tests/unit/extensions/test_loader.py +++ b/tests/unit/extensions/test_loader.py @@ -17,12 +17,18 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . +import types + import pytest from qutebrowser.extensions import loader from qutebrowser.misc import objects +pytestmark = pytest.mark.usefixtures('data_tmpdir', 'config_tmpdir', + 'fake_args') + + def test_on_walk_error(): with pytest.raises(ImportError, match='Failed to import foo'): loader._on_walk_error('foo') @@ -43,7 +49,94 @@ def test_load_component(monkeypatch): monkeypatch.setattr(objects, 'commands', {}) info = loader.ExtensionInfo(name='qutebrowser.components.scrollcommands') - module = loader._load_component(info, skip_hooks=True) + mod = loader._load_component(info, skip_hooks=True) - assert hasattr(module, 'scroll_to_perc') + assert hasattr(mod, 'scroll_to_perc') assert 'scroll-to-perc' in objects.commands + + +@pytest.fixture +def module(monkeypatch, request): + mod = types.ModuleType('testmodule') + + monkeypatch.setattr(loader, '_module_infos', []) + monkeypatch.setattr(loader.importlib, 'import_module', + lambda _name: mod) + + mod.info = loader.add_module_info(mod) + return mod + + +def test_get_init_context(data_tmpdir, config_tmpdir, fake_args): + ctx = loader._get_init_context() + assert str(ctx.data_dir) == data_tmpdir + assert str(ctx.config_dir) == config_tmpdir + assert ctx.args == fake_args + + +def test_add_module_info(): + mod = types.ModuleType('testmodule') + info1 = loader.add_module_info(mod) + assert mod.__qute_module_info is info1 + + info2 = loader.add_module_info(mod) + assert mod.__qute_module_info is info1 + assert info2 is info1 + + +class _Hook: + + """Hook to use in tests.""" + + __name__ = '_Hook' + + def __init__(self): + self.called = False + self.raising = False + + def __call__(self, *args): + if self.raising: + raise Exception("Should not be called!") + self.called = True + + +@pytest.fixture +def hook(): + return _Hook() + + +def test_skip_hooks(hook, module): + hook.raising = True + + module.info.init_hook = hook + module.info.config_changed_hooks = [(None, hook)] + + info = loader.ExtensionInfo(name='testmodule') + loader._load_component(info, skip_hooks=True) + loader._on_config_changed('test') + + assert not hook.called + + +@pytest.mark.parametrize('option_filter, option, called', [ + (None, 'content.javascript.enabled', True), + ('content.javascript', 'content.javascript.enabled', True), + ('content.javascript.enabled', 'content.javascript.enabled', True), + ('content.javascript.log', 'content.javascript.enabled', False), +]) +def test_on_config_changed(configdata_init, hook, module, + option_filter, option, called): + module.info.config_changed_hooks = [(option_filter, hook)] + + info = loader.ExtensionInfo(name='testmodule') + loader._load_component(info) + loader._on_config_changed(option) + + assert hook.called == called + + +def test_init_hook(hook, module): + module.info.init_hook = hook + info = loader.ExtensionInfo(name='testmodule') + loader._load_component(info) + assert hook.called From 98543af57b23d57f11918c51b0c1d1c863a223b3 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 17:35:53 +0100 Subject: [PATCH 317/492] Rename requests/request filters to interceptors So we don't collide with the requests library. --- .../api/{requests.py => interceptor.py} | 12 ++++++------ qutebrowser/browser/webengine/interceptor.py | 8 ++++---- qutebrowser/browser/webkit/mhtml.py | 6 +++--- .../browser/webkit/network/networkmanager.py | 8 ++++---- qutebrowser/components/adblock.py | 6 +++--- .../{requests.py => interceptors.py} | 18 +++++++++--------- 6 files changed, 29 insertions(+), 29 deletions(-) rename qutebrowser/api/{requests.py => interceptor.py} (72%) rename qutebrowser/extensions/{requests.py => interceptors.py} (74%) diff --git a/qutebrowser/api/requests.py b/qutebrowser/api/interceptor.py similarity index 72% rename from qutebrowser/api/requests.py rename to qutebrowser/api/interceptor.py index 5c23418b4..afd23d067 100644 --- a/qutebrowser/api/requests.py +++ b/qutebrowser/api/interceptor.py @@ -19,14 +19,14 @@ """APIs related to intercepting/blocking requests.""" -from qutebrowser.extensions import requests +from qutebrowser.extensions import interceptors # pylint: disable=unused-import -from qutebrowser.extensions.requests import Request +from qutebrowser.extensions.interceptors import Request -def register_filter(reqfilter: requests.RequestFilterType) -> None: - """Register a request filter. +def register(interceptor: interceptors.InterceptorType) -> None: + """Register a request interceptor. - Whenever a request happens, the filter gets called with a Request object. + Whenever a request happens, the interceptor gets called with a Request object. """ - requests.register_filter(reqfilter) + interceptors.register(interceptor) diff --git a/qutebrowser/browser/webengine/interceptor.py b/qutebrowser/browser/webengine/interceptor.py index 863234dc6..a5b7721b8 100644 --- a/qutebrowser/browser/webengine/interceptor.py +++ b/qutebrowser/browser/webengine/interceptor.py @@ -26,7 +26,7 @@ from PyQt5.QtWebEngineCore import (QWebEngineUrlRequestInterceptor, from qutebrowser.config import config from qutebrowser.browser import shared from qutebrowser.utils import utils, log, debug -from qutebrowser.extensions import requests +from qutebrowser.extensions import interceptors class RequestInterceptor(QWebEngineUrlRequestInterceptor): @@ -84,9 +84,9 @@ class RequestInterceptor(QWebEngineUrlRequestInterceptor): return # FIXME:qtwebengine only block ads for NavigationTypeOther? - request = requests.Request(first_party_url=first_party, - request_url=url) - requests.run_filters(request) + request = interceptors.Request(first_party_url=first_party, + request_url=url) + interceptors.run(request) if request.is_blocked: info.block(True) diff --git a/qutebrowser/browser/webkit/mhtml.py b/qutebrowser/browser/webkit/mhtml.py index c390ab6b3..70a22351f 100644 --- a/qutebrowser/browser/webkit/mhtml.py +++ b/qutebrowser/browser/webkit/mhtml.py @@ -39,7 +39,7 @@ from PyQt5.QtCore import QUrl from qutebrowser.browser import downloads from qutebrowser.browser.webkit import webkitelem from qutebrowser.utils import log, objreg, message, usertypes, utils, urlutils -from qutebrowser.extensions import requests +from qutebrowser.extensions import interceptors @attr.s @@ -355,8 +355,8 @@ class _Downloader: # qute, see the comments/discussion on # https://github.com/qutebrowser/qutebrowser/pull/962#discussion_r40256987 # and https://github.com/qutebrowser/qutebrowser/issues/1053 - request = requests.Request(first_party_url=None, request_url=url) - requests.run_filters(request) + request = interceptors.Request(first_party_url=None, request_url=url) + interceptors.run(request) if request.is_blocked: log.downloads.debug("Skipping {}, host-blocked".format(url)) # We still need an empty file in the output, QWebView can be pretty diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py index 9562ba918..dd3643c87 100644 --- a/qutebrowser/browser/webkit/network/networkmanager.py +++ b/qutebrowser/browser/webkit/network/networkmanager.py @@ -38,7 +38,7 @@ if MYPY: from qutebrowser.utils import (message, log, usertypes, utils, objreg, urlutils, debug) from qutebrowser.browser import shared -from qutebrowser.extensions import requests +from qutebrowser.extensions import interceptors from qutebrowser.browser.webkit import certificateerror from qutebrowser.browser.webkit.network import (webkitqutescheme, networkreply, filescheme) @@ -406,9 +406,9 @@ class NetworkManager(QNetworkAccessManager): # the webpage shutdown here. current_url = QUrl() - request = requests.Request(first_party_url=current_url, - request_url=req.url()) - requests.run_filters(request) + request = interceptors.Request(first_party_url=current_url, + request_url=req.url()) + interceptors.run(request) if request.is_blocked: return networkreply.ErrorNetworkReply( req, HOSTBLOCK_ERROR_STRING, QNetworkReply.ContentAccessDenied, diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index d279f1c03..bccb53532 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -31,7 +31,7 @@ import pathlib from PyQt5.QtCore import QUrl from qutebrowser.api import (cmdutils, hook, config, message, downloads, - requests, apitypes) + interceptor, apitypes) logger = logging.getLogger('misc') @@ -123,7 +123,7 @@ class HostBlocker: host in self._config_blocked_hosts) and not _is_whitelisted_url(request_url)) - def filter_request(self, info: requests.Request) -> None: + def filter_request(self, info: interceptor.Request) -> None: """Block the given request if necessary.""" if self._is_blocked(request_url=info.request_url, first_party_url=info.first_party_url): @@ -344,4 +344,4 @@ def init(context: apitypes.InitContext) -> None: config_dir=context.config_dir, has_basedir=context.args.basedir is not None) _host_blocker.read_hosts() - requests.register_filter(_host_blocker.filter_request) + interceptor.register(_host_blocker.filter_request) diff --git a/qutebrowser/extensions/requests.py b/qutebrowser/extensions/interceptors.py similarity index 74% rename from qutebrowser/extensions/requests.py rename to qutebrowser/extensions/interceptors.py index 952c830dc..4a3ac17d4 100644 --- a/qutebrowser/extensions/requests.py +++ b/qutebrowser/extensions/interceptors.py @@ -17,7 +17,7 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -"""Infrastructure for filtering requests.""" +"""Infrastructure for intercepting requests.""" import typing @@ -32,7 +32,7 @@ if MYPY: @attr.s class Request: - """A request which can be blocked.""" + """A request which can be intercepted/blocked.""" first_party_url = attr.ib() # type: QUrl request_url = attr.ib() # type: QUrl @@ -43,16 +43,16 @@ class Request: self.is_blocked = True -RequestFilterType = typing.Callable[[Request], None] +InterceptorType = typing.Callable[[Request], None] -_request_filters = [] # type: typing.List[RequestFilterType] +_interceptors = [] # type: typing.List[InterceptorType] -def register_filter(reqfilter: RequestFilterType) -> None: - _request_filters.append(reqfilter) +def register(interceptor: InterceptorType) -> None: + _interceptors.append(interceptor) -def run_filters(info: Request) -> None: - for reqfilter in _request_filters: - reqfilter(info) +def run(info: Request) -> None: + for interceptor in _interceptors: + interceptor(info) From a3279772d56524f239a82674281618e087499879 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 18:34:11 +0100 Subject: [PATCH 318/492] Fix lint --- qutebrowser/api/interceptor.py | 3 ++- qutebrowser/components/adblock.py | 2 +- qutebrowser/extensions/loader.py | 4 ++-- tests/unit/extensions/test_loader.py | 1 + 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/qutebrowser/api/interceptor.py b/qutebrowser/api/interceptor.py index afd23d067..a40635fca 100644 --- a/qutebrowser/api/interceptor.py +++ b/qutebrowser/api/interceptor.py @@ -27,6 +27,7 @@ from qutebrowser.extensions.interceptors import Request def register(interceptor: interceptors.InterceptorType) -> None: """Register a request interceptor. - Whenever a request happens, the interceptor gets called with a Request object. + Whenever a request happens, the interceptor gets called with a Request + object. """ interceptors.register(interceptor) diff --git a/qutebrowser/components/adblock.py b/qutebrowser/components/adblock.py index bccb53532..9baa12d7c 100644 --- a/qutebrowser/components/adblock.py +++ b/qutebrowser/components/adblock.py @@ -109,7 +109,7 @@ class HostBlocker: self._config_hosts_file = str(config_dir / 'blocked-hosts') def _is_blocked(self, request_url: QUrl, - first_party_url: QUrl = None) -> None: + first_party_url: QUrl = None) -> bool: """Check whether the given request is blocked.""" if first_party_url is not None and not first_party_url.isValid(): first_party_url = None diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index d7a106344..1383adfef 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -87,7 +87,7 @@ def add_module_info(module: types.ModuleType) -> ModuleInfo: return module.__qute_module_info # type: ignore -def load_components(*, skip_hooks=False) -> None: +def load_components(*, skip_hooks: bool = False) -> None: """Load everything from qutebrowser.components.""" for info in walk_components(): _load_component(info, skip_hooks=skip_hooks) @@ -143,7 +143,7 @@ def _get_init_context() -> InitContext: def _load_component(info: ExtensionInfo, *, - skip_hooks=False) -> types.ModuleType: + skip_hooks: bool = False) -> types.ModuleType: """Load the given extension and run its init hook (if any). Args: diff --git a/tests/unit/extensions/test_loader.py b/tests/unit/extensions/test_loader.py index 0a7edc9d3..5265c7cdf 100644 --- a/tests/unit/extensions/test_loader.py +++ b/tests/unit/extensions/test_loader.py @@ -75,6 +75,7 @@ def test_get_init_context(data_tmpdir, config_tmpdir, fake_args): def test_add_module_info(): + # pylint: disable=no-member mod = types.ModuleType('testmodule') info1 = loader.add_module_info(mod) assert mod.__qute_module_info is info1 From 81930d73a81504eddbb76349dd9e846ba079d909 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:13 +0100 Subject: [PATCH 319/492] Update idna from 2.7 to 2.8 --- misc/requirements/requirements-codecov.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-codecov.txt b/misc/requirements/requirements-codecov.txt index 4ce97a976..c42e9991b 100644 --- a/misc/requirements/requirements-codecov.txt +++ b/misc/requirements/requirements-codecov.txt @@ -4,6 +4,6 @@ certifi==2018.11.29 chardet==3.0.4 codecov==2.0.15 coverage==4.5.2 -idna==2.7 +idna==2.8 requests==2.20.1 urllib3==1.24.1 From d4c49718213d6e5d8705de7bd3c77ef81de04798 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:14 +0100 Subject: [PATCH 320/492] Update idna from 2.7 to 2.8 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 39e731984..644099a96 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -7,7 +7,7 @@ cffi==1.11.5 chardet==3.0.4 cryptography==2.4.2 github3.py==1.2.0 -idna==2.7 +idna==2.8 isort==4.3.4 jwcrypto==0.6.0 lazy-object-proxy==1.3.1 From 7c72c7565c744a26803d451b72049dd89d154268 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:16 +0100 Subject: [PATCH 321/492] Update requests from 2.20.1 to 2.21.0 --- misc/requirements/requirements-codecov.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-codecov.txt b/misc/requirements/requirements-codecov.txt index c42e9991b..19ae758af 100644 --- a/misc/requirements/requirements-codecov.txt +++ b/misc/requirements/requirements-codecov.txt @@ -5,5 +5,5 @@ chardet==3.0.4 codecov==2.0.15 coverage==4.5.2 idna==2.8 -requests==2.20.1 +requests==2.21.0 urllib3==1.24.1 From a12fd6721818f74aa3a1190ed8e17b4c809c28a0 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:18 +0100 Subject: [PATCH 322/492] Update requests from 2.20.1 to 2.21.0 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 644099a96..97eaf3fdf 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -16,7 +16,7 @@ pycparser==2.19 pylint==2.2.2 python-dateutil==2.7.5 ./scripts/dev/pylint_checkers -requests==2.20.1 +requests==2.21.0 six==1.11.0 uritemplate==3.0.0 urllib3==1.24.1 From 4288b71039ba74a7be4cd50b3633ee9db1ff0eca Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:19 +0100 Subject: [PATCH 323/492] Update six from 1.11.0 to 1.12.0 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index cd1fcba4d..20a66cd5f 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -22,6 +22,6 @@ pep8-naming==0.7.0 pycodestyle==2.4.0 pydocstyle==3.0.0 pyflakes==2.0.0 -six==1.11.0 +six==1.12.0 snowballstemmer==1.2.1 typing==3.6.6 From aab6ba9ef1582c676933f631408d7af68ff085bc Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:21 +0100 Subject: [PATCH 324/492] Update six from 1.11.0 to 1.12.0 --- misc/requirements/requirements-optional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-optional.txt b/misc/requirements/requirements-optional.txt index 8f1e2498a..aafa38e46 100644 --- a/misc/requirements/requirements-optional.txt +++ b/misc/requirements/requirements-optional.txt @@ -4,4 +4,4 @@ colorama==0.4.1 cssutils==1.0.2 hunter==2.1.0 Pympler==0.6 -six==1.11.0 +six==1.12.0 From 9b6b0ef1a52b8ccb554215f1e4ae76ea5edf3f4d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:22 +0100 Subject: [PATCH 325/492] Update six from 1.11.0 to 1.12.0 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index 43085ddd7..1e1934e76 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -4,5 +4,5 @@ appdirs==1.4.3 packaging==18.0 pyparsing==2.3.0 setuptools==40.6.2 -six==1.11.0 +six==1.12.0 wheel==0.32.3 From fe919769ba3b3ef85a560e37db503871469d864f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:24 +0100 Subject: [PATCH 326/492] Update six from 1.11.0 to 1.12.0 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 97eaf3fdf..b3ecdaf70 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -17,7 +17,7 @@ pylint==2.2.2 python-dateutil==2.7.5 ./scripts/dev/pylint_checkers requests==2.21.0 -six==1.11.0 +six==1.12.0 uritemplate==3.0.0 urllib3==1.24.1 wrapt==1.10.11 From f8c56ffaf6336102b369b04fd816aceb3ada7d62 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:25 +0100 Subject: [PATCH 327/492] Update six from 1.11.0 to 1.12.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 7d8a4f33e..24dc51613 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -36,6 +36,6 @@ pytest-rerunfailures==5.0 pytest-travis-fold==1.3.0 pytest-xvfb==1.1.0 PyVirtualDisplay==0.2.1 -six==1.11.0 +six==1.12.0 vulture==1.0 Werkzeug==0.14.1 From 9c141314c53bfde9887ca1f55bc8f911a01ce4f6 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:27 +0100 Subject: [PATCH 328/492] Update six from 1.11.0 to 1.12.0 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index 097859b6e..b6c9e9d6f 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -3,7 +3,7 @@ filelock==3.0.10 pluggy==0.8.0 py==1.7.0 -six==1.11.0 +six==1.12.0 toml==0.10.0 tox==3.5.3 virtualenv==16.1.0 From db62c52c442147cdf99c3b192318c37b73206089 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:28 +0100 Subject: [PATCH 329/492] Update mypy from 0.641 to 0.650 --- misc/requirements/requirements-mypy.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt index f2951fdf5..f84b63e92 100644 --- a/misc/requirements/requirements-mypy.txt +++ b/misc/requirements/requirements-mypy.txt @@ -1,6 +1,6 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py -mypy==0.641 +mypy==0.650 mypy-extensions==0.4.1 PyQt5==5.11.3 PyQt5-sip==4.19.13 From 20e9c22dc63af3e147496e1aeda9d44fd0c13f84 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 10 Dec 2018 19:19:30 +0100 Subject: [PATCH 330/492] Update hypothesis from 3.82.1 to 3.82.5 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 24dc51613..9b4bcc96f 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -12,7 +12,7 @@ EasyProcess==0.2.3 Flask==1.0.2 glob2==0.6 hunter==2.1.0 -hypothesis==3.82.1 +hypothesis==3.82.5 itsdangerous==1.1.0 # Jinja2==2.10 Mako==1.0.7 From 4a1333795f5daccbcdd198db2478f538db156048 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 19:52:20 +0100 Subject: [PATCH 331/492] Add api/interceptor.py to check_coverage --- scripts/dev/check_coverage.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/dev/check_coverage.py b/scripts/dev/check_coverage.py index 62c0b5142..d42ce1d71 100644 --- a/scripts/dev/check_coverage.py +++ b/scripts/dev/check_coverage.py @@ -204,6 +204,7 @@ WHITELISTED_FILES = [ 'browser/webkit/webkitinspector.py', 'keyinput/macros.py', 'browser/webkit/webkitelem.py', + 'api/interceptor.py', ] From 184e41b5389d5c1e8c5cbcf873cd55eefa84c4d7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 10 Dec 2018 20:03:31 +0100 Subject: [PATCH 332/492] Adjustments for mypy upgrade --- mypy.ini | 4 ---- qutebrowser/utils/utils.py | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/mypy.ini b/mypy.ini index 8fb8d89ae..b8b2cf16f 100644 --- a/mypy.ini +++ b/mypy.ini @@ -18,10 +18,6 @@ disallow_untyped_decorators = True # no_implicit_optional = True # warn_return_any = True -[mypy-faulthandler] -# https://github.com/python/typeshed/pull/2627 -ignore_missing_imports = True - [mypy-colorama] # https://github.com/tartley/colorama/issues/206 ignore_missing_imports = True diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py index 8574a3c2b..2d517043a 100644 --- a/qutebrowser/utils/utils.py +++ b/qutebrowser/utils/utils.py @@ -45,7 +45,8 @@ try: CSafeDumper as YamlDumper) YAML_C_EXT = True except ImportError: # pragma: no cover - from yaml import SafeLoader as YamlLoader, SafeDumper as YamlDumper + from yaml import (SafeLoader as YamlLoader, # type: ignore + SafeDumper as YamlDumper) YAML_C_EXT = False import qutebrowser From 0aa342eae617f5c6722fdf7b14d78d8f58cc0849 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 11 Dec 2018 11:05:06 +0100 Subject: [PATCH 333/492] Mark test_appendchild as xfail on Qt 5.12 See #4244 --- tests/unit/javascript/stylesheet/test_stylesheet.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit/javascript/stylesheet/test_stylesheet.py b/tests/unit/javascript/stylesheet/test_stylesheet.py index 2b1c7ced5..c58a0401d 100644 --- a/tests/unit/javascript/stylesheet/test_stylesheet.py +++ b/tests/unit/javascript/stylesheet/test_stylesheet.py @@ -25,7 +25,7 @@ import pytest QtWebEngineWidgets = pytest.importorskip("PyQt5.QtWebEngineWidgets") QWebEngineProfile = QtWebEngineWidgets.QWebEngineProfile -from qutebrowser.utils import javascript +from qutebrowser.utils import javascript, qtutils DEFAULT_BODY_BG = "rgba(0, 0, 0, 0)" @@ -128,6 +128,8 @@ def test_set_error(stylesheet_tester, config_stub): stylesheet_tester.check_set(GREEN_BODY_BG) +@pytest.mark.xfail(qtutils.version_check('5.12', compiled=False), + reason='Broken with Qt 5.12') def test_appendchild(stylesheet_tester): stylesheet_tester.js.load('stylesheet/simple.html') stylesheet_tester.init_stylesheet() From 63510c41f5b8da4cad35133ba63afb313fe5d731 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 11 Dec 2018 18:36:20 +0100 Subject: [PATCH 334/492] Don't wait for focus ready message on Qt 5.12 Looks like there's no internal widget focused anymore... --- tests/end2end/fixtures/quteprocess.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/end2end/fixtures/quteprocess.py b/tests/end2end/fixtures/quteprocess.py index 561d92a80..146817c12 100644 --- a/tests/end2end/fixtures/quteprocess.py +++ b/tests/end2end/fixtures/quteprocess.py @@ -356,7 +356,10 @@ class QuteProc(testprocess.Process): self._focus_ready = True else: raise ValueError("Invalid value {!r} for 'what'.".format(what)) - if self._load_ready and self._focus_ready: + + is_qt_5_12 = qtutils.version_check('5.12', compiled=False) + if ((self._load_ready and self._focus_ready) or + (self._load_ready and is_qt_5_12)): self._load_ready = False self._focus_ready = False self.ready.emit() From 0953596ed6761f197dcd5f137175f5c57fe37eeb Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 11 Dec 2018 18:36:52 +0100 Subject: [PATCH 335/492] Skip remaining tests which are broken on Qt 5.12 See #4320, #4244 --- tests/end2end/features/javascript.feature | 6 +++--- tests/unit/javascript/stylesheet/test_stylesheet.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/end2end/features/javascript.feature b/tests/end2end/features/javascript.feature index e4b477e50..8fedf5af1 100644 --- a/tests/end2end/features/javascript.feature +++ b/tests/end2end/features/javascript.feature @@ -124,9 +124,9 @@ Feature: Javascript stuff # https://github.com/qutebrowser/qutebrowser/issues/1190 # https://github.com/qutebrowser/qutebrowser/issues/2495 - # Currently broken on Windows: + # Currently broken on Windows and on Qt 5.12 # https://github.com/qutebrowser/qutebrowser/issues/4230 - @posix + @posix @qt<5.12 Scenario: Checking visible/invisible window size When I run :tab-only And I open data/javascript/windowsize.html in a new background tab @@ -134,7 +134,7 @@ Feature: Javascript stuff And I run :tab-next Then the window sizes should be the same - @flaky + @flaky @qt<5.12 Scenario: Checking visible/invisible window size with vertical tabbar When I run :tab-only And I set tabs.position to left diff --git a/tests/unit/javascript/stylesheet/test_stylesheet.py b/tests/unit/javascript/stylesheet/test_stylesheet.py index c58a0401d..145e8ee5e 100644 --- a/tests/unit/javascript/stylesheet/test_stylesheet.py +++ b/tests/unit/javascript/stylesheet/test_stylesheet.py @@ -128,8 +128,8 @@ def test_set_error(stylesheet_tester, config_stub): stylesheet_tester.check_set(GREEN_BODY_BG) -@pytest.mark.xfail(qtutils.version_check('5.12', compiled=False), - reason='Broken with Qt 5.12') +@pytest.mark.skip(qtutils.version_check('5.12', compiled=False), + reason='Broken with Qt 5.12') def test_appendchild(stylesheet_tester): stylesheet_tester.js.load('stylesheet/simple.html') stylesheet_tester.init_stylesheet() From 0fbe4371a7b64e0ba39e379a98e97573d28093e9 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 11 Dec 2018 19:02:04 +0100 Subject: [PATCH 336/492] Initialize Sphinx --- .gitignore | 1 + doc/extapi/Makefile | 19 ++++ doc/extapi/_static/.gitkeep | 0 doc/extapi/_templates/.gitkeep | 0 doc/extapi/conf.py | 177 +++++++++++++++++++++++++++++++++ doc/extapi/index.rst | 20 ++++ doc/extapi/make.bat | 35 +++++++ 7 files changed, 252 insertions(+) create mode 100644 doc/extapi/Makefile create mode 100644 doc/extapi/_static/.gitkeep create mode 100644 doc/extapi/_templates/.gitkeep create mode 100644 doc/extapi/conf.py create mode 100644 doc/extapi/index.rst create mode 100644 doc/extapi/make.bat diff --git a/.gitignore b/.gitignore index 9efceef63..ceafd9946 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ TODO /scripts/testbrowser/cpp/webengine/.qmake.stash /scripts/dev/pylint_checkers/qute_pylint.egg-info /misc/file_version_info.txt +/doc/extapi/_build diff --git a/doc/extapi/Makefile b/doc/extapi/Makefile new file mode 100644 index 000000000..298ea9e21 --- /dev/null +++ b/doc/extapi/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/doc/extapi/_static/.gitkeep b/doc/extapi/_static/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/doc/extapi/_templates/.gitkeep b/doc/extapi/_templates/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/doc/extapi/conf.py b/doc/extapi/conf.py new file mode 100644 index 000000000..986290a48 --- /dev/null +++ b/doc/extapi/conf.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'qutebrowser extensions' +copyright = '2018, Florian Bruhin' +author = 'Florian Bruhin' + +# The short X.Y version +version = '' +# The full version, including alpha/beta/rc tags +release = '' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'qutebrowserextensionsdoc' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'qutebrowserextensions.tex', 'qutebrowser extensions Documentation', + 'Florian Bruhin', 'manual'), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'qutebrowserextensions', 'qutebrowser extensions Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'qutebrowserextensions', 'qutebrowser extensions Documentation', + author, 'qutebrowserextensions', 'One line description of project.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + + +# -- Extension configuration ------------------------------------------------- \ No newline at end of file diff --git a/doc/extapi/index.rst b/doc/extapi/index.rst new file mode 100644 index 000000000..896c43891 --- /dev/null +++ b/doc/extapi/index.rst @@ -0,0 +1,20 @@ +.. qutebrowser extensions documentation master file, created by + sphinx-quickstart on Tue Dec 11 18:59:44 2018. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to qutebrowser extensions's documentation! +================================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/doc/extapi/make.bat b/doc/extapi/make.bat new file mode 100644 index 000000000..27f573b87 --- /dev/null +++ b/doc/extapi/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd From 24d45bfcba46dabceb3964d0eebc491873a44f7b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 11 Dec 2018 19:08:21 +0100 Subject: [PATCH 337/492] Move Sphinx to tox --- doc/extapi/Makefile | 19 ---------- doc/extapi/make.bat | 35 ------------------- misc/requirements/requirements-sphinx.txt | 21 +++++++++++ misc/requirements/requirements-sphinx.txt-raw | 1 + tox.ini | 10 ++++++ 5 files changed, 32 insertions(+), 54 deletions(-) delete mode 100644 doc/extapi/Makefile delete mode 100644 doc/extapi/make.bat create mode 100644 misc/requirements/requirements-sphinx.txt create mode 100644 misc/requirements/requirements-sphinx.txt-raw diff --git a/doc/extapi/Makefile b/doc/extapi/Makefile deleted file mode 100644 index 298ea9e21..000000000 --- a/doc/extapi/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/doc/extapi/make.bat b/doc/extapi/make.bat deleted file mode 100644 index 27f573b87..000000000 --- a/doc/extapi/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/misc/requirements/requirements-sphinx.txt b/misc/requirements/requirements-sphinx.txt new file mode 100644 index 000000000..c0801a48e --- /dev/null +++ b/misc/requirements/requirements-sphinx.txt @@ -0,0 +1,21 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +alabaster==0.7.12 +Babel==2.6.0 +certifi==2018.11.29 +chardet==3.0.4 +docutils==0.14 +idna==2.8 +imagesize==1.1.0 +Jinja2==2.10 +MarkupSafe==1.1.0 +packaging==18.0 +Pygments==2.3.0 +pyparsing==2.3.0 +pytz==2018.7 +requests==2.21.0 +six==1.12.0 +snowballstemmer==1.2.1 +Sphinx==1.8.2 +sphinxcontrib-websupport==1.1.0 +urllib3==1.24.1 diff --git a/misc/requirements/requirements-sphinx.txt-raw b/misc/requirements/requirements-sphinx.txt-raw new file mode 100644 index 000000000..6966869c7 --- /dev/null +++ b/misc/requirements/requirements-sphinx.txt-raw @@ -0,0 +1 @@ +sphinx diff --git a/tox.ini b/tox.ini index 8a4232aaa..8fb312798 100644 --- a/tox.ini +++ b/tox.ini @@ -199,3 +199,13 @@ deps = -r{toxinidir}/misc/requirements/requirements-mypy.txt commands = {envpython} -m mypy qutebrowser {posargs} + +[testenv:sphinx] +basepython = {env:PYTHON:python3} +passenv = +deps = + -r{toxinidir}/requirements.txt + -r{toxinidir}/misc/requirements/requirements-pyqt.txt + -r{toxinidir}/misc/requirements/requirements-sphinx.txt +commands = + {envpython} -m sphinx doc/extapi/ doc/extapi/_build/ From 61bfecc4abf367180ad3387ea6bd06318fe67767 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 11 Dec 2018 19:20:46 +0100 Subject: [PATCH 338/492] Initial sphinx docs --- doc/extapi/conf.py | 3 ++- doc/extapi/index.rst | 46 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/doc/extapi/conf.py b/doc/extapi/conf.py index 986290a48..09105248a 100644 --- a/doc/extapi/conf.py +++ b/doc/extapi/conf.py @@ -40,6 +40,7 @@ release = '' # ones. extensions = [ 'sphinx.ext.autodoc', + 'sphinx.ext.napoleon', ] # Add any paths that contain templates here, relative to this directory. @@ -174,4 +175,4 @@ epub_title = project epub_exclude_files = ['search.html'] -# -- Extension configuration ------------------------------------------------- \ No newline at end of file +# -- Extension configuration ------------------------------------------------- diff --git a/doc/extapi/index.rst b/doc/extapi/index.rst index 896c43891..e176e3a0d 100644 --- a/doc/extapi/index.rst +++ b/doc/extapi/index.rst @@ -10,7 +10,53 @@ Welcome to qutebrowser extensions's documentation! :maxdepth: 2 :caption: Contents: +cmdutils module +--------------- +.. automodule:: qutebrowser.api.cmdutils + :members: + +.. FIXME: What about imported things? + +apitypes module +--------------- + +.. automodule:: qutebrowser.api.apitypes + :members: + :imported-members: + +config module +------------- + +.. automodule:: qutebrowser.api.config + :members: + +downloads module +---------------- + +.. automodule:: qutebrowser.api.downloads + :members: + +hook module +----------- + +.. automodule:: qutebrowser.api.hook + :members: + +interceptor module +------------------ + +.. automodule:: qutebrowser.api.interceptor + :members: + +.. FIXME: What about imported things? + +message module +-------------- + +.. automodule:: qutebrowser.api.message + :members: + :imported-members: Indices and tables ================== From a0437a3e683fa81e271be88c907e25143d0e467c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 12 Dec 2018 08:10:28 +0100 Subject: [PATCH 339/492] Improve Sphinx docs --- doc/extapi/api.rst | 48 +++++++++++ doc/extapi/index.rst | 48 +---------- doc/extapi/tab.rst | 44 +++++++++++ qutebrowser/api/cmdutils.py | 97 ++++++++++++++++++----- qutebrowser/api/config.py | 10 +++ qutebrowser/api/downloads.py | 15 ++++ qutebrowser/api/hook.py | 37 ++++++++- qutebrowser/api/interceptor.py | 10 ++- qutebrowser/browser/browsertab.py | 105 +++++++++++-------------- qutebrowser/browser/webelem.py | 13 +-- qutebrowser/extensions/interceptors.py | 4 + qutebrowser/utils/message.py | 20 ++--- qutebrowser/utils/usertypes.py | 42 +++++++--- 13 files changed, 337 insertions(+), 156 deletions(-) create mode 100644 doc/extapi/api.rst create mode 100644 doc/extapi/tab.rst diff --git a/doc/extapi/api.rst b/doc/extapi/api.rst new file mode 100644 index 000000000..b63db57c3 --- /dev/null +++ b/doc/extapi/api.rst @@ -0,0 +1,48 @@ +API modules +=========== + +cmdutils module +--------------- + +.. automodule:: qutebrowser.api.cmdutils + :members: + :imported-members: + +apitypes module +--------------- + +.. automodule:: qutebrowser.api.apitypes + :members: + :imported-members: + +config module +------------- + +.. automodule:: qutebrowser.api.config + :members: + +downloads module +---------------- + +.. automodule:: qutebrowser.api.downloads + :members: + +hook module +----------- + +.. automodule:: qutebrowser.api.hook + :members: + +interceptor module +------------------ + +.. automodule:: qutebrowser.api.interceptor + :members: + :imported-members: + +message module +-------------- + +.. automodule:: qutebrowser.api.message + :members: + :imported-members: diff --git a/doc/extapi/index.rst b/doc/extapi/index.rst index e176e3a0d..d181c2ccd 100644 --- a/doc/extapi/index.rst +++ b/doc/extapi/index.rst @@ -10,53 +10,9 @@ Welcome to qutebrowser extensions's documentation! :maxdepth: 2 :caption: Contents: -cmdutils module ---------------- + api + tab -.. automodule:: qutebrowser.api.cmdutils - :members: - -.. FIXME: What about imported things? - -apitypes module ---------------- - -.. automodule:: qutebrowser.api.apitypes - :members: - :imported-members: - -config module -------------- - -.. automodule:: qutebrowser.api.config - :members: - -downloads module ----------------- - -.. automodule:: qutebrowser.api.downloads - :members: - -hook module ------------ - -.. automodule:: qutebrowser.api.hook - :members: - -interceptor module ------------------- - -.. automodule:: qutebrowser.api.interceptor - :members: - -.. FIXME: What about imported things? - -message module --------------- - -.. automodule:: qutebrowser.api.message - :members: - :imported-members: Indices and tables ================== diff --git a/doc/extapi/tab.rst b/doc/extapi/tab.rst new file mode 100644 index 000000000..57a14ac6e --- /dev/null +++ b/doc/extapi/tab.rst @@ -0,0 +1,44 @@ +Tab API +======= + +.. autoclass:: qutebrowser.browser.browsertab.AbstractTab() + :members: + +.. autoclass:: qutebrowser.browser.browsertab.AbstractAction() + :members: + +.. autoclass:: qutebrowser.browser.browsertab.AbstractPrinting() + :members: + +.. autoclass:: qutebrowser.browser.browsertab.AbstractSearch() + :members: + +.. autoclass:: qutebrowser.browser.browsertab.AbstractZoom() + :members: + +.. autoclass:: qutebrowser.browser.browsertab.AbstractCaret() + :members: + +.. autoclass:: qutebrowser.browser.browsertab.AbstractScroller() + :members: + +.. autoclass:: qutebrowser.browser.browsertab.AbstractHistory() + :members: + +.. autoclass:: qutebrowser.browser.browsertab.AbstractElements() + :members: + +.. autoclass:: qutebrowser.browser.browsertab.AbstractAudio() + :members: + +Web element API +=============== + +.. autoclass:: qutebrowser.browser.webelem.AbstractWebElement + :members: + +.. autoclass:: qutebrowser.browser.webelem.Error + :members: + +.. autoclass:: qutebrowser.browser.webelem.OrphanedError + :members: diff --git a/qutebrowser/api/cmdutils.py b/qutebrowser/api/cmdutils.py index 093244727..f6a6f6da9 100644 --- a/qutebrowser/api/cmdutils.py +++ b/qutebrowser/api/cmdutils.py @@ -17,7 +17,38 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -"""Utilities for command handlers.""" +""" +qutebrowser has the concept of functions which are exposed to the user as +commands. + +Creating a new command is straightforward:: + + from qutebrowser.api import cmdutils + + @cmdutils.register(...) + def foo(): + ... + +The commands arguments are automatically deduced by inspecting your function. + +The types of the function arguments are inferred based on their default values, +e.g., an argument `foo=True` will be converted to a flag `-f`/`--foo` in +qutebrowser's commandline. + +The type can be overridden using Python's function annotations:: + + @cmdutils.register(...) + def foo(bar: int, baz=True): + ... + +Possible values: + +- A callable (``int``, ``float``, etc.): Gets called to validate/convert the value. +- A python enum type: All members of the enum are possible values. +- A ``typing.Union`` of multiple types above: Any of these types are valid + values, e.g., ``typing.Union[str, int]``. +""" + import inspect import typing @@ -33,15 +64,17 @@ class CommandError(cmdexc.Error): """Raised when a command encounters an error while running. If your command handler encounters an error and cannot continue, raise this - exception with an appropriate error message: + exception with an appropriate error message:: raise cmdexc.CommandError("Message") The message will then be shown in the qutebrowser status bar. - Note that you should only raise this exception while a command handler is - run. Raising it at another point causes qutebrowser to crash due to an - unhandled exception. + .. note:: + + You should only raise this exception while a command handler is run. + Raising it at another point causes qutebrowser to crash due to an + unhandled exception. """ @@ -76,13 +109,7 @@ def check_exclusive(flags: typing.Iterable[bool], class register: # noqa: N801,N806 pylint: disable=invalid-name - """Decorator to register a new command handler. - - Attributes: - _instance: The object from the object registry to be used as "self". - _name: The name (as string) or names (as list) of the command. - _kwargs: The arguments to pass to Command. - """ + """Decorator to register a new command handler.""" def __init__(self, *, instance: str = None, @@ -95,8 +122,11 @@ class register: # noqa: N801,N806 pylint: disable=invalid-name Args: See class attributes. """ + # The object from the object registry to be used as "self". self._instance = instance + # The name (as string) or names (as list) of the command. self._name = name + # The arguments to pass to Command. self._kwargs = kwargs def __call__(self, func: typing.Callable) -> typing.Callable: @@ -127,16 +157,47 @@ class register: # noqa: N801,N806 pylint: disable=invalid-name class argument: # noqa: N801,N806 pylint: disable=invalid-name - """Decorator to customize an argument for @cmdutils.register. + """Decorator to customize an argument. - Attributes: - _argname: The name of the argument to handle. - _kwargs: Keyword arguments, valid ArgInfo members + You can customize how an argument is handled using the ``@cmdutils.argument`` + decorator *after* ``@cmdutils.register``. This can, for example, be used to + customize the flag an argument should get:: + + @cmdutils.register(...) + @cmdutils.argument('bar', flag='c') + def foo(bar): + ... + + For a ``str`` argument, you can restrict the allowed strings using ``choices``:: + + @cmdutils.register(...) + @cmdutils.argument('bar', choices=['val1', 'val2']) + def foo(bar: str): + ... + + For ``typing.Union`` types, the given ``choices`` are only checked if other types + (like ``int``) don't match. + + The following arguments are supported for ``@cmdutils.argument``: + + - ``flag``: Customize the short flag (``-x``) the argument will get. + - ``value``: Tell qutebrowser to fill the argument with special values: + + * ``value=cmdutils.Value.count``: The ``count`` given by the user to the command. + * ``value=cmdutils.Value.win_id``: The window ID of the current window. + * ``value=cmdutils.Value.cur_tab``: The tab object which is currently focused. + + - ``completion``: A completion function to use when completing arguments for + the given command. + - ``choices``: The allowed string choices for the argument. + + The name of an argument will always be the parameter name, with any trailing + underscores stripped and underscores replaced by dashes. """ def __init__(self, argname: str, **kwargs: typing.Any) -> None: - self._argname = argname - self._kwargs = kwargs + self._argname = argname # The name of the argument to handle. + self._kwargs = kwargs # Valid ArgInfo members. def __call__(self, func: typing.Callable) -> typing.Callable: funcname = func.__name__ diff --git a/qutebrowser/api/config.py b/qutebrowser/api/config.py index 4a5d73936..0c633e54d 100644 --- a/qutebrowser/api/config.py +++ b/qutebrowser/api/config.py @@ -25,6 +25,16 @@ from PyQt5.QtCore import QUrl from qutebrowser.config import config +#: Simplified access to config values using attribute acccess. +#: For example, to access the ``content.javascript.enabled`` setting, +#: you can do:: +#: +#: if config.val.content.javascript.enabled: +#: ... +#: +#: This also supports setting configuration values:: +#: +#: config.val.content.javascript.enabled = False val = typing.cast('config.ConfigContainer', None) diff --git a/qutebrowser/api/downloads.py b/qutebrowser/api/downloads.py index 82c68d0bd..a2a37d931 100644 --- a/qutebrowser/api/downloads.py +++ b/qutebrowser/api/downloads.py @@ -52,6 +52,21 @@ def download_temp(url: QUrl) -> TempDownload: """Download the given URL into a file object. The download is not saved to disk. + + Returns a ``TempDownload`` object, which triggers a ``finished`` signal + when the download has finished:: + + dl = downloads.download_temp(QUrl("https://www.example.com/")) + dl.finished.connect(functools.partial(on_download_finished, dl)) + + After the download has finished, its ``successful`` attribute can be + checked to make sure it finished successfully. If so, its contents can be + read by accessing the ``fileobj`` attribute:: + + def on_download_finished(download: downloads.TempDownload) -> None: + if download.successful: + print(download.fileobj.read()) + download.fileobj.close() """ fobj = io.BytesIO() fobj.name = 'temporary: ' + url.host() diff --git a/qutebrowser/api/hook.py b/qutebrowser/api/hook.py index 3f06121da..84e103cbd 100644 --- a/qutebrowser/api/hook.py +++ b/qutebrowser/api/hook.py @@ -36,7 +36,17 @@ def _add_module_info(func: typing.Callable) -> loader.ModuleInfo: class init: - """Decorator to mark a function to run when initializing.""" + """Decorator to mark a function to run when initializing. + + The decorated function gets called with a + :class:`qutebrowser.api.apitypes.InitContext` as argument. + + Example:: + + @hook.init() + def init(_context): + message.info("Extension initialized.") + """ def __call__(self, func: typing.Callable) -> typing.Callable: info = _add_module_info(func) @@ -48,7 +58,30 @@ class init: class config_changed: - """Decorator to get notified about changed configs.""" + """Decorator to get notified about changed configs. + + By default, the decorated function is called when any change in the config + occurs:: + + @hook.config_changed() + def on_config_changed(): + ... + + When an option name is passed, it's only called when the given option was + changed:: + + @hook.config_changed('content.javascript.enabled') + def on_config_changed(): + ... + + Alternatively, a part of an option name can be specified. In the following + snippet, ``on_config_changed`` gets called when either + ``bindings.commands`` or ``bindings.key_mappings`` have changed:: + + @hook.config_changed('bindings') + def on_config_changed(): + ... + """ def __init__(self, option_filter: str = None) -> None: self._filter = option_filter diff --git a/qutebrowser/api/interceptor.py b/qutebrowser/api/interceptor.py index a40635fca..634ae1409 100644 --- a/qutebrowser/api/interceptor.py +++ b/qutebrowser/api/interceptor.py @@ -27,7 +27,13 @@ from qutebrowser.extensions.interceptors import Request def register(interceptor: interceptors.InterceptorType) -> None: """Register a request interceptor. - Whenever a request happens, the interceptor gets called with a Request - object. + Whenever a request happens, the interceptor gets called with a + :class:`Request` object. + + Example:: + + def intercept(request: interceptor.Request) -> None: + if request.request_url.host() == 'badhost.example.com': + request.block() """ interceptors.register(interceptor) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 3bd4c55c3..029394657 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -141,14 +141,11 @@ class TabData: class AbstractAction: - """Attribute of AbstractTab for Qt WebActions. - - Class attributes (overridden by subclasses): - action_class: The class actions are defined on (QWeb{Engine,}Page) - action_base: The type of the actions (QWeb{Engine,}Page.WebAction) - """ + """Attribute ``action`` of AbstractTab for Qt WebActions.""" + # The class actions are defined on (QWeb{Engine,}Page) action_class = None # type: type + # The type of the actions (QWeb{Engine,}Page.WebAction) action_base = None # type: type def __init__(self, tab: 'AbstractTab') -> None: @@ -200,7 +197,7 @@ class AbstractAction: class AbstractPrinting: - """Attribute of AbstractTab for printing the page.""" + """Attribute ``printing`` of AbstractTab for printing the page.""" def __init__(self, tab: 'AbstractTab') -> None: self._widget = None @@ -271,7 +268,7 @@ class AbstractPrinting: class AbstractSearch(QObject): - """Attribute of AbstractTab for doing searches. + """Attribute ``search`` of AbstractTab for doing searches. Attributes: text: The last thing this view was searched for. @@ -279,15 +276,14 @@ class AbstractSearch(QObject): this view. _flags: The flags of the last search (needs to be set by subclasses). _widget: The underlying WebView widget. - - Signals: - finished: Emitted when a search was finished. - arg: True if the text was found, False otherwise. - cleared: Emitted when an existing search was cleared. """ + #: Signal emitted when a search was finished + #: (True if the text was found, False otherwise) finished = pyqtSignal(bool) + #: Signal emitted when an existing search was cleared. cleared = pyqtSignal() + _Callback = typing.Callable[[bool], None] def __init__(self, tab: 'AbstractTab', parent: QWidget = None): @@ -350,17 +346,13 @@ class AbstractSearch(QObject): class AbstractZoom(QObject): - """Attribute of AbstractTab for controlling zoom. - - Attributes: - _neighborlist: A NeighborList with the zoom levels. - _default_zoom_changed: Whether the zoom was changed from the default. - """ + """Attribute ``zoom`` of AbstractTab for controlling zoom.""" def __init__(self, tab: 'AbstractTab', parent: QWidget = None) -> None: super().__init__(parent) self._tab = tab self._widget = None + # Whether zoom was changed from the default. self._default_zoom_changed = False self._init_neighborlist() config.instance.changed.connect(self._on_config_changed) @@ -375,7 +367,9 @@ class AbstractZoom(QObject): self._init_neighborlist() def _init_neighborlist(self) -> None: - """Initialize self._neighborlist.""" + """Initialize self._neighborlist. + + It is a NeighborList with the zoom levels.""" levels = config.val.zoom.levels self._neighborlist = usertypes.NeighborList( levels, mode=usertypes.NeighborList.Modes.edge) @@ -427,15 +421,12 @@ class AbstractZoom(QObject): class AbstractCaret(QObject): - """Attribute of AbstractTab for caret browsing. - - Signals: - selection_toggled: Emitted when the selection was toggled. - arg: Whether the selection is now active. - follow_selected_done: Emitted when a follow_selection action is done. - """ + """Attribute ``caret`` of AbstractTab for caret browsing.""" + #: Signal emitted when the selection was toggled. + #: (argument - whether the selection is now active) selection_toggled = pyqtSignal(bool) + #: Emitted when a ``follow_selection`` action is done. follow_selected_done = pyqtSignal() def __init__(self, @@ -522,16 +513,12 @@ class AbstractCaret(QObject): class AbstractScroller(QObject): - """Attribute of AbstractTab to manage scroll position. - - Signals: - perc_changed: The scroll position changed. - before_jump_requested: - Emitted by other code when the user requested a jump. - Used to set the special ' mark so the user can return. - """ + """Attribute ``scroller`` of AbstractTab to manage scroll position.""" + #: Signal emitted when the scroll position changed (int, int) perc_changed = pyqtSignal(int, int) + #: Signal emitted before the user requested a jump. + #: Used to set the special ' mark so the user can return. before_jump_requested = pyqtSignal() def __init__(self, tab: 'AbstractTab', parent: QWidget = None): @@ -833,42 +820,46 @@ class AbstractTabPrivate: class AbstractTab(QWidget): - """An adapter for QWebView/QWebEngineView representing a single tab. - - Signals: - See related Qt signals. - - new_tab_requested: Emitted when a new tab should be opened with the - given URL. - load_status_changed: The loading status changed - fullscreen_requested: Fullscreen display was requested by the page. - arg: True if fullscreen should be turned on, - False if it should be turned off. - renderer_process_terminated: Emitted when the underlying renderer - process terminated. - arg 0: A TerminationStatus member. - arg 1: The exit code. - before_load_started: Emitted before we tell Qt to open a URL. - """ + """An adapter for QWebView/QWebEngineView representing a single tab.""" + #: Signal emitted when a website requests to close this tab. window_close_requested = pyqtSignal() + #: Signal emitted when a link is hovered (the hover text) link_hovered = pyqtSignal(str) + #: Signal emitted when a page started loading load_started = pyqtSignal() + #: Signal emitted when a page is loading (progress percentage) load_progress = pyqtSignal(int) + #: Signal emitted when a page finished loading (success as bool) load_finished = pyqtSignal(bool) + #: Signal emitted when a page's favicon changed (icon as QIcon) icon_changed = pyqtSignal(QIcon) + #: Signal emitted when a page's title changed (new title as str) title_changed = pyqtSignal(str) - load_status_changed = pyqtSignal(usertypes.LoadStatus) + #: Signal emitted when a new tab should be opened (url as QUrl) new_tab_requested = pyqtSignal(QUrl) + #: Signal emitted when a page's URL changed (url as QUrl) url_changed = pyqtSignal(QUrl) - shutting_down = pyqtSignal() + #: Signal emitted when a tab's content size changed + #: (new size as QSizeF) contents_size_changed = pyqtSignal(QSizeF) - # url, requested url, title - history_item_triggered = pyqtSignal(QUrl, QUrl, str) + #: Signal emitted when a page requested full-screen (bool) fullscreen_requested = pyqtSignal(bool) - renderer_process_terminated = pyqtSignal(TerminationStatus, int) + #: Signal emitted before load starts (URL as QUrl) before_load_started = pyqtSignal(QUrl) + # Signal emitted when a page's load status changed + # (argument: usertypes.LoadStatus) + load_status_changed = pyqtSignal(usertypes.LoadStatus) + # Signal emitted before shutting down + shutting_down = pyqtSignal() + # Signal emitted when a history item should be added + history_item_triggered = pyqtSignal(QUrl, QUrl, str) + # Signal emitted when the underlying renderer process terminated. + # arg 0: A TerminationStatus member. + # arg 1: The exit code. + renderer_process_terminated = pyqtSignal(TerminationStatus, int) + def __init__(self, *, win_id: int, private: bool, parent: QWidget = None) -> None: self.is_private = private diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index a22facfbd..c00f247f6 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -141,20 +141,9 @@ class AbstractWebElement(collections.abc.MutableMapping): def rect_on_view(self, *, elem_geometry=None, no_js=False): """Get the geometry of the element relative to the webview. - Uses the getClientRects() JavaScript method to obtain the collection of - rectangles containing the element and returns the first rectangle which - is large enough (larger than 1px times 1px). If all rectangles returned - by getClientRects() are too small, falls back to elem.rect_on_view(). - - Skipping of small rectangles is due to elements containing other - elements with "display:block" style, see - https://github.com/qutebrowser/qutebrowser/issues/1298 - Args: elem_geometry: The geometry of the element, or None. - Calling QWebElement::geometry is rather expensive so - we want to avoid doing it twice. - no_js: Fall back to the Python implementation + no_js: Fall back to the Python implementation. """ raise NotImplementedError diff --git a/qutebrowser/extensions/interceptors.py b/qutebrowser/extensions/interceptors.py index 4a3ac17d4..269c82ab8 100644 --- a/qutebrowser/extensions/interceptors.py +++ b/qutebrowser/extensions/interceptors.py @@ -34,8 +34,12 @@ class Request: """A request which can be intercepted/blocked.""" + #: The URL of the page being shown. first_party_url = attr.ib() # type: QUrl + + #: The URL of the file being requested. request_url = attr.ib() # type: QUrl + is_blocked = attr.ib(False) # type: bool def block(self) -> None: diff --git a/qutebrowser/utils/message.py b/qutebrowser/utils/message.py index b496273f8..6731721aa 100644 --- a/qutebrowser/utils/message.py +++ b/qutebrowser/utils/message.py @@ -42,12 +42,12 @@ def _log_stack(typ: str, stack: str) -> None: def error(message: str, *, stack: str = None, replace: bool = False) -> None: - """Convenience function to display an error message in the statusbar. + """Display an error message. Args: - message: The message to show - stack: The stack trace to show. - replace: Replace existing messages with replace=True + message: The message to show. + stack: The stack trace to show (if any). + replace: Replace existing messages which are still being shown. """ if stack is None: stack = ''.join(traceback.format_stack()) @@ -60,11 +60,11 @@ def error(message: str, *, stack: str = None, replace: bool = False) -> None: def warning(message: str, *, replace: bool = False) -> None: - """Convenience function to display a warning message in the statusbar. + """Display a warning message. Args: - message: The message to show - replace: Replace existing messages with replace=True + message: The message to show. + replace: Replace existing messages which are still being shown. """ _log_stack('warning', ''.join(traceback.format_stack())) log.message.warning(message) @@ -72,11 +72,11 @@ def warning(message: str, *, replace: bool = False) -> None: def info(message: str, *, replace: bool = False) -> None: - """Convenience function to display an info message in the statusbar. + """Display an info message. Args: - message: The message to show - replace: Replace existing messages with replace=True + message: The message to show. + replace: Replace existing messages which are still being shown. """ log.message.info(message) global_bridge.show(usertypes.MessageLevel.info, message, replace) diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index c948df48f..84b7e7f9b 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -210,15 +210,33 @@ PromptMode = enum.Enum('PromptMode', ['yesno', 'text', 'user_pwd', 'alert', 'download']) -# Where to open a clicked link. -ClickTarget = enum.Enum('ClickTarget', ['normal', 'tab', 'tab_bg', 'window', - 'hover']) +class ClickTarget(enum.Enum): + + """How to open a clicked link.""" + + normal = 0 #: Open the link in the current tab + tab = 1 #: Open the link in a new foreground tab + tab_bg = 2 #: Open the link in a new background tab + window = 3 #: Open the link in a new window + hover = 4 #: Only hover over the link -# Key input modes -KeyMode = enum.Enum('KeyMode', ['normal', 'hint', 'command', 'yesno', 'prompt', - 'insert', 'passthrough', 'caret', 'set_mark', - 'jump_mark', 'record_macro', 'run_macro']) +class KeyMode(enum.Enum): + + """Key input modes.""" + + normal = 1 #: Normal mode (no mode was entered) + hint = 2 #: Hint mode (showing labels for links) + command = 3 #: Command mode (after pressing the colon key) + yesno = 4 #: Yes/No prompts + prompt = 5 #: Text prompts + insert = 6 #: Insert mode (passing through most keys) + passthrough = 7 #: Passthrough mode (passing through all keys) + caret = 8 #: Caret mode (moving cursor with keys) + set_mark = 9 + jump_mark = 10 + record_macro = 11 + run_macro = 12 class Exit(enum.IntEnum): @@ -241,8 +259,14 @@ LoadStatus = enum.Enum('LoadStatus', ['none', 'success', 'success_https', Backend = enum.Enum('Backend', ['QtWebKit', 'QtWebEngine']) -# JS world for QtWebEngine -JsWorld = enum.Enum('JsWorld', ['main', 'application', 'user', 'jseval']) +class JsWorld(enum.Enum): + + """World/context to run JavaScript code in.""" + + main = 1 #: Same world as the web page's JavaScript. + application = 2 #: Application world, used by qutebrowser internally. + user = 3 #: User world, currently not used. + jseval = 4 #: World used for the jseval-command. # Log level of a JS message. This needs to match up with the keys allowed for From a297e1e2a79c9a4df7a8407d808b11b97c48b585 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 12 Dec 2018 10:39:34 +0100 Subject: [PATCH 340/492] Customize sphinx commandline options --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 8fb312798..2719c137a 100644 --- a/tox.ini +++ b/tox.ini @@ -208,4 +208,4 @@ deps = -r{toxinidir}/misc/requirements/requirements-pyqt.txt -r{toxinidir}/misc/requirements/requirements-sphinx.txt commands = - {envpython} -m sphinx doc/extapi/ doc/extapi/_build/ + {envpython} -m sphinx -jauto -W --color {posargs} doc/extapi/ doc/extapi/_build/ From a9cac0895eac1b2d0be4cdd8a52506c3af036339 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 12 Dec 2018 10:45:09 +0100 Subject: [PATCH 341/492] tox: Set usedevelop for sphinx --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index 2719c137a..bc44df987 100644 --- a/tox.ini +++ b/tox.ini @@ -203,6 +203,7 @@ commands = [testenv:sphinx] basepython = {env:PYTHON:python3} passenv = +usedevelop = true deps = -r{toxinidir}/requirements.txt -r{toxinidir}/misc/requirements/requirements-pyqt.txt From 5a1be2ff165bf56d50154cf08263ddda5751548e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 12 Dec 2018 10:48:16 +0100 Subject: [PATCH 342/492] Order members like in source --- doc/extapi/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/extapi/conf.py b/doc/extapi/conf.py index 09105248a..4cc5c6803 100644 --- a/doc/extapi/conf.py +++ b/doc/extapi/conf.py @@ -42,6 +42,7 @@ extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.napoleon', ] +autodoc_member_order = 'bysource' # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] From aec348d9293bb3fb02438a60343c6b5a0bb5398b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 12 Dec 2018 11:27:38 +0100 Subject: [PATCH 343/492] Fix test_mhtml_e2e with QtWebKit + Qt 5.12 Fixup for 9eccaea09caefd5d3232ce64889c450783b9ef25 See #4025 --- tests/end2end/test_mhtml_e2e.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/end2end/test_mhtml_e2e.py b/tests/end2end/test_mhtml_e2e.py index 953824b8c..27fdd2abf 100644 --- a/tests/end2end/test_mhtml_e2e.py +++ b/tests/end2end/test_mhtml_e2e.py @@ -61,8 +61,8 @@ def normalize_line(line): return line -def normalize_whole(s): - if qtutils.version_check('5.12', compiled=False): +def normalize_whole(s, webengine): + if qtutils.version_check('5.12', compiled=False) and webengine: s = s.replace('\n\n-----=_qute-UUID', '\n-----=_qute-UUID') return s @@ -71,8 +71,9 @@ class DownloadDir: """Abstraction over a download directory.""" - def __init__(self, tmpdir): + def __init__(self, tmpdir, config): self._tmpdir = tmpdir + self._config = config self.location = str(tmpdir) def read_file(self): @@ -92,14 +93,15 @@ class DownloadDir: if normalize_line(line) is not None) actual_data = '\n'.join(normalize_line(line) for line in self.read_file()) - actual_data = normalize_whole(actual_data) + actual_data = normalize_whole(actual_data, + webengine=self._config.webengine) assert actual_data == expected_data @pytest.fixture -def download_dir(tmpdir): - return DownloadDir(tmpdir) +def download_dir(tmpdir, pytestconfig): + return DownloadDir(tmpdir, pytestconfig) def _test_mhtml_requests(test_dir, test_path, server): From e00a7ee5bec74aca7e96f0b2ec1bd3e99593934b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 12 Dec 2018 11:33:55 +0100 Subject: [PATCH 344/492] Mark IPC test which is broken on macOS as xfail See #4471 --- tests/unit/misc/test_ipc.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py index 93b6581b8..29ca0ff9d 100644 --- a/tests/unit/misc/test_ipc.py +++ b/tests/unit/misc/test_ipc.py @@ -34,7 +34,7 @@ from PyQt5.QtTest import QSignalSpy import qutebrowser from qutebrowser.misc import ipc -from qutebrowser.utils import standarddir, utils +from qutebrowser.utils import standarddir, utils, qtutils from helpers import stubs @@ -630,6 +630,8 @@ class TestSendOrListen: assert ret_client is None @pytest.mark.posix(reason="Unneeded on Windows") + @pytest.mark.xfail(qtutils.version_check('5.12', compiled=False) and + utils.is_mac, reason="Broken, see #4471") def test_correct_socket_name(self, args): server = ipc.send_or_listen(args) expected_dir = ipc._get_socketname(args.basedir) From 9250f3c560ced8f05bd7260bdce832c4ff600408 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 12 Dec 2018 17:19:39 +0100 Subject: [PATCH 345/492] Fix lint --- MANIFEST.in | 1 + doc/faq.asciidoc | 335 -------------------------------- qutebrowser/api/cmdutils.py | 34 ++-- qutebrowser/keyinput/modeman.py | 2 +- 4 files changed, 20 insertions(+), 352 deletions(-) delete mode 100644 doc/faq.asciidoc diff --git a/MANIFEST.in b/MANIFEST.in index 3a29ba690..cd9e50cf9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -40,5 +40,6 @@ exclude .* exclude misc/qutebrowser.spec exclude misc/qutebrowser.nsi exclude misc/qutebrowser.rcc +prune doc/extapi global-exclude __pycache__ *.pyc *.pyo diff --git a/doc/faq.asciidoc b/doc/faq.asciidoc deleted file mode 100644 index 113a11f09..000000000 --- a/doc/faq.asciidoc +++ /dev/null @@ -1,335 +0,0 @@ -Frequently asked questions -========================== -:title: Frequently asked questions -The Compiler - -[qanda] -What is qutebrowser based on?:: - qutebrowser uses https://www.python.org/[Python], https://www.qt.io/[Qt] and - https://www.riverbankcomputing.com/software/pyqt/intro[PyQt]. -+ -The concept of it is largely inspired by https://bitbucket.org/portix/dwb/[dwb] -and http://www.vimperator.org/vimperator[Vimperator]. Many actions and -key bindings are similar to dwb. - -Why another browser?:: - It might be hard to believe, but I didn't find any browser which I was - happy with, so I started to write my own. Also, I needed a project to get - into writing GUI applications with Python and - link:https://www.qt.io/[Qt]/link:https://www.riverbankcomputing.com/software/pyqt/intro[PyQt]. -+ -Read the next few questions to find out why I was unhappy with existing -software. - -What's wrong with link:https://bitbucket.org/portix/dwb/[dwb]/link:https://sourceforge.net/projects/vimprobable/[vimprobable]/link:https://mason-larobina.github.io/luakit/[luakit]/jumanji/... (projects based on WebKitGTK)?:: - Most of them are based on the https://webkitgtk.org/[WebKitGTK+] - https://webkitgtk.org/reference/webkitgtk/stable/index.html[WebKit1] API, - which causes a lot of crashes. As the GTK API using WebKit1 is - https://lists.webkit.org/pipermail/webkit-gtk/2014-March/001821.html[deprecated], - these bugs are never going to be fixed. -+ -When qutebrowser was created, the newer -https://webkitgtk.org/reference/webkit2gtk/stable/index.html[WebKit2 API] lacked -basic features like proxy support, and almost no projects have started porting -to WebKit2. In the meantime, this situation has improved a bit, but there are -still only a few projects which have some kind of WebKit2 support (see the -https://github.com/qutebrowser/qutebrowser#similar-projects[list of -alternatives]). -+ -qutebrowser uses https://www.qt.io/[Qt] and -https://wiki.qt.io/QtWebEngine[QtWebEngine] by default (and supports -https://wiki.qt.io/QtWebKit[QtWebKit] optionally). QtWebEngine is based on -Google's https://www.chromium.org/Home[Chromium]. With an up-to-date Qt, it has -much more man-power behind it than WebKitGTK+ has, and thus supports more modern -web features - it's also arguably more secure. - -What's wrong with https://www.mozilla.org/en-US/firefox/new/[Firefox] and link:http://bug.5digits.org/pentadactyl/[Pentadactyl]/link:http://www.vimperator.org/vimperator[Vimperator]?:: - Firefox likes to break compatibility with addons on each upgrade, gets - slower and more bloated with every upgrade, and has some - https://blog.mozilla.org/advancingcontent/2014/02/11/publisher-transformation-with-users-at-the-center/[horrible - ideas] lately. -+ -Also, developing addons for it is a nightmare. - -What's wrong with https://www.chromium.org/Home[Chromium] and https://vimium.github.io/[Vimium]?:: - The Chrome plugin API doesn't seem to allow much freedom for plugin - writers, which results in Vimium not really having all the features you'd - expect from a proper minimal, vim-like browser. - -Why Python?:: - I enjoy writing Python since 2011, which made it one of the possible - choices. I wanted to use https://www.qt.io/[Qt] because of - https://wiki.qt.io/QtWebKit[QtWebKit] so I didn't have - https://wiki.qt.io/Category:LanguageBindings[many other choices]. I don't - like C++ and can't write it very well, so that wasn't an alternative. - -But isn't Python too slow for a browser?:: - https://www.infoworld.com/d/application-development/van-rossum-python-not-too-slow-188715[No.] - I believe efficiency while coding is a lot more important than efficiency - while running. Also, most of the heavy lifting of qutebrowser is done by Qt - and WebKit in C++, with the - https://wiki.python.org/moin/GlobalInterpreterLock[GIL] released. - -Is qutebrowser secure?:: - Most security issues are in the backend (which handles networking, - rendering, JavaScript, etc.) and not qutebrowser itself. -+ -qutebrowser uses https://wiki.qt.io/QtWebEngine[QtWebEngine] by default. -QtWebEngine is based on Google's https://www.chromium.org/Home[Chromium]. While -Qt only updates to a new Chromium release on every minor Qt release (all ~6 -months), every patch release backports security fixes from newer Chromium -versions. In other words: As long as you're using an up-to-date Qt, you should -be recieving security updates on a regular basis, without qutebrowser having to -do anything. Chromium's process isolation and -https://chromium.googlesource.com/chromium/src/+/master/docs/design/sandbox.md[sandboxing] -features are also enabled as a second line of defense. -+ -https://wiki.qt.io/QtWebKit[QtWebKit] is also supported as an alternative -backend, but hasn't seen new releases -https://github.com/annulen/webkit/releases[in a while]. It also doesn't have any -process isolation or sandboxing. See -https://github.com/qutebrowser/qutebrowser/issues/4039[#4039] for more details. -+ -Security issues in qutebrowser's code happen very rarely (as per July 2018, -there have been three security issues caused by qutebrowser in over 4.5 years). -Those were handled appropriately -(http://seclists.org/oss-sec/2018/q3/29[example]) and fixed timely. To report -security bugs, please contact me directly at mail@qutebrowser.org, GPG ID -https://www.the-compiler.org/pubkey.asc[0x916eb0c8fd55a072]. - -Is there an adblocker?:: - There is a host-based adblocker which takes /etc/hosts-like lists. A "real" - adblocker has a - https://www.reddit.com/r/programming/comments/25j41u/adblock_pluss_effect_on_firefoxs_memory_usage/chhpomw[big - impact] on browsing speed and - https://blog.mozilla.org/nnethercote/2014/05/14/adblock-pluss-effect-on-firefoxs-memory-usage/[RAM - usage], so implementing support for AdBlockPlus-like lists is currently not - a priority. - -How can I get No-Script-like behavior?:: - To disable JavaScript by default: -+ ----- -:set content.javascript.enabled false ----- -+ -The basic command for enabling JavaScript for the current host is `tsh`. -This will allow JavaScript execution for the current session. -Use `S` instead of `s` to make the exception permanent. -With `H` instead of `h`, subdomains are included. -With `u` instead of `h`, only the current URL is whitelisted (not the whole host). - -How do I play Youtube videos with mpv?:: - You can easily add a key binding to play youtube videos inside a real video - player - optionally even with hinting for links: -+ ----- -:bind m spawn mpv {url} -:bind M hint links spawn mpv {hint-url} ----- -+ -Note that you might need an additional package (e.g. -https://www.archlinux.org/packages/community/any/youtube-dl/[youtube-dl] on -Archlinux) to play web videos with mpv. -+ -There is a very useful script for mpv, which emulates "unique application" -functionality. This way you can add links to the mpv playlist instead of -playing them all at once. -+ -You can find the script here: https://github.com/mpv-player/mpv/blob/master/TOOLS/umpv -+ -It also works nicely with rapid hints: -+ ----- -:bind m spawn umpv {url} -:bind M hint links spawn umpv {hint-url} -:bind ;M hint --rapid links spawn umpv {hint-url} ----- - -How do I use qutebrowser with mutt?:: - For security reasons, local files without `.html` extensions aren't - rendered as HTML, see - https://bugs.chromium.org/p/chromium/issues/detail?id=777737[this Chromium issue] - for details. You can do this in your `mailcap` file to get a proper - extension: -+ ----- - text/html; qutebrowser %s; nametemplate=%s.html ----- - -What is the difference between bookmarks and quickmarks?:: - Bookmarks will always use the title of the website as their name, but with quickmarks - you can set your own title. -+ -For example, if you bookmark multiple food recipe websites and use `:open`, -you have to type the title or address of the website. -+ -When using quickmark, you can give them all names, like -`foodrecipes1`, `foodrecipes2` and so on. When you type -`:open foodrecipes`, you will see a list of all the food recipe sites, -without having to remember the exact website title or address. - -How do I use spell checking?:: - Configuring spell checking in qutebrowser depends on the backend in use - (see https://github.com/qutebrowser/qutebrowser/issues/700[#700] for - a more detailed discussion). -+ -For QtWebKit: - -. Install https://github.com/QupZilla/qtwebkit-plugins[qtwebkit-plugins]. - . Note: with QtWebKit reloaded you may experience some issues. See - https://github.com/QupZilla/qtwebkit-plugins/issues/10[#10]. -. The dictionary to use is taken from the `DICTIONARY` environment variable. - The default is `en_US`. For example to use Dutch spell check set `DICTIONARY` - to `nl_NL`; you can't use multiple dictionaries or change them at runtime at - the moment. - (also see the README file for `qtwebkit-plugins`). -. Remember to install the hunspell dictionaries if you don't have them already - (most distros should have packages for this). - -+ -For QtWebEngine: - -. Make sure your versions of PyQt and Qt are 5.8 or higher. -. Use `dictcli.py` script to install dictionaries. - Run the script with `-h` for the parameter description. -. Set `spellcheck.languages` to the desired list of languages, e.g.: - `:set spellcheck.languages "['en-US', 'pl-PL']"` - -How do I use Tor with qutebrowser?:: - Start tor on your machine, and do `:set content.proxy socks://localhost:9050/` - in qutebrowser. Note this won't give you the same amount of fingerprinting - protection that the Tor Browser does, but it's useful to be able to access - `.onion` sites. - -Why does J move to the next (right) tab, and K to the previous (left) one?:: - One reason is because https://bitbucket.org/portix/dwb[dwb] did it that way, - and qutebrowser's keybindings are designed to be compatible with dwb's. - The rationale behind it is that J is "down" in vim, and K is "up", which - corresponds nicely to "next"/"previous". It also makes much more sense with - vertical tabs (e.g. `:set tabs.position left`). - -What's the difference between insert and passthrough mode?:: - They are quite similar, but insert mode has some bindings (like `Ctrl-e` to - open an editor) while passthrough mode only has escape bound. It might also - be useful to rebind escape to something else in passthrough mode only, to be - able to send an escape keypress to the website. - -Why does it take longer to open a URL in qutebrowser than in chromium?:: - When opening a URL in an existing instance, the normal qutebrowser - Python script is started and a few PyQt libraries need to be - loaded until it is detected that there is an instance running - to which the URL is then passed. This takes some time. - One workaround is to use this - https://github.com/qutebrowser/qutebrowser/blob/master/scripts/open_url_in_instance.sh[script] - and place it in your $PATH with the name "qutebrowser". This - script passes the URL via an unix socket to qutebrowser (if its - running already) using socat which is much faster and starts a new - qutebrowser if it is not running already. Also check if you want - to use webengine as backend in line 17 and change it to your - needs. - -How do I make qutebrowser use greasemonkey scripts?:: - There is currently no UI elements to handle managing greasemonkey scripts. - All management of what scripts are installed or disabled is done in the - filesystem by you. qutebrowser reads all files that have an extension of - `.js` from the `/greasemonkey/` folder and attempts to load them. - Where `` is the qutebrowser data directory shown in the `Paths` - section of the page displayed by `:version`. If you want to disable a - script just rename it, for example, to have `.disabled` on the end, after - the `.js` extension. To reload scripts from that directory run the command - `:greasemonkey-reload`. -+ -Troubleshooting: to check that your script is being loaded when -`:greasemonkey-reload` runs you can start qutebrowser with the arguments -`--debug --logfilter greasemonkey,js` and check the messages on the -program's standard output for errors parsing or loading your script. -You may also see javascript errors if your script is expecting an environment -that we fail to provide. -+ -Note that there are some missing features which you may run into: - -. Some scripts expect `GM_xmlhttpRequest` to ignore Cross Origin Resource - Sharing restrictions, this is currently not supported, so scripts making - requests to third party sites will often fail to function correctly. -. If your backend is a QtWebEngine version 5.8, 5.9 or 5.10 then regular - expressions are not supported in `@include` or `@exclude` rules. If your - script uses them you can re-write them to use glob expressions or convert - them to `@match` rules. - See https://wiki.greasespot.net/Metadata_Block[the wiki] for more info. -. Any greasemonkey API function to do with adding UI elements is not currently - supported. That means context menu extentensions and background pages. - -How do I change the `WM_CLASS` used by qutebrowser windows?:: - Qt only supports setting `WM_CLASS` globally, which you can do by starting - with `--qt-arg name foo`. Note that all windows are part of the same - qutebrowser instance (unless you use `--temp-basedir` or `--basedir`), so - they all will share the same `WM_CLASS`. - -== Troubleshooting - -Unable to view flash content.:: - If you have flash installed for on your system, it's necessary to enable plugins - to use the flash plugin. Using the command `:set content.plugins true` - in qutebrowser will enable plugins. Packages for flash should - be provided for your platform or it can be obtained from - https://get.adobe.com/flashplayer/[Adobe]. - -Experiencing freezing on sites like duckduckgo and youtube.:: - This issue could be caused by stale plugin files installed by `mozplugger` - if mozplugger was subsequently removed. - Try exiting qutebrowser and removing `~/.mozilla/plugins/mozplugger*.so`. - See https://github.com/qutebrowser/qutebrowser/issues/357[Issue #357] - for more details. - -When using QtWebEngine, qutebrowser reports "Render Process Crashed" and the console prints a traceback on Gentoo Linux or another Source-Based Distro:: - As stated in https://gcc.gnu.org/gcc-6/changes.html[GCC's Website] GCC 6 has introduced some optimizations that could break non-conforming codebases, like QtWebEngine. + - As a workaround, you can disable the nullpointer check optimization by adding the -fno-delete-null-pointer-checks flag while compiling. + - On gentoo, you just need to add it into your make.conf, like this: + - - CFLAGS="... -fno-delete-null-pointer-checks" - CXXFLAGS="... -fno-delete-null-pointer-checks" -+ -And then re-emerging qtwebengine with: + - - emerge -1 qtwebengine - -Unable to view DRM content (Netflix, Spotify, etc.).:: - You will need to install `widevine` and set `qt.args` to point to it. - Qt 5.9 currently only supports widevine up to Chrome version 61. -+ -On Arch, simply install `qt5-webengine-widevine` from the AUR and run: -+ ----- -:set qt.args '["ppapi-widevine-path=/usr/lib/qt/plugins/ppapi/libwidevinecdmadapter.so"]' -:restart ----- -+ -For other distributions, download the chromium tarball and widevine-cdm zip from -https://aur.archlinux.org/packages/qt5-webengine-widevine/[the AUR page], -extract `libwidevinecdmadapter.so` and `libwidevinecdm.so` files, respectively, -and move them to the `ppapi` plugin directory in your Qt library directory (create it if it does not exist). -+ -Lastly, set your `qt.args` to point to that directory and restart qutebrowser: -+ ----- -:set qt.args '["ppapi-widevine-path=/usr/lib64/qt5/plugins/ppapi/libwidevinecdmadapter.so"]' -:restart ----- - -Unable to use `spawn` on MacOS.:: -When running qutebrowser from the prebuilt binary (`qutebrowser.app`) it *will -not* read any files that would alter your `$PATH` (e.g. `.profile`, `.bashrc`, -etc). This is not a bug, just that `.profile` is not propogated to GUI -applications in MacOS. -+ -See https://github.com/qutebrowser/qutebrowser/issues/4273[Issue #4273] for -details and potential workarounds. - -My issue is not listed.:: - If you experience any segfaults or crashes, you can report the issue in - https://github.com/qutebrowser/qutebrowser/issues[the issue tracker] or - using the `:report` command. - If you are reporting a segfault, make sure you read the - link:stacktrace{outfilesuffix}[guide] on how to report them with all needed - information. diff --git a/qutebrowser/api/cmdutils.py b/qutebrowser/api/cmdutils.py index f6a6f6da9..cd43079ad 100644 --- a/qutebrowser/api/cmdutils.py +++ b/qutebrowser/api/cmdutils.py @@ -17,9 +17,7 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -""" -qutebrowser has the concept of functions which are exposed to the user as -commands. +"""qutebrowser has the concept of functions, exposed to the user as commands. Creating a new command is straightforward:: @@ -43,7 +41,8 @@ The type can be overridden using Python's function annotations:: Possible values: -- A callable (``int``, ``float``, etc.): Gets called to validate/convert the value. +- A callable (``int``, ``float``, etc.): Gets called to validate/convert the + value. - A python enum type: All members of the enum are possible values. - A ``typing.Union`` of multiple types above: Any of these types are valid values, e.g., ``typing.Union[str, int]``. @@ -159,40 +158,43 @@ class argument: # noqa: N801,N806 pylint: disable=invalid-name """Decorator to customize an argument. - You can customize how an argument is handled using the ``@cmdutils.argument`` - decorator *after* ``@cmdutils.register``. This can, for example, be used to - customize the flag an argument should get:: + You can customize how an argument is handled using the + ``@cmdutils.argument`` decorator *after* ``@cmdutils.register``. This can, + for example, be used to customize the flag an argument should get:: @cmdutils.register(...) @cmdutils.argument('bar', flag='c') def foo(bar): ... - For a ``str`` argument, you can restrict the allowed strings using ``choices``:: + For a ``str`` argument, you can restrict the allowed strings using + ``choices``:: @cmdutils.register(...) @cmdutils.argument('bar', choices=['val1', 'val2']) def foo(bar: str): ... - For ``typing.Union`` types, the given ``choices`` are only checked if other types - (like ``int``) don't match. + For ``typing.Union`` types, the given ``choices`` are only checked if other + types (like ``int``) don't match. The following arguments are supported for ``@cmdutils.argument``: - ``flag``: Customize the short flag (``-x``) the argument will get. - ``value``: Tell qutebrowser to fill the argument with special values: - * ``value=cmdutils.Value.count``: The ``count`` given by the user to the command. + * ``value=cmdutils.Value.count``: The ``count`` given by the user to the + command. * ``value=cmdutils.Value.win_id``: The window ID of the current window. - * ``value=cmdutils.Value.cur_tab``: The tab object which is currently focused. + * ``value=cmdutils.Value.cur_tab``: The tab object which is currently + focused. - - ``completion``: A completion function to use when completing arguments for - the given command. + - ``completion``: A completion function to use when completing arguments + for the given command. - ``choices``: The allowed string choices for the argument. - The name of an argument will always be the parameter name, with any trailing - underscores stripped and underscores replaced by dashes. + The name of an argument will always be the parameter name, with any + trailing underscores stripped and underscores replaced by dashes. """ def __init__(self, argname: str, **kwargs: typing.Any) -> None: diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py index c06700b6c..edb443eec 100644 --- a/qutebrowser/keyinput/modeman.py +++ b/qutebrowser/keyinput/modeman.py @@ -64,7 +64,7 @@ class NotInModeError(Exception): def init(win_id, parent): """Initialize the mode manager and the keyparsers for the given win_id.""" - KM = usertypes.KeyMode # noqa: N801,N806 pylint: disable=invalid-name + KM = usertypes.KeyMode # noqa: N806 modeman = ModeManager(win_id, parent) objreg.register('mode-manager', modeman, scope='window', window=win_id) keyparsers = { From 45f78ce2c76b8dbd9bcf399e5daf8aff57c9c223 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 12 Dec 2018 18:23:43 +0100 Subject: [PATCH 346/492] Restore FAQ --- doc/faq.asciidoc | 335 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 335 insertions(+) create mode 100644 doc/faq.asciidoc diff --git a/doc/faq.asciidoc b/doc/faq.asciidoc new file mode 100644 index 000000000..113a11f09 --- /dev/null +++ b/doc/faq.asciidoc @@ -0,0 +1,335 @@ +Frequently asked questions +========================== +:title: Frequently asked questions +The Compiler + +[qanda] +What is qutebrowser based on?:: + qutebrowser uses https://www.python.org/[Python], https://www.qt.io/[Qt] and + https://www.riverbankcomputing.com/software/pyqt/intro[PyQt]. ++ +The concept of it is largely inspired by https://bitbucket.org/portix/dwb/[dwb] +and http://www.vimperator.org/vimperator[Vimperator]. Many actions and +key bindings are similar to dwb. + +Why another browser?:: + It might be hard to believe, but I didn't find any browser which I was + happy with, so I started to write my own. Also, I needed a project to get + into writing GUI applications with Python and + link:https://www.qt.io/[Qt]/link:https://www.riverbankcomputing.com/software/pyqt/intro[PyQt]. ++ +Read the next few questions to find out why I was unhappy with existing +software. + +What's wrong with link:https://bitbucket.org/portix/dwb/[dwb]/link:https://sourceforge.net/projects/vimprobable/[vimprobable]/link:https://mason-larobina.github.io/luakit/[luakit]/jumanji/... (projects based on WebKitGTK)?:: + Most of them are based on the https://webkitgtk.org/[WebKitGTK+] + https://webkitgtk.org/reference/webkitgtk/stable/index.html[WebKit1] API, + which causes a lot of crashes. As the GTK API using WebKit1 is + https://lists.webkit.org/pipermail/webkit-gtk/2014-March/001821.html[deprecated], + these bugs are never going to be fixed. ++ +When qutebrowser was created, the newer +https://webkitgtk.org/reference/webkit2gtk/stable/index.html[WebKit2 API] lacked +basic features like proxy support, and almost no projects have started porting +to WebKit2. In the meantime, this situation has improved a bit, but there are +still only a few projects which have some kind of WebKit2 support (see the +https://github.com/qutebrowser/qutebrowser#similar-projects[list of +alternatives]). ++ +qutebrowser uses https://www.qt.io/[Qt] and +https://wiki.qt.io/QtWebEngine[QtWebEngine] by default (and supports +https://wiki.qt.io/QtWebKit[QtWebKit] optionally). QtWebEngine is based on +Google's https://www.chromium.org/Home[Chromium]. With an up-to-date Qt, it has +much more man-power behind it than WebKitGTK+ has, and thus supports more modern +web features - it's also arguably more secure. + +What's wrong with https://www.mozilla.org/en-US/firefox/new/[Firefox] and link:http://bug.5digits.org/pentadactyl/[Pentadactyl]/link:http://www.vimperator.org/vimperator[Vimperator]?:: + Firefox likes to break compatibility with addons on each upgrade, gets + slower and more bloated with every upgrade, and has some + https://blog.mozilla.org/advancingcontent/2014/02/11/publisher-transformation-with-users-at-the-center/[horrible + ideas] lately. ++ +Also, developing addons for it is a nightmare. + +What's wrong with https://www.chromium.org/Home[Chromium] and https://vimium.github.io/[Vimium]?:: + The Chrome plugin API doesn't seem to allow much freedom for plugin + writers, which results in Vimium not really having all the features you'd + expect from a proper minimal, vim-like browser. + +Why Python?:: + I enjoy writing Python since 2011, which made it one of the possible + choices. I wanted to use https://www.qt.io/[Qt] because of + https://wiki.qt.io/QtWebKit[QtWebKit] so I didn't have + https://wiki.qt.io/Category:LanguageBindings[many other choices]. I don't + like C++ and can't write it very well, so that wasn't an alternative. + +But isn't Python too slow for a browser?:: + https://www.infoworld.com/d/application-development/van-rossum-python-not-too-slow-188715[No.] + I believe efficiency while coding is a lot more important than efficiency + while running. Also, most of the heavy lifting of qutebrowser is done by Qt + and WebKit in C++, with the + https://wiki.python.org/moin/GlobalInterpreterLock[GIL] released. + +Is qutebrowser secure?:: + Most security issues are in the backend (which handles networking, + rendering, JavaScript, etc.) and not qutebrowser itself. ++ +qutebrowser uses https://wiki.qt.io/QtWebEngine[QtWebEngine] by default. +QtWebEngine is based on Google's https://www.chromium.org/Home[Chromium]. While +Qt only updates to a new Chromium release on every minor Qt release (all ~6 +months), every patch release backports security fixes from newer Chromium +versions. In other words: As long as you're using an up-to-date Qt, you should +be recieving security updates on a regular basis, without qutebrowser having to +do anything. Chromium's process isolation and +https://chromium.googlesource.com/chromium/src/+/master/docs/design/sandbox.md[sandboxing] +features are also enabled as a second line of defense. ++ +https://wiki.qt.io/QtWebKit[QtWebKit] is also supported as an alternative +backend, but hasn't seen new releases +https://github.com/annulen/webkit/releases[in a while]. It also doesn't have any +process isolation or sandboxing. See +https://github.com/qutebrowser/qutebrowser/issues/4039[#4039] for more details. ++ +Security issues in qutebrowser's code happen very rarely (as per July 2018, +there have been three security issues caused by qutebrowser in over 4.5 years). +Those were handled appropriately +(http://seclists.org/oss-sec/2018/q3/29[example]) and fixed timely. To report +security bugs, please contact me directly at mail@qutebrowser.org, GPG ID +https://www.the-compiler.org/pubkey.asc[0x916eb0c8fd55a072]. + +Is there an adblocker?:: + There is a host-based adblocker which takes /etc/hosts-like lists. A "real" + adblocker has a + https://www.reddit.com/r/programming/comments/25j41u/adblock_pluss_effect_on_firefoxs_memory_usage/chhpomw[big + impact] on browsing speed and + https://blog.mozilla.org/nnethercote/2014/05/14/adblock-pluss-effect-on-firefoxs-memory-usage/[RAM + usage], so implementing support for AdBlockPlus-like lists is currently not + a priority. + +How can I get No-Script-like behavior?:: + To disable JavaScript by default: ++ +---- +:set content.javascript.enabled false +---- ++ +The basic command for enabling JavaScript for the current host is `tsh`. +This will allow JavaScript execution for the current session. +Use `S` instead of `s` to make the exception permanent. +With `H` instead of `h`, subdomains are included. +With `u` instead of `h`, only the current URL is whitelisted (not the whole host). + +How do I play Youtube videos with mpv?:: + You can easily add a key binding to play youtube videos inside a real video + player - optionally even with hinting for links: ++ +---- +:bind m spawn mpv {url} +:bind M hint links spawn mpv {hint-url} +---- ++ +Note that you might need an additional package (e.g. +https://www.archlinux.org/packages/community/any/youtube-dl/[youtube-dl] on +Archlinux) to play web videos with mpv. ++ +There is a very useful script for mpv, which emulates "unique application" +functionality. This way you can add links to the mpv playlist instead of +playing them all at once. ++ +You can find the script here: https://github.com/mpv-player/mpv/blob/master/TOOLS/umpv ++ +It also works nicely with rapid hints: ++ +---- +:bind m spawn umpv {url} +:bind M hint links spawn umpv {hint-url} +:bind ;M hint --rapid links spawn umpv {hint-url} +---- + +How do I use qutebrowser with mutt?:: + For security reasons, local files without `.html` extensions aren't + rendered as HTML, see + https://bugs.chromium.org/p/chromium/issues/detail?id=777737[this Chromium issue] + for details. You can do this in your `mailcap` file to get a proper + extension: ++ +---- + text/html; qutebrowser %s; nametemplate=%s.html +---- + +What is the difference between bookmarks and quickmarks?:: + Bookmarks will always use the title of the website as their name, but with quickmarks + you can set your own title. ++ +For example, if you bookmark multiple food recipe websites and use `:open`, +you have to type the title or address of the website. ++ +When using quickmark, you can give them all names, like +`foodrecipes1`, `foodrecipes2` and so on. When you type +`:open foodrecipes`, you will see a list of all the food recipe sites, +without having to remember the exact website title or address. + +How do I use spell checking?:: + Configuring spell checking in qutebrowser depends on the backend in use + (see https://github.com/qutebrowser/qutebrowser/issues/700[#700] for + a more detailed discussion). ++ +For QtWebKit: + +. Install https://github.com/QupZilla/qtwebkit-plugins[qtwebkit-plugins]. + . Note: with QtWebKit reloaded you may experience some issues. See + https://github.com/QupZilla/qtwebkit-plugins/issues/10[#10]. +. The dictionary to use is taken from the `DICTIONARY` environment variable. + The default is `en_US`. For example to use Dutch spell check set `DICTIONARY` + to `nl_NL`; you can't use multiple dictionaries or change them at runtime at + the moment. + (also see the README file for `qtwebkit-plugins`). +. Remember to install the hunspell dictionaries if you don't have them already + (most distros should have packages for this). + ++ +For QtWebEngine: + +. Make sure your versions of PyQt and Qt are 5.8 or higher. +. Use `dictcli.py` script to install dictionaries. + Run the script with `-h` for the parameter description. +. Set `spellcheck.languages` to the desired list of languages, e.g.: + `:set spellcheck.languages "['en-US', 'pl-PL']"` + +How do I use Tor with qutebrowser?:: + Start tor on your machine, and do `:set content.proxy socks://localhost:9050/` + in qutebrowser. Note this won't give you the same amount of fingerprinting + protection that the Tor Browser does, but it's useful to be able to access + `.onion` sites. + +Why does J move to the next (right) tab, and K to the previous (left) one?:: + One reason is because https://bitbucket.org/portix/dwb[dwb] did it that way, + and qutebrowser's keybindings are designed to be compatible with dwb's. + The rationale behind it is that J is "down" in vim, and K is "up", which + corresponds nicely to "next"/"previous". It also makes much more sense with + vertical tabs (e.g. `:set tabs.position left`). + +What's the difference between insert and passthrough mode?:: + They are quite similar, but insert mode has some bindings (like `Ctrl-e` to + open an editor) while passthrough mode only has escape bound. It might also + be useful to rebind escape to something else in passthrough mode only, to be + able to send an escape keypress to the website. + +Why does it take longer to open a URL in qutebrowser than in chromium?:: + When opening a URL in an existing instance, the normal qutebrowser + Python script is started and a few PyQt libraries need to be + loaded until it is detected that there is an instance running + to which the URL is then passed. This takes some time. + One workaround is to use this + https://github.com/qutebrowser/qutebrowser/blob/master/scripts/open_url_in_instance.sh[script] + and place it in your $PATH with the name "qutebrowser". This + script passes the URL via an unix socket to qutebrowser (if its + running already) using socat which is much faster and starts a new + qutebrowser if it is not running already. Also check if you want + to use webengine as backend in line 17 and change it to your + needs. + +How do I make qutebrowser use greasemonkey scripts?:: + There is currently no UI elements to handle managing greasemonkey scripts. + All management of what scripts are installed or disabled is done in the + filesystem by you. qutebrowser reads all files that have an extension of + `.js` from the `/greasemonkey/` folder and attempts to load them. + Where `` is the qutebrowser data directory shown in the `Paths` + section of the page displayed by `:version`. If you want to disable a + script just rename it, for example, to have `.disabled` on the end, after + the `.js` extension. To reload scripts from that directory run the command + `:greasemonkey-reload`. ++ +Troubleshooting: to check that your script is being loaded when +`:greasemonkey-reload` runs you can start qutebrowser with the arguments +`--debug --logfilter greasemonkey,js` and check the messages on the +program's standard output for errors parsing or loading your script. +You may also see javascript errors if your script is expecting an environment +that we fail to provide. ++ +Note that there are some missing features which you may run into: + +. Some scripts expect `GM_xmlhttpRequest` to ignore Cross Origin Resource + Sharing restrictions, this is currently not supported, so scripts making + requests to third party sites will often fail to function correctly. +. If your backend is a QtWebEngine version 5.8, 5.9 or 5.10 then regular + expressions are not supported in `@include` or `@exclude` rules. If your + script uses them you can re-write them to use glob expressions or convert + them to `@match` rules. + See https://wiki.greasespot.net/Metadata_Block[the wiki] for more info. +. Any greasemonkey API function to do with adding UI elements is not currently + supported. That means context menu extentensions and background pages. + +How do I change the `WM_CLASS` used by qutebrowser windows?:: + Qt only supports setting `WM_CLASS` globally, which you can do by starting + with `--qt-arg name foo`. Note that all windows are part of the same + qutebrowser instance (unless you use `--temp-basedir` or `--basedir`), so + they all will share the same `WM_CLASS`. + +== Troubleshooting + +Unable to view flash content.:: + If you have flash installed for on your system, it's necessary to enable plugins + to use the flash plugin. Using the command `:set content.plugins true` + in qutebrowser will enable plugins. Packages for flash should + be provided for your platform or it can be obtained from + https://get.adobe.com/flashplayer/[Adobe]. + +Experiencing freezing on sites like duckduckgo and youtube.:: + This issue could be caused by stale plugin files installed by `mozplugger` + if mozplugger was subsequently removed. + Try exiting qutebrowser and removing `~/.mozilla/plugins/mozplugger*.so`. + See https://github.com/qutebrowser/qutebrowser/issues/357[Issue #357] + for more details. + +When using QtWebEngine, qutebrowser reports "Render Process Crashed" and the console prints a traceback on Gentoo Linux or another Source-Based Distro:: + As stated in https://gcc.gnu.org/gcc-6/changes.html[GCC's Website] GCC 6 has introduced some optimizations that could break non-conforming codebases, like QtWebEngine. + + As a workaround, you can disable the nullpointer check optimization by adding the -fno-delete-null-pointer-checks flag while compiling. + + On gentoo, you just need to add it into your make.conf, like this: + + + CFLAGS="... -fno-delete-null-pointer-checks" + CXXFLAGS="... -fno-delete-null-pointer-checks" ++ +And then re-emerging qtwebengine with: + + + emerge -1 qtwebengine + +Unable to view DRM content (Netflix, Spotify, etc.).:: + You will need to install `widevine` and set `qt.args` to point to it. + Qt 5.9 currently only supports widevine up to Chrome version 61. ++ +On Arch, simply install `qt5-webengine-widevine` from the AUR and run: ++ +---- +:set qt.args '["ppapi-widevine-path=/usr/lib/qt/plugins/ppapi/libwidevinecdmadapter.so"]' +:restart +---- ++ +For other distributions, download the chromium tarball and widevine-cdm zip from +https://aur.archlinux.org/packages/qt5-webengine-widevine/[the AUR page], +extract `libwidevinecdmadapter.so` and `libwidevinecdm.so` files, respectively, +and move them to the `ppapi` plugin directory in your Qt library directory (create it if it does not exist). ++ +Lastly, set your `qt.args` to point to that directory and restart qutebrowser: ++ +---- +:set qt.args '["ppapi-widevine-path=/usr/lib64/qt5/plugins/ppapi/libwidevinecdmadapter.so"]' +:restart +---- + +Unable to use `spawn` on MacOS.:: +When running qutebrowser from the prebuilt binary (`qutebrowser.app`) it *will +not* read any files that would alter your `$PATH` (e.g. `.profile`, `.bashrc`, +etc). This is not a bug, just that `.profile` is not propogated to GUI +applications in MacOS. ++ +See https://github.com/qutebrowser/qutebrowser/issues/4273[Issue #4273] for +details and potential workarounds. + +My issue is not listed.:: + If you experience any segfaults or crashes, you can report the issue in + https://github.com/qutebrowser/qutebrowser/issues[the issue tracker] or + using the `:report` command. + If you are reporting a segfault, make sure you read the + link:stacktrace{outfilesuffix}[guide] on how to report them with all needed + information. From 7c486a76f8b3806bc32942e323583e0f39274505 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 13 Dec 2018 10:45:01 +0100 Subject: [PATCH 347/492] tox: Use absolute sphinx paths --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index bc44df987..75a00961e 100644 --- a/tox.ini +++ b/tox.ini @@ -209,4 +209,4 @@ deps = -r{toxinidir}/misc/requirements/requirements-pyqt.txt -r{toxinidir}/misc/requirements/requirements-sphinx.txt commands = - {envpython} -m sphinx -jauto -W --color {posargs} doc/extapi/ doc/extapi/_build/ + {envpython} -m sphinx -jauto -W --color {posargs} {toxinidir}/doc/extapi/ {toxinidir}/doc/extapi/_build/ From 81375b30292d3df0b6b2f8f90c49bd1471a65290 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 13 Dec 2018 11:25:46 +0100 Subject: [PATCH 348/492] Add type annotations for webelem/webkitelem/webengineelem --- mypy.ini | 12 ++ qutebrowser/browser/webelem.py | 107 ++++++++++-------- .../browser/webengine/webengineelem.py | 71 +++++++----- qutebrowser/browser/webkit/webkitelem.py | 88 +++++++------- 4 files changed, 165 insertions(+), 113 deletions(-) diff --git a/mypy.ini b/mypy.ini index b8b2cf16f..d8c7221ad 100644 --- a/mypy.ini +++ b/mypy.ini @@ -73,3 +73,15 @@ disallow_incomplete_defs = True [mypy-qutebrowser.extensions.*] disallow_untyped_defs = True disallow_incomplete_defs = True + +[mypy-qutebrowser.browser.webelem] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.browser.webkit.webkitelem] +disallow_untyped_defs = True +disallow_incomplete_defs = True + +[mypy-qutebrowser.browser.webengine.webengineelem] +disallow_untyped_defs = True +disallow_incomplete_defs = True diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index c00f247f6..9ae05639e 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -19,15 +19,23 @@ """Generic web element related code.""" +import typing import collections.abc -from PyQt5.QtCore import QUrl, Qt, QEvent, QTimer +from PyQt5.QtCore import QUrl, Qt, QEvent, QTimer, QRect, QPoint from PyQt5.QtGui import QMouseEvent from qutebrowser.config import config from qutebrowser.keyinput import modeman from qutebrowser.mainwindow import mainwindow from qutebrowser.utils import log, usertypes, utils, qtutils, objreg +MYPY = False +if MYPY: + # pylint: disable=unused-import,useless-suppression + from qutebrowser.browser import browsertab + + +JsValueType = typing.Union[int, float, str, None] class Error(Exception): @@ -40,7 +48,7 @@ class OrphanedError(Error): """Raised when a webelement's parent has vanished.""" -def css_selector(group, url): +def css_selector(group: str, url: QUrl) -> str: """Get a CSS selector for the given group/URL.""" selectors = config.instance.get('hints.selectors', url) if group not in selectors: @@ -60,70 +68,72 @@ class AbstractWebElement(collections.abc.MutableMapping): tab: The tab associated with this element. """ - def __init__(self, tab): + def __init__(self, tab: 'browsertab.AbstractTab') -> None: self._tab = tab - def __eq__(self, other): + def __eq__(self, other: object) -> bool: raise NotImplementedError - def __str__(self): + def __str__(self) -> str: raise NotImplementedError - def __getitem__(self, key): + def __getitem__(self, key: str) -> str: raise NotImplementedError - def __setitem__(self, key, val): + def __setitem__(self, key: str, val: str) -> None: raise NotImplementedError - def __delitem__(self, key): + def __delitem__(self, key: str) -> None: raise NotImplementedError - def __iter__(self): + def __iter__(self) -> typing.Iterator[str]: raise NotImplementedError - def __len__(self): + def __len__(self) -> int: raise NotImplementedError - def __repr__(self): + def __repr__(self) -> str: try: html = utils.compact_text(self.outer_xml(), 500) except Error: html = None return utils.get_repr(self, html=html) - def has_frame(self): + def has_frame(self) -> bool: """Check if this element has a valid frame attached.""" raise NotImplementedError - def geometry(self): + def geometry(self) -> QRect: """Get the geometry for this element.""" raise NotImplementedError - def classes(self): + def classes(self) -> typing.List[str]: """Get a list of classes assigned to this element.""" raise NotImplementedError - def tag_name(self): + def tag_name(self) -> str: """Get the tag name of this element. The returned name will always be lower-case. """ raise NotImplementedError - def outer_xml(self): + def outer_xml(self) -> str: """Get the full HTML representation of this element.""" raise NotImplementedError - def value(self): + def value(self) -> JsValueType: """Get the value attribute for this element, or None.""" raise NotImplementedError - def set_value(self, value): + def set_value(self, value: JsValueType) -> None: """Set the element value.""" raise NotImplementedError - def dispatch_event(self, event, bubbles=False, - cancelable=False, composed=False): + def dispatch_event(self, event: str, + bubbles: bool = False, + cancelable: bool = False, + composed: bool = False) -> None: """Dispatch an event to the element. Args: @@ -134,11 +144,12 @@ class AbstractWebElement(collections.abc.MutableMapping): """ raise NotImplementedError - def insert_text(self, text): + def insert_text(self, text: str) -> None: """Insert the given text into the element.""" raise NotImplementedError - def rect_on_view(self, *, elem_geometry=None, no_js=False): + def rect_on_view(self, *, elem_geometry: QRect = None, + no_js: bool = False) -> QRect: """Get the geometry of the element relative to the webview. Args: @@ -147,11 +158,11 @@ class AbstractWebElement(collections.abc.MutableMapping): """ raise NotImplementedError - def is_writable(self): + def is_writable(self) -> bool: """Check whether an element is writable.""" return not ('disabled' in self or 'readonly' in self) - def is_content_editable(self): + def is_content_editable(self) -> bool: """Check if an element has a contenteditable attribute. Args: @@ -166,7 +177,7 @@ class AbstractWebElement(collections.abc.MutableMapping): except KeyError: return False - def _is_editable_object(self): + def _is_editable_object(self) -> bool: """Check if an object-element is editable.""" if 'type' not in self: log.webelem.debug(" without type clicked...") @@ -182,7 +193,7 @@ class AbstractWebElement(collections.abc.MutableMapping): # Image/Audio/... return False - def _is_editable_input(self): + def _is_editable_input(self) -> bool: """Check if an input-element is editable. Return: @@ -199,7 +210,7 @@ class AbstractWebElement(collections.abc.MutableMapping): else: return False - def _is_editable_classes(self): + def _is_editable_classes(self) -> bool: """Check if an element is editable based on its classes. Return: @@ -218,7 +229,7 @@ class AbstractWebElement(collections.abc.MutableMapping): return True return False - def is_editable(self, strict=False): + def is_editable(self, strict: bool = False) -> bool: """Check whether we should switch to insert mode for this element. Args: @@ -249,17 +260,17 @@ class AbstractWebElement(collections.abc.MutableMapping): return self._is_editable_classes() and not strict return False - def is_text_input(self): + def is_text_input(self) -> bool: """Check if this element is some kind of text box.""" roles = ('combobox', 'textbox') tag = self.tag_name() return self.get('role', None) in roles or tag in ['input', 'textarea'] - def remove_blank_target(self): + def remove_blank_target(self) -> None: """Remove target from link.""" raise NotImplementedError - def resolve_url(self, baseurl): + def resolve_url(self, baseurl: QUrl) -> typing.Optional[QUrl]: """Resolve the URL in the element's src/href attribute. Args: @@ -286,16 +297,16 @@ class AbstractWebElement(collections.abc.MutableMapping): qtutils.ensure_valid(url) return url - def is_link(self): + def is_link(self) -> bool: """Return True if this AbstractWebElement is a link.""" href_tags = ['a', 'area', 'link'] return self.tag_name() in href_tags and 'href' in self - def _requires_user_interaction(self): + def _requires_user_interaction(self) -> bool: """Return True if clicking this element needs user interaction.""" raise NotImplementedError - def _mouse_pos(self): + def _mouse_pos(self) -> QPoint: """Get the position to click/hover.""" # Click the center of the largest square fitting into the top/left # corner of the rectangle, this will help if part of the element @@ -311,35 +322,38 @@ class AbstractWebElement(collections.abc.MutableMapping): raise Error("Element position is out of view!") return pos - def _move_text_cursor(self): + def _move_text_cursor(self) -> None: """Move cursor to end after clicking.""" raise NotImplementedError - def _click_fake_event(self, click_target): + def _click_fake_event(self, click_target: usertypes.ClickTarget) -> None: """Send a fake click event to the element.""" pos = self._mouse_pos() log.webelem.debug("Sending fake click to {!r} at position {} with " "target {}".format(self, pos, click_target)) - modifiers = { + target_modifiers = { usertypes.ClickTarget.normal: Qt.NoModifier, usertypes.ClickTarget.window: Qt.AltModifier | Qt.ShiftModifier, usertypes.ClickTarget.tab: Qt.ControlModifier, usertypes.ClickTarget.tab_bg: Qt.ControlModifier, } if config.val.tabs.background: - modifiers[usertypes.ClickTarget.tab] |= Qt.ShiftModifier + target_modifiers[usertypes.ClickTarget.tab] |= Qt.ShiftModifier else: - modifiers[usertypes.ClickTarget.tab_bg] |= Qt.ShiftModifier + target_modifiers[usertypes.ClickTarget.tab_bg] |= Qt.ShiftModifier + + modifiers = typing.cast(Qt.KeyboardModifiers, + target_modifiers[click_target]) events = [ QMouseEvent(QEvent.MouseMove, pos, Qt.NoButton, Qt.NoButton, Qt.NoModifier), QMouseEvent(QEvent.MouseButtonPress, pos, Qt.LeftButton, - Qt.LeftButton, modifiers[click_target]), + Qt.LeftButton, modifiers), QMouseEvent(QEvent.MouseButtonRelease, pos, Qt.LeftButton, - Qt.NoButton, modifiers[click_target]), + Qt.NoButton, modifiers), ] for evt in events: @@ -347,15 +361,15 @@ class AbstractWebElement(collections.abc.MutableMapping): QTimer.singleShot(0, self._move_text_cursor) - def _click_editable(self, click_target): + def _click_editable(self, click_target: usertypes.ClickTarget) -> None: """Fake a click on an editable input field.""" raise NotImplementedError - def _click_js(self, click_target): + def _click_js(self, click_target: usertypes.ClickTarget) -> None: """Fake a click by using the JS .click() method.""" raise NotImplementedError - def _click_href(self, click_target): + def _click_href(self, click_target: usertypes.ClickTarget) -> None: """Fake a click on an element with a href by opening the link.""" baseurl = self._tab.url() url = self.resolve_url(baseurl) @@ -377,7 +391,8 @@ class AbstractWebElement(collections.abc.MutableMapping): else: raise ValueError("Unknown ClickTarget {}".format(click_target)) - def click(self, click_target, *, force_event=False): + def click(self, click_target: usertypes.ClickTarget, *, + force_event: bool = False) -> None: """Simulate a click on the element. Args: @@ -414,7 +429,7 @@ class AbstractWebElement(collections.abc.MutableMapping): else: raise ValueError("Unknown ClickTarget {}".format(click_target)) - def hover(self): + def hover(self) -> None: """Simulate a mouse hover over the element.""" pos = self._mouse_pos() event = QMouseEvent(QEvent.MouseMove, pos, Qt.NoButton, Qt.NoButton, diff --git a/qutebrowser/browser/webengine/webengineelem.py b/qutebrowser/browser/webengine/webengineelem.py index 4ef20da18..13292b45b 100644 --- a/qutebrowser/browser/webengine/webengineelem.py +++ b/qutebrowser/browser/webengine/webengineelem.py @@ -22,20 +22,27 @@ """QtWebEngine specific part of the web element API.""" +import typing + from PyQt5.QtCore import QRect, Qt, QPoint, QEventLoop from PyQt5.QtGui import QMouseEvent from PyQt5.QtWidgets import QApplication from PyQt5.QtWebEngineWidgets import QWebEngineSettings -from qutebrowser.utils import log, javascript, urlutils +from qutebrowser.utils import log, javascript, urlutils, usertypes from qutebrowser.browser import webelem +MYPY = False +if MYPY: + # pylint: disable=unused-import,useless-suppression + from qutebrowser.browser.webengine import webenginetab class WebEngineElement(webelem.AbstractWebElement): """A web element for QtWebEngine, using JS under the hood.""" - def __init__(self, js_dict, tab): + def __init__(self, js_dict: typing.Dict[str, typing.Any], + tab: 'webenginetab.WebEngineTab') -> None: super().__init__(tab) # Do some sanity checks on the data we get from JS js_dict_types = { @@ -48,7 +55,7 @@ class WebEngineElement(webelem.AbstractWebElement): 'rects': list, 'attributes': dict, 'caret_position': (int, type(None)), - } + } # type: typing.Dict[str, typing.Union[type, typing.Tuple[type,...]]] assert set(js_dict.keys()).issubset(js_dict_types.keys()) for name, typ in js_dict_types.items(): if name in js_dict and not isinstance(js_dict[name], typ): @@ -73,50 +80,51 @@ class WebEngineElement(webelem.AbstractWebElement): self._id = js_dict['id'] self._js_dict = js_dict - def __str__(self): + def __str__(self) -> str: return self._js_dict.get('text', '') - def __eq__(self, other): + def __eq__(self, other: object) -> bool: if not isinstance(other, WebEngineElement): return NotImplemented return self._id == other._id # pylint: disable=protected-access - def __getitem__(self, key): + def __getitem__(self, key: str) -> str: attrs = self._js_dict['attributes'] return attrs[key] - def __setitem__(self, key, val): + def __setitem__(self, key: str, val: str) -> None: self._js_dict['attributes'][key] = val self._js_call('set_attribute', key, val) - def __delitem__(self, key): + def __delitem__(self, key: str) -> None: log.stub() - def __iter__(self): + def __iter__(self) -> typing.Iterator[str]: return iter(self._js_dict['attributes']) - def __len__(self): + def __len__(self) -> int: return len(self._js_dict['attributes']) - def _js_call(self, name, *args, callback=None): + def _js_call(self, name: str, *args: webelem.JsValueType, + callback: typing.Callable[[typing.Any], None] = None) -> None: """Wrapper to run stuff from webelem.js.""" if self._tab.is_deleted(): raise webelem.OrphanedError("Tab containing element vanished") js_code = javascript.assemble('webelem', name, self._id, *args) self._tab.run_js_async(js_code, callback=callback) - def has_frame(self): + def has_frame(self) -> bool: return True - def geometry(self): + def geometry(self) -> QRect: log.stub() return QRect() - def classes(self): + def classes(self) -> typing.List[str]: """Get a list of classes assigned to this element.""" return self._js_dict['class_name'].split() - def tag_name(self): + def tag_name(self) -> str: """Get the tag name of this element. The returned name will always be lower-case. @@ -125,34 +133,37 @@ class WebEngineElement(webelem.AbstractWebElement): assert isinstance(tag, str), tag return tag.lower() - def outer_xml(self): + def outer_xml(self) -> str: """Get the full HTML representation of this element.""" return self._js_dict['outer_xml'] - def value(self): + def value(self) -> webelem.JsValueType: return self._js_dict.get('value', None) - def set_value(self, value): + def set_value(self, value: webelem.JsValueType) -> None: self._js_call('set_value', value) - def dispatch_event(self, event, bubbles=False, - cancelable=False, composed=False): + def dispatch_event(self, event: str, + bubbles: bool = False, + cancelable: bool = False, + composed: bool = False) -> None: self._js_call('dispatch_event', event, bubbles, cancelable, composed) - def caret_position(self): + def caret_position(self) -> typing.Optional[int]: """Get the text caret position for the current element. If the element is not a text element, None is returned. """ return self._js_dict.get('caret_position', None) - def insert_text(self, text): + def insert_text(self, text: str) -> None: if not self.is_editable(strict=True): raise webelem.Error("Element is not editable!") log.webelem.debug("Inserting text into element {!r}".format(self)) self._js_call('insert_text', text) - def rect_on_view(self, *, elem_geometry=None, no_js=False): + def rect_on_view(self, *, elem_geometry: QRect = None, + no_js: bool = False) -> QRect: """Get the geometry of the element relative to the webview. Skipping of small rectangles is due to elements containing other @@ -193,16 +204,16 @@ class WebEngineElement(webelem.AbstractWebElement): self, rects)) return QRect() - def remove_blank_target(self): + def remove_blank_target(self) -> None: if self._js_dict['attributes'].get('target') == '_blank': self._js_dict['attributes']['target'] = '_top' self._js_call('remove_blank_target') - def _move_text_cursor(self): + def _move_text_cursor(self) -> None: if self.is_text_input() and self.is_editable(): self._js_call('move_cursor_to_end') - def _requires_user_interaction(self): + def _requires_user_interaction(self) -> bool: baseurl = self._tab.url() url = self.resolve_url(baseurl) if url is None: @@ -211,7 +222,7 @@ class WebEngineElement(webelem.AbstractWebElement): return False return url.scheme() not in urlutils.WEBENGINE_SCHEMES - def _click_editable(self, click_target): + def _click_editable(self, click_target: usertypes.ClickTarget) -> None: # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-58515 ev = QMouseEvent(QMouseEvent.MouseButtonPress, QPoint(0, 0), QPoint(0, 0), QPoint(0, 0), Qt.NoButton, Qt.NoButton, @@ -221,10 +232,11 @@ class WebEngineElement(webelem.AbstractWebElement): self._js_call('focus') self._move_text_cursor() - def _click_js(self, _click_target): + def _click_js(self, _click_target: usertypes.ClickTarget) -> None: # FIXME:qtwebengine Have a proper API for this # pylint: disable=protected-access view = self._tab._widget + assert view is not None # pylint: enable=protected-access attribute = QWebEngineSettings.JavascriptCanOpenWindows could_open_windows = view.settings().testAttribute(attribute) @@ -238,8 +250,9 @@ class WebEngineElement(webelem.AbstractWebElement): qapp.processEvents(QEventLoop.ExcludeSocketNotifiers | QEventLoop.ExcludeUserInputEvents) - def reset_setting(_arg): + def reset_setting(_arg: typing.Any) -> None: """Set the JavascriptCanOpenWindows setting to its old value.""" + assert view is not None try: view.settings().setAttribute(attribute, could_open_windows) except RuntimeError: diff --git a/qutebrowser/browser/webkit/webkitelem.py b/qutebrowser/browser/webkit/webkitelem.py index 66d5e59b8..44cc8ae2d 100644 --- a/qutebrowser/browser/webkit/webkitelem.py +++ b/qutebrowser/browser/webkit/webkitelem.py @@ -19,12 +19,18 @@ """QtWebKit specific part of the web element API.""" +import typing + from PyQt5.QtCore import QRect from PyQt5.QtWebKit import QWebElement, QWebSettings +from PyQt5.QtWebKitWidgets import QWebFrame from qutebrowser.config import config -from qutebrowser.utils import log, utils, javascript +from qutebrowser.utils import log, utils, javascript, usertypes from qutebrowser.browser import webelem +MYPY = False +if MYPY: + from qutebrowser.browser.webkit import webkittab class IsNullError(webelem.Error): @@ -36,7 +42,7 @@ class WebKitElement(webelem.AbstractWebElement): """A wrapper around a QWebElement.""" - def __init__(self, elem, tab): + def __init__(self, elem: QWebElement, tab: webkittab.WebKitTab) -> None: super().__init__(tab) if isinstance(elem, self.__class__): raise TypeError("Trying to wrap a wrapper!") @@ -44,90 +50,94 @@ class WebKitElement(webelem.AbstractWebElement): raise IsNullError('{} is a null element!'.format(elem)) self._elem = elem - def __str__(self): + def __str__(self) -> str: self._check_vanished() return self._elem.toPlainText() - def __eq__(self, other): + def __eq__(self, other: object) -> bool: if not isinstance(other, WebKitElement): return NotImplemented return self._elem == other._elem # pylint: disable=protected-access - def __getitem__(self, key): + def __getitem__(self, key: str) -> str: self._check_vanished() if key not in self: raise KeyError(key) return self._elem.attribute(key) - def __setitem__(self, key, val): + def __setitem__(self, key: str, val: str) -> None: self._check_vanished() self._elem.setAttribute(key, val) - def __delitem__(self, key): + def __delitem__(self, key: str) -> None: self._check_vanished() if key not in self: raise KeyError(key) self._elem.removeAttribute(key) - def __contains__(self, key): + def __contains__(self, key: object) -> bool: + assert isinstance(key, str) self._check_vanished() return self._elem.hasAttribute(key) - def __iter__(self): + def __iter__(self) -> typing.Iterator[str]: self._check_vanished() yield from self._elem.attributeNames() - def __len__(self): + def __len__(self) -> int: self._check_vanished() return len(self._elem.attributeNames()) - def _check_vanished(self): + def _check_vanished(self) -> None: """Raise an exception if the element vanished (is null).""" if self._elem.isNull(): raise IsNullError('Element {} vanished!'.format(self._elem)) - def has_frame(self): + def has_frame(self) -> bool: self._check_vanished() return self._elem.webFrame() is not None - def geometry(self): + def geometry(self) -> QRect: self._check_vanished() return self._elem.geometry() - def classes(self): + def classes(self) -> typing.List[str]: self._check_vanished() return self._elem.classes() - def tag_name(self): + def tag_name(self) -> str: """Get the tag name for the current element.""" self._check_vanished() return self._elem.tagName().lower() - def outer_xml(self): + def outer_xml(self) -> str: """Get the full HTML representation of this element.""" self._check_vanished() return self._elem.toOuterXml() - def value(self): + def value(self) -> webelem.JsValueType: self._check_vanished() val = self._elem.evaluateJavaScript('this.value') assert isinstance(val, (int, float, str, type(None))), val return val - def set_value(self, value): + def set_value(self, value: webelem.JsValueType) -> None: self._check_vanished() if self._tab.is_deleted(): raise webelem.OrphanedError("Tab containing element vanished") if self.is_content_editable(): log.webelem.debug("Filling {!r} via set_text.".format(self)) + assert isinstance(value, str) self._elem.setPlainText(value) else: log.webelem.debug("Filling {!r} via javascript.".format(self)) value = javascript.to_js(value) self._elem.evaluateJavaScript("this.value={}".format(value)) - def dispatch_event(self, event, bubbles=False, - cancelable=False, composed=False): + def dispatch_event(self, event: str, + bubbles: bool = False, + cancelable: bool = False, + composed: bool = False) -> None: self._check_vanished() log.webelem.debug("Firing event on {!r} via javascript.".format(self)) self._elem.evaluateJavaScript( @@ -138,7 +148,7 @@ class WebKitElement(webelem.AbstractWebElement): javascript.to_js(cancelable), javascript.to_js(composed))) - def caret_position(self): + def caret_position(self) -> int: """Get the text caret position for the current element.""" self._check_vanished() pos = self._elem.evaluateJavaScript('this.selectionStart') @@ -146,7 +156,7 @@ class WebKitElement(webelem.AbstractWebElement): return 0 return int(pos) - def insert_text(self, text): + def insert_text(self, text: str) -> None: self._check_vanished() if not self.is_editable(strict=True): raise webelem.Error("Element is not editable!") @@ -158,7 +168,7 @@ class WebKitElement(webelem.AbstractWebElement): this.dispatchEvent(event); """.format(javascript.to_js(text))) - def _parent(self): + def _parent(self) -> typing.Optional['WebKitElement']: """Get the parent element of this element.""" self._check_vanished() elem = self._elem.parent() @@ -166,7 +176,7 @@ class WebKitElement(webelem.AbstractWebElement): return None return WebKitElement(elem, tab=self._tab) - def _rect_on_view_js(self): + def _rect_on_view_js(self) -> typing.Optional[QRect]: """Javascript implementation for rect_on_view.""" # FIXME:qtwebengine maybe we can reuse this? rects = self._elem.evaluateJavaScript("this.getClientRects()") @@ -178,8 +188,8 @@ class WebKitElement(webelem.AbstractWebElement): return None text = utils.compact_text(self._elem.toOuterXml(), 500) - log.webelem.vdebug("Client rectangles of element '{}': {}".format( - text, rects)) + log.webelem.vdebug( # type: ignore + "Client rectangles of element '{}': {}".format(text, rects)) for i in range(int(rects.get("length", 0))): rect = rects[str(i)] @@ -204,7 +214,8 @@ class WebKitElement(webelem.AbstractWebElement): return None - def _rect_on_view_python(self, elem_geometry): + def _rect_on_view_python(self, + elem_geometry: typing.Optional[QRect]) -> QRect: """Python implementation for rect_on_view.""" if elem_geometry is None: geometry = self._elem.geometry() @@ -218,7 +229,8 @@ class WebKitElement(webelem.AbstractWebElement): frame = frame.parentFrame() return rect - def rect_on_view(self, *, elem_geometry=None, no_js=False): + def rect_on_view(self, *, elem_geometry: QRect = None, + no_js: bool = False) -> QRect: """Get the geometry of the element relative to the webview. Uses the getClientRects() JavaScript method to obtain the collection of @@ -248,7 +260,7 @@ class WebKitElement(webelem.AbstractWebElement): # No suitable rects found via JS, try via the QWebElement API return self._rect_on_view_python(elem_geometry) - def _is_visible(self, mainframe): + def _is_visible(self, mainframe: QWebFrame) -> bool: """Check if the given element is visible in the given frame. This is not public API because it can't be implemented easily here with @@ -300,8 +312,8 @@ class WebKitElement(webelem.AbstractWebElement): visible_in_frame = visible_on_screen return all([visible_on_screen, visible_in_frame]) - def remove_blank_target(self): - elem = self + def remove_blank_target(self) -> None: + elem = self # type: typing.Optional[WebKitElement] for _ in range(5): if elem is None: break @@ -311,14 +323,14 @@ class WebKitElement(webelem.AbstractWebElement): break elem = elem._parent() # pylint: disable=protected-access - def _move_text_cursor(self): + def _move_text_cursor(self) -> None: if self.is_text_input() and self.is_editable(): self._tab.caret.move_to_end_of_document() - def _requires_user_interaction(self): + def _requires_user_interaction(self) -> bool: return False - def _click_editable(self, click_target): + def _click_editable(self, click_target: usertypes.ClickTarget) -> None: ok = self._elem.evaluateJavaScript('this.focus(); true;') if ok: self._move_text_cursor() @@ -326,7 +338,7 @@ class WebKitElement(webelem.AbstractWebElement): log.webelem.debug("Failed to focus via JS, falling back to event") self._click_fake_event(click_target) - def _click_js(self, click_target): + def _click_js(self, click_target: usertypes.ClickTarget) -> None: settings = QWebSettings.globalSettings() attribute = QWebSettings.JavascriptCanOpenWindows could_open_windows = settings.testAttribute(attribute) @@ -337,12 +349,12 @@ class WebKitElement(webelem.AbstractWebElement): log.webelem.debug("Failed to click via JS, falling back to event") self._click_fake_event(click_target) - def _click_fake_event(self, click_target): + def _click_fake_event(self, click_target: usertypes.ClickTarget) -> None: self._tab.data.override_target = click_target super()._click_fake_event(click_target) -def get_child_frames(startframe): +def get_child_frames(startframe: QWebFrame) -> typing.List[QWebFrame]: """Get all children recursively of a given QWebFrame. Loosely based on http://blog.nextgenetics.net/?e=64 @@ -356,7 +368,7 @@ def get_child_frames(startframe): results = [] frames = [startframe] while frames: - new_frames = [] + new_frames = [] # type: typing.List[QWebFrame] for frame in frames: results.append(frame) new_frames += frame.childFrames() From 02596fd325c853330f2a9cf5c223e5dc8b9f6c69 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 13 Dec 2018 11:27:16 +0100 Subject: [PATCH 349/492] Fix docstring --- qutebrowser/browser/webelem.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/qutebrowser/browser/webelem.py b/qutebrowser/browser/webelem.py index 9ae05639e..ac46fdcb9 100644 --- a/qutebrowser/browser/webelem.py +++ b/qutebrowser/browser/webelem.py @@ -62,11 +62,7 @@ def css_selector(group: str, url: QUrl) -> str: class AbstractWebElement(collections.abc.MutableMapping): - """A wrapper around QtWebKit/QtWebEngine web element. - - Attributes: - tab: The tab associated with this element. - """ + """A wrapper around QtWebKit/QtWebEngine web element.""" def __init__(self, tab: 'browsertab.AbstractTab') -> None: self._tab = tab From f49384f0bfc8ccf2639cd6c26b35c6215b64a55e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 13 Dec 2018 19:44:48 +0100 Subject: [PATCH 350/492] Expose InterceptorType via qutebrowser.api.interceptor --- qutebrowser/api/interceptor.py | 6 +++++- qutebrowser/extensions/interceptors.py | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/qutebrowser/api/interceptor.py b/qutebrowser/api/interceptor.py index 634ae1409..78819dc46 100644 --- a/qutebrowser/api/interceptor.py +++ b/qutebrowser/api/interceptor.py @@ -24,7 +24,11 @@ from qutebrowser.extensions import interceptors from qutebrowser.extensions.interceptors import Request -def register(interceptor: interceptors.InterceptorType) -> None: +#: Type annotation for an interceptor function. +InterceptorType = interceptors.InterceptorType + + +def register(interceptor: InterceptorType) -> None: """Register a request interceptor. Whenever a request happens, the interceptor gets called with a diff --git a/qutebrowser/extensions/interceptors.py b/qutebrowser/extensions/interceptors.py index 269c82ab8..7defcf213 100644 --- a/qutebrowser/extensions/interceptors.py +++ b/qutebrowser/extensions/interceptors.py @@ -47,6 +47,7 @@ class Request: self.is_blocked = True +#: Type annotation for an interceptor function. InterceptorType = typing.Callable[[Request], None] From 206a2f199b6300f1aee27577e23ab05b639cd16f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 14 Dec 2018 15:27:55 +0100 Subject: [PATCH 351/492] Fix annotation --- qutebrowser/browser/webkit/webkitelem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/webkit/webkitelem.py b/qutebrowser/browser/webkit/webkitelem.py index 44cc8ae2d..773bca67f 100644 --- a/qutebrowser/browser/webkit/webkitelem.py +++ b/qutebrowser/browser/webkit/webkitelem.py @@ -42,7 +42,7 @@ class WebKitElement(webelem.AbstractWebElement): """A wrapper around a QWebElement.""" - def __init__(self, elem: QWebElement, tab: webkittab.WebKitTab) -> None: + def __init__(self, elem: QWebElement, tab: 'webkittab.WebKitTab') -> None: super().__init__(tab) if isinstance(elem, self.__class__): raise TypeError("Trying to wrap a wrapper!") From ba940f7f87155b9e669755ff101c4bea9127e594 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 15 Dec 2018 15:43:44 +0100 Subject: [PATCH 352/492] Disable Wayland check on Qt >= 5.11.2 Fixes #2932 --- doc/changelog.asciidoc | 2 ++ qutebrowser/misc/backendproblem.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index e4da4de4c..514261953 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -51,6 +51,8 @@ Changed adblocker can be disabled on a given page. - Elements with a `tabindex` attribute now also get hints by default. - Various small performance improvements for hints and the completion. +- The Wayland check for QtWebEngine is now disabled on Qt >= 5.11.2, as those + versions should work without any issues. Fixed ~~~~~ diff --git a/qutebrowser/misc/backendproblem.py b/qutebrowser/misc/backendproblem.py index 176746759..74a2ad372 100644 --- a/qutebrowser/misc/backendproblem.py +++ b/qutebrowser/misc/backendproblem.py @@ -238,6 +238,9 @@ def _handle_wayland(): if has_qt511 and config.val.qt.force_software_rendering == 'chromium': return + if qtutils.version_check('5.11.2', compiled=False): + return + buttons = [] text = "

You can work around this in one of the following ways:

" From 4da680f41c95c5982520ba58b7a258bbac8b357a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 15 Dec 2018 16:50:15 +0100 Subject: [PATCH 353/492] Fix lint/test issue --- qutebrowser/browser/webkit/webkitelem.py | 1 + tests/unit/browser/webkit/test_webkitelem.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/webkit/webkitelem.py b/qutebrowser/browser/webkit/webkitelem.py index 773bca67f..af0db295d 100644 --- a/qutebrowser/browser/webkit/webkitelem.py +++ b/qutebrowser/browser/webkit/webkitelem.py @@ -30,6 +30,7 @@ from qutebrowser.utils import log, utils, javascript, usertypes from qutebrowser.browser import webelem MYPY = False if MYPY: + # pylint: disable=unused-import,useless-suppression from qutebrowser.browser.webkit import webkittab diff --git a/tests/unit/browser/webkit/test_webkitelem.py b/tests/unit/browser/webkit/test_webkitelem.py index 09be16848..17eae9c09 100644 --- a/tests/unit/browser/webkit/test_webkitelem.py +++ b/tests/unit/browser/webkit/test_webkitelem.py @@ -247,7 +247,7 @@ class TestWebKitElement: pytest.param(lambda e: e[None], id='getitem'), pytest.param(lambda e: operator.setitem(e, None, None), id='setitem'), pytest.param(lambda e: operator.delitem(e, None), id='delitem'), - pytest.param(lambda e: None in e, id='contains'), + pytest.param(lambda e: '' in e, id='contains'), pytest.param(list, id='iter'), pytest.param(len, id='len'), pytest.param(lambda e: e.has_frame(), id='has_frame'), From 01c25837d55ca3cba70a678f0e78b537c28c325b Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Sat, 15 Dec 2018 23:38:25 +0700 Subject: [PATCH 354/492] Fix tab_mute command --- qutebrowser/components/misccommands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/components/misccommands.py b/qutebrowser/components/misccommands.py index 60715c65b..eaf45f40d 100644 --- a/qutebrowser/components/misccommands.py +++ b/qutebrowser/components/misccommands.py @@ -238,7 +238,7 @@ def tab_mute(tab: apitypes.Tab) -> None: if tab is None: return try: - tab.audio.set_muted(tab.audio.is_muted(), override=True) + tab.audio.set_muted(not tab.audio.is_muted(), override=True) except apitypes.WebTabError as e: raise cmdutils.CommandError(e) From a49f82062bdbf812c4640d018b6b5205e6542435 Mon Sep 17 00:00:00 2001 From: Hummer12007 Date: Fri, 21 Dec 2018 02:39:31 +0200 Subject: [PATCH 355/492] Use native style for downloads view on macOS --- qutebrowser/browser/downloadview.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/downloadview.py b/qutebrowser/browser/downloadview.py index e90e37509..1ea2b6744 100644 --- a/qutebrowser/browser/downloadview.py +++ b/qutebrowser/browser/downloadview.py @@ -75,7 +75,8 @@ class DownloadView(QListView): def __init__(self, win_id, parent=None): super().__init__(parent) - self.setStyle(QStyleFactory.create('Fusion')) + if not utils.is_mac: + self.setStyle(QStyleFactory.create('Fusion')) config.set_register_stylesheet(self) self.setResizeMode(QListView.Adjust) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) From ad2add23951b46a044a9799c2c2597fc20ef25e3 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:13 +0100 Subject: [PATCH 356/492] Update typed-ast from 1.1.0 to 1.1.1 --- misc/requirements/requirements-mypy.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt index f84b63e92..6b8c63e97 100644 --- a/misc/requirements/requirements-mypy.txt +++ b/misc/requirements/requirements-mypy.txt @@ -5,4 +5,4 @@ mypy-extensions==0.4.1 PyQt5==5.11.3 PyQt5-sip==4.19.13 -e git+https://github.com/qutebrowser/PyQt5-stubs.git@wip#egg=PyQt5_stubs -typed-ast==1.1.0 +typed-ast==1.1.1 From cb688f9bba6e1a4e1d253f45ed51686d3cf887e5 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:14 +0100 Subject: [PATCH 357/492] Update setuptools from 40.6.2 to 40.6.3 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index 1e1934e76..f15a3a3e1 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -3,6 +3,6 @@ appdirs==1.4.3 packaging==18.0 pyparsing==2.3.0 -setuptools==40.6.2 +setuptools==40.6.3 six==1.12.0 wheel==0.32.3 From 56a6d2dc547414a7819b6ef34229b150657d2e05 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:16 +0100 Subject: [PATCH 358/492] Update pygments from 2.3.0 to 2.3.1 --- misc/requirements/requirements-sphinx.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-sphinx.txt b/misc/requirements/requirements-sphinx.txt index c0801a48e..6f106798b 100644 --- a/misc/requirements/requirements-sphinx.txt +++ b/misc/requirements/requirements-sphinx.txt @@ -10,7 +10,7 @@ imagesize==1.1.0 Jinja2==2.10 MarkupSafe==1.1.0 packaging==18.0 -Pygments==2.3.0 +Pygments==2.3.1 pyparsing==2.3.0 pytz==2018.7 requests==2.21.0 From 3e70aef4482f54ddda2d821a74728f4134177a9d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:17 +0100 Subject: [PATCH 359/492] Update pygments from 2.3.0 to 2.3.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 66dcf23ef..68bd341bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,6 @@ colorama==0.4.1 cssutils==1.0.2 Jinja2==2.10 MarkupSafe==1.1.0 -Pygments==2.3.0 +Pygments==2.3.1 pyPEG2==2.15.2 PyYAML==3.13 From f024b5b25a4059d2a29cf1a2e61fb8d6a6ff29c7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:19 +0100 Subject: [PATCH 360/492] Update easyprocess from 0.2.3 to 0.2.5 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 9b4bcc96f..439ce3f1e 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -8,7 +8,7 @@ cheroot==6.5.2 Click==7.0 # colorama==0.4.1 coverage==4.5.2 -EasyProcess==0.2.3 +EasyProcess==0.2.5 Flask==1.0.2 glob2==0.6 hunter==2.1.0 From 77034205a32f547fe38ed97598a66e28e7b9f10b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:20 +0100 Subject: [PATCH 361/492] Update hypothesis from 3.82.5 to 3.84.5 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 439ce3f1e..394f69bb4 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -12,7 +12,7 @@ EasyProcess==0.2.5 Flask==1.0.2 glob2==0.6 hunter==2.1.0 -hypothesis==3.82.5 +hypothesis==3.84.5 itsdangerous==1.1.0 # Jinja2==2.10 Mako==1.0.7 From f45acd0361fa3c025e7cf0203bcba8fc117c4c0b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:22 +0100 Subject: [PATCH 362/492] Update pytest from 4.0.1 to 4.0.2 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 394f69bb4..739987d04 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -23,7 +23,7 @@ parse-type==0.4.2 pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 -pytest==4.0.1 +pytest==4.0.2 pytest-bdd==3.0.0 pytest-benchmark==3.1.1 pytest-cov==2.6.0 From e529dbbc84c93f0bc325c93f2b64aaa1e3b69920 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:23 +0100 Subject: [PATCH 363/492] Update pytest-bdd from 3.0.0 to 3.0.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 739987d04..10f12b90f 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -24,7 +24,7 @@ pluggy==0.8.0 py==1.7.0 py-cpuinfo==4.0.0 pytest==4.0.2 -pytest-bdd==3.0.0 +pytest-bdd==3.0.1 pytest-benchmark==3.1.1 pytest-cov==2.6.0 pytest-faulthandler==1.5.0 From 4968c6bd760216011d50a87dbf8ef845c69e8692 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:25 +0100 Subject: [PATCH 364/492] Update pytest-qt from 3.2.1 to 3.2.2 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 10f12b90f..28c26d891 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -30,7 +30,7 @@ pytest-cov==2.6.0 pytest-faulthandler==1.5.0 pytest-instafail==0.4.0 pytest-mock==1.10.0 -pytest-qt==3.2.1 +pytest-qt==3.2.2 pytest-repeat==0.7.0 pytest-rerunfailures==5.0 pytest-travis-fold==1.3.0 From 4cc9d7f68abfae64061c41b2eb47ea4834b1e6e7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 24 Dec 2018 19:21:26 +0100 Subject: [PATCH 365/492] Update tox from 3.5.3 to 3.6.1 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index b6c9e9d6f..ed0db2870 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -5,5 +5,5 @@ pluggy==0.8.0 py==1.7.0 six==1.12.0 toml==0.10.0 -tox==3.5.3 +tox==3.6.1 virtualenv==16.1.0 From 64fb73df3e31b0fbe45f69c320855d819a1b404a Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Sat, 29 Dec 2018 08:23:09 -0800 Subject: [PATCH 366/492] Add mutation observer when documentElement does not exist yet --- qutebrowser/javascript/stylesheet.js | 1 + 1 file changed, 1 insertion(+) diff --git a/qutebrowser/javascript/stylesheet.js b/qutebrowser/javascript/stylesheet.js index 3dfefe700..96b5aa35d 100644 --- a/qutebrowser/javascript/stylesheet.js +++ b/qutebrowser/javascript/stylesheet.js @@ -41,6 +41,7 @@ window._qutebrowser.stylesheet = (function() { // https://github.com/openstyles/stylus/blob/1.1.4.2/content/apply.js#L235-L355 function watch_root() { if (!document.documentElement) { + root_observer.observe(document, {"childList": true}); return; } From 49d468527a6a54769d4d6a0c78945e2063ada1aa Mon Sep 17 00:00:00 2001 From: ykgmfq Date: Sun, 30 Dec 2018 14:58:02 +0100 Subject: [PATCH 367/492] Remove obsolete Fedora instructions --- doc/install.asciidoc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/doc/install.asciidoc b/doc/install.asciidoc index 37f6ebb12..c9ae54cd2 100644 --- a/doc/install.asciidoc +++ b/doc/install.asciidoc @@ -102,18 +102,12 @@ $ python3 scripts/asciidoc2html.py On Fedora --------- -NOTE: Fedora's packages used to be outdated for a long time, but are -now (November 2017) maintained and up-to-date again. - qutebrowser is available in the official repositories: ----- # dnf install qutebrowser ----- -However, note that Fedora 25/26 won't be updated to qutebrowser v1.0, so you -might want to <> instead there. - Additional hints ~~~~~~~~~~~~~~~~ From dc2462508483974ec0bcab578114640bf0995ba6 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 31 Dec 2018 19:23:13 +0100 Subject: [PATCH 368/492] Update flake8-per-file-ignores from 0.6 to 0.7 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index 20a66cd5f..42255f825 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -11,7 +11,7 @@ flake8-deprecated==1.3 flake8-docstrings==1.3.0 flake8-future-import==0.4.5 flake8-mock==0.3 -flake8-per-file-ignores==0.6 +flake8-per-file-ignores==0.7 flake8-polyfill==1.0.2 flake8-string-format==0.2.3 flake8-tidy-imports==1.1.0 From 53f53caa53ab3bf4975d670dd6a61e192a53fa5a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 31 Dec 2018 19:23:15 +0100 Subject: [PATCH 369/492] Update sphinx from 1.8.2 to 1.8.3 --- misc/requirements/requirements-sphinx.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-sphinx.txt b/misc/requirements/requirements-sphinx.txt index 6f106798b..c089895d1 100644 --- a/misc/requirements/requirements-sphinx.txt +++ b/misc/requirements/requirements-sphinx.txt @@ -16,6 +16,6 @@ pytz==2018.7 requests==2.21.0 six==1.12.0 snowballstemmer==1.2.1 -Sphinx==1.8.2 +Sphinx==1.8.3 sphinxcontrib-websupport==1.1.0 urllib3==1.24.1 From f90d5f13d27cc607d7ab0c0e4e1e2c11645e255b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 31 Dec 2018 19:23:16 +0100 Subject: [PATCH 370/492] Update beautifulsoup4 from 4.6.3 to 4.7.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 28c26d891..a9e3f76b1 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -3,7 +3,7 @@ atomicwrites==1.2.1 attrs==18.2.0 backports.functools-lru-cache==1.5 -beautifulsoup4==4.6.3 +beautifulsoup4==4.7.0 cheroot==6.5.2 Click==7.0 # colorama==0.4.1 From a8e7f3ca6b5454712257de5750d436419aedd729 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 31 Dec 2018 19:23:18 +0100 Subject: [PATCH 371/492] Update cheroot from 6.5.2 to 6.5.3 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index a9e3f76b1..cbd2ea53c 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -4,7 +4,7 @@ atomicwrites==1.2.1 attrs==18.2.0 backports.functools-lru-cache==1.5 beautifulsoup4==4.7.0 -cheroot==6.5.2 +cheroot==6.5.3 Click==7.0 # colorama==0.4.1 coverage==4.5.2 From 590203b2a19b61fa9f70c2f490ec554180a552f9 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 31 Dec 2018 19:23:19 +0100 Subject: [PATCH 372/492] Update hypothesis from 3.84.5 to 3.85.2 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index cbd2ea53c..d2a9f0518 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -12,7 +12,7 @@ EasyProcess==0.2.5 Flask==1.0.2 glob2==0.6 hunter==2.1.0 -hypothesis==3.84.5 +hypothesis==3.85.2 itsdangerous==1.1.0 # Jinja2==2.10 Mako==1.0.7 From 5b94208389f0e9d4497b78680882f63e2948e81b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 31 Dec 2018 19:23:20 +0100 Subject: [PATCH 373/492] Update more-itertools from 4.3.0 to 5.0.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index d2a9f0518..228045f8c 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -17,7 +17,7 @@ itsdangerous==1.1.0 # Jinja2==2.10 Mako==1.0.7 # MarkupSafe==1.1.0 -more-itertools==4.3.0 +more-itertools==5.0.0 parse==1.9.0 parse-type==0.4.2 pluggy==0.8.0 From f9be35a30aef27b6c767404017150e13ee31ddd7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 2 Jan 2019 23:23:28 +0100 Subject: [PATCH 374/492] Add pywal to docs --- doc/help/configuring.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/help/configuring.asciidoc b/doc/help/configuring.asciidoc index 33711b755..b04c9e9df 100644 --- a/doc/help/configuring.asciidoc +++ b/doc/help/configuring.asciidoc @@ -396,6 +396,7 @@ Pre-built colorschemes - A collection of https://github.com/chriskempson/base16[base16] color-schemes can be found in https://github.com/theova/base16-qutebrowser[base16-qutebrowser] and used with https://github.com/AuditeMarlow/base16-manager[base16-manager]. - Two implementations of the https://github.com/arcticicestudio/nord[Nord] colorscheme for qutebrowser exist: https://github.com/Linuus/nord-qutebrowser[Linuus], https://github.com/KnownAsDon/QuteBrowser-Nord-Theme[KnownAsDon] - https://github.com/evannagle/qutebrowser-dracula-theme[Dracula] +- https://github.com/jjzmajic/qutewal[Pywal theme] Avoiding flake8 errors ^^^^^^^^^^^^^^^^^^^^^^ From 1ef793fa6617c434a0ba97caed12014d50a4b534 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 3 Jan 2019 13:40:05 +0100 Subject: [PATCH 375/492] Qt 5.12: Disable chrome-error:// and chrome-extension:// workaround --- qutebrowser/browser/webengine/webenginequtescheme.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/webengine/webenginequtescheme.py b/qutebrowser/browser/webengine/webenginequtescheme.py index 68ffa019d..4e42e0eb5 100644 --- a/qutebrowser/browser/webengine/webenginequtescheme.py +++ b/qutebrowser/browser/webengine/webenginequtescheme.py @@ -34,7 +34,8 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler): def install(self, profile): """Install the handler for qute:// URLs on the given profile.""" profile.installUrlSchemeHandler(b'qute', self) - if qtutils.version_check('5.11', compiled=False): + if (qtutils.version_check('5.11', compiled=False) and + not qtutils.version_check('5.12', compiled=False)): # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-63378 profile.installUrlSchemeHandler(b'chrome-error', self) profile.installUrlSchemeHandler(b'chrome-extension', self) From 530befd68154440348c776a7dbf3683a7d90d9d1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 3 Jan 2019 14:38:12 +0100 Subject: [PATCH 376/492] Register qute:// scheme with Qt See #3992, #4198 --- .../browser/webengine/webenginequtescheme.py | 21 +++++++++++++++++++ .../browser/webengine/webenginesettings.py | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/webengine/webenginequtescheme.py b/qutebrowser/browser/webengine/webenginequtescheme.py index 4e42e0eb5..816589514 100644 --- a/qutebrowser/browser/webengine/webenginequtescheme.py +++ b/qutebrowser/browser/webengine/webenginequtescheme.py @@ -22,6 +22,11 @@ from PyQt5.QtCore import QBuffer, QIODevice, QUrl from PyQt5.QtWebEngineCore import (QWebEngineUrlSchemeHandler, QWebEngineUrlRequestJob) +try: + from PyQt5.QtWebEngineCore import QWebEngineUrlScheme # type: ignore +except ImportError: + # Added in Qt 5.12 + QWebEngineUrlScheme = None from qutebrowser.browser import qutescheme from qutebrowser.utils import log, qtutils @@ -33,6 +38,9 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler): def install(self, profile): """Install the handler for qute:// URLs on the given profile.""" + if QWebEngineUrlScheme is not None: + assert QWebEngineUrlScheme.schemeByName(b'qute') is not None + profile.installUrlSchemeHandler(b'qute', self) if (qtutils.version_check('5.11', compiled=False) and not qtutils.version_check('5.12', compiled=False)): @@ -131,3 +139,16 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler): buf.seek(0) buf.close() job.reply(mimetype.encode('ascii'), buf) + + +def init(): + """Register the qute:// scheme. + + Note this needs to be called early, before constructing any QtWebEngine + classes. + """ + if QWebEngineUrlScheme is not None: + scheme = QWebEngineUrlScheme(b'qute') + scheme.setFlags(QWebEngineUrlScheme.LocalScheme | + QWebEngineUrlScheme.LocalAccessAllowed) + QWebEngineUrlScheme.registerScheme(scheme) diff --git a/qutebrowser/browser/webengine/webenginesettings.py b/qutebrowser/browser/webengine/webenginesettings.py index da569eef6..10c4d4e6b 100644 --- a/qutebrowser/browser/webengine/webenginesettings.py +++ b/qutebrowser/browser/webengine/webenginesettings.py @@ -30,7 +30,7 @@ from PyQt5.QtGui import QFont from PyQt5.QtWebEngineWidgets import (QWebEngineSettings, QWebEngineProfile, QWebEnginePage) -from qutebrowser.browser.webengine import spell +from qutebrowser.browser.webengine import spell, webenginequtescheme from qutebrowser.config import config, websettings from qutebrowser.config.websettings import AttributeInfo as Attr from qutebrowser.utils import utils, standarddir, qtutils, message, log @@ -298,6 +298,7 @@ def init(args): not hasattr(QWebEnginePage, 'setInspectedPage')): # only Qt < 5.11 os.environ['QTWEBENGINE_REMOTE_DEBUGGING'] = str(utils.random_port()) + webenginequtescheme.init() spell.init() _init_profiles() From 060489f1bc5b5a6529bd8e78d80449a4b06dd568 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 3 Jan 2019 22:11:58 +0100 Subject: [PATCH 377/492] Fix new shellcheck issues --- misc/userscripts/qutedmenu | 4 ++-- scripts/dev/ci/travis_install.sh | 2 +- scripts/dev/ci/travis_run.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/misc/userscripts/qutedmenu b/misc/userscripts/qutedmenu index de1b8d641..cc5a44413 100755 --- a/misc/userscripts/qutedmenu +++ b/misc/userscripts/qutedmenu @@ -37,7 +37,7 @@ get_selection() { # https://github.com/halfwit/dotfiles/blob/master/.config/dmenu/font [[ -s $confdir/dmenu/font ]] && read -r font < "$confdir"/dmenu/font -[[ $font ]] && opts+=(-fn "$font") +[[ -n $font ]] && opts+=(-fn "$font") # shellcheck source=/dev/null [[ -s $optsfile ]] && source "$optsfile" @@ -46,7 +46,7 @@ url=$(get_selection) url=${url/*http/http} # If no selection is made, exit (escape pressed, e.g.) -[[ ! $url ]] && exit 0 +[[ -z $url ]] && exit 0 case $1 in open) printf '%s' "open $url" >> "$QUTE_FIFO" || qutebrowser "$url" ;; diff --git a/scripts/dev/ci/travis_install.sh b/scripts/dev/ci/travis_install.sh index 18f5aa9ec..c736a01d3 100644 --- a/scripts/dev/ci/travis_install.sh +++ b/scripts/dev/ci/travis_install.sh @@ -71,7 +71,7 @@ EOF set -e -if [[ $DOCKER ]]; then +if [[ -n $DOCKER ]]; then exit 0 elif [[ $TRAVIS_OS_NAME == osx ]]; then # Disable App Nap diff --git a/scripts/dev/ci/travis_run.sh b/scripts/dev/ci/travis_run.sh index a287e844e..4e338221f 100644 --- a/scripts/dev/ci/travis_run.sh +++ b/scripts/dev/ci/travis_run.sh @@ -1,6 +1,6 @@ #!/bin/bash -if [[ $DOCKER ]]; then +if [[ -n $DOCKER ]]; then docker run \ --privileged \ -v "$PWD:/outside" \ From 3528de82e9944c853c6d76eb1823a8eb9b8e4488 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 4 Jan 2019 10:30:06 +0100 Subject: [PATCH 378/492] Also skip SSL test on Qt 5.12 See #4240 --- tests/end2end/features/downloads.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/end2end/features/downloads.feature b/tests/end2end/features/downloads.feature index 7bde58b4f..b1d92145d 100644 --- a/tests/end2end/features/downloads.feature +++ b/tests/end2end/features/downloads.feature @@ -93,7 +93,7 @@ Feature: Downloading things from a website. Then no crash should happen # https://github.com/qutebrowser/qutebrowser/issues/4240 - @qt!=5.11.2 + @qt<5.11.2 Scenario: Downloading with SSL errors (issue 1413) When SSL is supported And I clear SSL errors From 24a1104dc750659679f9440945e5dbe93a681058 Mon Sep 17 00:00:00 2001 From: adam Date: Fri, 4 Jan 2019 18:03:33 -0500 Subject: [PATCH 379/492] Implement pinned.tab.frozen setting (issue #4400) Implement a new setting, `pinned.tab.frozen` (boolean), which when false allows a user to navigate to new URLs in a pinned tab (default behavior is to have `pinned.tab.frozen = true`, in which no navigation is allowed). issue URL: https://github.com/qutebrowser/qutebrowser/issues/4400 Changes to be committed: modified: qutebrowser/browser/browsertab.py Add `navigation_blocked` method to AbstractTab, which returns true if navigation is allowed on a tab. modified: qutebrowser/browser/commands.py Change `openurl` to use `navigation_blocked` method of a tab to determine behavior while navigating a pinned tab. modified: qutebrowser/components/misccommands.py Change `home` to use `navigation_blocked` method of a tab to determine behavior while navigating a pinned tab. modified: qutebrowser/config/configdata.yml Add `pinned.tab.frozen` config. modified: tests/end2end/features/tabs.feature Add tests for :open and :home on pinned tabs with `pinned.tab.frozen` set to false --- qutebrowser/browser/browsertab.py | 4 ++++ qutebrowser/browser/commands.py | 7 ++++--- qutebrowser/components/misccommands.py | 2 +- qutebrowser/config/configdata.yml | 5 +++++ tests/end2end/features/tabs.feature | 18 ++++++++++++++++++ 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 029394657..80871a254 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -943,6 +943,10 @@ class AbstractTab(QWidget): evt.posted = True QApplication.postEvent(recipient, evt) + def navigation_blocked(self) -> bool: + """Test if navigation is allowed on the current tab.""" + return self.data.pinned and config.val.pinned.tab.frozen + @pyqtSlot(QUrl) def _on_before_load_started(self, url: QUrl) -> None: """Adjust the title if we are going to visit a URL soon.""" diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 571e06d8b..c47811701 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -316,10 +316,11 @@ class CommandDispatcher: else: # Explicit count with a tab that doesn't exist. return - elif curtab.data.pinned: - message.info("Tab is pinned!") else: - curtab.load_url(cur_url) + if curtab.navigation_blocked(): + message.info("Tab is pinned!") + else: + curtab.load_url(cur_url) def _parse_url(self, url, *, force_search=False): """Parse a URL or quickmark or search query. diff --git a/qutebrowser/components/misccommands.py b/qutebrowser/components/misccommands.py index eaf45f40d..a65bdd235 100644 --- a/qutebrowser/components/misccommands.py +++ b/qutebrowser/components/misccommands.py @@ -118,7 +118,7 @@ def printpage(tab: apitypes.Tab, @cmdutils.argument('tab', value=cmdutils.Value.cur_tab) def home(tab: apitypes.Tab) -> None: """Open main startpage in current tab.""" - if tab.data.pinned: + if tab.navigation_blocked(): message.info("Tab is pinned!") else: tab.load_url(config.val.url.start_pages[0]) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index bed4d9659..15b3eb446 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -2917,3 +2917,8 @@ bindings.commands: * register: Entered when qutebrowser is waiting for a register name/key for commands like `:set-mark`. + +pinned.tab.frozen: + type: Bool + default: True + desc: If true, then pinned tabs cannot have their URL changed. diff --git a/tests/end2end/features/tabs.feature b/tests/end2end/features/tabs.feature index 7f4d4635c..ec6400458 100644 --- a/tests/end2end/features/tabs.feature +++ b/tests/end2end/features/tabs.feature @@ -1289,6 +1289,14 @@ Feature: Tab management And the following tabs should be open: - data/numbers/1.txt (active) (pinned) + Scenario: :tab-pin open url with pinned.tab.frozen = false + When I set pinned.tab.frozen to false + And I open data/numbers/1.txt + And I run :tab-pin + And I open data/numbers/2.txt + Then the following tabs should be open: + - data/numbers/2.txt (active) (pinned) + Scenario: :home on a pinned tab When I open data/numbers/1.txt And I run :tab-pin @@ -1297,6 +1305,16 @@ Feature: Tab management And the following tabs should be open: - data/numbers/1.txt (active) (pinned) + Scenario: :home on a pinned tab with pinned.tab.frozen = false + When I set url.start_pages to ["http://localhost:(port)/data/numbers/2.txt"] + And I set pinned.tab.frozen to false + And I open data/numbers/1.txt + And I run :tab-pin + And I run :home + Then data/numbers/2.txt should be loaded + And the following tabs should be open: + - data/numbers/2.txt (active) (pinned) + Scenario: Cloning a pinned tab When I open data/numbers/1.txt And I run :tab-pin From 9662d3aa252dc31c574c52299b9abc6560d6334c Mon Sep 17 00:00:00 2001 From: adam Date: Sat, 5 Jan 2019 23:21:59 -0500 Subject: [PATCH 380/492] Change commands.py to maintain old indent level Changes to be committed: modified: qutebrowser/browser/commands.py --- qutebrowser/browser/commands.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index c47811701..6ae47f9d9 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -316,11 +316,10 @@ class CommandDispatcher: else: # Explicit count with a tab that doesn't exist. return + elif curtab.navigation_blocked(): + message.info("Tab is pinned!") else: - if curtab.navigation_blocked(): - message.info("Tab is pinned!") - else: - curtab.load_url(cur_url) + curtab.load_url(cur_url) def _parse_url(self, url, *, force_search=False): """Parse a URL or quickmark or search query. From 5cd988ae52eeadb85d97bfa95c2773c0e3f4e7a8 Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 6 Jan 2019 20:53:26 -0500 Subject: [PATCH 381/492] Change config option to in tabs.pinned group Changes to be committed: modified: qutebrowser/browser/browsertab.py modified: qutebrowser/config/configdata.yml modified: tests/end2end/features/tabs.feature Changed pinned.tabs.frozen to be tabs.pinned.frozen in all of these files. --- qutebrowser/browser/browsertab.py | 2 +- qutebrowser/config/configdata.yml | 10 +++++----- tests/end2end/features/tabs.feature | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 80871a254..55ab89a20 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -945,7 +945,7 @@ class AbstractTab(QWidget): def navigation_blocked(self) -> bool: """Test if navigation is allowed on the current tab.""" - return self.data.pinned and config.val.pinned.tab.frozen + return self.data.pinned and config.val.tabs.pinned.frozen @pyqtSlot(QUrl) def _on_before_load_started(self, url: QUrl) -> None: diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 15b3eb446..f6313cc88 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1768,6 +1768,11 @@ tabs.pinned.shrink: type: Bool desc: Shrink pinned tabs down to their contents. +tabs.pinned.frozen: + type: Bool + default: True + desc: If true, then pinned tabs cannot have their URL changed. + tabs.wrap: default: true type: Bool @@ -2917,8 +2922,3 @@ bindings.commands: * register: Entered when qutebrowser is waiting for a register name/key for commands like `:set-mark`. - -pinned.tab.frozen: - type: Bool - default: True - desc: If true, then pinned tabs cannot have their URL changed. diff --git a/tests/end2end/features/tabs.feature b/tests/end2end/features/tabs.feature index ec6400458..804f72bbf 100644 --- a/tests/end2end/features/tabs.feature +++ b/tests/end2end/features/tabs.feature @@ -1289,8 +1289,8 @@ Feature: Tab management And the following tabs should be open: - data/numbers/1.txt (active) (pinned) - Scenario: :tab-pin open url with pinned.tab.frozen = false - When I set pinned.tab.frozen to false + Scenario: :tab-pin open url with tabs.pinned.frozen = false + When I set tabs.pinned.frozen to false And I open data/numbers/1.txt And I run :tab-pin And I open data/numbers/2.txt @@ -1305,9 +1305,9 @@ Feature: Tab management And the following tabs should be open: - data/numbers/1.txt (active) (pinned) - Scenario: :home on a pinned tab with pinned.tab.frozen = false + Scenario: :home on a pinned tab with tabs.pinned.frozen = false When I set url.start_pages to ["http://localhost:(port)/data/numbers/2.txt"] - And I set pinned.tab.frozen to false + And I set tabs.pinned.frozen to false And I open data/numbers/1.txt And I run :tab-pin And I run :home From 65ae7ca455b2520f5f78ec4ab497cdb073259602 Mon Sep 17 00:00:00 2001 From: adam Date: Mon, 7 Jan 2019 15:42:01 -0500 Subject: [PATCH 382/492] Make option desc imperative As given in commit https://github.com/qutebrowser/qutebrowser/commit/494aceec451e307b0227b0fdd0f86d419dbc11d1 Changes to be committed: modified: qutebrowser/config/configdata.yml --- qutebrowser/config/configdata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index f6313cc88..b6d4736ae 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -1771,7 +1771,7 @@ tabs.pinned.shrink: tabs.pinned.frozen: type: Bool default: True - desc: If true, then pinned tabs cannot have their URL changed. + desc: Force pinned tabs to stay at fixed URL. tabs.wrap: default: true From 8a48e5d2a5357d84e31f8d14b748dd7b94fe44ff Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Mon, 8 Oct 2018 23:28:36 -0700 Subject: [PATCH 383/492] Add benchmark for config cache --- tests/unit/config/test_configcache.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/unit/config/test_configcache.py b/tests/unit/config/test_configcache.py index 91e2f22fa..7c0f6012f 100644 --- a/tests/unit/config/test_configcache.py +++ b/tests/unit/config/test_configcache.py @@ -50,3 +50,17 @@ def test_configcache_get_after_set(config_stub): assert not config.cache['auto_save.session'] config_stub.val.auto_save.session = True assert config.cache['auto_save.session'] + + +def test_configcache_naive_benchmark(config_stub, benchmark): + def _run_bench(): + for _i in range(10000): + # pylint: disable=pointless-statement + config.cache['tabs.padding'] + config.cache['tabs.indicator.width'] + config.cache['tabs.indicator.padding'] + config.cache['tabs.min_width'] + config.cache['tabs.max_width'] + config.cache['tabs.pinned.shrink'] + # pylint: enable=pointless-statement + benchmark(_run_bench) From 8bb2db5e56fb1553287bb1eb07f49f37438c8562 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Mon, 8 Oct 2018 23:31:07 -0700 Subject: [PATCH 384/492] Restructure cache to optimize critical path --- qutebrowser/config/configcache.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qutebrowser/config/configcache.py b/qutebrowser/config/configcache.py index a421ba85c..15f343478 100644 --- a/qutebrowser/config/configcache.py +++ b/qutebrowser/config/configcache.py @@ -46,7 +46,9 @@ class ConfigCache: self._cache[attr] = config.instance.get(attr) def __getitem__(self, attr: str) -> typing.Any: - if attr not in self._cache: + try: + return self._cache[attr] + except KeyError: assert not config.instance.get_opt(attr).supports_pattern self._cache[attr] = config.instance.get(attr) - return self._cache[attr] + return self._cache[attr] From 2c1d039c9e56ac3b643d11630c58a5085af86dd4 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 11 Jan 2019 11:21:17 +0100 Subject: [PATCH 385/492] Refactor tests for bool setting migrations --- tests/unit/config/test_configfiles.py | 36 +++++++++------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/tests/unit/config/test_configfiles.py b/tests/unit/config/test_configfiles.py index 2b793b58b..cba7a4a7f 100644 --- a/tests/unit/config/test_configfiles.py +++ b/tests/unit/config/test_configfiles.py @@ -250,36 +250,24 @@ class TestYaml: data = autoconfig.read() assert data['content.webrtc_ip_handling_policy']['global'] == expected - @pytest.mark.parametrize('show, expected', [ - (True, 'always'), - (False, 'never'), - ('always', 'always'), - ('never', 'never'), - ('pinned', 'pinned'), + @pytest.mark.parametrize('setting, old, new', [ + ('tabs.favicons.show', True, 'always'), + ('tabs.favicons.show', False, 'never'), + ('tabs.favicons.show', 'always', 'always'), + + ('qt.force_software_rendering', True, 'software-opengl'), + ('qt.force_software_rendering', False, 'none'), + ('qt.force_software_rendering', 'chromium', 'chromium'), ]) - def test_tabs_favicons_show(self, yaml, autoconfig, show, expected): - """Tests for migration of tabs.favicons.show.""" - autoconfig.write({'tabs.favicons.show': {'global': show}}) + def test_bool_migrations(self, yaml, autoconfig, setting, old, new): + """Tests for migration of former boolean settings.""" + autoconfig.write({setting: {'global': old}}) yaml.load() yaml._save() data = autoconfig.read() - assert data['tabs.favicons.show']['global'] == expected - - @pytest.mark.parametrize('force, expected', [ - (True, 'software-opengl'), - (False, 'none'), - ('chromium', 'chromium'), - ]) - def test_force_software_rendering(self, yaml, autoconfig, force, expected): - autoconfig.write({'qt.force_software_rendering': {'global': force}}) - - yaml.load() - yaml._save() - - data = autoconfig.read() - assert data['qt.force_software_rendering']['global'] == expected + assert data[setting]['global'] == new def test_renamed_key_unknown_target(self, monkeypatch, yaml, autoconfig): From cc0f5fc6d400e12833ba729049e31d16cf836d53 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 11 Jan 2019 11:23:58 +0100 Subject: [PATCH 386/492] Fix migration of scrolling.bar --- doc/changelog.asciidoc | 2 ++ qutebrowser/config/configfiles.py | 2 +- tests/unit/config/test_configfiles.py | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 514261953..acf02f951 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -70,6 +70,8 @@ Fixed - `:navigate` not incrementing in anchors or queries or anchors. - Crash when trying to use a proxy requiring authentication with QtWebKit. - Slashes in search terms are now percent-escaped. +- When `scrolling.bar = True` was set in versions before v1.5.0, this now + correctly gets migrated to `always` instead of `when-searching`. v1.5.2 ------ diff --git a/qutebrowser/config/configfiles.py b/qutebrowser/config/configfiles.py index 54ca91488..de50dfca9 100644 --- a/qutebrowser/config/configfiles.py +++ b/qutebrowser/config/configfiles.py @@ -308,7 +308,7 @@ class YamlConfig(QObject): self._migrate_bool(settings, 'tabs.favicons.show', 'always', 'never') self._migrate_bool(settings, 'scrolling.bar', - 'when-searching', 'never') + 'always', 'when-searching') self._migrate_bool(settings, 'qt.force_software_rendering', 'software-opengl', 'none') diff --git a/tests/unit/config/test_configfiles.py b/tests/unit/config/test_configfiles.py index cba7a4a7f..79d4b9d89 100644 --- a/tests/unit/config/test_configfiles.py +++ b/tests/unit/config/test_configfiles.py @@ -255,6 +255,10 @@ class TestYaml: ('tabs.favicons.show', False, 'never'), ('tabs.favicons.show', 'always', 'always'), + ('scrolling.bar', True, 'always'), + ('scrolling.bar', False, 'when-searching'), + ('scrolling.bar', 'always', 'always'), + ('qt.force_software_rendering', True, 'software-opengl'), ('qt.force_software_rendering', False, 'none'), ('qt.force_software_rendering', 'chromium', 'chromium'), From 322b4d26d8b650340550871d0a1e5e75f817c63a Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Sat, 12 Jan 2019 10:10:05 -0800 Subject: [PATCH 387/492] Fix match highlighting on qt 5.11.3 and 5.12.1+ For some reason, populating the text (even if we completely overwrite it later) before the highlighter is added results in no highlighting. I think this has something to do with python locking/delayed re-highlighting. At some point, it would be nice to file this as a bug, but I can't seem to make a small c++ example. See https://codereview.qt-project.org/#/c/244699/4//ALL and https://bugreports.qt.io/browse/QTBUG-71307 for more information. Closes #4519 --- qutebrowser/completion/completiondelegate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/completion/completiondelegate.py b/qutebrowser/completion/completiondelegate.py index 3ed5f0a64..b58f36372 100644 --- a/qutebrowser/completion/completiondelegate.py +++ b/qutebrowser/completion/completiondelegate.py @@ -212,11 +212,11 @@ class CompletionItemDelegate(QStyledItemDelegate): view = self.parent() pattern = view.pattern columns_to_filter = index.model().columns_to_filter(index) - self._doc.setPlainText(self._opt.text) if index.column() in columns_to_filter and pattern: pat = re.escape(pattern).replace(r'\ ', r'|') _Highlighter(self._doc, pat, config.val.colors.completion.match.fg) + self._doc.setPlainText(self._opt.text) else: self._doc.setHtml( '{}'.format( From d2bac602c22804cede55508076c2c85e4680796a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 13 Jan 2019 10:36:02 +0100 Subject: [PATCH 388/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index acf02f951..ea04a8262 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -72,6 +72,7 @@ Fixed - Slashes in search terms are now percent-escaped. - When `scrolling.bar = True` was set in versions before v1.5.0, this now correctly gets migrated to `always` instead of `when-searching`. +- Completion highlighting now works again on Qt 5.11.3 and 5.12.1. v1.5.2 ------ From d8c02f495e0da39d1a11c340f6dc23281988f255 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 13 Jan 2019 10:36:14 +0100 Subject: [PATCH 389/492] Add highlighting test --- .../completion/test_completiondelegate.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/tests/unit/completion/test_completiondelegate.py b/tests/unit/completion/test_completiondelegate.py index 2d122927d..7d310380e 100644 --- a/tests/unit/completion/test_completiondelegate.py +++ b/tests/unit/completion/test_completiondelegate.py @@ -20,7 +20,8 @@ from unittest import mock import pytest from PyQt5.QtCore import Qt -from PyQt5.QtGui import QTextDocument +from PyQt5.QtGui import QTextDocument, QColor +from PyQt5.QtWidgets import QTextEdit from qutebrowser.completion import completiondelegate @@ -50,3 +51,24 @@ def test_highlight(pat, txt, segments): highlighter.setFormat.assert_has_calls([ mock.call(s[0], s[1], mock.ANY) for s in segments ]) + + +def test_highlighted(qtbot): + """Make sure highlighting works. + + Note that with Qt 5.11.3 and > 5.12.1 we need to call setPlainText *after* + creating the highlighter for highlighting to work. Ideally, we'd test + whether CompletionItemDelegate._get_textdoc() works properly, but testing + that is kind of hard, so we just test it in isolation here. + """ + doc = QTextDocument() + completiondelegate._Highlighter(doc, 'Hello', Qt.red) + doc.setPlainText('Hello World') + + # Needed so the highlighting actually works. + edit = QTextEdit() + qtbot.addWidget(edit) + edit.setDocument(doc) + + colors = [f.foreground().color() for f in doc.allFormats()] + assert QColor('red') in colors From 3fc545381cbd9a6db69c373bcc9e1aa792699f62 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 13 Jan 2019 10:38:05 +0100 Subject: [PATCH 390/492] Ignore new Qt warning --- pytest.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/pytest.ini b/pytest.ini index c907173e0..c278b0591 100644 --- a/pytest.ini +++ b/pytest.ini @@ -64,6 +64,7 @@ qt_log_ignore = ^QSettings::value: Empty key passed ^Icon theme ".*" not found ^Error receiving trust for a CA certificate + ^QBackingStore::endPaint\(\) called with active painter on backingstore paint device xfail_strict = true filterwarnings = error From 5790857b95e47e6678d1cfe2607104590d98a040 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 13 Jan 2019 10:40:27 +0100 Subject: [PATCH 391/492] Make shellcheck happy --- misc/userscripts/password_fill | 2 ++ 1 file changed, 2 insertions(+) diff --git a/misc/userscripts/password_fill b/misc/userscripts/password_fill index 2e4f01b66..7d4be0467 100755 --- a/misc/userscripts/password_fill +++ b/misc/userscripts/password_fill @@ -64,6 +64,7 @@ die() { javascript_escape() { # print the first argument in an escaped way, such that it can safely # be used within javascripts double quotes + # shellcheck disable=SC2001 sed "s,[\\\\'\"],\\\\&,g" <<< "$1" } @@ -111,6 +112,7 @@ simplify_url() { # are found: no_entries_found() { while [ 0 -eq "${#files[@]}" ] && [ -n "$simple_url" ]; do + # shellcheck disable=SC2001 shorter_simple_url=$(sed 's,^[^.]*\.,,' <<< "$simple_url") if [ "$shorter_simple_url" = "$simple_url" ] ; then # if no dot, then even remove the top level domain From 9d05f412d725e16e46fb36287622d5038649be36 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 13 Jan 2019 11:49:02 +0100 Subject: [PATCH 392/492] Update docs --- doc/help/settings.asciidoc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index 7da6e543e..eb3907cce 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -261,6 +261,7 @@ |<>|Stack related tabs on top of each other when opened consecutively. |<>|Position of new tabs which are not opened from another tab. |<>|Padding (in pixels) around text for tabs. +|<>|Force pinned tabs to stay at fixed URL. |<>|Shrink pinned tabs down to their contents. |<>|Position of the tab bar. |<>|Which tab to select when the focused tab is removed. @@ -3307,6 +3308,14 @@ Default: - +pass:[right]+: +pass:[5]+ - +pass:[top]+: +pass:[0]+ +[[tabs.pinned.frozen]] +=== tabs.pinned.frozen +Force pinned tabs to stay at fixed URL. + +Type: <> + +Default: +pass:[true]+ + [[tabs.pinned.shrink]] === tabs.pinned.shrink Shrink pinned tabs down to their contents. From 824bf8d5b6b1ee2dfbd61963f62c1a898d11a4fe Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 13 Jan 2019 11:50:20 +0100 Subject: [PATCH 393/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index ea04a8262..ceab9d043 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -25,6 +25,7 @@ Added opened from a page should stack on each other or not. - New `completion.open_categories` setting which allows to configure which categories are shown in the `:open` completion, and how they are ordered. +- New `tabs.pinned.frozen` setting to allow/deny navigating in pinned tabs. - New config manipulation commands: * `:config-dict-add` and `:config-list-add` to a new element to a dict/list setting. From 18f0034f3cb78d901475d71e46a8f5e4d8efd76a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 13 Jan 2019 13:35:50 +0100 Subject: [PATCH 394/492] travis: Disable notifications Looks like Notifico takes care of that, too. --- .travis.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 663c4c6f9..dfa566671 100644 --- a/.travis.yml +++ b/.travis.yml @@ -68,16 +68,3 @@ after_success: after_failure: - bash scripts/dev/ci/travis_backtrace.sh - -notifications: - webhooks: - - https://buildtimetrend.herokuapp.com/travis - irc: - channels: - - "chat.freenode.net#qutebrowser-dev" - on_success: always - on_failure: always - skip_join: true - template: - - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}" - - "%{compare_url} - %{build_url}" From b4d8e3ff5dbdc12abac91eaf8e6f99ead9de91d8 Mon Sep 17 00:00:00 2001 From: Nat West Date: Mon, 14 Jan 2019 01:10:12 +0000 Subject: [PATCH 395/492] Update qutebrowser.org/doc/faq.html question 'What's the difference between insert and passthrough mode?' to reflect escape->shift+escape keybinding change --- doc/faq.asciidoc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/faq.asciidoc b/doc/faq.asciidoc index 113a11f09..10661cb9e 100644 --- a/doc/faq.asciidoc +++ b/doc/faq.asciidoc @@ -211,9 +211,10 @@ Why does J move to the next (right) tab, and K to the previous (left) one?:: What's the difference between insert and passthrough mode?:: They are quite similar, but insert mode has some bindings (like `Ctrl-e` to - open an editor) while passthrough mode only has escape bound. It might also - be useful to rebind escape to something else in passthrough mode only, to be - able to send an escape keypress to the website. + open an editor) while passthrough mode only has shift+escape bound. This is + because shift+escape is unlikely to be a useful binding to be passed to a + webpage. However, any other keys may be assigned to leaving passthrough mode + instead of shift+escape should this be desired. Why does it take longer to open a URL in qutebrowser than in chromium?:: When opening a URL in an existing instance, the normal qutebrowser From 1799b7926a0202497a88e4ee1fdb232f06ab8e3a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 14 Jan 2019 22:22:56 +0100 Subject: [PATCH 396/492] Make console available in PAC files --- doc/changelog.asciidoc | 1 + qutebrowser/browser/network/pac.py | 2 ++ tests/unit/browser/webkit/network/test_pac.py | 14 ++++++++++++++ 3 files changed, 17 insertions(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index ceab9d043..a116b53e6 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -54,6 +54,7 @@ Changed - Various small performance improvements for hints and the completion. - The Wayland check for QtWebEngine is now disabled on Qt >= 5.11.2, as those versions should work without any issues. +- The JavaScript `console` object is now available in PAC files. Fixed ~~~~~ diff --git a/qutebrowser/browser/network/pac.py b/qutebrowser/browser/network/pac.py index 1c6075945..bd060820b 100644 --- a/qutebrowser/browser/network/pac.py +++ b/qutebrowser/browser/network/pac.py @@ -180,6 +180,8 @@ class PACResolver: """ self._engine = QJSEngine() + self._engine.installExtensions(QJSEngine.ConsoleExtension) + self._ctx = _PACContext(self._engine) self._engine.globalObject().setProperty( "PAC", self._engine.newQObject(self._ctx)) diff --git a/tests/unit/browser/webkit/network/test_pac.py b/tests/unit/browser/webkit/network/test_pac.py index 8c03c6cee..5aebecbf2 100644 --- a/tests/unit/browser/webkit/network/test_pac.py +++ b/tests/unit/browser/webkit/network/test_pac.py @@ -205,6 +205,20 @@ def test_secret_url(url, has_secret, from_file): res.resolve(QNetworkProxyQuery(QUrl(url)), from_file=from_file) +def test_logging(qtlog): + """Make sure console.log() works for PAC files.""" + test_str = """ + function FindProxyForURL(domain, host) { + console.log("logging test"); + return "DIRECT"; + } + """ + res = pac.PACResolver(test_str) + res.resolve(QNetworkProxyQuery(QUrl("https://example.com/test"))) + assert len(qtlog.records) == 1 + assert qtlog.records[0].message == 'logging test' + + def fetcher_test(test_str): class PACHandler(http.server.BaseHTTPRequestHandler): def do_GET(self): From 7f518d0ce6cefd48e26b872ed16ad0eb8eca1438 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Wed, 16 Jan 2019 02:49:30 +0100 Subject: [PATCH 397/492] doc: link CVE [ci skip] --- doc/changelog.asciidoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 03d3e75b7..803374b50 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -362,11 +362,11 @@ v1.3.3 Security ~~~~~~~~ -- An XSS vulnerability on the `qute://history` page allowed websites to inject - HTML into the page via a crafted title tag. This could allow them to steal - your browsing history. If you're currently unable to upgrade, avoid using - `:history`. A CVE request for this issue is pending, see - https://github.com/qutebrowser/qutebrowser/issues/4011[#4011] for updates. +- CVE-2018-1000559: An XSS vulnerability on the `qute://history` page allowed + websites to inject HTML into the page via a crafted title tag. This could + allow them to steal your browsing history. If you're currently unable to + upgrade, avoid using `:history`. See the related GitHub issue for details: + https://github.com/qutebrowser/qutebrowser/issues/4011. Fixed ~~~~~ From b415edaf62680facec826b4457f8318392de9125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20M=2E=20P=C3=B6pperl?= Date: Sun, 20 Jan 2019 19:52:38 +0100 Subject: [PATCH 398/492] Rename appdata.xml to reflect id string This helps for Flatpak packaging. See also 30f7f7b --- MANIFEST.in | 2 +- misc/Makefile | 4 ++-- ...er.appdata.xml => org.qutebrowser.qutebrowser.appdata.xml} | 0 3 files changed, 3 insertions(+), 3 deletions(-) rename misc/{qutebrowser.appdata.xml => org.qutebrowser.qutebrowser.appdata.xml} (100%) diff --git a/MANIFEST.in b/MANIFEST.in index cd9e50cf9..a0e61c30e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -13,7 +13,7 @@ include qutebrowser/utils/testfile include qutebrowser/git-commit-id include LICENSE doc/* README.asciidoc include misc/qutebrowser.desktop -include misc/qutebrowser.appdata.xml +include misc/org.qutebrowser.qutebrowser.appdata.xml include misc/Makefile include requirements.txt include tox.ini diff --git a/misc/Makefile b/misc/Makefile index 4625b288e..526f7adce 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -17,8 +17,8 @@ doc/qutebrowser.1.html: install: doc/qutebrowser.1.html $(PYTHON) setup.py install --prefix="$(PREFIX)" --optimize=1 $(SETUPTOOLSOPTS) - install -Dm644 misc/qutebrowser.appdata.xml \ - "$(DESTDIR)$(DATADIR)/metainfo/qutebrowser.appdata.xml" + install -Dm644 misc/org.qutebrowser.qutebrowser.appdata.xml \ + "$(DESTDIR)$(DATADIR)/metainfo/org.qutebrowser.qutebrowser.appdata.xml" install -Dm644 doc/qutebrowser.1 \ "$(DESTDIR)$(MANDIR)/man1/qutebrowser.1" install -Dm644 misc/qutebrowser.desktop \ diff --git a/misc/qutebrowser.appdata.xml b/misc/org.qutebrowser.qutebrowser.appdata.xml similarity index 100% rename from misc/qutebrowser.appdata.xml rename to misc/org.qutebrowser.qutebrowser.appdata.xml From 61d1cd3f5544989c639f72a429402283a49b2b58 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Sun, 27 Jan 2019 12:21:36 -0800 Subject: [PATCH 399/492] Update changelog We may want to consider changing the desktop filename at some point as well to comply with https://www.freedesktop.org/software/appstream/docs/chap-Quickstart.html --- doc/changelog.asciidoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index a116b53e6..338625936 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -55,6 +55,8 @@ Changed - The Wayland check for QtWebEngine is now disabled on Qt >= 5.11.2, as those versions should work without any issues. - The JavaScript `console` object is now available in PAC files. +- The metainfo file `qutebrowser.appdata.xml` is now renamed to + `org.qutebrowser.qutebrowser.appdata.xml`. Fixed ~~~~~ From 8ad7184ca1d67a06b19edef43638581e330badb1 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Sun, 27 Jan 2019 12:44:27 -0800 Subject: [PATCH 400/492] Update changelog --- doc/changelog.asciidoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 338625936..6b2bc1d71 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -57,6 +57,8 @@ Changed - The JavaScript `console` object is now available in PAC files. - The metainfo file `qutebrowser.appdata.xml` is now renamed to `org.qutebrowser.qutebrowser.appdata.xml`. +- The `qute-pass` userscript now understands domains in gpg filenames + in addition to directory names. Fixed ~~~~~ @@ -71,7 +73,7 @@ Fixed `content.cookies.accept = no-3rdparty` from working properly on some pages like GMail. However, the default for `content.cookies.accept` is still `all` to be in line with what other browsers do. -- `:navigate` not incrementing in anchors or queries or anchors. +- `:navigate` not incrementing in anchors or queries. - Crash when trying to use a proxy requiring authentication with QtWebKit. - Slashes in search terms are now percent-escaped. - When `scrolling.bar = True` was set in versions before v1.5.0, this now From a343f9df286651eba9b16d7e72d7550adc48597c Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Fri, 1 Feb 2019 23:03:44 -0800 Subject: [PATCH 401/492] Fix issues with tests --- tests/end2end/features/misc.feature | 6 +++--- tests/unit/browser/test_shared.py | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/end2end/features/misc.feature b/tests/end2end/features/misc.feature index 83d5f4731..48273bdf8 100644 --- a/tests/end2end/features/misc.feature +++ b/tests/end2end/features/misc.feature @@ -330,17 +330,17 @@ Feature: Various utility commands. Scenario: DNT header When I set content.headers.do_not_track to true And I open headers - Then the header DNT should be set to 1 + Then the header Dnt should be set to 1 Scenario: DNT header (off) When I set content.headers.do_not_track to false And I open headers - Then the header DNT should be set to 0 + Then the header Dnt should be set to 0 Scenario: DNT header (unset) When I set content.headers.do_not_track to And I open headers - Then the header DNT should be set to + Then the header Dnt should be set to Scenario: Accept-Language header When I set content.headers.accept_language to en,de diff --git a/tests/unit/browser/test_shared.py b/tests/unit/browser/test_shared.py index fe57e8e6a..b8da41a02 100644 --- a/tests/unit/browser/test_shared.py +++ b/tests/unit/browser/test_shared.py @@ -30,11 +30,9 @@ from qutebrowser.browser import shared (False, None, {}, {b'DNT': b'0'}), (None, None, {}, {}), # Accept-Language - (False, 'de, en', {}, {b'DNT': b'0', - b'Accept-Language': b'de, en'}), + (False, 'de, en', {}, {b'DNT': b'0', b'Accept-Language': b'de, en'}), # Custom headers - (False, None, {'X-Qute': 'yes'}, {b'DNT': b'0', - b'X-Qute': b'yes'}), + (False, None, {'X-Qute': 'yes'}, {b'DNT': b'0', b'X-Qute': b'yes'}), # Mixed (False, 'de, en', {'X-Qute': 'yes'}, {b'DNT': b'0', b'Accept-Language': b'de, en', From 1b3b6155ecf98c219d3a54fd05442731d90e030f Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Sun, 10 Feb 2019 13:12:25 -0800 Subject: [PATCH 402/492] Add setting for DnsPrefetchEnabled --- qutebrowser/browser/webengine/webenginesettings.py | 7 ++++++- qutebrowser/config/configdata.py | 1 + qutebrowser/config/configdata.yml | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginesettings.py b/qutebrowser/browser/webengine/webenginesettings.py index 10c4d4e6b..379051f6b 100644 --- a/qutebrowser/browser/webengine/webenginesettings.py +++ b/qutebrowser/browser/webengine/webenginesettings.py @@ -25,6 +25,7 @@ Module attributes: """ import os +import operator from PyQt5.QtGui import QFont from PyQt5.QtWebEngineWidgets import (QWebEngineSettings, QWebEngineProfile, @@ -165,7 +166,11 @@ class WebEngineSettings(websettings.AbstractSettings): ('PrintElementBackgrounds', None), # Qt 5.11 'content.autoplay': - ('PlaybackRequiresUserGesture', lambda val: not val), + ('PlaybackRequiresUserGesture', operator.not_), + + # Qt 5.12 + 'content.dns_prefetch': + ('DnsPrefetchEnabled', None), } for name, (attribute, converter) in new_attributes.items(): try: diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index 61e35fd53..208bf8b2d 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -164,6 +164,7 @@ def _parse_yaml_backends_dict( 'Qt 5.9.2': qtutils.version_check('5.9.2'), 'Qt 5.10': qtutils.version_check('5.10'), 'Qt 5.11': qtutils.version_check('5.11'), + 'Qt 5.12': qtutils.version_check('5.12'), } for key in sorted(node.keys()): if conditionals[node[key]]: diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index b6d4736ae..514d30263 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -379,7 +379,9 @@ content.developer_extras: content.dns_prefetch: default: true type: Bool - backend: QtWebKit + backend: + QtWebKit: true + QtWebEngine: Qt 5.12 supports_pattern: true desc: Try to pre-fetch DNS entries to speed up browsing. From 7a34a03153cf09d1628c1b4328ce1d757f89dc21 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:15 +0100 Subject: [PATCH 403/492] Update flake8 from 3.6.0 to 3.7.5 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index 42255f825..492688e5a 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py attrs==18.2.0 -flake8==3.6.0 +flake8==3.7.5 flake8-bugbear==18.8.0 flake8-builtins==1.4.1 flake8-comprehensions==1.4.1 From 8e486dca16a358920e2eeb980aa4fcdcb6aa6f13 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:17 +0100 Subject: [PATCH 404/492] Update flake8-comprehensions from 1.4.1 to 2.0.0 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index 492688e5a..acc49124c 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -4,7 +4,7 @@ attrs==18.2.0 flake8==3.7.5 flake8-bugbear==18.8.0 flake8-builtins==1.4.1 -flake8-comprehensions==1.4.1 +flake8-comprehensions==2.0.0 flake8-copyright==0.2.2 flake8-debugger==3.1.0 flake8-deprecated==1.3 From 2472b4a7d7e100c8da3224c2d3d608093d049fe7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:18 +0100 Subject: [PATCH 405/492] Update flake8-per-file-ignores from 0.7 to 0.8.1 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index acc49124c..df997357f 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -11,7 +11,7 @@ flake8-deprecated==1.3 flake8-docstrings==1.3.0 flake8-future-import==0.4.5 flake8-mock==0.3 -flake8-per-file-ignores==0.7 +flake8-per-file-ignores==0.8.1 flake8-polyfill==1.0.2 flake8-string-format==0.2.3 flake8-tidy-imports==1.1.0 From 3f10c664dd77bc4613c9f561d801a8a8eecb647d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:20 +0100 Subject: [PATCH 406/492] Update flake8-tidy-imports from 1.1.0 to 2.0.0 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index df997357f..64aa0cb77 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -14,7 +14,7 @@ flake8-mock==0.3 flake8-per-file-ignores==0.8.1 flake8-polyfill==1.0.2 flake8-string-format==0.2.3 -flake8-tidy-imports==1.1.0 +flake8-tidy-imports==2.0.0 flake8-tuple==0.2.13 mccabe==0.6.1 pathmatch==0.2.1 From f41be46104c327eea2c10582eed9e83efe14ea7e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:21 +0100 Subject: [PATCH 407/492] Update pep8-naming from 0.7.0 to 0.8.2 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index 64aa0cb77..e7ebd8daa 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -18,7 +18,7 @@ flake8-tidy-imports==2.0.0 flake8-tuple==0.2.13 mccabe==0.6.1 pathmatch==0.2.1 -pep8-naming==0.7.0 +pep8-naming==0.8.2 pycodestyle==2.4.0 pydocstyle==3.0.0 pyflakes==2.0.0 From e980dd7ea0da7b471bd43cfe40373426f0d82bf4 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:23 +0100 Subject: [PATCH 408/492] Update pycodestyle from 2.4.0 to 2.5.0 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index e7ebd8daa..d1fff2eee 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -19,7 +19,7 @@ flake8-tuple==0.2.13 mccabe==0.6.1 pathmatch==0.2.1 pep8-naming==0.8.2 -pycodestyle==2.4.0 +pycodestyle==2.5.0 pydocstyle==3.0.0 pyflakes==2.0.0 six==1.12.0 From 10c0f3d9866aa5e9cf7b3db5ab6d58d986a43a2b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:24 +0100 Subject: [PATCH 409/492] Update pyflakes from 2.0.0 to 2.1.0 --- misc/requirements/requirements-flake8.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index d1fff2eee..a3606430d 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -21,7 +21,7 @@ pathmatch==0.2.1 pep8-naming==0.8.2 pycodestyle==2.5.0 pydocstyle==3.0.0 -pyflakes==2.0.0 +pyflakes==2.1.0 six==1.12.0 snowballstemmer==1.2.1 typing==3.6.6 From fed127d7a76a8971c32b6286cc55fbc54a1a194a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:26 +0100 Subject: [PATCH 410/492] Update mypy from 0.650 to 0.670 --- misc/requirements/requirements-mypy.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt index 6b8c63e97..fe8f55f46 100644 --- a/misc/requirements/requirements-mypy.txt +++ b/misc/requirements/requirements-mypy.txt @@ -1,6 +1,6 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py -mypy==0.650 +mypy==0.670 mypy-extensions==0.4.1 PyQt5==5.11.3 PyQt5-sip==4.19.13 From 61b2551e46f527841d9d4df7e8230297875ea5cf Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:28 +0100 Subject: [PATCH 411/492] Update pyqt5 from 5.11.3 to 5.12 --- misc/requirements/requirements-mypy.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt index fe8f55f46..4e47aa081 100644 --- a/misc/requirements/requirements-mypy.txt +++ b/misc/requirements/requirements-mypy.txt @@ -2,7 +2,7 @@ mypy==0.670 mypy-extensions==0.4.1 -PyQt5==5.11.3 +PyQt5==5.12 PyQt5-sip==4.19.13 -e git+https://github.com/qutebrowser/PyQt5-stubs.git@wip#egg=PyQt5_stubs typed-ast==1.1.1 From b3c5cbbd12396ac22b07bece5437918c7d991926 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:29 +0100 Subject: [PATCH 412/492] Update pyqt5 from 5.11.3 to 5.12 --- misc/requirements/requirements-pyqt.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pyqt.txt b/misc/requirements/requirements-pyqt.txt index 32aee87a9..539b101ba 100644 --- a/misc/requirements/requirements-pyqt.txt +++ b/misc/requirements/requirements-pyqt.txt @@ -1,4 +1,4 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py -PyQt5==5.11.3 +PyQt5==5.12 PyQt5-sip==4.19.13 From 22b2e8c539c111578f7b12acd52601ec6a4df9be Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:31 +0100 Subject: [PATCH 413/492] Update typed-ast from 1.1.1 to 1.3.1 --- misc/requirements/requirements-mypy.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt index 4e47aa081..fb0d12382 100644 --- a/misc/requirements/requirements-mypy.txt +++ b/misc/requirements/requirements-mypy.txt @@ -5,4 +5,4 @@ mypy-extensions==0.4.1 PyQt5==5.12 PyQt5-sip==4.19.13 -e git+https://github.com/qutebrowser/PyQt5-stubs.git@wip#egg=PyQt5_stubs -typed-ast==1.1.1 +typed-ast==1.3.1 From 4fca20bcec2bf9c14649d8bc1c23df5183f82fb7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:33 +0100 Subject: [PATCH 414/492] Update hunter from 2.1.0 to 2.2.1 --- misc/requirements/requirements-optional.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-optional.txt b/misc/requirements/requirements-optional.txt index aafa38e46..e0b5f0609 100644 --- a/misc/requirements/requirements-optional.txt +++ b/misc/requirements/requirements-optional.txt @@ -2,6 +2,6 @@ colorama==0.4.1 cssutils==1.0.2 -hunter==2.1.0 +hunter==2.2.1 Pympler==0.6 six==1.12.0 From 1dca42b1bd17ccce70589fc4d194b03e182190e9 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:34 +0100 Subject: [PATCH 415/492] Update hunter from 2.1.0 to 2.2.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 228045f8c..1fc1ab256 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -11,7 +11,7 @@ coverage==4.5.2 EasyProcess==0.2.5 Flask==1.0.2 glob2==0.6 -hunter==2.1.0 +hunter==2.2.1 hypothesis==3.85.2 itsdangerous==1.1.0 # Jinja2==2.10 From 14955a46a3b91f2cb5d5bb387f71777a0889601a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:36 +0100 Subject: [PATCH 416/492] Update packaging from 18.0 to 19.0 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index f15a3a3e1..a5faa61d4 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py appdirs==1.4.3 -packaging==18.0 +packaging==19.0 pyparsing==2.3.0 setuptools==40.6.3 six==1.12.0 From 7abc4e9804d4c46c46e3797c8b48f9f6f67475d7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:38 +0100 Subject: [PATCH 417/492] Update packaging from 18.0 to 19.0 --- misc/requirements/requirements-sphinx.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-sphinx.txt b/misc/requirements/requirements-sphinx.txt index c089895d1..1c22ae343 100644 --- a/misc/requirements/requirements-sphinx.txt +++ b/misc/requirements/requirements-sphinx.txt @@ -9,7 +9,7 @@ idna==2.8 imagesize==1.1.0 Jinja2==2.10 MarkupSafe==1.1.0 -packaging==18.0 +packaging==19.0 Pygments==2.3.1 pyparsing==2.3.0 pytz==2018.7 From 2774b6335515571c230d5bcc9d1766c63189478c Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:39 +0100 Subject: [PATCH 418/492] Update pyparsing from 2.3.0 to 2.3.1 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index a5faa61d4..6b5dc8e21 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -2,7 +2,7 @@ appdirs==1.4.3 packaging==19.0 -pyparsing==2.3.0 +pyparsing==2.3.1 setuptools==40.6.3 six==1.12.0 wheel==0.32.3 From 9caa43aba28f285e8232e91cb57fc6d9dfeaff87 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:41 +0100 Subject: [PATCH 419/492] Update pyparsing from 2.3.0 to 2.3.1 --- misc/requirements/requirements-sphinx.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-sphinx.txt b/misc/requirements/requirements-sphinx.txt index 1c22ae343..84029ab8b 100644 --- a/misc/requirements/requirements-sphinx.txt +++ b/misc/requirements/requirements-sphinx.txt @@ -11,7 +11,7 @@ Jinja2==2.10 MarkupSafe==1.1.0 packaging==19.0 Pygments==2.3.1 -pyparsing==2.3.0 +pyparsing==2.3.1 pytz==2018.7 requests==2.21.0 six==1.12.0 From 8bf4a9a93e43fd1fb93096f5bb767a0dfd4c10f1 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:42 +0100 Subject: [PATCH 420/492] Update setuptools from 40.6.3 to 40.8.0 --- misc/requirements/requirements-pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pip.txt b/misc/requirements/requirements-pip.txt index 6b5dc8e21..909fcc8c6 100644 --- a/misc/requirements/requirements-pip.txt +++ b/misc/requirements/requirements-pip.txt @@ -3,6 +3,6 @@ appdirs==1.4.3 packaging==19.0 pyparsing==2.3.1 -setuptools==40.6.3 +setuptools==40.8.0 six==1.12.0 wheel==0.32.3 From 75e6575233720732582944b34b9c433ac1b595f5 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:44 +0100 Subject: [PATCH 421/492] Update cryptography from 2.4.2 to 2.5 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index b3ecdaf70..7ff3a3cd8 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -5,7 +5,7 @@ astroid==2.1.0 certifi==2018.11.29 cffi==1.11.5 chardet==3.0.4 -cryptography==2.4.2 +cryptography==2.5 github3.py==1.2.0 idna==2.8 isort==4.3.4 From 6a51244cb094f57973cf2229087d4ec1fdc580a3 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:46 +0100 Subject: [PATCH 422/492] Update github3.py from 1.2.0 to 1.3.0 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 7ff3a3cd8..6e4114eb3 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -6,7 +6,7 @@ certifi==2018.11.29 cffi==1.11.5 chardet==3.0.4 cryptography==2.5 -github3.py==1.2.0 +github3.py==1.3.0 idna==2.8 isort==4.3.4 jwcrypto==0.6.0 From 14a6c1f2e42d57e6bb848fb0993b7953a442053f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:48 +0100 Subject: [PATCH 423/492] Update python-dateutil from 2.7.5 to 2.8.0 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 6e4114eb3..0fc83d6a8 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -14,7 +14,7 @@ lazy-object-proxy==1.3.1 mccabe==0.6.1 pycparser==2.19 pylint==2.2.2 -python-dateutil==2.7.5 +python-dateutil==2.8.0 ./scripts/dev/pylint_checkers requests==2.21.0 six==1.12.0 From b434498a6c5a7aa0d1557f5edbf20eadce668ff9 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:49 +0100 Subject: [PATCH 424/492] Update wrapt from 1.10.11 to 1.11.1 --- misc/requirements/requirements-pylint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt index 0fc83d6a8..3c0c51e60 100644 --- a/misc/requirements/requirements-pylint.txt +++ b/misc/requirements/requirements-pylint.txt @@ -20,4 +20,4 @@ requests==2.21.0 six==1.12.0 uritemplate==3.0.0 urllib3==1.24.1 -wrapt==1.10.11 +wrapt==1.11.1 From d3c86561e21eca15af4c6992850154f95a699097 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:51 +0100 Subject: [PATCH 425/492] Update pytz from 2018.7 to 2018.9 --- misc/requirements/requirements-sphinx.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-sphinx.txt b/misc/requirements/requirements-sphinx.txt index 84029ab8b..fa9e595f3 100644 --- a/misc/requirements/requirements-sphinx.txt +++ b/misc/requirements/requirements-sphinx.txt @@ -12,7 +12,7 @@ MarkupSafe==1.1.0 packaging==19.0 Pygments==2.3.1 pyparsing==2.3.1 -pytz==2018.7 +pytz==2018.9 requests==2.21.0 six==1.12.0 snowballstemmer==1.2.1 From 788ca3fc15d27d0c955a08f9b8babfd5091691fa Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:52 +0100 Subject: [PATCH 426/492] Update sphinx from 1.8.3 to 1.8.4 --- misc/requirements/requirements-sphinx.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-sphinx.txt b/misc/requirements/requirements-sphinx.txt index fa9e595f3..14c247043 100644 --- a/misc/requirements/requirements-sphinx.txt +++ b/misc/requirements/requirements-sphinx.txt @@ -16,6 +16,6 @@ pytz==2018.9 requests==2.21.0 six==1.12.0 snowballstemmer==1.2.1 -Sphinx==1.8.3 +Sphinx==1.8.4 sphinxcontrib-websupport==1.1.0 urllib3==1.24.1 From 34533befe87fc6242e11ecacffd89992f140d0a2 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:54 +0100 Subject: [PATCH 427/492] Update atomicwrites from 1.2.1 to 1.3.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 1fc1ab256..40662018f 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -1,6 +1,6 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py -atomicwrites==1.2.1 +atomicwrites==1.3.0 attrs==18.2.0 backports.functools-lru-cache==1.5 beautifulsoup4==4.7.0 From 3ec0b39c9f17f61c4f80e99b29e05c407f00b026 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:55 +0100 Subject: [PATCH 428/492] Update beautifulsoup4 from 4.7.0 to 4.7.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 40662018f..3a9a550e1 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -3,7 +3,7 @@ atomicwrites==1.3.0 attrs==18.2.0 backports.functools-lru-cache==1.5 -beautifulsoup4==4.7.0 +beautifulsoup4==4.7.1 cheroot==6.5.3 Click==7.0 # colorama==0.4.1 From 43c0bbde7305a8ebd358f5bf217ebc25bbec68a7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:57 +0100 Subject: [PATCH 429/492] Update cheroot from 6.5.3 to 6.5.4 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 3a9a550e1..e16c3757a 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -4,7 +4,7 @@ atomicwrites==1.3.0 attrs==18.2.0 backports.functools-lru-cache==1.5 beautifulsoup4==4.7.1 -cheroot==6.5.3 +cheroot==6.5.4 Click==7.0 # colorama==0.4.1 coverage==4.5.2 From 3a69489f537ddacc8d8797603cea038753a629ad Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:40:58 +0100 Subject: [PATCH 430/492] Update hypothesis from 3.85.2 to 4.5.6 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index e16c3757a..abbd76240 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -12,7 +12,7 @@ EasyProcess==0.2.5 Flask==1.0.2 glob2==0.6 hunter==2.2.1 -hypothesis==3.85.2 +hypothesis==4.5.6 itsdangerous==1.1.0 # Jinja2==2.10 Mako==1.0.7 From a324133e5f4a5563f2482903cdcf778645684436 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:00 +0100 Subject: [PATCH 431/492] Update parse from 1.9.0 to 1.11.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index abbd76240..0419007dc 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -18,7 +18,7 @@ itsdangerous==1.1.0 Mako==1.0.7 # MarkupSafe==1.1.0 more-itertools==5.0.0 -parse==1.9.0 +parse==1.11.1 parse-type==0.4.2 pluggy==0.8.0 py==1.7.0 From cc820208a11cdda3d9a9f2a6c7be6a23530881f7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:01 +0100 Subject: [PATCH 432/492] Update pluggy from 0.8.0 to 0.8.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 0419007dc..b245afe0b 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -20,7 +20,7 @@ Mako==1.0.7 more-itertools==5.0.0 parse==1.11.1 parse-type==0.4.2 -pluggy==0.8.0 +pluggy==0.8.1 py==1.7.0 py-cpuinfo==4.0.0 pytest==4.0.2 From 1d793ebac9381b8259ba361f6c4c0f0d01326850 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:03 +0100 Subject: [PATCH 433/492] Update pluggy from 0.8.0 to 0.8.1 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index ed0db2870..9827b9ce8 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -1,7 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py filelock==3.0.10 -pluggy==0.8.0 +pluggy==0.8.1 py==1.7.0 six==1.12.0 toml==0.10.0 From 0a03328dfed493003a982e3ba79deb7f96f3c246 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:05 +0100 Subject: [PATCH 434/492] Update pytest from 4.0.2 to 4.2.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index b245afe0b..e8d562266 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -23,7 +23,7 @@ parse-type==0.4.2 pluggy==0.8.1 py==1.7.0 py-cpuinfo==4.0.0 -pytest==4.0.2 +pytest==4.2.0 pytest-bdd==3.0.1 pytest-benchmark==3.1.1 pytest-cov==2.6.0 From 787aed8164efb90ad0bc55f40c5f8590c68403bb Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:06 +0100 Subject: [PATCH 435/492] Update pytest-benchmark from 3.1.1 to 3.2.2 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index e8d562266..3e097d1f5 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -25,7 +25,7 @@ py==1.7.0 py-cpuinfo==4.0.0 pytest==4.2.0 pytest-bdd==3.0.1 -pytest-benchmark==3.1.1 +pytest-benchmark==3.2.2 pytest-cov==2.6.0 pytest-faulthandler==1.5.0 pytest-instafail==0.4.0 From b11f9a2410db89b8911fd12c7a8ee25f06acf988 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:08 +0100 Subject: [PATCH 436/492] Update pytest-cov from 2.6.0 to 2.6.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 3e097d1f5..aa1058752 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -26,7 +26,7 @@ py-cpuinfo==4.0.0 pytest==4.2.0 pytest-bdd==3.0.1 pytest-benchmark==3.2.2 -pytest-cov==2.6.0 +pytest-cov==2.6.1 pytest-faulthandler==1.5.0 pytest-instafail==0.4.0 pytest-mock==1.10.0 From c1254c39656bc9a71e5416dbd305ebec7d36caad Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:09 +0100 Subject: [PATCH 437/492] Update pytest-mock from 1.10.0 to 1.10.1 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index aa1058752..5290866e5 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -29,7 +29,7 @@ pytest-benchmark==3.2.2 pytest-cov==2.6.1 pytest-faulthandler==1.5.0 pytest-instafail==0.4.0 -pytest-mock==1.10.0 +pytest-mock==1.10.1 pytest-qt==3.2.2 pytest-repeat==0.7.0 pytest-rerunfailures==5.0 From 7a944dfac308250786d8ed611bacd1ba56c90df3 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:11 +0100 Subject: [PATCH 438/492] Update pytest-rerunfailures from 5.0 to 6.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 5290866e5..cb128a936 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -32,7 +32,7 @@ pytest-instafail==0.4.0 pytest-mock==1.10.1 pytest-qt==3.2.2 pytest-repeat==0.7.0 -pytest-rerunfailures==5.0 +pytest-rerunfailures==6.0 pytest-travis-fold==1.3.0 pytest-xvfb==1.1.0 PyVirtualDisplay==0.2.1 From 3e4bd7c35ca0db65b2d453bd42e2df6afb2e3e0a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:12 +0100 Subject: [PATCH 439/492] Update pytest-xvfb from 1.1.0 to 1.2.0 --- misc/requirements/requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index cb128a936..7ff6d0687 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -34,7 +34,7 @@ pytest-qt==3.2.2 pytest-repeat==0.7.0 pytest-rerunfailures==6.0 pytest-travis-fold==1.3.0 -pytest-xvfb==1.1.0 +pytest-xvfb==1.2.0 PyVirtualDisplay==0.2.1 six==1.12.0 vulture==1.0 From 9a0c517858492096c9d8a7180df41f4bf5e004a1 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:14 +0100 Subject: [PATCH 440/492] Update tox from 3.6.1 to 3.7.0 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index 9827b9ce8..018f3823d 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -5,5 +5,5 @@ pluggy==0.8.1 py==1.7.0 six==1.12.0 toml==0.10.0 -tox==3.6.1 +tox==3.7.0 virtualenv==16.1.0 From be2d3624177ef96602c214c31ed93ba3748e15fb Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 11 Feb 2019 19:41:16 +0100 Subject: [PATCH 441/492] Update virtualenv from 16.1.0 to 16.4.0 --- misc/requirements/requirements-tox.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt index 018f3823d..47ea7a4e3 100644 --- a/misc/requirements/requirements-tox.txt +++ b/misc/requirements/requirements-tox.txt @@ -6,4 +6,4 @@ py==1.7.0 six==1.12.0 toml==0.10.0 tox==3.7.0 -virtualenv==16.1.0 +virtualenv==16.4.0 From eaffed0b8017961f76418cf6ffd841b7b340f714 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Wed, 13 Feb 2019 23:29:00 -0800 Subject: [PATCH 442/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 6b2bc1d71..d5d76b181 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -79,6 +79,7 @@ Fixed - When `scrolling.bar = True` was set in versions before v1.5.0, this now correctly gets migrated to `always` instead of `when-searching`. - Completion highlighting now works again on Qt 5.11.3 and 5.12.1. +- The outdated header `X-Do-Not-Track` is no longer sent. v1.5.2 ------ From 266a4c16fde37fd36b6913cd8b26bf58067f45e0 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Thu, 14 Feb 2019 17:51:04 -0800 Subject: [PATCH 443/492] Fix lint errors --- qutebrowser/javascript/stylesheet.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/javascript/stylesheet.js b/qutebrowser/javascript/stylesheet.js index 96b5aa35d..ce1cc167d 100644 --- a/qutebrowser/javascript/stylesheet.js +++ b/qutebrowser/javascript/stylesheet.js @@ -58,7 +58,8 @@ window._qutebrowser.stylesheet = (function() { function create_style() { let ns = xhtml_ns; - if (document.documentElement && document.documentElement.namespaceURI === svg_ns) { + if (document.documentElement && + document.documentElement.namespaceURI === svg_ns) { ns = svg_ns; } style_elem = document.createElementNS(ns, "style"); From 4039b3188f327c3eae4590f16d59066daeff5918 Mon Sep 17 00:00:00 2001 From: Jay Kamat Date: Thu, 14 Feb 2019 17:52:57 -0800 Subject: [PATCH 444/492] Update changelog --- doc/changelog.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index d5d76b181..7e6b21e4e 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -80,6 +80,7 @@ Fixed correctly gets migrated to `always` instead of `when-searching`. - Completion highlighting now works again on Qt 5.11.3 and 5.12.1. - The outdated header `X-Do-Not-Track` is no longer sent. +- A javascript error on page load when using Qt 5.12 was fixed. v1.5.2 ------ From e1f0d994fd15105868651e078ffae061d52ab3ef Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 14 Feb 2019 14:39:29 +0100 Subject: [PATCH 445/492] Use /bin/bash for format_json userscript The pipefail option is undefined in POSIX sh: https://github.com/koalaman/shellcheck/wiki/SC2039 --- misc/userscripts/format_json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/userscripts/format_json b/misc/userscripts/format_json index 0d476b327..610cefbac 100755 --- a/misc/userscripts/format_json +++ b/misc/userscripts/format_json @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash set -euo pipefail # # Behavior: From ac1e8a4efe2cbcb6f2ecee845c55f2d338d76978 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 15 Feb 2019 23:24:51 +0100 Subject: [PATCH 446/492] Add window.print() support for Qt 5.12 See #3992 --- doc/changelog.asciidoc | 1 + qutebrowser/browser/webengine/webenginetab.py | 30 ++++++++++++++----- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 7e6b21e4e..9b318a07a 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -81,6 +81,7 @@ Fixed - Completion highlighting now works again on Qt 5.11.3 and 5.12.1. - The outdated header `X-Do-Not-Track` is no longer sent. - A javascript error on page load when using Qt 5.12 was fixed. +- `window.print()` works with Qt 5.12 now. v1.5.2 ------ diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 22380cb1f..81d9fc4cc 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -927,10 +927,14 @@ class _WebEngineScripts(QObject): utils.read_file('javascript/webelem.js'), utils.read_file('javascript/caret.js'), ) - self._inject_early_js('js', - utils.read_file('javascript/print.js'), - subframes=True, - world=QWebEngineScript.MainWorld) + if not qtutils.version_check('5.12'): + # WORKAROUND for Qt versions < 5.12 not exposing window.print(). + # Qt 5.12 has a printRequested() signal so we don't need this hack + # anymore. + self._inject_early_js('js', + utils.read_file('javascript/print.js'), + subframes=True, + world=QWebEngineScript.MainWorld) # FIXME:qtwebengine what about subframes=True? self._inject_early_js('js', js_code, subframes=True) self._init_stylesheet() @@ -1418,15 +1422,20 @@ class WebEngineTab(browsertab.AbstractTab): if not qtutils.version_check('5.11.1', compiled=False): self.settings.update_for_url(url) + @pyqtSlot() + def _on_print_requested(self): + """Slot for window.print() in JS.""" + try: + self.printing.show_dialog() + except browsertab.WebTabError as e: + message.error(str(e)) + @pyqtSlot(usertypes.NavigationRequest) def _on_navigation_request(self, navigation): super()._on_navigation_request(navigation) if navigation.url == QUrl('qute://print'): - try: - self.printing.show_dialog() - except browsertab.WebTabError as e: - message.error(str(e)) + self._on_print_requested() navigation.accepted = False if not navigation.accepted or not navigation.is_main_frame: @@ -1472,6 +1481,11 @@ class WebEngineTab(browsertab.AbstractTab): self._on_proxy_authentication_required) page.contentsSizeChanged.connect(self.contents_size_changed) page.navigation_request.connect(self._on_navigation_request) + try: + page.printRequested.connect(self._on_print_requested) + except AttributeError: + # Added in Qt 5.12 + pass view.titleChanged.connect(self.title_changed) view.urlChanged.connect(self._on_url_changed) From 6ca6271170786b09f30c92d3b59d7e95880d3124 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 00:23:52 +0100 Subject: [PATCH 447/492] Add additional asserts to utils.read_file See #4576 --- qutebrowser/utils/utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py index 2d517043a..0a0ff0c5c 100644 --- a/qutebrowser/utils/utils.py +++ b/qutebrowser/utils/utils.py @@ -30,6 +30,7 @@ import datetime import traceback import functools import contextlib +import posixpath import socket import shlex import glob @@ -165,6 +166,9 @@ def read_file(filename, binary=False): Return: The file contents as string. """ + assert not posixpath.isabs(filename), filename + assert os.path.pardir not in filename.split(posixpath.sep), filename + if not binary and filename in _resource_cache: return _resource_cache[filename] From 6519ac5cca706df4f1ef3b248a3e929fa3b64c37 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 00:46:41 +0100 Subject: [PATCH 448/492] Add normpath in _asciidoc_fallback_path See #4576 --- qutebrowser/browser/qutescheme.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 14c43ad1e..ac8caf6ee 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -32,6 +32,7 @@ import textwrap import urllib import collections import base64 +import os.path try: import secrets @@ -348,7 +349,7 @@ def _asciidoc_fallback_path(html_path): for path in asciidoc_paths: try: - return utils.read_file(path) + return utils.read_file(os.path.normpath(path)) except OSError: pass From 0de43e34381f0028320e3fdc95b8b8e9c0908116 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 01:05:27 +0100 Subject: [PATCH 449/492] _asciidoc_fallback_path: Remove reading from parent directories Reading paths from outside the Python package worked in pkg_resources < 40.8.0 but got deprecated afterwards: https://github.com/pypa/setuptools/pull/1640 Since this isn't really any critical functionality, let's just not try reading from there. We can still revisit this when the switch to Sphinx is complete. Fixes #4576 (hopefully) See #345 --- qutebrowser/browser/qutescheme.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index ac8caf6ee..d91022cca 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -32,7 +32,6 @@ import textwrap import urllib import collections import base64 -import os.path try: import secrets @@ -342,18 +341,10 @@ def qute_gpl(_url): def _asciidoc_fallback_path(html_path): """Fall back to plaintext asciidoc if the HTML is unavailable.""" asciidoc_path = html_path.replace('.html', '.asciidoc') - asciidoc_paths = [asciidoc_path] - if asciidoc_path.startswith('html/doc/'): - asciidoc_paths += [asciidoc_path.replace('html/doc/', '../doc/help/'), - asciidoc_path.replace('html/doc/', '../doc/')] - - for path in asciidoc_paths: - try: - return utils.read_file(os.path.normpath(path)) - except OSError: - pass - - return None + try: + return utils.read_file(path) + except OSError: + return None @add_handler('help') From a8910f5ef536b3f85865eba0ec69cf4a29db6344 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 01:10:03 +0100 Subject: [PATCH 450/492] Fix up _asciidoc_fallback_path Note to self: Don't do coding in bed at 1 AM. See #4576 --- qutebrowser/browser/qutescheme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index d91022cca..6545dc4c0 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -340,7 +340,7 @@ def qute_gpl(_url): def _asciidoc_fallback_path(html_path): """Fall back to plaintext asciidoc if the HTML is unavailable.""" - asciidoc_path = html_path.replace('.html', '.asciidoc') + path = html_path.replace('.html', '.asciidoc') try: return utils.read_file(path) except OSError: From 823a0de88421800d38003cf32e6cc8d14c57afa3 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 01:43:20 +0100 Subject: [PATCH 451/492] Check for updated docs in all affected tests Fixes #4576 --- tests/end2end/features/conftest.py | 31 +++++++++++++++- tests/end2end/features/navigate.feature | 3 +- tests/end2end/features/qutescheme.feature | 6 ++-- tests/end2end/features/test_qutescheme_bdd.py | 35 ------------------- 4 files changed, 36 insertions(+), 39 deletions(-) diff --git a/tests/end2end/features/conftest.py b/tests/end2end/features/conftest.py index ca14768ef..3e0e82456 100644 --- a/tests/end2end/features/conftest.py +++ b/tests/end2end/features/conftest.py @@ -20,6 +20,7 @@ """Steps for bdd-like tests.""" import os +import os.path import re import sys import time @@ -27,11 +28,13 @@ import json import logging import collections import textwrap +import subprocess import pytest import pytest_bdd as bdd -from qutebrowser.utils import log, utils +import qutebrowser +from qutebrowser.utils import log, utils, docutils from qutebrowser.browser import pdfjs from helpers import utils as testutils @@ -382,6 +385,32 @@ def clear_ssl_errors(request, quteproc): quteproc.send_cmd(':debug-clear-ssl-errors') +@bdd.when("the documentation is up to date") +def update_documentation(): + """Update the docs before testing :help.""" + base_path = os.path.dirname(os.path.abspath(qutebrowser.__file__)) + doc_path = os.path.join(base_path, 'html', 'doc') + script_path = os.path.join(base_path, '..', 'scripts') + + try: + os.mkdir(doc_path) + except FileExistsError: + pass + + files = os.listdir(doc_path) + if files and all(docutils.docs_up_to_date(p) for p in files): + return + + try: + subprocess.run(['asciidoc'], stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) + except OSError: + pytest.skip("Docs outdated and asciidoc unavailable!") + + update_script = os.path.join(script_path, 'asciidoc2html.py') + subprocess.run([sys.executable, update_script]) + + ## Then diff --git a/tests/end2end/features/navigate.feature b/tests/end2end/features/navigate.feature index 07bd56c69..2596f3ef1 100644 --- a/tests/end2end/features/navigate.feature +++ b/tests/end2end/features/navigate.feature @@ -24,7 +24,8 @@ Feature: Using :navigate Then data/navigate should be loaded Scenario: Navigating up in qute://help/ - When I open qute://help/commands.html + When the documentation is up to date + And I open qute://help/commands.html And I run :navigate up Then qute://help/ should be loaded diff --git a/tests/end2end/features/qutescheme.feature b/tests/end2end/features/qutescheme.feature index 0f5954e19..fd41515a5 100644 --- a/tests/end2end/features/qutescheme.feature +++ b/tests/end2end/features/qutescheme.feature @@ -8,7 +8,8 @@ Feature: Special qute:// pages # :help Scenario: :help without topic - When I run :tab-only + When the documentation is up to date + And I run :tab-only And I run :help And I wait until qute://help/index.html is loaded Then the following tabs should be open: @@ -39,7 +40,8 @@ Feature: Special qute:// pages - qute://help/settings.html#editor.command (active) Scenario: :help with -t - When I run :tab-only + When the documentation is up to date + And I run :tab-only And I run :help -t And I wait until qute://help/index.html is loaded Then the following tabs should be open: diff --git a/tests/end2end/features/test_qutescheme_bdd.py b/tests/end2end/features/test_qutescheme_bdd.py index 8706a1a9c..2245143f7 100644 --- a/tests/end2end/features/test_qutescheme_bdd.py +++ b/tests/end2end/features/test_qutescheme_bdd.py @@ -17,40 +17,5 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -import sys -import os.path -import subprocess - -import pytest import pytest_bdd as bdd - -import qutebrowser -from qutebrowser.utils import docutils - bdd.scenarios('qutescheme.feature') - - -@bdd.when("the documentation is up to date") -def update_documentation(): - """Update the docs before testing :help.""" - base_path = os.path.dirname(os.path.abspath(qutebrowser.__file__)) - doc_path = os.path.join(base_path, 'html', 'doc') - script_path = os.path.join(base_path, '..', 'scripts') - - try: - os.mkdir(doc_path) - except FileExistsError: - pass - - files = os.listdir(doc_path) - if files and all(docutils.docs_up_to_date(p) for p in files): - return - - try: - subprocess.run(['asciidoc'], stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL) - except OSError: - pytest.skip("Docs outdated and asciidoc unavailable!") - - update_script = os.path.join(script_path, 'asciidoc2html.py') - subprocess.run([sys.executable, update_script]) From 018d207941bad19bc92e8c4a8ce796d290bdf83a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 17:24:23 +0100 Subject: [PATCH 452/492] Update requirements-pyqt properly for Qt 5.12 --- misc/requirements/requirements-pyqt.txt | 3 ++- misc/requirements/requirements-pyqt.txt-raw | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/misc/requirements/requirements-pyqt.txt b/misc/requirements/requirements-pyqt.txt index 539b101ba..63722a679 100644 --- a/misc/requirements/requirements-pyqt.txt +++ b/misc/requirements/requirements-pyqt.txt @@ -1,4 +1,5 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py PyQt5==5.12 -PyQt5-sip==4.19.13 +PyQt5-sip==4.19.14 +PyQtWebEngine==5.12 diff --git a/misc/requirements/requirements-pyqt.txt-raw b/misc/requirements/requirements-pyqt.txt-raw index 37a69c45a..9c6afbf16 100644 --- a/misc/requirements/requirements-pyqt.txt-raw +++ b/misc/requirements/requirements-pyqt.txt-raw @@ -1 +1,2 @@ -PyQt5 \ No newline at end of file +PyQt5 +PyQtWebEngine From 62059c27f334ee4c6ce8fce30b0bbbd3094bad64 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 18:00:10 +0100 Subject: [PATCH 453/492] Use per-file-ignores built into the new flake8 --- .flake8 | 11 +++++------ misc/requirements/requirements-flake8.txt | 4 +--- misc/requirements/requirements-flake8.txt-raw | 1 - 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.flake8 b/.flake8 index 7a783a4b0..04c491bf2 100644 --- a/.flake8 +++ b/.flake8 @@ -46,12 +46,11 @@ ignore = min-version = 3.4.0 max-complexity = 12 per-file-ignores = - /qutebrowser/api/hook.py : N801 - /tests/**/*.py : D100,D101,D401 - /tests/unit/browser/test_history.py : N806 - /tests/helpers/fixtures.py : N806 - /tests/unit/browser/webkit/http/test_content_disposition.py : D400 - /scripts/dev/ci/appveyor_install.py : FI53 + qutebrowser/api/hook.py : N801 + tests/* : D100,D101 + tests/unit/browser/test_history.py : D100,D101,N806 + tests/helpers/fixtures.py : D100,D101,N806 + tests/unit/browser/webkit/http/test_content_disposition.py : D100,D101,D400 copyright-check = True copyright-regexp = # Copyright [\d-]+ .* copyright-min-file-size = 110 diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt index a3606430d..6cdfac747 100644 --- a/misc/requirements/requirements-flake8.txt +++ b/misc/requirements/requirements-flake8.txt @@ -1,6 +1,7 @@ # This file is automatically generated by scripts/dev/recompile_requirements.py attrs==18.2.0 +entrypoints==0.3 flake8==3.7.5 flake8-bugbear==18.8.0 flake8-builtins==1.4.1 @@ -11,17 +12,14 @@ flake8-deprecated==1.3 flake8-docstrings==1.3.0 flake8-future-import==0.4.5 flake8-mock==0.3 -flake8-per-file-ignores==0.8.1 flake8-polyfill==1.0.2 flake8-string-format==0.2.3 flake8-tidy-imports==2.0.0 flake8-tuple==0.2.13 mccabe==0.6.1 -pathmatch==0.2.1 pep8-naming==0.8.2 pycodestyle==2.5.0 pydocstyle==3.0.0 pyflakes==2.1.0 six==1.12.0 snowballstemmer==1.2.1 -typing==3.6.6 diff --git a/misc/requirements/requirements-flake8.txt-raw b/misc/requirements/requirements-flake8.txt-raw index 1f30b83ae..1bdca6974 100644 --- a/misc/requirements/requirements-flake8.txt-raw +++ b/misc/requirements/requirements-flake8.txt-raw @@ -8,7 +8,6 @@ flake8-deprecated flake8-docstrings flake8-future-import flake8-mock -flake8-per-file-ignores flake8-string-format flake8-tidy-imports flake8-tuple From 7c87f4e3d0f394224d43b67966ba40a9860ac329 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 18:01:45 +0100 Subject: [PATCH 454/492] s/qApp/q_app/g --- qutebrowser/app.py | 62 +++++++++++++++---------------- qutebrowser/misc/consolewidget.py | 2 +- tests/unit/test_app.py | 2 +- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 2b6896b76..ca0bc06a7 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -83,7 +83,7 @@ from qutebrowser.misc import utilcmds # pylint: enable=unused-import -qApp = None +q_app = None def run(args): @@ -101,25 +101,25 @@ def run(args): log.init.debug("Initializing config...") configinit.early_init(args) - global qApp - qApp = Application(args) - qApp.setOrganizationName("qutebrowser") - qApp.setApplicationName("qutebrowser") - qApp.setDesktopFileName("qutebrowser") - qApp.setApplicationVersion(qutebrowser.__version__) - qApp.lastWindowClosed.connect(quitter.on_last_window_closed) + global q_app + q_app = Application(args) + q_app.setOrganizationName("qutebrowser") + q_app.setApplicationName("qutebrowser") + q_app.setDesktopFileName("qutebrowser") + q_app.setApplicationVersion(qutebrowser.__version__) + q_app.lastWindowClosed.connect(quitter.on_last_window_closed) if args.version: print(version.version()) sys.exit(usertypes.Exit.ok) crash_handler = crashsignal.CrashHandler( - app=qApp, quitter=quitter, args=args, parent=qApp) + app=q_app, quitter=quitter, args=args, parent=q_app) crash_handler.activate() objreg.register('crash-handler', crash_handler) - signal_handler = crashsignal.SignalHandler(app=qApp, quitter=quitter, - parent=qApp) + signal_handler = crashsignal.SignalHandler(app=q_app, quitter=quitter, + parent=q_app) signal_handler.activate() objreg.register('signal-handler', signal_handler) @@ -151,7 +151,7 @@ def qt_mainloop(): WARNING: misc/crashdialog.py checks the stacktrace for this function name, so if this is changed, it should be changed there as well! """ - return qApp.exec_() + return q_app.exec_() def init(args, crash_handler): @@ -162,7 +162,7 @@ def init(args, crash_handler): crash_handler: The CrashHandler instance. """ log.init.debug("Starting init...") - qApp.setQuitOnLastWindowClosed(False) + q_app.setQuitOnLastWindowClosed(False) _init_icon() loader.init() @@ -175,12 +175,12 @@ def init(args, crash_handler): sys.exit(usertypes.Exit.err_init) log.init.debug("Initializing eventfilter...") - event_filter = EventFilter(qApp) - qApp.installEventFilter(event_filter) + event_filter = EventFilter(q_app) + q_app.installEventFilter(event_filter) objreg.register('event-filter', event_filter) log.init.debug("Connecting signals...") - qApp.focusChanged.connect(on_focus_changed) + q_app.focusChanged.connect(on_focus_changed) _process_args(args) @@ -207,7 +207,7 @@ def _init_icon(): if icon.isNull(): log.init.warning("Failed to load icon") else: - qApp.setWindowIcon(icon) + q_app.setWindowIcon(icon) def _process_args(args): @@ -220,7 +220,7 @@ def _process_args(args): window = mainwindow.MainWindow(private=None) if not args.nowindow: window.show() - qApp.setActiveWindow(window) + q_app.setActiveWindow(window) process_pos_args(args.command) _open_startpage() @@ -425,7 +425,7 @@ def _init_modules(args, crash_handler): crash_handler: The CrashHandler instance. """ log.init.debug("Initializing save manager...") - save_manager = savemanager.SaveManager(qApp) + save_manager = savemanager.SaveManager(q_app) objreg.register('save-manager', save_manager) configinit.late_init(save_manager) @@ -450,7 +450,7 @@ def _init_modules(args, crash_handler): sql.init(os.path.join(standarddir.data(), 'history.sqlite')) log.init.debug("Initializing web history...") - history.init(qApp) + history.init(q_app) except sql.SqlEnvironmentError as e: error.handle_fatal_exc(e, args, 'Error initializing SQL', pre_text='Error initializing SQL') @@ -464,31 +464,31 @@ def _init_modules(args, crash_handler): crash_handler.handle_segfault() log.init.debug("Initializing sessions...") - sessions.init(qApp) + sessions.init(q_app) log.init.debug("Initializing websettings...") websettings.init(args) log.init.debug("Initializing quickmarks...") - quickmark_manager = urlmarks.QuickmarkManager(qApp) + quickmark_manager = urlmarks.QuickmarkManager(q_app) objreg.register('quickmark-manager', quickmark_manager) log.init.debug("Initializing bookmarks...") - bookmark_manager = urlmarks.BookmarkManager(qApp) + bookmark_manager = urlmarks.BookmarkManager(q_app) objreg.register('bookmark-manager', bookmark_manager) log.init.debug("Initializing cookies...") - cookie_jar = cookies.CookieJar(qApp) - ram_cookie_jar = cookies.RAMCookieJar(qApp) + cookie_jar = cookies.CookieJar(q_app) + ram_cookie_jar = cookies.RAMCookieJar(q_app) objreg.register('cookie-jar', cookie_jar) objreg.register('ram-cookie-jar', ram_cookie_jar) log.init.debug("Initializing cache...") - diskcache = cache.DiskCache(standarddir.cache(), parent=qApp) + diskcache = cache.DiskCache(standarddir.cache(), parent=q_app) objreg.register('cache', diskcache) log.init.debug("Initializing downloads...") - download_manager = qtnetworkdownloads.DownloadManager(parent=qApp) + download_manager = qtnetworkdownloads.DownloadManager(parent=q_app) objreg.register('qtnetwork-download-manager', download_manager) log.init.debug("Initializing Greasemonkey...") @@ -735,7 +735,7 @@ class Quitter: def _shutdown(self, status, restart): # noqa """Second stage of shutdown.""" log.destroy.debug("Stage 2 of shutting down...") - if qApp is None: + if q_app is None: # No QApplication exists yet, so quit hard. sys.exit(status) # Remove eventfilter @@ -743,7 +743,7 @@ class Quitter: log.destroy.debug("Removing eventfilter...") event_filter = objreg.get('event-filter', None) if event_filter is not None: - qApp.removeEventFilter(event_filter) + q_app.removeEventFilter(event_filter) except AttributeError: pass # Close all windows @@ -792,7 +792,7 @@ class Quitter: session_manager.delete_autosave() # We use a singleshot timer to exit here to minimize the likelihood of # segfaults. - QTimer.singleShot(0, functools.partial(qApp.exit, status)) + QTimer.singleShot(0, functools.partial(q_app.exit, status)) class Application(QApplication): @@ -893,7 +893,7 @@ class EventFilter(QObject): Return: True if the event should be filtered, False if it's passed through. """ - if qApp.activeWindow() not in objreg.window_registry.values(): + if q_app.activeWindow() not in objreg.window_registry.values(): # Some other window (print dialog, etc.) is focused so we pass the # event through. return False diff --git a/qutebrowser/misc/consolewidget.py b/qutebrowser/misc/consolewidget.py index 661c7b805..46ce8becd 100644 --- a/qutebrowser/misc/consolewidget.py +++ b/qutebrowser/misc/consolewidget.py @@ -162,7 +162,7 @@ class ConsoleWidget(QWidget): namespace = { '__name__': '__console__', '__doc__': None, - 'qApp': QApplication.instance(), + 'q_app': QApplication.instance(), # We use parent as self here because the user "feels" the whole # console, not just the line edit. 'self': parent, diff --git a/tests/unit/test_app.py b/tests/unit/test_app.py index 3d7555bc4..9b2916ba8 100644 --- a/tests/unit/test_app.py +++ b/tests/unit/test_app.py @@ -30,7 +30,7 @@ def test_on_focus_changed_issue1484(monkeypatch, qapp, caplog): For some reason, Qt sometimes calls on_focus_changed() with a QBuffer as argument. Let's make sure we handle that gracefully. """ - monkeypatch.setattr(app, 'qApp', qapp) + monkeypatch.setattr(app, 'q_app', qapp) buf = QBuffer() app.on_focus_changed(buf, buf) From 2d996baea0612b782666d4f941ddd900f10d312b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 19:01:38 +0100 Subject: [PATCH 455/492] Fix remaining new flake8 issues --- qutebrowser/config/configdata.py | 8 ++++---- qutebrowser/misc/checkpyver.py | 2 +- qutebrowser/utils/qtutils.py | 2 +- qutebrowser/utils/version.py | 2 +- tests/unit/completion/test_completionmodel.py | 2 +- tests/unit/misc/test_ipc.py | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index 61e35fd53..52100ae8a 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -91,15 +91,15 @@ def _parse_yaml_type( ) -> configtypes.BaseType: if isinstance(node, str): # e.g: - # type: Bool + # > type: Bool # -> create the type object without any arguments type_name = node kwargs = {} # type: typing.MutableMapping[str, typing.Any] elif isinstance(node, dict): # e.g: - # type: - # name: String - # none_ok: true + # > type: + # > name: String + # > none_ok: true # -> create the type object and pass arguments type_name = node.pop('name') kwargs = node diff --git a/qutebrowser/misc/checkpyver.py b/qutebrowser/misc/checkpyver.py index cf8e13810..641ccc5f8 100644 --- a/qutebrowser/misc/checkpyver.py +++ b/qutebrowser/misc/checkpyver.py @@ -31,7 +31,7 @@ except ImportError: # pragma: no cover try: # Python2 from Tkinter import Tk # type: ignore - import tkMessageBox as messagebox # type: ignore + import tkMessageBox as messagebox # type: ignore # noqa: N813 except ImportError: # Some Python without Tk Tk = None # type: ignore diff --git a/qutebrowser/utils/qtutils.py b/qutebrowser/utils/qtutils.py index 5373e76aa..520ced252 100644 --- a/qutebrowser/utils/qtutils.py +++ b/qutebrowser/utils/qtutils.py @@ -40,7 +40,7 @@ from PyQt5.QtCore import (qVersion, QEventLoop, QDataStream, QByteArray, try: from PyQt5.QtWebKit import qWebKitVersion except ImportError: # pragma: no cover - qWebKitVersion = None # type: ignore + qWebKitVersion = None # type: ignore # noqa: N816 MAXVALS = { diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index a52e31ed8..750a13383 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -42,7 +42,7 @@ from PyQt5.QtWidgets import QApplication try: from PyQt5.QtWebKit import qWebKitVersion except ImportError: # pragma: no cover - qWebKitVersion = None # type: ignore + qWebKitVersion = None # type: ignore # noqa: N816 try: from PyQt5.QtWebEngineWidgets import QWebEngineProfile diff --git a/tests/unit/completion/test_completionmodel.py b/tests/unit/completion/test_completionmodel.py index 24f5bdf0d..719a51016 100644 --- a/tests/unit/completion/test_completionmodel.py +++ b/tests/unit/completion/test_completionmodel.py @@ -41,7 +41,7 @@ def test_first_last_item(counts): cat = mock.Mock(spec=['layoutChanged', 'layoutAboutToBeChanged']) cat.rowCount = mock.Mock(return_value=c, spec=[]) model.add_category(cat) - data = [i for i, rowCount in enumerate(counts) if rowCount > 0] + data = [i for i, row_count in enumerate(counts) if row_count > 0] if not data: # with no items, first and last should be an invalid index assert not model.first_item().isValid() diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py index 29ca0ff9d..dd2efcbb1 100644 --- a/tests/unit/misc/test_ipc.py +++ b/tests/unit/misc/test_ipc.py @@ -98,7 +98,7 @@ class FakeSocket(QObject): _connect_successful: The value returned for waitForConnected(). """ - readyRead = pyqtSignal() + readyRead = pyqtSignal() # noqa: N815 disconnected = pyqtSignal() def __init__(self, *, error=QLocalSocket.UnknownSocketError, state=None, From 3fd7b58107181b1ff25323b873afdee50cd4d1bc Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 19:50:02 +0100 Subject: [PATCH 456/492] Fix pylint on CI For some reason, we get an error here on Travis but not locally. This happens even with the same Python/pylint/astroid versions... --- qutebrowser/browser/webkit/network/networkreply.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/webkit/network/networkreply.py b/qutebrowser/browser/webkit/network/networkreply.py index c56fe2a9b..a9d27186f 100644 --- a/qutebrowser/browser/webkit/network/networkreply.py +++ b/qutebrowser/browser/webkit/network/networkreply.py @@ -34,8 +34,8 @@ class FixedDataNetworkReply(QNetworkReply): """QNetworkReply subclass for fixed data.""" - def __init__(self, request, fileData, mimeType, # noqa: N803 - parent=None): + def __init__(self, request, # noqa: N803 pylint: disable=invalid-name + fileData, mimeType, parent=None): """Constructor. Args: From b6a7fc59844722a9118646ceefd72f3115f95bc7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 19:50:39 +0100 Subject: [PATCH 457/492] Update pytest warnings ignore We don't need the one for pytest-benchmark anymore, but we need one for pytest-bdd. See https://github.com/pytest-dev/pytest-bdd/pull/288 See #4511 --- pytest.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pytest.ini b/pytest.ini index c278b0591..ff2b606ef 100644 --- a/pytest.ini +++ b/pytest.ini @@ -70,5 +70,5 @@ filterwarnings = error # This happens in many qutebrowser dependencies... ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working:DeprecationWarning - # WORKAROUND for https://github.com/ionelmc/pytest-benchmark/issues/124 - ignore:Node\.warn\(code, message\) form has been deprecated, use Node\.warn\(warning_instance\) instead:pytest.PytestDeprecationWarning + # WORKAROUND for https://github.com/pytest-dev/pytest-bdd/pull/288 + ignore:the `pytest\.config` global is deprecated\. Please use `request.config` or `pytest_configure` \(if you're a pytest plugin\) instead\. From 94f998ac3a34bc068ed800e0718c248d94da8527 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 19:59:41 +0100 Subject: [PATCH 458/492] Adjust for new pytest import handling See #4511 --- tests/unit/components/test_adblock.py | 2 +- tests/unit/config/test_configtypes.py | 2 +- tests/unit/keyinput/test_keyutils.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/components/test_adblock.py b/tests/unit/components/test_adblock.py index f37b57962..d63c802c8 100644 --- a/tests/unit/components/test_adblock.py +++ b/tests/unit/components/test_adblock.py @@ -30,7 +30,7 @@ from PyQt5.QtCore import QUrl from qutebrowser.components import adblock from qutebrowser.utils import urlmatch -from tests.helpers import utils +from helpers import utils pytestmark = pytest.mark.usefixtures('qapp') diff --git a/tests/unit/config/test_configtypes.py b/tests/unit/config/test_configtypes.py index b0b85d997..78116be20 100644 --- a/tests/unit/config/test_configtypes.py +++ b/tests/unit/config/test_configtypes.py @@ -38,7 +38,7 @@ from qutebrowser.config import configtypes, configexc, configutils from qutebrowser.utils import debug, utils, qtutils, urlmatch from qutebrowser.browser.network import pac from qutebrowser.keyinput import keyutils -from tests.helpers import utils as testutils +from helpers import utils as testutils class Font(QFont): diff --git a/tests/unit/keyinput/test_keyutils.py b/tests/unit/keyinput/test_keyutils.py index d6e7bce34..f69d90446 100644 --- a/tests/unit/keyinput/test_keyutils.py +++ b/tests/unit/keyinput/test_keyutils.py @@ -26,7 +26,7 @@ from PyQt5.QtCore import Qt, QEvent, pyqtSignal from PyQt5.QtGui import QKeyEvent, QKeySequence from PyQt5.QtWidgets import QWidget -from tests.unit.keyinput import key_data +from unit.keyinput import key_data from qutebrowser.keyinput import keyutils from qutebrowser.utils import utils From 5a319cc50533c65629000a7e235d14a5e275c55f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 20:10:29 +0100 Subject: [PATCH 459/492] Be more strict about Python deprecation warnings again The warnings caught in earlyinit.py got fixed in the affected dependencies. The collections.abc warning also seems to be fixed in everything but PyYAML. --- pytest.ini | 2 -- qutebrowser/misc/earlyinit.py | 20 +------------------- qutebrowser/utils/utils.py | 10 +++++++++- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/pytest.ini b/pytest.ini index ff2b606ef..49f23359b 100644 --- a/pytest.ini +++ b/pytest.ini @@ -68,7 +68,5 @@ qt_log_ignore = xfail_strict = true filterwarnings = error - # This happens in many qutebrowser dependencies... - ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working:DeprecationWarning # WORKAROUND for https://github.com/pytest-dev/pytest-bdd/pull/288 ignore:the `pytest\.config` global is deprecated\. Please use `request.config` or `pytest_configure` \(if you're a pytest plugin\) instead\. diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index 690ede60f..02e3564a2 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -199,25 +199,7 @@ def _check_modules(modules): for name, text in modules.items(): try: - # https://github.com/pallets/jinja/pull/628 - # https://bitbucket.org/birkenfeld/pygments-main/issues/1314/ - # https://github.com/pallets/jinja/issues/646 - # https://bitbucket.org/fdik/pypeg/commits/dd15ca462b532019c0a3be1d39b8ee2f3fa32f4e - messages = ['invalid escape sequence', - 'Flags not at the start of the expression'] - # pylint: disable=bad-continuation - with log.ignore_py_warnings( - category=DeprecationWarning, - message=r'({})'.format('|'.join(messages)) - ), log.ignore_py_warnings( - category=PendingDeprecationWarning, - module='imp' - ), log.ignore_py_warnings( - category=ImportWarning, - message=r'Not importing directory .*: missing __init__' - ): - # pylint: enable=bad-continuation - importlib.import_module(name) + importlib.import_module(name) except ImportError as e: _die(text, e) diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py index 2d517043a..760bce576 100644 --- a/qutebrowser/utils/utils.py +++ b/qutebrowser/utils/utils.py @@ -655,7 +655,15 @@ def expand_windows_drive(path): def yaml_load(f): """Wrapper over yaml.load using the C loader if possible.""" start = datetime.datetime.now() - data = yaml.load(f, Loader=YamlLoader) + + # WORKAROUND for https://github.com/yaml/pyyaml/pull/181 + with log.ignore_py_warnings( + category=DeprecationWarning, + message=r"Using or importing the ABCs from 'collections' instead " + r"of from 'collections\.abc' is deprecated, and in 3\.8 it will " + r"stop working"): + data = yaml.load(f, Loader=YamlLoader) + end = datetime.datetime.now() delta = (end - start).total_seconds() From 22b58e011dcfa4d1407e8e9cdfa19b4e33977677 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 20:17:52 +0100 Subject: [PATCH 460/492] Update requirements --- misc/requirements/requirements-optional.txt | 1 - misc/requirements/requirements-tests.txt | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements/requirements-optional.txt b/misc/requirements/requirements-optional.txt index e0b5f0609..52d067f69 100644 --- a/misc/requirements/requirements-optional.txt +++ b/misc/requirements/requirements-optional.txt @@ -4,4 +4,3 @@ colorama==0.4.1 cssutils==1.0.2 hunter==2.2.1 Pympler==0.6 -six==1.12.0 diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt index 7ff6d0687..da28f08a0 100644 --- a/misc/requirements/requirements-tests.txt +++ b/misc/requirements/requirements-tests.txt @@ -37,5 +37,6 @@ pytest-travis-fold==1.3.0 pytest-xvfb==1.2.0 PyVirtualDisplay==0.2.1 six==1.12.0 +soupsieve==1.7.3 vulture==1.0 Werkzeug==0.14.1 From a001fd1099a174ef16441d5483252b3fcc1eaba6 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 20:19:59 +0100 Subject: [PATCH 461/492] Re-add some deprecation warning filters Turns out there never was a PyPEG2 release... --- qutebrowser/misc/earlyinit.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index 02e3564a2..a2db81764 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -199,7 +199,17 @@ def _check_modules(modules): for name, text in modules.items(): try: - importlib.import_module(name) + # https://bitbucket.org/fdik/pypeg/commits/dd15ca462b532019c0a3be1d39b8ee2f3fa32f4e + # pylint: disable=bad-continuation + with log.ignore_py_warnings( + category=DeprecationWarning, + message=r'invalid escape sequence' + ), log.ignore_py_warnings( + category=ImportWarning, + message=r'Not importing directory .*: missing __init__' + ): + # pylint: enable=bad-continuation + importlib.import_module(name) except ImportError as e: _die(text, e) From 9ce8e40a9026cb21a1be907be2b82bc5911cd85b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 20:58:59 +0100 Subject: [PATCH 462/492] Fix flake8 again --- qutebrowser/browser/webkit/network/networkreply.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/webkit/network/networkreply.py b/qutebrowser/browser/webkit/network/networkreply.py index a9d27186f..72e03b9eb 100644 --- a/qutebrowser/browser/webkit/network/networkreply.py +++ b/qutebrowser/browser/webkit/network/networkreply.py @@ -34,8 +34,8 @@ class FixedDataNetworkReply(QNetworkReply): """QNetworkReply subclass for fixed data.""" - def __init__(self, request, # noqa: N803 pylint: disable=invalid-name - fileData, mimeType, parent=None): + def __init__(self, request, # pylint: disable=invalid-name + fileData, mimeType, parent=None): # noqa: N803 """Constructor. Args: From b31e5642de0e158f4160796099af69e35ba1bf91 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 21:01:55 +0100 Subject: [PATCH 463/492] Fix double PyQt5 requirement PyQt5-stubs tries to pull in PyQt5 5.11.3 but we want PyQt 5.12 (which works fine) from requirements-pyqt.txt. --- misc/requirements/requirements-mypy.txt | 4 ++-- misc/requirements/requirements-mypy.txt-raw | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt index fb0d12382..8cac2edcd 100644 --- a/misc/requirements/requirements-mypy.txt +++ b/misc/requirements/requirements-mypy.txt @@ -2,7 +2,7 @@ mypy==0.670 mypy-extensions==0.4.1 -PyQt5==5.12 -PyQt5-sip==4.19.13 +# PyQt5==5.11.3 +# PyQt5-sip==4.19.14 -e git+https://github.com/qutebrowser/PyQt5-stubs.git@wip#egg=PyQt5_stubs typed-ast==1.3.1 diff --git a/misc/requirements/requirements-mypy.txt-raw b/misc/requirements/requirements-mypy.txt-raw index 636ad43a4..92a35ab74 100644 --- a/misc/requirements/requirements-mypy.txt-raw +++ b/misc/requirements/requirements-mypy.txt-raw @@ -3,3 +3,4 @@ mypy # remove @commit-id for scm installs #@ replace: @.*# @wip# +#@ ignore: PyQt5, PyQt5-sip From 64dc28c5689c5662456bcc1a24acc235410cdd20 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 21:14:27 +0100 Subject: [PATCH 464/492] Remove pylint suppression for sip.assign We can control the installed sip version nowadays --- qutebrowser/browser/webengine/webenginetab.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 81d9fc4cc..60a9379d4 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1262,9 +1262,7 @@ class WebEngineTab(browsertab.AbstractTab): authenticator.setPassword(answer.password) else: try: - # pylint: disable=no-member, useless-suppression sip.assign(authenticator, QAuthenticator()) - # pylint: enable=no-member, useless-suppression except AttributeError: self._show_error_page(url, "Proxy authentication required") @@ -1286,9 +1284,7 @@ class WebEngineTab(browsertab.AbstractTab): if not netrc_success and answer is None: log.network.debug("Aborting auth") try: - # pylint: disable=no-member, useless-suppression sip.assign(authenticator, QAuthenticator()) - # pylint: enable=no-member, useless-suppression except AttributeError: # WORKAROUND for # https://www.riverbankcomputing.com/pipermail/pyqt/2016-December/038400.html From 05f22796f727ef183a11554b70a6e0d0ff99fd03 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 23:16:08 +0100 Subject: [PATCH 465/492] travis/tox: Add PyQt 5.12 See #4478 --- .travis.yml | 1 + tox.ini | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index dfa566671..d2e62c14a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,6 +22,7 @@ matrix: - env: TESTENV=py36-pyqt511-cov - python: 3.7 env: TESTENV=py37-pyqt511 + - env: TESTENV=py36-pyqt512 - os: osx env: TESTENV=py37 OSX=sierra osx_image: xcode9.2 diff --git a/tox.ini b/tox.ini index 75a00961e..1dfc5ac5a 100644 --- a/tox.ini +++ b/tox.ini @@ -13,8 +13,8 @@ skipsdist = true setenv = QT_QPA_PLATFORM_PLUGIN_PATH={envdir}/Lib/site-packages/PyQt5/plugins/platforms PYTEST_QT_API=pyqt5 - pyqt{,56,571,59,510,511}: LINK_PYQT_SKIP=true - pyqt{,56,571,59,510,511}: QUTE_BDD_WEBENGINE=true + pyqt{,56,571,59,510,511,512}: LINK_PYQT_SKIP=true + pyqt{,56,571,59,510,511,512}: QUTE_BDD_WEBENGINE=true cov: PYTEST_ADDOPTS=--cov --cov-report xml --cov-report=html --cov-report= passenv = PYTHON DISPLAY XAUTHORITY HOME USERNAME USER CI TRAVIS XDG_* QUTE_* DOCKER QT_QUICK_BACKEND basepython = @@ -29,6 +29,7 @@ deps = pyqt59: PyQt5==5.9.2 pyqt510: PyQt5==5.10.1 pyqt511: PyQt5==5.11.3 + pyqt512: PyQtWebEngine==5.12 commands = {envpython} scripts/link_pyqt.py --tox {envdir} {envpython} -bb -m pytest {posargs:tests} From b3e1bac11b08b0a25d227123c9fb21b60c6970cd Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Feb 2019 23:19:28 +0100 Subject: [PATCH 466/492] travis: Allow Qt 5.12 to fail for now See #4478 --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index d2e62c14a..ebd2307d9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,6 +51,10 @@ matrix: env: TESTENV=shellcheck services: docker fast_finish: true + allow_failures: + - env: DOCKER=archlinux-webengine QUTE_BDD_WEBENGINE=true + services: docker + - env: TESTENV=py36-pyqt512 cache: directories: From 8d5aef6f6ee7f90ae8ada3f58e771971d637e615 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 00:01:32 +0100 Subject: [PATCH 467/492] Add new warning to qt_log_ignore This gets shown from time to time in test_take_a_tab_from_the_same_window in tabs.feature. --- pytest.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/pytest.ini b/pytest.ini index 49f23359b..15ce2993e 100644 --- a/pytest.ini +++ b/pytest.ini @@ -65,6 +65,7 @@ qt_log_ignore = ^Icon theme ".*" not found ^Error receiving trust for a CA certificate ^QBackingStore::endPaint\(\) called with active painter on backingstore paint device + ^QPaintDevice: Cannot destroy paint device that is being painted xfail_strict = true filterwarnings = error From 0599e11dd42aaa48b1ce8fce9b4b59458bc97ca8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 00:40:40 +0100 Subject: [PATCH 468/492] Update _chromium_version comment --- qutebrowser/utils/version.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index 750a13383..4abf041d3 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -324,7 +324,7 @@ def _chromium_version(): Qt 5.9: Chromium 56 (LTS) 56.0.2924.122 (2017-01-25) - 5.9.6: Security fixes up to 66.0.3359.170 (2018-05-10) + 5.9.7: Security fixes up to 69.0.3497.113 (2018-09-27) Qt 5.10: Chromium 61 61.0.3163.140 (2017-09-05) @@ -332,11 +332,13 @@ def _chromium_version(): Qt 5.11: Chromium 65 65.0.3325.151 (.1: .230) (2018-03-06) - 5.11.2: Security fixes up to 68.0.3440.75 (2018-07-24) + 5.11.3: Security fixes up to 70.0.3538.102 (2018-11-09) Qt 5.12: Chromium 69 - 69.0.3497.128 (~2018-09-17) - 5.12.0: Security fixes up to 70.0.3538.67 (2018-10-16) + (LTS) 69.0.3497.113 (2018-09-27) + 5.12.1: Security fixes up to 71.0.3578.94 (2018-12-14) + + Qt 5.13: (in development) Chromium 71 merged, 73 in review. Also see https://www.chromium.org/developers/calendar and https://chromereleases.googleblog.com/ From 267537d58ab30ac405acdc0e25fd9eefd91df413 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 14:58:54 +0100 Subject: [PATCH 469/492] Implement basic client certificate support Certificate selection when there are multiple matches isn't implemented yet. See #3992, #3011, #4587. --- doc/changelog.asciidoc | 2 ++ qutebrowser/browser/webengine/webenginetab.py | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 9b318a07a..ac1a9f898 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -35,6 +35,8 @@ Added are used for hints, and also allows adding custom hint groups. - New `:yank markdown` feature which yanks the current URL and title in markdown format. +- Basic support for client certificates with Qt 5.12. Selecting the certificate + to show when there are multiple matching certificates isn't implemented yet. Changed ~~~~~~~ diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 60a9379d4..3965c00cf 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1463,6 +1463,37 @@ class WebEngineTab(browsertab.AbstractTab): if reload_needed: self._reload_url = navigation.url + def _on_select_client_certificate(self, selection): + """Handle client certificates. + + Currently, we simply pick the first available certificate and show an + additional note if there are multiple matches. + """ + certificate = selection.certificates()[0] + text = ('Subject: {subj}
' + 'Issuer: {issuer}
' + 'Serial: {serial}'.format( + subj=html_utils.escape(certificate.subjectDisplayName()), + issuer=html_utils.escape(certificate.issuerDisplayName()), + serial=bytes(certificate.serialNumber()).decode('ascii'))) + if len(selection.certificates()) > 1: + text += ('

Note: Multiple matching certificates ' + 'were found, but certificate selection is not ' + 'implemented yet!') + urlstr = selection.host().host() + + present = message.ask( + title='Present client certificate to {}?'.format(urlstr), + text=text, + mode=usertypes.PromptMode.yesno, + abort_on=[self.shutting_down, self.load_started], + url=urlstr) + + if present: + selection.select(certificate) + else: + selection.selectNone() + def _connect_signals(self): view = self._widget page = view.page() @@ -1479,6 +1510,8 @@ class WebEngineTab(browsertab.AbstractTab): page.navigation_request.connect(self._on_navigation_request) try: page.printRequested.connect(self._on_print_requested) + page.selectClientCertificate.connect( + self._on_select_client_certificate) except AttributeError: # Added in Qt 5.12 pass From 82f8fc658dcbd6fdb92e99895fd8bb77c4f32c60 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 15:11:51 +0100 Subject: [PATCH 470/492] Expose abort_questions signal in WebEngineTab --- qutebrowser/browser/webengine/webenginetab.py | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 3965c00cf..b5fd72e66 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -715,8 +715,6 @@ class _WebEnginePermissions(QObject): """Handling of various permission-related signals.""" - _abort_questions = pyqtSignal() - def __init__(self, tab, parent=None): super().__init__(parent) self._tab = tab @@ -736,9 +734,6 @@ class _WebEnginePermissions(QObject): page.registerProtocolHandlerRequested.connect( self._on_register_protocol_handler_requested) - self._tab.shutting_down.connect(self._abort_questions) - self._tab.load_started.connect(self._abort_questions) - @pyqtSlot('QWebEngineFullScreenRequest') def _on_fullscreen_requested(self, request): request.accept() @@ -816,7 +811,7 @@ class _WebEnginePermissions(QObject): question = shared.feature_permission( url=url, option=options[feature], msg=messages[feature], yes_action=yes_action, no_action=no_action, - abort_on=[self._abort_questions]) + abort_on=[self._tab.abort_questions]) if question is not None: page.featurePermissionRequestCanceled.connect( @@ -844,7 +839,7 @@ class _WebEnginePermissions(QObject): option='content.persistent_storage', msg='use {} of persistent storage'.format(size), yes_action=request.accept, no_action=request.reject, - abort_on=[self._abort_questions], + abort_on=[self._tab.abort_questions], blocking=True) def _on_register_protocol_handler_requested(self, request): @@ -853,7 +848,7 @@ class _WebEnginePermissions(QObject): option='content.register_protocol_handler', msg='open all {} links'.format(request.scheme()), yes_action=request.accept, no_action=request.reject, - abort_on=[self._abort_questions], + abort_on=[self._tab.abort_questions], blocking=True) @@ -1080,10 +1075,13 @@ class WebEngineTab(browsertab.AbstractTab): Signals: _load_finished_fake: Used in place of unreliable loadFinished + abort_questions: Emitted when a new load started or we're shutting + down. """ # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-65223 _load_finished_fake = pyqtSignal(bool) + abort_questions = pyqtSignal() def __init__(self, *, win_id, mode_manager, private, parent=None): super().__init__(win_id=win_id, private=private, parent=parent) @@ -1256,7 +1254,7 @@ class WebEngineTab(browsertab.AbstractTab): answer = message.ask( title="Proxy authentication required", text=msg, mode=usertypes.PromptMode.user_pwd, - abort_on=[self.shutting_down, self.load_started], url=urlstr) + abort_on=[self.abort_questions], url=urlstr) if answer is not None: authenticator.setUser(answer.user) authenticator.setPassword(answer.password) @@ -1278,9 +1276,8 @@ class WebEngineTab(browsertab.AbstractTab): if not netrc_success: log.network.debug("Asking for credentials") - abort_on = [self.shutting_down, self.load_started] - answer = shared.authentication_required(url, authenticator, - abort_on) + answer = shared.authentication_required( + url, authenticator, abort_on=[self.abort_questions]) if not netrc_success and answer is None: log.network.debug("Aborting auth") try: @@ -1389,7 +1386,7 @@ class WebEngineTab(browsertab.AbstractTab): if error.is_overridable(): error.ignore = shared.ignore_certificate_errors( - url, [error], abort_on=[self.shutting_down, self.load_started]) + url, [error], abort_on=[self.abort_questions]) else: log.webview.error("Non-overridable certificate error: " "{}".format(error)) @@ -1486,7 +1483,7 @@ class WebEngineTab(browsertab.AbstractTab): title='Present client certificate to {}?'.format(urlstr), text=text, mode=usertypes.PromptMode.yesno, - abort_on=[self.shutting_down, self.load_started], + abort_on=[self.abort_questions], url=urlstr) if present: @@ -1536,6 +1533,8 @@ class WebEngineTab(browsertab.AbstractTab): page.loadFinished.connect(self._on_load_finished) self.before_load_started.connect(self._on_before_load_started) + self.shutting_down.connect(self.abort_questions) + self.load_started.connect(self.abort_questions) # pylint: disable=protected-access self.audio._connect_signals() From 6305eb7860e754db08c957cd0708f94b78bac697 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 15:16:39 +0100 Subject: [PATCH 471/492] Add comment in render_widget() --- qutebrowser/browser/webengine/webview.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qutebrowser/browser/webengine/webview.py b/qutebrowser/browser/webengine/webview.py index e70226f30..9023bf037 100644 --- a/qutebrowser/browser/webengine/webview.py +++ b/qutebrowser/browser/webengine/webview.py @@ -64,6 +64,8 @@ class WebEngineView(QWebEngineView): Normally, this would always be the focusProxy(). However, it sometimes isn't, so we use this as a WORKAROUND for https://bugreports.qt.io/browse/QTBUG-68727 + + This got introduced in Qt 5.11.0 and fixed in 5.12.0. """ if 'lost-focusproxy' not in objreg.get('args').debug_flags: proxy = self.focusProxy() From 0aa3a280f218f39606c52d74b41a3cd100c0cfa1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 16:03:14 +0100 Subject: [PATCH 472/492] Consistent spacing --- qutebrowser/browser/webengine/webenginesettings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qutebrowser/browser/webengine/webenginesettings.py b/qutebrowser/browser/webengine/webenginesettings.py index 379051f6b..69b9d0319 100644 --- a/qutebrowser/browser/webengine/webenginesettings.py +++ b/qutebrowser/browser/webengine/webenginesettings.py @@ -164,6 +164,7 @@ class WebEngineSettings(websettings.AbstractSettings): # Qt 5.8 'content.print_element_backgrounds': ('PrintElementBackgrounds', None), + # Qt 5.11 'content.autoplay': ('PlaybackRequiresUserGesture', operator.not_), From 152abb0d64b8c3a3c0afc8427a006e24c1b284d1 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 16:03:55 +0100 Subject: [PATCH 473/492] Update docs --- doc/changelog.asciidoc | 1 + doc/help/settings.asciidoc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index f484ee34c..13095e98f 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -37,6 +37,7 @@ Added markdown format. - Basic support for client certificates with Qt 5.12. Selecting the certificate to show when there are multiple matching certificates isn't implemented yet. +- Support for DNS prefetching (`content.dns_prefetch`) with QtWebEngine on 5.12. Changed ~~~~~~~ diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index eb3907cce..eab51a16b 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -1647,7 +1647,7 @@ Type: <> Default: +pass:[true]+ -This setting is only available with the QtWebKit backend. +On QtWebEngine, this setting requires Qt 5.12 or newer. [[content.frame_flattening]] === content.frame_flattening From 4c54ebf70fc10771dac39d5da79a9e94b1240297 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 16:32:09 +0100 Subject: [PATCH 474/492] Allow unique initiator requests to qute://testdata In tests/unit/browser/test_caret.py in the test TestFollowSelected::test_follow_selected_with_link we follow a link from qute://testdata/data/caret.html to qute://testdata/data/hello.txt. For some reason, Qt 5.12 treats that as an unique/opaque origin with Qt 5.12, causing the request to be blocked and the test to fail. To avoid this, we now allow all opaque requests to qute://testdata URLs. This isn't a problem because a qute://testdata handler is only registered inside tests anyways. See #4478 --- .../browser/webengine/webenginequtescheme.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginequtescheme.py b/qutebrowser/browser/webengine/webenginequtescheme.py index 816589514..821fc49dc 100644 --- a/qutebrowser/browser/webengine/webenginequtescheme.py +++ b/qutebrowser/browser/webengine/webenginequtescheme.py @@ -62,18 +62,33 @@ class QuteSchemeHandler(QWebEngineUrlSchemeHandler): """ try: initiator = job.initiator() + request_url = job.requestUrl() except AttributeError: # Added in Qt 5.11 return True - if initiator == QUrl('null') and not qtutils.version_check('5.12'): + # https://codereview.qt-project.org/#/c/234849/ + is_opaque = initiator == QUrl('null') + target = request_url.scheme(), request_url.host() + + if is_opaque and not qtutils.version_check('5.12'): # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-70421 + # When we don't register the qute:// scheme, all requests are + # flagged as opaque. + return True + + if (target == ('qute', 'testdata') and + is_opaque and + qtutils.version_check('5.12')): + # Allow requests to qute://testdata, as this is needed in Qt 5.12 + # for all tests to work properly. No qute://testdata handler is + # installed outside of tests. return True if initiator.isValid() and initiator.scheme() != 'qute': log.misc.warning("Blocking malicious request from {} to {}".format( initiator.toDisplayString(), - job.requestUrl().toDisplayString())) + request_url.toDisplayString())) job.fail(QWebEngineUrlRequestJob.RequestDenied) return False From 39cc35225369d90625fd084fc588f14824929e01 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 17:09:25 +0100 Subject: [PATCH 475/492] Refactor qute://settings CSRF tests --- tests/end2end/features/qutescheme.feature | 46 ++++--------------- tests/end2end/features/test_qutescheme_bdd.py | 37 +++++++++++++++ 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/tests/end2end/features/qutescheme.feature b/tests/end2end/features/qutescheme.feature index fd41515a5..35c110dc5 100644 --- a/tests/end2end/features/qutescheme.feature +++ b/tests/end2end/features/qutescheme.feature @@ -142,29 +142,25 @@ Feature: Special qute:// pages And I press the key "" Then "Invalid value 'foo' *" should be logged - @qtwebkit_skip - Scenario: qute://settings CSRF via img (webengine) + Scenario: qute://settings CSRF via img When I open data/misc/qutescheme_csrf.html And I run :click-element id via-img - Then "Blocking malicious request from http://localhost:*/data/misc/qutescheme_csrf.html to qute://settings/set?*" should be logged + Then the img request should be blocked - @qtwebkit_skip - Scenario: qute://settings CSRF via link (webengine) + Scenario: qute://settings CSRF via link When I open data/misc/qutescheme_csrf.html And I run :click-element id via-link - Then "Blocking malicious request from qute://settings/set?* to qute://settings/set?*" should be logged + Then the link request should be blocked - @qtwebkit_skip - Scenario: qute://settings CSRF via redirect (webengine) + Scenario: qute://settings CSRF via redirect When I open data/misc/qutescheme_csrf.html And I run :click-element id via-redirect - Then "Blocking malicious request from qute://settings/set?* to qute://settings/set?*" should be logged + Then the redirect request should be blocked - @qtwebkit_skip - Scenario: qute://settings CSRF via form (webengine) + Scenario: qute://settings CSRF via form When I open data/misc/qutescheme_csrf.html And I run :click-element id via-form - Then "Blocking malicious request from qute://settings/set?* to qute://settings/set?*" should be logged + Then the form request should be blocked @qtwebkit_skip Scenario: qute://settings CSRF token (webengine) @@ -173,32 +169,6 @@ Feature: Special qute:// pages Then "RequestDeniedError while handling qute://* URL" should be logged And the error "Invalid CSRF token for qute://settings!" should be shown - @qtwebengine_skip - Scenario: qute://settings CSRF via img (webkit) - When I open data/misc/qutescheme_csrf.html - And I run :click-element id via-img - Then "Blocking malicious request from http://localhost:*/data/misc/qutescheme_csrf.html to qute://settings/set?*" should be logged - - @qtwebengine_skip - Scenario: qute://settings CSRF via link (webkit) - When I open data/misc/qutescheme_csrf.html - And I run :click-element id via-link - Then "Blocking malicious request from http://localhost:*/data/misc/qutescheme_csrf.html to qute://settings/set?*" should be logged - And "Error while loading qute://settings/set?*: Invalid qute://settings request" should be logged - - @qtwebengine_skip - Scenario: qute://settings CSRF via redirect (webkit) - When I open data/misc/qutescheme_csrf.html - And I run :click-element id via-redirect - Then "Blocking malicious request from http://localhost:*/data/misc/qutescheme_csrf.html to qute://settings/set?*" should be logged - And "Error while loading qute://settings/set?*: Invalid qute://settings request" should be logged - - @qtwebengine_skip - Scenario: qute://settings CSRF via form (webkit) - When I open data/misc/qutescheme_csrf.html - And I run :click-element id via-form - Then "Error while loading qute://settings/set?*: Unsupported request type" should be logged - # pdfjs support Scenario: pdfjs is used for pdf files diff --git a/tests/end2end/features/test_qutescheme_bdd.py b/tests/end2end/features/test_qutescheme_bdd.py index 2245143f7..a4335640e 100644 --- a/tests/end2end/features/test_qutescheme_bdd.py +++ b/tests/end2end/features/test_qutescheme_bdd.py @@ -17,5 +17,42 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . +import re + import pytest_bdd as bdd bdd.scenarios('qutescheme.feature') + + +@bdd.then(bdd.parsers.parse("the {kind} request should be blocked")) +def request_blocked(request, quteproc, kind): + blocking_set_msg = ( + "Blocking malicious request from qute://settings/set?* to " + "qute://settings/set?*") + blocking_csrf_msg = ( + "Blocking malicious request from " + "http://localhost:*/data/misc/qutescheme_csrf.html to " + "qute://settings/set?*") + webkit_error_invalid = ( + "Error while loading qute://settings/set?*: Invalid qute://settings " + "request") + webkit_error_unsupported = ( + "Error while loading qute://settings/set?*: Unsupported request type") + + if request.config.webengine: + expected_messages = { + 'img': [blocking_csrf_msg], + 'link': [blocking_set_msg], + 'redirect': [blocking_set_msg], + 'form': [blocking_set_msg], + } + else: # QtWebKit + expected_messages = { + 'img': [blocking_csrf_msg], + 'link': [blocking_csrf_msg, webkit_error_invalid], + 'redirect': [blocking_csrf_msg, webkit_error_invalid], + 'form': [webkit_error_unsupported], + } + + for pattern in expected_messages[kind]: + msg = quteproc.wait_for(message=pattern) + msg.expected = True From 64f7692d749df2999eaa50bcbabc1bdcaccfd351 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 17:14:33 +0100 Subject: [PATCH 476/492] Update qute://settings CSRF tests for Qt 5.12 See #4478 --- tests/end2end/features/test_qutescheme_bdd.py | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/end2end/features/test_qutescheme_bdd.py b/tests/end2end/features/test_qutescheme_bdd.py index a4335640e..9976d0785 100644 --- a/tests/end2end/features/test_qutescheme_bdd.py +++ b/tests/end2end/features/test_qutescheme_bdd.py @@ -20,6 +20,10 @@ import re import pytest_bdd as bdd + +from qutebrowser.utils import qtutils + + bdd.scenarios('qutescheme.feature') @@ -32,13 +36,27 @@ def request_blocked(request, quteproc, kind): "Blocking malicious request from " "http://localhost:*/data/misc/qutescheme_csrf.html to " "qute://settings/set?*") + blocking_js_msg = ( + "[http://localhost:*/data/misc/qutescheme_csrf.html:0] Not allowed to " + "load local resource: qute://settings/set?*" + ) + webkit_error_invalid = ( "Error while loading qute://settings/set?*: Invalid qute://settings " "request") webkit_error_unsupported = ( "Error while loading qute://settings/set?*: Unsupported request type") - if request.config.webengine: + if request.config.webengine and qtutils.version_check('5.12'): + # On Qt 5.12, we mark qute:// as a local scheme, causing most requests + # being blocked by Chromium internally (logging to the JS console). + expected_messages = { + 'img': [blocking_js_msg], + 'link': [blocking_js_msg], + 'redirect': [blocking_set_msg], + 'form': [blocking_js_msg], + } + elif request.config.webengine: expected_messages = { 'img': [blocking_csrf_msg], 'link': [blocking_set_msg], From d97a186992fee93e137820e8e942ca3993680e37 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 17:29:27 +0100 Subject: [PATCH 477/492] Use qtutils.version_check to check for signal availability With Qt 5.12 but an older PyQt, it looks like the attributes are available, but connecting fails with: TypeError: C++ type 'QWebEngineClientCertificateSelection' is not supported as a signal argument type Let's ensure we require both a new Qt and PyQt instead. --- qutebrowser/browser/webengine/webenginetab.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index b5fd72e66..8f84779c4 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -1505,13 +1505,11 @@ class WebEngineTab(browsertab.AbstractTab): self._on_proxy_authentication_required) page.contentsSizeChanged.connect(self.contents_size_changed) page.navigation_request.connect(self._on_navigation_request) - try: + + if qtutils.version_check('5.12'): page.printRequested.connect(self._on_print_requested) page.selectClientCertificate.connect( self._on_select_client_certificate) - except AttributeError: - # Added in Qt 5.12 - pass view.titleChanged.connect(self.title_changed) view.urlChanged.connect(self._on_url_changed) From 04764b9c39ef082784c7d5ca4457b4647deff7f8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 17:53:17 +0100 Subject: [PATCH 478/492] Adjust filename suffix matching for Qt 5.12 https://codereview.qt-project.org/#/c/247517/ https://chromium-review.googlesource.com/c/chromium/src/+/1278137 https://cs.chromium.org/chromium/src/base/time/time_to_iso8601.cc Fixes #4478 Fixes #4580 --- .../browser/webengine/webenginedownloads.py | 16 +++++++++++++++- .../browser/webengine/test_webenginedownloads.py | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/webengine/webenginedownloads.py b/qutebrowser/browser/webengine/webenginedownloads.py index 6dde42070..077ea775b 100644 --- a/qutebrowser/browser/webengine/webenginedownloads.py +++ b/qutebrowser/browser/webengine/webenginedownloads.py @@ -180,7 +180,21 @@ def _get_suggested_filename(path): See https://bugreports.qt.io/browse/QTBUG-56978 """ filename = os.path.basename(path) - filename = re.sub(r'\([0-9]+\)(?=\.|$)', '', filename) + + suffix_re = re.compile(r""" + \ ? # Optional space between filename and suffix + ( + # Numerical suffix + \([0-9]+\) + | + # ISO-8601 suffix + # https://cs.chromium.org/chromium/src/base/time/time_to_iso8601.cc + \ -\ \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z + ) + (?=\.|$) # Begin of extension, or filename without extension + """, re.VERBOSE) + + filename = suffix_re.sub('', filename) if not qtutils.version_check('5.9', compiled=False): # https://bugreports.qt.io/browse/QTBUG-58155 filename = urllib.parse.unquote(filename) diff --git a/tests/unit/browser/webengine/test_webenginedownloads.py b/tests/unit/browser/webengine/test_webenginedownloads.py index a34962522..4ca447f56 100644 --- a/tests/unit/browser/webengine/test_webenginedownloads.py +++ b/tests/unit/browser/webengine/test_webenginedownloads.py @@ -30,6 +30,8 @@ from helpers import utils @pytest.mark.parametrize('path, expected', [ (os.path.join('subfolder', 'foo'), 'foo'), ('foo(1)', 'foo'), + ('foo (1)', 'foo'), + ('foo - 1970-01-01T00:00:00.000Z', 'foo'), ('foo(a)', 'foo(a)'), ('foo1', 'foo1'), pytest.param('foo%20bar', 'foo bar', marks=utils.qt58), From a2c79084143644ad1efb783a7991ef870cbb49f3 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 18:53:47 +0100 Subject: [PATCH 479/492] Remove unused import --- tests/end2end/features/test_qutescheme_bdd.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/end2end/features/test_qutescheme_bdd.py b/tests/end2end/features/test_qutescheme_bdd.py index 9976d0785..ae66e24d0 100644 --- a/tests/end2end/features/test_qutescheme_bdd.py +++ b/tests/end2end/features/test_qutescheme_bdd.py @@ -17,8 +17,6 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -import re - import pytest_bdd as bdd from qutebrowser.utils import qtutils From 194cf85ab76708219680d325d70caa7c5c2f3d4c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 18:59:58 +0100 Subject: [PATCH 480/492] Remove useless suppression Now my local pylint and Travis suddenly agree again? --- qutebrowser/browser/webkit/network/networkreply.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qutebrowser/browser/webkit/network/networkreply.py b/qutebrowser/browser/webkit/network/networkreply.py index 72e03b9eb..139f8b462 100644 --- a/qutebrowser/browser/webkit/network/networkreply.py +++ b/qutebrowser/browser/webkit/network/networkreply.py @@ -34,8 +34,7 @@ class FixedDataNetworkReply(QNetworkReply): """QNetworkReply subclass for fixed data.""" - def __init__(self, request, # pylint: disable=invalid-name - fileData, mimeType, parent=None): # noqa: N803 + def __init__(self, request, fileData, mimeType, parent=None): # noqa: N803 """Constructor. Args: From ed6ca9739787aa13e2c296ca08eae4eec6649477 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 21:01:53 +0100 Subject: [PATCH 481/492] travis: Restructure --- .travis.yml | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ebd2307d9..45bf8e688 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,50 +6,79 @@ os: linux matrix: include: + ### Archlinux QtWebKit - env: DOCKER=archlinux services: docker + + ### Archlinux QtWebEngine - env: DOCKER=archlinux-webengine QUTE_BDD_WEBENGINE=true services: docker - - env: TESTENV=py36-pyqt571 + + ### PyQt 5.7.1 (Python 3.5) - python: 3.5 env: TESTENV=py35-pyqt571 + ### PyQt 5.7.1 + - env: TESTENV=py36-pyqt571 + + ### PyQt 5.9 - env: TESTENV=py36-pyqt59 + + ### PyQt 5.10 - env: TESTENV=py36-pyqt510 addons: apt: packages: - xfonts-base + + ### PyQt 5.11 (with coverage) - env: TESTENV=py36-pyqt511-cov + ### PyQt 5.11 (Python 3.7) - python: 3.7 env: TESTENV=py37-pyqt511 + + ### PyQt 5.12 - env: TESTENV=py36-pyqt512 + + ### macOS sierra - os: osx env: TESTENV=py37 OSX=sierra osx_image: xcode9.2 language: generic + ### macOS yosemite # https://github.com/qutebrowser/qutebrowser/issues/2013 # - os: osx # env: TESTENV=py35 OSX=yosemite # osx_image: xcode6.4 + + ### pylint/flake8/mypy - env: TESTENV=pylint - env: TESTENV=flake8 - env: TESTENV=mypy + + ### docs - env: TESTENV=docs addons: apt: packages: - asciidoc + + ### vulture/misc/pyroma/check-manifest - env: TESTENV=vulture - env: TESTENV=misc - env: TESTENV=pyroma - env: TESTENV=check-manifest + + ### eslint - env: TESTENV=eslint language: node_js python: null node_js: "lts/*" + + ### shellcheck - language: generic env: TESTENV=shellcheck services: docker + fast_finish: true allow_failures: - env: DOCKER=archlinux-webengine QUTE_BDD_WEBENGINE=true From 34b2e5bec1489f3b746f33d39ccaba5e6209d1e7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 21:02:54 +0100 Subject: [PATCH 482/492] travis: Use PyPI PyQt for macOS The Homebrew PyQt is quite out of date (5.10), and this is probably faster. --- .travis.yml | 2 +- scripts/dev/ci/travis_install.sh | 32 +------------------------------- 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45bf8e688..a07fc2279 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,7 +41,7 @@ matrix: ### macOS sierra - os: osx - env: TESTENV=py37 OSX=sierra + env: TESTENV=py37-pyqt511 OSX=sierra osx_image: xcode9.2 language: generic ### macOS yosemite diff --git a/scripts/dev/ci/travis_install.sh b/scripts/dev/ci/travis_install.sh index c736a01d3..064f4098a 100644 --- a/scripts/dev/ci/travis_install.sh +++ b/scripts/dev/ci/travis_install.sh @@ -53,43 +53,13 @@ npm_install() { travis_retry npm install -g "$@" } -check_pyqt() { - python3 < Date: Sun, 17 Feb 2019 21:03:46 +0100 Subject: [PATCH 483/492] Update macOS commandline in travis_run --- scripts/dev/ci/travis_run.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/dev/ci/travis_run.sh b/scripts/dev/ci/travis_run.sh index 4e338221f..eb1248d96 100644 --- a/scripts/dev/ci/travis_run.sh +++ b/scripts/dev/ci/travis_run.sh @@ -26,7 +26,8 @@ elif [[ $TESTENV == shellcheck ]]; then koalaman/shellcheck:latest "${scripts[@]}" else args=() - [[ $TRAVIS_OS_NAME == osx ]] && args=('--qute-bdd-webengine' '--no-xvfb' 'tests/unit') + # We only run unit tests on macOS because it's quite slow. + [[ $TRAVIS_OS_NAME == osx ]] && args+=('--qute-bdd-webengine' '--no-xvfb' 'tests/unit') # WORKAROUND for unknown crash inside swrast_dri.so # See https://github.com/qutebrowser/qutebrowser/pull/4218#issuecomment-421931770 From 2b262f6f78b1500b35b192340618461b441d4a2e Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 21:04:37 +0100 Subject: [PATCH 484/492] travis: Install libxkbcommon for PyQt 5.12 See https://www.riverbankcomputing.com/pipermail/pyqt/2019-February/041363.html Fixes #4478 --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index a07fc2279..9d8eaeae5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,6 +38,10 @@ matrix: ### PyQt 5.12 - env: TESTENV=py36-pyqt512 + addons: + apt: + packages: + - libxkbcommon-x11-0 ### macOS sierra - os: osx From 31c2fe2c72cc203d3416d41ea37ddcfa89a57a6f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 21:41:56 +0100 Subject: [PATCH 485/492] travis: Remove allow_failures --- .travis.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9d8eaeae5..061810ee8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ python: 3.6 os: linux matrix: + fast_finish: true include: ### Archlinux QtWebKit - env: DOCKER=archlinux @@ -83,12 +84,6 @@ matrix: env: TESTENV=shellcheck services: docker - fast_finish: true - allow_failures: - - env: DOCKER=archlinux-webengine QUTE_BDD_WEBENGINE=true - services: docker - - env: TESTENV=py36-pyqt512 - cache: directories: - $HOME/.cache/pip From 17846ea3862c2394679355d4d851b4b8bc813112 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Feb 2019 22:39:58 +0100 Subject: [PATCH 486/492] Skip flaky test --- tests/end2end/features/sessions.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/end2end/features/sessions.feature b/tests/end2end/features/sessions.feature index 626a88ba8..494feb0ba 100644 --- a/tests/end2end/features/sessions.feature +++ b/tests/end2end/features/sessions.feature @@ -228,7 +228,7 @@ Feature: Saving and loading sessions url: http://localhost:*/data/hello.txt # Seems like that bug is fixed upstream in QtWebEngine - @qtwebkit_skip @flaky + @skip # Too flaky Scenario: Saving a session with a page using history.replaceState() and navigating away When I open data/sessions/history_replace_state.html without waiting And I wait for "* Called history.replaceState" in the log From be26efddd33e3e9ab3b15e734a7ac01544203826 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 21 Feb 2019 13:29:06 +0100 Subject: [PATCH 487/492] Disallow PAC proxies with QtWebEngine See #4577 --- doc/changelog.asciidoc | 2 ++ qutebrowser/browser/network/pac.py | 2 ++ qutebrowser/browser/network/proxy.py | 22 ++++++++++++++++++++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 13095e98f..d1890bcb6 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -85,6 +85,8 @@ Fixed - The outdated header `X-Do-Not-Track` is no longer sent. - A javascript error on page load when using Qt 5.12 was fixed. - `window.print()` works with Qt 5.12 now. +- PAC proxies were never correctly supported with QtWebEngine, but are now + explicitly disallowed. v1.5.2 ------ diff --git a/qutebrowser/browser/network/pac.py b/qutebrowser/browser/network/pac.py index bd060820b..47bb1e537 100644 --- a/qutebrowser/browser/network/pac.py +++ b/qutebrowser/browser/network/pac.py @@ -208,6 +208,8 @@ class PACResolver: Return: A list of QNetworkProxy objects in order of preference. """ + qtutils.ensure_valid(query.url()) + if from_file: string_flags = QUrl.PrettyDecoded else: diff --git a/qutebrowser/browser/network/proxy.py b/qutebrowser/browser/network/proxy.py index d3e25c23c..f5685ea25 100644 --- a/qutebrowser/browser/network/proxy.py +++ b/qutebrowser/browser/network/proxy.py @@ -20,10 +20,12 @@ """Handling of proxies.""" +from PyQt5.QtCore import QUrl from PyQt5.QtNetwork import QNetworkProxy, QNetworkProxyFactory from qutebrowser.config import config, configtypes -from qutebrowser.utils import objreg +from qutebrowser.utils import objreg, message, usertypes, urlutils +from qutebrowser.misc import objects from qutebrowser.browser.network import pac @@ -33,6 +35,18 @@ def init(): objreg.register('proxy-factory', proxy_factory) QNetworkProxyFactory.setApplicationProxyFactory(proxy_factory) + config.instance.changed.connect(_warn_for_pac) + _warn_for_pac() + + +@config.change_filter('content.proxy', function=True) +def _warn_for_pac(): + """Show a warning if PAC is used with QtWebEngine.""" + proxy = config.val.content.proxy + if (isinstance(proxy, pac.PACFetcher) and + objects.backend == usertypes.Backend.QtWebEngine): + message.error("PAC support isn't implemented for QtWebEngine yet!") + def shutdown(): QNetworkProxyFactory.setApplicationProxyFactory(None) @@ -70,7 +84,11 @@ class ProxyFactory(QNetworkProxyFactory): # ref. http://doc.qt.io/qt-5/qnetworkproxyfactory.html#systemProxyForQuery proxies = QNetworkProxyFactory.systemProxyForQuery(query) elif isinstance(proxy, pac.PACFetcher): - proxies = proxy.resolve(query) + if objects.backend == usertypes.Backend.QtWebEngine: + # Looks like query.url() is always invalid on QtWebEngine... + proxies = [urlutils.proxy_from_url(QUrl('direct://'))] + else: + proxies = proxy.resolve(query) else: proxies = [proxy] for p in proxies: From 03e7fdf507bd5f2750f51c0c412524c884f645e7 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 21 Feb 2019 13:31:10 +0100 Subject: [PATCH 488/492] Update _chromium_version comment --- qutebrowser/utils/version.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index 4abf041d3..962e328d6 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -337,6 +337,7 @@ def _chromium_version(): Qt 5.12: Chromium 69 (LTS) 69.0.3497.113 (2018-09-27) 5.12.1: Security fixes up to 71.0.3578.94 (2018-12-14) + 5.12.2: Security fixes up to 72.0.3626.96 (2019-02-06) Qt 5.13: (in development) Chromium 71 merged, 73 in review. From b10d84f31a511dd8e1a36019b60235f6a7f286ed Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 21 Feb 2019 14:11:30 +0100 Subject: [PATCH 489/492] Warn when combining Qt 5.12 with older Qt Fixes #4581 --- qutebrowser/misc/earlyinit.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index a2db81764..61ae1dbfc 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -173,8 +173,10 @@ def check_qt_version(): PYQT_VERSION_STR) from pkg_resources import parse_version from qutebrowser.utils import log + parsed_qversion = parse_version(qVersion()) + if (QT_VERSION < 0x050701 or PYQT_VERSION < 0x050700 or - parse_version(qVersion()) < parse_version('5.7.1')): + parsed_qversion < parse_version('5.7.1')): text = ("Fatal error: Qt >= 5.7.1 and PyQt >= 5.7 are required, " "but Qt {} / PyQt {} is installed.".format(qt_version(), PYQT_VERSION_STR)) @@ -184,6 +186,12 @@ def check_qt_version(): log.init.warning("Running qutebrowser with Qt 5.8 is untested and " "unsupported!") + if (parsed_qversion >= parse_version('5.12') and + (PYQT_VERSION < 0x050c00 or QT_VERSION < 0x050c00)): + log.init.warning("Combining PyQt {} with Qt {} is unsupported! Ensure " + "all versions are newer than 5.12 to avoid potential " + "issues.".format(PYQT_VERSION_STR, qt_version())) + def check_ssl_support(): """Check if SSL support is available.""" From 81889dd7bd087839dce399279c106efbdbbee539 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 21 Feb 2019 17:10:15 +0100 Subject: [PATCH 490/492] Update user agent completion Fixes #4575 --- doc/contributing.asciidoc | 1 + qutebrowser/config/configdata.yml | 44 +++++-------------------------- scripts/dev/ua_fetch.py | 31 +++------------------- 3 files changed, 10 insertions(+), 66 deletions(-) diff --git a/doc/contributing.asciidoc b/doc/contributing.asciidoc index dc52dd9a0..a9e266a1d 100644 --- a/doc/contributing.asciidoc +++ b/doc/contributing.asciidoc @@ -710,6 +710,7 @@ qutebrowser release * Update changelog (remove *(unreleased)*). * Adjust `__version_info__` in `qutebrowser/__init__.py`. +* Consider updating the completions for `content.headers.user_agent` in `configdata.yml`. * Commit. * Create annotated git tag (`git tag -s "v1.$x.$y" -m "Release v1.$x.$y"`). diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index 514d30263..b8f5235f4 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -478,46 +478,14 @@ content.headers.user_agent: # 'ua_fetch.py' # Vim-protip: Place your cursor below this comment and run # :r!python scripts/dev/ua_fetch.py - - - "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:53.0) Gecko/20100101 - Firefox/53.0" - - Firefox 53.0 Win8.1 - - - "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 - Firefox/53.0" - - Firefox 53.0 Linux - - - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) - Gecko/20100101 Firefox/53.0" - - Firefox 53.0 MacOSX - - - - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 - (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4" - - Safari Generic MacOSX - - - "Mozilla/5.0 (iPad; CPU OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 - (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1" - - Mobile Safari 10.0 iOS - - - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, - like Gecko) Chrome/58.0.3029.110 Safari/537.36" - - Chrome Generic Win10 - - - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 - (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" - - Chrome Generic MacOSX + like Gecko) Chrome/71.0.3578.98 Safari/537.36" + - Chrome 71.0 Win10 - - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like - Gecko) Chrome/58.0.3029.110 Safari/537.36" - - Chrome Generic Linux - - - - "Mozilla/5.0 (compatible; Googlebot/2.1; - +http://www.google.com/bot.html" - - Google Bot - - - "Wget/1.16.1 (linux-gnu)" - - wget 1.16.1 - - - "curl/7.40.0" - - curl 7.40.0 - - - "Mozilla/5.0 (Linux; U; Android 7.1.2) AppleWebKit/534.30 (KHTML, - like Gecko) Version/4.0 Mobile Safari/534.30" - - Mobile Generic Android - - - "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like - Gecko" - - IE 11.0 for Desktop Win7 64-bit + Gecko) Chrome/71.0.3578.98 Safari/537.36" + - Chrome 71.0 Linux + - - "" + - Use default QtWebKit/QtWebEngine User-Agent supports_pattern: true desc: >- diff --git a/scripts/dev/ua_fetch.py b/scripts/dev/ua_fetch.py index 75ce4c2f7..6547ad5de 100755 --- a/scripts/dev/ua_fetch.py +++ b/scripts/dev/ua_fetch.py @@ -75,42 +75,17 @@ def filter_list(complete_list, browsers): return table -def add_diversity(table): - """Insert a few additional entries for diversity into the dict. - - (as returned by filter_list()) - """ - table["Obscure"] = [ - ('Mozilla/5.0 (compatible; Googlebot/2.1; ' - '+http://www.google.com/bot.html', - "Google Bot"), - ('Wget/1.16.1 (linux-gnu)', - "wget 1.16.1"), - ('curl/7.40.0', - "curl 7.40.0"), - ('Mozilla/5.0 (Linux; U; Android 7.1.2) AppleWebKit/534.30 ' - '(KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - "Mobile Generic Android"), - ('Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like ' - 'Gecko', - "IE 11.0 for Desktop Win7 64-bit"), - ] - return table - - def main(): """Generate user agent code.""" fetched = fetch() lut = { - "Firefox": {"Win", "MacOSX", "Linux", "Android"}, - "Chrome": {"Win", "MacOSX", "Linux"}, - "Safari": {"MacOSX", "iOS"} + "Chrome": {"Win10", "Linux"}, } filtered = filter_list(fetched, lut) - filtered = add_diversity(filtered) + filtered["empty"] = [('', "Use default QtWebKit/QtWebEngine User-Agent")] tab = " " - for browser in ["Firefox", "Safari", "Chrome", "Obscure"]: + for browser in ["Chrome", "empty"]: for it in filtered[browser]: print('{}- - "{}"'.format(3 * tab, it[0])) desc = it[1].replace('\xa0', ' ').replace(' ', ' ') From 99c8b80a460d633c26d68ef8da55512a7df225e9 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 22 Feb 2019 10:22:09 +0100 Subject: [PATCH 491/492] Use i- as prefix for the IPC path on macOS With Qt 5.12, standarddir.runtime() gives us a path in /private/var/folders/... instead of /var/folders/... like before. Due to that change, the path length is 105 chars, which is too long for a named socket (104 seems to be okay). The complete name is just slightly too long, so using i- instead of ipc- fixes things... Fixes #4471 See #888 --- doc/changelog.asciidoc | 3 +++ qutebrowser/misc/ipc.py | 8 +++----- tests/unit/misc/test_ipc.py | 17 ++++++++--------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index d1890bcb6..bf07b4416 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -62,6 +62,9 @@ Changed `org.qutebrowser.qutebrowser.appdata.xml`. - The `qute-pass` userscript now understands domains in gpg filenames in addition to directory names. +- macOS: The IPC socket path used to communicate with existing instances + changed due to changes in Qt 5.12. Please make sure to quit qutebrowser + before upgrading. Fixed ~~~~~ diff --git a/qutebrowser/misc/ipc.py b/qutebrowser/misc/ipc.py index 3c718de7b..ef913f94b 100644 --- a/qutebrowser/misc/ipc.py +++ b/qutebrowser/misc/ipc.py @@ -65,11 +65,9 @@ def _get_socketname(basedir): data_to_hash = '-'.join(parts_to_hash).encode('utf-8') md5 = hashlib.md5(data_to_hash).hexdigest() - target_dir = standarddir.runtime() - - parts = ['ipc'] - parts.append(md5) - return os.path.join(target_dir, '-'.join(parts)) + prefix = 'i-' if utils.is_mac else 'ipc-' + filename = '{}{}'.format(prefix, md5) + return os.path.join(standarddir.runtime(), filename) class Error(Exception): diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py index dd2efcbb1..c363249f8 100644 --- a/tests/unit/misc/test_ipc.py +++ b/tests/unit/misc/test_ipc.py @@ -177,11 +177,6 @@ def md5(inp): class TestSocketName: - POSIX_TESTS = [ - (None, 'ipc-{}'.format(md5('testusername'))), - ('/x', 'ipc-{}'.format(md5('testusername-/x'))), - ] - WINDOWS_TESTS = [ (None, 'qutebrowser-testusername'), ('/x', 'qutebrowser-testusername-{}'.format(md5('/x'))), @@ -203,7 +198,10 @@ class TestSocketName: assert socketname == expected @pytest.mark.mac - @pytest.mark.parametrize('basedir, expected', POSIX_TESTS) + @pytest.mark.parametrize('basedir, expected', [ + (None, 'i-{}'.format(md5('testusername'))), + ('/x', 'i-{}'.format(md5('testusername-/x'))), + ]) def test_mac(self, basedir, expected): socketname = ipc._get_socketname(basedir) parts = socketname.split(os.sep) @@ -211,7 +209,10 @@ class TestSocketName: assert parts[-1] == expected @pytest.mark.linux - @pytest.mark.parametrize('basedir, expected', POSIX_TESTS) + @pytest.mark.parametrize('basedir, expected', [ + (None, 'ipc-{}'.format(md5('testusername'))), + ('/x', 'ipc-{}'.format(md5('testusername-/x'))), + ]) def test_linux(self, basedir, fake_runtime_dir, expected): socketname = ipc._get_socketname(basedir) expected_path = str(fake_runtime_dir / 'qutebrowser' / expected) @@ -630,8 +631,6 @@ class TestSendOrListen: assert ret_client is None @pytest.mark.posix(reason="Unneeded on Windows") - @pytest.mark.xfail(qtutils.version_check('5.12', compiled=False) and - utils.is_mac, reason="Broken, see #4471") def test_correct_socket_name(self, args): server = ipc.send_or_listen(args) expected_dir = ipc._get_socketname(args.basedir) From 7c1ddb39d126514e8ef6afe39b202658cc317e82 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 22 Feb 2019 11:28:06 +0100 Subject: [PATCH 492/492] Remove unused import --- tests/unit/misc/test_ipc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py index c363249f8..eb12f78e3 100644 --- a/tests/unit/misc/test_ipc.py +++ b/tests/unit/misc/test_ipc.py @@ -34,7 +34,7 @@ from PyQt5.QtTest import QSignalSpy import qutebrowser from qutebrowser.misc import ipc -from qutebrowser.utils import standarddir, utils, qtutils +from qutebrowser.utils import standarddir, utils from helpers import stubs